pax_global_header00006660000000000000000000000064135444217720014523gustar00rootroot0000000000000052 comment=f9970fc09a1fe078ec550e84c825fe9a33cfb0b1 manuskript-0.10.0/000077500000000000000000000000001354442177200137765ustar00rootroot00000000000000manuskript-0.10.0/.codeclimate.yml000066400000000000000000000005211354442177200170460ustar00rootroot00000000000000--- engines: duplication: enabled: true config: languages: - ruby - javascript - python - php fixme: enabled: true radon: enabled: true ratings: paths: - "**.inc" - "**.js" - "**.jsx" - "**.module" - "**.php" - "**.py" - "**.rb" exclude_paths: - libs/**/* - **/*_ui.py manuskript-0.10.0/.gitignore000066400000000000000000000004721354442177200157710ustar00rootroot00000000000000# List of file patterns for git to ignore. # # Please try to keep entries in alphabetical order :-) # *.lprof *.msk *.nja *.pyc .cache .directory .idea .project .pydevproject .settings/org.eclipse.core.resources.prefs ExportTest Notes.t2t dist build icons/Numix manuskript/pycallgraph.txt snowflake* test-projects manuskript-0.10.0/.travis.yml000066400000000000000000000045411354442177200161130ustar00rootroot00000000000000language: generic os: - osx - linux osx_image: xcode8.3 sudo: required install: - if [ "$TRAVIS_OS_NAME" = "osx" ]; then package/prepare_osx.sh; fi - if [ "$TRAVIS_OS_NAME" = "linux" ]; then package/prepare_linux.sh; fi script: - if [ "$TRAVIS_OS_NAME" = "osx" ]; then python3 -B -m pytest -vs; fi - if [ "$TRAVIS_OS_NAME" = "linux" ]; then xvfb-run -s '-screen 0 640x480x24 +extension GLX' pytest -vs; fi before_deploy: - export FILENAME=manuskript-$TRAVIS_BRANCH-$TRAVIS_OS_NAME.zip - if [ "$TRAVIS_OS_NAME" = "osx" ]; then package/build_osx.sh; fi deploy: - provider: releases api_key: secure: lKuWQ9NWkLfDkkAiSnMh2PYkAGE1xh4pkSN5Ceb2IF9ee9i9YrJ9YFcvh420JSP+BYUl1OKczC5b3d9hUUZcfMwUkuZqPFCehOWP0O8dNs3XKZtmSU4POwR8lx7jRSO132qV/zgthBTK8PbeC2jIiMF4+4ESMsuEDptmGSOhgHtOcdJNDNz8gTbygXZVcl4U04se1ywtL62UQcTNMEKKLeBYQlrAXpcPiw4Htv9spEx6BewgarhRvJ/hysqeJgrH4wUVcjFw6Djppu3fmhrvgtaIU3ONxMLqgCuBZa03Q2LuF/RTYl9/DUgIjqsm1aOVooQZttYsUYWrLfyZNnLGD4WkdILcTMyexEVpQ/ejcEPm8gCf2PtklRtENZIxV2eQkLcPuSAPGWC8ue6a1etIUbYDbMT47SsdwkUsbyPpT8bnBvPf7gfmH/e20b1UQtxgmE5GDpbYZCTHf0kvwIFrBQzNmCtiGsXGJxIVx4msndplh8MdWFDBTEr0Ca8Tt45Fp/QPU7KAmdlQog9fWOfnJezIlBpFAXDa+AN2b/9uE+led5fmqQ62nuvjsYvWmJti2NW0IJ8UI26JGfh4Z1offE2bYp4onimfbRXSXWQs+Dm2l4CdTkc3habSWoUMw2R8mGbEfgfhzTFiAryg1mCtWy8AxUgfcUurd6BCwipH1ck= file: dist/$FILENAME overwrite: true skip_cleanup: true on: condition: $TRAVIS_OS_NAME = osx tags: true - provider: script script: "curl -T dist/manuskript-osx-develop.zip -u hfpn_semaphoreci:$FTP_PASSWORD ftp://www.theologeek.ch/web/manuskript/releases/ -v" skip_cleanup: true on: condition: $TRAVIS_OS_NAME = osx branch: develop env: global: secure: LCEMJ4+mBd+2tzI3CDf7WMD+5tDMQbT5y/r7beKOa/c3+0Iyce3U5Q9dxYRB8Y3V46euLElySOQIdgBMp08h1Ph2L8oFvrgKwSk5/n8Nnvpe5NSmfkPPqIyiuxmKGecjsW8dJ0f18OVyN85JueOaSov6gMcqZkIQqKEw5CXdClg678wbNmfKcSO1oTe+UKZ+uJjeZGBlsPiID78dximbD59r6Au71gDb/iW124pSKcpluBHR2auUMi8WXoff3nvgbTm0So/K137OlB7pqzy5YHrqZg+kQ+SnLh47/TAjLclYEgbBRlrpBNMqmZXH+B99qhl0HdHglSGqltwEUc48r46j26lQFjqD5ng0XWZFS44MyBdQFdq/s4HyCzlQKranT/q6HFrRZQwsb7eFfJNS4JmaGX3LB7v+IQJh4vMVtizrIYenVwdeGMJWrRA+3VHO9GYTcvCDNpQG/ZWWcjLxxENtUlI+DVyNq7L8gZI5tFAHypsmcqweAq0II7rOwiNoj4Vib5vfvC2n6BAISTuojMMcBOHqOIci4WkroheZGtoF49kc936zOnOFPlauqkB8lq2AS4xd9Y4PDf6YGs+HE23Sx8Jy/c/WPKItQ+aP4nnIcgP8I6BCJfjSvZdAU+S/KzVd5Wrke7pwHiCX9T9hs8npFpNishDMTPChKTy7MRQ= manuskript-0.10.0/CHANGELOG.md000066400000000000000000001253261354442177200156200ustar00rootroot00000000000000# Change Log ## [0.10.0](https://github.com/olivierkes/manuskript/tree/0.10.0) (2019-09-30) [Full Changelog](https://github.com/olivierkes/manuskript/compare/0.9.0...0.10.0) **Implemented enhancements:** - Add non-enchant spellcheck support [\#505](https://github.com/olivierkes/manuskript/issues/505) - Basic dark theme support \(Windows 10\) [\#630](https://github.com/olivierkes/manuskript/pull/630) ([worstje](https://github.com/worstje)) - Refactor spellchecker code and add other spellcheck library support [\#507](https://github.com/olivierkes/manuskript/pull/507) ([kakaroto](https://github.com/kakaroto)) **Fixed bugs:** - Impossible to change UI language to english if your system locale isn't set to an anglophonic country [\#619](https://github.com/olivierkes/manuskript/issues/619) - All Imports are crashing [\#611](https://github.com/olivierkes/manuskript/issues/611) - When compiling, it overwrite files without asking [\#608](https://github.com/olivierkes/manuskript/issues/608) - Crash when exporting with pandoc as custom path only [\#563](https://github.com/olivierkes/manuskript/issues/563) - Crash on insertion of new page character [\#562](https://github.com/olivierkes/manuskript/issues/562) - Crash on adding word goal in outline [\#561](https://github.com/olivierkes/manuskript/issues/561) - Crash in Windows 10 when drag and drop [\#559](https://github.com/olivierkes/manuskript/issues/559) - Image crash: When using tooltip on an incomplete image filename [\#549](https://github.com/olivierkes/manuskript/issues/549) - pandoc export crashes if project title is empty [\#535](https://github.com/olivierkes/manuskript/issues/535) - editor/cork options wrong after deleting a text [\#516](https://github.com/olivierkes/manuskript/issues/516) - crash on import directory [\#500](https://github.com/olivierkes/manuskript/issues/500) - Inconsistent and/or undesirable window placements [\#481](https://github.com/olivierkes/manuskript/issues/481) - Crash when deleting folder with files in tree view [\#479](https://github.com/olivierkes/manuskript/issues/479) - New level 'unit' is reset [\#468](https://github.com/olivierkes/manuskript/issues/468) - Lowering number of saved revisions below 1 crashes program [\#381](https://github.com/olivierkes/manuskript/issues/381) - ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters [\#31](https://github.com/olivierkes/manuskript/issues/31) - OS X: cannot leave fullscreen mode [\#24](https://github.com/olivierkes/manuskript/issues/24) **Closed issues:** - Word count goal progress bar broken in develop. [\#652](https://github.com/olivierkes/manuskript/issues/652) - Fullscreen mode causes spike in CPU [\#643](https://github.com/olivierkes/manuskript/issues/643) - Italian dictionary [\#638](https://github.com/olivierkes/manuskript/issues/638) - Manuskript 9.0 crashes when creating new project or opening existing project [\#631](https://github.com/olivierkes/manuskript/issues/631) - Spell Check Not working [\#625](https://github.com/olivierkes/manuskript/issues/625) - story line feature crashing [\#620](https://github.com/olivierkes/manuskript/issues/620) - Manuskript me fastidio un documento de word [\#616](https://github.com/olivierkes/manuskript/issues/616) - Feature request: Option to vertically center text input line on screen in fullscreen mode [\#602](https://github.com/olivierkes/manuskript/issues/602) - Italian translation not applied, application still english. [\#599](https://github.com/olivierkes/manuskript/issues/599) - File Randomly won't open [\#597](https://github.com/olivierkes/manuskript/issues/597) - Adding Persian\(Farsi\) in Weblate [\#596](https://github.com/olivierkes/manuskript/issues/596) - Importing images into Manuskript [\#593](https://github.com/olivierkes/manuskript/issues/593) - British English translation [\#592](https://github.com/olivierkes/manuskript/issues/592) - utf-8' codec can't decode byte 0xff in position 0 [\#591](https://github.com/olivierkes/manuskript/issues/591) - Issue with saving as directory [\#589](https://github.com/olivierkes/manuskript/issues/589) - Crashes in outliner [\#582](https://github.com/olivierkes/manuskript/issues/582) - Headings h4 not translated from Markdown to ODF [\#580](https://github.com/olivierkes/manuskript/issues/580) - \[BUG\] Shim error [\#579](https://github.com/olivierkes/manuskript/issues/579) - Crash when edit text [\#555](https://github.com/olivierkes/manuskript/issues/555) - Unusual environment failure [\#547](https://github.com/olivierkes/manuskript/issues/547) - Won't run \(Arch Linux\) [\#546](https://github.com/olivierkes/manuskript/issues/546) - Rendre extensible les modèles d'intrigue [\#329](https://github.com/olivierkes/manuskript/issues/329) **Merged pull requests:** - Changes to Revisions UI [\#655](https://github.com/olivierkes/manuskript/pull/655) ([worstje](https://github.com/worstje)) - Restore progress bar functionality [\#654](https://github.com/olivierkes/manuskript/pull/654) ([worstje](https://github.com/worstje)) - Default keep revisions to disabled, and remove tests for revisions [\#653](https://github.com/olivierkes/manuskript/pull/653) ([gedakc](https://github.com/gedakc)) - Fix word recognition for spell checker, ignore active partial words [\#651](https://github.com/olivierkes/manuskript/pull/651) ([gedakc](https://github.com/gedakc)) - Fix typo missed in previous commit [\#648](https://github.com/olivierkes/manuskript/pull/648) ([luzpaz](https://github.com/luzpaz)) - Fix source typo [\#645](https://github.com/olivierkes/manuskript/pull/645) ([luzpaz](https://github.com/luzpaz)) - Move Qt 5.11 / 5.12 version warning to Import invocation [\#642](https://github.com/olivierkes/manuskript/pull/642) ([gedakc](https://github.com/gedakc)) - Add DISABLE\_WAYLAND to snapcraft.yaml [\#637](https://github.com/olivierkes/manuskript/pull/637) ([gedakc](https://github.com/gedakc)) - Further refinement of image tooltips \(issue \#593\) [\#629](https://github.com/olivierkes/manuskript/pull/629) ([worstje](https://github.com/worstje)) - Reworking of the translation loading process \(issue \#619\) [\#627](https://github.com/olivierkes/manuskript/pull/627) ([worstje](https://github.com/worstje)) - change markdown to "Markdown" in.... [\#624](https://github.com/olivierkes/manuskript/pull/624) ([leela52452](https://github.com/leela52452)) - Fix tab key order, and default window tab for character & plot panes [\#623](https://github.com/olivierkes/manuskript/pull/623) ([gedakc](https://github.com/gedakc)) - Add British English Translation updates [\#621](https://github.com/olivierkes/manuskript/pull/621) ([gedakc](https://github.com/gedakc)) - Do not prompt "Save project?" when \_Save on quit\_ setting enabled [\#615](https://github.com/olivierkes/manuskript/pull/615) ([gedakc](https://github.com/gedakc)) - Fix exports silently overwriting files \(fixes \#608\) & small fix to dialog logic [\#613](https://github.com/olivierkes/manuskript/pull/613) ([worstje](https://github.com/worstje)) - Working Pandoc import \(fixes \#611\) & small dialog UI update. [\#612](https://github.com/olivierkes/manuskript/pull/612) ([worstje](https://github.com/worstje)) - Fix Linux Travis CI build error - pyenv: version `3.6.3' not installed [\#610](https://github.com/olivierkes/manuskript/pull/610) ([gedakc](https://github.com/gedakc)) - Fix crash when setting word Goal on new Text \(scene\) in Outline pane [\#609](https://github.com/olivierkes/manuskript/pull/609) ([gedakc](https://github.com/gedakc)) - Spelling: Manuscript, could not, process, … No content [\#588](https://github.com/olivierkes/manuskript/pull/588) ([comradekingu](https://github.com/comradekingu)) - fix issue \#468 'unit' is reset [\#587](https://github.com/olivierkes/manuskript/pull/587) ([NocturnalFred](https://github.com/NocturnalFred)) - Fix pandoc export crashes is project title is empty [\#585](https://github.com/olivierkes/manuskript/pull/585) ([gedakc](https://github.com/gedakc)) - Track dirty state and have the UI behave accordingly [\#583](https://github.com/olivierkes/manuskript/pull/583) ([worstje](https://github.com/worstje)) - Fix crash if invalid character is inserted into the text. [\#578](https://github.com/olivierkes/manuskript/pull/578) ([kakaroto](https://github.com/kakaroto)) - Fix crash if using a custom pandoc installation [\#577](https://github.com/olivierkes/manuskript/pull/577) ([kakaroto](https://github.com/kakaroto)) - Fix dialog windows being created outside the desktop area [\#576](https://github.com/olivierkes/manuskript/pull/576) ([kakaroto](https://github.com/kakaroto)) - Fix occasional crashes when \(re\)moving items [\#571](https://github.com/olivierkes/manuskript/pull/571) ([worstje](https://github.com/worstje)) - trying to resolve full screen exit issues on macOS [\#569](https://github.com/olivierkes/manuskript/pull/569) ([dschanoeh](https://github.com/dschanoeh)) - Fix typos in translation format placeholders that lead to crash [\#566](https://github.com/olivierkes/manuskript/pull/566) ([RaphaelWimmer](https://github.com/RaphaelWimmer)) - Fixed \#549 and refactored the image tooltip code [\#558](https://github.com/olivierkes/manuskript/pull/558) ([worstje](https://github.com/worstje)) - Fix typo [\#548](https://github.com/olivierkes/manuskript/pull/548) ([Acid147](https://github.com/Acid147)) - Fix misc. typos [\#489](https://github.com/olivierkes/manuskript/pull/489) ([luzpaz](https://github.com/luzpaz)) ## [0.9.0](https://github.com/olivierkes/manuskript/tree/0.9.0) (2019-04-04) [Full Changelog](https://github.com/olivierkes/manuskript/compare/0.8.0...0.9.0) **Implemented enhancements:** - Fullscreen editor suggestions [\#527](https://github.com/olivierkes/manuskript/issues/527) - \[Feature Request\] Keyboard shortcuts in Full-Screen mode [\#444](https://github.com/olivierkes/manuskript/issues/444) - \[Feature Request\] Add Ability to Add Image When Creating Fullscreen Theme [\#399](https://github.com/olivierkes/manuskript/issues/399) - Making Fullscreen Mode Great Again [\#234](https://github.com/olivierkes/manuskript/issues/234) **Fixed bugs:** - Crash when previewing malformed regular expression when compiling [\#488](https://github.com/olivierkes/manuskript/issues/488) - Spellcheck On/Off setting ignored / Manuskript unresponsive [\#474](https://github.com/olivierkes/manuskript/issues/474) - Wrong codepage for import causes crash [\#470](https://github.com/olivierkes/manuskript/issues/470) - Full-screen mode right-click menu black text on black background [\#440](https://github.com/olivierkes/manuskript/issues/440) - Application language still the same after changing it in the settings. [\#411](https://github.com/olivierkes/manuskript/issues/411) **Closed issues:** - Python issues? lxml [\#541](https://github.com/olivierkes/manuskript/issues/541) - Cannot open a project. [\#529](https://github.com/olivierkes/manuskript/issues/529) - Corrupted Project File Crashes When Opening. [\#522](https://github.com/olivierkes/manuskript/issues/522) - Specific document suddenly won't open [\#502](https://github.com/olivierkes/manuskript/issues/502) - trying to get pandoc to work manuskript 0.8.0 Win10 64 [\#475](https://github.com/olivierkes/manuskript/issues/475) - Editor does not show text [\#472](https://github.com/olivierkes/manuskript/issues/472) - Application crashes when trying to save "…" [\#461](https://github.com/olivierkes/manuskript/issues/461) - Feature Request: script writing interface for manuskript [\#435](https://github.com/olivierkes/manuskript/issues/435) - suggestion: Use sudo for your Fedora install instructions, not su -c [\#573](https://github.com/olivierkes/manuskript/issues/573) - Chinese translation filename suffix [\#428](https://github.com/olivierkes/manuskript/issues/428) **Merged pull requests:** - Fix color scheme of fullscreen editor [\#539](https://github.com/olivierkes/manuskript/pull/539) ([kakaroto](https://github.com/kakaroto)) - Directory entries in ZIP break loading code [\#531](https://github.com/olivierkes/manuskript/pull/531) ([worstje](https://github.com/worstje)) - Providing a suitable icon for consumption by Windows operating systems [\#530](https://github.com/olivierkes/manuskript/pull/530) ([worstje](https://github.com/worstje)) - Ensure text file open methods use utf-8 encoding [\#515](https://github.com/olivierkes/manuskript/pull/515) ([gedakc](https://github.com/gedakc)) - Fix crash when right-clicking twice on fullscreen panel in Windows 10 [\#514](https://github.com/olivierkes/manuskript/pull/514) ([kakaroto](https://github.com/kakaroto)) - Add support for IPython Jupyter QT Console as a debugging aid [\#513](https://github.com/olivierkes/manuskript/pull/513) ([kakaroto](https://github.com/kakaroto)) - Fix background of popup menus that were transparent \(black\) [\#512](https://github.com/olivierkes/manuskript/pull/512) ([kakaroto](https://github.com/kakaroto)) - Add snap build and package [\#511](https://github.com/olivierkes/manuskript/pull/511) ([tomwardill](https://github.com/tomwardill)) - Add ability to add new background images through UI. [\#510](https://github.com/olivierkes/manuskript/pull/510) ([kakaroto](https://github.com/kakaroto)) - Fullscreen panels improvements [\#509](https://github.com/olivierkes/manuskript/pull/509) ([kakaroto](https://github.com/kakaroto)) - Fix corkView background image on Windows [\#508](https://github.com/olivierkes/manuskript/pull/508) ([kakaroto](https://github.com/kakaroto)) - Do not default spellcheck to True for new editor views [\#506](https://github.com/olivierkes/manuskript/pull/506) ([kakaroto](https://github.com/kakaroto)) - Set editor theme stylesheet to QTextEdit only. [\#504](https://github.com/olivierkes/manuskript/pull/504) ([kakaroto](https://github.com/kakaroto)) - Fix fullscreen editor's myScrollBar delayed destruction causing a crash [\#503](https://github.com/olivierkes/manuskript/pull/503) ([kakaroto](https://github.com/kakaroto)) - 2nd try to fix macOS X blank screen when leaving fullscreen editor mode [\#495](https://github.com/olivierkes/manuskript/pull/495) ([gedakc](https://github.com/gedakc)) - Fix crash when right clicking a word in editor and enchant is not installed [\#492](https://github.com/olivierkes/manuskript/pull/492) ([kakaroto](https://github.com/kakaroto)) - Don't crash if a typo is made in the exporter's regular expression. [\#486](https://github.com/olivierkes/manuskript/pull/486) ([kakaroto](https://github.com/kakaroto)) - Fix crash when previewing pandoc HTML with QTextEdit as web renderer… [\#485](https://github.com/olivierkes/manuskript/pull/485) ([kakaroto](https://github.com/kakaroto)) - Fix crash when 7 pound signs are written alone on a line. [\#484](https://github.com/olivierkes/manuskript/pull/484) ([kakaroto](https://github.com/kakaroto)) - Try to fix macOS X blank screen when leaving editor fullscreen mode [\#482](https://github.com/olivierkes/manuskript/pull/482) ([gedakc](https://github.com/gedakc)) - Fix wrong codepage crash on import with Windows 10 [\#478](https://github.com/olivierkes/manuskript/pull/478) ([gedakc](https://github.com/gedakc)) - Spelling: Manuscript, may have to be restarted [\#454](https://github.com/olivierkes/manuskript/pull/454) ([comradekingu](https://github.com/comradekingu)) - Chinese translation [\#434](https://github.com/olivierkes/manuskript/pull/434) ([lingsamuel](https://github.com/lingsamuel)) - fix translator [\#433](https://github.com/olivierkes/manuskript/pull/433) ([lingsamuel](https://github.com/lingsamuel)) - Remember last accessed directory [\#431](https://github.com/olivierkes/manuskript/pull/431) ([lingsamuel](https://github.com/lingsamuel)) - translation suffix, change translation load order [\#430](https://github.com/olivierkes/manuskript/pull/430) ([lingsamuel](https://github.com/lingsamuel)) ## [0.8.0](https://github.com/olivierkes/manuskript/tree/0.8.0) (2018-12-05) [Full Changelog](https://github.com/olivierkes/manuskript/compare/0.7.0...0.8.0) **Fixed bugs:** - Snowflake Method option is greyed out. [\#419](https://github.com/olivierkes/manuskript/issues/419) - Plots bounce around main, secondary, and minor -- unsatisfactory solution? [\#404](https://github.com/olivierkes/manuskript/issues/404) - Segmentation fault on import [\#402](https://github.com/olivierkes/manuskript/issues/402) - "Corrupted" settings and impossibility to start [\#377](https://github.com/olivierkes/manuskript/issues/377) - Resolution step deleting itself on pressing Ctrl + Backspace [\#375](https://github.com/olivierkes/manuskript/issues/375) - Develop Branch Crashes in Outline View [\#355](https://github.com/olivierkes/manuskript/issues/355) - Export crashes, because of encoding to 1250 [\#331](https://github.com/olivierkes/manuskript/issues/331) - pandoc v2 has deprecated some options and extensions so manuskript is giving error. [\#304](https://github.com/olivierkes/manuskript/issues/304) - Compile Issue for Pandoc Formats - pandoc.exe incorrect [\#186](https://github.com/olivierkes/manuskript/issues/186) **Closed issues:** - Problems with running from 0.7.0 pyinstaller package on mac os x 10.13 [\#386](https://github.com/olivierkes/manuskript/issues/386) - Old bugs in current version 0.6.0 \(with crosslinks and details\) [\#371](https://github.com/olivierkes/manuskript/issues/371) - pt\_PT translation and Weblate [\#408](https://github.com/olivierkes/manuskript/issues/408) - Italian translation [\#395](https://github.com/olivierkes/manuskript/issues/395) - Snowflake view mode always disabled [\#45](https://github.com/olivierkes/manuskript/issues/45) **Merged pull requests:** - Remove unimplemented snowflake view mode menu entry [\#424](https://github.com/olivierkes/manuskript/pull/424) ([gedakc](https://github.com/gedakc)) - Increase Travis CI macOS X build minimum to Sierra \(10.12\) [\#423](https://github.com/olivierkes/manuskript/pull/423) ([gedakc](https://github.com/gedakc)) - Remove plot resolution step key bindings Ctrl+Enter and Ctrl+Backspace [\#420](https://github.com/olivierkes/manuskript/pull/420) ([gedakc](https://github.com/gedakc)) - Add support for pandoc version 2 [\#418](https://github.com/olivierkes/manuskript/pull/418) ([gedakc](https://github.com/gedakc)) - Prevent build and deploy steps for linux on Travis CI [\#414](https://github.com/olivierkes/manuskript/pull/414) ([gedakc](https://github.com/gedakc)) - Limit pyinstaller package build and deploy to osx on Travis CI [\#413](https://github.com/olivierkes/manuskript/pull/413) ([gedakc](https://github.com/gedakc)) - Fix segmentation fault on import [\#412](https://github.com/olivierkes/manuskript/pull/412) ([gedakc](https://github.com/gedakc)) - Fix pytest warnings [\#407](https://github.com/olivierkes/manuskript/pull/407) ([gedakc](https://github.com/gedakc)) - Fix plot importance changes if delete earlier plot and click other plots [\#406](https://github.com/olivierkes/manuskript/pull/406) ([gedakc](https://github.com/gedakc)) - Enable testing in TravisCI [\#403](https://github.com/olivierkes/manuskript/pull/403) ([katafrakt](https://github.com/katafrakt)) - Fix Travis CI build for Mac OSX - pip3: command not found [\#400](https://github.com/olivierkes/manuskript/pull/400) ([gedakc](https://github.com/gedakc)) - Moved incorrectly placed parameter to correct place. Closes \#377. [\#389](https://github.com/olivierkes/manuskript/pull/389) ([RiderExMachina](https://github.com/RiderExMachina)) ## [0.7.0](https://github.com/olivierkes/manuskript/tree/0.7.0) (2018-08-15) [Full Changelog](https://github.com/olivierkes/manuskript/compare/0.6.0...0.7.0) **Implemented enhancements:** - Display images as tooltip [\#270](https://github.com/olivierkes/manuskript/issues/270) - Focus mode [\#259](https://github.com/olivierkes/manuskript/issues/259) - Add markdown support of other tabs [\#232](https://github.com/olivierkes/manuskript/issues/232) - Translation automation [\#228](https://github.com/olivierkes/manuskript/issues/228) - Add: command line parameter to open project [\#223](https://github.com/olivierkes/manuskript/issues/223) - Moving World Items [\#219](https://github.com/olivierkes/manuskript/issues/219) - Make http links clickable in markdown editor [\#215](https://github.com/olivierkes/manuskript/issues/215) - Feature suggestion: Typewriter scrolling. [\#175](https://github.com/olivierkes/manuskript/issues/175) - Request for Bullets and Numbering option [\#123](https://github.com/olivierkes/manuskript/issues/123) - Markdown syntax highlighting [\#13](https://github.com/olivierkes/manuskript/issues/13) - Add moving World Items [\#298](https://github.com/olivierkes/manuskript/pull/298) ([JackXVII](https://github.com/JackXVII)) **Fixed bugs:** - Install on MacOsX failed [\#282](https://github.com/olivierkes/manuskript/issues/282) - Crash if Cheatsheet filter term not found and Enter key pressed [\#354](https://github.com/olivierkes/manuskript/issues/354) - Overlay status bar prevents access to add/delete world item icons when displaying a message [\#307](https://github.com/olivierkes/manuskript/issues/307) - Deleting multiple World items leaves/creates two empty items [\#306](https://github.com/olivierkes/manuskript/issues/306) - Underline causes false spelling error [\#283](https://github.com/olivierkes/manuskript/issues/283) - .DS\_Store files let crash Manuskript when opening project [\#281](https://github.com/olivierkes/manuskript/issues/281) - Programm killed by Hovereffekt? [\#275](https://github.com/olivierkes/manuskript/issues/275) - Spell check is crashing the program [\#273](https://github.com/olivierkes/manuskript/issues/273) - Highlight Contrast Problem [\#272](https://github.com/olivierkes/manuskript/issues/272) - Segfault when pasting text with focus mode enabled [\#271](https://github.com/olivierkes/manuskript/issues/271) - Compile Check Box not working in Outline view [\#263](https://github.com/olivierkes/manuskript/issues/263) - Manuskript response slow with recent addition of focus mode [\#261](https://github.com/olivierkes/manuskript/issues/261) - Organize Menu is not disabled on startup [\#260](https://github.com/olivierkes/manuskript/issues/260) - Ctrl+tab gets trapped in Debug tab [\#249](https://github.com/olivierkes/manuskript/issues/249) - Index card status can spillover [\#246](https://github.com/olivierkes/manuskript/issues/246) - Cannot write a summary on a plot resolution step [\#240](https://github.com/olivierkes/manuskript/issues/240) - Format buttons in text editor window not working [\#59](https://github.com/olivierkes/manuskript/issues/59) - stop crash when click btnGoUp and current editor is None [\#318](https://github.com/olivierkes/manuskript/pull/318) ([Windspar](https://github.com/Windspar)) - Avoid crash on spellcheck by ensuring enchant dictionary exists [\#303](https://github.com/olivierkes/manuskript/pull/303) ([gedakc](https://github.com/gedakc)) - Skip loading directory and file names that begin with a period [\#302](https://github.com/olivierkes/manuskript/pull/302) ([gedakc](https://github.com/gedakc)) **Closed issues:** - \[Feature request\] Russian translation [\#358](https://github.com/olivierkes/manuskript/issues/358) - Manuskript crashes during save process and "corrupts" the msk-file [\#352](https://github.com/olivierkes/manuskript/issues/352) - Add polish translation [\#289](https://github.com/olivierkes/manuskript/issues/289) - \[Feature request\] Accept first command line argument as project file name to open [\#278](https://github.com/olivierkes/manuskript/issues/278) - Status bar distracting when saving with current develop branch [\#262](https://github.com/olivierkes/manuskript/issues/262) - Editor Consistency [\#257](https://github.com/olivierkes/manuskript/issues/257) - French Tab in English Mode [\#253](https://github.com/olivierkes/manuskript/issues/253) - I want to translate it to portuguese [\#230](https://github.com/olivierkes/manuskript/issues/230) **Merged pull requests:** - Fix Travix CI build error on OSX installing python3 [\#338](https://github.com/olivierkes/manuskript/pull/338) ([gedakc](https://github.com/gedakc)) - Use QPersistentModelIndex in textEditView [\#308](https://github.com/olivierkes/manuskript/pull/308) ([JackXVII](https://github.com/JackXVII)) - Add automated script to create RPM package [\#368](https://github.com/olivierkes/manuskript/pull/368) ([gedakc](https://github.com/gedakc)) - Build MacOS release with XCode 7.3 image [\#287](https://github.com/olivierkes/manuskript/pull/287) ([katafrakt](https://github.com/katafrakt)) ## [0.6.0](https://github.com/olivierkes/manuskript/tree/0.6.0) (2017-11-29) [Full Changelog](https://github.com/olivierkes/manuskript/compare/0.5.0...0.6.0) **Implemented enhancements:** - Adds: document menu \(copy, paste, delete, duplicate, split, merge, etc.\) [\#229](https://github.com/olivierkes/manuskript/issues/229) - Add transparent text editor [\#216](https://github.com/olivierkes/manuskript/issues/216) - Add Mind Map Import [\#208](https://github.com/olivierkes/manuskript/issues/208) - Adds: Importer \(docx, html, opml, …\) [\#200](https://github.com/olivierkes/manuskript/issues/200) - Add a "Rename Item" option to context menu in the Tree view [\#189](https://github.com/olivierkes/manuskript/issues/189) - Pandoc output: add more custom settings [\#173](https://github.com/olivierkes/manuskript/issues/173) **Fixed bugs:** - Manuskript fails to run in Ubuntu 14.04 [\#225](https://github.com/olivierkes/manuskript/issues/225) - Program Crash on Import with images [\#213](https://github.com/olivierkes/manuskript/issues/213) - Missing default file extension when Saving As... [\#211](https://github.com/olivierkes/manuskript/issues/211) - One white pixel visible in full screen mode [\#210](https://github.com/olivierkes/manuskript/issues/210) - Accentueted characters on linux [\#207](https://github.com/olivierkes/manuskript/issues/207) - Manuskript crashes when creating new document on Ubuntu [\#198](https://github.com/olivierkes/manuskript/issues/198) - Editor tab should trim long titles [\#194](https://github.com/olivierkes/manuskript/issues/194) - Manuskript does not start with PyEnchant on MacOS [\#188](https://github.com/olivierkes/manuskript/issues/188) - Index card text almost invisible in dark themes. [\#183](https://github.com/olivierkes/manuskript/issues/183) - Accented characters not working [\#141](https://github.com/olivierkes/manuskript/issues/141) - Accent not working [\#105](https://github.com/olivierkes/manuskript/issues/105) - Accent marks not working [\#58](https://github.com/olivierkes/manuskript/issues/58) **Closed issues:** - new dalolog icon [\#237](https://github.com/olivierkes/manuskript/issues/237) - Cannot select folder on create new project [\#224](https://github.com/olivierkes/manuskript/issues/224) - Should pandoc be bundled with manuskript's packages? [\#190](https://github.com/olivierkes/manuskript/issues/190) - Odd word choices in English - Take 2 [\#181](https://github.com/olivierkes/manuskript/issues/181) **Merged pull requests:** - Change words issue 181 [\#231](https://github.com/olivierkes/manuskript/pull/231) ([gedakc](https://github.com/gedakc)) - Add PyEnchant support to OSX builds [\#212](https://github.com/olivierkes/manuskript/pull/212) ([katafrakt](https://github.com/katafrakt)) - Update README.md for 0.5.0 release [\#205](https://github.com/olivierkes/manuskript/pull/205) ([gedakc](https://github.com/gedakc)) - \[WIP\] Add Travis CI support [\#203](https://github.com/olivierkes/manuskript/pull/203) ([katafrakt](https://github.com/katafrakt)) - Get default enchant Dict language in more reliable way [\#202](https://github.com/olivierkes/manuskript/pull/202) ([katafrakt](https://github.com/katafrakt)) - Expand german translation [\#193](https://github.com/olivierkes/manuskript/pull/193) ([ScullyBlue](https://github.com/ScullyBlue)) - Adds: Import OPML [\#192](https://github.com/olivierkes/manuskript/pull/192) ([camstevenson](https://github.com/camstevenson)) ## [0.5.0](https://github.com/olivierkes/manuskript/tree/0.5.0) (2017-10-31) [Full Changelog](https://github.com/olivierkes/manuskript/compare/0.4.0...0.5.0) **Implemented enhancements:** - Swedish translation \(sv-SE\). [\#177](https://github.com/olivierkes/manuskript/issues/177) - Spanish transalation for manuskript 0.5.0 [\#174](https://github.com/olivierkes/manuskript/issues/174) - Suggestion: Configurable editor margins. [\#168](https://github.com/olivierkes/manuskript/issues/168) - Feature request: disable cursor blinking [\#165](https://github.com/olivierkes/manuskript/issues/165) - Suggestion: Block insertion cursor. [\#163](https://github.com/olivierkes/manuskript/issues/163) - New navigation icon design [\#159](https://github.com/olivierkes/manuskript/issues/159) - New flash card design [\#158](https://github.com/olivierkes/manuskript/issues/158) - Redaction view navigation improvements [\#157](https://github.com/olivierkes/manuskript/issues/157) - Request: Justified formatting of text [\#148](https://github.com/olivierkes/manuskript/issues/148) - Ability to always show word target in distraction free mode [\#109](https://github.com/olivierkes/manuskript/issues/109) - Use on smaller resolution screens [\#108](https://github.com/olivierkes/manuskript/issues/108) - Odd wordchoices in English. [\#53](https://github.com/olivierkes/manuskript/issues/53) **Fixed bugs:** - Bug in 'World' section [\#126](https://github.com/olivierkes/manuskript/issues/126) - Redaction's tab problem in 0.3.0 win version [\#92](https://github.com/olivierkes/manuskript/issues/92) - Application Style setting GTK+ on Linux Mint Mate [\#57](https://github.com/olivierkes/manuskript/issues/57) - Likes to freeze and crash [\#50](https://github.com/olivierkes/manuskript/issues/50) - Seg faults found [\#9](https://github.com/olivierkes/manuskript/issues/9) - Installation - Qt platforn plugin "xcb" not found [\#8](https://github.com/olivierkes/manuskript/issues/8) - Untranslatable strings. [\#178](https://github.com/olivierkes/manuskript/issues/178) - Create new project ignores changes made to template levels before Create [\#171](https://github.com/olivierkes/manuskript/issues/171) - Several bugs in drag'n'dropping items [\#169](https://github.com/olivierkes/manuskript/issues/169) - Some panels require initial two clicks of RHS tab to hide [\#167](https://github.com/olivierkes/manuskript/issues/167) - Spell checker is active for partial words. [\#166](https://github.com/olivierkes/manuskript/issues/166) - Spell checking works but does not underline misspelled words [\#147](https://github.com/olivierkes/manuskript/issues/147) - Contrast Problem in Notes/Refences with Dark Background [\#143](https://github.com/olivierkes/manuskript/issues/143) - Crash when permissions don't allow saving [\#138](https://github.com/olivierkes/manuskript/issues/138) - App crash when moving a step in Plots section [\#134](https://github.com/olivierkes/manuskript/issues/134) - Indent not saved in custom full screen theme [\#133](https://github.com/olivierkes/manuskript/issues/133) - 'Save as' only partly works [\#128](https://github.com/olivierkes/manuskript/issues/128) - "pandoc: Could not parse YAML header" error [\#124](https://github.com/olivierkes/manuskript/issues/124) - Distraction free mode crashes with time target [\#119](https://github.com/olivierkes/manuskript/issues/119) - Pandoc PDF output error with unicode characters [\#117](https://github.com/olivierkes/manuskript/issues/117) - Character Importance-Slider memorize importance of last character ... partly [\#102](https://github.com/olivierkes/manuskript/issues/102) - Index cards seem to keep a background image by default. [\#52](https://github.com/olivierkes/manuskript/issues/52) - In revision mode text, selecting group doesn't load text-preferences right. [\#51](https://github.com/olivierkes/manuskript/issues/51) - Undo/redo works in some text areas but not others [\#34](https://github.com/olivierkes/manuskript/issues/34) - Some bugs in Windows XP and Ubuntu 15.1 [\#25](https://github.com/olivierkes/manuskript/issues/25) - Stylesheet error on windows [\#18](https://github.com/olivierkes/manuskript/issues/18) - Manuskript fails to load last state of panels [\#14](https://github.com/olivierkes/manuskript/issues/14) - Multiple selections of items sometimes gets Notes/references field to be ereased [\#10](https://github.com/olivierkes/manuskript/issues/10) **Closed issues:** - Cannot start manuskript due to import error [\#179](https://github.com/olivierkes/manuskript/issues/179) - Does not run on Ubuntu 17.10 [\#170](https://github.com/olivierkes/manuskript/issues/170) - Add translation with transifex.com [\#140](https://github.com/olivierkes/manuskript/issues/140) - Site of Manuskript is not in the air at the moment [\#139](https://github.com/olivierkes/manuskript/issues/139) - Manuskript Fail to Launch After Several Successes on Windows 10 [\#132](https://github.com/olivierkes/manuskript/issues/132) - Index Card Background Freeze [\#127](https://github.com/olivierkes/manuskript/issues/127) - Keyboard shortcuts aren't functioning, No undo feature. [\#125](https://github.com/olivierkes/manuskript/issues/125) - Trojan in current windows installer? [\#112](https://github.com/olivierkes/manuskript/issues/112) - Manuskript no longer opening [\#106](https://github.com/olivierkes/manuskript/issues/106) - not working on Mac [\#35](https://github.com/olivierkes/manuskript/issues/35) **Merged pull requests:** - Change message from warning to note for failed to load translator string [\#110](https://github.com/olivierkes/manuskript/pull/110) ([gedakc](https://github.com/gedakc)) - Add about manuskript dialog [\#153](https://github.com/olivierkes/manuskript/pull/153) ([gedakc](https://github.com/gedakc)) - Add help tip for world tab [\#151](https://github.com/olivierkes/manuskript/pull/151) ([gedakc](https://github.com/gedakc)) - Add missing \_\_init\_\_.py file [\#149](https://github.com/olivierkes/manuskript/pull/149) ([gedakc](https://github.com/gedakc)) - Fixes: Manuskript fails to load last state of panels [\#136](https://github.com/olivierkes/manuskript/pull/136) ([gedakc](https://github.com/gedakc)) - Add to README a HowTo section with link to Wiki [\#131](https://github.com/olivierkes/manuskript/pull/131) ([gedakc](https://github.com/gedakc)) - Fixes: Contents missing when non-single file project saved with Save as [\#129](https://github.com/olivierkes/manuskript/pull/129) ([gedakc](https://github.com/gedakc)) - Fixes: add character button does not set importance slider to default… [\#121](https://github.com/olivierkes/manuskript/pull/121) ([gedakc](https://github.com/gedakc)) - Request confirmation if create project would overwrite existing file\(s\) [\#114](https://github.com/olivierkes/manuskript/pull/114) ([gedakc](https://github.com/gedakc)) - Fixes: Unable to change index cards background from image to a color [\#113](https://github.com/olivierkes/manuskript/pull/113) ([gedakc](https://github.com/gedakc)) - Add project name to main window title [\#103](https://github.com/olivierkes/manuskript/pull/103) ([gedakc](https://github.com/gedakc)) - Fixes: after project close, open or create project fails [\#100](https://github.com/olivierkes/manuskript/pull/100) ([gedakc](https://github.com/gedakc)) - Fixes: incorrect reference to 32px icon [\#97](https://github.com/olivierkes/manuskript/pull/97) ([gedakc](https://github.com/gedakc)) ## [0.4.0](https://github.com/olivierkes/manuskript/tree/0.4.0) (2017-05-25) [Full Changelog](https://github.com/olivierkes/manuskript/compare/0.3.0...0.4.0) **Implemented enhancements:** - Export into text? \[feature suggestion\] [\#80](https://github.com/olivierkes/manuskript/issues/80) - Default background for fullscreen mode is unusable \[minor\] [\#79](https://github.com/olivierkes/manuskript/issues/79) - Documention Needed [\#69](https://github.com/olivierkes/manuskript/issues/69) - Compile dialog issues: cancel doesn't seem to do anything, default ouput directory wrong [\#77](https://github.com/olivierkes/manuskript/issues/77) - OS X app with Platypus [\#28](https://github.com/olivierkes/manuskript/issues/28) **Fixed bugs:** - Unable to type the "ê" character [\#46](https://github.com/olivierkes/manuskript/issues/46) - Bug: File doesn't open if spellcheck is active and dictionary is missing [\#26](https://github.com/olivierkes/manuskript/issues/26) - Installed PyEnchant but Manuskript still asks me to "Install PyEnchant to use Spellcheck" [\#122](https://github.com/olivierkes/manuskript/issues/122) - Crashes when trying to create or open the project [\#99](https://github.com/olivierkes/manuskript/issues/99) - After close project, open or create project fails [\#96](https://github.com/olivierkes/manuskript/issues/96) - Crash on create - Linux Mint 18 [\#91](https://github.com/olivierkes/manuskript/issues/91) - Compile not honoring check marks [\#90](https://github.com/olivierkes/manuskript/issues/90) - Plots, resolutions steps screen: columns not sizeable. [\#87](https://github.com/olivierkes/manuskript/issues/87) - word count [\#72](https://github.com/olivierkes/manuskript/issues/72) - Cant create a new project using Ubuntu 16.10 [\#70](https://github.com/olivierkes/manuskript/issues/70) - Fails to create a project in Linux [\#65](https://github.com/olivierkes/manuskript/issues/65) - does not compile to OpenOffice format [\#61](https://github.com/olivierkes/manuskript/issues/61) - Doesn't save in redaction [\#55](https://github.com/olivierkes/manuskript/issues/55) - Error "Fail to load translator..." [\#49](https://github.com/olivierkes/manuskript/issues/49) - Crash at project creation on mac [\#48](https://github.com/olivierkes/manuskript/issues/48) - crash on create new project [\#44](https://github.com/olivierkes/manuskript/issues/44) - epiphany section in basic infos for characters not saved [\#43](https://github.com/olivierkes/manuskript/issues/43) - 0.3.0 File Creation Issues [\#37](https://github.com/olivierkes/manuskript/issues/37) - Can't create new project on Linux [\#30](https://github.com/olivierkes/manuskript/issues/30) - Problem with minimum size of program window? [\#29](https://github.com/olivierkes/manuskript/issues/29) - Bug: Writing a .msk file in linux and opening it in windows clean the outline files [\#27](https://github.com/olivierkes/manuskript/issues/27) - Welcome windows on OS X: single click instead of double click [\#23](https://github.com/olivierkes/manuskript/issues/23) - AttributeError in editorWidget [\#11](https://github.com/olivierkes/manuskript/issues/11) **Closed issues:** - File creation fails and causes Manuskript to crash [\#93](https://github.com/olivierkes/manuskript/issues/93) - Failed to load translator [\#89](https://github.com/olivierkes/manuskript/issues/89) - crashing on initial save \(again?\) [\#88](https://github.com/olivierkes/manuskript/issues/88) - Impossible to start a project on Lubuntu 16.04 [\#85](https://github.com/olivierkes/manuskript/issues/85) - Manuskript 0.3.0 crash on Windows 10 [\#83](https://github.com/olivierkes/manuskript/issues/83) - on Fedora 25 Manuskript doesn't start [\#82](https://github.com/olivierkes/manuskript/issues/82) - \(l\)ubuntu dependencies for develop branch [\#81](https://github.com/olivierkes/manuskript/issues/81) - Creating new project fails [\#76](https://github.com/olivierkes/manuskript/issues/76) - Missing module when launching from github \[Xubuntu 16.04.1 LTS\] [\#73](https://github.com/olivierkes/manuskript/issues/73) - Download does not run on 32bit Linux [\#63](https://github.com/olivierkes/manuskript/issues/63) - Locale Warning [\#62](https://github.com/olivierkes/manuskript/issues/62) - Crashes when creating new project [\#60](https://github.com/olivierkes/manuskript/issues/60) - Is This An Active Project [\#56](https://github.com/olivierkes/manuskript/issues/56) - Qt WebKit is deprecated [\#54](https://github.com/olivierkes/manuskript/issues/54) - Unable to run application [\#47](https://github.com/olivierkes/manuskript/issues/47) - \[Windows\] Compile Dialog does not have a title [\#39](https://github.com/olivierkes/manuskript/issues/39) - Creating manuskript binay for Android and IOS [\#21](https://github.com/olivierkes/manuskript/issues/21) - Compiling Manuskript in windows [\#19](https://github.com/olivierkes/manuskript/issues/19) - No distance between two scenes in compiled document [\#104](https://github.com/olivierkes/manuskript/issues/104) - Small typographic error in the README [\#84](https://github.com/olivierkes/manuskript/issues/84) - \[Windows\] HTML compiled file title is "FIXME" [\#42](https://github.com/olivierkes/manuskript/issues/42) - \[Windows\] Compile operation does not adds the file extension when the file type option is changed [\#41](https://github.com/olivierkes/manuskript/issues/41) - \[Windows\] Compile dialog comes with development machine default location [\#40](https://github.com/olivierkes/manuskript/issues/40) - \[Windows\] Cancel Button on Compile Dialog does not work [\#38](https://github.com/olivierkes/manuskript/issues/38) **Merged pull requests:** - Fixes: field "Source of conflict" in World is not active [\#95](https://github.com/olivierkes/manuskript/pull/95) ([gedakc](https://github.com/gedakc)) - Fixes: epiphany section in basic infos for characters not saved \#43 [\#94](https://github.com/olivierkes/manuskript/pull/94) ([gedakc](https://github.com/gedakc)) - Updating README.md [\#68](https://github.com/olivierkes/manuskript/pull/68) ([olivierkes](https://github.com/olivierkes)) - added commands to install dependencies to README [\#67](https://github.com/olivierkes/manuskript/pull/67) ([wmww](https://github.com/wmww)) - Added spanish translation \(and changed "chuleta" for "guía rápida"\). [\#66](https://github.com/olivierkes/manuskript/pull/66) ([jmgaguilera](https://github.com/jmgaguilera)) ## [0.3.0](https://github.com/olivierkes/manuskript/tree/0.3.0) (2016-03-31) [Full Changelog](https://github.com/olivierkes/manuskript/compare/0.2.0...0.3.0) **Fixed bugs:** - Windows package fails antivirus scan [\#15](https://github.com/olivierkes/manuskript/issues/15) - DictNotFoundError when dict language specified in settings is not installed [\#12](https://github.com/olivierkes/manuskript/issues/12) - Manuskript fails to lauch on Windows [\#7](https://github.com/olivierkes/manuskript/issues/7) - The plot line colours keep changing? [\#6](https://github.com/olivierkes/manuskript/issues/6) **Closed issues:** - Windows installation issue [\#16](https://github.com/olivierkes/manuskript/issues/16) ## [0.2.0](https://github.com/olivierkes/manuskript/tree/0.2.0) (2016-02-28) [Full Changelog](https://github.com/olivierkes/manuskript/compare/0.1.1...0.2.0) **Fixed bugs:** - Fullscreen editor error when text is empty \(wordcount = 0\) [\#3](https://github.com/olivierkes/manuskript/issues/3) - Save file doesn't automatically add .msk [\#2](https://github.com/olivierkes/manuskript/issues/2) ## [0.1.1](https://github.com/olivierkes/manuskript/tree/0.1.1) (2016-02-08) [Full Changelog](https://github.com/olivierkes/manuskript/compare/0.1.0...0.1.1) **Fixed bugs:** - Crash on initial save [\#1](https://github.com/olivierkes/manuskript/issues/1) ## [0.1.0](https://github.com/olivierkes/manuskript/tree/0.1.0) (2016-02-06) \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* manuskript-0.10.0/COPYING000066400000000000000000001045131354442177200150350ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . manuskript-0.10.0/CREDITS000066400000000000000000000004121354442177200150130ustar00rootroot00000000000000Developers ---------- * Olivier Keshavjee Translations ------------ Français: * Olivier Keshavjee Libraries --------- * Qt, http://qt-project.org/ Themes ------ gentleblues, oldschool, spacedreams, writingdesk: * Graeme Gott, http://gottcode.org/focuswriter/ manuskript-0.10.0/README.md000066400000000000000000000052621354442177200152620ustar00rootroot00000000000000# Manuskript [Manuskript](http://www.theologeek.ch/manuskript) is an open-source tool for writers. Manuskript runs on GNU/Linux, Mac OS X, and Windows. ![Main view](http://www.theologeek.ch/manuskript/wp-content/uploads/2017/11/manuskript-0.5.0-main-view.jpg) ## Features Manuskript provides a rich environment to help writers create their first draft and then further refine and edit their masterpiece. With Manuskript you can: * Grow your premise from one sentence, to a paragraph, to a full summary * Create characters * Conceive plots * Construct outlines ([Outline mode](http://www.theologeek.ch/manuskript/2016/02/05/outliner/) and/or [Index cards](http://www.theologeek.ch/manuskript/2016/02/05/index-cards/)) * Write with focus ([Distraction free mode](https://github.com/olivierkes/manuskript/wiki/Full-screen-mode)) * Build worlds * [Track items](https://github.com/olivierkes/manuskript/wiki/How-to-keep-track-of-important-items) * Edit and re-organize chapters and scenes * View [Story line](http://www.theologeek.ch/manuskript/2016/02/28/story-line/) * Compose with [fiction or non-fiction templates and writing modes](http://www.theologeek.ch/manuskript/2016/03/31/writing-modes-simple-fiction/) * Import and export document formats such as HTML, ePub, OpenDocument, DocX, and [more](https://github.com/olivierkes/manuskript/wiki/Import-and-Export-capabilities) Additionally Manuskript can help in many more ways with a spell checker, markdown highlighter, [frequency analyzer](http://www.theologeek.ch/manuskript/2016/02/08/frequency-analyzer/), and automatic save in [open and plain text file format](http://www.theologeek.ch/manuskript/2016/03/31/open-plain-text-file-format/). ## Download [Download](http://www.theologeek.ch/manuskript/download) and install Manuskript today. ## HowTo's See the [Wiki](http://github.com/olivierkes/manuskript/wiki) for more detailed instructions on how to install and use Manuskript. ## Contribute You can help improve Manuskript by reporting [issues](https://github.com/olivierkes/manuskript/issues), writing [wiki documentation](https://github.com/olivierkes/manuskript/wiki), and [translating to other languages](https://github.com/olivierkes/manuskript/wiki/Translate-Manuskript). See also [Manuskript Contribute page](http://www.theologeek.ch/manuskript/contribute/). Manuskript is written in Python3 and PyQt5. ## Free Software Manuskript is [Free Software](https://www.gnu.org/philosophy/free-sw.html). You have the freedom to run, copy, distribute, study, change and improve the software. Manuskript is distributed under the [GNU General Public License](https://www.gnu.org/licenses/gpl.html) version 3 or (at your option) any later version. manuskript-0.10.0/TODO.t2t000066400000000000000000000011661354442177200152020ustar00rootroot00000000000000 Features - Coach (entrer le nombre de mot viser, se fixer des objectifs quotidiens / hebdomadaires (en temps, ou en mots, min ou max), faire des statistiques) - Différents modes: simple (que le outliner / rédacteur), snowflake strict (cache les éléments tant que le précédent n'a pas été accompli), snowflake souple (tout est affiché mais permet de naviger, avec conseils) - Boîte à sable: endroit pour expérimenter, des scenes particulières ou des perso en situations spéciales. Avec suggestions de thèmes / lieux / ... - Distraction free: internet blocking? - https://www.languagetool.org/ ? - Small things: manuskript-0.10.0/_config.yml000066400000000000000000000000321354442177200161200ustar00rootroot00000000000000theme: jekyll-theme-caymanmanuskript-0.10.0/bin/000077500000000000000000000000001354442177200145465ustar00rootroot00000000000000manuskript-0.10.0/bin/manuskript000077500000000000000000000003271354442177200166730ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import sys realpath = os.path.realpath(__file__) sys.path.insert(1, os.path.join(os.path.dirname(realpath), '..')) from manuskript import main main.run()manuskript-0.10.0/i18n/000077500000000000000000000000001354442177200145555ustar00rootroot00000000000000manuskript-0.10.0/i18n/languages.txt000066400000000000000000000002251354442177200172630ustar00rootroot00000000000000 TRANSLATIONS += manuskript_fr.ts TRANSLATIONS += manuskript_es.ts TRANSLATIONS += manuskript_de.ts TRANSLATIONS += manuskript_sv.ts manuskript-0.10.0/i18n/manuskript.pro000066400000000000000000000124761354442177200175060ustar00rootroot00000000000000FORMS += ../manuskript/ui/importers/generalSettings_ui.ui FORMS += ../manuskript/ui/importers/importer_ui.ui FORMS += ../manuskript/ui/about_ui.ui FORMS += ../manuskript/ui/settings_ui.ui FORMS += ../manuskript/ui/editors/locker_ui.ui FORMS += ../manuskript/ui/editors/mainEditor_ui.ui FORMS += ../manuskript/ui/editors/editorWidget_ui.ui FORMS += ../manuskript/ui/editors/completer_ui.ui FORMS += ../manuskript/ui/editors/textFormat_ui.ui FORMS += ../manuskript/ui/editors/tabSplitter_ui.ui FORMS += ../manuskript/ui/tools/frequency_ui.ui FORMS += ../manuskript/ui/mainWindow.ui FORMS += ../manuskript/ui/views/basicItemView_ui.ui FORMS += ../manuskript/ui/views/metadataView_ui.ui FORMS += ../manuskript/ui/views/storylineView_ui.ui FORMS += ../manuskript/ui/views/propertiesView_ui.ui FORMS += ../manuskript/ui/views/sldImportance_ui.ui FORMS += ../manuskript/ui/search_ui.ui FORMS += ../manuskript/ui/welcome_ui.ui FORMS += ../manuskript/ui/cheatSheet_ui.ui FORMS += ../manuskript/ui/revisions_ui.ui FORMS += ../manuskript/ui/exporters/exportersManager_ui.ui FORMS += ../manuskript/ui/exporters/manuskript/plainTextSettings_ui.ui FORMS += ../manuskript/ui/exporters/exporter_ui.ui SOURCES += ../manuskript/models/persosProxyModel.py SOURCES += ../manuskript/models/plotsProxyModel.py SOURCES += ../manuskript/models/plotModel.py SOURCES += ../manuskript/models/worldModel.py SOURCES += ../manuskript/models/abstractModel.py SOURCES += ../manuskript/models/characterModel.py SOURCES += ../manuskript/exporter/pandoc/abstractPlainText.py SOURCES += ../manuskript/exporter/manuskript/markdown.py SOURCES += ../manuskript/mainWindow.py SOURCES += ../manuskript/main.py SOURCES += ../manuskript/settingsWindow.py SOURCES += ../manuskript/load_save/version_0.py SOURCES += ../manuskript/ui/importers/importer.py SOURCES += ../manuskript/ui/helpLabel.py SOURCES += ../manuskript/ui/editors/textFormat.py SOURCES += ../manuskript/ui/editors/tabSplitter.py SOURCES += ../manuskript/ui/editors/mainEditor.py SOURCES += ../manuskript/ui/editors/fullScreenEditor.py SOURCES += ../manuskript/ui/editors/locker.py SOURCES += ../manuskript/ui/welcome.py SOURCES += ../manuskript/ui/tools/frequencyAnalyzer.py SOURCES += ../manuskript/ui/tools/splitDialog.py SOURCES += ../manuskript/ui/cheatSheet.py SOURCES += ../manuskript/ui/about.py SOURCES += ../manuskript/ui/views/cmbOutlineCharacterChoser.py SOURCES += ../manuskript/ui/views/sldImportance.py SOURCES += ../manuskript/ui/views/cmbOutlineStatusChoser.py SOURCES += ../manuskript/ui/views/textEditView.py SOURCES += ../manuskript/ui/views/corkDelegate.py SOURCES += ../manuskript/ui/views/outlineDelegates.py SOURCES += ../manuskript/ui/views/lineEditView.py SOURCES += ../manuskript/ui/views/cmbOutlineLabelChoser.py SOURCES += ../manuskript/ui/views/plotDelegate.py SOURCES += ../manuskript/ui/views/plotTreeView.py SOURCES += ../manuskript/ui/views/treeView.py SOURCES += ../manuskript/ui/views/characterTreeView.py SOURCES += ../manuskript/ui/views/storylineView.py SOURCES += ../manuskript/ui/views/MDEditCompleter.py SOURCES += ../manuskript/ui/search.py SOURCES += ../manuskript/ui/collapsibleDockWidgets.py SOURCES += ../manuskript/ui/exporters/manuskript/plainTextSettings.py SOURCES += ../manuskript/ui/exporters/exporter.py SOURCES += ../manuskript/ui/exporters/exportersManager.py SOURCES += ../manuskript/ui/revisions.py SOURCES += ../manuskript/models/references.py SOURCES += ../manuskript/models/outlineItem.py SOURCES += ../manuskript/exporter/pandoc/HTML.py SOURCES += ../manuskript/exporter/pandoc/outputFormats.py SOURCES += ../manuskript/exporter/pandoc/abstractPlainText.py SOURCES += ../manuskript/exporter/pandoc/plainText.py SOURCES += ../manuskript/exporter/pandoc/PDF.py SOURCES += ../manuskript/exporter/pandoc/__init__.py SOURCES += ../manuskript/exporter/manuskript/markdown.py SOURCES += ../manuskript/exporter/manuskript/HTML.py SOURCES += ../manuskript/exporter/manuskript/plainText.py SOURCES += ../manuskript/exporter/manuskript/__init__.py SOURCES += ../manuskript/converters/pandocConverter.py SOURCES += ../manuskript/importer/markdownImporter.py SOURCES += ../manuskript/importer/folderImporter.py SOURCES += ../manuskript/importer/opmlImporter.py SOURCES += ../manuskript/importer/pandocImporters.py SOURCES += ../manuskript/importer/mindMapImporter.py SOURCES += ../manuskript/ui/views/corkDelegate.py SOURCES += ../manuskript/ui/views/outlineBasics.py SOURCES += ../manuskript/ui/views/outlineDelegates.py SOURCES += ../manuskript/ui/collapsibleDockWidgets.py TRANSLATIONS += manuskript_ar_SA.ts TRANSLATIONS += manuskript_de.ts TRANSLATIONS += manuskript_en_GB.ts TRANSLATIONS += manuskript_es.ts TRANSLATIONS += manuskript_fa.ts TRANSLATIONS += manuskript_fr.ts TRANSLATIONS += manuskript_hu.ts TRANSLATIONS += manuskript_id.ts TRANSLATIONS += manuskript_it.ts TRANSLATIONS += manuskript_ja.ts TRANSLATIONS += manuskript_nb_NO.ts TRANSLATIONS += manuskript_nl.ts TRANSLATIONS += manuskript_pl.ts TRANSLATIONS += manuskript_pt_BR.ts TRANSLATIONS += manuskript_pt_PT.ts TRANSLATIONS += manuskript_ru.ts TRANSLATIONS += manuskript_sv.ts TRANSLATIONS += manuskript_tr.ts TRANSLATIONS += manuskript_uk.ts TRANSLATIONS += manuskript_zh_CN.ts TRANSLATIONS += manuskript_zh_HANT.ts manuskript-0.10.0/i18n/manuskript_ar_SA.qm000066400000000000000000000240141354442177200203570ustar00rootroot00000000000000 _ Mg Mg!~ Mg$Y : :$ N }jl  W !T  $ $! $" $%J s b s"j s#> s# .] 4} 5N K S ^LUh; S SN;hd@ i!i%B<p>E-HD E3*F/'* 4'ED. JECF '3*./'EG D*-HJD 5J:) E'1C /'HF D5J: E*9//) #.1I.</p> <p>EHB9G: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> 

A universal document converter. Can be used to convert markdown to a wide range of other formats.

Website: http://pandoc.org/

Export5J:) DJ3* (*DC 'D4G1) H*3*./E (4CD E*H'69 E+D'K AJ EH'B9 'D#F*1F*.EA little known format modestly used. You know, web sites for example.Export2'DC*( 'D*J D' *B*D 'D4,1.Books that don't kill trees.Export'DA&) (Class):Class:Export*-HJD %DI ePUB3Convert to ePUB3Export|'DEO5/Q1 'D%A*1'6J J97J 5J: (3J7) *3*./EG' 'DEO5/Q1'* 'D#.1I.ADefault exporter, provides basic formats used by other exporters.Export*97JD C*D) 'D(J'F'* 'DH5A) 0'* 5J:) YAML. '3*./E G0' 'D.J'1 9F/ *916C D.7# YAML.DDisable YAML metadata block. Use that if you get YAML related error.Export.7#ErrorExport*5/J1 DE'1C /'HF (markdown) ('3*./'E pandoc. J3E- (.J'1'* *1EJ2J) #C+1 EF EO5/1 'D*7(JB 'D(3J7.hExport to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter.Export-,E 'D.7: Font size:Export*'D(J'F'* 'DE.1,) HTML HTML OutputExport('D4A1) 'DE5/1J) HTML HTML SourceExport$6EQF ,/HD E-*HJ'*.Include a table of contents.ExportE+D' 'DF5H5 'D9'/J) DCFG' *.*DA (CHFG' *6JA 9F'HJF E'1C /'HF (markdown). 9DI %A*1'6 #F 'DF5H5 EC*H() (5J:) E'1C /'HF.Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown.Export<'O3*./E E-1C LaTeX D%F*', PDF.%LaTeX engine used to produce the PDF.ExportLaTeX GJ D:) *1EJ2J) DDE3*F/'* HE9'D, C*'(J D%F4'! E3*F/'* ,EJD).LaTeX is a word processor and document markup language used to create beautiful documents.Export*('9/ 'D#371: Line spacing:ExportJE3*F/ (5J:) E'JC1H3HA* #HAJ3 (.docx)."Microsoft Office (.docx) document.Export6J-*', #F JCHF LaTeX E+(*'K.Needs LaTeX to be installed.Export**3HJ) 'DE3*F/ (EOF8A) Normalize the document (cleaner)Export^CE E3*HI EF 'D#,2'! 3*O6EQF AJ ,/HD 'DE-*HJ'*: ,Number of sections level to include in TOC: Export5J:) 'DE3*F/ 'DEA*H- (OpenDocument). H*3*./E EF B(D LibreOffice E+D'K.5OpenDocument format. Used by LibreOffice for example.Export-,E 'DH1B): Paper size:ExportF5 9'/J Plain textExport.'3*91'6 E9 H69 'D%('F).Preview with highlighter.ExportpEDA'* HTML E5FH9) (4CD E3*BD (-J+ D'*-*', DED-B'* H*(9'*/Self-contained HTML files, with no dependenciesExportD'D%.1', 'D#3GD DDF5H5 'D9'/J). *3E- DC ('3*./'E 5J:) *1EJ2 D' JAGEG' G0' 'D*7(JB (manuskript) E+D 5J:) <a href='www.fountain.io'>Fountain</a>.Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example Fountain.ExportH-// 'DE3*HI 'D#3'3 DD9F'HJF 'D1&3J) $Specify the base level for headers: Export6E3*F/ EO3*BD (DJ3 E,1/ ,2!))Standalone document (not just a fragment)Export'D:16 EF G0G 'D5J:) GH D%97'! 71JB) D*('/D 'DE9DHE'* (JF E-11'* 'DF5H5 (outliners) H./E'* 'D#F*2F* 'D*J JECF '3*91'6G' 'H 'D*-CE (G' 9(1 'DE-11'* *DC.The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner.Export:F'*, 'DE.1,'* 5-J- (4CD 7('9JTypographically correct outputExportD'3*./E H3HE <q> DD'B*('3'* AJ HTMLUse tags for quotes in HTMLExport>'3*./E 4CD ATX DD9F'HJF 'D1#3J)Use ATX-style headersExportl'3*./E 1H'(7 0'* 4CD EAG13 (/D'K EF 'D1H'(7 (JF 'D37H11Use reference-style links instead of inline linksExport~*+(J* LaTeX (4CD 5-J-. *H5J'* Pandoc JECF %J,'/G' 9DI: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. %0' '-*,* /9E JHFJCH/ A3*-*', XeLaTeX.a valid LaTeX installation. Pandoc recommendations can be found on: pandoc.org/installing.html. If you want Unicode support, you need XeLaTeX.ExportV5J:) reStructuredText GJ D:) *1EJ2J) .AJA).2reStructuredText is a lightweight markup language.Export......ExportersManagerH5A DescriptionExportersManager*-CE ('DEO5/1'*Manage ExportersExportersManagerE'FJH3C1J(* ManuskriptExportersManagerJB/E *5/J1 %DIOffers export toExportersManager'DE3'1:Path:ExportersManager 'D-'D)StatusExportersManager'D-'D):Status:ExportersManager'DF3.):Version:ExportersManager{HelpText} {HelpText}ExportersManager *-DJDAnalyzeFrequencyAnalyzer<'3*(9'/ CDE'* (EA5HD) (A'5D)): Exclude words (comma separated):FrequencyAnalyzerE-DD 'D*C1'1Frequency AnalyzerFrequencyAnalyzer'D-,E 'D#/FI: Minimum size:FrequencyAnalyzer9// 'DCDE'*: EFNumber of words: fromFrequencyAnalyzer*C1'1 'D9('1)Phrase frequencyFrequencyAnalyzer'D%9/'/'*SettingsFrequencyAnalyzer*C1'1 'DCDE)Word frequencyFrequencyAnalyzer%DItoFrequencyAnalyzer8'3*J1'/ E'1C /'HF (Markdown)Markdown importImportH5A Description MainWindowE'FJH3C1J(* Manuskript MainWindow-,E 'D.7: Font size:Settings*('9/ 'D#371: Line spacing:Settings'D%9/'/'*SettingsSettings 'D-'D)StatusSettingsE'FJH3C1J(* Manuskriptabout 'D-'D)Status abstractModel'D%9/'/'*Settingsexporter-,E 'D.7: Font size:exporterSettings 'D-'D)StatusexporterSettings'D%9/'/'*Settingsimporter 'D-'D)StatuspropertiesViewH5A Description references'DE3'1:Path: references'D-'D):Status: references 'D-'D)Statussearch.7#ErrorsettingsWindowE'FJH3C1J(* Manuskriptwelcome$ * manuskript-0.10.0/i18n/manuskript_ar_SA.ts000066400000000000000000005501011354442177200203710ustar00rootroot00000000000000 Export Basic HTML output using the Python module 'markdown'. Python module 'markdown'. Markdown source HTML Source الشفرة المصدرية HTML HTML Output البيانات المخرجة HTML Default exporter, provides basic formats used by other exporters. المُصدّر الإفتراضي، يعطي صيغ بسيطة تستخدمها المُصدّرات الأخرى. Preview with highlighter. استعراض مع وضع الإبانة. Plain text نص عادي A little known format modestly used. You know, web sites for example. صيغة ليست بتلك الشهرة وتستخدم بشكل متواضع، مثلاً في مواقع الأنترنت. Needs LaTeX to be installed. يحتاج أن يكون LaTeX مثبتاً. Error خطأ Standalone document (not just a fragment) مستند مُستقل (ليس مجرد جزء) Include a table of contents. ضمّن جدول محتويات. Number of sections level to include in TOC: كم مستوى من الأجزاء ستُضمّن في جدول المحتويات: Typographically correct output ناتج المخرجات صحيح بشكل طباعي Normalize the document (cleaner) تسوية المستند (مُنظف) Specify the base level for headers: حدد المستوى الأساس للعناوين الرئسية Use reference-style links instead of inline links استخدم روابط ذات شكل مفهرس بدلاً من الروابط بين السطور Use ATX-style headers استخدم شكل ATX للعناوين الرأسية Self-contained HTML files, with no dependencies ملفات HTML مصنوعة بشكل مستقل بحيث لاتحتاج لملحقات وتبعات Use <q> tags for quotes in HTML استخدم وسوم <q> للاقتباسات في HTML LaTeX engine used to produce the PDF. اُستخدم محرك LaTeX لإنتاج PDF. Paper size: حجم الورقة: Font size: حجم الخط: Class: الفئة (Class): Line spacing: تباعد الأسطر: Books that don't kill trees. الكتب التي لا تقتل الشجر. OpenDocument format. Used by LibreOffice for example. صيغة المستند المفتوح (OpenDocument). وتستخدم من قبل LibreOffice مثلاً. Microsoft Office (.docx) document. مستند بصيغة مايكروسوفت أوفيس (.docx). reStructuredText is a lightweight markup language. صيغة reStructuredText هي لغة ترميزية خفيفة. Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. مثلا النصوص العادية لكنها تختلف بكونها تضيف عناوين مارك داون (markdown). على إفتراض أن النصوص مكتوبة بصيغة مارك داون. Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. الإخراج الأسهل للنصوص العادية. تسمح لك باستخدام صيغة ترميز لا يفهمها هذا التطبيق (manuskript) مثل صيغة <a href='www.fountain.io'>Fountain</a>. <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> <p>محول مستندات شامل. يمكن استخدامه لتحويل صيغة مارك داون لصيغ متعددة أخرى.</p> <p>موقعه: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. تثبيت LaTeX بشكل صحيح. توصيات Pandoc يمكن إيجادها على: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. إذا احتجت دعم يونيكود فستحتاج XeLaTeX. Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. تصدير لمارك داون (markdown)، باستخدام pandoc. يسمح بخيارات ترميزية أكثر من مُصدر التطبيق البسيط. LaTeX is a word processor and document markup language used to create beautiful documents. LaTeX هي لغة ترميزية للمستندات ومعالج كتابي لإنشاء مستندات جميلة. The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. الغرض من هذه الصيغة هو لإعطاء طريقة لتبادل المعلومات بين محررات النصوص (outliners) وخدمات الأنتزنت التي يمكن استعراضها او التحكم بها عبر المحررات تلك. Disable YAML metadata block. Use that if you get YAML related error. تعطيل كتلة البيانات الوصفة ذات صيغة YAML. استخدم هذا الخيار عند تعرضك لخطأ YAML. Convert to ePUB3 تحويل إلى ePUB3 Could not process regular expression: {} Choose output file… ExportersManager Manage Exporters تحكم بالمُصدرات Manuskript مانيوسكريبت Description وصف Offers export to يقدم تصدير إلى Status الحالة Status: الحالة: Version: النسخة: Path: المسار: ... ... {HelpText} {HelpText} FrequencyAnalyzer Frequency Analyzer محلل التكرار Word frequency تكرار الكلمة Settings الإعدادات Minimum size: الحجم الأدنى: Exclude words (comma separated): استبعاد كلمات (مفصولة بفاصلة): Analyze تحليل Phrase frequency تكرار العبارة Number of words: from عدد الكلمات: من to إلى Import Markdown import استيراد مارك داون (Markdown) <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; Folder import <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> Include only those extensions: Comma separated values Sort items by name Import folder then files OPML Import File open failed. This does not appear to be a valid OPML file. Pandoc import <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; Import using: Wrap lines: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> Mind Map Import This does not appear to be a valid Mind Map file. Mind Map import Import tip as: Untitled MDEditCompleter Insert reference MainWindow General Title Subtitle Series Volume Genre License Author Name Email Summary Situation: Summary: One sentence One paragraph One page Full One sentence summary One paragraph summary Expand each sentence of your one paragraph summary to a paragraph One page summary Full summary Next What if...? Characters Names Filter Basic info Importance Motivation Goal Conflict Epiphany <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> Notes Detailed info Plots Plot Character(s) Description وصف Result Resolution steps World Populates with empty data More Source of passion Source of conflict Outline Editor Debug FlatData Persos Labels &File &Recent &Help &Tools &Edit &View &Mode &Cheat sheet Sea&rch &Navigation &Open Ctrl+O &Save Ctrl+S Sa&ve as... Ctrl+Shift+S &Quit Ctrl+Q &Show help texts Ctrl+Shift+B &Spellcheck F9 &Labels... &Status... Tree &Simple &Fiction Index cards S&ettings F8 &Close project Co&mpile F6 &Frequency Analyzer Book information &About About Manuskript Manuskript مانيوسكريبت Project {} saved. WARNING: Project {} not saved. Project {} loaded. Project {} loaded with some errors: * {} wasn't found in project file. Project {} loaded with some errors. (~{} pages) Words: {}{} Book summary Project tree Metadata Story line Enter information about your book, and yourself. The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Create your characters. Develop plots. Build worlds. Create hierarchy of broad categories down to specific details. Create the outline of your masterpiece. Write. Debug info. Sometimes useful. Dictionary Nothing POV Label Progress Compile Icon color Text color Background color Icon Text Background Border Corner Add plot step &Import… F7 &Copy Ctrl+C C&ut Ctrl+X &Paste Ctrl+V &Split… Ctrl+Shift+K Sp&lit at cursor Ctrl+K Ctrl+M Ctrl+D Del &Move Up Ctrl+Shift+Up M&ove Down Ctrl+Shift+Down Dupl&icate &Delete &Rename F2 Organi&ze M&erge &Format &Header &Level 1 (setext) Ctrl+Alt+1 Level &2 Ctrl+Alt+2 Level &1 (atx) Ctrl+1 L&evel 2 Ctrl+2 Level &3 Ctrl+3 Level &4 Ctrl+4 Level &5 Ctrl+5 Level &6 Ctrl+6 &Bold Ctrl+B &Italic Ctrl+I &Strike &Verbatim Su&perscript Ctrl++ Subsc&ript Ctrl+- Co&mment block Ctrl+Shift+C Clear &formats Ctrl+0 &Comment line(s) &Ordered list &Unordered list B&lockquote Remove selected plot step(s) The file {} does not exist. Has it been moved or deleted? Install {}{} to use spellcheck {} has no installed dictionaries {}{} is not installed Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings Settings الإعدادات General Revisions Views Labels Status الحالة Fullscreen General settings Application settings Loading Automatically load last project on startup Saving Automatically save every minutes. If no changes during seconds. Save on project close <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> Save to one single file Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. Keep revisions S&mart remove Keep: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. revisions per day for the last month revisions per minute for the last 10 minutes revisions per hour for the last day revisions per 10 minutes for the last hour revisions per week till the end of time Views settings Tree Colors Icon color: Nothing POV Label Progress Compile Text color: Background color: Folders Show ite&m count Show summary &Nothing Text Outline Visible columns Goal Word count Percentage Title Index cards Item colors Border color: Corner color: Background Color: Ctrl+S Image: Text editor Font Family: Size: Misspelled: Background: Paragraphs Line spacing: تباعد الأسطر: Single 1.5 lines Double Proportional % Tab width: px Indent 1st line Spacing: New Edit Delete Theme name: Apply Cancel Window Background Text Background Text Options Paragraph Options Type: No Image Tiled Centered Stretched Scaled Zoomed Opacity: Position: Left Center Right Width: Corner radius: Margins: Padding: Font: Style Cursor Use block insertion of Alignment: Justify Alignment Icon Size TextLabel Disable blinking Text area Max width Left/Right margins: Top/Bottom margins: S&how progress Show summar&y Show p&rogress Old st&yle Transparent Restore defaults Style: Language: Font size: حجم الخط: Restarting Manuskript ensures all settings take effect. Show &word count &Show word count &New style Typewriter mode Focus mode None Sentence Line Paragraph <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions &Add to dictionary &Remove from custom dictionary about About Manuskript Manuskript مانيوسكريبت aboutDialog Version Software Versions in Use: abstractModel Title POV Label Status الحالة Compile Word count Goal basicItemView Form POV: Goal: Word count One line summary Few sentences summary: characterModel New character Name Value characterTreeView Main Secondary Minor cheatSheet Form Filter (type the name of anything in your project) Minor Secondary Main Characters Texts Plots World cmbOutlineCharacterChoser None Main Secondary Minor Various cmbOutlineLabelChoser Various cmbOutlineStatusChoser Various collapsibleDockWidgets Dock Widgets Toolbar completer Form corkDelegate One line summary Full summary editorWidget_ui Form exporter Export Export to: Manage exporters Preview Settings الإعدادات exporterDialog {} (not implemented yet) exporterSettings Form Content Decide here what will be included in the final export. Type Title Text I need more granularity Fi&lters <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> Ignore compile status (include all items) Subitems of: Labels Status الحالة Separations Between folders: Empty line Custom Between texts: Between folder and text: Between text and folder: Transformations Typographic replacements: Replace double quotes (") with: Replace single quotes (') with: Remove multiple spaces Custom replacements: Enabled Replace With RegExp If checked, uses regular expression for replacement. If unchecked, replaced as plain text. Preview Font Font: Font size: حجم الخط: Folder {}Level {} folder {}Level {} text Replace ... with … Replace --- with — exportersManager Installed Custom Not found {} not found. Install it, or set path manually. <b>Status:</b> uninstalled. <b>Requires:</b> Set {} executable path. frequencyAnalyzer Phrases Frequency Word fullScreenEditor Theme: {} words / {} {} words Spellcheck Navigation New Text Title Title: Show Full Path Theme selector Word count Progress Progress: Auto Show/Hide Clock Clock: Show Seconds generalSettings General Split scenes at: \n---\n Trim long titles (> 32 chars) Import under: Import in a top-level folder helpLabel If you don't wanna see me, you can hide me in Help menu. importer Import Format: Choose file Clear file Preview Settings الإعدادات lastAccessedDirectoryInfo Last accessed directory "{}" loaded. lineEditView Various locker Form Lock screen: Word target Time target words minutes Lock ! ~{} h. ~{} mn. {}:{} {} s. {} remaining {} words remaining mainEditor Form Text Index cards Outline F11 Go to parent item Alt+Up Root {} words / {} {} words markdownSettings Markdown metadataView Form Properties Summary One line summary Full summary Notes / References Revisions myPanel Auto-hide outlineBasics Set POV None Set Status Set Label New Main Secondary Minor Set Custom Icon Restore to default Root Open {} items in new tabs Open {} in a new tab About to remove <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> Select at least two items. Folders are ignored. All items must be on the same level (share the same parent). New &Folder New &Text &Copy C&ut &Paste &Rename &Delete outlineCharacterDelegate None Main Secondary Minor outlineItem {} words / {} ({}) {} words pandocSettings General Table of Content Custom settings for {} persosProxyModel Main Secondary Minors plotDelegate General Promise Problem Progress Resolution Try / Fail No and Yes but Freytag's pyramid Exposition Rising action Climax Falling action Three acts 1. Setup 1. Inciting event 1. Turning point 2. Choice 2. Reversal 2. Disaster 3. Stand up 3. Climax 3. Ending Hero's journey Ordinary world Call to adventure Refusal of the call Meeting with mentor Tests Approach Abyss Reward / Revelation Transformation Atonement Return plotModel New plot Name Meta New step Main Secondary Minor plotTreeView Main Secondary Minor **Plot:** {} plotsProxyModel Main Secondary Minors propertiesView Form POV Status الحالة Label Compile Goal Word count references Not a reference: {}. Unknown reference: {}. Path: المسار: Stats: POV: Status: الحالة: Label: Short summary: Long summary: Notes: Basic info Detailed info POV of: Go to {}. Description وصف Result Characters Resolution steps Passion Conflict <b>Unknown reference:</b> {}. Folder: <b>{}</b> Text: <b>{}</b> Character: <b>{}</b> Plot: <b>{}</b> World: <b>{name}</b>{path} Referenced in: Motivation Goal Epiphany Short summary Longer summary revisions Form Options Restore Delete Show modifications Show ancient version Show spaces Show modifications only {} years ago {} months ago {} days ago 1 day ago {} hours ago {} minutes ago {} seconds ago Line {}: Clear all search Form Search for... Search in: All Title Text Summary Notes POV Status الحالة Label Options: Case sensitive settingsWindow New status New label newtheme New theme (read-only) Open Image Image files (*.jpg; *.jpeg; *.png) Error خطأ Unable to load selected file Unable to add selected image: {} sldImportance Form TextLabel Minor Secondary Main splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> Split '{}' Split items storylineView Form Show Plots Show Characters tabSplitter Open selected items in that view. Split horizontally Close split Split vertically textEditView Various textFormat Form CTRL+B CTRL+I CTRL+U CTRL+P CTRL+L CTRL+E CTRL+R CTRL+J treeView Expand {} Collapse {} Expand All Collapse All welcome Form 1 Templates Empty Novel Novella Short Story Research paper Demo projects Add level Add word count Next time, automatically open last project Open... Recent Create Open project Manuskript project (*.msk);;All files (*) Save project as... Manuskript project (*.msk) Manuskript مانيوسكريبت Create New Project Warning Overwrite existing project {} ? Empty fiction Chapter Scene Trilogy Book Section Empty non-fiction words each. of Text Something <b>Total:</b> {} words (~ {} pages) Fiction Non-fiction Idea Note Research TODO First draft Second draft Final worldModel New item Fantasy world building Physical Climate Topography Astronomy Wild life Flora History Races Diseases Cultural Customs Food Languages Education Dresses Science Calendar Bodily language Ethics Religion Government Politics Gender roles Music and arts Architecture Military Technology Courtship Demography Transportation Medicine Magic system Rules Organization Magical objects Magical places Magical races Important places Important objects Natural resources manuskript-0.10.0/i18n/manuskript_de.qm000066400000000000000000002354731354442177200177770ustar00rootroot00000000000000L`TT)VEcVEVEVECVsdcdxdIn9rpΥ(GqNe/* J{cA*$<*y=*y*>U*%>*0?+E@+fA+B6+B+E .3093?;WA[mG:GHw9yJ5\JTL7W[LG,LbXLbM| M6MezMez9MŅ[lNWQ:PRx\RxRx&RxFRxqTbTbTb<TbTbTbTbqTbT`WUj`UjUlHV':V!VW6d<W6(Xy>XTYEYYȀފZZ%ZʳZϳ[X[ %q[ %[ %[ %[ %[ %O[ٵ;Z\w\\$\`^i$sc^i$gUn[8^-{sJ#M7(YMBw9rHoafEA~U_(h.FnDGD"sy2-  NEP2,i MtU36ݰH!ʯlLHzln4Y@ Y^;BŜgq hz ~hwqZY8Buw<AxPDf3D# # ҳP.^M[C#Nh~L,M[S0W>M1v 3tc5ML#UAIWVW ]1}"^ai@9tRYW ./evfk.ه(^Wʶ'&)J&'1!ȳDƩ% &ne0JtETFN^ǡ_͐aN6lwpAl.q0brwbap;nn +n \n n o o o QrzT bHJII{Z|jj+Ո6Z|s6|M`Vƅ ]NNO O<OmOOPP1PQ Q>QoQQRR3Rd}ToT,},kb}]E]Gt8%~^7S 4 bWĚGnS*vD=:Z(*N:g/ /C?sC,#?(^}MvV!&$ '>'3] '3'3A+y5!5@Vݧ@VHuQhDsVjW;j+jtKj`jlcclqssg~}}Z}ZT4h)45 G iS!N%|Mj|"y ÊèvTjAt:j?~&;<5rߺ; ~sYu N* 0 P>` rot/cT %Ē&tS/t0 9$CsgCsWCXJCLtM+M)M+uR!|TunI`xl^m?$mmmmďmmnndprJr qz Dz{~ ~U~, TZ]s!\+a.rDž0cT040@֣֝cރI=:\1 Z 62?F!a7X4L Iǹ#tl)H-0e1D1~hG4Nl?rJ;rt~ySЂI ϗNϗxϗɏ6@nESP` LukLe°^Èv}[([Уش7 sMM˃ pG&S!j0,N3  7|BnBL @HAE# MP[5j]*{b̛hf~2L(~2z~28~Z^Z9Wڬai(Sn T^tDC~@G'bʶ<˙DvyzZ .  σ F> HZV +4և ?:Eȥ Mg MgU Mg T ^d ^ ^ ^/ g:o r,| x t z IgW   -  h %j C U U; շ[ z , C N5 z % ?@ 082 3 9s\f 9sO 9s >ck A^ Rb`@ Z dpeL dpe| dpe dpe d); d)l d) d)y d)ۀ d) d) d) d)c d) e n, o"` }(z  T B;&3 f *Z @ :"N : ,> ,? 8k 8o 8 ʶ ֓? U N [  9V J @ ; #eѱ F.s Q8˹ U~5I ]Y) l s3T }j$O % . 8 tBn HB HҲ  fiM 5o o  j  GC{ L ڔ5 u 5 YV5 _ K iC ӨSG y W!   R /l 1U 4 ; CjkV G NrB Z> Z$|< b^ i?f pk_ rIj }4 !T ~   [    ) ޔ1 J x$ n " s"  `b 'j _ $!K $_N $ $ n ,d %9& #hZ s%m sk s s ɠ ] ] ] ^, ^c ̺\ C2 u ߐ >  QN M r 1 . zZ}   4}$ 5N 87>Jz DYR DYR DYSy DZS J K b~ i8:$ c P .:= SZ 9  Ѕ ^ )9 0y Ğt=E <[4 < <_ < < a* ⋙aQ eXm  uYD'a2#.2)K6eI9a<+@HfIOqUh>WGxZ$J0$Vj{Pkm̺}KaPbbP lfTe5 S); =Q->bpB3BxS5Qy R_IZR_d@ fq&pt6t|oN_~`~`@"|"|ii'Œl]>ttx:AAP9i7i!<p>Ein universaler Dokumenten-Konverter. Kann zur Konvertierung von Markup in eine Reihe von anderen Formaten genutzt werden.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> 

A universal document converter. Can be used to convert markdown to a wide range of other formats.

Website: http://pandoc.org/

ExportEin kaum bekanntes Format wird verwendet. Du weit schon, fr Webseiten und so.EA little known format modestly used. You know, web sites for example.ExportlEinfacher HTML-Export mit dem Python-Modul markdown .5Basic HTML output using the Python module 'markdown'.ExportXBcher, fr die keine Bume sterben mussten.Books that don't kill trees.Export.Ausgabe-Datei whlenChoose output file…ExportKlasse:Class:Export0Konvertierung nach ePUB3Convert to ePUB3ExporttFehler bei der Verarbeitung eines regulren Ausdruckes: {})Could not process regular expression: {}ExportStandardexport: Bietet Basis-Formate, die von anderen Exports genutzt werden.ADefault exporter, provides basic formats used by other exporters.ExportEntfernt den YAML-Metadaten-Block. Nutze das, wenn du YAML-Errors bekommst.DDisable YAML metadata block. Use that if you get YAML related error.Export FehlerErrorExportExportiert nach Markdown via pandoc. Erlaubt mehr Formatierungen als der Basis-Manuskript-Export.hExport to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter.ExportSchriftgre: Font size:ExportHTML-Ausgabe HTML OutputExportHTML-Quelle HTML SourceExport>Erzeuge ein Inhaltsverzeichnis.Include a table of contents.Export hnlich Plaintext, erlaubt aber Hervorhebungen fr Titel Setzt voraus, dass Texte bereits in Markdown formatiert sind.Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown.ExportbLaTeX-Engine wird fr Erzeugung des PDFs genutzt.%LaTeX engine used to produce the PDF.ExportLaTeX ist Textsatzprogramm und Markup-Language zur Erstellung wunderschner Dokumente.LaTeX is a word processor and document markup language used to create beautiful documents.ExportZeilenabstand: Line spacing:ExportMarkdown-QuelleMarkdown sourceExportDMicrosoft Office-Dokument (.docx)."Microsoft Office (.docx) document.Export8LaTeX muss installiert sein.Needs LaTeX to be installed.ExportLAutomatische Bereinigung des Dokuments Normalize the document (cleaner)ExportRAnzahl der Ebenen im Inhaltsverzeichnis: ,Number of sections level to include in TOC: ExportOpenDocument-Format. Wird beispielsweise von LibreOffice genutzt.5OpenDocument format. Used by LibreOffice for example.ExportSeitengre: Paper size:ExportEinfacher Text Plain textExport4Vorschau mit Hervorhebung.Preview with highlighter.Export0Python-Modul markdown .Python module 'markdown'.Export^Eigenstndige HTML-Dateien, ohne Abhngigkeiten/Self-contained HTML files, with no dependenciesExport`Einfacher Export in Plaintext. Erlaubt die Benutzung von Markups, die von Manuskript nicht interpretiert werden knnen, wie zum Beispiel <a href='www.fountain.io'>Fountain</a>.Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example Fountain.ExportXLege die Basisebene fr berschriften fest: $Specify the base level for headers: Export`Eigenstndiges Dokument (nicht nur ein Fragment))Standalone document (not just a fragment)ExportDieses Format dient zum Austausch von Informationen zwischen Outlinern und Internetservices, die von Outlinern durchsucht oder kontrolliert werden knnen.The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner.Export<Typographisch korrekte AusgabeTypographically correct outputExportBNutzt <p>-Tags fr Zitate in HTMLUse tags for quotes in HTMLExport(Verwende ATX-HeadersUse ATX-style headersExportfVerwende Referenz-Verweise, anstatt Inline-Verweise1Use reference-style links instead of inline linksExporteine funktionierende LaTex-Installation. Siehe Systemvorausetzungen fr Pandoc: <a href="http://pandoc.org/installing.html">http://pandoc.org/installing.html</a>. Wenn Unicode untersttzt werden soll, wird xelatex bentigt.a valid LaTeX installation. Pandoc recommendations can be found on: pandoc.org/installing.html. If you want Unicode support, you need XeLaTeX.ExportreStructuredText ist eine leichtgewichtige Auszeichnungssprache.2reStructuredText is a lightweight markup language.ExportDurchsuchen ......ExportersManagerBeschreibung DescriptionExportersManager ExportverwaltungManage ExportersExportersManagerManuskript ManuskriptExportersManager Exportieren nachOffers export toExportersManager Pfad:Path:ExportersManager StatusStatusExportersManagerStatus:Status:ExportersManagerVersion:Version:ExportersManager{Hilfetext} {HelpText}ExportersManagerAnalysierenAnalyzeFrequencyAnalyzer`Wrter ausschlieen: <br>(Trennung durch Komma): Exclude words (comma separated):FrequencyAnalyzer$HufigkeitsanalyseFrequency AnalyzerFrequencyAnalyzer"Mindestwortlnge: Minimum size:FrequencyAnalyzer,Anzahl der Wrter: VonNumber of words: fromFrequencyAnalyzer,Hufigkeit von PhrasenPhrase frequencyFrequencyAnalyzerEinstellungenSettingsFrequencyAnalyzerWorthufigkeitWord frequencyFrequencyAnalyzerbistoFrequencyAnalyzerf<b>Info:</b> Ein sehr einfacher Parser, der ein Markdown-Dokument durchluft und fr jeden Titel eigene Eintrge anlegt.<br/>&nbsp;Info: A very simple parser that will go through a markdown document and create items for each titles.
 Import<b>Info:</b> Manuskript kann <b>Markdown</b> oder <b>OPML</b> importieren. Pandoc konvertiert Ihr Dokument in das jeweilige Format, bevor Manuskript es importiert. Das Ergebnis hngt von der Art Ihres Dokuments ab. <br/>&nbsp;}Info: Manuskript can import from markdown or OPML. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document.
 Import<p><b>Info:</b> Importiert eine ganze Verzeichnisstruktur. Ordner werden als Ordner hinzugefgt, und Reintext-Dokumente (Sie whlen welche, entsprechend der Erweiterung) werden als Szene hinzugefgt.</p> <p>Es werden nur Textdateien untersttzt (keine Bilder, Binrdateien oder andere).</p>R

Info: Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.

Only text files are supported (not images, binary or others).

Importj<p>Soll pandoc jede einzelne Zeile umbrechen?</p><p> <b>auto</b>: bricht nach 72 Zeichen um.<br> <b>none</b>: keine Zeilenumbrche.<br> <b>preserve</b>: versucht, Umbrche aus dem Originaldokument zu erhalten.</p>Q

Should pandoc create cosmetic / non-semantic line-breaks?

auto: wraps at 72 characters.
none: no line wrap.
preserve: tries to preserves line wrap from the original document.

Import*Komma-getrennte WerteComma separated valuesImport>ffnen der Datei fehlgeschlagenFile open failed.ImportOrdnerimport Folder importImportNErst Ordner, danach Dateien importierenImport folder then filesImport0Hinweis importieren als:Import tip as:Import Importieren mit: Import using:ImportZNur diese Dateinamenerweiterungen hinzufgen:Include only those extensions:ImportMarkdown-ImportMarkdown importImport(Mind Map importierenMind Map ImportImport(Mind Map importierenMind Map importImport OPML importieren OPML ImportImport$Pandoc importieren Pandoc importImport:Elemente nach Namen sortierenSort items by nameImportdDies scheint keine gltige Mind Map-Datei zu sein.1This does not appear to be a valid Mind Map file.Import\Dies scheint keine gltige OPML-Datei zu sein.-This does not appear to be a valid OPML file.ImportOhne TitelUntitledImportZeilenumbruch: Wrap lines:Import"Referenz einfgenInsert referenceMDEditCompleter (~{} Seiten) (~{} pages) MainWindown * {} konnte in der Projektdatei nicht gefunden werden.# * {} wasn't found in project file. MainWindow &ber&About MainWindow &Fett&Bold MainWindow&Spickzettel &Cheat sheet MainWindow$&Projekt schlieen&Close project MainWindow$&Kommentarzeile(n)&Comment line(s) MainWindow&Kopieren&Copy MainWindow&Lschen&Delete MainWindow&Bearbeiten&Edit MainWindow"&Fiktionaler Text&Fiction MainWindow &Datei&File MainWindow&Formatieren&Format MainWindow&&Hufigkeitsanalyse&Frequency Analyzer MainWindow &Hilfe&Help MainWindow&Importieren & &Import… MainWindow&Kursiv&Italic MainWindow&Labels... &Labels... MainWindow"&Level 1 (setext)&Level 1 (setext) MainWindow &Modus&Mode MainWindow&Nach oben&Move Up MainWindow&Navigation &Navigation MainWindow&ffnen&Open MainWindow Ge&ordnete Liste &Ordered list MainWindow&Einfgen&Paste MainWindow&Schlieen&Quit MainWindow$&Zuletzt verwendet&Recent MainWindow&Umbenennen&Rename MainWindow&Speichern&Save MainWindow &Zeige Hilfetext&Show help texts MainWindow&Einfach&Simple MainWindow(&Rechtschreibprfung &Spellcheck MainWindow&Aufteilen & &Split… MainWindow&Status ... &Status... MainWindow&Werkzeuge&Tools MainWindow$&Ungeordnete Liste&Unordered list MainWindow&Ansicht&View MainWindow<html><head/><body><p align="right">Handlung aus Sicht<br/>des Charakters<br/>in einem Absatz</p></body></html>O

One paragraph
summary

 MainWindow<html><head/><body><p align="right">Handlung aus Sicht<br/>des Charakters<br/>in einem Satz</p></body></html>N

One sentence
summary

 MainWindowber ManuskriptAbout Manuskript MainWindowPFge Handlungsschritt hinzu (Strg+Enter) Add plot step MainWindow AutorAuthor MainWindowHintergrund Background MainWindow HintergrundfarbeBackground color MainWindow$Basisinformationen Basic info MainWindow"BuchinformationenBook information MainWindow&Buchzusammenfassung Book summary MainWindow RahmenBorder MainWindowErbaue Welten. Erstelle Hierachien breitgefchterter Kategorien, bis hin zu spezifischen Details.MBuild worlds. Create hierarchy of broad categories down to specific details. MainWindowA&usschneidenC&ut MainWindowCharakter(e) Character(s) MainWindowCharaktere Characters MainWindowKo&mmentarblockCo&mment block MainWindowKo&mpilierenCo&mpile MainWindowKompiliereCompile MainWindowKonfliktConflict MainWindowEckeCorner MainWindowbArbeiten Sie die Struktur Ihres Meisterwerks aus.'Create the outline of your masterpiece. MainWindow>Erschaffen Sie Ihre Charaktere.Create your characters. MainWindow Strg++Ctrl++ MainWindow Strg+-Ctrl+- MainWindow Strg+0Ctrl+0 MainWindow Strg+1Ctrl+1 MainWindow Strg+2Ctrl+2 MainWindow Strg+3Ctrl+3 MainWindow Strg+4Ctrl+4 MainWindow Ctrl+5Ctrl+5 MainWindow Strg+6Ctrl+6 MainWindowStrg+Alt+1 Ctrl+Alt+1 MainWindowStrg+Alt+2 Ctrl+Alt+2 MainWindow Strg+BCtrl+B MainWindow Strg+CCtrl+C MainWindow Strg+DCtrl+D MainWindow Strg+ICtrl+I MainWindow Strg+KCtrl+K MainWindow Strg+MCtrl+M MainWindow Strg+OCtrl+O MainWindow Strg+QCtrl+Q MainWindow Strg+SCtrl+S MainWindowStrg+Shift+B Ctrl+Shift+B MainWindowStrg+Umschalt+C Ctrl+Shift+C MainWindow*Strg+Umschalt+AbwrtsCtrl+Shift+Down MainWindowStrg+Umschalt+K Ctrl+Shift+K MainWindowStrg+Shift+S Ctrl+Shift+S MainWindow>Strg ' Umschalttaste ' Aufwrts Ctrl+Shift+Up MainWindow Strg+VCtrl+V MainWindow Strg+XCtrl+X MainWindow DebugDebug MainWindowNDebuginformationen. Manchmal hilfreich.Debug info. Sometimes useful. MainWindowLschenDel MainWindowBeschreibung Description MainWindowDetails Detailed info MainWindow6Entwickle Handlungsstrnge.Develop plots. MainWindowWrterbuch Dictionary MainWindowDupl&izieren Dupl&icate MainWindow TextverarbeitungEditor MainWindow EmailEmail MainWindow\Gib Informationen ber dein Buch und dich ein.0Enter information about your book, and yourself. MainWindowSchicksalEpiphany MainWindowErweitern Sie jeden Satz Ihrer Ein-Absatz-Zusammenfassung zu einem eigenen AbsatzAExpand each sentence of your one paragraph summary to a paragraph MainWindowF2F2 MainWindowF6F6 MainWindowF7F7 MainWindowF8F8 MainWindowF9F9 MainWindow FilterFilter MainWindowProjektdatenFlatData MainWindowAusfhrlichFull MainWindow8Ausfhrliche Zusammenfassung Full summary MainWindowAllgemeinGeneral MainWindow GenreGenre MainWindowZielGoal MainWindowIconIcon MainWindowIconfarbe Icon color MainWindowBedeutung Importance MainWindowKarteikarten Index cards MainWindowL&evel 2L&evel 2 MainWindow LabelLabel MainWindow LabelsLabels MainWindowLevel &1 (atx)Level &1 (atx) MainWindowLevel &2Level &2 MainWindowLevel &3Level &3 MainWindowLevel &4Level &4 MainWindowLevel &5Level &5 MainWindowLevel &6Level &6 MainWindow LizenzLicense MainWindowZusamm&enfhrenM&erge MainWindowN&ach unten M&ove Down MainWindowManuskript Manuskript MainWindowMetadatenMetadata MainWindowMehrMore MainWindowMotivation Motivation MainWindowNameName MainWindow NamenNames MainWindow WeiterNext MainWindowNotizenNotes MainWindow KeineNothing MainWindowEine SeiteOne page MainWindow>Zusammenfassung auf einer SeiteOne page summary MainWindowEin Absatz One paragraph MainWindow>Zusammenfassung in einem AbsatzOne paragraph summary MainWindowEin Satz One sentence MainWindow:Zusammenfassung in einem SatzOne sentence summary MainWindowVerwal&ten Organi&ze MainWindowStrukturOutline MainWindowPerspektivePOV MainWindowCharakterePersos MainWindowHandlungsstrangPlot MainWindow HandlungsstrngePlots MainWindow@Wird mit leeren Daten aufgeflltPopulates with empty data MainWindowFortschrittProgress MainWindowProjektbaum Project tree MainWindowZProjekt {} wurde mit einigen Fehlern geladen.#Project {} loaded with some errors. MainWindowNProjekt {} mit einigen Fehlern geladen:#Project {} loaded with some errors: MainWindow&Projekt {} geladen.Project {} loaded. MainWindow.Projekt {} gespeichert.Project {} saved. MainWindowJAusgewhlte Plot-Schritt(e) entfernenRemove selected plot step(s) MainWindowLsungsschritteResolution steps MainWindow LsungResult MainWindowE&instellungen S&ettings MainWindow$Sp&eichern als ... Sa&ve as... MainWindow Su&cheSea&rch MainWindow SerieSeries MainWindowSituation: Situation: MainWindow(Quelle des KonfliktsSource of conflict MainWindow.Quelle der LeidenschaftSource of passion MainWindow.Am Mauszeiger aufteilenSp&lit at cursor MainWindowHandlung Story line MainWindowUntertitelSubtitle MainWindowZusammenfassungSummary MainWindow Zusammenfassung:Summary: MainWindowNehmen Sie sich Zeit, sich einen Satz auszudenken (~15 Wrter), der Ihr Buch zusammenfasst. Dann erweitern Sie ihn zu einem Absatz, dann zu einer ganzen Seite und abschlieend zu einer ausfhrlichen Zusammenfassung.Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. MainWindowTextText MainWindowTextfarbe Text color MainWindowDie Ausgangssituation, in Form von 'Was wre wenn ...?" Fragen. Beispiel: "Was wre wenn der gefhrlichste bse Zauberer nicht einmal ein Baby tten knnte?" (Harry Potter)The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) MainWindowDie Datei {} existiert nicht. Wurde sie verschoben oder gelscht?9The file {} does not exist. Has it been moved or deleted? MainWindow TitelTitle MainWindowBaumTree MainWindowBandVolume MainWindowLWARNUNG: Projekt {} nicht gespeichert.WARNING: Project {} not saved. MainWindow$Was wre wenn ...? What if...? MainWindowWrter: {}{} Words: {}{} MainWindowWeltWorld MainWindowSchreibe.Write. MainWindow pt pxSettings%%Settings&Neuer Stile &New styleSettings&Nichts&NothingSettings1,5 Zeilen 1.5 linesSettings<html><head/><body><p>Wenn diese Option ausgewhlt wurde, wird das Projekt in einer einzigen Datei gespeichert. Es ist leichter zu kopieren oder zu sichern, aber nicht fr gemeinsame Bearbeitung oder Versionierung geeignet.<br/>Wenn diese Option nicht ausgewhlt wurde, wird das Projekt in vielen kleinen einzelnen Dateien gespeichert.</p></body></html>

If you check this option, your project will be save as one single file. Easier to copy or backup, but does not allow collaborative editing, or versionning.
If this is unchecked, your project will be save as a folder containing many small files.

SettingsAusrichtung AlignmentSettingsAusrichtung: Alignment:Settings$BenutzeroberflcheApplication settingsSettingsAnwendenApplySettingsZLd automatisch das letzte Projekt beim Start*Automatically load last project on startupSettings4Speichert automatisch alleAutomatically save everySettingsHintergrund BackgroundSettings"Hintergrundfarbe:Background color:SettingsHintergrund: Background:SettingsRahmenfarbe: Border color:SettingsAbbrechenCancelSettingsZentriertCenterSettingsZentriertCenteredSettings Farbe:Color:Settings FarbenColorsSettingsKompilierenCompileSettingsEckenfarbe: Corner color:SettingsEckrundung:Corner radius:Settings Strg+SCtrl+SSettings ZeigerCursorSettingsLschenDeleteSettingsBlinken AusDisable blinkingSettingsDoppeltDoubleSettings ndernEditSettingsSchriftart:Family:Settings OrdnerFoldersSettingsSchriftFontSettingsSchriftgre: Font size:SettingsSchrift:Font:SettingsVollbildmodus FullscreenSettingsAllgemeinGeneralSettings0Allgemeine EinstellungenGeneral settingsSettingsZielGoalSettingsIcongre Icon SizeSettingsIconfarbe: Icon color:Settings^Speichert, wenn keine nderungen in den letztenIf no changes duringSettings Bild:Image:Settings.Einzug der ersten ZeileIndent 1st lineSettingsKarteikarten Index cardsSettings Farben Item colorsSettingsBlocksatzJustifySettings,Revisionen aufbewahrenKeep revisionsSettingsBehalte:Keep:Settings LabelLabelSettings LabelsLabelsSettingsSprache: Language:Settings LinksLeftSettings,Abstnde Rechts/Links:Left/Right margins:Settings ZeileLineSettingsZeilenabstand: Line spacing:Settings LadenLoadingSettingsAuenabstnde:Margins:SettingsMax. Breite Max widthSettings(Rechtschreibprfung: Misspelled:SettingsNeuNewSettingsKein BildNo ImageSettings NichtsNoneSettings KeineNothingSettingsAlter St&il Old st&yleSettingsDeckkraft:Opacity:SettingsReibrettOutlineSettingsPOVPOVSettingsInnenabstnde:Padding:Settings Absatz ParagraphSettingsAbsatzoptionenParagraph OptionsSettingsAbstze ParagraphsSettingsProzentsatz PercentageSettingsPosition: Position:SettingsFortschrittProgressSettingsProportional ProportionalSettingsWenn Sie Manuskript neu starten, werden alle Einstellungen wirksam.7Restarting Manuskript ensures all settings take effect.Settings<Standardwerte wiederherstellenRestore defaultsSettingsRevisionen RevisionsSettingsRevisionen sind ein Weg, um die Bearbeitung zu dokumentieren. Fr jedes Element werden die nderungen im Haupttext nachgehalten und erlauben es, sich diese anzusehen oder alte Versionen wiederherzustellen.Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions.Settings RechtsRightSettings(Fortschritt anzeigenS&how progressSettings&Archivierung S&mart removeSettings0Speichert beim Schlieen Save on quitSettings0In einer Datei speichernSave to one single fileSettingsSpeichernSavingSettingsSkaliertScaledSettingsSatzSentenceSettingsEinstellungenSettingsSettings6Anzahl der &Wrter anzeigenShow &word countSettingsBZeige Anzahl enthaltener &DateienShow ite&m countSettings*Fo&rtschritt anzeigenShow p&rogressSettings2&Zusammenfassung anzeigen Show summar&ySettings&Zeige Inhaltsangabe Show summarySettingsEinfachSingleSettings Gre:Size:SettingsDie Archivierung erlaubt es, nur eine geringe Anzahl von Revisionen vorzuhalten. Es wird ausdrcklich empfohlen, sie zu nutzen, damit das Projekt nicht mit tausenden von unwichtigen nderungen gefllt wird.Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes.SettingsAbstand:Spacing:Settings StatusStatusSettingsGestreckt StretchedSettingsStilStyleSettings Stil:Style:SettingsTabulator: Tab width:SettingsTextTextSettingsTexthintergrundText BackgroundSettingsTextoptionen Text OptionsSettingsTextfeld Text areaSettingsTextfarbe: Text color:SettingsTexteditor Text editorSettings Textbeschriftung TextLabelSettingsThemenname: Theme name:SettingsGekacheltTiledSettings TitelTitleSettings(Abstnde Oben/Unten:Top/Bottom margins:SettingsTransparent TransparentSettingsBaumTreeSettingsTyp:Type:Settings,Schreibmaschinen ModusTypewriter modeSettings4Nutze Absatzeinrckung vonUse block insertion ofSettingsAnsichtenViewsSettings.Ansicht - EinstellungenViews settingsSettings"Sichtbare SpaltenVisible columnsSettingsBreite:Width:Settings$FensterhintergrundWindow BackgroundSettingsWortanzahl Word countSettingsZoomZoomedSettingsMinuten.minutes.Settings^Revisionen pro 10 Minuten in der letzten Stunde*revisions per 10 minutes for the last hourSettingsFRevisionen pro Tag im letzten Monat$revisions per day for the last monthSettingsHRevisionen pro Stunde am letzten Tag#revisions per hour for the last daySettings^Revisionen pro Minute in den letzten 10 Minuten,revisions per minute for the last 10 minutesSettings(Revisionen pro Woche'revisions per week till the end of timeSettingsSekunden.seconds.Settings4Zum Wrterbuch &hinzufgen&Add to dictionary SpellAction:Aus dem Wrterbuch &entfernen&Remove from custom dictionary SpellAction&KorrekturvorschlgeSpelling Suggestions SpellActionber ManuskriptAbout ManuskriptaboutManuskript Manuskriptabout<Verwendete Software-Versionen:Software Versions in Use: aboutDialogVersionVersion aboutDialogKompilierenCompile abstractModelZielGoal abstractModelKategorieLabel abstractModelPOVPOV abstractModel StatusStatus abstractModel TitelTitle abstractModelWortanzahl Word count abstractModel2Geladene bersetzung: {}.Loaded translation from {}: {}.applNotiz: Keine bersetzung fr {} gefunden oder geladen.:Note: No translator found or loaded from {} for locale {}.appDZusammenfassung in wenigen Stzen:Few sentences summary: basicItemViewFormularForm basicItemView Ziel:Goal: basicItemView:Zusammenfassung in einem SatzOne line summary basicItemViewPOV:POV: basicItemViewWortanzahl Word count basicItemViewNameNamecharacterModelNeuer Charakter New charactercharacterModelWertValuecharacterModel PrimrMaincharacterTreeViewNebenschlichMinorcharacterTreeViewSekundr SecondarycharacterTreeViewCharaktere Characters cheatSheetFilter (Tippe die Bezeichnung von irgendwas aus dem Projekt ein)2Filter (type the name of anything in your project) cheatSheetFormularForm cheatSheet PrimrMain cheatSheetNebenschlichMinor cheatSheet HandlungsstrngePlots cheatSheetSekundr Secondary cheatSheet TexteTexts cheatSheetWeltWorld cheatSheet PrimrMaincmbOutlineCharacterChoserNebenschlichMinorcmbOutlineCharacterChoser NichtsNonecmbOutlineCharacterChoserSekundr SecondarycmbOutlineCharacterChoserVerschiedeneVariouscmbOutlineCharacterChoserVerschiedeneVariouscmbOutlineLabelChoserVerschiedeneVariouscmbOutlineStatusChoser2Dock Widgets-SymbolleisteDock Widgets ToolbarcollapsibleDockWidgetsFormularForm completer8Vollstndige Zusammenfassung Full summary corkDelegate6Inhaltsangabe in einem SatzOne line summary corkDelegateFormularFormeditorWidget_uiExportierenExportexporterAusgabe in: Export to:exporterSpeicherortManage exportersexporterVorschauPreviewexporterEinstellungenSettingsexporter:{} (noch nicht implimentiert){} (not implemented yet)exporterDialog<html><head/><body><p>Filtert, welche Objekte beim finalen Export mit einbezogen werden sollen.<br/><span style=" color:#773333;">(Noch nicht vollstndig implimentiert.)</span></p></body></html>

Filters what items will be included in the final export.
(Not fully implemented yet.)

exporterSettings2Zwischen Ordner und Text:Between folder and text:exporterSettings"Zwischen Ordnern:Between folders:exporterSettings2Zwischen Text und Ordner:Between text and folder:exporterSettings Zwischen Texten:Between texts:exporterSettings InhaltContentexporterSettings"BenutzerdefiniertCustomexporterSettings:Benutzerdefiniertes Ersetzen:Custom replacements:exporterSettingslEntscheide, was im finalen Export enthalten sein soll.6Decide here what will be included in the final export.exporterSettingsLeere Zeile Empty lineexporterSettings AktivEnabledexporterSettingsFi&lterFi<ersexporterSettings OrdnerFolderexporterSettingsSchriftFontexporterSettingsSchriftgre: Font size:exporterSettingsSchrift:Font:exporterSettingsFormularFormexporterSettings:Ich brauche mehr GranularittI need more granularityexporterSettingsWenn aktiv, werden Regulre Ausdrcke fr das Ersetzen genutzt. Wenn nicht aktiv, wird einfacher Text ersetzt.ZIf checked, uses regular expression for replacement. If unchecked, replaced as plain text.exporterSettingsvIgnoriere den Compile-Status (Bezieht alle Objekte mit ein))Ignore compile status (include all items)exporterSettings LabelsLabelsexporterSettingsVorschauPreviewexporterSettings RegExpRegExpexporterSettings<Entferne mehrfache LeerzeichenRemove multiple spacesexporterSettingsErsetzeReplaceexporterSettings(--- ersetzen durch Replace --- with —exporterSettings(... ersetzen durch &Replace ... with …exporterSettings\Doppelte Anfhrungszeichen (") ersetzen durch:Replace double quotes (") with:exporterSettings\Einfache Anfhrungszeichen (') ersetzen durch:Replace single quotes (') with:exporterSettingsTrennzeichen SeparationsexporterSettings StatusStatusexporterSettings"Alle Objekte von: Subitems of:exporterSettingsTextTextexporterSettings TitelTitleexporterSettings&Suchen und ErsetzenTransformationsexporterSettingsTypTypeexporterSettings0Typografisches Ersetzen:Typographic replacements:exporterSettings durchWithexporterSettings"{}Level {} Ordner{}Level {} folderexporterSettings{}Level {} Text{}Level {} textexporterSettings*<b>Voraussetzung</b> Requires: exportersManagerB<b>Status:</b> Nicht installiert.Status: uninstalled.exportersManager"BenutzerdefiniertCustomexportersManagerInstalliert InstalledexportersManagerNicht gefunden Not foundexportersManager6Setze {} ausfhrbaren Pfad.Set {} executable path.exportersManager{} nicht gefunden. Installiere es oder gib den Pfad manuell ein./{} not found. Install it, or set path manually.exportersManagerHufigkeit FrequencyfrequencyAnalyzerPhrasenPhrasesfrequencyAnalyzerWortWordfrequencyAnalyzerUhrClockfullScreenEditorNavigation NavigationfullScreenEditorNeuer TextNew TextfullScreenEditorFortschrittProgressfullScreenEditor&Rechtschreibprfung SpellcheckfullScreenEditor Thema:Theme:fullScreenEditor TitelTitlefullScreenEditorBTitel: Zeige kompletten DateipfadTitle: Show Full PathfullScreenEditorWortanzahl Word countfullScreenEditor{} Wrter{} wordsfullScreenEditor{} Wrter / {} {} words / {}fullScreenEditorAllgemeinGeneralgeneralSettingsTIn einen bergeordneten Ordner importierenImport in a top-level foldergeneralSettings$Importieren unter: Import under:generalSettings*Szenen aufteilen bei:Split scenes at:generalSettingsDLange Titel trimmen (> 32 Zeichen)Trim long titles (> 32 chars)generalSettings\n---\n\n---\ngeneralSettingsWenn du mich nicht sehen willst, kannst du mich ber das Hilfemen verschwinden lassen.8If you don't wanna see me, you can hide me in Help menu. helpLabelDatei whlen Choose fileimporterDatei leeren Clear fileimporterFormat:Format:importerImportierenImportimporterVorschauPreviewimporterEinstellungenSettingsimporterVerschiedenesVarious lineEditView Minuten minuteslocker Wrter wordslockerFormularFormlockerSperren!Lock !locker Sperrbildschirm: Lock screen:lockerZeitziel Time targetlockerWortziel Word targetlocker{} verbleibend {} remaininglocker {} s.{} s.locker({} Wrter verbleiben{} words remaininglocker{}:{}locker ~{} h.~{} h.locker ~{} m.~{} mn.lockerAlt+Nach obenAlt+Up mainEditorF11F11 mainEditorFormularForm mainEditor>Gehe zum bergeordneten ElementGo to parent item mainEditorKarteikarten Index cards mainEditorReibrettOutline mainEditor StammRoot mainEditorTextText mainEditor{} Wrter  {} words  mainEditor{} Wrter / {} {} words / {}  mainEditorMarkdownMarkdownmarkdownSettingsFormularForm metadataView4Vollstndige Inhaltsangabe Full summary metadataView(Notizen / ReferenzenNotes / References metadataView6Inhaltsangabe in einem SatzOne line summary metadataViewEinstellungen Properties metadataViewRevisionen Revisions metadataViewInhaltsangabeSummary metadataView0Automatisches Ausblenden Auto-hidemyPanel&Kopieren&Copy outlineBasics&Lschen&Delete outlineBasics&Einfgen&Paste outlineBasics&Umbenennen&Rename outlineBasicsr<p><b>Mchten Sie wirklich {} Element(e) lschen?</b></p>D

You're about to delete {} item(s).

Are you sure?

 outlineBasics:Im Begriff, dies zu entfernenAbout to remove outlineBasicsAlle Elemente mssen sich auf der gleichen Ebene befinden (teilen sich die gleiche bergeordnete Ebene).<b>Unbekannte Referenz:</b> {}.Unknown reference: {}. references"Baisinformationen Basic info references&Charakter:<b>{}</b>Character: {} referencesCharaktere Characters referencesKonfliktConflict referencesBeschreibung Description references2Detailierte Informationen Detailed info referencesSchicksalEpiphany references Ordner:<b>{}</b>Folder: {} referencesGehe zu {}. Go to {}. referencesZielGoal references Label:Label: references6Ausfhrliche Inhaltsangabe: Long summary: references*Lange ZusammenfassungLonger summary referencesMotivation Motivation references&Keine Referenz: {}.Not a reference: {}. referencesNotizen:Notes: referencesPOV von:POV of: referencesPOV:POV: referencesLeidenschaftPassion references Pfad:Path: referencesPlot:<b>{}</b>Plot: {} references Referenziert in:Referenced in: referencesLsungsschritteResolution steps referencesErgebnisResult references&Kurzzusammenfassung Short summary references$Kurzinhaltsangabe:Short summary: referencesStatus:Stats: referencesStatus:Status: referencesText:<b>{}</b>Text: {} references0Unbekannte Referenz: {}.Unknown reference: {}. references0Welt:<b>{name}</b>{path}World: {name}{path} references1 Tag zuvor 1 day ago revisions Leeren Clear all revisionsLschenDelete revisionsFormularForm revisionsZeile {}:Line {}: revisionsOptionenOptions revisions WiederherstellenRestore revisions.Zeige vorherige VersionShow ancient version revisions(Zeige ModifikationenShow modifications revisions8Zeige nur die ModifikationenShow modifications only revisions"Zeige Leerzeichen Show spaces revisions{} Tage zuvor {} days ago revisions {} Stunden zuvor {} hours ago revisions {} Minuten zuvor{} minutes ago revisions{} Monate zuvor {} months ago revisions"{} Sekunden zuvor{} seconds ago revisions{} Jahre zuvor {} years ago revisions AllesAllsearchJGro-/Kleinschreibung bercksichtigenCase sensitivesearchFormularFormsearchBeschriftungLabelsearchNotizenNotessearchOptionen:Options:searchPerspektivePOVsearchSuche nach ... Search for...searchSuche in: Search in:search StatusStatussearchZusammenfassungSummarysearchTextTextsearch TitelTitlesearch& (schreibgeschtzt) (read-only)settingsWindow FehlerErrorsettingsWindow"Neue Beschriftung New labelsettingsWindowNeuer Status New statussettingsWindowNeues Thema New themesettingsWindowNeues ThemanewthemesettingsWindowFormularForm sldImportance PrimrMain sldImportanceNebenschlichMinor sldImportanceSekundr Secondary sldImportanceTextlabel TextLabel sldImportanceT <p>Ausgewhlte(s) Element(e) an der angegebenen Markierung aufteilen</p> <p>Wenn eines der ausgewhlten Elemente ein Ordner ist, wird es rekursiv auf <i>alle</i> untergeordneten Elemente bertragen.</p> <p>Die Trennmarkierung kann folgende Escape-Sequenzen enthalten: <ul> <li><b><code>\n</code></b>: Zeilenumbruch</li> <li><b><code>\t</code></b>: Tab</li> </ul> </p> <p><b>Markierung:</b></p> 

Split selected item(s) at the given mark.

If one of the selected item is a folder, it will be applied recursively to all of it's children items.

The split mark can contain following escape sequences:

  • \n: line break
  • \t: tab

Mark:

 splitDialog {}  aufteilen Split '{}' splitDialog$Elemente aufteilen Split items splitDialogFormularForm storylineView Zeige CharaktereShow Characters storylineView,Zeige Handlungsstrnge Show Plots storylineViewTeilung beenden Close split tabSplitterVffne markierte Elemente in dieser Ansicht.!Open selected items in that view. tabSplitter2Ansicht horizontal teilenSplit horizontally tabSplitter.Ansicht vertikal teilenSplit vertically tabSplitterVerschiedenesVarious textEditView Strg+BCTRL+B textFormat Strg+ECTRL+E textFormat Strg+ICTRL+I textFormat Strg+JCTRL+J textFormat Strg+LCTRL+L textFormat Strg+PCTRL+P textFormat Strg+RCTRL+R textFormat Strg+UCTRL+U textFormatFormularForm textFormat Alles einklappen Collapse AlltreeView{} einklappen Collapse {}treeView Alles ausklappen Expand AlltreeView{} ausklappen Expand {}treeView11welcomeL<b>Gesamt:</b> {} Wrter (~ {} Seiten)#Total: {} words (~ {} pages)welcome Ebene hinzufgen Add levelwelcome$Wortziel festlegenAdd word countwelcomeBuchBookwelcomeKapitelChapterwelcomeErstellenCreatewelcome*Erzeuge neues ProjektCreate New ProjectwelcomeDemo Projekte Demo projectswelcomeLeerEmptywelcome Leere Geschichte Empty fictionwelcomeLeeres SachbuchEmpty non-fictionwelcomeGeschichteFictionwelcomeEndgltigFinalwelcomeErster Entwurf First draftwelcomeFormularFormwelcomeIdeeIdeawelcomeManuskript Manuskriptwelcome4Manuskript Projekt (*.msk)Manuskript project (*.msk)welcomeXManuskript Projekt (*.msk);;Alle Dateien (*))Manuskript project (*.msk);;All files (*)welcomerBeim nchsten Start automatisch das letzte Projekt ffnen*Next time, automatically open last projectwelcomeSachtext Non-fictionwelcome NotizNotewelcome RomanNovelwelcomeNovelleNovellawelcomeffne Projekt Open projectwelcomeffnen ...Open...welcomeNExistierendes Projekt {} berschreiben?Overwrite existing project {} ?welcome8Zuletzt verwendete DokumenteRecentwelcomeRechercheResearchwelcome"ForschungsberichtResearch paperwelcome"Speichern als ...Save project as...welcome SzeneScenewelcomeZweiter Entwurf Second draftwelcome AbsatzSectionwelcomeKurzgeschichte Short StorywelcomeIrgendwas SomethingwelcomeToDoTODOwelcomeVorlage TemplateswelcomeTextTextwelcomeTriologieTrilogywelcomeWarnungWarningwelcomevonofwelcomeWrter. words each.welcomeArchitektur Architecture worldModelAstronomie Astronomy worldModelKrperspracheBodily language worldModelZeitrechnungCalendar worldModel KlimaClimate worldModelBalzverhalten Courtship worldModel KulturCultural worldModelBrucheCustoms worldModelDemographie Demography worldModelKrankheitenDiseases worldModelKleidungDresses worldModelErziehung Education worldModel EthikEthics worldModel,Bau einer Fantasy-WeltFantasy world building worldModel FloraFlora worldModel EssenFood worldModel$Geschlichterrollen Gender roles worldModelRegierung Government worldModelGeschichteHistory worldModel Wichtige ObjekteImportant objects worldModelWichtige OrteImportant places worldModelSprachen Languages worldModelMagiesystem Magic system worldModel Magische ObjekteMagical objects worldModelMagische OrteMagical places worldModelMagische Wesen Magical races worldModelMedizinMedicine worldModelMilitrMilitary worldModelMusik und KunstMusic and arts worldModelNeues ElementNew item worldModelOrganisation Organization worldModelGeographiePhysical worldModelPolitikPolitics worldModel ArtenRaces worldModelReligionReligion worldModel RegelnRules worldModelWissenschaftScience worldModelTechnologie Technology worldModel Relief Topography worldModelTransportmittelTransportation worldModel Fauna Wild life worldModelmanuskript-0.10.0/i18n/manuskript_de.ts000066400000000000000000005513041354442177200200020ustar00rootroot00000000000000 Export Basic HTML output using the Python module 'markdown'. Einfacher HTML-Export mit dem Python-Modul „markdown“. Python module 'markdown'. Python-Modul „markdown“. Markdown source Markdown-Quelle HTML Source HTML-Quelle HTML Output HTML-Ausgabe Default exporter, provides basic formats used by other exporters. Standardexport: Bietet Basis-Formate, die von anderen Exports genutzt werden. Preview with highlighter. Vorschau mit Hervorhebung. Plain text Einfacher Text A little known format modestly used. You know, web sites for example. Ein kaum bekanntes Format wird verwendet. Du weißt schon, für Webseiten und so. Needs LaTeX to be installed. LaTeX muss installiert sein. Error Fehler Standalone document (not just a fragment) Eigenständiges Dokument (nicht nur ein Fragment) Include a table of contents. Erzeuge ein Inhaltsverzeichnis. Number of sections level to include in TOC: Anzahl der Ebenen im Inhaltsverzeichnis: Typographically correct output Typographisch korrekte Ausgabe Normalize the document (cleaner) Automatische Bereinigung des Dokuments Specify the base level for headers: Lege die Basisebene für Überschriften fest: Use reference-style links instead of inline links Verwende Referenz-Verweise, anstatt Inline-Verweise Use ATX-style headers Verwende ATX-Headers Self-contained HTML files, with no dependencies Eigenständige HTML-Dateien, ohne Abhängigkeiten Use <q> tags for quotes in HTML Nutzt <p>-Tags für Zitate in HTML LaTeX engine used to produce the PDF. LaTeX-Engine wird für Erzeugung des PDFs genutzt. Paper size: Seitengröße: Font size: Schriftgröße: Class: Klasse: Line spacing: Zeilenabstand: Books that don't kill trees. Bücher, für die keine Bäume sterben mussten. OpenDocument format. Used by LibreOffice for example. OpenDocument-Format. Wird beispielsweise von LibreOffice genutzt. Microsoft Office (.docx) document. Microsoft Office-Dokument (.docx). reStructuredText is a lightweight markup language. reStructuredText ist eine leichtgewichtige Auszeichnungssprache. Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. Ähnlich Plaintext, erlaubt aber Hervorhebungen für Titel Setzt voraus, dass Texte bereits in Markdown formatiert sind. Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. Einfacher Export in Plaintext. Erlaubt die Benutzung von Markups, die von Manuskript nicht interpretiert werden können, wie zum Beispiel <a href='www.fountain.io'>Fountain</a>. <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> <p>Ein universaler Dokumenten-Konverter. Kann zur Konvertierung von Markup in eine Reihe von anderen Formaten genutzt werden.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. eine funktionierende LaTex-Installation. Siehe Systemvorausetzungen für Pandoc: <a href="http://pandoc.org/installing.html">http://pandoc.org/installing.html</a>. Wenn Unicode unterstützt werden soll, wird xelatex benötigt. Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. Exportiert nach Markdown via pandoc. Erlaubt mehr Formatierungen als der Basis-Manuskript-Export. LaTeX is a word processor and document markup language used to create beautiful documents. LaTeX ist Textsatzprogramm und Markup-Language zur Erstellung wunderschöner Dokumente. The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. Dieses Format dient zum Austausch von Informationen zwischen Outlinern und Internetservices, die von Outlinern durchsucht oder kontrolliert werden können. Disable YAML metadata block. Use that if you get YAML related error. Entfernt den YAML-Metadaten-Block. Nutze das, wenn du YAML-Errors bekommst. Convert to ePUB3 Konvertierung nach ePUB3 Could not process regular expression: {} Fehler bei der Verarbeitung eines regulären Ausdruckes: {} Choose output file… Ausgabe-Datei wählen… ExportersManager Manage Exporters Exportverwaltung Manuskript Manuskript Description Beschreibung Offers export to Exportieren nach Status Status Status: Status: Version: Version: Path: Pfad: ... Durchsuchen ... {HelpText} {Hilfetext} FrequencyAnalyzer Frequency Analyzer Häufigkeitsanalyse Word frequency Worthäufigkeit Settings Einstellungen Minimum size: Mindestwortlänge: Exclude words (comma separated): Wörter ausschließen: <br>(Trennung durch Komma): Analyze Analysieren Phrase frequency Häufigkeit von Phrasen Number of words: from Anzahl der Wörter: Von to bis Import Markdown import Markdown-Import <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; <b>Info:</b> Ein sehr einfacher Parser, der ein Markdown-Dokument durchläuft und für jeden Titel eigene Einträge anlegt.<br/>&nbsp; Folder import Ordnerimport <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> <p><b>Info:</b> Importiert eine ganze Verzeichnisstruktur. Ordner werden als Ordner hinzugefügt, und Reintext-Dokumente (Sie wählen welche, entsprechend der Erweiterung) werden als Szene hinzugefügt.</p> <p>Es werden nur Textdateien unterstützt (keine Bilder, Binärdateien oder andere).</p> Include only those extensions: Nur diese Dateinamenerweiterungen hinzufügen: Comma separated values Komma-getrennte Werte Sort items by name Elemente nach Namen sortieren Import folder then files Erst Ordner, danach Dateien importieren OPML Import OPML importieren File open failed. Öffnen der Datei fehlgeschlagen This does not appear to be a valid OPML file. Dies scheint keine gültige OPML-Datei zu sein. Pandoc import Pandoc importieren <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; <b>Info:</b> Manuskript kann <b>Markdown</b> oder <b>OPML</b> importieren. Pandoc konvertiert Ihr Dokument in das jeweilige Format, bevor Manuskript es importiert. Das Ergebnis hängt von der Art Ihres Dokuments ab. <br/>&nbsp; Import using: Importieren mit: Wrap lines: Zeilenumbruch: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> <p>Soll pandoc jede einzelne Zeile umbrechen?</p><p> <b>auto</b>: bricht nach 72 Zeichen um.<br> <b>none</b>: keine Zeilenumbrüche.<br> <b>preserve</b>: versucht, Umbrüche aus dem Originaldokument zu erhalten.</p> Mind Map Import Mind Map importieren This does not appear to be a valid Mind Map file. Dies scheint keine gültige Mind Map-Datei zu sein. Mind Map import Mind Map importieren Import tip as: Hinweis importieren als: Untitled Ohne Titel MDEditCompleter Insert reference Referenz einfügen MainWindow General Allgemein Title Titel Subtitle Untertitel Series Serie Volume Band Genre Genre License Lizenz Author Autor Name Name Email Email Summary Zusammenfassung Situation: Situation: Summary: Zusammenfassung: One sentence Ein Satz One paragraph Ein Absatz One page Eine Seite Full Ausführlich One sentence summary Zusammenfassung in einem Satz One paragraph summary Zusammenfassung in einem Absatz Expand each sentence of your one paragraph summary to a paragraph Erweitern Sie jeden Satz Ihrer Ein-Absatz-Zusammenfassung zu einem eigenen Absatz One page summary Zusammenfassung auf einer Seite Full summary Ausführliche Zusammenfassung Next Weiter What if...? Was wäre wenn ...? Characters Charaktere Names Namen Filter Filter Basic info Basisinformationen Importance Bedeutung Motivation Motivation Goal Ziel Conflict Konflikt Epiphany Schicksal <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="right">Handlung aus Sicht<br/>des Charakters<br/>in einem Satz</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> <html><head/><body><p align="right">Handlung aus Sicht<br/>des Charakters<br/>in einem Absatz</p></body></html> Notes Notizen Detailed info Details Plots Handlungsstränge Plot Handlungsstrang Character(s) Charakter(e) Description Beschreibung Result Lösung Resolution steps Lösungsschritte World Welt Populates with empty data Wird mit leeren Daten aufgefüllt More Mehr Source of passion Quelle der Leidenschaft Source of conflict Quelle des Konflikts Outline Struktur Editor Textverarbeitung Debug Debug FlatData Projektdaten Persos Charaktere Labels Labels &File &Datei &Recent &Zuletzt verwendet &Help &Hilfe &Tools &Werkzeuge &Edit &Bearbeiten &View &Ansicht &Mode &Modus &Cheat sheet &Spickzettel Sea&rch Su&che &Navigation &Navigation &Open &Öffnen Ctrl+O Strg+O &Save &Speichern Ctrl+S Strg+S Sa&ve as... Sp&eichern als ... Ctrl+Shift+S Strg+Shift+S &Quit &Schließen Ctrl+Q Strg+Q &Show help texts &Zeige Hilfetext Ctrl+Shift+B Strg+Shift+B &Spellcheck &Rechtschreibprüfung F9 F9 &Labels... &Labels... &Status... &Status ... Tree Baum &Simple &Einfach &Fiction &Fiktionaler Text Index cards Karteikarten S&ettings E&instellungen F8 F8 &Close project &Projekt schließen Co&mpile Ko&mpilieren F6 F6 &Frequency Analyzer &Häufigkeitsanalyse Book information Buchinformationen &About &Über About Manuskript Über Manuskript Manuskript Manuskript Project {} saved. Projekt {} gespeichert. WARNING: Project {} not saved. WARNUNG: Projekt {} nicht gespeichert. Project {} loaded. Projekt {} geladen. Project {} loaded with some errors: Projekt {} mit einigen Fehlern geladen: * {} wasn't found in project file. * {} konnte in der Projektdatei nicht gefunden werden. Project {} loaded with some errors. Projekt {} wurde mit einigen Fehlern geladen. (~{} pages) (~{} Seiten) Words: {}{} Wörter: {}{} Book summary Buchzusammenfassung Project tree Projektbaum Metadata Metadaten Story line Handlung Enter information about your book, and yourself. Gib Informationen über dein Buch und dich ein. The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) Die Ausgangssituation, in Form von 'Was wäre wenn ...?" Fragen. Beispiel: "Was wäre wenn der gefährlichste böse Zauberer nicht einmal ein Baby töten könnte?" (Harry Potter) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Nehmen Sie sich Zeit, sich einen Satz auszudenken (~15 Wörter), der Ihr Buch zusammenfasst. Dann erweitern Sie ihn zu einem Absatz, dann zu einer ganzen Seite und abschließend zu einer ausführlichen Zusammenfassung. Create your characters. Erschaffen Sie Ihre Charaktere. Develop plots. Entwickle Handlungsstränge. Build worlds. Create hierarchy of broad categories down to specific details. Erbaue Welten. Erstelle Hierachien breitgefächterter Kategorien, bis hin zu spezifischen Details. Create the outline of your masterpiece. Arbeiten Sie die Struktur Ihres Meisterwerks aus. Write. Schreibe. Debug info. Sometimes useful. Debuginformationen. Manchmal hilfreich. Dictionary Wörterbuch Nothing Keine POV Perspektive Label Label Progress Fortschritt Compile Kompiliere Icon color Iconfarbe Text color Textfarbe Background color Hintergrundfarbe Icon Icon Text Text Background Hintergrund Border Rahmen Corner Ecke Add plot step Füge Handlungsschritt hinzu (Strg+Enter) &Import… &Importieren … F7 F7 &Copy &Kopieren Ctrl+C Strg+C C&ut A&usschneiden Ctrl+X Strg+X &Paste &Einfügen Ctrl+V Strg+V &Split… &Aufteilen … Ctrl+Shift+K Strg+Umschalt+K Sp&lit at cursor Am Mauszeiger aufteilen Ctrl+K Strg+K Ctrl+M Strg+M Ctrl+D Strg+D Del Löschen &Move Up &Nach oben Ctrl+Shift+Up Strg ➕ Umschalttaste ➕ Aufwärts M&ove Down N&ach unten Ctrl+Shift+Down Strg+Umschalt+Abwärts Dupl&icate Dupl&izieren &Delete &Löschen &Rename &Umbenennen F2 F2 Organi&ze Verwal&ten M&erge Zusamm&enführen &Format &Formatieren &Header &Level 1 (setext) &Level 1 (setext) Ctrl+Alt+1 Strg+Alt+1 Level &2 Level &2 Ctrl+Alt+2 Strg+Alt+2 Level &1 (atx) Level &1 (atx) Ctrl+1 Strg+1 L&evel 2 L&evel 2 Ctrl+2 Strg+2 Level &3 Level &3 Ctrl+3 Strg+3 Level &4 Level &4 Ctrl+4 Strg+4 Level &5 Level &5 Ctrl+5 Ctrl+5 Level &6 Level &6 Ctrl+6 Strg+6 &Bold &Fett Ctrl+B Strg+B &Italic &Kursiv Ctrl+I Strg+I &Strike &Verbatim Su&perscript Ctrl++ Strg++ Subsc&ript Ctrl+- Strg+- Co&mment block Ko&mmentarblock Ctrl+Shift+C Strg+Umschalt+C Clear &formats Ctrl+0 Strg+0 &Comment line(s) &Kommentarzeile(n) &Ordered list Ge&ordnete Liste &Unordered list &Ungeordnete Liste B&lockquote Remove selected plot step(s) Ausgewählte Plot-Schritt(e) entfernen The file {} does not exist. Has it been moved or deleted? Die Datei {} existiert nicht. Wurde sie verschoben oder gelöscht? Install {}{} to use spellcheck {} has no installed dictionaries {}{} is not installed Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings Settings Einstellungen General Allgemein Revisions Revisionen Views Ansichten Labels Labels Status Status Fullscreen Vollbildmodus General settings Allgemeine Einstellungen Application settings Benutzeroberfläche Loading Laden Automatically load last project on startup Läd automatisch das letzte Projekt beim Start Saving Speichern Automatically save every Speichert automatisch alle minutes. Minuten. If no changes during Speichert, wenn keine Änderungen in den letzten seconds. Sekunden. Save on project close Speichert beim Schließen <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> <html><head/><body><p>Wenn diese Option ausgewählt wurde, wird das Projekt in einer einzigen Datei gespeichert. Es ist leichter zu kopieren oder zu sichern, aber nicht für gemeinsame Bearbeitung oder Versionierung geeignet.<br/>Wenn diese Option nicht ausgewählt wurde, wird das Projekt in vielen kleinen einzelnen Dateien gespeichert.</p></body></html> Save to one single file In einer Datei speichern Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. Revisionen sind ein Weg, um die Bearbeitung zu dokumentieren. Für jedes Element werden die Änderungen im Haupttext nachgehalten und erlauben es, sich diese anzusehen oder alte Versionen wiederherzustellen. Keep revisions Revisionen aufbewahren S&mart remove &Archivierung Keep: Behalte: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. Die Archivierung erlaubt es, nur eine geringe Anzahl von Revisionen vorzuhalten. Es wird ausdrücklich empfohlen, sie zu nutzen, damit das Projekt nicht mit tausenden von unwichtigen Änderungen gefüllt wird. revisions per day for the last month Revisionen pro Tag im letzten Monat revisions per minute for the last 10 minutes Revisionen pro Minute in den letzten 10 Minuten revisions per hour for the last day Revisionen pro Stunde am letzten Tag revisions per 10 minutes for the last hour Revisionen pro 10 Minuten in der letzten Stunde revisions per week till the end of time Revisionen pro Woche Views settings Ansicht - Einstellungen Tree Baum Colors Farben Icon color: Iconfarbe: Nothing Keine POV POV Label Label Progress Fortschritt Compile Kompilieren Text color: Textfarbe: Background color: Hintergrundfarbe: Folders Ordner Show ite&m count Zeige Anzahl enthaltener &Dateien Show summary Zeige Inhaltsangabe &Nothing &Nichts Text Text Outline Reißbrett Visible columns Sichtbare Spalten Goal Ziel Word count Wortanzahl Percentage Prozentsatz Title Titel Index cards Karteikarten Item colors Farben Border color: Rahmenfarbe: Corner color: Eckenfarbe: Background Hintergrund Color: Farbe: Ctrl+S Strg+S Image: Bild: Text editor Texteditor Font Schrift Family: Schriftart: Size: Größe: Misspelled: Rechtschreibprüfung: Background: Hintergrund: Paragraphs Absätze Line spacing: Zeilenabstand: Single Einfach 1.5 lines 1,5 Zeilen Double Doppelt Proportional Proportional % % Tab width: Tabulator: px pt Indent 1st line Einzug der ersten Zeile Spacing: Abstand: New Neu Edit Ändern Delete Löschen Theme name: Themenname: Apply Anwenden Cancel Abbrechen Window Background Fensterhintergrund Text Background Texthintergrund Text Options Textoptionen Paragraph Options Absatzoptionen Type: Typ: No Image Kein Bild Tiled Gekachelt Centered Zentriert Stretched Gestreckt Scaled Skaliert Zoomed Zoom Opacity: Deckkraft: Position: Position: Left Links Center Zentriert Right Rechts Width: Breite: Corner radius: Eckrundung: Margins: Außenabstände: Padding: Innenabstände: Font: Schrift: Style Stil Cursor Zeiger Use block insertion of Nutze Absatzeinrückung von Alignment: Ausrichtung: Justify Blocksatz Alignment Ausrichtung Icon Size Icongröße TextLabel Textbeschriftung Disable blinking Blinken Aus Text area Textfeld Max width Max. Breite Left/Right margins: Abstände Rechts/Links: Top/Bottom margins: Abstände Oben/Unten: S&how progress Fortschritt anzeigen Show summar&y &Zusammenfassung anzeigen Show p&rogress Fo&rtschritt anzeigen Old st&yle Alter St&il Transparent Transparent Restore defaults Standardwerte wiederherstellen Style: Stil: Language: Sprache: Font size: Schriftgröße: Restarting Manuskript ensures all settings take effect. Wenn Sie Manuskript neu starten, werden alle Einstellungen wirksam. Show &word count Anzahl der &Wörter anzeigen &Show word count &New style &Neuer Stile Typewriter mode Schreibmaschinen Modus Focus mode None Nichts Sentence Satz Line Zeile Paragraph Absatz <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions Korrekturvorschläge &Add to dictionary Zum Wörterbuch &hinzufügen &Remove from custom dictionary Aus dem Wörterbuch &entfernen about About Manuskript Über Manuskript Manuskript Manuskript aboutDialog Version Version Software Versions in Use: Verwendete Software-Versionen: abstractModel Title Titel POV POV Label Kategorie Status Status Compile Kompilieren Word count Wortanzahl Goal Ziel basicItemView Form Formular POV: POV: Goal: Ziel: Word count Wortanzahl One line summary Zusammenfassung in einem Satz Few sentences summary: Zusammenfassung in wenigen Sätzen: characterModel New character Neuer Charakter Name Name Value Wert characterTreeView Main Primär Secondary Sekundär Minor Nebensächlich cheatSheet Form Formular Filter (type the name of anything in your project) Filter (Tippe die Bezeichnung von irgendwas aus dem Projekt ein) Minor Nebensächlich Secondary Sekundär Main Primär Characters Charaktere Texts Texte Plots Handlungsstränge World Welt cmbOutlineCharacterChoser None Nichts Main Primär Secondary Sekundär Minor Nebensächlich Various Verschiedene cmbOutlineLabelChoser Various Verschiedene cmbOutlineStatusChoser Various Verschiedene collapsibleDockWidgets Dock Widgets Toolbar Dock Widgets-Symbolleiste completer Form Formular corkDelegate One line summary Inhaltsangabe in einem Satz Full summary Vollständige Zusammenfassung editorWidget_ui Form Formular exporter Export Exportieren Export to: Ausgabe in: Manage exporters Speicherort Preview Vorschau Settings Einstellungen exporterDialog {} (not implemented yet) {} (noch nicht implimentiert) exporterSettings Form Formular Content Inhalt Decide here what will be included in the final export. Entscheide, was im finalen Export enthalten sein soll. Type Typ Title Titel Text Text I need more granularity Ich brauche mehr Granularität Fi&lters Fi&lter <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> <html><head/><body><p>Filtert, welche Objekte beim finalen Export mit einbezogen werden sollen.<br/><span style=" color:#773333;">(Noch nicht vollständig implimentiert.)</span></p></body></html> Ignore compile status (include all items) Ignoriere den Compile-Status (Bezieht alle Objekte mit ein) Subitems of: Alle Objekte von: Labels Labels Status Status Separations Trennzeichen Between folders: Zwischen Ordnern: Empty line Leere Zeile Custom Benutzerdefiniert Between texts: Zwischen Texten: Between folder and text: Zwischen Ordner und Text: Between text and folder: Zwischen Text und Ordner: Transformations Suchen und Ersetzen Typographic replacements: Typografisches Ersetzen: Replace double quotes (") with: Doppelte Anführungszeichen (") ersetzen durch: Replace single quotes (') with: Einfache Anführungszeichen (') ersetzen durch: Remove multiple spaces Entferne mehrfache Leerzeichen Custom replacements: Benutzerdefiniertes Ersetzen: Enabled Aktiv Replace Ersetze With durch RegExp RegExp If checked, uses regular expression for replacement. If unchecked, replaced as plain text. Wenn aktiv, werden Reguläre Ausdrücke für das Ersetzen genutzt. Wenn nicht aktiv, wird einfacher Text ersetzt. Preview Vorschau Font Schrift Font: Schrift: Font size: Schriftgröße: Folder Ordner {}Level {} folder {}Level {} Ordner {}Level {} text {}Level {} Text Replace ... with … ... ersetzen durch … Replace --- with — --- ersetzen durch — exportersManager Installed Installiert Custom Benutzerdefiniert Not found Nicht gefunden {} not found. Install it, or set path manually. {} nicht gefunden. Installiere es oder gib den Pfad manuell ein. <b>Status:</b> uninstalled. <b>Status:</b> Nicht installiert. <b>Requires:</b> <b>Voraussetzung</b> Set {} executable path. Setze {} ausführbaren Pfad. frequencyAnalyzer Phrases Phrasen Frequency Häufigkeit Word Wort fullScreenEditor Theme: Thema: {} words / {} {} Wörter / {} {} words {} Wörter Spellcheck Rechtschreibprüfung Navigation Navigation New Text Neuer Text Title Titel Title: Show Full Path Titel: Zeige kompletten Dateipfad Theme selector Word count Wortanzahl Progress Fortschritt Progress: Auto Show/Hide Clock Uhr Clock: Show Seconds generalSettings General Allgemein Split scenes at: Szenen aufteilen bei: \n---\n \n---\n Trim long titles (> 32 chars) Lange Titel trimmen (> 32 Zeichen) Import under: Importieren unter: Import in a top-level folder In einen übergeordneten Ordner importieren helpLabel If you don't wanna see me, you can hide me in Help menu. Wenn du mich nicht sehen willst, kannst du mich über das Hilfemenü verschwinden lassen. importer Import Importieren Format: Format: Choose file Datei wählen Clear file Datei leeren Preview Vorschau Settings Einstellungen lastAccessedDirectoryInfo Last accessed directory "{}" loaded. lineEditView Various Verschiedenes locker Form Formular Lock screen: Sperrbildschirm: Word target Wortziel Time target Zeitziel words Wörter minutes Minuten Lock ! Sperren! ~{} h. ~{} h. ~{} mn. ~{} m. {}:{} {} s. {} s. {} remaining {} verbleibend {} words remaining {} Wörter verbleiben mainEditor Form Formular Text Text Index cards Karteikarten Outline Reißbrett F11 F11 Go to parent item Gehe zum übergeordneten Element Alt+Up Alt+Nach oben Root Stamm {} words / {} {} Wörter / {} {} words {} Wörter markdownSettings Markdown Markdown metadataView Form Formular Properties Einstellungen Summary Inhaltsangabe One line summary Inhaltsangabe in einem Satz Full summary Vollständige Inhaltsangabe Notes / References Notizen / Referenzen Revisions Revisionen myPanel Auto-hide Automatisches Ausblenden outlineBasics Set POV Wähle POV None Nichts Set Status Wähle Status Set Label Wähle Label New Neu Main Primär Secondary Sekundär Minor Nebensächlich Set Custom Icon Benutzerdefinierten Icon einfügen Restore to default Auf Standard zurücksetzen Root Stamm Open {} items in new tabs {} Elemente in neuen Tabs öffnen Open {} in a new tab {} in einem neuen Tab öffnen About to remove Im Begriff, dies zu entfernen <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> <p><b>Möchten Sie wirklich {} Element(e) löschen?</b></p> Select at least two items. Folders are ignored. Wählen Sie mindestens zwei Elemente aus. Ordner werden ignoriert. All items must be on the same level (share the same parent). Alle Elemente müssen sich auf der gleichen Ebene befinden (teilen sich die gleiche übergeordnete Ebene). New &Folder Neuer &Ordner New &Text Neuer &Text &Copy &Kopieren C&ut A&usschneiden &Paste &Einfügen &Rename &Umbenennen &Delete &Löschen outlineCharacterDelegate None Nichts Main Primär Secondary Sekundär Minor Nebensächlich outlineItem {} words / {} ({}) {} Wörter / {} ({}) {} words {} Wörter pandocSettings General Allgemein Table of Content Inhaltsverzeichnis Custom settings for {} Benutzerdefinierte Einstellungen für {} persosProxyModel Main Primär Secondary Sekundär Minors Nebensächlich plotDelegate General Allgemein Promise Versprechen Problem Problem Progress Fortschritt Resolution Lösung Try / Fail Versuch / Scheitern No and Nein und Yes but Ja, aber Freytag's pyramid Freytags Pyramide Exposition Darstellung Rising action Spannungsanstieg Climax Klimax Falling action Spannungsabfall Three acts Drei Akte 1. Setup 1. Aufbau 1. Inciting event Übertreten der Schwelle 1. Turning point 1. Wendepunkt 2. Choice 2. Wahl 2. Reversal 2. Wende 2. Disaster 2. Katastrophe 3. Stand up 3. Gegenwehr 3. Climax 3. Klimax 3. Ending 3. Ende Hero's journey Heldenreise Ordinary world Gewöhnliche Welt Call to adventure Ruf des Abenteuers Refusal of the call Absage des Rufs Meeting with mentor Treffen mit dem Mentor Tests Prüfungen Approach Annäherung Abyss Abgrund Reward / Revelation Belohnung / Offenbarung Transformation Verwandlung Atonement Sühne Return Rückkehr plotModel New plot Neuer Handlungsstrang Name Name Meta Meta New step Neuer Schritt Main Primär Secondary Sekundär Minor Nebensächlich plotTreeView Main Primär Secondary Sekundär Minor Nebensächlich **Plot:** {} **Handlungsstrang:** {} plotsProxyModel Main Primär Secondary Sekundär Minors Nebensächlich propertiesView Form Formular POV POV Status Status Label Label Compile Kompilieren Goal Ziel Word count Wortanzahl references Not a reference: {}. Keine Referenz: {}. Unknown reference: {}. Unbekannte Referenz: {}. Path: Pfad: Stats: Status: POV: POV: Status: Status: Label: Label: Short summary: Kurzinhaltsangabe: Long summary: Ausführliche Inhaltsangabe: Notes: Notizen: Basic info Baisinformationen Detailed info Detailierte Informationen POV of: POV von: Go to {}. Gehe zu {}. Description Beschreibung Result Ergebnis Characters Charaktere Resolution steps Lösungsschritte Passion Leidenschaft Conflict Konflikt <b>Unknown reference:</b> {}. <b>Unbekannte Referenz:</b> {}. Folder: <b>{}</b> Ordner:<b>{}</b> Text: <b>{}</b> Text:<b>{}</b> Character: <b>{}</b> Charakter:<b>{}</b> Plot: <b>{}</b> Plot:<b>{}</b> World: <b>{name}</b>{path} Welt:<b>{name}</b>{path} Referenced in: Referenziert in: Motivation Motivation Goal Ziel Epiphany Schicksal Short summary Kurzzusammenfassung Longer summary Lange Zusammenfassung revisions Form Formular Options Optionen Restore Wiederherstellen Delete Löschen Show modifications Zeige Modifikationen Show ancient version Zeige vorherige Version Show spaces Zeige Leerzeichen Show modifications only Zeige nur die Modifikationen {} years ago {} Jahre zuvor {} months ago {} Monate zuvor {} days ago {} Tage zuvor 1 day ago 1 Tag zuvor {} hours ago {} Stunden zuvor {} minutes ago {} Minuten zuvor {} seconds ago {} Sekunden zuvor Line {}: Zeile {}: Clear all Leeren search Form Formular Search for... Suche nach ... Search in: Suche in: All Alles Title Titel Text Text Summary Zusammenfassung Notes Notizen POV Perspektive Status Status Label Beschriftung Options: Optionen: Case sensitive Groß-/Kleinschreibung berücksichtigen settingsWindow New status Neuer Status New label Neue Beschriftung newtheme Neues Thema New theme Neues Thema (read-only) (schreibgeschützt) Open Image Image files (*.jpg; *.jpeg; *.png) Error Fehler Unable to load selected file Unable to add selected image: {} sldImportance Form Formular TextLabel Textlabel Minor Nebensächlich Secondary Sekundär Main Primär splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> <p>Ausgewählte(s) Element(e) an der angegebenen Markierung aufteilen</p> <p>Wenn eines der ausgewählten Elemente ein Ordner ist, wird es rekursiv auf <i>alle</i> untergeordneten Elemente übertragen.</p> <p>Die Trennmarkierung kann folgende Escape-Sequenzen enthalten: <ul> <li><b><code>\n</code></b>: Zeilenumbruch</li> <li><b><code>\t</code></b>: Tab</li> </ul> </p> <p><b>Markierung:</b></p> Split '{}' „{}” aufteilen Split items Elemente aufteilen storylineView Form Formular Show Plots Zeige Handlungsstränge Show Characters Zeige Charaktere tabSplitter Open selected items in that view. Öffne markierte Elemente in dieser Ansicht. Split horizontally Ansicht horizontal teilen Close split Teilung beenden Split vertically Ansicht vertikal teilen textEditView Various Verschiedenes textFormat Form Formular CTRL+B Strg+B CTRL+I Strg+I CTRL+U Strg+U CTRL+P Strg+P CTRL+L Strg+L CTRL+E Strg+E CTRL+R Strg+R CTRL+J Strg+J treeView Expand {} {} ausklappen Collapse {} {} einklappen Expand All Alles ausklappen Collapse All Alles einklappen welcome Form Formular 1 1 Templates Vorlage Empty Leer Novel Roman Novella Novelle Short Story Kurzgeschichte Research paper Forschungsbericht Demo projects Demo Projekte Add level Ebene hinzufügen Add word count Wortziel festlegen Next time, automatically open last project Beim nächsten Start automatisch das letzte Projekt öffnen Open... Öffnen ... Recent Zuletzt verwendete Dokumente Create Erstellen Open project Öffne Projekt Manuskript project (*.msk);;All files (*) Manuskript Projekt (*.msk);;Alle Dateien (*) Save project as... Speichern als ... Manuskript project (*.msk) Manuskript Projekt (*.msk) Manuskript Manuskript Create New Project Erzeuge neues Projekt Warning Warnung Overwrite existing project {} ? Existierendes Projekt {} überschreiben? Empty fiction Leere Geschichte Chapter Kapitel Scene Szene Trilogy Triologie Book Buch Section Absatz Empty non-fiction Leeres Sachbuch words each. Wörter. of von Text Text Something Irgendwas <b>Total:</b> {} words (~ {} pages) <b>Gesamt:</b> {} Wörter (~ {} Seiten) Fiction Geschichte Non-fiction Sachtext Idea Idee Note Notiz Research Recherche TODO ToDo First draft Erster Entwurf Second draft Zweiter Entwurf Final Endgültig worldModel New item Neues Element Fantasy world building Bau einer Fantasy-Welt Physical Geographie Climate Klima Topography Relief Astronomy Astronomie Wild life Fauna Flora Flora History Geschichte Races Arten Diseases Krankheiten Cultural Kultur Customs Bräuche Food Essen Languages Sprachen Education Erziehung Dresses Kleidung Science Wissenschaft Calendar Zeitrechnung Bodily language Körpersprache Ethics Ethik Religion Religion Government Regierung Politics Politik Gender roles Geschlichterrollen Music and arts Musik und Kunst Architecture Architektur Military Militär Technology Technologie Courtship Balzverhalten Demography Demographie Transportation Transportmittel Medicine Medizin Magic system Magiesystem Rules Regeln Organization Organisation Magical objects Magische Objekte Magical places Magische Orte Magical races Magische Wesen Important places Wichtige Orte Important objects Wichtige Objekte Natural resources manuskript-0.10.0/i18n/manuskript_en_GB.qm000066400000000000000000001373201354442177200203510ustar00rootroot00000000000000L1@TXTVEG{VE[AVEvVExVsd3h#dqpdv8O$eq}h:_Qeffh ]J?*$K*y*ys*@*%*0S+E+f+ +y+ .3 0o93C;fA[:G:G{Hw9>J5i&J)gKQL7*LGLbLbM|MM6NMezCMezaMŅ-BNWWQ:EvRx.RxERxVRx=RxlTbY TbZ$Tb[TburTbxeTbTbTbT1Uj1cUjUlV':`(VPV/W63W6ZHXyXJYEkYYȀzZM[Z%NZʳZϳZ[Pv[ %:;[ %P[ %V|[ %e[ %j[ %[ٵ\Q3\X\R\Q^i$;8^i$ZgUn-S^o-p#shD(YIBwD?r{&of 2~0?vr. 9$<~D! DU "s>[- NEtP2GViiMtKs*3R6&ݰ!<ʯE'l$!?*sntY ?FzYKI^;Bkgqhy&z~hnq,u&sPDzf3# #]sӽMҳcP.hLG/M[# Nl~LU,M[jN-,Uj0W>$1v3tcTML# UAITgVWF]1}^2/i@tQRRWC@n>.V494{k.w(^+ʶ'&~E)LOqYJo'!ȳnƩx&nh0JE(F=N^m _paN^$lwpCl.Sq02rCwb1ppncnnnnooAofrv<zT\b!h"I@Z@4jzjՈ{~|k6Z@6@$Vli:%+%P%u%%%& &.&S&&''9'^''''A))B,A,bA]_]gGt-%B#7SS/ b*ĚG{{.>nSrv])Do:,*aDNھ/ E/Cns?0}DpMvm!&$''3.'3E'3c#+5!o5`a@Vz@VnHuQhD~VjWj.j .F S σ F>S HZWX +4u ?:Em_ Mg Mg) Mg TA X;7W ^3 ^I= ^i ^~ g: r,|X x <2 z I5   -k 5 %7  UH Uw շX z C_, $ zI  ?@g 08 3P 9s. 9sD 9sq >c7 A^F Rb`{ ZF dpe$= dpe@ dpeU dpe d)Y5 d)Zl d)[s d)w d)x d)zB d)} d) d) d)* e_ lu! n o"`q }(F QU TB B;: fQ * u g : : , ,s 87 8sC 8[ ʶ0 ֓ Ul N^ z- 7 9*l Jf  ;_ #esk F.I Q8o U~ ]Y|w l s3 }j %S4 . i t- HS Ht f6J 5 > 7 # G LTB ڔ 5m uH 5` Y*? _ _a iCe ӨSa y W t1  RSu / 1Uy 4 ^ ; =f7, Cj7 G` NrX SB ZL Z$@c bd~ i?4 pk04 rIjd }m !T 4 Bg =  [ [ \ n ; )h ޔ i  x$1 W  sbV  ` 'jo< 0 $ $0] $U5 $ n ,3 %{ #5 s sL; s] sn ɠU / /? /f / / ̺.{ CIb u {R d * QNW  K J s . zZA  $ 4}= 5N 7ؤ; 87>" DY( DY(B DY( DZ( Jf KY bB i8:m 2 P . S W \ r ^  ) 0> Ğt <- <Cg <k <y <} azp ⋙1 e+} } uY}'ad 2#2)#h6e"92<+}aH4I}2OqxUh mWG>4,\r]$OE)0T$*j?k̺Aba&xb& h)4 S )dE;=QM>2cB3L`BxSQy@R_"1R_d@BfqOpt%|oN~`kn~`x"|P("|U6e]i~#il.tt>:eajPii

A universal document converter. Can be used to convert markdown to a wide range of other formats.

Website: http://pandoc.org/

ExportEA little known format modestly used. You know, web sites for example.Export5Basic HTML output using the Python module 'markdown'.ExportBooks that don't kill trees.ExportChoose output file...ExportClass:ExportConvert to ePUB3ExportADefault exporter, provides basic formats used by other exporters.ExportDDisable YAML metadata block. Use that if you get YAML related error.ExportErrorExport)Error processing regular expression : {}ExporthExport to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter.Export Font size:Export HTML OutputExport HTML SourceExportInclude a table of contents.ExportJust like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown.Export%LaTeX engine used to produce the PDF.ExportLaTeX is a word processor and document markup language used to create beautiful documents.Export Line spacing:ExportMarkdown sourceExport"Microsoft Office (.docx) document.ExportNeeds LaTeX to be installed.Export@Normalise the document (cleaner) Normalize the document (cleaner)Export,Number of sections level to include in TOC: Export5OpenDocument format. Used by LibreOffice for example.Export Paper size:Export Plain textExportPreview with highlighter.ExportPython module 'markdown'.Export/Self-contained HTML files, with no dependenciesExportSimplest export to plain text. Allows you to use your own markup not understood by manuskript, for example Fountain.Export$Specify the base level for headers: Export)Standalone document (not just a fragment)ExportThe purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner.ExportTypographically correct outputExportUse tags for quotes in HTMLExportUse ATX-style headersExport1Use reference-style links instead of inline linksExporta valid LaTeX installation. Pandoc recommendations can be found on: pandoc.org/installing.html. If you want Unicode support, you need XeLaTeX.Export2reStructuredText is a lightweight markup language.Export...ExportersManager DescriptionExportersManagerManage ExportersExportersManager ManuskriptExportersManagerOffers export toExportersManagerPath:ExportersManagerStatusExportersManagerStatus:ExportersManagerVersion:ExportersManager {HelpText}ExportersManagerAnalyseAnalyzeFrequencyAnalyzer Exclude words (comma separated):FrequencyAnalyzer$Frequency AnalyserFrequency AnalyzerFrequencyAnalyzer Minimum size:FrequencyAnalyzerNumber of words: fromFrequencyAnalyzerPhrase frequencyFrequencyAnalyzerSettingsFrequencyAnalyzer=Word frequencyFrequencyAnalyzertoFrequencyAnalyzerInfo: A very simple parser that will go through a markdown document and create items for each titles.
 Import}Info: Manuskript can import from markdown or OPML. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document.
 ImportR

Info: Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.

Only text files are supported (not images, binary or others).

ImportQ

Should pandoc create cosmetic / non-semantic line-breaks?

auto: wraps at 72 characters.
none: no line wrap.
preserve: tries to preserves line wrap from the original document.

ImportComma separated valuesImportFile open failed.Import Folder importImportImport folder then filesImportImport tip as:Import Import using:ImportInclude only those extensions:ImportMarkdown importImportMind Map ImportImportMind Map importImport OPML ImportImport Pandoc importImportSort items by nameImport1This does not appear to be a valid Mind Map file.Import-This does not appear to be a valid OPML file.ImportUntitledImport Wrap lines:ImportInsert referenceMDEditCompleter (~{} pages) MainWindow# * {} wasn't found in project file. MainWindow&About MainWindow&Bold MainWindow &Cheat sheet MainWindow&Close project MainWindow&Comment line(s) MainWindow&Copy MainWindow&Delete MainWindow&Edit MainWindow&Fiction MainWindow&File MainWindow&Format MainWindow&&Frequency Analyser&Frequency Analyzer MainWindow&Header MainWindow&Help MainWindow &Import… MainWindow&Italic MainWindow &Labels... MainWindow&Level 1 (setext) MainWindow&Mode MainWindow&Move Up MainWindow &Navigation MainWindow&Open MainWindow &Ordered list MainWindow&Paste MainWindow&Quit MainWindow&Recent MainWindow&Rename MainWindow&Save MainWindow&Show help texts MainWindow&Simple MainWindow &Spellcheck MainWindow &Split… MainWindow &Status... MainWindow&Strike MainWindow&Tools MainWindow&Unordered list MainWindow &Verbatim MainWindow&View MainWindowO

One paragraph
summary

 MainWindowN

One sentence
summary

 MainWindowAbout Manuskript MainWindow Add plot step MainWindowAuthor MainWindow B&lockquote MainWindow Background MainWindow"Background colourBackground color MainWindow Basic info MainWindowBook information MainWindow Book summary MainWindowBorder MainWindowMBuild worlds. Create hierarchy of broad categories down to specific details. MainWindowC&ut MainWindow Character(s) MainWindow Characters MainWindowClear &formats MainWindowCo&mment block MainWindowCo&mpile MainWindowCompile MainWindowConflict MainWindowCorner MainWindow'Create the outline of your masterpiece. MainWindowCreate your characters. MainWindowCtrl++ MainWindowCtrl+- MainWindowCtrl+0 MainWindowCtrl+1 MainWindowCtrl+2 MainWindowCtrl+3 MainWindowCtrl+4 MainWindowCtrl+5 MainWindowCtrl+6 MainWindow Ctrl+Alt+1 MainWindow Ctrl+Alt+2 MainWindowCtrl+B MainWindowCtrl+C MainWindowCtrl+D MainWindowCtrl+I MainWindowCtrl+K MainWindowCtrl+M MainWindowCtrl+O MainWindowCtrl+Q MainWindowCtrl+S MainWindow Ctrl+Shift+B MainWindow Ctrl+Shift+C MainWindowCtrl+Shift+Down MainWindow Ctrl+Shift+K MainWindow Ctrl+Shift+S MainWindow Ctrl+Shift+Up MainWindowCtrl+V MainWindowCtrl+X MainWindowDebug MainWindowDebug info. Sometimes useful. MainWindowDel MainWindow Description MainWindow Detailed info MainWindowDevelop plots. MainWindow Dictionary MainWindow Dupl&icate MainWindowEditor MainWindowEmail MainWindow0Enter information about your book, and yourself. MainWindowEpiphany MainWindowAExpand each sentence of your one paragraph summary to a paragraph MainWindowF2 MainWindowF6 MainWindowF7 MainWindowF8 MainWindowF9 MainWindowFilter MainWindowFlatData MainWindowFull MainWindow Full summary MainWindowGeneral MainWindowGenre MainWindowGoal MainWindowIcon MainWindowIcon colour Icon color MainWindow Importance MainWindow Index cards MainWindowInstall {}{} to use spellcheck MainWindowL&evel 2 MainWindowLabel MainWindowLabels MainWindowLevel &1 (atx) MainWindowLevel &2 MainWindowLevel &3 MainWindowLevel &4 MainWindowLevel &5 MainWindowLevel &6 MainWindowLicenceLicense MainWindowM&erge MainWindow M&ove Down MainWindow Manuskript MainWindowMetadata MainWindowMore MainWindow Motivation MainWindowName MainWindowNames MainWindowNext MainWindowNotes MainWindowNothing MainWindowOne page MainWindowOne page summary MainWindow One paragraph MainWindowOne paragraph summary MainWindow One sentence MainWindowOne sentence summary MainWindowOrgani&se Organi&ze MainWindowOutline MainWindowPOV MainWindowPersos MainWindowPlot MainWindowPlots MainWindowPopulates with empty data MainWindowProgress MainWindow Project tree MainWindow#Project {} loaded with some errors. MainWindow#Project {} loaded with some errors: MainWindowProject {} loaded. MainWindowProject {} saved. MainWindowRemove selected plot step(s) MainWindowResolution steps MainWindowResult MainWindow S&ettings MainWindow Sa&ve as... MainWindowSea&rch MainWindowSeries MainWindow Situation: MainWindowSource of conflict MainWindowSource of passion MainWindowSp&lit at cursor MainWindow Story line MainWindow Su&perscript MainWindow Subsc&ript MainWindowSubtitle MainWindowSummary MainWindowSummary: MainWindowTake time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. MainWindowText MainWindowText colour Text color MainWindowThe basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) MainWindow9The file {} does not exist. Has it been moved or deleted? MainWindowTitle MainWindowTree MainWindowVolume MainWindowWARNING: Project {} not saved. MainWindow What if...? MainWindow Words: {}{} MainWindowWorld MainWindowWrite. MainWindow {} has no installed dictionaries MainWindow{}{} is not installed MainWindow pxSettings%Settings &New styleSettings&NothingSettings&Show word countSettings 1.5 linesSettings

If you check this option, your project will be save as one single file. Easier to copy or backup, but does not allow collaborative editing, or versionning.
If this is unchecked, your project will be save as a folder containing many small files.

Settings AlignmentSettings Alignment:SettingsApplication settingsSettingsApplySettings*Automatically load last project on startupSettingsAutomatically save everySettings BackgroundSettings$Background colour:Background color:Settings Background:SettingsBorder colour: Border color:SettingsCancelSettings CentreCenterSettingsCentredCenteredSettingsColour:Color:SettingsColoursColorsSettingsCompileSettingsCorner colour: Corner color:SettingsCorner radius:SettingsCtrl+SSettingsCursorSettingsDeleteSettingsDisable blinkingSettingsDoubleSettingsEditSettingsFamily:Settings Focus modeSettingsFoldersSettingsFontSettings Font size:SettingsFont:Settings FullscreenSettingsGeneralSettingsGeneral settingsSettingsGoalSettings Icon SizeSettingsIcon colour: Icon color:SettingsIf no changes duringSettingsImage:SettingsIndent 1st lineSettings Index cardsSettingsItem colours Item colorsSettingsJustifySettingsKeep revisionsSettingsKeep:SettingsLabelSettingsLabelsSettings Language:SettingsLeftSettingsLeft/Right margins:SettingsLineSettings Line spacing:SettingsLoadingSettingsMargins:Settings Max widthSettings Misspelled:SettingsNewSettingsNo ImageSettingsNoneSettingsNothingSettings Old st&yleSettingsOpacity:SettingsOutlineSettingsPOVSettingsPadding:Settings ParagraphSettingsParagraph OptionsSettings ParagraphsSettings PercentageSettings Position:SettingsProgressSettings ProportionalSettings7Restarting Manuskript ensures all settings take effect.SettingsRestore defaultsSettings RevisionsSettingsRevisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions.SettingsRightSettingsS&how progressSettings S&mart removeSettings Save on quitSettingsSave to one single fileSettingsSavingSettingsScaledSettingsSentenceSettingsSettingsSettingsShow &word countSettingsShow ite&m countSettingsShow p&rogressSettings Show summar&ySettings Show summarySettingsSingleSettingsSize:SettingsSmart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes.SettingsSpacing:SettingsStatusSettings StretchedSettingsStyleSettingsStyle:Settings Tab width:SettingsTextSettingsText BackgroundSettings Text OptionsSettings Text areaSettingsText colour: Text color:Settings Text editorSettings TextLabelSettings Theme name:SettingsTiledSettingsTitleSettingsTop/Bottom margins:Settings TransparentSettingsTreeSettingsType:SettingsTypewriter modeSettingsUse block insertion ofSettingsViewsSettingsViews settingsSettingsVisible columnsSettingsWidth:SettingsWindow BackgroundSettings Word countSettingsZoomedSettingsminutes.Settings*revisions per 10 minutes for the last hourSettings$revisions per day for the last monthSettings#revisions per hour for the last daySettings,revisions per minute for the last 10 minutesSettings'revisions per week till the end of timeSettingsseconds.Settings&Add to dictionary SpellAction&Remove from custom dictionary SpellActionSpelling Suggestions SpellActionAbout Manuskriptabout ManuskriptaboutSoftware Versions in Use: aboutDialogVersion aboutDialogCompile abstractModelGoal abstractModelLabel abstractModelPOV abstractModelStatus abstractModelTitle abstractModel Word count abstractModelLoaded translation from {}: {}.app:Note: No translator found or loaded from {} for locale {}.appFew sentences summary: basicItemViewForm basicItemViewGoal: basicItemViewOne line summary basicItemViewPOV: basicItemView Word count basicItemViewNamecharacterModel New charactercharacterModelValuecharacterModelMaincharacterTreeViewMinorcharacterTreeView SecondarycharacterTreeView Characters cheatSheet2Filter (type the name of anything in your project) cheatSheetForm cheatSheetMain cheatSheetMinor cheatSheetPlots cheatSheet Secondary cheatSheetTexts cheatSheetWorld cheatSheetMaincmbOutlineCharacterChoserMinorcmbOutlineCharacterChoserNonecmbOutlineCharacterChoser SecondarycmbOutlineCharacterChoserVariouscmbOutlineCharacterChoserVariouscmbOutlineLabelChoserVariouscmbOutlineStatusChoserDock Widgets ToolbarcollapsibleDockWidgetsForm completer Full summary corkDelegateOne line summary corkDelegateFormeditorWidget_uiExportexporter Export to:exporterManage exportersexporterPreviewexporterSettingsexporter{} (not implemented yet)exporterDialog

Filters what items will be included in the final export.
(Not fully implemented yet.)

exporterSettingsBetween folder and text:exporterSettingsBetween folders:exporterSettingsBetween text and folder:exporterSettingsBetween texts:exporterSettingsContentexporterSettingsCustomexporterSettingsCustom replacements:exporterSettings6Decide here what will be included in the final export.exporterSettings Empty lineexporterSettingsEnabledexporterSettingsFi<ersexporterSettingsFolderexporterSettingsFontexporterSettings Font size:exporterSettingsFont:exporterSettingsFormexporterSettingsI need more granularityexporterSettingsZIf checked, uses regular expression for replacement. If unchecked, replaced as plain text.exporterSettings)Ignore compile status (include all items)exporterSettingsLabelsexporterSettingsPreviewexporterSettingsRegExpexporterSettingsRemove multiple spacesexporterSettingsReplaceexporterSettingsReplace --- with —exporterSettingsReplace ... with …exporterSettingsReplace double quotes (") with:exporterSettingsReplace single quotes (') with:exporterSettings SeparationsexporterSettingsStatusexporterSettings Subitems of:exporterSettingsTextexporterSettingsTitleexporterSettingsTransformationsexporterSettingsTypeexporterSettingsTypographic replacements:exporterSettingsWithexporterSettings{}Level {} folderexporterSettings{}Level {} textexporterSettingsRequires: exportersManagerStatus: uninstalled.exportersManagerCustomexportersManager InstalledexportersManager Not foundexportersManagerSet {} executable path.exportersManager/{} not found. Install it, or set path manually.exportersManager FrequencyfrequencyAnalyzerPhrasesfrequencyAnalyzerWordfrequencyAnalyzerClockfullScreenEditorClock: Show SecondsfullScreenEditor NavigationfullScreenEditorNew TextfullScreenEditorProgressfullScreenEditorProgress: Auto Show/HidefullScreenEditor SpellcheckfullScreenEditorTheme selectorfullScreenEditorTheme:fullScreenEditorTitlefullScreenEditorTitle: Show Full PathfullScreenEditor Word countfullScreenEditor{} wordsfullScreenEditor {} words / {}fullScreenEditorGeneralgeneralSettingsImport in a top-level foldergeneralSettings Import under:generalSettingsSplit scenes at:generalSettingsTrim long titles (> 32 chars)generalSettings\n---\ngeneralSettings8If you don't wanna see me, you can hide me in Help menu. helpLabel Choose fileimporter Clear fileimporterFormat:importerImportimporterPreviewimporterSettingsimporter$Last accessed directory "{}" loaded.lastAccessedDirectoryInfoVarious lineEditView minuteslocker wordslockerFormlockerLock !locker Lock screen:locker Time targetlocker Word targetlocker {} remaininglocker{} s.locker{} words remaininglocker{}:{}locker~{} h.locker~{} mn.lockerAlt+Up mainEditorF11 mainEditorForm mainEditorGo to parent item mainEditor Index cards mainEditorOutline mainEditorRoot mainEditorText mainEditor {} words  mainEditor{} words / {}  mainEditorMarkdownmarkdownSettingsForm metadataView Full summary metadataViewNotes / References metadataViewOne line summary metadataView Properties metadataView Revisions metadataViewSummary metadataView Auto-hidemyPanel&Copy outlineBasics&Delete outlineBasics&Paste outlineBasics&Rename outlineBasicsD

You're about to delete {} item(s).

Are you sure?

 outlineBasicsAbout to remove outlineBasicsUnknown reference: {}. references Basic info referencesCharacter: {} references Characters referencesConflict references Description references Detailed info referencesEpiphany referencesFolder: {} references Go to {}. referencesGoal referencesLabel: references Long summary: referencesLonger summary references Motivation referencesNot a reference: {}. referencesNotes: referencesPOV of: referencesPOV: referencesPassion referencesPath: referencesPlot: {} referencesReferenced in: referencesResolution steps referencesResult references Short summary referencesShort summary: referencesStats: referencesStatus: referencesText: {} referencesUnknown reference: {}. referencesWorld: {name}{path} references 1 day ago revisions Clear all revisionsDelete revisionsForm revisionsLine {}: revisionsOptions revisionsRestore revisionsShow ancient version revisionsShow modifications revisionsShow modifications only revisions Show spaces revisions {} days ago revisions {} hours ago revisions{} minutes ago revisions {} months ago revisions{} seconds ago revisions {} years ago revisionsAllsearchCase sensitivesearchFormsearchLabelsearchNotessearchOptions:searchPOVsearch Search for...search Search in:searchStatussearchSummarysearchTextsearchTitlesearch (read-only)settingsWindowErrorsettingsWindow"Image files (*.jpg; *.jpeg; *.png)settingsWindow New labelsettingsWindow New statussettingsWindow New themesettingsWindow Open ImagesettingsWindow Unable to add selected image: {}settingsWindowUnable to load selected filesettingsWindownewthemesettingsWindowForm sldImportanceMain sldImportanceMinor sldImportance Secondary sldImportance TextLabel sldImportance

Split selected item(s) at the given mark.

If one of the selected item is a folder, it will be applied recursively to all of it's children items.

The split mark can contain following escape sequences:

  • \n: line break
  • \t: tab

Mark:

 splitDialog Split '{}' splitDialog Split items splitDialogForm storylineViewShow Characters storylineView Show Plots storylineView Close split tabSplitter!Open selected items in that view. tabSplitterSplit horizontally tabSplitterSplit vertically tabSplitterVarious textEditViewCTRL+B textFormatCTRL+E textFormatCTRL+I textFormatCTRL+J textFormatCTRL+L textFormatCTRL+P textFormatCTRL+R textFormatCTRL+U textFormatForm textFormat Collapse AlltreeView Collapse {}treeView Expand AlltreeView Expand {}treeView1welcome#Total: {} words (~ {} pages)welcome Add levelwelcomeAdd word countwelcomeBookwelcomeChapterwelcomeCreatewelcomeCreate New Projectwelcome Demo projectswelcomeEmptywelcome Empty fictionwelcomeEmpty non-fictionwelcomeFictionwelcomeFinalwelcome First draftwelcomeFormwelcomeIdeawelcome ManuskriptwelcomeManuskript project (*.msk)welcome)Manuskript project (*.msk);;All files (*)welcome*Next time, automatically open last projectwelcome Non-fictionwelcomeNotewelcomeNovelwelcomeNovellawelcome Open projectwelcomeOpen...welcomeOverwrite existing project {} ?welcomeRecentwelcomeResearchwelcomeResearch paperwelcomeSave project as...welcomeScenewelcome Second draftwelcomeSectionwelcome Short Storywelcome SomethingwelcomeTODOwelcome TemplateswelcomeTextwelcomeTrilogywelcomeWarningwelcomeofwelcome words each.welcome Architecture worldModel Astronomy worldModelBodily language worldModelCalendar worldModelClimate worldModel Courtship worldModelCultural worldModelCustoms worldModel Demography worldModelDiseases worldModelDresses worldModel Education worldModelEthics worldModelFantasy world building worldModelFlora worldModelFood worldModel Gender roles worldModel Government worldModelHistory worldModelImportant objects worldModelImportant places worldModel Languages worldModel Magic system worldModelMagical objects worldModelMagical places worldModel Magical races worldModelMedicine worldModelMilitary worldModelMusic and arts worldModelNatural resources worldModelNew item worldModelOrganisation Organization worldModelPhysical worldModelPolitics worldModelRaces worldModelReligion worldModelRules worldModelScience worldModel Technology worldModel Topography worldModelTransportation worldModel Wild life worldModelmanuskript-0.10.0/i18n/manuskript_en_GB.ts000066400000000000000000005053171354442177200203670ustar00rootroot00000000000000 Export Standalone document (not just a fragment) Include a table of contents. Number of sections level to include in TOC: Typographically correct output Normalize the document (cleaner) Normalise the document (cleaner) Specify the base level for headers: Disable YAML metadata block. Use that if you get YAML related error. Use reference-style links instead of inline links Use ATX-style headers Self-contained HTML files, with no dependencies Use <q> tags for quotes in HTML LaTeX engine used to produce the PDF. Convert to ePUB3 Paper size: Font size: Class: Line spacing: Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. Preview with highlighter. A little known format modestly used. You know, web sites for example. Books that don't kill trees. OpenDocument format. Used by LibreOffice for example. Microsoft Office (.docx) document. Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. reStructuredText is a lightweight markup language. LaTeX is a word processor and document markup language used to create beautiful documents. The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. Needs LaTeX to be installed. a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> Error Basic HTML output using the Python module 'markdown'. Python module 'markdown'. Markdown source HTML Source HTML Output Plain text Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. Default exporter, provides basic formats used by other exporters. Could not process regular expression: {} Choose output file… ExportersManager Manage Exporters Manuskript Description Offers export to Status Status: Version: Path: ... {HelpText} FrequencyAnalyzer Frequency Analyzer Frequency Analyser Word frequency = Settings Minimum size: Exclude words (comma separated): Analyze Analyse Phrase frequency Number of words: from to Import Markdown import <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; Folder import <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> Include only those extensions: Comma separated values Sort items by name Import folder then files OPML Import File open failed. This does not appear to be a valid OPML file. Pandoc import <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; Import using: Wrap lines: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> Mind Map Import This does not appear to be a valid Mind Map file. Mind Map import Import tip as: Untitled MDEditCompleter Insert reference MainWindow General Book information Title Subtitle Series Volume Genre License Licence Author Name Email Summary Situation: Summary: One sentence One paragraph One page Full One sentence summary One paragraph summary Expand each sentence of your one paragraph summary to a paragraph One page summary Full summary Next What if...? Characters Names Filter Basic info Motivation Goal Conflict Epiphany <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> Importance Notes Detailed info Plots Plot Character(s) Description Result Resolution steps Add plot step Remove selected plot step(s) World Populates with empty data More Source of passion Source of conflict Outline Editor Debug FlatData Persos Labels &File &Recent &Help &Tools &Edit &Format &Header &View &Mode Organi&ze Organi&se &Cheat sheet Sea&rch &Navigation &Open Ctrl+O &Save Ctrl+S Sa&ve as... Ctrl+Shift+S &Quit Ctrl+Q &Show help texts Ctrl+Shift+B &Spellcheck F9 &Labels... &Status... Tree &Simple &Fiction Index cards S&ettings F8 &Close project Co&mpile F6 &Frequency Analyzer &Frequency Analyser &About About Manuskript &Import… F7 &Copy Ctrl+C C&ut Ctrl+X &Paste Ctrl+V &Split… Ctrl+Shift+K Sp&lit at cursor Ctrl+K M&erge Ctrl+M Dupl&icate &Delete Del &Move Up Ctrl+Shift+Up M&ove Down Ctrl+Shift+Down &Rename F2 &Level 1 (setext) Ctrl+Alt+1 Level &2 Ctrl+Alt+2 Level &1 (atx) Ctrl+1 L&evel 2 Ctrl+2 Level &3 Ctrl+3 Level &4 Ctrl+4 Level &5 Ctrl+5 Level &6 Ctrl+6 &Bold Ctrl+B &Italic Ctrl+I &Strike &Verbatim Su&perscript Ctrl++ Subsc&ript Ctrl+- Co&mment block Ctrl+Shift+C Clear &formats Ctrl+0 &Comment line(s) Ctrl+D &Ordered list &Unordered list B&lockquote The file {} does not exist. Has it been moved or deleted? Manuskript Project {} saved. WARNING: Project {} not saved. Project {} loaded. Project {} loaded with some errors: * {} wasn't found in project file. Project {} loaded with some errors. (~{} pages) Words: {}{} Book summary Project tree Metadata Story line Enter information about your book, and yourself. The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Create your characters. Develop plots. Build worlds. Create hierarchy of broad categories down to specific details. Create the outline of your masterpiece. Write. Debug info. Sometimes useful. Dictionary Install {}{} to use spellcheck {} has no installed dictionaries {}{} is not installed Nothing POV Label Progress Compile Icon color Icon colour Text color Text colour Background color Background colour Icon Text Background Border Corner Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings Settings General Revisions Views Labels Status Fullscreen General settings Application settings Style: Language: Font size: Restarting Manuskript ensures all settings take effect. Loading Automatically load last project on startup Saving Automatically save every minutes. If no changes during seconds. Save on project close <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> Save to one single file Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. Keep revisions S&mart remove Keep: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. revisions per day for the last month revisions per minute for the last 10 minutes revisions per hour for the last day revisions per 10 minutes for the last hour revisions per week till the end of time Views settings Tree Colors Colours Icon color: Icon colour: Nothing POV Label Progress Compile Text color: Text colour: Background color: Background colour: Icon Size TextLabel Folders Show ite&m count Show &word count S&how progress Show summar&y &Nothing Text &Show word count Show p&rogress Show summary Outline Visible columns Goal Word count Percentage Title Index cards Background Color: Colour: Ctrl+S Image: Style Old st&yle &New style Item colors Item colours Border color: Border colour: Corner color: Corner colour: Text editor Background: Transparent Restore defaults Font Family: Size: Misspelled: Text area Max width px Left/Right margins: Top/Bottom margins: Paragraphs Alignment: Left Center Centre Right Justify Line spacing: Single 1.5 lines Double Proportional % Tab width: Indent 1st line Spacing: Cursor Use block insertion of Disable blinking Typewriter mode Focus mode None Sentence Line Paragraph New Edit Delete Theme name: Apply Cancel Window Background Text Background Text Options Paragraph Options Type: No Image Tiled Centered Centred Stretched Scaled Zoomed Opacity: Position: Width: Corner radius: Margins: Padding: Font: Alignment <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions &Add to dictionary &Remove from custom dictionary about About Manuskript Manuskript aboutDialog Version Software Versions in Use: abstractModel Title POV Label Status Compile Word count Goal basicItemView Form POV: Goal: Word count One line summary Few sentences summary: characterModel New character Name Value characterTreeView Main Secondary Minor cheatSheet Form Filter (type the name of anything in your project) Minor Secondary Main Characters Texts Plots World cmbOutlineCharacterChoser None Main Secondary Minor Various cmbOutlineLabelChoser Various cmbOutlineStatusChoser Various collapsibleDockWidgets Dock Widgets Toolbar completer Form corkDelegate One line summary Full summary editorWidget_ui Form exporter Export Export to: Manage exporters Preview Settings exporterDialog {} (not implemented yet) exporterSettings Form Content Decide here what will be included in the final export. Type Title Text I need more granularity Fi&lters <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> Ignore compile status (include all items) Subitems of: Labels Status Separations Between folders: Empty line Custom Between texts: Between folder and text: Between text and folder: Transformations Typographic replacements: Replace ... with … Replace --- with — Replace double quotes (") with: Replace single quotes (') with: Remove multiple spaces Custom replacements: Enabled Replace With RegExp If checked, uses regular expression for replacement. If unchecked, replaced as plain text. Preview Font Font: Font size: Folder {}Level {} folder {}Level {} text exportersManager Installed Custom Not found {} not found. Install it, or set path manually. <b>Status:</b> uninstalled. <b>Requires:</b> Set {} executable path. frequencyAnalyzer Phrases Frequency Word fullScreenEditor Theme: Spellcheck Navigation New Text Title Title: Show Full Path Theme selector Word count Progress Progress: Auto Show/Hide Clock Clock: Show Seconds {} words / {} {} words generalSettings General Split scenes at: \n---\n Trim long titles (> 32 chars) Import under: Import in a top-level folder helpLabel If you don't wanna see me, you can hide me in Help menu. importer Import Format: Choose file Clear file Preview Settings lastAccessedDirectoryInfo Last accessed directory "{}" loaded. lineEditView Various locker Form Lock screen: Word target Time target words minutes Lock ! ~{} h. ~{} mn. {}:{} {} s. {} remaining {} words remaining mainEditor Form Go to parent item Alt+Up Text Index cards Outline F11 Root {} words / {} {} words markdownSettings Markdown metadataView Form Properties Summary One line summary Full summary Notes / References Revisions myPanel Auto-hide outlineBasics New Root Open {} items in new tabs Open {} in a new tab New &Folder New &Text C&ut &Copy &Paste &Delete &Rename Set POV None Main Secondary Minor Set Status Set Label Set Custom Icon Restore to default About to remove <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> Select at least two items. Folders are ignored. All items must be on the same level (share the same parent). outlineCharacterDelegate None Main Secondary Minor outlineItem {} words / {} ({}) {} words pandocSettings General Table of Content Custom settings for {} persosProxyModel Main Secondary Minors plotDelegate General Promise Problem Progress Resolution Try / Fail No and Yes but Freytag's pyramid Exposition Rising action Climax Falling action Three acts 1. Setup 1. Inciting event 1. Turning point 2. Choice 2. Reversal 2. Disaster 3. Stand up 3. Climax 3. Ending Hero's journey Ordinary world Call to adventure Refusal of the call Meeting with mentor Crossing the Threshold Tests Approach Abyss Reward / Revelation Transformation Atonement Return plotModel New plot Name Meta New step Main Secondary Minor plotTreeView Main Secondary Minor **Plot:** {} plotsProxyModel Main Secondary Minors propertiesView Form POV Status Label Compile Goal Word count references Not a reference: {}. Unknown reference: {}. Path: Stats: POV: Status: Label: Short summary: Long summary: Notes: Basic info Detailed info POV of: Go to {}. Motivation Goal Conflict Epiphany Short summary Longer summary Description Result Characters Resolution steps Passion <b>Unknown reference:</b> {}. Folder: <b>{}</b> Text: <b>{}</b> Character: <b>{}</b> Plot: <b>{}</b> World: <b>{name}</b>{path} Referenced in: revisions Form Options Restore Delete Show modifications Show ancient version Show spaces Show modifications only {} years ago {} months ago {} days ago 1 day ago {} hours ago {} minutes ago {} seconds ago Line {}: Clear all search Form Search for... Search in: All Title Text Summary Notes POV Status Label Options: Case sensitive settingsWindow Open Image Image files (*.jpg; *.jpeg; *.png) Error Unable to load selected file Unable to add selected image: {} New status New label newtheme New theme (read-only) sldImportance Form TextLabel Minor Secondary Main splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> Split '{}' Split items storylineView Form Show Plots Show Characters tabSplitter Open selected items in that view. Split horizontally Close split Split vertically textEditView Various textFormat Form CTRL+B CTRL+I CTRL+U CTRL+P CTRL+L CTRL+E CTRL+R CTRL+J treeView Expand {} Collapse {} Expand All Collapse All welcome Form 1 Templates Empty Novel Novella Short Story Research paper Demo projects Add level Add word count Next time, automatically open last project Open... Recent Create Open project Manuskript project (*.msk);;All files (*) Save project as... Manuskript project (*.msk) Manuskript Create New Project Warning Overwrite existing project {} ? Empty fiction Chapter Scene Trilogy Book Section Empty non-fiction words each. of Text Something <b>Total:</b> {} words (~ {} pages) Fiction Non-fiction Idea Note Research TODO First draft Second draft Final worldModel New item Fantasy world building Physical Climate Topography Astronomy Natural resources Wild life Flora History Races Diseases Cultural Customs Food Languages Education Dresses Science Calendar Bodily language Ethics Religion Government Politics Gender roles Music and arts Architecture Military Technology Courtship Demography Transportation Medicine Magic system Rules Organization Organisation Magical objects Magical places Magical races Important places Important objects manuskript-0.10.0/i18n/manuskript_es.qm000066400000000000000000002355601354442177200200130ustar00rootroot00000000000000{L`TT~VEcVEVEeVEVsdd)QdέdnsHr>e J{DBZ*$=U*y>v*y*>*%?G*0@S+EA+fB*+B+C{+F.3G093';-A[6G:@GHw9zJUqL7WLG Lb5LbM|M6,Mez|Mez+MŅ[NWTQ:>Rx]]RxtRxDRxRxTbDTb4TbpTb{TbTb<TbTbgT`Uja2UjUlV':tV!VW6dVW6bXyGXYEKYYȀWZZ%ZʳyZϳ[[ %r[ %[ %[ %{[ %ĸ[ %@[ٵ;\\\\^i$s^i$gUn\j9^s-s#`8(YBw=r1ofF4~ `_w .G@n$tDHID"sy-  NEP2*i 5MtV_3y6ݰHʯlMI{Ln'YA9 FzY;^;Bgq hzO~hʲqZ8u"=BiPDޠf3E?# #ҳP.²%_$M[D>#N~L_0W>N1v 3tc=ML#UAI]V2W]1}"^bhi@:.tRW F.]etfk.H(^X+ʶ'$&)%!J̓'1s!x`ȳƩ%&n0JETFN^_aNFlwpAl.mNq0crwbapY0y֣ ֝cYރI>:1 Z 2?!a7X Iǹ#t)H0e1D1~hG4׎N~l@rJ;ru?ySЂIϗ`ϗTϗ7H@ES3` LFukM_°^rÈvM[(dУiY sM˜ qLGS!jơ,N3  [7Bn&BL HAE##MP[5j$]*{}b hf~2L~2~2~mZ6ZQϔڬai(SnT^uyD~@'Xʶ˙Dzvyz .N  σf F> HZ +4" ?:E Mg MgVW Mg T X;k ^d ^ ^F ^ g: r,| x tb zx IgK 4  -ń i %j  U U շ z C O z % ?@ 08 3 9s\ 9s% 9sC >ck A^ Rb`C Z dpeM dpe}@ dpe dpe d)y d) d) d)* d)M d)ݯ d) d) d) d) e luIG n- o"`E }( ! T` B;&T f} *+ :"a : ,> ,0 8k 8ш 8 ʶd ֓?{ UH N D z@ { 9WL J @ ; #eѾ F.m Q84 U~6 ]Yf l: m^V s3 }j$b % . tC HCA Hҝ  fic 5  J kW  GD L& ڔ6 5E uJ 5 YV _H ; iC ӨS/ y W!    R= /u 1U 4  ;/ =fj Cjk G Nr S Z Z$| bd i?f pk_ rIj }5 !T W =E A 8 y  K  )Ò ޔ W x$ " s S ` 'jQ _ $!\ $_ $ $G nZ ,d %9 #ht s%| s s s ɠ ^ ^H ^ ^ ^ ̺]& C, u s ? R QN    J .% zZ}t 0  4}$ 5N 87>K; DYSg DYS DYT; DZT~ J> K_ b i8:i c^ P .: S   а ^ ) 0z0 Ğt= <[ < < <ܰ < a ⋙a eY' j uYE~2#2)L6eJ9b(<+HfI6Oq<UhQWGyT[[ $y0$Wj{kV̺}aQ4bQq  "Ue% S; =Qm>bB3BxS6Qy R_JR_d@\fqlp#t7C|oN,~`A~`ۗG"|:"|ii~Ml]tty:AP i8_i!<p>Convertidor de documentos universal. Se puede utilizar para convertir markdown a un amplio conjunto de otros formatos.</p> <p>Web: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> 

A universal document converter. Can be used to convert markdown to a wide range of other formats.

Website: http://pandoc.org/

ExportUn formato poco conocido utilizado modestamente. Ya sabes, pginas web, por ejemplo.EA little known format modestly used. You know, web sites for example.ExportSalida en HTML bsico que utiliza el mdulo de Python 'markdown'.5Basic HTML output using the Python module 'markdown'.Export8Libros que no matan rboles.Books that don't kill trees.Export Clase:Class:Export"Convierte a ePUB3Convert to ePUB3ExportExportador por defecto, proporciona los formatos bsicos que utilizan otros exportadores.ADefault exporter, provides basic formats used by other exporters.ExportDeshabilita el bloque de metadatos YAML. selo si recibe errores de YAML.DDisable YAML metadata block. Use that if you get YAML related error.Export ErrorErrorExportExportar a markdown utilizando pandoc. Permite ms opciones de formateo que el exportador bsico de manuskript.hExport to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter.Export"Tamao de fuente: Font size:ExportSalida HTML HTML OutputExportFuente HTML HTML SourceExport>Incluye una tabla de contenido.Include a table of contents.ExportEs como el texto plano, excepto que aade ttulos de markdown. Presupone que el texto est formateado en markdown.Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown.ExportVMotor LaTeX utilizado para producir el PDF.%LaTeX engine used to produce the PDF.ExportDLaTeX es un procesador de texto y lenguaje de marcado de documentos utilizado para crear documentos de gran calidad.LaTeX is a word processor and document markup language used to create beautiful documents.Export&Espaciado de lnea: Line spacing:ExportFuente MarkdownMarkdown sourceExportbDocumento en formato de Microsoft Office (.docx)."Microsoft Office (.docx) document.ExportDNecesita que LaTeX est instalado.Needs LaTeX to be installed.ExportFNormalizar el documento (ms claro) Normalize the document (cleaner)ExportNmero de niveles de seccin a incluir en la tabla de contenido: ,Number of sections level to include in TOC: ExportzFormato OpenDocument. Utilizado por LibreOffice, por ejemplo.5OpenDocument format. Used by LibreOffice for example.Export"Tamao del papel: Paper size:ExportTexto plano Plain textExportTPrevisualizacin con Markdown Highlighter.Preview with highlighter.Export8Mdulo de Python 'markdown'.Python module 'markdown'.ExportpFicheros HTML auto-contenidos, sin dependencias externas/Self-contained HTML files, with no dependenciesExportvLa exportacin ms simple, a texto plano. Permite utilizar un formato de marcado propio, no conocido por manuskript. Por ejemplo <a href='www.fountain.io'>Fountain</a>.Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example Fountain.ExportbEspecificar el nivel de inicio de las cabeceras: $Specify the base level for headers: ExportRDocumento autnomo (no solo un fragmento))Standalone document (not just a fragment)Export0El propsito de este formato es proporcionar una manera de intercambiar informacin entre outliners y servicios de Internet que puedan ser explorados o controlados a travs de un outliner.The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner.Export@Salida tipogrficamente correctaTypographically correct outputExportXUtiliza etiquetas <q> para las citas en HTMLUse tags for quotes in HTMLExport4Utiliza cabeceras tipo ATXUse ATX-style headersExportUsar referencias para los enlaces en lugar de integrados en el texto1Use reference-style links instead of inline linksExportuna instalacin de LaTeX vlida. Vea las recomendaciones de pandoc en: <a href="http://pandoc.org/installing.html">http://pandoc.org/installing.html</a>. Si desea soporte Unicode, necesitar XeLaTeX.a valid LaTeX installation. Pandoc recommendations can be found on: pandoc.org/installing.html. If you want Unicode support, you need XeLaTeX.ExportdreStructuredText es un lenguaje de marcado ligero.2reStructuredText is a lightweight markup language.Export......ExportersManagerDescripcin DescriptionExportersManager@Configura mdulos de exportacinManage ExportersExportersManagerManuskript ManuskriptExportersManager"Ofrece exportar aOffers export toExportersManager Ruta:Path:ExportersManager EstadoStatusExportersManagerEstado:Status:ExportersManagerVersin:Version:ExportersManager{TextoDeAyuda} {HelpText}ExportersManagerAnalizarAnalyzeFrequencyAnalyzerRPalabras a excluir (separadas por comas): Exclude words (comma separated):FrequencyAnalyzer2Analizador de FrecuenciasFrequency AnalyzerFrequencyAnalyzerTamao mnimo: Minimum size:FrequencyAnalyzer2Numero de palabras: desdeNumber of words: fromFrequencyAnalyzer(Frecuencia de frasesPhrase frequencyFrequencyAnalyzerPreferenciasSettingsFrequencyAnalyzer,Frecuencia de palabrasWord frequencyFrequencyAnalyzer hastatoFrequencyAnalyzerN<b>Info:</b> Un analizador muy sencillo que recorre un documento markdown y crea elementos para cada ttulo.<br/>&nbsp;Info: A very simple parser that will go through a markdown document and create items for each titles.
 Import<b>Info:</b> Manuskript puede importar desde <b>markdown</b> u <b>OPML</b>. Pandoc convertir tu documento a uno de ellos (ver la opcin de debajo), y despus se importar en manuskript. Dependiendo de tu documento podras obtener mejores resultados con uno u otro. <br/>&nbsp;}Info: Manuskript can import from markdown or OPML. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document.
 Import<p><b>Info:</b> Importa la estructura completa de un directorio. Las carpetas se aaden como carpetas, y los ficheros de texto plano contenidos (eliges cuales por su extensin) se aaden como escenas.</p> <p>Slo se soportan ficheros de texto (no imgenes, binarios ni otros).</p>R

Info: Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.

Only text files are supported (not images, binary or others).

Import<p>Debera insertar pandoc saltos de lnea cosmticos / no-semnticos?</p><p> <b>auto</b>: salto a los 72 caracteres.<br> <b>none</b>: sin ajuste de lnea.<br> <b>preserve</b>: intenta conservar los ajustes de lnea del documento original.</p>Q

Should pandoc create cosmetic / non-semantic line-breaks?

auto: wraps at 72 characters.
none: no line wrap.
preserve: tries to preserves line wrap from the original document.

Import6Valores separados por comasComma separated valuesImport<Fall la apertura del fichero.File open failed.Import Importar carpeta Folder importImportBImportar carpeta con sus ficherosImport folder then filesImport4Importar sugerencias como:Import tip as:Import Importar usando: Import using:Import>Incluir slo estas extensiones:Include only those extensions:Import"Importar markdownMarkdown importImport"Importar Mind MapMind Map ImportImport"Importar Mind MapMind Map importImportImportar OPML OPML ImportImportImportar Pandoc Pandoc importImport8Ordenar elementos por nombreSort items by nameImportRNo parece ser un fichero Mind Map vlido.1This does not appear to be a valid Mind Map file.ImportJNo parece ser un fichero OPML vlido.-This does not appear to be a valid OPML file.ImportSin ttuloUntitledImportAjustar lineas: Wrap lines:Import&Insertar referenciaInsert referenceMDEditCompleter (~{} pginas) (~{} pages) MainWindow` * {} no se encontr en el archivo del proyecto.# * {} wasn't found in project file. MainWindow&Acerca de&About MainWindow&Negrita&Bold MainWindow&Gua rpida &Cheat sheet MainWindow &Cerrar proyecto&Close project MainWindow.&Lnea de comentario(s)&Comment line(s) MainWindow&Copiar&Copy MainWindowEliminar&Delete MainWindow&Editar&Edit MainWindow&Ficcin&Fiction MainWindow&Archivo&File MainWindow&Formato&Format MainWindow4A&nalizador de frecuencias&Frequency Analyzer MainWindow&Encabezado&Header MainWindow A&yuda&Help MainWindow&Importar & &Import… MainWindow&Cursiva&Italic MainWindow&Etiquetas... &Labels... MainWindow"&Nivel 1 (setext)&Level 1 (setext) MainWindow &Modo&Mode MainWindow Subir&Move Up MainWindow&Navegacin &Navigation MainWindow &Abrir&Open MainWindow&Lista ordenada &Ordered list MainWindow &Pegar&Paste MainWindow&Cerrar&Quit MainWindow&Recientes&Recent MainWindow&Renombrar&Rename MainWindow&Guardar&Save MainWindow(&Ver textos de ayuda&Show help texts MainWindow&Sencillo&Simple MainWindow,&Corrector Ortogrfico &Spellcheck MainWindowDividir & &Split… MainWindowE&stado... &Status... MainWindow&Tachado&Strike MainWindow&Herramientas&Tools MainWindow$&Lista no ordenada&Unordered list MainWindow&Literal &Verbatim MainWindow&Ver&View MainWindow<html><head/><body><p align="right">Resumen de<br/>un prrafo</p></body></html>O

One paragraph
summary

 MainWindow<html><head/><body><p align="right">Resumen de<br/>una frase</p></body></html>N

One sentence
summary

 MainWindow(Acerca de ManuskriptAbout Manuskript MainWindowLAadir un paso a la trama (CTRL+Intro) Add plot step MainWindow AutorAuthor MainWindowC&ita en bloque B&lockquote MainWindow Fondo Background MainWindowColor del FondoBackground color MainWindow*Informacines bsicas Basic info MainWindow.Informaciones del libroBook information MainWindow"Resumen del libro Book summary MainWindow BordeBorder MainWindowConstruir mundos. Crear una jerarqua desde categoras amplias hasta detalles especifcos.MBuild worlds. Create hierarchy of broad categories down to specific details. MainWindowC&ortarC&ut MainWindowPersonaje(s) Character(s) MainWindowPersonajes Characters MainWindow$Eliminar &formatosClear &formats MainWindow*Co&mentario en bloqueCo&mment block MainWindowC&ompilarCo&mpile MainWindowCompilarCompile MainWindowConflictoConflict MainWindowEsquinaCorner MainWindowFCrea el esquema de tu obra maestra.'Create the outline of your masterpiece. MainWindow(Crea tus personajes.Create your characters. MainWindow Ctrl++Ctrl++ MainWindow Ctrl+-Ctrl+- MainWindow Ctrl+0Ctrl+0 MainWindow Ctrl+1Ctrl+1 MainWindow Ctrl+2Ctrl+2 MainWindow Ctrl+3Ctrl+3 MainWindow Ctrl+4Ctrl+4 MainWindow Ctrl+5Ctrl+5 MainWindow Ctrl+6Ctrl+6 MainWindowCtrl+Alt+1 Ctrl+Alt+1 MainWindowCtrl+Alt+2 Ctrl+Alt+2 MainWindow Ctrl+BCtrl+B MainWindow Ctrl+CCtrl+C MainWindow Ctrl+DCtrl+D MainWindow Ctrl+ICtrl+I MainWindow Ctrl+KCtrl+K MainWindow Ctrl+MCtrl+M MainWindow Ctrl+OCtrl+O MainWindow Ctrl+QCtrl+Q MainWindow Ctrl+SCtrl+S MainWindowCtrl+Shift+B Ctrl+Shift+B MainWindowCtrl+Shift+C Ctrl+Shift+C MainWindow Ctrl+Mays+AbajoCtrl+Shift+Down MainWindowCtrl+Mays+K Ctrl+Shift+K MainWindowCtrl+Shift+S Ctrl+Shift+S MainWindow"Ctrl+Mays+Arriba Ctrl+Shift+Up MainWindow Ctrl+VCtrl+V MainWindow Ctrl+XCtrl+X MainWindowDepurarDebug MainWindowNDepura la informacin. A veces es til.Debug info. Sometimes useful. MainWindowSuprDel MainWindowDescripcin Description MainWindow0Informaciones detalladas Detailed info MainWindow,Desarrolla las tramas.Develop plots. MainWindowDiccionario Dictionary MainWindowDupl&icar Dupl&icate MainWindowRedaccinEditor MainWindow EmailEmail MainWindowvIntroduzca informacin acerca de tu libro y sobre ti mismo.0Enter information about your book, and yourself. MainWindowEpifanaEpiphany MainWindowxEn tu resumen de un prrafo expande cada frase en un prrafoAExpand each sentence of your one paragraph summary to a paragraph MainWindowF2F2 MainWindowF6F6 MainWindowF7F7 MainWindowF8F8 MainWindowF9F9 MainWindow FiltroFilter MainWindowDatos PlanosFlatData MainWindowCompletoFull MainWindow Resumen completo Full summary MainWindowGeneralGeneral MainWindow GneroGenre MainWindowObjetivoGoal MainWindow IconoIcon MainWindowColor del icono Icon color MainWindowImportancia Importance MainWindow Fichas Index cards MainWindowN&ivel 2L&evel 2 MainWindowEtiquetaLabel MainWindowEtiquetasLabels MainWindowNivel &1 (atx)Level &1 (atx) MainWindowNivel &2Level &2 MainWindowNivel &3Level &3 MainWindowNivel &4Level &4 MainWindowNivel &5Level &5 MainWindowNivel &6Level &6 MainWindowLicenciaLicense MainWindowCombinarM&erge MainWindow Bajar M&ove Down MainWindowManuskript Manuskript MainWindowMetadataMetadata MainWindowMsMore MainWindowMotivacin Motivation MainWindow NombreName MainWindowNombresNames MainWindowSiguienteNext MainWindow NotasNotes MainWindowNingunoNothing MainWindowUna pginaOne page MainWindow*Resumen de una pginaOne page summary MainWindowUn prrafo One paragraph MainWindow*Resumen de un prrafoOne paragraph summary MainWindowUna frase One sentence MainWindow(Resumen de una fraseOne sentence summary MainWindowOrgani&zar Organi&ze MainWindowEsquemaOutline MainWindowPOV MainWindowPersonajesPersos MainWindow TramaPlot MainWindow TramasPlots MainWindow0Rellena con datos vacosPopulates with empty data MainWindowProgresoProgress MainWindow$rbol del proyecto Project tree MainWindowPProyecto {} cargado con algunos errores.#Project {} loaded with some errors. MainWindowPProyecto {} cargado con algunos errores:#Project {} loaded with some errors: MainWindow(Proyecto {} cargado.Project {} loaded. MainWindow*Proyecto {} guardado.Project {} saved. MainWindowXEliminar el paso(s) seleccionado de la tramaRemove selected plot step(s) MainWindow0Pasos para la resolucinResolution steps MainWindowResultadoResult MainWindow&Preferencias S&ettings MainWindow G&uardar Como... Sa&ve as... MainWindow&BuscarSea&rch MainWindow SerieSeries MainWindowSituacin: Situation: MainWindow$Causa de conflictoSource of conflict MainWindow Fuente de pasinSource of passion MainWindow*Di&vidir en el cursorSp&lit at cursor MainWindowHistoria Story line MainWindowSu&perndice Su&perscript MainWindowSubn&dice Subsc&ript MainWindowSubttuloSubtitle MainWindowResumenSummary MainWindowResumen:Summary: MainWindowTmate tu tiempo para pensar en resumen de una linea (aprximadamente 50 palabras) de tu libro. Despus expndelo hasta un prrafo, despus hasta una pgina, y por ltimo hasta un resumen completo.Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. MainWindow TextoText MainWindowColor del texto Text color MainWindowLa situacin bsica en la forma de una pregunta tipo "Que pasara s...?'. Ej:"Que pasara si el ms peligroso hechicero malvado no pudiera ser capaz de matar un bebe?" (Harry Potter)The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) MainWindowjEl archivo {} no existe. Ha sido movido o eliminado?9The file {} does not exist. Has it been moved or deleted? MainWindow TtuloTitle MainWindow rbolTree MainWindowVolumenVolume MainWindowJADVERTENCIA: Proyecto {} no guardado.WARNING: Project {} not saved. MainWindow$Qu pasara si...? What if...? MainWindowPalabras: {}{} Words: {}{} MainWindow MundoWorld MainWindowEscribe.Write. MainWindow px pxSettings%%Settings&Nuevo estilo &New styleSettings&Ninguno&NothingSettings:&Mostrar recuento de palabras&Show word countSettings1.5 lineas 1.5 linesSettings`<html><head/><body><p>Si marcas esta opcin, tu proyecto se grabar en un nico archivo. Ms facil de copiar o guardar, pero no permitir edicin colaborativa o distintas versiones.<br/>Si est desmarcada, tu proyecto se grabar como una carpeta conteniendo multiples archivos pequeos.</p></body></html>

If you check this option, your project will be save as one single file. Easier to copy or backup, but does not allow collaborative editing, or versionning.
If this is unchecked, your project will be save as a folder containing many small files.

SettingsAlineamiento AlignmentSettingsAlineamiento: Alignment:Settings:Preferencias de la aplicacinApplication settingsSettingsAplicarApplySettingshCargar automticamente el ltimo proyecto al iniciar*Automatically load last project on startupSettings8Guardar automticamente cadaAutomatically save everySettings Fondo BackgroundSettings Color del fondo:Background color:Settings Fondo: Background:Settings Color del borde: Border color:SettingsCancelarCancelSettings CentroCenterSettingsCentradoCenteredSettings Color:Color:SettingsColoresColorsSettingsCompilarCompileSettings(Color de la esquina: Corner color:Settings(Radio de la esquina:Corner radius:Settings Ctrl+SCtrl+SSettings CursorCursorSettings BorrarDeleteSettings*Deshabilitar parpadeoDisable blinkingSettings DobleDoubleSettings EditarEditSettingsFamilia:Family:Settings Modo concentrado Focus modeSettingsCarpetasFoldersSettings FuenteFontSettings"Tamao de fuente: Font size:SettingsFuente:Font:Settings"Pantalla completa FullscreenSettingsGeneralGeneralSettings,Preferencias generalesGeneral settingsSettingsObjetivoGoalSettingsTamao de icono Icon SizeSettings Color del icono: Icon color:Settings2Si no hay cambios duranteIf no changes duringSettingsImagen:Image:Settings(Indentar la 1 lineaIndent 1st lineSettings Fichas Index cardsSettings,Color de los elementos Item colorsSettingsJustificacinJustifySettings(Almacenar revisionesKeep revisionsSettingsAlmacenar:Keep:SettingsEtiquetaLabelSettingsEtiquetasLabelsSettingsIdioma: Language:SettingsIzquierdaLeftSettings0Mrgenes izqdo./derecho:Left/Right margins:Settings LneaLineSettings&Espaciado de linea: Line spacing:SettingsCargandoLoadingSettingsMargenes:Margins:SettingsAnchura mxima Max widthSettingsErrata: Misspelled:Settings NuevoNewSettingsSin ImagenNo ImageSettingsNingunoNoneSettingsNingunoNothingSettingsEstilo antiguo Old st&yleSettingsOpacidad:Opacity:SettingsEsquemaOutlineSettingsPOVSettingsRelleno:Padding:SettingsPrrafo ParagraphSettings&Opciones de prrafoParagraph OptionsSettingsPrrafos ParagraphsSettingsPorcentaje PercentageSettingsPosicin: Position:SettingsProgresoProgressSettingsProporcional ProportionalSettingsEs posible que deba reiniciar manuskript para que esas preferencias surtan efecto de manera adecuada y completa.7Restarting Manuskript ensures all settings take effect.Settings8Restaura valores por defectoRestore defaultsSettingsRevisiones RevisionsSettingsLas revisiones son una manera de realizar un seguimiento de las modificaciones. Para cada elemento de texto, almacena cualquier cambio que hagas en el texto principal, permitindote ver y restaurar versiones anteriores.Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions.SettingsDerechaRightSettings Mostrar progresoS&how progressSettings(B&orrado inteligente S&mart removeSettings Guardar al salir Save on quitSettings6Guardar en un nico ficheroSave to one single fileSettingsGuardandoSavingSettingsEscaladoScaledSettings FraseSentenceSettingsPreferenciasSettingsSettings:Mostrar &recuento de palabrasShow &word countSettings0Ver nmero de ele&mentosShow ite&m countSettings"Muestra p&rogresoShow p&rogressSettingsMostrar resumen Show summar&ySettingsVer resumen Show summarySettingsSencillaSingleSettingsTamao:Size:SettingsEl borrado inteligente te permite almacenar solo un cierto nmero de revisiones. Se recomienda encarecidamente que lo uses, para que tu archivo no se llene de miles de cambios insignificantes.Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes.SettingsEspaciado:Spacing:Settings EstadoStatusSettingsAjustado StretchedSettings EstiloStyleSettingsEstilo:Style:Settings,Anchura del tabulador: Tab width:Settings TextoTextSettingsFondo del textoText BackgroundSettings"Opciones de texto Text OptionsSettingsrea de texto Text areaSettings Color del texto: Text color:SettingsEditor de texto Text editorSettingsEtiquetadeTexto TextLabelSettings Nombre del tema: Theme name:SettingsTileadoTiledSettings TtuloTitleSettings6Mrgenes superior/inferior:Top/Bottom margins:SettingsTransparente TransparentSettings rbolTreeSettings Tipo:Type:Settings0Modo mquina de escribirTypewriter modeSettings6Usar bloque de insercin deUse block insertion ofSettings VistasViewsSettings:Preferencias de visualizacinViews settingsSettings"Columnas visiblesVisible columnsSettingsAnchura:Width:Settings&Fondo de la ventanaWindow BackgroundSettings$Nmero de palabras Word countSettingsAgrandadoZoomedSettingsminutos.minutes.Settingsbrevisiones cada 10 minutos durante la ltima hora*revisions per 10 minutes for the last hourSettingsPrevisiones por da durante el ltimo mes$revisions per day for the last monthSettingsRrevisiones por hora durante el ltimo da#revisions per hour for the last daySettingshrevisiones por minuto durante los ltimos 10 minutos,revisions per minute for the last 10 minutesSettingsbrevisiones por semana hasta el fin de los tiempos'revisions per week till the end of timeSettingssegundos.seconds.Settings,&Aadir al diccionario&Add to dictionary SpellActionD&Eliminar del diccionario personal&Remove from custom dictionary SpellAction2Sugerencias de OrtografaSpelling Suggestions SpellAction(Acerca de ManuskriptAbout ManuskriptaboutManuskript Manuskriptabout:Versiones de software usadas:Software Versions in Use: aboutDialogVersinVersion aboutDialogCompilarCompile abstractModelObjetivoGoal abstractModelEtiquetaLabel abstractModelPDVPOV abstractModel EstadoStatus abstractModel TtuloTitle abstractModel$Nmero de palabras Word count abstractModel4Cargada la traduccin: {}.Loaded translation from {}: {}.appNota: No se ha encontrado traduccin o se ha cargado para el locale {}.:Note: No translator found or loaded from {} for locale {}.app:Resumen de unas pocas frases:Few sentences summary: basicItemViewFormularioForm basicItemView Meta:Goal: basicItemView(Resumen de una lneaOne line summary basicItemViewPOV: basicItemView$Nmero de palabras Word count basicItemView NombreNamecharacterModelNuevo personaje New charactercharacterModel ValorValuecharacterModelPrincipalMaincharacterTreeView MenorMinorcharacterTreeViewSecundario SecondarycharacterTreeViewPersonajes Characters cheatSheet~Filtro (escribe el nombre de cualquier elemento de tu proyecto)2Filter (type the name of anything in your project) cheatSheetFormularioForm cheatSheetPrincipalMain cheatSheet MenorMinor cheatSheet TramasPlots cheatSheetSecundario Secondary cheatSheet TextosTexts cheatSheet MundoWorld cheatSheetPrincipalMaincmbOutlineCharacterChoser MenorMinorcmbOutlineCharacterChoserNingunoNonecmbOutlineCharacterChoserSecundario SecondarycmbOutlineCharacterChoser VariosVariouscmbOutlineCharacterChoser VariosVariouscmbOutlineLabelChoser VariosVariouscmbOutlineStatusChoser8Anclar Barra de HerramientasDock Widgets ToolbarcollapsibleDockWidgetsFormularioForm completer Resumen completo Full summary corkDelegate(Resumen de una lneaOne line summary corkDelegateFormularioFormeditorWidget_uiExportarExportexporterExportar a: Export to:exporter@Gestionar mdulos de exportacinManage exportersexporterPrevisualizarPreviewexporterPreferenciasSettingsexporter0{} (sin implementar an){} (not implemented yet)exporterDialogn<html><head/><body><p>Filtra los elementos que se incluirn en la exportacin final.<br/><span style="color:#773333;">(An no est completamente desarrollado)</span></p></body></html>

Filters what items will be included in the final export.
(Not fully implemented yet.)

exporterSettings,Entre carpeta y texto:Between folder and text:exporterSettingsEntre carpetas:Between folders:exporterSettings,Entre texto y carpeta:Between text and folder:exporterSettingsEntre textos:Between texts:exporterSettingsContenidoContentexporterSettingsPersonalizadoCustomexporterSettings4Reemplazos personalizados:Custom replacements:exporterSettingsnDecide aqu lo que se incluir en la exportacin final.6Decide here what will be included in the final export.exporterSettingsLnea vaca Empty lineexporterSettingsHabilitadoEnabledexporterSettingsFi&ltrosFi<ersexporterSettingsCarpetaFolderexporterSettings FuenteFontexporterSettings"Tamao de fuente: Font size:exporterSettingsFuente:Font:exporterSettingsFormularioFormexporterSettings2Necesito ms granularidadI need more granularityexporterSettingsSi est marcado, usa una expresin regular para el reemplazo, si no, reemplaza como texto plano.ZIf checked, uses regular expression for replacement. If unchecked, replaced as plain text.exporterSettings|Ignorar el estado de compilacin (incluye todos los elementos))Ignore compile status (include all items)exporterSettingsEtiquetasLabelsexporterSettingsPrevisualizarPreviewexporterSettings"Expresin RegularRegExpexporterSettings6Eliminar espaciado mltipleRemove multiple spacesexporterSettingsReemplazarReplaceexporterSettings(Reemplazar --- con Replace --- with —exporterSettings,Reemplazar ... con ...Replace ... with …exporterSettingsFReemplazar comillas dobles (") con:Replace double quotes (") with:exporterSettingsHReemplazar comillas simples (') con:Replace single quotes (') with:exporterSettingsSeparadores SeparationsexporterSettings EstadoStatusexporterSettings Subelementos de: Subitems of:exporterSettings TextoTextexporterSettings TtuloTitleexporterSettings TransformacionesTransformationsexporterSettingsTipoTypeexporterSettings0Reemplazos tipogrficos:Typographic replacements:exporterSettingsConWithexporterSettings${}Nivel {} carpeta{}Level {} folderexporterSettings {}Nivel {} texto{}Level {} textexporterSettings$<b>Requiere: </b> Requires: exportersManager:<b>Estado: </b> sin instalar.Status: uninstalled.exportersManagerPersonalizadoCustomexportersManagerInstalado InstalledexportersManagerNo encontrado Not foundexportersManagerTEstablecer {} camino(path) del ejecutable.Set {} executable path.exportersManager{} no encontrado, instlalo, o establece el camino (path) manualmente./{} not found. Install it, or set path manually.exportersManagerFrecuencia FrequencyfrequencyAnalyzer FrasesPhrasesfrequencyAnalyzerPalabraWordfrequencyAnalyzerProgresoProgressfullScreenEditor Tema:Theme:fullScreenEditor TtuloTitlefullScreenEditor$Nmero de palabras Word countfullScreenEditor{} palabras{} wordsfullScreenEditor {} palabras / {} {} words / {}fullScreenEditorGeneralGeneralgeneralSettingsRImportar en una carpeta de nivel superiorImport in a top-level foldergeneralSettingsImportar bajo: Import under:generalSettings&Dividir escenas en:Split scenes at:generalSettingsRRecortar ttulos largos (> 32 caracteres)Trim long titles (> 32 chars)generalSettings\n---\n\n---\ngeneralSettingsnSi no quieres verme, puedes ocultarme en el men Ayuda.8If you don't wanna see me, you can hide me in Help menu. helpLabel&Seleccionar fichero Choose fileimporterBorrar fichero Clear fileimporterFormato:Format:importerImportarImportimporterPrevisualizarPreviewimporterPreferenciasSettingsimporter VariosVarious lineEditView minutos minuteslocker palabras wordslockerFormularioFormlocker Bloquear !Lock !locker$Bloquear pantalla: Lock screen:locker$Objetivo de tiempo Time targetlocker(Objetivo de palabras Word targetlocker{} restantes {} remaininglocker{} s.locker*{} palabras restantes{} words remaininglocker{}:{}locker ~{} h.~{} h.locker~{} mn.lockerAlt+ArribaAlt+Up mainEditorF11 mainEditorFormularioForm mainEditor(Ir al elemento padreGo to parent item mainEditor Fichas Index cards mainEditorEsquemaOutline mainEditorRazRoot mainEditor TextoText mainEditor{} palabras  {} words  mainEditor"{} palabras / {} {} words / {}  mainEditorMarkdownMarkdownmarkdownSettingsFormularioForm metadataView Resumen completo Full summary metadataView&Notas / ReferenciasNotes / References metadataView(Resumen de una lneaOne line summary metadataViewPropiedades Properties metadataViewRevisiones Revisions metadataViewResumenSummary metadataViewAuto ocultar Auto-hidemyPanel&Copiar&Copy outlineBasicsEliminar&Delete outlineBasics &Pegar&Paste outlineBasics&Renombrar&Rename outlineBasics<p><b>Ests a punto de borrar {} elemento(s).</b></p><p>Ests seguro?</p>D

You're about to delete {} item(s).

Are you sure?

 outlineBasics"A punto de borrarAbout to remove outlineBasicsTodos los elementos deben estar al mismo nivel (tener el mismo padre).Referencia desconocida:</b> {}.Unknown reference: {}. references*Informaciones bsicas Basic info references(Personaje: <b>{}</b>Character: {} referencesPersonajes Characters referencesConflictoConflict referencesDescripcin Description references0Informaciones detalladas Detailed info referencesEpifanaEpiphany references$Carpeta: <b>{}</b>Folder: {} referencesIr a {}. Go to {}. referencesObjetivoGoal referencesEtiqueta:Label: referencesResumen largo: Long summary: referencesResumen largoLonger summary referencesMotivacin Motivation references2No es una referencia: {}.Not a reference: {}. references Notas:Notes: referencesPDV de:POV of: referencesPOV: references PasinPassion references Ruta:Path: references Trama: <b>{}</b>Plot: {} references Referenciado en:Referenced in: references0Pasos para la resolucinResolution steps referencesResultadoResult referencesResumen corto Short summary referencesResumen corto:Short summary: references Caractersticas:Stats: referencesEstado:Status: references Texto: <b>{}</b>Text: {} references6Referencia desconocida: {}.Unknown reference: {}. references4Mundo: <b>{name}</b>{path}World: {name}{path} referencesHace 1 da 1 day ago revisionsLimpiar todo Clear all revisions BorrarDelete revisionsFormularioForm revisionsLinea {}:Line {}: revisionsOpcionesOptions revisionsRestaurarRestore revisions&Ver versin antiguaShow ancient version revisions$Ver modificacionesShow modifications revisions.Ver slo modificacionesShow modifications only revisionsVer espacios Show spaces revisionsHace {} das {} days ago revisionsHace {} horas {} hours ago revisionsHace {} minutos{} minutes ago revisionsHace {} meses {} months ago revisions Hace {} segundos{} seconds ago revisionsHace {} aos {} years ago revisionsTodoAllsearchBDistingue maysculas y minsculasCase sensitivesearchFormularioFormsearchEtiquetaLabelsearch NotasNotessearchOpciones:Options:searchPOVsearchBuscar... Search for...searchBuscar en: Search in:search EstadoStatussearchResumenSummarysearch TextoTextsearch TtuloTitlesearch (slo lectura) (read-only)settingsWindow ErrorErrorsettingsWindowNueva etiqueta New labelsettingsWindowNuevo estado New statussettingsWindowNuevo Tema New themesettingsWindownuevotemanewthemesettingsWindowFormularioForm sldImportancePrincipalMain sldImportance MenorMinor sldImportanceSecundario Secondary sldImportanceEtiquetadeTexto TextLabel sldImportanceX <p>Divide los elemento(s) seleccionado(s) en la marca indicada.</p> <p>Si uno de los elementos seleccionados es una carpeta, se aplicar recursivamente a <i>todos</i> sus elementos hijos.</p> <p>La marca de divisin puede contener las siguientes secuencias de escape: <ul> <li><b><code>\n</code></b>: salto de lnea</li> <li><b><code>\t</code></b>: tabulador</li> </ul> </p> <p><b>Marca:</b></p> 

Split selected item(s) at the given mark.

If one of the selected item is a folder, it will be applied recursively to all of it's children items.

The split mark can contain following escape sequences:

  • \n: line break
  • \t: tab

Mark:

 splitDialogDividir '{}' Split '{}' splitDialog"Dividir elementos Split items splitDialogFormularioForm storylineViewVer PersonajesShow Characters storylineViewVer Tramas Show Plots storylineViewCerrar divisin Close split tabSplitter^Abre los elementos seleccionados en esta vista.!Open selected items in that view. tabSplitter.Dividir horizontalmenteSplit horizontally tabSplitter*Dividir verticalmenteSplit vertically tabSplitter VariosVarious textEditViewCTRL+B textFormatCTRL+E textFormatCTRL+I textFormatCTRL+J textFormatCTRL+L textFormatCTRL+P textFormatCTRL+R textFormatCTRL+U textFormatFormularioForm textFormatContraer Todo Collapse AlltreeViewContraer {} Collapse {}treeViewExpandir Todo Expand AlltreeViewExpandir {} Expand {}treeView11welcomeP<b>Total:</b> {} palabras (~ {} pginas)#Total: {} words (~ {} pages)welcomeAadir nivel Add levelwelcome6Aadir recuento de palabrasAdd word countwelcome LibroBookwelcomeCaptuloChapterwelcome CrearCreatewelcome.Crear un Proyecto NuevoCreate New Projectwelcome(Proyectos de ejemplo Demo projectswelcome VacaEmptywelcomeFiccin vaca Empty fictionwelcome No-Ficcin vacaEmpty non-fictionwelcomeFiccinFictionwelcome FinalFinalwelcomePrimer borrador First draftwelcomeFormularioFormwelcomeIdeawelcomeManuskript Manuskriptwelcome<Proyecto de Manuskript (*.msk)Manuskript project (*.msk)welcomelProyecto de Manuskript (*.msk);;Todos los ficheros (*))Manuskript project (*.msk);;All files (*)welcomepLa proxima vez, abrir el ltimo proyecto automticamente*Next time, automatically open last projectwelcomeNo-ficcin Non-fictionwelcomeNotaNotewelcome NovelaNovelwelcomeNovela CortaNovellawelcomeAbrir proyecto Open projectwelcomeAbrir...Open...welcomeJSobreescribir el proyecto existe {}?Overwrite existing project {} ?welcomeRecienteRecentwelcomeInvestigacinResearchwelcome2rticulo de investigacinResearch paperwelcome0Guardar proyecto como...Save project as...welcome EscenaScenewelcome Segundo borrador Second draftwelcomeSeccinSectionwelcome Cuento Short StorywelcomeAlgo SomethingwelcomePOR HACERTODOwelcomePlantillas Templateswelcome TextoTextwelcomeTrilogaTrilogywelcomeAdvertenciaWarningwelcomedeofwelcome$palabras cada una. words each.welcomeArquitectura Architecture worldModelAstronoma Astronomy worldModel"Lenguaje corporalBodily language worldModelCalendarioCalendar worldModel ClimaClimate worldModelCortejo Courtship worldModelCulturaCultural worldModelAduanasCustoms worldModelDemografa Demography worldModelEnfermedadesDiseases worldModelVestidosDresses worldModelEducacin Education worldModel ticaEthics worldModelDConstruccin del mundo de fantasaFantasy world building worldModel FloraFlora worldModel ComidaFood worldModelRoles de gnero Gender roles worldModelGobierno Government worldModelHistoriaHistory worldModel&Objetos importantesImportant objects worldModel&Lugares importantesImportant places worldModelIdiomas Languages worldModel Sistema de magia Magic system worldModelObjetos mgicosMagical objects worldModelLugares mgicosMagical places worldModelRazas mgicas Magical races worldModelMedicinaMedicine worldModelEjrcitosMilitary worldModelMsica y artesMusic and arts worldModel$Recursos naturalesNatural resources worldModelNuevo elementoNew item worldModelOrganizacin Organization worldModel FisicoPhysical worldModelPolticaPolitics worldModel RazasRaces worldModelReliginReligion worldModel ReglasRules worldModelCienciaScience worldModelTecnologa Technology worldModelTopografa Topography worldModel(Medios de transporteTransportation worldModelVida salvaje Wild life worldModelmanuskript-0.10.0/i18n/manuskript_es.ts000066400000000000000000005505051354442177200200230ustar00rootroot00000000000000 Export Default exporter, provides basic formats used by other exporters. Exportador por defecto, proporciona los formatos básicos que utilizan otros exportadores. Basic HTML output using the Python module 'markdown'. Salida en HTML básico que utiliza el módulo de Python 'markdown'. Python module 'markdown'. Módulo de Python 'markdown'. A little known format modestly used. You know, web sites for example. Un formato poco conocido utilizado modestamente. Ya sabes, páginas web, por ejemplo. <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> <p>Convertidor de documentos universal. Se puede utilizar para convertir markdown a un amplio conjunto de otros formatos.</p> <p>Web: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. Es como el texto plano, excepto que añade títulos de markdown. Presupone que el texto está formateado en markdown. Preview with highlighter. Previsualización con Markdown Highlighter. Plain text Texto plano Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. La exportación más simple, a texto plano. Permite utilizar un formato de marcado propio, no conocido por manuskript. Por ejemplo <a href='www.fountain.io'>Fountain</a>. Markdown source Fuente Markdown HTML Source Fuente HTML HTML Output Salida HTML Error Error Books that don't kill trees. Libros que no matan árboles. OpenDocument format. Used by LibreOffice for example. Formato OpenDocument. Utilizado por LibreOffice, por ejemplo. Microsoft Office (.docx) document. Documento en formato de Microsoft Office (.docx). Needs LaTeX to be installed. Necesita que LaTeX esté instalado. Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. Exportar a markdown utilizando pandoc. Permite más opciones de formateo que el exportador básico de manuskript. reStructuredText is a lightweight markup language. reStructuredText es un lenguaje de marcado ligero. LaTeX is a word processor and document markup language used to create beautiful documents. LaTeX es un procesador de texto y lenguaje de marcado de documentos utilizado para crear documentos de gran calidad. Standalone document (not just a fragment) Documento autónomo (no solo un fragmento) Include a table of contents. Incluye una tabla de contenido. Number of sections level to include in TOC: Número de niveles de sección a incluir en la tabla de contenido: Typographically correct output Salida tipográficamente correcta Normalize the document (cleaner) Normalizar el documento (más claro) Specify the base level for headers: Especificar el nivel de inicio de las cabeceras: Use reference-style links instead of inline links Usar referencias para los enlaces en lugar de integrados en el texto Use ATX-style headers Utiliza cabeceras tipo ATX Self-contained HTML files, with no dependencies Ficheros HTML auto-contenidos, sin dependencias externas Use <q> tags for quotes in HTML Utiliza etiquetas <q> para las citas en HTML LaTeX engine used to produce the PDF. Motor LaTeX utilizado para producir el PDF. Paper size: Tamaño del papel: Font size: Tamaño de fuente: Class: Clase: Line spacing: Espaciado de línea: a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. una instalación de LaTeX válida. Vea las recomendaciones de pandoc en: <a href="http://pandoc.org/installing.html">http://pandoc.org/installing.html</a>. Si desea soporte Unicode, necesitará XeLaTeX. The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. El propósito de este formato es proporcionar una manera de intercambiar información entre outliners y servicios de Internet que puedan ser explorados o controlados a través de un outliner. Disable YAML metadata block. Use that if you get YAML related error. Deshabilita el bloque de metadatos YAML. Úselo si recibe errores de YAML. Convert to ePUB3 Convierte a ePUB3 Could not process regular expression: {} Choose output file… ExportersManager Manage Exporters Configura módulos de exportación Manuskript Manuskript Description Descripción Offers export to Ofrece exportar a Status Estado Status: Estado: Version: Versión: Path: Ruta: ... ... {HelpText} {TextoDeAyuda} FrequencyAnalyzer Frequency Analyzer Analizador de Frecuencias Word frequency Frecuencia de palabras Settings Preferencias Minimum size: Tamaño mínimo: Exclude words (comma separated): Palabras a excluir (separadas por comas): Analyze Analizar Phrase frequency Frecuencia de frases Number of words: from Numero de palabras: desde to hasta Import Markdown import Importar markdown <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; <b>Info:</b> Un analizador muy sencillo que recorre un documento markdown y crea elementos para cada título.<br/>&nbsp; Folder import Importar carpeta <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> <p><b>Info:</b> Importa la estructura completa de un directorio. Las carpetas se añaden como carpetas, y los ficheros de texto plano contenidos (eliges cuales por su extensión) se añaden como escenas.</p> <p>Sólo se soportan ficheros de texto (no imágenes, binarios ni otros).</p> Include only those extensions: Incluir sólo estas extensiones: Comma separated values Valores separados por comas Sort items by name Ordenar elementos por nombre Import folder then files Importar carpeta con sus ficheros OPML Import Importar OPML File open failed. Falló la apertura del fichero. This does not appear to be a valid OPML file. No parece ser un fichero OPML válido. Pandoc import Importar Pandoc <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; <b>Info:</b> Manuskript puede importar desde <b>markdown</b> u <b>OPML</b>. Pandoc convertirá tu documento a uno de ellos (ver la opción de debajo), y después se importará en manuskript. Dependiendo de tu documento podrías obtener mejores resultados con uno u otro. <br/>&nbsp; Import using: Importar usando: Wrap lines: Ajustar lineas: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> <p>¿Debería insertar pandoc saltos de línea cosméticos / no-semánticos?</p><p> <b>auto</b>: salto a los 72 caracteres.<br> <b>none</b>: sin ajuste de línea.<br> <b>preserve</b>: intenta conservar los ajustes de línea del documento original.</p> Mind Map Import Importar Mind Map This does not appear to be a valid Mind Map file. No parece ser un fichero Mind Map válido. Mind Map import Importar Mind Map Import tip as: Importar sugerencias como: Untitled Sin título MDEditCompleter Insert reference Insertar referencia MainWindow General General Title Título Subtitle Subtítulo Series Serie Volume Volumen Genre Género License Licencia Author Autor Name Nombre Email Email Summary Resumen Situation: Situación: Summary: Resumen: One sentence Una frase One paragraph Un párrafo One page Una página Full Completo One sentence summary Resumen de una frase One paragraph summary Resumen de un párrafo Expand each sentence of your one paragraph summary to a paragraph En tu resumen de un párrafo expande cada frase en un párrafo One page summary Resumen de una página Full summary Resumen completo Next Siguiente What if...? Qué pasaría si...? Characters Personajes Names Nombres Filter Filtro Basic info Informaciónes básicas Importance Importancia Motivation Motivación Goal Objetivo Conflict Conflicto Epiphany Epifanía <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="right">Resumen de<br/>una frase</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> <html><head/><body><p align="right">Resumen de<br/>un párrafo</p></body></html> Notes Notas Detailed info Informaciones detalladas Plots Tramas Plot Trama Character(s) Personaje(s) Description Descripción Result Resultado Resolution steps Pasos para la resolución World Mundo Populates with empty data Rellena con datos vacíos More Más Source of passion Fuente de pasión Source of conflict Causa de conflicto Outline Esquema Editor Redacción Debug Depurar FlatData Datos Planos Persos Personajes Labels Etiquetas &File &Archivo &Recent &Recientes &Mode &Modo &Help A&yuda &Tools &Herramientas &View &Ver &Cheat sheet &Guía rápida Sea&rch &Buscar &Navigation &Navegación &Open &Abrir Ctrl+O Ctrl+O &Save &Guardar Ctrl+S Ctrl+S Sa&ve as... G&uardar Como... Ctrl+Shift+S Ctrl+Shift+S &Quit &Cerrar Ctrl+Q Ctrl+Q &Show help texts &Ver textos de ayuda Ctrl+Shift+B Ctrl+Shift+B &Spellcheck &Corrector Ortográfico F9 F9 &Labels... &Etiquetas... &Status... E&stado... Tree Árbol &Simple &Sencillo Index cards Fichas S&ettings &Preferencias F8 F8 &Close project &Cerrar proyecto Co&mpile C&ompilar F6 F6 &Frequency Analyzer A&nalizador de frecuencias &Fiction &Ficción Project {} saved. Proyecto {} guardado. Project {} loaded. Proyecto {} cargado. Project {} loaded with some errors: Proyecto {} cargado con algunos errores: * {} wasn't found in project file. * {} no se encontró en el archivo del proyecto. Project {} loaded with some errors. Proyecto {} cargado con algunos errores. (~{} pages) (~{} páginas) Words: {}{} Palabras: {}{} Book summary Resumen del libro Project tree Árbol del proyecto Metadata Metadata Story line Historia Enter information about your book, and yourself. Introduzca información acerca de tu libro y sobre ti mismo. The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) La situación básica en la forma de una pregunta tipo "¿Que pasaría sí...?'. Ej:"¿Que pasaría si el más peligroso hechicero malvado no pudiera ser capaz de matar un bebe?" (Harry Potter) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Tómate tu tiempo para pensar en resumen de una linea (apróximadamente 50 palabras) de tu libro. Después expándelo hasta un párrafo, después hasta una página, y por último hasta un resumen completo. Create your characters. Crea tus personajes. Develop plots. Desarrolla las tramas. Create the outline of your masterpiece. Crea el esquema de tu obra maestra. Write. Escribe. Debug info. Sometimes useful. Depura la información. A veces es útil. Dictionary Diccionario Nothing Ninguno POV Label Etiqueta Progress Progreso Compile Compilar Icon color Color del icono Text color Color del texto Background color Color del Fondo Icon Icono Text Texto Background Fondo Border Borde Corner Esquina &Edit &Editar Book information Informaciones del libro &About &Acerca de About Manuskript Acerca de Manuskript Manuskript Manuskript WARNING: Project {} not saved. ADVERTENCIA: Proyecto {} no guardado. Build worlds. Create hierarchy of broad categories down to specific details. Construir mundos. Crear una jerarquía desde categorías amplias hasta detalles especifícos. Add plot step Añadir un paso a la trama (CTRL+Intro) &Import… &Importar… F7 F7 &Copy &Copiar Ctrl+C Ctrl+C C&ut C&ortar Ctrl+X Ctrl+X &Paste &Pegar Ctrl+V Ctrl+V &Split… Dividir… Ctrl+Shift+K Ctrl+Mayús+K Sp&lit at cursor Di&vidir en el cursor Ctrl+K Ctrl+K Ctrl+M Ctrl+M Ctrl+D Ctrl+D Del Supr &Move Up Subir Ctrl+Shift+Up Ctrl+Mayús+Arriba M&ove Down Bajar Ctrl+Shift+Down Ctrl+Mayús+Abajo Dupl&icate Dupl&icar &Delete Eliminar &Rename &Renombrar F2 F2 Organi&ze Organi&zar M&erge Combinar &Format &Formato &Header &Encabezado &Level 1 (setext) &Nivel 1 (setext) Ctrl+Alt+1 Ctrl+Alt+1 Level &2 Nivel &2 Ctrl+Alt+2 Ctrl+Alt+2 Level &1 (atx) Nivel &1 (atx) Ctrl+1 Ctrl+1 L&evel 2 N&ivel 2 Ctrl+2 Ctrl+2 Level &3 Nivel &3 Ctrl+3 Ctrl+3 Level &4 Nivel &4 Ctrl+4 Ctrl+4 Level &5 Nivel &5 Ctrl+5 Ctrl+5 Level &6 Nivel &6 Ctrl+6 Ctrl+6 &Bold &Negrita Ctrl+B Ctrl+B &Italic &Cursiva Ctrl+I Ctrl+I &Strike &Tachado &Verbatim &Literal Su&perscript Su&períndice Ctrl++ Ctrl++ Subsc&ript Subín&dice Ctrl+- Ctrl+- Co&mment block Co&mentario en bloque Ctrl+Shift+C Ctrl+Shift+C Clear &formats Eliminar &formatos Ctrl+0 Ctrl+0 &Comment line(s) &Línea de comentario(s) &Ordered list &Lista ordenada &Unordered list &Lista no ordenada B&lockquote C&ita en bloque Remove selected plot step(s) Eliminar el paso(s) seleccionado de la trama The file {} does not exist. Has it been moved or deleted? El archivo {} no existe. ¿Ha sido movido o eliminado? Install {}{} to use spellcheck {} has no installed dictionaries {}{} is not installed Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings Settings Preferencias General General Revisions Revisiones Views Vistas Labels Etiquetas Status Estado Fullscreen Pantalla completa General settings Preferencias generales Application settings Preferencias de la aplicación Loading Cargando Automatically load last project on startup Cargar automáticamente el último proyecto al iniciar Saving Guardando Automatically save every Guardar automáticamente cada minutes. minutos. If no changes during Si no hay cambios durante seconds. segundos. Save on project close Guardar al salir Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. Las revisiones son una manera de realizar un seguimiento de las modificaciones. Para cada elemento de texto, almacena cualquier cambio que hagas en el texto principal, permitiéndote ver y restaurar versiones anteriores. Keep revisions Almacenar revisiones S&mart remove B&orrado inteligente Keep: Almacenar: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. El borrado inteligente te permite almacenar solo un cierto número de revisiones. Se recomienda encarecidamente que lo uses, para que tu archivo no se llene de miles de cambios insignificantes. revisions per day for the last month revisiones por día durante el último mes revisions per minute for the last 10 minutes revisiones por minuto durante los últimos 10 minutos revisions per hour for the last day revisiones por hora durante el último día revisions per 10 minutes for the last hour revisiones cada 10 minutos durante la última hora revisions per week till the end of time revisiones por semana hasta el fin de los tiempos Views settings Preferencias de visualización Tree Árbol Colors Colores Icon color: Color del icono: Nothing Ninguno POV Label Etiqueta Progress Progreso Compile Compilar Text color: Color del texto: Background color: Color del fondo: Folders Carpetas Show ite&m count Ver número de ele&mentos Show summary Ver resumen Text Texto Outline Esquema Visible columns Columnas visibles Goal Objetivo Word count Número de palabras Percentage Porcentaje Title Título Index cards Fichas Item colors Color de los elementos Border color: Color del borde: Corner color: Color de la esquina: Background Fondo Color: Color: Ctrl+S Ctrl+S Image: Imagen: Text editor Editor de texto Font Fuente Family: Familia: Size: Tamaño: Misspelled: Errata: Background: Fondo: Paragraphs Párrafos Line spacing: Espaciado de linea: Single Sencilla 1.5 lines 1.5 lineas Double Doble Proportional Proporcional % % Tab width: Anchura del tabulador: px px Indent 1st line Indentar la 1ª linea Spacing: Espaciado: New Nuevo Edit Editar Delete Borrar Theme name: Nombre del tema: Apply Aplicar Cancel Cancelar Window Background Fondo de la ventana Text Background Fondo del texto Text Options Opciones de texto Paragraph Options Opciones de párrafo Type: Tipo: No Image Sin Imagen Tiled Tileado Centered Centrado Stretched Ajustado Scaled Escalado Zoomed Agrandado Opacity: Opacidad: Position: Posición: Left Izquierda Center Centro Right Derecha Width: Anchura: Corner radius: Radio de la esquina: Margins: Margenes: Padding: Relleno: Font: Fuente: <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> <html><head/><body><p>Si marcas esta opción, tu proyecto se grabará en un único archivo. Más facil de copiar o guardar, pero no permitirá edición colaborativa o distintas versiones.<br/>Si está desmarcada, tu proyecto se grabará como una carpeta conteniendo multiples archivos pequeños.</p></body></html> Save to one single file Guardar en un único fichero &Nothing &Ninguno Style Estilo Cursor Cursor Use block insertion of Usar bloque de inserción de Alignment: Alineamiento: Justify Justificación Alignment Alineamiento Icon Size Tamaño de icono TextLabel EtiquetadeTexto Disable blinking Deshabilitar parpadeo Text area Área de texto Max width Anchura máxima Left/Right margins: Márgenes izqdo./derecho: Top/Bottom margins: Márgenes superior/inferior: S&how progress Mostrar progreso Show summar&y Mostrar resumen Show p&rogress Muestra p&rogreso Old st&yle Estilo antiguo Transparent Transparente Restore defaults Restaura valores por defecto Style: Estilo: Language: Idioma: Font size: Tamaño de fuente: Restarting Manuskript ensures all settings take effect. Es posible que deba reiniciar manuskript para que esas preferencias surtan efecto de manera adecuada y completa. Show &word count Mostrar &recuento de palabras &Show word count &Mostrar recuento de palabras &New style &Nuevo estilo Typewriter mode Modo máquina de escribir Focus mode Modo concentrado None Ninguno Sentence Frase Line Línea Paragraph Párrafo <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions Sugerencias de Ortografía &Add to dictionary &Añadir al diccionario &Remove from custom dictionary &Eliminar del diccionario personal about About Manuskript Acerca de Manuskript Manuskript Manuskript aboutDialog Version Versión Software Versions in Use: Versiones de software usadas: abstractModel Title Título POV PDV Label Etiqueta Status Estado Compile Compilar Word count Número de palabras Goal Objetivo basicItemView Form Formulario POV: Goal: Meta: Word count Número de palabras One line summary Resumen de una línea Few sentences summary: Resumen de unas pocas frases: characterModel New character Nuevo personaje Name Nombre Value Valor characterTreeView Main Principal Secondary Secundario Minor Menor cheatSheet Form Formulario Filter (type the name of anything in your project) Filtro (escribe el nombre de cualquier elemento de tu proyecto) Minor Menor Secondary Secundario Main Principal Characters Personajes Texts Textos Plots Tramas World Mundo cmbOutlineCharacterChoser None Ninguno Main Principal Secondary Secundario Minor Menor Various Varios cmbOutlineLabelChoser Various Varios cmbOutlineStatusChoser Various Varios collapsibleDockWidgets Dock Widgets Toolbar Anclar Barra de Herramientas completer Form Formulario corkDelegate One line summary Resumen de una línea Full summary Resumen completo editorWidget_ui Form Formulario exporter Export Exportar Export to: Exportar a: Manage exporters Gestionar módulos de exportación Preview Previsualizar Settings Preferencias exporterDialog {} (not implemented yet) {} (sin implementar aún) exporterSettings Form Formulario Content Contenido Decide here what will be included in the final export. Decide aquí lo que se incluirá en la exportación final. Type Tipo Title Título Text Texto I need more granularity Necesito más granularidad Fi&lters Fi&ltros <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> <html><head/><body><p>Filtra los elementos que se incluirán en la exportación final.<br/><span style="color:#773333;">(Aún no está completamente desarrollado)</span></p></body></html> Ignore compile status (include all items) Ignorar el estado de compilación (incluye todos los elementos) Subitems of: Subelementos de: Labels Etiquetas Status Estado Separations Separadores Between folders: Entre carpetas: Empty line Línea vacía Custom Personalizado Between texts: Entre textos: Between folder and text: Entre carpeta y texto: Between text and folder: Entre texto y carpeta: Transformations Transformaciones Typographic replacements: Reemplazos tipográficos: Replace double quotes (") with: Reemplazar comillas dobles (") con: Replace single quotes (') with: Reemplazar comillas simples (') con: Remove multiple spaces Eliminar espaciado múltiple Custom replacements: Reemplazos personalizados: Enabled Habilitado Replace Reemplazar With Con RegExp Expresión Regular If checked, uses regular expression for replacement. If unchecked, replaced as plain text. Si está marcado, usa una expresión regular para el reemplazo, si no, reemplaza como texto plano. Preview Previsualizar Font Fuente Font: Fuente: Font size: Tamaño de fuente: Folder Carpeta {}Level {} folder {}Nivel {} carpeta {}Level {} text {}Nivel {} texto Replace ... with … Reemplazar ... con ... Replace --- with — Reemplazar --- con — exportersManager Installed Instalado Custom Personalizado Not found No encontrado {} not found. Install it, or set path manually. {} no encontrado, instálalo, o establece el camino (path) manualmente. <b>Status:</b> uninstalled. <b>Estado: </b> sin instalar. <b>Requires:</b> <b>Requiere: </b> Set {} executable path. Establecer {} camino(path) del ejecutable. frequencyAnalyzer Phrases Frases Frequency Frecuencia Word Palabra fullScreenEditor Theme: Tema: {} words / {} {} palabras / {} {} words {} palabras Spellcheck Navigation New Text Title Título Title: Show Full Path Theme selector Word count Número de palabras Progress Progreso Progress: Auto Show/Hide Clock Clock: Show Seconds generalSettings General General Split scenes at: Dividir escenas en: \n---\n \n---\n Trim long titles (> 32 chars) Recortar títulos largos (> 32 caracteres) Import under: Importar bajo: Import in a top-level folder Importar en una carpeta de nivel superior helpLabel If you don't wanna see me, you can hide me in Help menu. Si no quieres verme, puedes ocultarme en el menú Ayuda. importer Import Importar Format: Formato: Choose file Seleccionar fichero Clear file Borrar fichero Preview Previsualizar Settings Preferencias lastAccessedDirectoryInfo Last accessed directory "{}" loaded. lineEditView Various Varios locker Form Formulario Lock screen: Bloquear pantalla: Word target Objetivo de palabras Time target Objetivo de tiempo words palabras minutes minutos Lock ! ¡ Bloquear ! ~{} h. ~{} h. ~{} mn. {}:{} {} s. {} remaining {} restantes {} words remaining {} palabras restantes mainEditor Form Formulario Text Texto Index cards Fichas Outline Esquema F11 Root Raíz Go to parent item Ir al elemento padre Alt+Up Alt+Arriba {} words / {} {} palabras / {} {} words {} palabras markdownSettings Markdown Markdown metadataView Form Formulario Properties Propiedades Summary Resumen One line summary Resumen de una línea Full summary Resumen completo Notes / References Notas / Referencias Revisions Revisiones myPanel Auto-hide Auto ocultar outlineBasics Set POV Establecer PDV None Ninguno Set Status Establecer Estado Set Label Establecer Etiqueta New Nuevo Main Principal Secondary Secundario Minor Menor Set Custom Icon Poner icono personalizado Restore to default Restaurar valores por defecto Root Raíz Open {} items in new tabs Abrir {} elementos en pestañas nuevas Open {} in a new tab Abrir {} en una nueva pestaña About to remove A punto de borrar <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> <p><b>Estás a punto de borrar {} elemento(s).</b></p><p>¿Estás seguro?</p> Select at least two items. Folders are ignored. Selecciona al menos dos elementos. Las carpetas no se tienen en cuenta. All items must be on the same level (share the same parent). Todos los elementos deben estar al mismo nivel (tener el mismo padre). New &Folder Nueva carpeta New &Text Nuevo &texto &Copy &Copiar C&ut Cortar &Paste &Pegar &Rename &Renombrar &Delete Eliminar outlineCharacterDelegate None Ninguno Main Principal Secondary Secundario Minor Menor outlineItem {} words / {} ({}) {} palabras / {} ({}) {} words {} palabras pandocSettings General General Table of Content Tabla de Contenido Custom settings for {} Preferencias personalizadas para {} persosProxyModel Main Principal Secondary Secundario Minors Menor plotDelegate General General Promise Promesa Problem Problema Progress Progreso Resolution Resolución Try / Fail Intento / Fallo No and No y Yes but Si pero Freytag's pyramid Piramide de Freytag Exposition Exposición Rising action Aumento de la acción Climax Clímax Falling action Caída de la acción Three acts Tres actos 1. Setup 1. Planteamiento 1. Inciting event 1. Cruce del primer umbral 1. Turning point 1. Punto crítico 2. Choice 2. Elección 2. Reversal 2. Cambio de rumbo 2. Disaster 2. Desastre 3. Stand up 3. Recuperación 3. Climax 3. Clímax 3. Ending 3. Resolución Hero's journey El Viaje del Héroe Ordinary world Mundo ordinario Call to adventure Llamada de la aventura Refusal of the call Rechazo de la llamada Meeting with mentor Encuentro con el mentor Tests Pruebas, aliados y enemigos Approach Acercamiento Abyss Prueba difícil o traumática Reward / Revelation Recompensa / Revelación Transformation Transformación Atonement Expiación Return Regreso plotModel New plot Nueva trama Name Nombre Meta Meta New step Siguiente paso Main Principal Secondary Secundario Minor Menor plotTreeView Main Principal Secondary Secundario Minor Menor **Plot:** {} **Trama:** {} plotsProxyModel Main Principal Secondary Secundario Minors Menor propertiesView Form Formulario POV Status Estado Label Etiqueta Compile Compilar Goal Objetivo Word count Número de palabras references Not a reference: {}. No es una referencia: {}. Unknown reference: {}. Referencia desconocida: {}. Path: Ruta: Stats: Características: POV: Status: Estado: Label: Etiqueta: Short summary: Resumen corto: Long summary: Resumen largo: Notes: Notas: Basic info Informaciones básicas Detailed info Informaciones detalladas POV of: PDV de: Go to {}. Ir a {}. Description Descripción Result Resultado Characters Personajes Resolution steps Pasos para la resolución Passion Pasión Conflict Conflicto Folder: <b>{}</b> Carpeta: <b>{}</b> Text: <b>{}</b> Texto: <b>{}</b> Character: <b>{}</b> Personaje: <b>{}</b> Plot: <b>{}</b> Trama: <b>{}</b> World: <b>{name}</b>{path} Mundo: <b>{name}</b>{path} <b>Unknown reference:</b> {}. <b>Referencia desconocida:</b> {}. Referenced in: Referenciado en: Motivation Motivación Goal Objetivo Epiphany Epifanía Short summary Resumen corto Longer summary Resumen largo revisions Form Formulario Options Opciones Restore Restaurar Delete Borrar Show modifications Ver modificaciones Show ancient version Ver versión antigua Show spaces Ver espacios Show modifications only Ver sólo modificaciones {} years ago Hace {} años {} months ago Hace {} meses {} days ago Hace {} días 1 day ago Hace 1 día {} hours ago Hace {} horas {} minutes ago Hace {} minutos {} seconds ago Hace {} segundos Line {}: Linea {}: Clear all Limpiar todo search Form Formulario Search in: Buscar en: All Todo Title Título Text Texto Summary Resumen Notes Notas POV Status Estado Label Etiqueta Options: Opciones: Case sensitive Distingue mayúsculas y minúsculas Search for... Buscar... settingsWindow New status Nuevo estado New label Nueva etiqueta newtheme nuevotema New theme Nuevo Tema (read-only) (sólo lectura) Open Image Image files (*.jpg; *.jpeg; *.png) Error Error Unable to load selected file Unable to add selected image: {} sldImportance Form Formulario TextLabel EtiquetadeTexto Minor Menor Secondary Secundario Main Principal splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> <p>Divide los elemento(s) seleccionado(s) en la marca indicada.</p> <p>Si uno de los elementos seleccionados es una carpeta, se aplicará recursivamente a <i>todos</i> sus elementos hijos.</p> <p>La marca de división puede contener las siguientes secuencias de escape: <ul> <li><b><code>\n</code></b>: salto de línea</li> <li><b><code>\t</code></b>: tabulador</li> </ul> </p> <p><b>Marca:</b></p> Split '{}' Dividir '{}' Split items Dividir elementos storylineView Form Formulario Show Plots Ver Tramas Show Characters Ver Personajes tabSplitter Open selected items in that view. Abre los elementos seleccionados en esta vista. Split horizontally Dividir horizontalmente Close split Cerrar división Split vertically Dividir verticalmente textEditView Various Varios textFormat Form Formulario CTRL+B CTRL+I CTRL+U CTRL+P CTRL+L CTRL+E CTRL+R CTRL+J treeView Expand {} Expandir {} Collapse {} Contraer {} Expand All Expandir Todo Collapse All Contraer Todo welcome Form Formulario 1 1 Templates Plantillas Empty Vacía Novel Novela Novella Novela Corta Short Story Cuento Research paper Árticulo de investigación Demo projects Proyectos de ejemplo Add level Añadir nivel Add word count Añadir recuento de palabras Next time, automatically open last project La proxima vez, abrir el último proyecto automáticamente Open... Abrir... Recent Reciente Create Crear Open project Abrir proyecto Manuskript project (*.msk);;All files (*) Proyecto de Manuskript (*.msk);;Todos los ficheros (*) Save project as... Guardar proyecto como... Manuskript project (*.msk) Proyecto de Manuskript (*.msk) Create New Project Crear un Proyecto Nuevo Empty fiction Ficción vacía Chapter Capítulo Scene Escena Trilogy Trilogía Book Libro Section Sección Empty non-fiction No-Ficción vacía words each. palabras cada una. of de Text Texto Something Algo <b>Total:</b> {} words (~ {} pages) <b>Total:</b> {} palabras (~ {} páginas) Fiction Ficción Non-fiction No-ficción Idea Note Nota Research Investigación TODO POR HACER First draft Primer borrador Second draft Segundo borrador Final Final Manuskript Manuskript Warning Advertencia Overwrite existing project {} ? ¿Sobreescribir el proyecto existe {}? worldModel New item Nuevo elemento Fantasy world building Construcción del mundo de fantasía Physical Fisico Climate Clima Topography Topografía Astronomy Astronomía Wild life Vida salvaje Flora Flora History Historia Races Razas Diseases Enfermedades Cultural Cultura Customs Aduanas Food Comida Languages Idiomas Education Educación Dresses Vestidos Science Ciencia Calendar Calendario Bodily language Lenguaje corporal Ethics Ética Religion Religión Government Gobierno Politics Política Gender roles Roles de género Music and arts Música y artes Architecture Arquitectura Military Ejércitos Technology Tecnología Courtship Cortejo Demography Demografía Transportation Medios de transporte Medicine Medicina Magic system Sistema de magia Rules Reglas Organization Organización Magical objects Objetos mágicos Magical places Lugares mágicos Magical races Razas mágicas Important places Lugares importantes Important objects Objetos importantes Natural resources Recursos naturales manuskript-0.10.0/i18n/manuskript_fa.qm000066400000000000000000000000201354442177200177470ustar00rootroot00000000000000 Export Basic HTML output using the Python module 'markdown'. Python module 'markdown'. Markdown source HTML Source HTML Output Default exporter, provides basic formats used by other exporters. Preview with highlighter. Plain text A little known format modestly used. You know, web sites for example. Needs LaTeX to be installed. Error Standalone document (not just a fragment) Include a table of contents. Number of sections level to include in TOC: Typographically correct output Normalize the document (cleaner) Specify the base level for headers: Use reference-style links instead of inline links Use ATX-style headers Self-contained HTML files, with no dependencies Use <q> tags for quotes in HTML LaTeX engine used to produce the PDF. Paper size: Font size: Class: Line spacing: Books that don't kill trees. OpenDocument format. Used by LibreOffice for example. Microsoft Office (.docx) document. reStructuredText is a lightweight markup language. Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. LaTeX is a word processor and document markup language used to create beautiful documents. The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. Disable YAML metadata block. Use that if you get YAML related error. Convert to ePUB3 Could not process regular expression: {} Choose output file… ExportersManager Manage Exporters Manuskript Description Offers export to Status Status: Version: Path: ... {HelpText} FrequencyAnalyzer Frequency Analyzer Word frequency Settings Minimum size: Exclude words (comma separated): Analyze Phrase frequency Number of words: from to Import Markdown import <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; Folder import <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> Include only those extensions: Comma separated values Sort items by name Import folder then files OPML Import File open failed. This does not appear to be a valid OPML file. Pandoc import <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; Import using: Wrap lines: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> Mind Map Import This does not appear to be a valid Mind Map file. Mind Map import Import tip as: Untitled MDEditCompleter Insert reference MainWindow General Title Subtitle Series Volume Genre License Author Name Email Summary Situation: Summary: One sentence One paragraph One page Full One sentence summary One paragraph summary Expand each sentence of your one paragraph summary to a paragraph One page summary Full summary Next What if...? Characters Names Filter Basic info Importance Motivation Goal Conflict Epiphany <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> Notes Detailed info Plots Plot Character(s) Description Result Resolution steps World Populates with empty data More Source of passion Source of conflict Outline Editor Debug FlatData Persos Labels &File &Recent &Help &Tools &Edit &View &Mode &Cheat sheet Sea&rch &Navigation &Open Ctrl+O &Save Ctrl+S Sa&ve as... Ctrl+Shift+S &Quit Ctrl+Q &Show help texts Ctrl+Shift+B &Spellcheck F9 &Labels... &Status... Tree &Simple &Fiction Index cards S&ettings F8 &Close project Co&mpile F6 &Frequency Analyzer Book information &About About Manuskript Manuskript Project {} saved. WARNING: Project {} not saved. Project {} loaded. Project {} loaded with some errors: * {} wasn't found in project file. Project {} loaded with some errors. (~{} pages) Words: {}{} Book summary Project tree Metadata Story line Enter information about your book, and yourself. The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Create your characters. Develop plots. Build worlds. Create hierarchy of broad categories down to specific details. Create the outline of your masterpiece. Write. Debug info. Sometimes useful. Dictionary Nothing POV Label Progress Compile Icon color Text color Background color Icon Text Background Border Corner Add plot step &Import… F7 &Copy Ctrl+C C&ut Ctrl+X &Paste Ctrl+V &Split… Ctrl+Shift+K Sp&lit at cursor Ctrl+K Ctrl+M Ctrl+D Del &Move Up Ctrl+Shift+Up M&ove Down Ctrl+Shift+Down Dupl&icate &Delete &Rename F2 Organi&ze M&erge &Format &Header &Level 1 (setext) Ctrl+Alt+1 Level &2 Ctrl+Alt+2 Level &1 (atx) Ctrl+1 L&evel 2 Ctrl+2 Level &3 Ctrl+3 Level &4 Ctrl+4 Level &5 Ctrl+5 Level &6 Ctrl+6 &Bold Ctrl+B &Italic Ctrl+I &Strike &Verbatim Su&perscript Ctrl++ Subsc&ript Ctrl+- Co&mment block Ctrl+Shift+C Clear &formats Ctrl+0 &Comment line(s) &Ordered list &Unordered list B&lockquote Remove selected plot step(s) The file {} does not exist. Has it been moved or deleted? Install {}{} to use spellcheck {} has no installed dictionaries {}{} is not installed Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings Settings General Revisions Views Labels Status Fullscreen General settings Application settings Loading Automatically load last project on startup Saving Automatically save every minutes. If no changes during seconds. Save on project close <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> Save to one single file Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. Keep revisions S&mart remove Keep: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. revisions per day for the last month revisions per minute for the last 10 minutes revisions per hour for the last day revisions per 10 minutes for the last hour revisions per week till the end of time Views settings Tree Colors Icon color: Nothing POV Label Progress Compile Text color: Background color: Folders Show ite&m count Show summary &Nothing Text Outline Visible columns Goal Word count Percentage Title Index cards Item colors Border color: Corner color: Background Color: Ctrl+S Image: Text editor Font Family: Size: Misspelled: Background: Paragraphs Line spacing: Single 1.5 lines Double Proportional % Tab width: px Indent 1st line Spacing: New Edit Delete Theme name: Apply Cancel Window Background Text Background Text Options Paragraph Options Type: No Image Tiled Centered Stretched Scaled Zoomed Opacity: Position: Left Center Right Width: Corner radius: Margins: Padding: Font: Style Cursor Use block insertion of Alignment: Justify Alignment Icon Size TextLabel Disable blinking Text area Max width Left/Right margins: Top/Bottom margins: S&how progress Show summar&y Show p&rogress Old st&yle Transparent Restore defaults Style: Language: Font size: Restarting Manuskript ensures all settings take effect. Show &word count &Show word count &New style Typewriter mode Focus mode None Sentence Line Paragraph <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions &Add to dictionary &Remove from custom dictionary about About Manuskript Manuskript aboutDialog Version Software Versions in Use: abstractModel Title POV Label Status Compile Word count Goal basicItemView Form POV: Goal: Word count One line summary Few sentences summary: characterModel New character Name Value characterTreeView Main Secondary Minor cheatSheet Form Filter (type the name of anything in your project) Minor Secondary Main Characters Texts Plots World cmbOutlineCharacterChoser None Main Secondary Minor Various cmbOutlineLabelChoser Various cmbOutlineStatusChoser Various collapsibleDockWidgets Dock Widgets Toolbar completer Form corkDelegate One line summary Full summary editorWidget_ui Form exporter Export Export to: Manage exporters Preview Settings exporterDialog {} (not implemented yet) exporterSettings Form Content Decide here what will be included in the final export. Type Title Text I need more granularity Fi&lters <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> Ignore compile status (include all items) Subitems of: Labels Status Separations Between folders: Empty line Custom Between texts: Between folder and text: Between text and folder: Transformations Typographic replacements: Replace double quotes (") with: Replace single quotes (') with: Remove multiple spaces Custom replacements: Enabled Replace With RegExp If checked, uses regular expression for replacement. If unchecked, replaced as plain text. Preview Font Font: Font size: Folder {}Level {} folder {}Level {} text Replace ... with … Replace --- with — exportersManager Installed Custom Not found {} not found. Install it, or set path manually. <b>Status:</b> uninstalled. <b>Requires:</b> Set {} executable path. frequencyAnalyzer Phrases Frequency Word fullScreenEditor Theme: {} words / {} {} words Spellcheck Navigation New Text Title Title: Show Full Path Theme selector Word count Progress Progress: Auto Show/Hide Clock Clock: Show Seconds generalSettings General Split scenes at: \n---\n Trim long titles (> 32 chars) Import under: Import in a top-level folder helpLabel If you don't wanna see me, you can hide me in Help menu. importer Import Format: Choose file Clear file Preview Settings lastAccessedDirectoryInfo Last accessed directory "{}" loaded. lineEditView Various locker Form Lock screen: Word target Time target words minutes Lock ! ~{} h. ~{} mn. {}:{} {} s. {} remaining {} words remaining mainEditor Form Text Index cards Outline F11 Go to parent item Alt+Up Root {} words / {} {} words markdownSettings Markdown metadataView Form Properties Summary One line summary Full summary Notes / References Revisions myPanel Auto-hide outlineBasics Set POV None Set Status Set Label New Main Secondary Minor Set Custom Icon Restore to default Root Open {} items in new tabs Open {} in a new tab About to remove <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> Select at least two items. Folders are ignored. All items must be on the same level (share the same parent). New &Folder New &Text &Copy C&ut &Paste &Rename &Delete outlineCharacterDelegate None Main Secondary Minor outlineItem {} words / {} ({}) {} words pandocSettings General Table of Content Custom settings for {} persosProxyModel Main Secondary Minors plotDelegate General Promise Problem Progress Resolution Try / Fail No and Yes but Freytag's pyramid Exposition Rising action Climax Falling action Three acts 1. Setup 1. Inciting event 1. Turning point 2. Choice 2. Reversal 2. Disaster 3. Stand up 3. Climax 3. Ending Hero's journey Ordinary world Call to adventure Refusal of the call Meeting with mentor Tests Approach Abyss Reward / Revelation Transformation Atonement Return plotModel New plot Name Meta New step Main Secondary Minor plotTreeView Main Secondary Minor **Plot:** {} plotsProxyModel Main Secondary Minors propertiesView Form POV Status Label Compile Goal Word count references Not a reference: {}. Unknown reference: {}. Path: Stats: POV: Status: Label: Short summary: Long summary: Notes: Basic info Detailed info POV of: Go to {}. Description Result Characters Resolution steps Passion Conflict <b>Unknown reference:</b> {}. Folder: <b>{}</b> Text: <b>{}</b> Character: <b>{}</b> Plot: <b>{}</b> World: <b>{name}</b>{path} Referenced in: Motivation Goal Epiphany Short summary Longer summary revisions Form Options Restore Delete Show modifications Show ancient version Show spaces Show modifications only {} years ago {} months ago {} days ago 1 day ago {} hours ago {} minutes ago {} seconds ago Line {}: Clear all search Form Search for... Search in: All Title Text Summary Notes POV Status Label Options: Case sensitive settingsWindow New status New label newtheme New theme (read-only) Open Image Image files (*.jpg; *.jpeg; *.png) Error Unable to load selected file Unable to add selected image: {} sldImportance Form TextLabel Minor Secondary Main splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> Split '{}' Split items storylineView Form Show Plots Show Characters tabSplitter Open selected items in that view. Split horizontally Close split Split vertically textEditView Various textFormat Form CTRL+B CTRL+I CTRL+U CTRL+P CTRL+L CTRL+E CTRL+R CTRL+J treeView Expand {} Collapse {} Expand All Collapse All welcome Form 1 Templates Empty Novel Novella Short Story Research paper Demo projects Add level Add word count Next time, automatically open last project Open... Recent Create Open project Manuskript project (*.msk);;All files (*) Save project as... Manuskript project (*.msk) Manuskript Create New Project Warning Overwrite existing project {} ? Empty fiction Chapter Scene Trilogy Book Section Empty non-fiction words each. of Text Something <b>Total:</b> {} words (~ {} pages) Fiction Non-fiction Idea Note Research TODO First draft Second draft Final worldModel New item Fantasy world building Physical Climate Topography Astronomy Wild life Flora History Races Diseases Cultural Customs Food Languages Education Dresses Science Calendar Bodily language Ethics Religion Government Politics Gender roles Music and arts Architecture Military Technology Courtship Demography Transportation Medicine Magic system Rules Organization Magical objects Magical places Magical races Important places Important objects Natural resources manuskript-0.10.0/i18n/manuskript_fr.qm000066400000000000000000002262411354442177200200070ustar00rootroot00000000000000ހLZiTTiVE|VEVE`VEVbsd]"ddf^W:}i7e? Jr'*$8*y9*y*:4*%:*0;+E<+f=+=+>+@p.3*093w.;FA['G:GHw9pJNL7QnLGvLb8LbM|^M6 MezvMezMŅUeNWSQ:z'RxVRxzWRxsRxݤRxTbETb'TbkTbjTb͙TbATbTbTZ=UjZUjUlV':CVVW6]W6WXytXYEYYȀZZ%BZʳ؜Zϳ[[ %i [ %[ %[ %[ %[ %c[ٵ7~\\\ \G^i$j^i$gUnU4^b-s !3x( YBwx$rѺof@~Yh,.AfDBD"sp2- NEP2|iMtP^36ݰCʯylGCqnYH1v3tcML#UAIV%W{]1} ^[i@5t{RBWv.|^_~k.!(^Qʶ'&4)+4J'-R!%ȳƩ"&n0JEMFN^_aN!lwp<l.mNq0\grJwbZp`8nDnunnno9ojorɐzTbCEIrZsjрj ՈF 6Zs6sHVIIJJ6JgJJKtKKLL8LiLLLtN>No,t,bt]]tGt4%u7S( bQ7ĚG҂nS6 9vtD9*:TQ*#Ns:/Cus>!?\X}xM_v 1!&$ ''3V'3z'3$+5!35@V!@VܓHu5QhDVjW7jijkSjZj}lc]Zlqsgu#}}Z }Z{9T4a@4׻ %Gb7M@N%MJjÊTcHt6j?&<5idߺ ~jYu X`* W0xz` woticTu%Ē;&t/t00;9$|Cs`CsCJCLt{M+HKM+R!|xTunD`xl^0m?$mm4m mm7mnfpirz z}{M~ ~,Z]jnV:a.@j0DžN0]0}0z֣֝cyR:1 Zw D2;!|@a3'Rq I$ǹ#t9)Hc0e,1~aG4ʗNqrJ72rkySBЂD,ϗ?ϗ[ϗ2ց@E}@~ST` LE°^ ÈvT[& У\v s~G lS!*j,N E3 67Bn/BLpHAE MP[5j]*r(bhfO~2G~2~2ߪZAZ{ƒڬ(ab(~?SnT^k@~ HZ +4 ?:E Mgn MgO Mg T ^^n ^M ^o ^ֹ g: r,| z K  -  a %c m U~ U շ zb C I; z #m ?@ 08 3a 9sVw 9sy 9sD >cdh A^ Rb` Z dpeH dpes dpe dpe d)| d) d) d) d) d)Z d)$ d) d) d) e n) o"`< }({ T3 B;# f * :  : ,9 , 8d 8_ 8 ʶ ! ֓: U9 N z;g Q 9P J < ;q #eē Q8' U~1G ]Yӷ l m^V s3 }j" % . v t>$ H>Z HŎ  fbf 5   c  G?5 L} ڔ1 u 5k YPZ _q  iC ӨS ; ye WT   R / 1UϏ 4 @ ; Cjd3 G Nr Z$sL bS i?`} pkX rIj }0 !T u  1   `  ) ޔ ] ~ x$ښ  Z s  ` 'jf Yo $ $Y2 $( $" n% ,] %5* #au s#/ s@ s} s+ ɠ WW W W X X; C u :h - QN { J  # . zZt % + 4}"p 5N  87>E DYM DYM DZM J Kd bv. i8: \ P .6I S>   Í ^ ) 0p Ğt9y <U1 <v < <W <$ aМ ⋙[- eR է uYZ2# v2)GR6eEC9[<+H`IOqUhWGoT$P0$Pjrpkw̺tSaJbK7  7N^ S!; =Qy>\(BxS2Qy9R_DR_d@fq}pPt2|oN~``~`\L"|9"|bi٫lW tto:=KP;i3i(<p>Un convertisseur universel de document. Peut tre utilis pour convertir du markdown dans un grand nombre de formats.</p> <p>Site internet: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> 

A universal document converter. Can be used to convert markdown to a wide range of other formats.

Website: http://pandoc.org/

Export~Un format utilis parfois, pour les sites internet par exemple.EA little known format modestly used. You know, web sites for example.ExportvFormat HTML de base, utilisant le module python 'markdown'.5Basic HTML output using the Python module 'markdown'.ExportNDes livres qui ne tuent pas les arbres.Books that don't kill trees.Export>Choisir le fichier de sortie...Choose output file…ExportClasse :Class:Export(Convertir vers ePUB3Convert to ePUB3ExportRErreur avec une expression rgulire: {})Could not process regular expression: {}ExportExporteur de base, fournit les formats de base utiliss par les autres exporteurs.ADefault exporter, provides basic formats used by other exporters.ExportDsactiver le bloc de mtadonne YAML. Cochez ceci si vous avez des erreurs lies YAML.DDisable YAML metadata block. Use that if you get YAML related error.Export ErreurErrorExportExport vers markdown en utilisant pandoc. Permet plus de possibilits que l'exporteur basique intgr manuskript.hExport to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter.Export*Taille de la police : Font size:ExportSortie HTML HTML OutputExportSource HTML HTML SourceExport>Inclure une table des matires.Include a table of contents.ExportnComme en texte brute, mais rajoute les titres markdown.Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown.ExportZLe moteur LaTeX utilis pour produire le PDF.%LaTeX engine used to produce the PDF.ExportLaTeX est une suite d'outil et un format utilis pour crer des documents magnifiques.LaTeX is a word processor and document markup language used to create beautiful documents.Export.Espacement des lignes : Line spacing:ExportSource markdownMarkdown sourceExportDDocument Microsoft Office (.docx)."Microsoft Office (.docx) document.ExportBNcessite d'avoir install LaTeX.Needs LaTeX to be installed.ExportFNormalise le document (plus propre) Normalize the document (cleaner)ExportnNombre de niveau inclure dans la table des matires: ,Number of sections level to include in TOC: ExportnFormat OpenDocument. Utilis notamment par LibreOffice.5OpenDocument format. Used by LibreOffice for example.Export$Taille du papier : Paper size:ExportTexte brute Plain textExportDAperu avec coloration syntaxique.Preview with highlighter.Export2module python 'markdown'.Python module 'markdown'.ExportbDocument HTML autonome, sans dpendances externes/Self-contained HTML files, with no dependenciesExport4Export le plus simple, en texte brute. Permet d'utiliser des langages que manuskript ne comprends pas. Par exemple <a href='www.fountain.io'>Fountain</a>.Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example Fountain.ExportZSpcifier le niveau de base pour les titres: $Specify the base level for headers: ExportRDocument autonome (pas juste un fragment))Standalone document (not just a fragment)ExportLe but de ce format est de fournir un moyen d'changer des informations entre outliners et services internet.The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner.Export4Corrections typographiquesTypographically correct outputExportZUtilise le tag <q> pour les citations en HTMLUse tags for quotes in HTMLExportLUtiliser le format ATX pour les titresUse ATX-style headersExportUtilise des rfrences pour les liens, et non intgrs dans le texte1Use reference-style links instead of inline linksExportncessite une installation latex valide. Voir les recommendations de pandoc sur <a href="http://pandoc.org/installing.html">http://pandoc.org/installing.html</a>. Pour le support unicode, il vous faut xelatex.a valid LaTeX installation. Pandoc recommendations can be found on: pandoc.org/installing.html. If you want Unicode support, you need XeLaTeX.ExportdreStructuredText est un langage de balisage lger.2reStructuredText is a lightweight markup language.Export......ExportersManagerDescription DescriptionExportersManager(Grer les ExporteursManage ExportersExportersManagerManuskript ManuskriptExportersManager&Offre l'export versOffers export toExportersManagerChemin:Path:ExportersManager StatusStatusExportersManagerStatus :Status:ExportersManagerVersion:Version:ExportersManager{HelpText} {HelpText}ExportersManagerAnalyserAnalyzeFrequencyAnalyzer^Exclure les mots<br>(spars par des virgules): Exclude words (comma separated):FrequencyAnalyzer,Analyseur de frquenceFrequency AnalyzerFrequencyAnalyzerTaille minimum: Minimum size:FrequencyAnalyzer$Nombre de mots: deNumber of words: fromFrequencyAnalyzer*Frquence des phrasesPhrase frequencyFrequencyAnalyzerRglagesSettingsFrequencyAnalyzer$Frquence des motsWord frequencyFrequencyAnalyzertoFrequencyAnalyzerX<b>Info:</b> Un simple parser qui va parcourir le document markdown et crer des lments chaque titre dtect.<br/>&nbsp;Info: A very simple parser that will go through a markdown document and create items for each titles.
 ImportT<b>Info:</b> Manuskript peut importer soit depuis <b>markdown</b> soit <b>OPML</b>. Pandoc va convertir votre document vers l'un ou l'autre (option ci-dessous), et ensuite tre import dans manuskript. L'un ou l'autre pourrait donner de meilleurs rsultats en fonction de votre document.<br/>&nbsp;}Info: Manuskript can import from markdown or OPML. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document.
 Import<p><b>Info:</b> Importe la structure d'un dossier. Les dossiers sont cres comme dossiers, et les documents textes sont ajouts comme des scnes.</p> <p>Seulement les fichiers textes sont supports (pas les images, fichiers binaires ou autres).</p>R

Info: Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.

Only text files are supported (not images, binary or others).

Import<p>Pandoc doit-il crer des retours la lignes cosmtiques/non-smantiques?</p> <p><b>auto</b>: plier les lignes 72 charactres.<br> <b>none</b>: pas de retours la lignes.<br> <b>preserve</b>: essaie de prserver les retours la lignes du document original.</p>Q

Should pandoc create cosmetic / non-semantic line-breaks?

auto: wraps at 72 characters.
none: no line wrap.
preserve: tries to preserves line wrap from the original document.

ImportBValeurs spares par des virgulesComma separated valuesImport>Echec de l'ouverture du fichierFile open failed.Import:Importation depuis un dossier Folder importImport@Importer les dossiers en premierImport folder then filesImport6Importer les pointes comme:Import tip as:ImportImporter via: Import using:ImportBInclure seulement ces extensions:Include only those extensions:Import(Importation markdownMarkdown importImport(Importation Mind MapMind Map ImportImport(Importation Mind MapMind Map importImport Importation OPML OPML ImportImport$Importation Pandoc Pandoc importImport@Trier les lments par leur nomsSort items by nameImportfCela ne ressemble pas un fichier Mind Map valide.1This does not appear to be a valid Mind Map file.ImportjLe fichier ne semble pas tre un fichier OPML valide.-This does not appear to be a valid OPML file.ImportSans titreUntitledImport&Replier les lignes: Wrap lines:Import*Insrer une rfrenceInsert referenceMDEditCompleter (~{} pages) (~{} pages) MainWindowd* {} n'a pas t trouv dans le fichier du projet.# * {} wasn't found in project file. MainWindow&A propos&About MainWindow &Gras&Bold MainWindow$&Feuille de triche &Cheat sheet MainWindow"&Fermer le projet&Close project MainWindow&Copier&Copy MainWindow&Supprimer&Delete MainWindow&dition&Edit MainWindow&Fiction&Fiction MainWindow&Fichier&File MainWindow&Format&Format MainWindow.&Analyseur de frquence&Frequency Analyzer MainWindow &Titre&Header MainWindow &Aide&Help MainWindow&Importer & &Import… MainWindow&Italique&Italic MainWindow&Labels & &Labels... MainWindow$&Niveau 1 (setext)&Level 1 (setext) MainWindow &Mode&Mode MainWindow*Dplacer vers le haut&Move Up MainWindow&Navigation &Navigation MainWindow&Ouvrir&Open MainWindowC&oller&Paste MainWindow&Quitter&Quit MainWindow&Rcents&Recent MainWindow&Renommer&Rename MainWindow&Enregistrer&Save MainWindow8&Afficher les bulles d'aides&Show help texts MainWindow&Simple&Simple MainWindow4&Correcteur orthographique &Spellcheck MainWindow&Diviser & &Split… MainWindow&Status & &Status... MainWindow&Outils&Tools MainWindow&Vue&View MainWindow<html><head/><body><p align="right">Rsum<br/>en un paragraphe</p></body></html>O

One paragraph
summary

 MainWindow<html><head/><body><p align="right">Rsum<br/>en une phrase</p></body></html>N

One sentence
summary

 MainWindow, propos de ManuskriptAbout Manuskript MainWindowXAjouter une tape de rsolution (CTRL+Enter) Add plot step MainWindow2Informations sur l'auteurAuthor MainWindowArrire-plan Background MainWindow2Couleur de l'arrire-planBackground color MainWindow,Informations gnrales Basic info MainWindow2Informations sur le livreBook information MainWindowRsum du livre Book summary MainWindowBordureBorder MainWindowConstruire des mondes. Cre une hierarchie en partant des catgories les plus larges jusqu'au dtails les plus spcifiques.MBuild worlds. Create hierarchy of broad categories down to specific details. MainWindowC&ouperC&ut MainWindowPersonnage(s) Character(s) MainWindowPersonnages Characters MainWindowCo&mpilerCo&mpile MainWindowCompilationCompile MainWindowConflitConflict MainWindowCoinCorner MainWindowHCrez le plan de votre chef-d'Suvre.'Create the outline of your masterpiece. MainWindow2Crez ici vos personnage.Create your characters. MainWindow Ctrl+0Ctrl+0 MainWindow Ctrl+1Ctrl+1 MainWindow Ctrl+2Ctrl+2 MainWindow Ctrl+3Ctrl+3 MainWindow Ctrl+4Ctrl+4 MainWindow Ctrl+5Ctrl+5 MainWindow Ctrl+6Ctrl+6 MainWindowCtrl+Alt+1 Ctrl+Alt+1 MainWindowCtrl+Alt+2 Ctrl+Alt+2 MainWindow Ctrl+BCtrl+B MainWindow Ctrl+CCtrl+C MainWindow Ctrl+DCtrl+D MainWindow Ctrl+ICtrl+I MainWindow Ctrl+KCtrl+K MainWindow Ctrl+MCtrl+M MainWindowCtrl+O MainWindowCtrl+Q MainWindow Ctrl+SCtrl+S MainWindow Ctrl+Shift+B MainWindowCtrl+Shift+BasCtrl+Shift+Down MainWindowCtrl+Shift+K Ctrl+Shift+K MainWindow Ctrl+Shift+S MainWindowCtrl+Shift+Up Ctrl+Shift+Up MainWindow Ctrl+VCtrl+V MainWindow Ctrl+XCtrl+X MainWindow DebugDebug MainWindowDes informations pour dbugger des fois pendant qu'on code c'est utile.Debug info. Sometimes useful. MainWindowDelDel MainWindowDescription Description MainWindow.Informations dtailles Detailed info MainWindow2Dveloppez vos intrigues.Develop plots. MainWindowDictionnaire Dictionary MainWindowDupl&iquer Dupl&icate MainWindowRdactionEditor MainWindow EmailEmail MainWindowEntrez toutes les informations relatives au livre, ainsi qu' vous.0Enter information about your book, and yourself. MainWindowpiphanieEpiphany MainWindowDveloppez chaque phrase du paragraphe prcdent en un paragraphe completAExpand each sentence of your one paragraph summary to a paragraph MainWindowF2F2 MainWindowF6F6 MainWindowF7F7 MainWindowF8 MainWindowF9F9 MainWindow FiltreFilter MainWindowFlatDataFlatData MainWindowCompletFull MainWindowRsum complet Full summary MainWindowGnralGeneral MainWindow GenreGenre MainWindow CibleGoal MainWindow IconeIcon MainWindow$Couleur de l'icone Icon color MainWindowImportance Importance MainWindow Cartes Index cards MainWindow LabelLabel MainWindow LabelsLabels MainWindowNiveau &1 (atx)Level &1 (atx) MainWindowNiveau &2Level &2 MainWindowNiveau &3Level &3 MainWindowNiveau &4Level &4 MainWindowNiveau &5Level &5 MainWindowNiveau &6Level &6 MainWindowLicenseLicense MainWindow&FusionnerM&erge MainWindow(Dplacer vers le bas M&ove Down MainWindowManuskript Manuskript MainWindowMtadonnesMetadata MainWindowPlusMore MainWindowMotivation Motivation MainWindowNomName MainWindowNomsNames MainWindowSuivantNext MainWindow NotesNotes MainWindowRienNothing MainWindowUne pageOne page MainWindow$Rsum en une pageOne page summary MainWindowUn paragraphe One paragraph MainWindow.Rsum en un paragrapheOne paragraph summary MainWindowUne phrase One sentence MainWindow(Rsum en une phraseOne sentence summary MainWindowOr&ganisation Organi&ze MainWindowPlanOutline MainWindowPOVPOV MainWindow PersosPersos MainWindowIntriguePlot MainWindowIntriguesPlots MainWindowBRemplir avec des catgories videsPopulates with empty data MainWindowProgrsProgress MainWindowArborescence Project tree MainWindowVLe projet {} a t charg avec des erreurs.#Project {} loaded with some errors. MainWindowXLe projet {} a t charg, avec des erreurs:#Project {} loaded with some errors: MainWindow4Le projet {} a t charg.Project {} loaded. MainWindow<Le projet {} a t enregistr.Project {} saved. MainWindow(tapes de rsolutionResolution steps MainWindowRsultatResult MainWindow&Rglages S&ettings MainWindow$Enre&gistrer sous & Sa&ve as... MainWindow&RechercheSea&rch MainWindow SrieSeries MainWindowSituation: Situation: MainWindow"Source de conflitSource of conflict MainWindow"Source de passionSource of passion MainWindow&Di&viser au curseurSp&lit at cursor MainWindow Story line MainWindowSous-titreSubtitle MainWindow RsumSummary MainWindowRsum:Summary: MainWindow2Prenez le temps de penser une phrase (~50 mots) qui rsume votre livre. Ensuite, dveloppez-l en un paragraphe, puis une page, puis un rsum complet.Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. MainWindow TexteText MainWindow Couleur du texte Text color MainWindowlLa situation de base, sous la forme d'une question "Et si &?". Par exemple: "Et si le plus dangereux des sorciers malfiques n'tait pas capable de tuer un petit bb?" (Harry Potter)The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) MainWindow TitreTitle MainWindow ArbreTree MainWindow VolumeVolume MainWindow^ATTENTION: Le projet {} n'a pas t enregistr.WARNING: Project {} not saved. MainWindowEt si... ? What if...? MainWindowMots: {}{} Words: {}{} MainWindow MondeWorld MainWindowcrivez.Write. MainWindowpx pxSettings%%Settings &Rien&NothingSettings1.5 lignes 1.5 linesSettings<html><head/><body><p>Si vous cochez cette option, le projet sera enregistrer en un seul fichier. Plus facile copier, mais ne permet pas de travailler en collaboration, ou d'utiliser un gestionnaire de version extrieur.<br/>Si l'option n'est pas coche, le projet sera sauvegard en un dossier contenant de nombreux petits fichiers.</p></body></html>

If you check this option, your project will be save as one single file. Easier to copy or backup, but does not allow collaborative editing, or versionning.
If this is unchecked, your project will be save as a folder containing many small files.

SettingsAlignement AlignmentSettingsAlignement: Alignment:Settings,Style de l'applicationApplication settingsSettingsEnregistrerApplySettingsZCharger au dmarrage le dernier projet ouvert*Automatically load last project on startupSettingsLEnregistrer automatiquement toutes lesAutomatically save everySettingsArrire-plan BackgroundSettingsArrire-plan:Background color:SettingsArrire-plan: Background:SettingsBordure: Border color:SettingsAnnulerCancelSettings CentreCenterSettingsCentreCenteredSettingsCouleur:Color:SettingsCouleursColorsSettingsCompilationCompileSettings Coin: Corner color:SettingsArrondi:Corner radius:Settings Ctrl+SCtrl+SSettingsCurseurCursorSettingsSupprimerDeleteSettingsJDsactiver le clignotement du curseurDisable blinkingSettings DoubleDoubleSettingsModifierEditSettingsFamille:Family:SettingsDossiersFoldersSettings PoliceFontSettingsPolice:Font:SettingsPlein cran FullscreenSettingsGnralGeneralSettings"Rglages gnrauxGeneral settingsSettings CibleGoalSettings"Taille des icnes Icon SizeSettings Icone: Icon color:SettingsJS'il n'y a pas de modification durantIf no changes duringSettings Image:Image:Settings$Retrait 1re ligneIndent 1st lineSettings Cartes Index cardsSettings&Couleurs des cartes Item colorsSettingsJustifiJustifySettings(Garder les rvisionsKeep revisionsSettingsGarder:Keep:Settings LabelLabelSettings LabelsLabelsSettings GaucheLeftSettings*Marges gauche/droite:Left/Right margins:Settings,Espacement des lignes: Line spacing:SettingsChargementLoadingSettingsMarges:Margins:Settings Largeur maximale Max widthSettingsOrthographe: Misspelled:SettingsNouveauNewSettingsPas d'imageNo ImageSettings AucunNoneSettingsRienNothingSettingsAncien style Old st&yleSettingsOpacit:Opacity:SettingsPlanOutlineSettingsPOVPOVSettingsIntrieur:Padding:Settings.Options des paragraphesParagraph OptionsSettingsParagraphes ParagraphsSettingsPourcentage PercentageSettingsPosition: Position:SettingsProgrsProgressSettingsProportionnel ProportionalSettings&Couleurs par dfautRestore defaultsSettingsRvisions RevisionsSettingsLes rvisions sont un moyen de garder une trace des modifications apportes un texte. Pour chaque texte, chaque changement que vous apportez est enregistr, vous permettant de comparer la version actuelle avec des versions antrieures, et de les restaurer.Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions.Settings DroiteRightSettings$Montrer le progrsS&how progressSettings0&Supression intelligente S&mart removeSettings.Enregistrer en quittant Save on quitSettings@Enregistrer dans un seul fichierSave to one single fileSettingsEnregistrementSavingSettings Mise l'chelleScaledSettingsRglagesSettingsSettings:Montrer le &nombre d'lmentsShow ite&m countSettings$Montrer le progrsShow p&rogressSettings$Montrer le rsumm Show summar&ySettings$Montrer le rsumm Show summarySettings SimpleSingleSettingsTaille:Size:SettingsLa suppression intelligente vous permet de ne garder qu'un certain nombre de rvisions. Il est fortement recommander de l'utiliser, sous peine de voir ses documents envahis de millieurs de modifications insignifiantes.Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes.SettingsEspacement:Spacing:Settings StatusStatusSettings tire StretchedSettingsApparenceStyleSettingsTabulation: Tab width:Settings TexteTextSettings*Arrire plan du texteText BackgroundSettings Options du texte Text OptionsSettingsZone de texte Text areaSettings Texte: Text color:Settings diteur de texte Text editorSettingsTextLabel TextLabelSettingsNom du thme: Theme name:SettingsMosaqueTiledSettings TitreTitleSettings Marges haut/bas:Top/Bottom margins:SettingsTransparent TransparentSettings ArbreTreeSettings Type:Type:SettingsCurseur bloc deUse block insertion ofSettingsApparenceViewsSettingsApparenceViews settingsSettings"Colonnes visiblesVisible columnsSettingsLargeur:Width:Settings4Arrire plan de la fentreWindow BackgroundSettingsNombre de mots Word countSettings ZoomeZoomedSettingsminutes.minutes.Settingsxrvision(s) par tranche de 10 minutes pour la dernire heure*revisions per 10 minutes for the last hourSettingsRrvision(s) par jour pour le dernier mois$revisions per day for the last monthSettingsTrvision(s) par heure pour le dernier jour#revisions per hour for the last daySettingshrvision(s) par minute pour les dernires 10 minutes,revisions per minute for the last 10 minutesSettings`rvision(s) par semaine jusqu' la fin des temps'revisions per week till the end of timeSettingssecondes.seconds.Settings0&Ajouter au dictionnaire&Add to dictionary SpellAction4&Supprimer du dictionnaire&Remove from custom dictionary SpellActionSuggestionsSpelling Suggestions SpellAction, propos de ManuskriptAbout ManuskriptaboutManuskript Manuskriptabout>Version des logiciels utiliss:Software Versions in Use: aboutDialogVersionVersion aboutDialogCompileCompile abstractModel CibleGoal abstractModel LabelLabel abstractModelPOVPOV abstractModel StatusStatus abstractModel TitreTitle abstractModelNombre de mots Word count abstractModel.Traduction charge: {}.Loaded translation from {}: {}.appNote: aucune traduction n'a t trouve ou charge pour locale {}.:Note: No translator found or loaded from {} for locale {}.app6Rsum en quelques phrases:Few sentences summary: basicItemViewFormForm basicItemView Cible:Goal: basicItemView&Rsum en une ligneOne line summary basicItemViewPOV:POV: basicItemViewNombre de mots Word count basicItemViewNomNamecharacterModel$Nouveau personnage New charactercharacterModel ValeurValuecharacterModelPrincipalMaincharacterTreeView MineurMinorcharacterTreeViewSecondaire SecondarycharacterTreeViewPersonnages Characters cheatSheetxFiltrer (taper le nom de quoi que ce soit dans votre projet)2Filter (type the name of anything in your project) cheatSheetFormForm cheatSheetPrincipalMain cheatSheet MineurMinor cheatSheetIntriguesPlots cheatSheetSecondaire Secondary cheatSheet TextesTexts cheatSheet MondeWorld cheatSheetPrincipalMaincmbOutlineCharacterChoser MineurMinorcmbOutlineCharacterChoser AucunNonecmbOutlineCharacterChoserSecondaire SecondarycmbOutlineCharacterChoser&Diffrentes valeursVariouscmbOutlineCharacterChoser&Diffrentes valeursVariouscmbOutlineLabelChoser&Diffrentes valeursVariouscmbOutlineStatusChoserDock Widgets ToolbarcollapsibleDockWidgetsFormForm completerRsum complet Full summary corkDelegate&Rsum en une ligneOne line summary corkDelegateFormFormeditorWidget_uiExporterExportexporterExporter vers: Export to:exporter(Grer les exporteursManage exportersexporterPrvisualiserPreviewexporterRglagesSettingsexporter4{} (pas encore implment){} (not implemented yet)exporterDialogT<html><head/><body><p>Filtrer les lments qui seront inclus dans l'export.<br/><span style=" color:#773333;">(Pas encore pleinement implment.)</span></p></body></html>

Filters what items will be included in the final export.
(Not fully implemented yet.)

exporterSettings.Entre dossier et texte:Between folder and text:exporterSettings&Entre les dossiers:Between folders:exporterSettings.Entre texte et dossier:Between text and folder:exporterSettings"Entre les textes:Between texts:exporterSettingsContenuContentexporterSettingsPersonnalisCustomexporterSettings6Remplacements personnalissCustom replacements:exporterSettings^Choisissez ici ce qui sera inclu dans l'export.6Decide here what will be included in the final export.exporterSettingsLigne vide Empty lineexporterSettings ActivEnabledexporterSettingsFi&ltresFi<ersexporterSettings DosserFolderexporterSettings PoliceFontexporterSettings(Taille de la police: Font size:exporterSettingsPolice:Font:exporterSettingsFormFormexporterSettings<J'ai besoin de plus de finesseI need more granularityexporterSettingsSi la case est coche, une expression rgulire est utilise pour le remplacement. Sinon, le remplacement est effectu en texte simple.ZIf checked, uses regular expression for replacement. If unchecked, replaced as plain text.exporterSettingsIgnorer le statut de compilation (i.e. inclure tous les lments))Ignore compile status (include all items)exporterSettings LabelsLabelsexporterSettingsPrvisualiserPreviewexporterSettings RegExpRegExpexporterSettings:Supprimer les espaces doublesRemove multiple spacesexporterSettingsRemplacerReplaceexporterSettings(Remplacer --- avec Replace --- with —exporterSettings(Remplacer ... avec &Replace ... with …exporterSettingsVRemplacer les guillements doubles (") avec:Replace double quotes (") with:exporterSettingsVRemplacer les guillements simples (') avec:Replace single quotes (') with:exporterSettingsSparations SeparationsexporterSettings StatusStatusexporterSettings"Sous-lments de: Subitems of:exporterSettings TexteTextexporterSettings TitreTitleexporterSettingsTransformationsTransformationsexporterSettingsTypeTypeexporterSettings6Corrections typographiques:Typographic replacements:exporterSettingsParWithexporterSettings,{}Dossier de niveau {}{}Level {} folderexporterSettings({}Texte de niveau {}{}Level {} textexporterSettings$<b>Ncessite:</b> Requires: exportersManager8<b>Status:</b> non-install.Status: uninstalled.exportersManagerPersonnalisCustomexportersManagerInstall InstalledexportersManagerPas trouv Not foundexportersManagerfDfinir le chemin vers le fichier excutable de {}.Set {} executable path.exportersManager{} n'a pas t trouv. Install le, ou indiquez l'emplacement manuellement./{} not found. Install it, or set path manually.exportersManagerFrquence FrequencyfrequencyAnalyzerPhrasesPhrasesfrequencyAnalyzerMotWordfrequencyAnalyzerProgrsProgressfullScreenEditor Thme:Theme:fullScreenEditor TitreTitlefullScreenEditorNombre de mots Word countfullScreenEditor{} mots{} wordsfullScreenEditor{} mots / {} {} words / {}fullScreenEditorGnralGeneralgeneralSettings0Importer dans un dossierImport in a top-level foldergeneralSettingsImporter sous: Import under:generalSettings*Diviser les scnes :Split scenes at:generalSettingsHCouper les longs titres (> 32 chars)Trim long titles (> 32 chars)generalSettings\n---\n\n---\ngeneralSettingsInfobulle: Si tu me trouve drengant, tu peux me cacher via le menu Aide.8If you don't wanna see me, you can hide me in Help menu. helpLabel$Choisir un fichier Choose fileimporter2Dselectionner le fichier Clear fileimporterFormat:Format:importerImporterImportimporterPrvisualiserPreviewimporterRglagesSettingsimporter&Diffrentes valeursVarious lineEditView minutes minuteslocker mots wordslockerFormFormlockerBloquer !Lock !locker Bloquer l'cran: Lock screen:lockerCible: temps Time targetlockerCible: mots Word targetlocker{} restant {} remaininglocker {} s.{} s.locker {} mots restants{} words remaininglocker {}:{}{}:{}locker ~{} h.~{} h.locker~{} mn.~{} mn.locker Alt+UpAlt+Up mainEditorF11F11 mainEditorFormForm mainEditor0Aller l'lment parentGo to parent item mainEditor Cartes Index cards mainEditorPlanOutline mainEditor RacineRoot mainEditor TexteText mainEditor{} mots  {} words  mainEditor{} mots / {} {} words / {}  mainEditorMarkdownMarkdownmarkdownSettingsFormForm metadataViewRsum complet Full summary metadataView$Notes / RfrencesNotes / References metadataView&Rsum en une ligneOne line summary metadataViewProprits Properties metadataViewRvisions Revisions metadataView RsumSummary metadataView.Masquer automatiquement Auto-hidemyPanel&Copier&Copy outlineBasics&Supprimer&Delete outlineBasicsC&oller&Paste outlineBasics&Renommer&Rename outlineBasics<p><b>Tu es sur le point de supprimer {} lment(s).</b></p><p>En es-tu sr?</p>D

You're about to delete {} item(s).

Are you sure?

 outlineBasicsSuppressionAbout to remove outlineBasicsTous les lments doivent tre au mme niveau (avoir le mme parent).Ouvrir {} dans un nouvel ongletOpen {} in a new tab outlineBasicsXOuvrir {} lments dans des nouveaux ongletsOpen {} items in new tabs outlineBasics Icne par dfautRestore to default outlineBasics RacineRoot outlineBasicsSecondaire Secondary outlineBasicstChoisir au moins deux lments. Les dossiers sont ignors./Select at least two items. Folders are ignored. outlineBasics&Icne personnaliseSet Custom Icon outlineBasics Choisir le label Set Label outlineBasicsChoisir le POVSet POV outlineBasics"Choisir le status Set Status outlineBasicsPrincipalMainoutlineCharacterDelegate MineurMinoroutlineCharacterDelegate AucunNoneoutlineCharacterDelegateSecondaire SecondaryoutlineCharacterDelegate{} mots{} words outlineItem"{} mots / {} ({}){} words / {} ({}) outlineItem8Rglages spcifiques pour {}Custom settings for {}pandocSettingsGnralGeneralpandocSettings$Table des matiresTable of ContentpandocSettingsPrincipalMainpersosProxyModelMineursMinorspersosProxyModelSecondaire SecondarypersosProxyModel"Franchir le seuil1. Inciting event plotDelegate 1. Mise en place1. Setup plotDelegate1. Tournant1. Turning point plotDelegate2. Choix 2. Choice plotDelegate2. Dsastre 2. Disaster plotDelegate2. Renversement 2. Reversal plotDelegate3. Apoge 3. Climax plotDelegate3. Rsolution 3. Ending plotDelegate3. Redressement 3. Stand up plotDelegate AbysseAbyss plotDelegateApprocheApproach plotDelegateExpiation Atonement plotDelegate$Appel l'aventureCall to adventure plotDelegate ApogeClimax plotDelegateExposition Exposition plotDelegateAction en chuteFalling action plotDelegate&Pyramide de FreytagFreytag's pyramid plotDelegateGnralGeneral plotDelegateVoyage du hrosHero's journey plotDelegate&Rencontre du mentorMeeting with mentor plotDelegate Non etNo and plotDelegateMonde ordinaireOrdinary world plotDelegateProblmeProblem plotDelegateProgrsProgress plotDelegatePromessePromise plotDelegate Refus de l'appelRefusal of the call plotDelegateRsolution Resolution plotDelegate RetourReturn plotDelegate.Rcompense / RvlationReward / Revelation plotDelegateAction montante Rising action plotDelegatepreuvesTests plotDelegateTrois actes Three acts plotDelegateTransformationTransformation plotDelegate"Essayer / chouer Try / Fail plotDelegateOui maiYes but plotDelegatePrincipaleMain plotModelMetaMeta plotModelMineureMinor plotModelNomName plotModel"Nouvelle intrigueNew plot plotModelNouvelle tapeNew step plotModelSecondaire Secondary plotModel **Intrigue:** {} **Plot:** {} plotTreeViewPrincipaleMain plotTreeViewMineureMinor plotTreeViewSecondaire Secondary plotTreeViewPrincipaleMainplotsProxyModelMineursMinorsplotsProxyModelSecondaire SecondaryplotsProxyModelCompileCompilepropertiesViewFormFormpropertiesView CibleGoalpropertiesView LabelLabelpropertiesViewPOVPOVpropertiesView StatusStatuspropertiesViewNombre de mots Word countpropertiesView<<b>Rfrence inconnue:</b> {}.Unknown reference: {}. references,Informations gnrales Basic info references*Personnage: <b>{}</b>Character: {} referencesPersonnages Characters referencesConflitConflict referencesDescription Description references.Informations dtailles Detailed info referencespiphanieEpiphany references$Dossier: <b>{}</b>Folder: {} referencesAller {}. Go to {}. references CibleGoal references Label:Label: referencesRsum long: Long summary: referencesRsum longLonger summary referencesMotivation Motivation references,Pas une rfrence: {}.Not a reference: {}. references Notes:Notes: referencesPOV de:POV of: referencesPOV:POV: referencesPassionPassion referencesChemin:Path: references&Intrigue: <b>{}</b>Plot: {} referencesRfrenc dans:Referenced in: references(tapes de rsolutionResolution steps referencesRsultatResult referencesRsum court Short summary referencesRsum court:Short summary: references Stats:Stats: referencesStatus:Status: references Texte: <b>{}</b>Text: {} references.Rfrence inconnue: {}.Unknown reference: {}. references4Monde: <b>{name}</b>{path}World: {name}{path} referencesIl y a un jour 1 day ago revisionsEffacer tout Clear all revisionsSupprimerDelete revisionsFormForm revisionsLigne {}:Line {}: revisionsOptionsOptions revisionsRestaurerRestore revisions6Montrer la version ancienneShow ancient version revisions2Montrer les modificationsShow modifications revisionsFMontrer les modifications seulementShow modifications only revisions&Montrer les espaces Show spaces revisionsIl y a {} jours {} days ago revisions Il y a {} heures {} hours ago revisions"Il y a {} minutes{} minutes ago revisionsIl y a {} mois {} months ago revisions$Il y a {} secondes{} seconds ago revisionsIl y a {} ans {} years ago revisionsToutAllsearch&Sensible la casseCase sensitivesearchFormFormsearch LabelLabelsearch NotesNotessearchOptions:Options:searchPOVPOVsearch&Texte rechercher & Search for...search Rechercher dans: Search in:search StatusStatussearch RsumSummarysearch TexteTextsearch TitreTitlesearch(lecture seule) (read-only)settingsWindow ErreurErrorsettingsWindowNouveau label New labelsettingsWindowNouveau status New statussettingsWindowNouveau Thme New themesettingsWindownouveauthemenewthemesettingsWindowFormForm sldImportancePrincipalMain sldImportance MineurMinor sldImportanceSecondaire Secondary sldImportanceTextLabel TextLabel sldImportanceJ <p>Divise le(s) lment(s) la marque suivante.</p> <p>Si l'un des lments slectionns est un dossier, l'effet sera appliqu de manire rcursive <i>chacun</i> des sous-lments.</p> <p>La marque de sparation peut contenir les charactres d'chapement suivants: <ul> <li><b><code>\n</code></b>: retour la ligne</li> <li><b><code>\t</code></b>: tabulation</li> </ul> </p> <p><b>Marque:</b></p> 

Split selected item(s) at the given mark.

If one of the selected item is a folder, it will be applied recursively to all of it's children items.

The split mark can contain following escape sequences:

  • \n: line break
  • \t: tab

Mark:

 splitDialogDiviser '{}' Split '{}' splitDialogBDiviser les lments slectionns Split items splitDialogFormForm storylineView.Montrer les personnagesShow Characters storylineView*Montrer les intrigues Show Plots storylineView,Fermer l'cran partag Close split tabSplitter`Ouvrir les lments slectionns dans cette vue.!Open selected items in that view. tabSplitter:cran partag horizontalementSplit horizontally tabSplitter6cran partag verticalementSplit vertically tabSplitter&Diffrentes valeursVarious textEditView CTRL+GCTRL+B textFormat CTRL+ECTRL+E textFormat CTRL+ICTRL+I textFormat CTRL+JCTRL+J textFormat CTRL+LCTRL+L textFormat CTRL+PCTRL+P textFormat CTRL+RCTRL+R textFormat CTRL+UCTRL+U textFormatFormForm textFormatTout fermer Collapse AlltreeViewFermer {} Collapse {}treeViewTout dvelopper Expand AlltreeViewDvelopper {} Expand {}treeView1welcomeD<b>Total:</b> {} mots (~ {} pages)#Total: {} words (~ {} pages)welcome"Ajouter un niveau Add levelwelcome2Ajouter le nombre de motsAdd word countwelcome LivreBookwelcomeChapitreChapterwelcome CrerCreatewelcome.Crer un nouveau projetCreate New Projectwelcome0Projets de dmonstration Demo projectswelcomeVideEmptywelcomeFiction vide Empty fictionwelcome Non-fiction videEmpty non-fictionwelcomeFictionFictionwelcome FinalFinalwelcome"Premier brouillon First draftwelcomeFormFormwelcomeIdeIdeawelcomeManuskript Manuskriptwelcome2Projet Manuskript (*.msk)Manuskript project (*.msk)welcome`Projet manuskript (*.msk);;Tous les fichiers (*))Manuskript project (*.msk);;All files (*)welcomevLa prochaine fois, ouvrir automatiquement le dernier projet*Next time, automatically open last projectwelcomeNon-fiction Non-fictionwelcomeNoteNotewelcome RomanNovelwelcomeNouvelleNovellawelcome Ouvrir le projet Open projectwelcomeOuvrir...Open...welcome>craser le projet existant {} ?Overwrite existing project {} ?welcomeRcentsRecentwelcomeRechercheResearchwelcome$Article acadmiqueResearch paperwelcome:Enregistrer le projer sous...Save project as...welcome ScneScenewelcome Second brouillon Second draftwelcomeSectionSectionwelcomeHistoire courte Short StorywelcomeQuelque chose SomethingwelcomeTODOTODOwelcomeModles Templateswelcome TexteTextwelcomeTrilogieTrilogywelcomeAttentionWarningwelcomedeofwelcomemots chacun(e). words each.welcomeArchitecture Architecture worldModelAstronomie Astronomy worldModel"Language corporelBodily language worldModelCalendrierCalendar worldModel ClimatClimate worldModelRelations Courtship worldModelCultureCultural worldModelCoutumesCustoms worldModelDmographie Demography worldModelMaladiesDiseases worldModel HabitsDresses worldModelducation Education worldModelthiqueEthics worldModelFantasyFantasy world building worldModel FloreFlora worldModelNourritureFood worldModelRles de genres Gender roles worldModelGouvernement Government worldModelHistoireHistory worldModel"Objets importantsImportant objects worldModel Lieux importantsImportant places worldModelLangues Languages worldModel Magie Magic system worldModelObjets magiquesMagical objects worldModel"Endroits magiquesMagical places worldModelRaces magiques Magical races worldModelMdecineMedicine worldModelMilitaireMilitary worldModelMusique et artsMusic and arts worldModelNouvel lmentNew item worldModelOrganisation Organization worldModelPhysiquePhysical worldModelPolitiquePolitics worldModel RacesRaces worldModelReligionReligion worldModelLoisRules worldModelScienceScience worldModelTechnologie Technology worldModelTopographie Topography worldModelTransportTransportation worldModel Faune Wild life worldModelmanuskript-0.10.0/i18n/manuskript_fr.ts000066400000000000000000005503351354442177200200240ustar00rootroot00000000000000 Export Default exporter, provides basic formats used by other exporters. Exporteur de base, fournit les formats de base utilisés par les autres exporteurs. Basic HTML output using the Python module 'markdown'. Format HTML de base, utilisant le module python 'markdown'. Python module 'markdown'. module python 'markdown'. A little known format modestly used. You know, web sites for example. Un format utilisé parfois, pour les sites internet par exemple. <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> <p>Un convertisseur universel de document. Peut être utilisé pour convertir du markdown dans un grand nombre de formats.</p> <p>Site internet: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. Comme en texte brute, mais rajoute les titres markdown. Preview with highlighter. Aperçu avec coloration syntaxique. Plain text Texte brute Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. Export le plus simple, en texte brute. Permet d'utiliser des langages que manuskript ne comprends pas. Par exemple <a href='www.fountain.io'>Fountain</a>. Markdown source Source markdown HTML Source Source HTML HTML Output Sortie HTML Error Erreur Books that don't kill trees. Des livres qui ne tuent pas les arbres. OpenDocument format. Used by LibreOffice for example. Format OpenDocument. Utilisé notamment par LibreOffice. Microsoft Office (.docx) document. Document Microsoft Office (.docx). Needs LaTeX to be installed. Nécessite d'avoir installé LaTeX. Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. Export vers markdown en utilisant pandoc. Permet plus de possibilités que l'exporteur basique intégré à manuskript. reStructuredText is a lightweight markup language. reStructuredText est un langage de balisage léger. LaTeX is a word processor and document markup language used to create beautiful documents. LaTeX est une suite d'outil et un format utilisé pour créer des documents magnifiques. Standalone document (not just a fragment) Document autonome (pas juste un fragment) Include a table of contents. Inclure une table des matières. Number of sections level to include in TOC: Nombre de niveau à inclure dans la table des matières: Typographically correct output Corrections typographiques Normalize the document (cleaner) Normalise le document (plus propre) Specify the base level for headers: Spécifier le niveau de base pour les titres: Use reference-style links instead of inline links Utilise des références pour les liens, et non intégrés dans le texte Use ATX-style headers Utiliser le format ATX pour les titres Self-contained HTML files, with no dependencies Document HTML autonome, sans dépendances externes Use <q> tags for quotes in HTML Utilise le tag <q> pour les citations en HTML LaTeX engine used to produce the PDF. Le moteur LaTeX utilisé pour produire le PDF. Paper size: Taille du papier : Font size: Taille de la police : Class: Classe : Line spacing: Espacement des lignes : a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. nécessite une installation latex valide. Voir les recommendations de pandoc sur <a href="http://pandoc.org/installing.html">http://pandoc.org/installing.html</a>. Pour le support unicode, il vous faut xelatex. The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. Le but de ce format est de fournir un moyen d'échanger des informations entre outliners et services internet. Disable YAML metadata block. Use that if you get YAML related error. Désactiver le bloc de métadonnée YAML. Cochez ceci si vous avez des erreurs liées à YAML. Convert to ePUB3 Convertir vers ePUB3 Could not process regular expression: {} Erreur avec une expression régulière: {} Choose output file… Choisir le fichier de sortie... ExportersManager Manage Exporters Gérer les Exporteurs Manuskript Manuskript Description Description Offers export to Offre l'export vers Status Status Status: Status : Version: Version: Path: Chemin: ... ... {HelpText} {HelpText} FrequencyAnalyzer Frequency Analyzer Analyseur de fréquence Word frequency Fréquence des mots Settings Réglages Minimum size: Taille minimum: Exclude words (comma separated): Exclure les mots<br>(séparés par des virgules): Analyze Analyser Phrase frequency Fréquence des phrases Number of words: from Nombre de mots: de to à Import Markdown import Importation markdown <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; <b>Info:</b> Un simple parser qui va parcourir le document markdown et créer des éléments à chaque titre détecté.<br/>&nbsp; Folder import Importation depuis un dossier <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> <p><b>Info:</b> Importe la structure d'un dossier. Les dossiers sont crées comme dossiers, et les documents textes sont ajoutés comme des scènes.</p> <p>Seulement les fichiers textes sont supportés (pas les images, fichiers binaires ou autres).</p> Include only those extensions: Inclure seulement ces extensions: Comma separated values Valeurs séparées par des virgules Sort items by name Trier les éléments par leur noms Import folder then files Importer les dossiers en premier OPML Import Importation OPML File open failed. Echec de l'ouverture du fichier This does not appear to be a valid OPML file. Le fichier ne semble pas être un fichier OPML valide. Pandoc import Importation Pandoc <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; <b>Info:</b> Manuskript peut importer soit depuis <b>markdown</b> soit <b>OPML</b>. Pandoc va convertir votre document vers l'un ou l'autre (option ci-dessous), et ensuite être importé dans manuskript. L'un ou l'autre pourrait donner de meilleurs résultats en fonction de votre document.<br/>&nbsp; Import using: Importer via: Wrap lines: Replier les lignes: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> <p>Pandoc doit-il créer des retours à la lignes cosmétiques/non-sémantiques?</p> <p><b>auto</b>: plier les lignes à 72 charactères.<br> <b>none</b>: pas de retours à la lignes.<br> <b>preserve</b>: essaie de préserver les retours à la lignes du document original.</p> Mind Map Import Importation Mind Map This does not appear to be a valid Mind Map file. Cela ne ressemble pas à un fichier Mind Map valide. Mind Map import Importation Mind Map Import tip as: Importer les pointes comme: Untitled Sans titre MDEditCompleter Insert reference Insérer une référence MainWindow Title Titre Subtitle Sous-titre Series Série Volume Volume Genre Genre License License Author Informations sur l'auteur Name Nom Email Email Summary Résumé One sentence Une phrase One sentence summary Résumé en une phrase Next Suivant One paragraph Un paragraphe One paragraph summary Résumé en un paragraphe One page Une page Expand each sentence of your one paragraph summary to a paragraph Développez chaque phrase du paragraphe précédent en un paragraphe complet Full Complet One page summary Résumé en une page Full summary Résumé complet Characters Personnages Names Noms Filter Filtre Basic info Informations générales Importance Importance Motivation Motivation Goal Cible Conflict Conflit Epiphany Épiphanie <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="right">Résumé<br/>en une phrase</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> <html><head/><body><p align="right">Résumé<br/>en un paragraphe</p></body></html> Notes Notes Detailed info Informations détaillées Plots Intrigues Plot Intrigue Character(s) Personnage(s) Description Description Result Résultat Resolution steps Étapes de résolution Outline Plan Editor Rédaction Debug Debug FlatData FlatData Persos Persos &Help &Aide Ctrl+O Ctrl+S Ctrl+S Ctrl+Shift+S Ctrl+Q Ctrl+Shift+B F8 Labels Labels Situation: Situation: Summary: Résumé: What if...? Et si... ? Index cards Cartes F9 F9 Tree Arbre Compile Compilation F6 F6 World Monde Populates with empty data Remplir avec des catégories vides General Général More Plus Source of passion Source de passion Source of conflict Source de conflit Project {} saved. Le projet {} a été enregistré. Project {} loaded. Le projet {} a été chargé. Project {} loaded with some errors: Le projet {} a été chargé, avec des erreurs: * {} wasn't found in project file. * {} n'a pas été trouvé dans le fichier du projet. Project {} loaded with some errors. Le projet {} a été chargé avec des erreurs. (~{} pages) (~{} pages) Words: {}{} Mots: {}{} Book summary Résumé du livre Project tree Arborescence Metadata Métadonnées Enter information about your book, and yourself. Entrez toutes les informations relatives au livre, ainsi qu'à vous. Create your characters. Créez ici vos personnage. Develop plots. Développez vos intrigues. Create the outline of your masterpiece. Créez le plan de votre chef-d'œuvre. Write. Écrivez. Debug info. Sometimes useful. Des informations pour débugger des fois pendant qu'on code c'est utile. Dictionary Dictionnaire Nothing Rien POV POV Label Label Progress Progrès Icon color Couleur de l'icone Text color Couleur du texte Background color Couleur de l'arrière-plan Icon Icone Text Texte Background Arrière-plan Border Bordure Corner Coin &File &Fichier &Recent &Récents &Tools &Outils &View &Vue &Mode &Mode &Cheat sheet &Feuille de triche Sea&rch &Recherche &Navigation &Navigation &Open &Ouvrir &Save &Enregistrer Sa&ve as... Enre&gistrer sous… &Quit &Quitter &Show help texts &Afficher les bulles d'aides &Spellcheck &Correcteur orthographique &Labels... &Labels… &Status... &Status… &Simple &Simple &Fiction &Fiction S&ettings &Réglages &Close project &Fermer le projet Co&mpile Co&mpiler &Frequency Analyzer &Analyseur de fréquence Story line The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) La situation de base, sous la forme d'une question "Et si…?". Par exemple: "Et si le plus dangereux des sorciers maléfiques n'était pas capable de tuer un petit bébé?" (Harry Potter) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Prenez le temps de penser à une phrase (~50 mots) qui résume votre livre. Ensuite, développez-là en un paragraphe, puis une page, puis un résumé complet. &Edit &Édition Book information Informations sur le livre &About &A propos About Manuskript À propos de Manuskript Manuskript Manuskript WARNING: Project {} not saved. ATTENTION: Le projet {} n'a pas été enregistré. Build worlds. Create hierarchy of broad categories down to specific details. Construire des mondes. Crée une hierarchie en partant des catégories les plus larges jusqu'au détails les plus spécifiques. Add plot step Ajouter une étape de résolution (CTRL+Enter) &Import… &Importer… F7 F7 &Copy &Copier Ctrl+C Ctrl+C C&ut C&ouper Ctrl+X Ctrl+X &Paste C&oller Ctrl+V Ctrl+V &Split… &Diviser… Ctrl+Shift+K Ctrl+Shift+K Sp&lit at cursor Di&viser au curseur Ctrl+K Ctrl+K Ctrl+M Ctrl+M Ctrl+D Ctrl+D Del Del &Move Up Déplacer vers le haut Ctrl+Shift+Up Ctrl+Shift+Up M&ove Down Déplacer vers le bas Ctrl+Shift+Down Ctrl+Shift+Bas Dupl&icate Dupl&iquer &Delete &Supprimer &Rename &Renommer F2 F2 Organi&ze Or&ganisation M&erge &Fusionner &Format &Format &Header &Titre &Level 1 (setext) &Niveau 1 (setext) Ctrl+Alt+1 Ctrl+Alt+1 Level &2 Niveau &2 Ctrl+Alt+2 Ctrl+Alt+2 Level &1 (atx) Niveau &1 (atx) Ctrl+1 Ctrl+1 L&evel 2 Ctrl+2 Ctrl+2 Level &3 Niveau &3 Ctrl+3 Ctrl+3 Level &4 Niveau &4 Ctrl+4 Ctrl+4 Level &5 Niveau &5 Ctrl+5 Ctrl+5 Level &6 Niveau &6 Ctrl+6 Ctrl+6 &Bold &Gras Ctrl+B Ctrl+B &Italic &Italique Ctrl+I Ctrl+I &Strike &Verbatim Su&perscript Ctrl++ Subsc&ript Ctrl+- Co&mment block Ctrl+Shift+C Clear &formats Ctrl+0 Ctrl+0 &Comment line(s) &Ordered list &Unordered list B&lockquote Remove selected plot step(s) The file {} does not exist. Has it been moved or deleted? Install {}{} to use spellcheck {} has no installed dictionaries {}{} is not installed Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings General Général Views Apparence Labels Labels Status Status Fullscreen Plein écran General settings Réglages généraux Application settings Style de l'application Saving Enregistrement Automatically save every Enregistrer automatiquement toutes les minutes. minutes. If no changes during S'il n'y a pas de modification durant seconds. secondes. Save on project close Enregistrer en quittant Views settings Apparence Tree Arbre Colors Couleurs Icon color: Icone: Nothing Rien POV POV Label Label Progress Progrès Compile Compilation Text color: Texte: Background color: Arrière-plan: Folders Dossiers Text Texte Outline Plan Visible columns Colonnes visibles Goal Cible Word count Nombre de mots Percentage Pourcentage Title Titre Index cards Cartes Item colors Couleurs des cartes Border color: Bordure: Corner color: Coin: Background Arrière-plan Color: Couleur: Ctrl+S Ctrl+S Image: Image: New Nouveau Edit Modifier Delete Supprimer Theme name: Nom du thème: Apply Enregistrer Cancel Annuler Window Background Arrière plan de la fenêtre Text Background Arrière plan du texte Text Options Options du texte Paragraph Options Options des paragraphes Type: Type: No Image Pas d'image Tiled Mosaïque Centered Centrée Stretched Étirée Scaled Mise à l'échelle Zoomed Zoomée Opacity: Opacité: % % Position: Position: Left Gauche Center Centre Right Droite Width: Largeur: px px Corner radius: Arrondi: Margins: Marges: Padding: Intérieur: Font: Police: Size: Taille: Misspelled: Orthographe: Line spacing: Espacement des lignes: Single Simple 1.5 lines 1.5 lignes Double Double Proportional Proportionnel Tab width: Tabulation: Spacing: Espacement: Indent 1st line Retrait 1ère ligne Settings Réglages Loading Chargement Automatically load last project on startup Charger au démarrage le dernier projet ouvert Text editor Éditeur de texte Font Police Family: Famille: Paragraphs Paragraphes Background: Arrière-plan: Revisions Révisions Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. Les révisions sont un moyen de garder une trace des modifications apportées à un texte. Pour chaque texte, chaque changement que vous apportez est enregistré, vous permettant de comparer la version actuelle avec des versions antérieures, et de les restaurer. Keep revisions Garder les révisions Keep: Garder: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. La suppression intelligente vous permet de ne garder qu'un certain nombre de révisions. Il est fortement recommander de l'utiliser, sous peine de voir ses documents envahis de millieurs de modifications insignifiantes. revisions per day for the last month révision(s) par jour pour le dernier mois revisions per minute for the last 10 minutes révision(s) par minute pour les dernières 10 minutes revisions per hour for the last day révision(s) par heure pour le dernier jour revisions per 10 minutes for the last hour révision(s) par tranche de 10 minutes pour la dernière heure revisions per week till the end of time révision(s) par semaine jusqu'à la fin des temps <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> <html><head/><body><p>Si vous cochez cette option, le projet sera enregistrer en un seul fichier. Plus facile à copier, mais ne permet pas de travailler en collaboration, ou d'utiliser un gestionnaire de version extérieur.<br/>Si l'option n'est pas cochée, le projet sera sauvegardé en un dossier contenant de nombreux petits fichiers.</p></body></html> Save to one single file Enregistrer dans un seul fichier S&mart remove &Supression intelligente Show ite&m count Montrer le &nombre d'éléments Show summary Montrer le résummé &Nothing &Rien Style Apparence Cursor Curseur Use block insertion of Curseur bloc de Alignment: Alignement: Justify Justifié Alignment Alignement Icon Size Taille des icônes TextLabel TextLabel Disable blinking Désactiver le clignotement du curseur Text area Zone de texte Max width Largeur maximale Left/Right margins: Marges gauche/droite: Top/Bottom margins: Marges haut/bas: S&how progress Montrer le progrès Show summar&y Montrer le résummé Show p&rogress Montrer le progrès Old st&yle Ancien style Transparent Transparent Restore defaults Couleurs par défaut Style: Language: Font size: Restarting Manuskript ensures all settings take effect. Show &word count &Show word count &New style Typewriter mode Focus mode None Aucun Sentence Line Paragraph <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions Suggestions &Add to dictionary &Ajouter au dictionnaire &Remove from custom dictionary &Supprimer du dictionnaire about About Manuskript À propos de Manuskript Manuskript Manuskript aboutDialog Version Version Software Versions in Use: Version des logiciels utilisés: abstractModel Title Titre POV POV Label Label Status Status Compile Compile Word count Nombre de mots Goal Cible basicItemView Form Form POV: POV: Goal: Cible: Word count Nombre de mots One line summary Résumé en une ligne Few sentences summary: Résumé en quelques phrases: characterModel New character Nouveau personnage Name Nom Value Valeur characterTreeView Main Principal Secondary Secondaire Minor Mineur cheatSheet Form Form Minor Mineur Secondary Secondaire Main Principal Characters Personnages Texts Textes Plots Intrigues World Monde Filter (type the name of anything in your project) Filtrer (taper le nom de quoi que ce soit dans votre projet) cmbOutlineCharacterChoser None Aucun Main Principal Secondary Secondaire Minor Mineur Various Différentes valeurs cmbOutlineLabelChoser Various Différentes valeurs cmbOutlineStatusChoser Various Différentes valeurs collapsibleDockWidgets Dock Widgets Toolbar completer Form Form corkDelegate One line summary Résumé en une ligne Full summary Résumé complet editorWidget_ui Form Form exporter Export Exporter Export to: Exporter vers: Manage exporters Gérer les exporteurs Preview Prévisualiser Settings Réglages exporterDialog {} (not implemented yet) {} (pas encore implémenté) exporterSettings Form Form Content Contenu Decide here what will be included in the final export. Choisissez ici ce qui sera inclu dans l'export. Type Type Title Titre Text Texte I need more granularity J'ai besoin de plus de finesse Fi&lters Fi&ltres <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> <html><head/><body><p>Filtrer les éléments qui seront inclus dans l'export.<br/><span style=" color:#773333;">(Pas encore pleinement implémenté.)</span></p></body></html> Ignore compile status (include all items) Ignorer le statut de compilation (i.e. inclure tous les éléments) Subitems of: Sous-éléments de: Labels Labels Status Status Separations Séparations Between folders: Entre les dossiers: Empty line Ligne vide Custom Personnalisé Between texts: Entre les textes: Between folder and text: Entre dossier et texte: Between text and folder: Entre texte et dossier: Transformations Transformations Typographic replacements: Corrections typographiques: Replace ... with … Remplacer ... avec … Replace --- with — Remplacer --- avec — Replace double quotes (") with: Remplacer les guillements doubles (") avec: Replace single quotes (') with: Remplacer les guillements simples (') avec: Remove multiple spaces Supprimer les espaces doubles Custom replacements: Remplacements personnalisés Enabled Activé Replace Remplacer With Par RegExp RegExp If checked, uses regular expression for replacement. If unchecked, replaced as plain text. Si la case est cochée, une expression régulière est utilisée pour le remplacement. Sinon, le remplacement est effectué en texte simple. Preview Prévisualiser Font Police Font: Police: Font size: Taille de la police: Folder Dosser {}Level {} folder {}Dossier de niveau {} {}Level {} text {}Texte de niveau {} exportersManager Installed Installé Not found Pas trouvé {} not found. Install it, or set path manually. {} n'a pas été trouvé. Installé le, ou indiquez l'emplacement manuellement. <b>Status:</b> uninstalled. <b>Status:</b> non-installé. <b>Requires:</b> <b>Nécessite:</b> Custom Personnalisé Set {} executable path. Définir le chemin vers le fichier exécutable de {}. frequencyAnalyzer Phrases Phrases Frequency Fréquence Word Mot fullScreenEditor Theme: Thème: {} words / {} {} mots / {} {} words {} mots Spellcheck Navigation New Text Title Titre Title: Show Full Path Theme selector Word count Nombre de mots Progress Progrès Progress: Auto Show/Hide Clock Clock: Show Seconds generalSettings General Général Split scenes at: Diviser les scènes à: \n---\n \n---\n Trim long titles (> 32 chars) Couper les longs titres (> 32 chars) Import under: Importer sous: Import in a top-level folder Importer dans un dossier helpLabel If you don't wanna see me, you can hide me in Help menu. Infobulle: Si tu me trouve dérengant, tu peux me cacher via le menu Aide. importer Import Importer Format: Format: Choose file Choisir un fichier Clear file Déselectionner le fichier Preview Prévisualiser Settings Réglages lastAccessedDirectoryInfo Last accessed directory "{}" loaded. lineEditView Various Différentes valeurs locker Form Form Lock screen: Bloquer l'écran: Word target Cible: mots Time target Cible: temps words mots minutes minutes Lock ! Bloquer ! ~{} h. ~{} h. ~{} mn. ~{} mn. {}:{} {}:{} {} s. {} s. {} remaining {} restant {} words remaining {} mots restants mainEditor Root Racine Form Form Text Texte Index cards Cartes Outline Plan F11 F11 Go to parent item Aller à l'élément parent Alt+Up Alt+Up {} words / {} {} mots / {} {} words {} mots markdownSettings Markdown Markdown metadataView Form Form Properties Propriétés Summary Résumé One line summary Résumé en une ligne Notes / References Notes / Références Revisions Révisions Full summary Résumé complet myPanel Auto-hide Masquer automatiquement outlineBasics Set POV Choisir le POV Set Status Choisir le status Set Label Choisir le label None Aucun New Nouveau Main Principal Secondary Secondaire Minor Mineur Set Custom Icon Icône personnalisée Restore to default Icône par défaut Root Racine Open {} items in new tabs Ouvrir {} éléments dans des nouveaux onglets Open {} in a new tab Ouvrir {} dans un nouvel onglet About to remove Suppression <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> <p><b>Tu es sur le point de supprimer {} élément(s).</b></p><p>En es-tu sûr?</p> Select at least two items. Folders are ignored. Choisir au moins deux éléments. Les dossiers sont ignorés. All items must be on the same level (share the same parent). Tous les éléments doivent être au même niveau (avoir le même parent). New &Folder Nouveau Dossier New &Text Nouveau Texte &Copy &Copier C&ut C&ouper &Paste C&oller &Rename &Renommer &Delete &Supprimer outlineCharacterDelegate None Aucun Main Principal Secondary Secondaire Minor Mineur outlineItem {} words / {} ({}) {} mots / {} ({}) {} words {} mots pandocSettings General Général Table of Content Table des matières Custom settings for {} Réglages spécifiques pour {} persosProxyModel Main Principal Secondary Secondaire Minors Mineurs plotDelegate General Général Promise Promesse Problem Problème Progress Progrès Resolution Résolution Try / Fail Essayer / Échouer Freytag's pyramid Pyramide de Freytag Exposition Exposition Rising action Action montante Climax Apogée Falling action Action en chute Three acts Trois actes 1. Setup 1. Mise en place 1. Inciting event Franchir le seuil 1. Turning point 1. Tournant 2. Choice 2. Choix 2. Reversal 2. Renversement 2. Disaster 2. Désastre 3. Stand up 3. Redressement 3. Climax 3. Apogée 3. Ending 3. Résolution Hero's journey Voyage du héros Ordinary world Monde ordinaire Call to adventure Appel à l'aventure Refusal of the call Refus de l'appel Meeting with mentor Rencontre du mentor Tests Épreuves Approach Approche Abyss Abysse Reward / Revelation Récompense / Révélation Transformation Transformation Atonement Expiation Return Retour No and Non et Yes but Oui mai plotModel New plot Nouvelle intrigue Main Principale Secondary Secondaire Minor Mineure Name Nom Meta Meta New step Nouvelle étape plotTreeView Main Principale Secondary Secondaire Minor Mineure **Plot:** {} **Intrigue:** {} plotsProxyModel Main Principale Secondary Secondaire Minors Mineurs propertiesView Form Form POV POV Status Status Label Label Compile Compile Goal Cible Word count Nombre de mots references Unknown reference: {}. Référence inconnue: {}. Text: <b>{}</b> Texte: <b>{}</b> Character: <b>{}</b> Personnage: <b>{}</b> Basic info Informations générales Detailed info Informations détaillées POV of: POV de: Referenced in: Référencé dans: Motivation Motivation Goal Cible Conflict Conflit Epiphany Épiphanie Short summary Résumé court Longer summary Résumé long Path: Chemin: Stats: Stats: POV: POV: Status: Status: Label: Label: Short summary: Résumé court: Long summary: Résumé long: Notes: Notes: Not a reference: {}. Pas une référence: {}. Go to {}. Aller à {}. Description Description Result Résultat Characters Personnages Resolution steps Étapes de résolution Plot: <b>{}</b> Intrigue: <b>{}</b> Passion Passion World: <b>{name}</b>{path} Monde: <b>{name}</b>{path} <b>Unknown reference:</b> {}. <b>Référence inconnue:</b> {}. Folder: <b>{}</b> Dossier: <b>{}</b> revisions Form Form Restore Restaurer Delete Supprimer 1 day ago Il y a un jour {} days ago Il y a {} jours {} hours ago Il y a {} heures {} minutes ago Il y a {} minutes {} seconds ago Il y a {} secondes Options Options Show modifications Montrer les modifications Show ancient version Montrer la version ancienne Show spaces Montrer les espaces Show modifications only Montrer les modifications seulement Line {}: Ligne {}: {} years ago Il y a {} ans {} months ago Il y a {} mois Clear all Effacer tout search Form Form Search in: Rechercher dans: All Tout Title Titre Text Texte Summary Résumé Notes Notes POV POV Status Status Label Label Options: Options: Case sensitive Sensible à la casse Search for... Texte à rechercher… settingsWindow New status Nouveau status New label Nouveau label newtheme nouveautheme New theme Nouveau Thème (read-only) (lecture seule) Open Image Image files (*.jpg; *.jpeg; *.png) Error Erreur Unable to load selected file Unable to add selected image: {} sldImportance Form Form TextLabel TextLabel Minor Mineur Secondary Secondaire Main Principal splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> <p>Divise le(s) élément(s) à la marque suivante.</p> <p>Si l'un des éléments sélectionnés est un dossier, l'effet sera appliqué de manière récursive à <i>chacun</i> des sous-éléments.</p> <p>La marque de séparation peut contenir les charactères d'échapement suivants: <ul> <li><b><code>\n</code></b>: retour à la ligne</li> <li><b><code>\t</code></b>: tabulation</li> </ul> </p> <p><b>Marque:</b></p> Split '{}' Diviser '{}' Split items Diviser les éléments sélectionnés storylineView Form Form Show Plots Montrer les intrigues Show Characters Montrer les personnages tabSplitter Open selected items in that view. Ouvrir les éléments sélectionnés dans cette vue. Split horizontally Écran partagé horizontalement Close split Fermer l'écran partagé Split vertically Écran partagé verticalement textEditView Various Différentes valeurs textFormat CTRL+B CTRL+G CTRL+I CTRL+I CTRL+U CTRL+U CTRL+P CTRL+P CTRL+L CTRL+L CTRL+E CTRL+E CTRL+R CTRL+R CTRL+J CTRL+J Form Form treeView Expand {} Développer {} Collapse {} Fermer {} Expand All Tout développer Collapse All Tout fermer welcome Form Form 1 Templates Modèles Empty Vide Novel Roman Novella Nouvelle Short Story Histoire courte Research paper Article académique Demo projects Projets de démonstration Add level Ajouter un niveau Add word count Ajouter le nombre de mots Next time, automatically open last project La prochaine fois, ouvrir automatiquement le dernier projet Open... Ouvrir... Recent Récents Create Créer Open project Ouvrir le projet Manuskript project (*.msk) Projet Manuskript (*.msk) Save project as... Enregistrer le projer sous... Create New Project Créer un nouveau projet Chapter Chapitre Scene Scène Trilogy Trilogie Book Livre Section Section words each. mots chacun(e). of de Text Texte Something Quelque chose <b>Total:</b> {} words (~ {} pages) <b>Total:</b> {} mots (~ {} pages) Idea Idée Note Note Research Recherche TODO TODO First draft Premier brouillon Second draft Second brouillon Final Final Manuskript project (*.msk);;All files (*) Projet manuskript (*.msk);;Tous les fichiers (*) Empty fiction Fiction vide Empty non-fiction Non-fiction vide Fiction Fiction Non-fiction Non-fiction Manuskript Manuskript Warning Attention Overwrite existing project {} ? Écraser le projet existant {} ? worldModel New item Nouvel élément Fantasy world building Fantasy Physical Physique Climate Climat Topography Topographie Astronomy Astronomie Wild life Faune Flora Flore History Histoire Races Races Diseases Maladies Cultural Culture Customs Coutumes Food Nourriture Languages Langues Education Éducation Dresses Habits Science Science Calendar Calendrier Bodily language Language corporel Ethics Éthique Religion Religion Government Gouvernement Politics Politique Gender roles Rôles de genres Music and arts Musique et arts Architecture Architecture Military Militaire Technology Technologie Courtship Relations Demography Démographie Transportation Transport Medicine Médecine Magic system Magie Rules Lois Organization Organisation Magical objects Objets magiques Magical places Endroits magiques Magical races Races magiques Important places Lieux importants Important objects Objets importants Natural resources manuskript-0.10.0/i18n/manuskript_hu.qm000066400000000000000000002240551354442177200200150ustar00rootroot00000000000000]y[sTsT;T R֍֍*֍ ֍֍֍3֍֍ ֍+֍@֍֍9֍֍3֍-,S|T|u"||\|L^TW+xE7x7W77į77{7ָ7y7*7i<FWH5WH5H5OL>cLWTaTxVEz6VE-VEVEnVsd[CmddRd*z$yfTe.  MJp*y<*yW*<*%=f*0=+E>+f?A+?+@V+B'.30 Q93t;A[G:lGHw9nJML7PnLGLbLbM|M6 Mezt$MezMŅTSNWQ:wRxURxwRxRxډRxTbTb~TbTbTbTbTbآTbTWUjXUjUlV':.V XVW6[zW6Xy X5YE]YYȀ͏ZZ%ZʳkZϳ>[p[ %f[ %[ %[ %[ %.[ %[ٵ:\y\F\\^i$h^^i$rgUynT8=^-s!7MvK( }Y}(Bwur_ofBW~WIQ e.CkdDDzDo"sm- NE:P2yiMtO+36ݰDʯwlHExomnÁ  Y^;BYgqCh/zy~hqSd7u ;?yPDf3A#=#ҳP.$GUM[A#N~L+0W>I1v`3tcML#aUAI3VJWy]1}!H^YPi@8t@RWtP.\]k.Ȝ(^Pʶ'<&)sJ'0C!ȳƩ#f&nߌ0J)EM<FN^X_%aNlwp>l.!q0YrwbXvp;Dnnn n>noooorzT4bEGFIp\ZpjjrՈ6Zp6q IV2JKK2KcKKKrMM,rp,brA]]Gt7%r7S bP5ĚGQnSvD<:S5*N{:h/C s@"\?V*}v M(v!&$'u'3U'3x'3+5!\5@V̨@VVHu$QhDҺVjW;jjijXFjzilc[ lqsgr}}Z }ZxTKB4^4Ԉ G_LjN%_j x\ÊɓT`t:&j? &<5gߺ ~hYu*0xl` uIotcTZ%Ē&t/tq0 9$MCs^CCsCˁJCLtHM+IlM+ܺR!|TunF5`x l^m?$`mbmmm^m(mSndYpgKrz Yzz{~p~s~l,(ZL]h"Ua.gDž}0Z0{0֣M֝cv:v1 #Zu 2=!yAa6dQQ Iǹ%#t)H0e1As1~_G4N8l>rJ:_ri6yS ЂEϗϗϗ06>@ӷEz{wS` *L °^ÈCv[&У- Ss| GS=!]j,N3 7Bn~BLHAE!MP[5j]*obDhf~2H~28~2 CZZy6ڬa_({SniT^ijA~>Y' ʶ˙wSDvyo .& v F>/ HZ: +4Ō ?:E4 Mg MgN Mg T ^\ ^| ^ ^v g:ަ r,|K z  R - _U %`  U|G UD շ z Cd Jh z|~ $ ?@ 08 3 9sUI 9sv 9s{ >ca A^ݼ Rb`ϓ Z dpeI. dpeqO dpe dpe d) d) d)q d)DŽ d)ʱ d) d) d) d)٨ d) e n+ o"` }(yi T B;$ f * M : :* ,< , 8ai 8 8? ʶf U N = 9O J_ ;P #e Q8Z U~4 ]YЂ l` s3՝ }j" % . t? H@ H  f_ 5  L a8  G@ L ڔ5 u  5H YOb _ iCK ӨS y W B K R= / 1U* 4 ;+ Cja G Nr Z$p b i?] pkVi rIj }4O !T^ sT  3   F  q ) ޔ  x$w ׷ ! s  ` 'j V $ $V $ $ nz ,[ %8 #^ s# s s sd ɠv C| u =1  QNz  [ } .i zZq  R 4}# 5N Z 87>G DYL' DYL DZL JH K bs i8: Z^ P) .9 S    ^( ) 0nI Ğt<> <T <t < < < a= ⋙X eQ Z uY'aB2#2)Hq6eF9Y <+эH]IBOqzUhWGmS5<$ %0$Ojok,̺q  N\] Sl); =QR>YBxS5bQyR_ER_d@fq6p!t5|oN&~`~`"|"|`PiրttmI:?P^i6i{<p>Univerzlis dokumentum konvertl. Arra hasznlhat , hogy markdown tartalmakat alaktson t egy egsz sor ms formtumra</p> <p>Weboldald: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> 

A universal document converter. Can be used to convert markdown to a wide range of other formats.

Website: http://pandoc.org/

ExportbKevsb ismert formtum. Pl. weboldalak esetben.EA little known format modestly used. You know, web sites for example.ExportnAlap HTML kimenet a python 'markdown' modult hasznlva.5Basic HTML output using the Python module 'markdown'.Export@Knyvek, melyek nem lnek fkat.Books that don't kill trees.ExportOsztly:Class:Export8Konvertls ePUB3 formtumraConvert to ePUB3ExporttAlaprtelmezett exportl, egyszerq formtumokat biztost.ADefault exporter, provides basic formats used by other exporters.ExportYAML metaadt blokk letiltsa. Akkor hasznlja ezt, ha YAML-hoz kapcsold gondjai vannak.DDisable YAML metadata block. Use that if you get YAML related error.ExportHibaErrorExportMarkdown exportlsa a pandoc-kal. Tbb formzsi lehetQsges biztost, mint az alap Manuskript exportl.hExport to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter.ExportBetqmret: Font size:ExportHTML Kimenet HTML OutputExportHTML Forrs HTML SourceExport<Tartalomjegyzk belefoglalsa.Include a table of contents.Export*Csakgy, mint az egyszerq szveg, kivve a jellQnyelv cmeket Felttelezi, hogy a szvegek a markdown-ban vannak formzva.Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown.ExportVA LaTeX motort PDF generlsra hasznljuk.%LaTeX engine used to produce the PDF.ExportA LaTeX egy szvegszerkesztQ s dokumentum jellQnyelv gynyrq dokumentumok ltrehozshoz.LaTeX is a word processor and document markup language used to create beautiful documents.ExportSortvolsg: Line spacing:ExportMarkdown forrsMarkdown sourceExportHMicrosoft Office (.docx) dokumentum."Microsoft Office (.docx) document.Export:Szksges a latex teleptse.Needs LaTeX to be installed.ExportFDokumentum normalizlsa (tisztt) Normalize the document (cleaner)Export|Szekci szintek szma, melyek bekerlnek a Tartalomjegyzkbe: ,Number of sections level to include in TOC: ExportpOpenDocument formtum. Pl. LibreOffice is ezt hasznlja.5OpenDocument format. Used by LibreOffice for example.ExportPaprmret: Paper size:ExportEgyszerq szveg Plain textExport(ElQnzet kiemelQvel.Preview with highlighter.Export0python modul 'markdown'.Python module 'markdown'.ExportA legegyszerqbb lehetQsg sima szveg exportlsra. LehetQv teszi sajt jellQnyelv hasznlatt, melyet a manuskript nem tud feldolgozni, mint pldul a <a href='www.fountain.io'>Fountain</a>.Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example Fountain.Export\Adja meg az alapszintet a tartalomjegyzkhez: $Specify the base level for headers: ExportREgyedlll dokumentum (nem csak tredk))Standalone document (not just a fragment)Export@Ennek a formtumnak az a clja, hogy lehetQsget biztostson az informcicserre azon szvegkiemelQk s Internet szolgltatsok kztt, mely egy kiemelQn keresztl bngszhetQk vagy vezrelhetQk.The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner.Export:Tipogrfiailag helyes kimenetTypographically correct outputExportVHasznlja a <q> cmkket a HTML idzetekhezUse tags for quotes in HTMLExport>ATX stlus fejlcek hasznlataUse ATX-style headersExportrReferencia-stlus linkek helyett inline linkek hasznlata1Use reference-style links instead of inline linksExportegy rvnyes latex telepts. Lsd a pandoc javaslatait erre: <a href="http://pandoc.org/installing.html">http://pandoc.org/installing.html</a>. Unicode tmogatshoz szksge van a xelatex -re.a valid LaTeX installation. Pandoc recommendations can be found on: pandoc.org/installing.html. If you want Unicode support, you need XeLaTeX.Export^reStructuredText egy knnyqsly jellQnyelv...2reStructuredText is a lightweight markup language.Export......ExportersManager Lers DescriptionExportersManager&Exportlk KezelseManage ExportersExportersManagerManuskript ManuskriptExportersManagerHExportlsi lehetQsge biztost erreOffers export toExportersManagerElrsi t:Path:ExportersManagerSttuszStatusExportersManagerSttusz:Status:ExportersManagerVerzi:Version:ExportersManager{HelpText} {HelpText}ExportersManagerElemzsAnalyzeFrequencyAnalyzerPSzavak kizrsa (vesszQvel elvlasztva): Exclude words (comma separated):FrequencyAnalyzer"Gyakorisg ElemzQFrequency AnalyzerFrequencyAnalyzerMinimum mret: Minimum size:FrequencyAnalyzer&Szavak szma: ebbQlNumber of words: fromFrequencyAnalyzer(Kifejezs gyakorisgPhrase frequencyFrequencyAnalyzerBelltsokSettingsFrequencyAnalyzerSz gyakorisgWord frequencyFrequencyAnalyzertotoFrequencyAnalyzern<b>Inf:</b> Egy nagyon egyszerq elemzQ, amely vgigfut a dokumentum markdown-jn s elemeket hoz ltre minden egyes cmhez.<br/>&nbsp;Info: A very simple parser that will go through a markdown document and create items for each titles.
 ImportB<b>Inf:</b>A Manuskript kpes importlni <b>markdown-bl</b> vagy <b>OPML-bQl</b>. A Pandoc konvertlni fogja az dokumentumt mindkettQrQl (lssa a lenti belltsokat), majd importlja Qket . A dokumentuma tpustl fggQen egyik lehetQsg jobb eredmnnyel jrhat, mint a msik. <br/>&nbsp;}Info: Manuskript can import from markdown or OPML. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document.
 ImportH<p><b>Inf:</b> Teljes mappastruktra importlsa. A mappk mappaknt addnak hozz, s az azokban lvQ egyszerq szveges dokumentumok (kivlaszthatja melyek, kiterjeszts alapjn) pedig, mint jelentek addnak hozz..</p> <p>Csak szvegfjlokat tmogat (sem kpeket, sem binris llomnyokat vagy egyebet nem tmogat).</p>R

Info: Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.

Only text files are supported (not images, binary or others).

Import<p>Szksges, hogy a pandoc szptQ / nem-szemantikus sortrseket hozzon ltre?</p><p> <b>automatikus</b>: a 72. karakternl tri.<br> <b>egyik sem</b>: nincs sortrs.<br> <b>megQrzs</b>:megprblja megQrizni az eredeti sortrseket.</p>Q

Should pandoc create cosmetic / non-semantic line-breaks?

auto: wraps at 72 characters.
none: no line wrap.
preserve: tries to preserves line wrap from the original document.

Import:VeszQvel elvlasztott rtkekComma separated valuesImport2Fjlmegnyits sikertelen.File open failed.Import"Mappa importlsa Folder importImport<Mappa, majd fjlok importlsaImport folder then filesImport Importls mint:Import tip as:Import"Importls ezzel: Import using:Import^Csak a kvetkezQ kiterjesztsqek belefoglalsa:Include only those extensions:Import(Markdown importlsaMarkdown importImport,Elmetrkp importlsaMind Map ImportImport,Elmetrkp importlsaMind Map importImportOPML importls OPML ImportImport$Pandoc importlsa Pandoc importImport8Elemek rendezse nv szerintSort items by nameImportXEz egy rvnytelen Elmetrkp fjlnak tqnik.1This does not appear to be a valid Mind Map file.ImportLEz egy rvnytelen OPML fjlnak tqnik.-This does not appear to be a valid OPML file.ImportNv nlkliUntitledImport Sorok trdelse: Wrap lines:Import(Hivatkozs beszrsaInsert referenceMDEditCompleter (~{} oldal) (~{} pages) MainWindowL * {} nem tallhat a projekt fjlban.# * {} wasn't found in project file. MainWindow&Nvjegy&About MainWindow &Puska &Cheat sheet MainWindow"&Projekt bezrsa&Close project MainWindow&Msols&Copy MainWindow&Trls&Delete MainWindow&Szerkeszts&Edit MainWindow&Fikci&Fiction MainWindow &Fjl&File MainWindow$&Gyakorisg ElemzQ&Frequency Analyzer MainWindow &Sg&Help MainWindow&Importls & &Import… MainWindow&Cmkk... &Labels... MainWindow&Md&Mode MainWindow&Mozgats Fel&Move Up MainWindow&Navigci &Navigation MainWindowMegn&yits&Open MainWindow&Beilleszts&Paste MainWindow&Kilps&Quit MainWindow &ElQzQ&Recent MainWindow&tnevezs&Rename MainWindow&Ments&Save MainWindow.S&g szvegek mutatsa&Show help texts MainWindow&Egyszerq&Simple MainWindow,&Helyesrs-ellenQrzs &Spellcheck MainWindow&Feloszts & &Split… MainWindow&Sttusz... &Status... MainWindow&Eszkzk&Tools MainWindow &Nzet&View MainWindow<html><head/><body><p align="right">Egy bekezds<br/>sszefoglal</p></body></html>O

One paragraph
summary

 MainWindow<html><head/><body><p align="right">Egy mondat<br/>sszefoglal</p></body></html>N

One sentence
summary

 MainWindow"A Manuskript -rQlAbout Manuskript MainWindowPCselekmny lps hozzadsa (CTRL+Enter) Add plot step MainWindow SzerzQAuthor MainWindow Httr Background MainWindowHttrsznBackground color MainWindowAlapinformci Basic info MainWindow"Knyv informcikBook information MainWindow(Knyv sszefoglalsa Book summary MainWindowSzeglyBorder MainWindowptsen vilgokat. Ksztse el az tfog kategrik (s az specifikus rszleteinek) hierarchijt.MBuild worlds. Create hierarchy of broad categories down to specific details. MainWindow&KivgsC&ut MainWindowSzereplQ(k) Character(s) MainWindowSzereplQk Characters MainWindow&sszelltsCo&mpile MainWindowsszelltsCompile MainWindowKonfliktusConflict MainWindow SarokCorner MainWindowLKsztse el a mestermqve ttekintst.'Create the outline of your masterpiece. MainWindow2Alkossa meg a szereplQit.Create your characters. MainWindow Ctrl+CCtrl+C MainWindow Ctrl+DCtrl+D MainWindow Ctrl+KCtrl+K MainWindow Ctrl+MCtrl+M MainWindow Ctrl+OCtrl+O MainWindow Ctrl+QCtrl+Q MainWindow Ctrl+SCtrl+S MainWindowCtrl+Shift+B Ctrl+Shift+B MainWindowCtrl+Shift+DownCtrl+Shift+Down MainWindowCtrl+Shift+K Ctrl+Shift+K MainWindowCtrl+Shift+S Ctrl+Shift+S MainWindowCtrl+Shift+Up Ctrl+Shift+Up MainWindow Ctrl+VCtrl+V MainWindow Ctrl+XCtrl+X MainWindowHibakeressDebug MainWindowPHibakeressi informci. Valami hasznos.Debug info. Sometimes useful. MainWindow TrlsDel MainWindow Lers Description MainWindow(Rszletes informci Detailed info MainWindow2Cselekmnyek kidolgozsa.Develop plots. MainWindow Sztr Dictionary MainWindow&Duplikls Dupl&icate MainWindowSzerkesztQEditor MainWindowEmail cmEmail MainWindow^Adjon meg informcit a knyvrQl s nmagrl.0Enter information about your book, and yourself. MainWindowFordulpontEpiphany MainWindowBQvtse ki az egybekezdses sszefoglalk mondatait egy-egy bekezdssAExpand each sentence of your one paragraph summary to a paragraph MainWindowF2F2 MainWindowF6F6 MainWindowF7F7 MainWindowF8F8 MainWindowF9F9 MainWindow SzqrQFilter MainWindowSimaAdatFlatData MainWindow TeljesFull MainWindow&Teljes sszefoglal Full summary MainWindowltalnosGeneral MainWindow MqfajGenre MainWindowClGoal MainWindowIkonIcon MainWindowIkonszn Icon color MainWindowFontossg Importance MainWindow&Trgymutat krtyk Index cards MainWindow CmkeLabel MainWindow CmkkLabels MainWindow LicencLicense MainWindowssze&fslsM&erge MainWindowM&ozgats Le M&ove Down MainWindowManuskript Manuskript MainWindowMetaadatMetadata MainWindowTbbMore MainWindowMotivci Motivation MainWindowNvName MainWindow NevekNames MainWindowKvetkezQNext MainWindowJegyzetekNotes MainWindow SemmiNothing MainWindowEgy oldalOne page MainWindow.Egyoldalas sszefoglalOne page summary MainWindowEgy bekezds One paragraph MainWindow6Egy bekezdses sszefoglalOne paragraph summary MainWindowEgy mondat One sentence MainWindow2Egy mondatos sszefoglalOne sentence summary MainWindow&Rendszerezs Organi&ze MainWindowttekintsOutline MainWindowSzempontPOV MainWindowSzemlyekPersos MainWindowCselekmnyPlot MainWindowCselekmnyekPlots MainWindow0Feltlts res adatokkalPopulates with empty data MainWindowElQrehaladsProgress MainWindowProjektfa Project tree MainWindow<{} projekt betltve, hibkkal.#Project {} loaded with some errors. MainWindow<{} projekt betltve, hibkkal:#Project {} loaded with some errors: MainWindow({} projekt betltve.Project {} loaded. MainWindow${} projekt mentve.Project {} saved. MainWindow Megolds lpseiResolution steps MainWindowEredmnyResult MainWindow&Belltsok S&ettings MainWindow$Ments m&sknt... Sa&ve as... MainWindow&KeressSea&rch MainWindowSorozatSeries MainWindowSzituci: Situation: MainWindow$Konfliktus forrsaSource of conflict MainWindow$Szenvedly forrsaSource of passion MainWindow(Fe&loszts kurzornlSp&lit at cursor MainWindowTrtnetv Story line MainWindow AlcmSubtitle MainWindowsszefoglalSummary MainWindowsszefoglal:Summary: MainWindow~Sznjon r idQt, hogy elgondolkodjon a knyve egymondatos (-50 szavas) sszefoglaljn. Aztn bQvtse ki egy bekezdss, majd egy oldall, majd egy teljes sszefoglalv.Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. MainWindow SzvegText MainWindowSzvegszn Text color MainWindowlAz alapszituci 'Mi lenne ha...?' krdsknt feltve. Pl.. 'Mi lenne ha a legveszlyesebb ' gonosz varzsl ne lenne kpes meglni egy csecsemQt?' (Harry Potter)The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) MainWindowCmTitle MainWindowFaTree MainWindow KtetVolume MainWindowRFIGYELEM: {} projekt nem kerlt mentsre.WARNING: Project {} not saved. MainWindowMi lenne ha...? What if...? MainWindowSz: {}{} Words: {}{} MainWindow VilgWorld MainWindow rjon.Write. MainWindow :px pxSettings%%Settings &Semmi&NothingSettings1.5 sor 1.5 linesSettings<html><head/><body><p>Ha ezt a lehetQsget bejelli, a projektje egyetlen fjlknt kerl mentsre. gy egyszerqbb msolni vagy biztonsgi mentst kszteni rla, de elesik a csapatmunka s a verzikezels lehetQsgtQl.<br/>Amennyiben nincs bejellve, a projektje mappaknt kerl mentsre, amely sok kis fljt tartalmaz</p></body></html>

If you check this option, your project will be save as one single file. Easier to copy or backup, but does not allow collaborative editing, or versionning.
If this is unchecked, your project will be save as a folder containing many small files.

SettingsElrendezs AlignmentSettingsElrendezs: Alignment:Settings$Alkalmazs stlusaApplication settingsSettingsElfogadsApplySettingspAutomatikusan tltse be a legutbbi projektet indulskor*Automatically load last project on startupSettings8Automatikusan mentsen mindenAutomatically save everySettings Httr BackgroundSettingsHttrszn:Background color:SettingsHttr: Background:SettingsSzeglyszn: Border color:Settings MgsemCancelSettings KzpCenterSettingsKzprezrtCenteredSettings Szn:Color:Settings SznekColorsSettingssszelltsCompileSettingsSarokszn: Corner color:SettingsSarok rdiusza:Corner radius:Settings Ctrl+SCtrl+SSettings KurzorCursorSettings TrlsDeleteSettings$Villogs letiltsaDisable blinkingSettings DuplaDoubleSettingsSzerkesztsEditSettingsCsald:Family:Settings MappkFoldersSettingsBetqtpusFontSettingsBetqmret: Font size:Settings Betq:Font:SettingsTeljes kpernyQ FullscreenSettingsltalnosGeneralSettings*ltalnos belltsokGeneral settingsSettingsClGoalSettingsIkonmret Icon SizeSettingsIkon szne: Icon color:Settings0Ha nem trtnik vltozsIf no changes duringSettingsKp:Image:Settings"ElsQ sor behzsaIndent 1st lineSettingsKartotklapok Index cardsSettingsElemsznek Item colorsSettingsKiegyenltsJustifySettings6Fellvizsglatok megtartsaKeep revisionsSettingsMegtarts:Keep:Settings CmkeLabelSettings CmkkLabelsSettingsBalLeftSettings Bal/Jobb margk:Left/Right margins:SettingsVonaltvolsg: Line spacing:SettingsBetltsLoadingSettingsMargk:Margins:SettingsMax tvolsg Max widthSettings Elrt: Misspelled:SettingsjNewSettingsNincs KpNo ImageSettingsEgyik semNoneSettings SemmiNothingSettingsRgi &stlus Old st&yleSettingsTeltettsg:Opacity:SettingsKrvonalOutlineSettingsSzempontPOVSettingsPrnzottsg:Padding:Settings(Bekezds BelltsokParagraph OptionsSettingsBekezdsek ParagraphsSettingsSzzalk PercentageSettingsPozci: Position:SettingsElQrehaladsProgressSettingsArnyos ProportionalSettings:Alaprtelmezs visszalltsaRestore defaultsSettings Fellvizsglatok RevisionsSettingsA fellvizsglatok hasznlata egy mdszer a mdostsok kvetsre. Minden szveges elem szmra tartalmazza annak minden mdosulatt, lehetQv tve, hogy megtekintse s visszalltsa az elQzQ verzikat.Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions.SettingsJobbRightSettings,ElQrehalads &mutatsaS&how progressSettings0&Intelligens eltvolts S&mart removeSettings"Ments kilpskor Save on quitSettings,Ments egyetlen fjlbaSave to one single fileSettings MentsSavingSettingsSklzottScaledSettingsBelltsokSettingsSettings$Ele&mszm mutatsaShow ite&m countSettings,&ElQrehalads mutatsaShow p&rogressSettings&&sszegzs mutatsa Show summar&ySettings*sszefoglal mutatsa Show summarySettings EgyesSingleSettings Mret:Size:SettingsAz intelligens eltvolts lehetQv teszi, hogy csak bizonyos szm fellvizsglatot tartson meg. Hasznlata erQsen javasolt, ellenkezQ esetben a fjlja tele lesz jelentktelen mdostsok ezreivel.Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes.SettingsSzkzls:Spacing:SettingsSttuszStatusSettingsKinyjtott StretchedSettings StlusStyleSettings&Tabultorszlessg: Tab width:Settings SzvegTextSettingsSzveghttrText BackgroundSettings"Szvegbelltsok Text OptionsSettingsSzvegterlet Text areaSettingsSzvegszn: Text color:Settings SzvegszerkesztQ Text editorSettingsSzvegCmke TextLabelSettingsTmanv: Theme name:SettingsCsempkTiledSettingsCmTitleSettings$FelsQ/Als margk:Top/Bottom margins:Settingstltsz TransparentSettingsFaTreeSettings Tpus:Type:Settings6Blokkbeilleszts hasznlataUse block insertion ofSettingsNzetekViewsSettings0Belltsok megtekintseViews settingsSettings Lthat oszlopokVisible columnsSettingsSzlessg:Width:SettingsAblakhttrWindow BackgroundSettingsSzszm Word countSettingsNagytottZoomedSettingspercben.minutes.Settingsffellvizsglat 10 percenknt, az utbbi egy rban*revisions per 10 minutes for the last hourSettingsNfellvizsglat naponta, a mlt hnapban$revisions per day for the last monthSettingsRfellvizsglat rnknt a legutbbi napra#revisions per hour for the last daySettings^fellvizsglat percenknt, az elmlt 10 percben,revisions per minute for the last 10 minutesSettings<fellvizsglat hetente, valaha'revisions per week till the end of timeSettingsmsodpercig.seconds.Settings,&Hozzads a sztrhoz&Add to dictionary SpellAction@&Eltvolts az egyni sztrbl&Remove from custom dictionary SpellAction,Helyesrsi javaslatokSpelling Suggestions SpellAction*A Manuskript nvjegyeAbout ManuskriptaboutManuskript ManuskriptaboutBHasznlatban lvQ szoftververzi:Software Versions in Use: aboutDialog VerziVersion aboutDialogsszelltsCompile abstractModelClGoal abstractModelCmLabel abstractModelSzempontPOV abstractModelSttuszStatus abstractModelCmTitle abstractModelSzszm Word count abstractModel.Betlttt fordts: {}.Loaded translation from {}: {}.appnMegjegyzs: Ehhez a nyelvhez nem tallhat fordt: {}.:Note: No translator found or loaded from {} for locale {}.app4Pr mondatos sszefoglal:Few sentences summary: basicItemView prlapForm basicItemViewCl:Goal: basicItemView*Egysoros sszefoglalOne line summary basicItemViewSzempont:POV: basicItemViewSzszm Word count basicItemViewNvNamecharacterModelj szereplQ New charactercharacterModel rtkValuecharacterModelFQMaincharacterTreeView$Kisebb jelentQsgqMinorcharacterTreeViewMsodlagos SecondarycharacterTreeViewSzereplQk Characters cheatSheetfSzqrQ (gpelje be brminek a nevt a projektjben )2Filter (type the name of anything in your project) cheatSheet prlapForm cheatSheetFQMain cheatSheet$Kisebb jelentQsgqMinor cheatSheetCselekmnyekPlots cheatSheetMsodlagos Secondary cheatSheetSzvegekTexts cheatSheet VilgWorld cheatSheetFQMaincmbOutlineCharacterChoser$Kisebb jelentQsgqMinorcmbOutlineCharacterChoserEgyik semNonecmbOutlineCharacterChoserMsodlagos SecondarycmbOutlineCharacterChoserKlnfleVariouscmbOutlineCharacterChoserKlnfleVariouscmbOutlineLabelChoserKlnfleVariouscmbOutlineStatusChoser@Widgetek Eszkztrnak DokkolsaDock Widgets ToolbarcollapsibleDockWidgets prlapForm completer&Teljes sszefoglal Full summary corkDelegate*Egysoros sszefoglalOne line summary corkDelegate prlapFormeditorWidget_uiExportlsExportexporterExportls ide: Export to:exporter&Exportlk kezelseManage exportersexporterElQnzetPreviewexporterBelltsokSettingsexporter@{} (mg nem kerlt fejlesztsre){} (not implemented yet)exporterDialogH<html><head/><body><p>Azt szqri, hogy mi kerljn bele a vgsQ exportlsba<br/><span style=" color:#773333;">(Nem teljesen kifejlesztett.)</span></p></body></html>

Filters what items will be included in the final export.
(Not fully implemented yet.)

exporterSettingsFA kvetkezQ mappa s szveg kztt:Between folder and text:exporterSettings4A kvetkezQ mappk kztt:Between folders:exporterSettingsFA kvetkezQ szveg s mappa kztt:Between text and folder:exporterSettings8A kvetkezQ szvegek kztt:Between texts:exporterSettingsTartalomContentexporterSettings EgyediCustomexporterSettingsEgyedi cserk:Custom replacements:exporterSettingsjItt eldntheti, hogy mi szerepeljen a vgsQ exportba.6Decide here what will be included in the final export.exporterSettingsres sor Empty lineexporterSettingsEngedlyezveEnabledexporterSettingsSz&qrQkFi<ersexporterSettings MappaFolderexporterSettingsBetqFontexporterSettingsBetqmret: Font size:exporterSettings Betq:Font:exporterSettings prlapFormexporterSettings4Tbb rszletre van szksgI need more granularityexporterSettingsHa be van jellve, a cserhez regulris kifejezseket hasznlhat. Ha nincs bejellve, egyszerq szvegknt cserli.ZIf checked, uses regular expression for replacement. If unchecked, replaced as plain text.exporterSettingssszellts sttusznak figyelmen kvl hagysa (minden elem belefoglalsa))Ignore compile status (include all items)exporterSettings CmkkLabelsexporterSettingsElQnzetPreviewexporterSettings&Regulris KifejezsRegExpexporterSettings>Tbbszri szkzk eltvoltsaRemove multiple spacesexporterSettings CsereReplaceexporterSettings"Csere --- ezzel Replace --- with —exporterSettings"Csere ... ezzel &Replace ... with …exporterSettingsFDupla idzQjelet (") cserje ezzel:Replace double quotes (") with:exporterSettingsLEgyszeri idzQjelek (') cserje ezzel:Replace single quotes (') with:exporterSettingsElvlasztsok SeparationsexporterSettingsSttuszStatusexporterSettings Al-elemei ennek: Subitems of:exporterSettings SzvegTextexporterSettingsCmTitleexporterSettingstalaktsokTransformationsexporterSettings TpusTypeexporterSettings&Tipogrfiai cserk:Typographic replacements:exporterSettingsVeleWithexporterSettings {}Szint {} mappa{}Level {} folderexporterSettings"{}Szint {} szveg{}Level {} textexporterSettings(<b>Kvetelmny:</b> Requires: exportersManager@<b>Sttusz:</b> nincs teleptve.Status: uninstalled.exportersManager EgyediCustomexportersManagerTeleptve InstalledexportersManagerNem tallhat Not foundexportersManager@{} futtathat fjl elrsi tja.Set {} executable path.exportersManager{} nem tallhat. Teleptse vagy lltsa be az elrsi utat kzzel./{} not found. Install it, or set path manually.exportersManagerGyakorisg FrequencyfrequencyAnalyzerKifejezsekPhrasesfrequencyAnalyzerSzWordfrequencyAnalyzerElQrehaladsProgressfullScreenEditor Tma:Theme:fullScreenEditorCmTitlefullScreenEditorSzszm Word countfullScreenEditor {} sz{} wordsfullScreenEditor{} sz / {} {} words / {}fullScreenEditorltalnosGeneralgeneralSettingsDLegfelsQ-szintq mappba importlsImport in a top-level foldergeneralSettings$Importls ez al: Import under:generalSettings*Jelenetek vgsa itt:Split scenes at:generalSettingsNHossz cmek nyirblsa (> 32 karakter)Trim long titles (> 32 chars)generalSettings\n---\n\n---\ngeneralSettingsAmennyiben nem szeretn ezt ltni, el tudja rejteni a Sug menben.8If you don't wanna see me, you can hide me in Help menu. helpLabel"Fjl kivlasztsa Choose fileimporterFjl tiszttsa Clear fileimporterFormtum:Format:importerImportlsImportimporterElQnzetPreviewimporterBelltsokSettingsimporterKlnfleVarious lineEditView :perc minuteslocker :sz wordslocker prlapFormlockerZrolva !Lock !lockerKpernyQzr: Lock screen:lockerClidQ (szint) Time targetlocker$Clszszm (szint) Word targetlocker{} htralvQ {} remaininglocker {} mp.{} s.locker({} sz van mg htra{} words remaininglocker {}:{}{}:{}locker ~{} .~{} h.locker ~{} p.~{} mn.locker Alt+UpAlt+Up mainEditorF11F11 mainEditor prlapForm mainEditor&Ugrs a szlQelemreGo to parent item mainEditorKartotklapok Index cards mainEditorKrvonalOutline mainEditor GykrRoot mainEditor SzvegText mainEditor{} sz.  {} words  mainEditor{} sz / {} {} words / {}  mainEditorMarkdownMarkdownmarkdownSettings prlapForm metadataView&Teljes sszefoglal Full summary metadataView0Jegyzetek / HivatkozsokNotes / References metadataView*Egysoros sszefoglalOne line summary metadataViewTulajdonsgok Properties metadataView Fellvizsglatok Revisions metadataViewsszefoglalSummary metadataViewAuto-rejts Auto-hidemyPanel&Msols&Copy outlineBasics&Trls&Delete outlineBasics&Beilleszts&Paste outlineBasics&tnevezs&Rename outlineBasics<p><b>Ezzel trli a kvetkezQ eleme(ke)t {} .</b></p><p>Biztos benne?</p>D

You're about to delete {} item(s).

Are you sure?

 outlineBasicsEltvoltsAbout to remove outlineBasicsMinden elemnek ugyanazon a szinten kell lennie (kzs szlQn kell osztoznia).{} elemek megnyitsa j flekenOpen {} items in new tabs outlineBasics@Visszalltsa alaprtelmezettreRestore to default outlineBasics GykrRoot outlineBasicsMsodlagos Secondary outlineBasicsVlasszon ki legalbb kt elemet. A mappkat figyelmen kvl hagyja./Select at least two items. Folders are ignored. outlineBasics,Egyedi Ikon BelltsaSet Custom Icon outlineBasics Cmke belltsa Set Label outlineBasics&Szempont belltsaSet POV outlineBasics$Sttusz Belltsa Set Status outlineBasicsFQMainoutlineCharacterDelegate$Kisebb jelentQsgqMinoroutlineCharacterDelegateEgyik semNoneoutlineCharacterDelegateMsodlagos SecondaryoutlineCharacterDelegate {} sz{} words outlineItem {} sz / {} ({}){} words / {} ({}) outlineItem4Egyedi belltsok erre {}Custom settings for {}pandocSettingsltalnosGeneralpandocSettingsTartalomjegyzkTable of ContentpandocSettingsFQMainpersosProxyModel(Kisebb jelentQsgqekMinorspersosProxyModelMsodlagos SecondarypersosProxyModel Kilps az ajtn1. Inciting event plotDelegate1. Felpts1. Setup plotDelegate1. Fordulpont1. Turning point plotDelegate2. Vlaszts 2. Choice plotDelegateD2. Csaps (katasztroflis esemny) 2. Disaster plotDelegate2. Fordulat 2. Reversal plotDelegate3. TetQpont 3. Climax plotDelegate3. Befejezs 3. Ending plotDelegate3. Felocsds 3. Stand up plotDelegateMlysgAbyss plotDelegateKzeledsApproach plotDelegateBqnhQds Atonement plotDelegateKalandra hvsCall to adventure plotDelegateTetQpontClimax plotDelegateKifejts Exposition plotDelegateCskkenQ akciFalling action plotDelegateFreytag piramisFreytag's pyramid plotDelegateltalnosGeneral plotDelegateA HQs tjaHero's journey plotDelegate,Tallkozs a mentorralMeeting with mentor plotDelegateNem, sNo and plotDelegate Htkznapi vilgOrdinary world plotDelegateProblmaProblem plotDelegateElQrehaladsProgress plotDelegate gretPromise plotDelegate.A hvs visszautastsaRefusal of the call plotDelegateMegolds Resolution plotDelegateVisszatrsReturn plotDelegate(Jutalom / FelismersReward / Revelation plotDelegateEmelkedQ akci Rising action plotDelegate PrbkTests plotDelegate A hrom felvons Three acts plotDelegatetalakulsTransformation plotDelegate*Prblkozs / Elbuks Try / Fail plotDelegateIgen, deYes but plotDelegateFQMain plotModelMetaMeta plotModel$Kisebb jelentQsgqMinor plotModelNvName plotModelj cselekmnyNew plot plotModelj lpsNew step plotModelMsodlagos Secondary plotModel$**Cselekmny:** {} **Plot:** {} plotTreeViewFQMain plotTreeView$Kisebb jelentQsgqMinor plotTreeViewMsodlagos Secondary plotTreeViewFQMainplotsProxyModel(Kisebb jelentQsgqekMinorsplotsProxyModelMsodlagos SecondaryplotsProxyModelsszelltsCompilepropertiesView prlapFormpropertiesViewClGoalpropertiesView CmkeLabelpropertiesViewSzempontPOVpropertiesViewSttuszStatuspropertiesViewSzszm Word countpropertiesViewB<b>Ismeretlen hivatkozs:</b> {}.Unknown reference: {}. referencesAlapinformci Basic info references&SzereplQ: <b>{}</b>Character: {} referencesSzereplQk Characters referencesKonfliktusConflict references Lers Description references(Rszletes informci Detailed info referencesFordulpontEpiphany references Mappa: <b>{}</b>Folder: {} referencesMenj ide {}. Go to {}. referencesClGoal references Cmke:Label: references(Hossz sszefoglal: Long summary: references*Hosszabb sszefoglalLonger summary referencesMotivci Motivation references,Ez nem hivatkozs: {}.Not a reference: {}. referencesJegyzetek:Notes: references.A kvetkezQ szempontja:POV of: referencesSzempont:POV: referencesSzenvedlyPassion referencesElrsi t:Path: references*Cselekmny: <b>{}</b>Plot: {} referencesHivatkozva itt:Referenced in: references"Megoldsi lpsekResolution steps referencesEredmnyResult references$Rvid sszefoglal Short summary references&Rvid sszefoglal:Short summary: referencesStatisztika:Stats: referencesSttusz:Status: references"Szveg: <b>{}</b>Text: {} references4Ismeretlen hivatkozs: {}.Unknown reference: {}. references4Vilg: <b>{name}</b>{path}World: {name}{path} references 1 nappal ezelQtt 1 day ago revisionsMinden trlse Clear all revisions TrlsDelete revisions prlapForm revisionsSor {}:Line {}: revisionsLehetQsgekOptions revisionsVisszalltsRestore revisions.Korbbi verzi mutatsaShow ancient version revisions(Mdostsok mutatsaShow modifications revisions6Csak a mdostsok mutatsaShow modifications only revisions"Szkzk mutatsa Show spaces revisions{} napja {} days ago revisions"{} rval ezelQtt {} hours ago revisions${} perccel ezelQtt{} minutes ago revisions{} hnapja {} months ago revisions.{} msodperccel ezelQtt{} seconds ago revisions {} ve {} years ago revisionsMindAllsearch*Kis-nagybetq rzkenyCase sensitivesearch prlapFormsearch CmkeLabelsearchJegyzetekNotessearchLehetQsgek:Options:searchSzempontPOVsearchKeress... Search for...searchKeress ebben: Search in:searchSttuszStatussearchsszefoglalSummarysearch SzvegTextsearchCmTitlesearch" (csak-olvashat) (read-only)settingsWindowHibaErrorsettingsWindowj cmke New labelsettingsWindowj sttusz New statussettingsWindowj tma New themesettingsWindow jtmanewthemesettingsWindow prlapForm sldImportanceFQMain sldImportance$Kisebb jelentQsgqMinor sldImportanceMsodlagos Secondary sldImportanceSzvegCmke TextLabel sldImportance <p>Kivlasztott elem(ek) vgsa a megadott jelnl.</p> <p>Ha a kivlasztott elem egy mappa, a vgrehajts rkletesen trtnik <i>minden</i> gyermek elemre.</p> <p>A megosztott jel tartalmazhatja a kvetkezQ meneklsi szekvencikat: <ul> <li><b><code>\n</code></b>: sortrs</li> <li><b><code>\t</code></b>: tabultor</li> </ul> </p> <p><b>Jel:</b></p> 

Split selected item(s) at the given mark.

If one of the selected item is a folder, it will be applied recursively to all of it's children items.

The split mark can contain following escape sequences:

  • \n: line break
  • \t: tab

Mark:

 splitDialogVgs '{}' Split '{}' splitDialogElemek vgsa Split items splitDialog prlapForm storylineView$SzereplQk mutatsaShow Characters storylineView*Cselekmnyek mutatsa Show Plots storylineView$Feloszts bezrsa Close split tabSplitterXKijellt elemek megnyitsa abban a nzetben.!Open selected items in that view. tabSplitter(Vzszintes felosztsSplit horizontally tabSplitter(FggQleges felosztsSplit vertically tabSplitterKlnfleVarious textEditView CTRL+BCTRL+B textFormat CTRL+ECTRL+E textFormat CTRL+ICTRL+I textFormat CTRL+JCTRL+J textFormat CTRL+LCTRL+L textFormat CTRL+PCTRL+P textFormat CTRL+RCTRL+R textFormat CTRL+UCTRL+U textFormat prlapForm textFormatMindet sszezr Collapse AlltreeViewsszezr {} Collapse {}treeViewMindent Kinyit Expand AlltreeViewKinyit {} Expand {}treeView11welcomeH<b>sszesen:</b> {} sz (~ {} oldal)#Total: {} words (~ {} pages)welcome Szint hozzadsa Add levelwelcome.Szszmlls hozzadsaAdd word countwelcome KnyvBookwelcomeFejezetChapterwelcomeLtrehozsCreatewelcome,j Projekt LtrehozsaCreate New Projectwelcome$Bemutat projektet Demo projectswelcomeresEmptywelcomeres regny Empty fictionwelcome"res nem-kitalltEmpty non-fictionwelcomeKitalltFictionwelcome VgsQFinalwelcomeElsQ vzlat First draftwelcome prlapFormwelcome tletIdeawelcomeManuskript Manuskriptwelcome4Manuskript projekt (*.msk)Manuskript project (*.msk)welcomeVManuskript projekt (*.msk);;Minden fjl (*))Manuskript project (*.msk);;All files (*)welcometLegkzelebb, automatikusa nyissa meg a legutbbi projektet*Next time, automatically open last projectwelcomeVals alap Non-fictionwelcomeJegyzetNotewelcome RegnyNovelwelcomeKisregnyNovellawelcome$Projekt megnyitsa Open projectwelcomeMegnyits...Open...welcomeBFellrja a ltezQ projektet {} ?Overwrite existing project {} ?welcomeLegutbbiRecentwelcomeKutatsResearchwelcome Kutatsi jegyzetResearch paperwelcome4Projekt mentse msknt...Save project as...welcomeJelenetScenewelcomeMsodik vzlat Second draftwelcomeSzakaszSectionwelcomeElbeszls Short Storywelcome Valami SomethingwelcomeTODOTODOwelcomeSablonok Templateswelcome SzvegTextwelcomeTrilgiaTrilogywelcomeFigyelmeztetsWarningwelcomeaofwelcomesz mindegyik. words each.welcomeptszet Architecture worldModelCsillagszat Astronomy worldModelTestbeszdBodily language worldModel NaptrCalendar worldModelghajlatClimate worldModelUdvarls Courtship worldModelKulturlisCultural worldModelSzoksokCustoms worldModelDemogrfia Demography worldModelBetegsgekDiseases worldModelltzkekDresses worldModelOktats Education worldModelErklcskEthics worldModel*Fantziavilg ptseFantasy world building worldModelNvnyvilgFlora worldModeltelFood worldModelNemi szerepek Gender roles worldModelKormny Government worldModelTrtnelemHistory worldModelFontos trgyakImportant objects worldModelFontos helyekImportant places worldModelNyelvek Languages worldModelMgiarendszer Magic system worldModelVarzstrgyakMagical objects worldModelMgikus helyekMagical places worldModelMgikus fajok Magical races worldModelOrvossgMedicine worldModelKatonasgMilitary worldModel$Zene s mqvszetekMusic and arts worldModelj elemNew item worldModelSzervezet Organization worldModelFizikaiPhysical worldModelPolitikkPolitics worldModel FajokRaces worldModel VallsReligion worldModelSzablyokRules worldModelTudomnyScience worldModelTechnolgia Technology worldModelDomborzat Topography worldModelKzlekedsTransportation worldModelVadvilg Wild life worldModelmanuskript-0.10.0/i18n/manuskript_hu.ts000066400000000000000000005531531354442177200200320ustar00rootroot00000000000000 Export Basic HTML output using the Python module 'markdown'. Alap HTML kimenet a python 'markdown' modult használva. Python module 'markdown'. python modul 'markdown'. Markdown source Markdown forrás HTML Source HTML Forrás HTML Output HTML Kimenet Default exporter, provides basic formats used by other exporters. Alapértelmezett exportáló, egyszerű formátumokat biztosít. Preview with highlighter. Előnézet kiemelővel. Plain text Egyszerű szöveg A little known format modestly used. You know, web sites for example. Kevésbé ismert formátum. Pl. weboldalak esetében. Needs LaTeX to be installed. Szükséges a latex telepítése. Error Hiba Standalone document (not just a fragment) Egyedülálló dokumentum (nem csak töredék) Include a table of contents. Tartalomjegyzék belefoglalása. Number of sections level to include in TOC: Szekció szintek száma, melyek bekerülnek a Tartalomjegyzékbe: Typographically correct output Tipográfiailag helyes kimenet Normalize the document (cleaner) Dokumentum normalizálása (tisztító) Specify the base level for headers: Adja meg az alapszintet a tartalomjegyzékhez: Use reference-style links instead of inline links Referencia-stílus linkek helyett inline linkek használata Use ATX-style headers ATX stílusú fejlécek használata Use <q> tags for quotes in HTML Használja a <q> címkéket a HTML idézetekhez LaTeX engine used to produce the PDF. A LaTeX motort PDF generálására használjuk. Paper size: Papírméret: Font size: Betűméret: Class: Osztály: Line spacing: Sortávolság: Books that don't kill trees. Könyvek, melyek nem ölnek fákat. OpenDocument format. Used by LibreOffice for example. OpenDocument formátum. Pl. LibreOffice is ezt használja. Microsoft Office (.docx) document. Microsoft Office (.docx) dokumentum. reStructuredText is a lightweight markup language. reStructuredText egy könnyűsúlyú jelölőnyelv... Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. Csakúgy, mint az egyszerű szöveg, kivéve a jelölőnyelv címeket Feltételezi, hogy a szövegek a markdown-ban vannak formázva. Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. A legegyszerűbb lehetőség sima szöveg exportálására. Lehetővé teszi saját jelölőnyelv használatát, melyet a manuskript nem tud feldolgozni, mint például a <a href='www.fountain.io'>Fountain</a>. <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> <p>Univerzális dokumentum konvertáló. Arra használható , hogy markdown tartalmakat alakítson át egy egész sor más formátumra</p> <p>Weboldald: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. egy érvényes latex telepítés. Lásd a pandoc javaslatait erre: <a href="http://pandoc.org/installing.html">http://pandoc.org/installing.html</a>. Unicode támogatáshoz szüksége van a xelatex -re. Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. Markdown exportálása a pandoc-kal. Több formázási lehetőséges biztosít, mint az alap Manuskript exportáló. LaTeX is a word processor and document markup language used to create beautiful documents. A LaTeX egy szövegszerkesztő és dokumentum jelölőnyelv gyönyörű dokumentumok létrehozásához. The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. Ennek a formátumnak az a célja, hogy lehetőséget biztosítson az információcserére azon szövegkiemelők és Internet szolgáltatások között, mely egy kiemelőn keresztül böngészhetők vagy vezérelhetők. Disable YAML metadata block. Use that if you get YAML related error. YAML metaadt blokk letiltása. Akkor használja ezt, ha YAML-hoz kapcsolódó gondjai vannak. Convert to ePUB3 Konvertálás ePUB3 formátumra Self-contained HTML files, with no dependencies Could not process regular expression: {} Choose output file… ExportersManager Manage Exporters Exportálók Kezelése Manuskript Manuskript Description Leírás Offers export to Exportálási lehetősége biztosít erre Status Státusz Status: Státusz: Version: Verzió: Path: Elérési út: ... ... {HelpText} {HelpText} FrequencyAnalyzer Frequency Analyzer Gyakoriság Elemző Word frequency Szó gyakoriság Settings Beállítások Minimum size: Minimum méret: Exclude words (comma separated): Szavak kizárása (vesszővel elválasztva): Analyze Elemzés Phrase frequency Kifejezés gyakoriság Number of words: from Szavak száma: ebből to to Import Markdown import Markdown importálása <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; <b>Infó:</b> Egy nagyon egyszerű elemző, amely végigfut a dokumentum markdown-ján és elemeket hoz létre minden egyes címhez.<br/>&nbsp; Folder import Mappa importálása <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> <p><b>Infó:</b> Teljes mappastruktúra importálása. A mappák mappaként adódnak hozzá, és az azokban lévő egyszerű szöveges dokumentumok (kiválaszthatja melyek, kiterjesztés alapján) pedig, mint jelentek adódnak hozzá..</p> <p>Csak szövegfájlokat támogat (sem képeket, sem bináris állományokat vagy egyebet nem támogat).</p> Include only those extensions: Csak a következő kiterjesztésűek belefoglalása: Comma separated values Veszővel elválasztott értékek Sort items by name Elemek rendezése név szerint Import folder then files Mappa, majd fájlok importálása OPML Import OPML importálás File open failed. Fájlmegnyitás sikertelen. This does not appear to be a valid OPML file. Ez egy érvénytelen OPML fájlnak tűnik. Pandoc import Pandoc importálása <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; <b>Infó:</b>A Manuskript képes importálni <b>markdown-ból</b> vagy <b>OPML-ből</b>. A Pandoc konvertálni fogja az dokumentumát mindkettőről (lássa a lenti beállításokat), majd importálja őket . A dokumentuma típusától függően egyik lehetőség jobb eredménnyel járhat, mint a másik. <br/>&nbsp; Import using: Importálás ezzel: Wrap lines: Sorok tördelése: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> <p>Szükséges, hogy a pandoc szépítő / nem-szemantikus sortöréseket hozzon létre?</p><p> <b>automatikus</b>: a 72. karakternél töri.<br> <b>egyik sem</b>: nincs sortörés.<br> <b>megőrzés</b>:megpróbálja megőrizni az eredeti sortöréseket.</p> Mind Map Import Elmetérkép importálása This does not appear to be a valid Mind Map file. Ez egy érvénytelen Elmetérkép fájlnak tűnik. Mind Map import Elmetérkép importálása Import tip as: Importálás mint: Untitled Név nélküli MDEditCompleter Insert reference Hivatkozás beszúrása MainWindow General Általános Title Cím Subtitle Alcím Series Sorozat Volume Kötet Genre Műfaj License Licenc Author Szerző Name Név Email Email cím Summary Összefoglaló Situation: Szituáció: Summary: Összefoglaló: One sentence Egy mondat One paragraph Egy bekezdés One page Egy oldal Full Teljes One sentence summary Egy mondatos összefoglaló One paragraph summary Egy bekezdéses összefoglaló Expand each sentence of your one paragraph summary to a paragraph Bővítse ki az egybekezdéses összefoglalók mondatait egy-egy bekezdéssé One page summary Egyoldalas összefoglaló Full summary Teljes összefoglaló Next Következő What if...? Mi lenne ha...? Characters Szereplők Names Nevek Filter Szűrő Basic info Alapinformáció Importance Fontosság Motivation Motiváció Goal Cél Conflict Konfliktus Epiphany Fordulópont <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="right">Egy mondat<br/>összefoglaló</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> <html><head/><body><p align="right">Egy bekezdés<br/>összefoglaló</p></body></html> Notes Jegyzetek Detailed info Részletes információ Plots Cselekmények Plot Cselekmény Character(s) Szereplő(k) Description Leírás Result Eredmény Resolution steps Megoldás lépései World Világ Populates with empty data Feltöltés üres adatokkal More Több Source of passion Szenvedély forrása Source of conflict Konfliktus forrása Outline Áttekintés Editor Szerkesztő Debug Hibakeresés FlatData SimaAdat Persos Személyek Labels Címkék &File &Fájl &Recent &Előző &Help &Súgó &Tools &Eszközök &Edit &Szerkesztés &View &Nézet &Mode &Mód &Cheat sheet &Puska Sea&rch &Keresés &Navigation &Navigáció &Open Megn&yitás Ctrl+O Ctrl+O &Save &Mentés Ctrl+S Ctrl+S Sa&ve as... Mentés m&ásként... Ctrl+Shift+S Ctrl+Shift+S &Quit &Kilépés Ctrl+Q Ctrl+Q &Show help texts Sú&gó szövegek mutatása Ctrl+Shift+B Ctrl+Shift+B &Spellcheck &Helyesírás-ellenőrzés F9 F9 &Labels... &Címkék... &Status... &Státusz... Tree Fa &Simple &Egyszerű &Fiction &Fikció Index cards Tárgymutató kártyák S&ettings &Beállítások F8 F8 &Close project &Projekt bezárása Co&mpile &Összeállítás F6 F6 &Frequency Analyzer &Gyakoriság Elemző Book information Könyv információk &About &Névjegy About Manuskript A Manuskript -ről Manuskript Manuskript Project {} saved. {} projekt mentve. WARNING: Project {} not saved. FIGYELEM: {} projekt nem került mentésre. Project {} loaded. {} projekt betöltve. Project {} loaded with some errors: {} projekt betöltve, hibákkal: * {} wasn't found in project file. * {} nem található a projekt fájlban. Project {} loaded with some errors. {} projekt betöltve, hibákkal. (~{} pages) (~{} oldal) Words: {}{} Szó: {}{} Book summary Könyv összefoglalása Project tree Projektfa Metadata Metaadat Story line Történetív Enter information about your book, and yourself. Adjon meg információt a könyvéről és önmagáról. The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) Az alapszituáció 'Mi lenne ha...?' kérdésként feltéve. Pl.. 'Mi lenne ha a legveszélyesebb ' gonosz varázsló ne lenne képes megölni egy csecsemőt?' (Harry Potter) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Szánjon rá időt, hogy elgondolkodjon a könyve egymondatos (-50 szavas) összefoglalóján. Aztán bővítse ki egy bekezdéssé, majd egy oldallá, majd egy teljes összefoglalóvá. Create your characters. Alkossa meg a szereplőit. Develop plots. Cselekmények kidolgozása. Build worlds. Create hierarchy of broad categories down to specific details. Építsen világokat. Készítse el az átfogó kategóriák (és az specifikus részleteinek) hierarchiáját. Create the outline of your masterpiece. Készítse el a mesterműve áttekintését. Write. Írjon. Debug info. Sometimes useful. Hibakeresési információ. Valami hasznos. Dictionary Szótár Nothing Semmi POV Szempont Label Címke Progress Előrehaladás Compile Összeállítás Icon color Ikonszín Text color Szövegszín Background color Háttérszín Icon Ikon Text Szöveg Background Háttér Border Szegély Corner Sarok Add plot step Cselekmény lépés hozzáadása (CTRL+Enter) &Import… &Importálás… F7 F7 &Copy &Másolás Ctrl+C Ctrl+C C&ut &Kivágás Ctrl+X Ctrl+X &Paste &Beillesztés Ctrl+V Ctrl+V &Split… &Felosztás… Ctrl+Shift+K Ctrl+Shift+K Sp&lit at cursor Fe&losztás kurzornál Ctrl+K Ctrl+K Ctrl+M Ctrl+M Ctrl+D Ctrl+D Del Törlés &Move Up &Mozgatás Fel Ctrl+Shift+Up Ctrl+Shift+Up M&ove Down M&ozgatás Le Ctrl+Shift+Down Ctrl+Shift+Down Dupl&icate &Duplikálás &Delete &Törlés &Rename &Átnevezés F2 F2 Organi&ze &Rendszerezés M&erge Össze&fésülés Remove selected plot step(s) &Format &Header &Level 1 (setext) Ctrl+Alt+1 Level &2 Ctrl+Alt+2 Level &1 (atx) Ctrl+1 L&evel 2 Ctrl+2 Level &3 Ctrl+3 Level &4 Ctrl+4 Level &5 Ctrl+5 Level &6 Ctrl+6 &Bold Ctrl+B &Italic Ctrl+I &Strike &Verbatim Su&perscript Ctrl++ Subsc&ript Ctrl+- Co&mment block Ctrl+Shift+C Clear &formats Ctrl+0 &Comment line(s) &Ordered list &Unordered list B&lockquote The file {} does not exist. Has it been moved or deleted? Install {}{} to use spellcheck {} has no installed dictionaries {}{} is not installed Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings Settings Beállítások General Általános Revisions Felülvizsgálatok Views Nézetek Labels Címkék Status Státusz Fullscreen Teljes képernyő General settings Általános beállítások Application settings Alkalmazás stílusa Loading Betöltés Automatically load last project on startup Automatikusan töltse be a legutóbbi projektet induláskor Saving Mentés Automatically save every Automatikusan mentsen minden minutes. percben. If no changes during Ha nem történik változás seconds. másodpercig. Save on project close Mentés kilépéskor <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> <html><head/><body><p>Ha ezt a lehetőséget bejelöli, a projektje egyetlen fájlként kerül mentésre. Így egyszerűbb másolni vagy biztonsági mentést készíteni róla, de elesik a csapatmunka és a verziókezelés lehetőségétől.<br/>Amennyiben nincs bejelölve, a projektje mappaként kerül mentésre, amely sok kis fáljt tartalmaz</p></body></html> Save to one single file Mentés egyetlen fájlba Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. A felülvizsgálatok használata egy módszer a módosítások követésére. Minden szöveges elem számára tartalmazza annak minden módosulatát, lehetővé téve, hogy megtekintse és visszaállítsa az előző verziókat. Keep revisions Felülvizsgálatok megtartása S&mart remove &Intelligens eltávolítás Keep: Megtartás: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. Az intelligens eltávolítás lehetővé teszi, hogy csak bizonyos számú felülvizsgálatot tartson meg. Használata erősen javasolt, ellenkező esetben a fájlja tele lesz jelentéktelen módosítások ezreivel. revisions per day for the last month felülvizsgálat naponta, a múlt hónapban revisions per minute for the last 10 minutes felülvizsgálat percenként, az elmúlt 10 percben revisions per hour for the last day felülvizsgálat óránként a legutóbbi napra revisions per 10 minutes for the last hour felülvizsgálat 10 percenként, az utóbbi egy órában revisions per week till the end of time felülvizsgálat hetente, valaha Views settings Beállítások megtekintése Tree Fa Colors Színek Icon color: Ikon színe: Nothing Semmi POV Szempont Label Címke Progress Előrehaladás Compile Összeállítás Text color: Szövegszín: Background color: Háttérszín: Folders Mappák Show ite&m count Ele&mszám mutatása Show summary Összefoglaló mutatása &Nothing &Semmi Text Szöveg Outline Körvonal Visible columns Látható oszlopok Goal Cél Word count Szószám Percentage Százalék Title Cím Index cards Kartotéklapok Item colors Elemszínek Border color: Szegélyszín: Corner color: Sarokszín: Background Háttér Color: Szín: Ctrl+S Ctrl+S Image: Kép: Text editor Szövegszerkesztő Font Betűtípus Family: Család: Size: Méret: Misspelled: Elírt: Background: Háttér: Paragraphs Bekezdések Line spacing: Vonaltávolság: Single Egyes 1.5 lines 1.5 sor Double Dupla Proportional Arányos % % Tab width: Tabulátorszélesség: px :px Indent 1st line Első sor behúzása Spacing: Szóközölés: New Új Edit Szerkesztés Delete Törlés Theme name: Témanév: Apply Elfogadás Cancel Mégsem Window Background Ablakháttér Text Background Szövegháttér Text Options Szövegbeállítások Paragraph Options Bekezdés Beállítások Type: Típus: No Image Nincs Kép Tiled Csempék Centered Középrezárt Stretched Kinyújtott Scaled Skálázott Zoomed Nagyított Opacity: Telítettség: Position: Pozíció: Left Bal Center Közép Right Jobb Width: Szélesség: Corner radius: Sarok rádiusza: Margins: Margók: Padding: Párnázottság: Font: Betű: Style Stílus Cursor Kurzor Use block insertion of Blokkbeillesztés használata Alignment: Elrendezés: Justify Kiegyenlítés Alignment Elrendezés Icon Size Ikonméret TextLabel SzövegCímke Disable blinking Villogás letiltása Text area Szövegterület Max width Max távolság Left/Right margins: Bal/Jobb margók: Top/Bottom margins: Felső/Alsó margók: S&how progress Előrehaladás &mutatása Show summar&y &Összegzés mutatása Show p&rogress &Előrehaladás mutatása Old st&yle Régi &stílus Transparent Átlátszó Restore defaults Alapértelmezés visszaállítása Style: Language: Font size: Betűméret: Restarting Manuskript ensures all settings take effect. Show &word count &Show word count &New style Typewriter mode Focus mode None Egyik sem Sentence Line Paragraph <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions Helyesírási javaslatok &Add to dictionary &Hozzáadás a szótárhoz &Remove from custom dictionary &Eltávolítás az egyéni szótárból about About Manuskript A Manuskript névjegye Manuskript Manuskript aboutDialog Version Verzió Software Versions in Use: Használatban lévő szoftververzió: abstractModel Title Cím POV Szempont Label Cím Status Státusz Compile Összeállítás Word count Szószám Goal Cél basicItemView Form Űrlap POV: Szempont: Goal: Cél: Word count Szószám One line summary Egysoros összefoglaló Few sentences summary: Pár mondatos összefoglaló: characterModel New character Új szereplő Name Név Value Érték characterTreeView Main Secondary Másodlagos Minor Kisebb jelentőségű cheatSheet Form Űrlap Filter (type the name of anything in your project) Szűrő (gépelje be bárminek a nevét a projektjében ) Minor Kisebb jelentőségű Secondary Másodlagos Main Characters Szereplők Texts Szövegek Plots Cselekmények World Világ cmbOutlineCharacterChoser None Egyik sem Main Secondary Másodlagos Minor Kisebb jelentőségű Various Különféle cmbOutlineLabelChoser Various Különféle cmbOutlineStatusChoser Various Különféle collapsibleDockWidgets Dock Widgets Toolbar Widgetek Eszköztárának Dokkolása completer Form Űrlap corkDelegate One line summary Egysoros összefoglaló Full summary Teljes összefoglaló editorWidget_ui Form Űrlap exporter Export Exportálás Export to: Exportálás ide: Manage exporters Exportálók kezelése Preview Előnézet Settings Beállítások exporterDialog {} (not implemented yet) {} (még nem került fejlesztésre) exporterSettings Form Űrlap Content Tartalom Decide here what will be included in the final export. Itt eldöntheti, hogy mi szerepeljen a végső exportba. Type Típus Title Cím Text Szöveg I need more granularity Több részletre van szükség Fi&lters Sz&űrők <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> <html><head/><body><p>Azt szűri, hogy mi kerüljön bele a végső exportálásba<br/><span style=" color:#773333;">(Nem teljesen kifejlesztett.)</span></p></body></html> Ignore compile status (include all items) Összeállítás státuszának figyelmen kívül hagyása (minden elem belefoglalása) Subitems of: Al-elemei ennek: Labels Címkék Status Státusz Separations Elválasztások Between folders: A következő mappák között: Empty line Üres sor Custom Egyedi Between texts: A következő szövegek között: Between folder and text: A következő mappa és szöveg között: Between text and folder: A következő szöveg és mappa között: Transformations Átalakítások Typographic replacements: Tipográfiai cserék: Replace double quotes (") with: Dupla idézőjelet (") cseréje ezzel: Replace single quotes (') with: Egyszeri idézőjelek (') cseréje ezzel: Remove multiple spaces Többszöri szóközök eltávolítása Custom replacements: Egyedi cserék: Enabled Engedélyezve Replace Csere With Vele RegExp Reguláris Kifejezés If checked, uses regular expression for replacement. If unchecked, replaced as plain text. Ha be van jelölve, a cseréhez reguláris kifejezéseket használhat. Ha nincs bejelölve, egyszerű szövegként cseréli. Preview Előnézet Font Betű Font: Betű: Font size: Betűméret: Folder Mappa {}Level {} folder {}Szint {} mappa {}Level {} text {}Szint {} szöveg Replace ... with … Csere ... ezzel … Replace --- with — Csere --- ezzel — exportersManager Installed Telepítve Custom Egyedi Not found Nem található {} not found. Install it, or set path manually. {} nem található. Telepítse vagy állítsa be az elérési utat kézzel. <b>Status:</b> uninstalled. <b>Státusz:</b> nincs telepítve. <b>Requires:</b> <b>Követelmény:</b> Set {} executable path. {} futtatható fájl elérési útja. frequencyAnalyzer Phrases Kifejezések Frequency Gyakoriság Word Szó fullScreenEditor Theme: Téma: {} words / {} {} szó / {} {} words {} szó Spellcheck Navigation New Text Title Cím Title: Show Full Path Theme selector Word count Szószám Progress Előrehaladás Progress: Auto Show/Hide Clock Clock: Show Seconds generalSettings General Általános Split scenes at: Jelenetek vágása itt: \n---\n \n---\n Trim long titles (> 32 chars) Hosszú címek nyirbálása (> 32 karakter) Import under: Importálás ez alá: Import in a top-level folder Legfelső-szintű mappába importálás helpLabel If you don't wanna see me, you can hide me in Help menu. Amennyiben nem szeretné ezt látni, el tudja rejteni a Sugó menüben. importer Import Importálás Format: Formátum: Choose file Fájl kiválasztása Clear file Fájl tisztítása Preview Előnézet Settings Beállítások lastAccessedDirectoryInfo Last accessed directory "{}" loaded. lineEditView Various Különféle locker Form Űrlap Lock screen: Képernyőzár: Word target Célszószám (szint) Time target Célidő (szint) words :szó minutes :perc Lock ! Zárolva ! ~{} h. ~{} ó. ~{} mn. ~{} p. {}:{} {}:{} {} s. {} mp. {} remaining {} hátralévő {} words remaining {} szó van még hátra mainEditor Form Űrlap Text Szöveg Index cards Kartotéklapok Outline Körvonal F11 F11 Go to parent item Ugrás a szülőelemre Alt+Up Alt+Up Root Gyökér {} words / {} {} szó / {} {} words {} szó. markdownSettings Markdown Markdown metadataView Form Űrlap Properties Tulajdonságok Summary Összefoglaló One line summary Egysoros összefoglaló Full summary Teljes összefoglaló Notes / References Jegyzetek / Hivatkozások Revisions Felülvizsgálatok myPanel Auto-hide Auto-rejtés outlineBasics Set POV Szempont beállítása None Egyik sem Set Status Státusz Beállítása Set Label Címke beállítása New Új Main Secondary Másodlagos Minor Kisebb jelentőségű Set Custom Icon Egyedi Ikon Beállítása Restore to default Visszaállítása alapértelmezettre Root Gyökér Open {} items in new tabs {} elemek megnyitása új füleken Open {} in a new tab {} megnyitása új fülön About to remove Eltávolítás <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> <p><b>Ezzel törli a következő eleme(ke)t {} .</b></p><p>Biztos benne?</p> Select at least two items. Folders are ignored. Válasszon ki legalább két elemet. A mappákat figyelmen kívül hagyja. All items must be on the same level (share the same parent). Minden elemnek ugyanazon a szinten kell lennie (közös szülőn kell osztoznia). New &Folder Új &Mappa New &Text Új &Szöveg &Copy &Másolás C&ut &Kivágás &Paste &Beillesztés &Rename &Átnevezés &Delete &Törlés outlineCharacterDelegate None Egyik sem Main Secondary Másodlagos Minor Kisebb jelentőségű outlineItem {} words / {} ({}) {} szó / {} ({}) {} words {} szó pandocSettings General Általános Table of Content Tartalomjegyzék Custom settings for {} Egyedi beállítások erre {} persosProxyModel Main Secondary Másodlagos Minors Kisebb jelentőségűek plotDelegate General Általános Promise Ígéret Problem Probléma Progress Előrehaladás Resolution Megoldás Try / Fail Próbálkozás / Elbukás No and Nem, és Yes but Igen, de Freytag's pyramid Freytag piramis Exposition Kifejtés Rising action Emelkedő akció Climax Tetőpont Falling action Csökkenő akció Three acts A három felvonás 1. Setup 1. Felépítés 1. Inciting event Kilépés az ajtón 1. Turning point 1. Fordulópont 2. Choice 2. Választás 2. Reversal 2. Fordulat 2. Disaster 2. Csapás (katasztrofális esemény) 3. Stand up 3. Felocsúdás 3. Climax 3. Tetőpont 3. Ending 3. Befejezés Hero's journey A Hős útja Ordinary world Hétköznapi világ Call to adventure Kalandra hívás Refusal of the call A hívás visszautasítása Meeting with mentor Találkozás a mentorral Tests Próbák Approach Közeledés Abyss Mélység Reward / Revelation Jutalom / Felismerés Transformation Átalakulás Atonement Bűnhődés Return Visszatérés plotModel New plot Új cselekmény Name Név Meta Meta New step Új lépés Main Secondary Másodlagos Minor Kisebb jelentőségű plotTreeView Main Secondary Másodlagos Minor Kisebb jelentőségű **Plot:** {} **Cselekmény:** {} plotsProxyModel Main Secondary Másodlagos Minors Kisebb jelentőségűek propertiesView Form Űrlap POV Szempont Status Státusz Label Címke Compile Összeállítás Goal Cél Word count Szószám references Not a reference: {}. Ez nem hivatkozás: {}. Unknown reference: {}. Ismeretlen hivatkozás: {}. Path: Elérési út: Stats: Statisztika: POV: Szempont: Status: Státusz: Label: Címke: Short summary: Rövid összefoglaló: Long summary: Hosszú összefoglaló: Notes: Jegyzetek: Basic info Alapinformáció Detailed info Részletes információ POV of: A következő szempontja: Go to {}. Menj ide {}. Description Leírás Result Eredmény Characters Szereplők Resolution steps Megoldási lépések Passion Szenvedély Conflict Konfliktus <b>Unknown reference:</b> {}. <b>Ismeretlen hivatkozás:</b> {}. Folder: <b>{}</b> Mappa: <b>{}</b> Text: <b>{}</b> Szöveg: <b>{}</b> Character: <b>{}</b> Szereplő: <b>{}</b> Plot: <b>{}</b> Cselekmény: <b>{}</b> World: <b>{name}</b>{path} Világ: <b>{name}</b>{path} Referenced in: Hivatkozva itt: Motivation Motiváció Goal Cél Epiphany Fordulópont Short summary Rövid összefoglaló Longer summary Hosszabb összefoglaló revisions Form Űrlap Options Lehetőségek Restore Visszaállítás Delete Törlés Show modifications Módosítások mutatása Show ancient version Korábbi verzió mutatása Show spaces Szóközök mutatása Show modifications only Csak a módosítások mutatása {} years ago {} éve {} months ago {} hónapja {} days ago {} napja 1 day ago 1 nappal ezelőtt {} hours ago {} órával ezelőtt {} minutes ago {} perccel ezelőtt {} seconds ago {} másodperccel ezelőtt Line {}: Sor {}: Clear all Minden törlése search Form Űrlap Search for... Keresés... Search in: Keresés ebben: All Mind Title Cím Text Szöveg Summary Összefoglaló Notes Jegyzetek POV Szempont Status Státusz Label Címke Options: Lehetőségek: Case sensitive Kis-nagybetű érzékeny settingsWindow New status Új státusz New label Új címke newtheme újtéma New theme Új téma (read-only) (csak-olvasható) Open Image Image files (*.jpg; *.jpeg; *.png) Error Hiba Unable to load selected file Unable to add selected image: {} sldImportance Form Űrlap TextLabel SzövegCímke Minor Kisebb jelentőségű Secondary Másodlagos Main splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> <p>Kiválasztott elem(ek) vágása a megadott jelnél.</p> <p>Ha a kiválasztott elem egy mappa, a végrehajtás örökletesen történik <i>minden</i> gyermek elemre.</p> <p>A megosztott jel tartalmazhatja a következő menekülési szekvenciákat: <ul> <li><b><code>\n</code></b>: sortörés</li> <li><b><code>\t</code></b>: tabulátor</li> </ul> </p> <p><b>Jel:</b></p> Split '{}' Vágás '{}' Split items Elemek vágása storylineView Form Űrlap Show Plots Cselekmények mutatása Show Characters Szereplők mutatása tabSplitter Open selected items in that view. Kijelölt elemek megnyitása abban a nézetben. Split horizontally Vízszintes felosztás Close split Felosztás bezárása Split vertically Függőleges felosztás textEditView Various Különféle textFormat Form Űrlap CTRL+B CTRL+B CTRL+I CTRL+I CTRL+U CTRL+U CTRL+P CTRL+P CTRL+L CTRL+L CTRL+E CTRL+E CTRL+R CTRL+R CTRL+J CTRL+J treeView Expand {} Kinyit {} Collapse {} Összezár {} Expand All Mindent Kinyit Collapse All Mindet Összezár welcome Form Űrlap 1 1 Templates Sablonok Empty Üres Novel Regény Novella Kisregény Short Story Elbeszélés Research paper Kutatási jegyzet Demo projects Bemutató projektet Add level Szint hozzáadása Add word count Szószámlálás hozzáadása Next time, automatically open last project Legközelebb, automatikusa nyissa meg a legutóbbi projektet Open... Megnyitás... Recent Legutóbbi Create Létrehozás Open project Projekt megnyitása Manuskript project (*.msk);;All files (*) Manuskript projekt (*.msk);;Minden fájl (*) Save project as... Projekt mentése másként... Manuskript project (*.msk) Manuskript projekt (*.msk) Manuskript Manuskript Create New Project Új Projekt Létrehozása Warning Figyelmeztetés Overwrite existing project {} ? Felülírja a létező projektet {} ? Empty fiction Üres regény Chapter Fejezet Scene Jelenet Trilogy Trilógia Book Könyv Section Szakasz Empty non-fiction Üres nem-kitalált words each. szó mindegyik. of a Text Szöveg Something Valami <b>Total:</b> {} words (~ {} pages) <b>Összesen:</b> {} szó (~ {} oldal) Fiction Kitalált Non-fiction Valós alapú Idea Ötlet Note Jegyzet Research Kutatás TODO TODO First draft Első vázlat Second draft Második vázlat Final Végső worldModel New item Új elem Fantasy world building Fantáziavilág építése Physical Fizikai Climate Éghajlat Topography Domborzat Astronomy Csillagászat Wild life Vadvilág Flora Növényvilág History Történelem Races Fajok Diseases Betegségek Cultural Kulturális Customs Szokások Food Étel Languages Nyelvek Education Oktatás Dresses Öltözékek Science Tudomány Calendar Naptár Bodily language Testbeszéd Ethics Erkölcsök Religion Vallás Government Kormány Politics Politikák Gender roles Nemi szerepek Music and arts Zene és művészetek Architecture Építészet Military Katonaság Technology Technológia Courtship Udvarlás Demography Demográfia Transportation Közlekedés Medicine Orvosság Magic system Mágiarendszer Rules Szabályok Organization Szervezet Magical objects Varázstárgyak Magical places Mágikus helyek Magical races Mágikus fajok Important places Fontos helyek Important objects Fontos tárgyak Natural resources manuskript-0.10.0/i18n/manuskript_id.qm000066400000000000000000000040331354442177200177650ustar00rootroot00000000000000 Export Basic HTML output using the Python module 'markdown'. Keluaran HTML dasar menggunakan modul python 'markdown'. Python module 'markdown'. Modul python 'markdown'. Markdown source Sumber markdown HTML Source Sumber HTML HTML Output Hasil HTML Default exporter, provides basic formats used by other exporters. Eksporter bawaan, menyediakan format dasar yang digunakan oleh eksporter lainnya. Preview with highlighter. Pratinjau dengan stabilo. Plain text Teks biasa A little known format modestly used. You know, web sites for example. Needs LaTeX to be installed. Membutuhkan latex untuk dipasang. Error Eror Standalone document (not just a fragment) Dokumen yang berdiri sendiri (bukan hanya bagian) Include a table of contents. Termasuk daftar isi. Number of sections level to include in TOC: Jumlah tingkat bagian untuk memasukkan dalam TOC: Typographically correct output Keluaran tipografi yang benar Normalize the document (cleaner) Normalisasikan dokumen (pembersih) Specify the base level for headers: Tentukan tingkat dasar untuk tajuk: Use reference-style links instead of inline links Use ATX-style headers Use <q> tags for quotes in HTML LaTeX engine used to produce the PDF. Paper size: Font size: Class: Line spacing: Books that don't kill trees. OpenDocument format. Used by LibreOffice for example. Microsoft Office (.docx) document. reStructuredText is a lightweight markup language. Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. LaTeX is a word processor and document markup language used to create beautiful documents. The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. Disable YAML metadata block. Use that if you get YAML related error. Convert to ePUB3 Self-contained HTML files, with no dependencies Could not process regular expression: {} Choose output file… ExportersManager Manage Exporters Manuskript Description Offers export to Status Status: Version: Path: ... {HelpText} FrequencyAnalyzer Frequency Analyzer Word frequency Settings Minimum size: Exclude words (comma separated): Analyze Phrase frequency Number of words: from to Import Markdown import <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; Folder import <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> Include only those extensions: Comma separated values Sort items by name Import folder then files OPML Import File open failed. This does not appear to be a valid OPML file. Pandoc import <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; Import using: Wrap lines: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> Mind Map Import This does not appear to be a valid Mind Map file. Mind Map import Import tip as: Untitled MDEditCompleter Insert reference MainWindow General Title Subtitle Series Volume Genre License Author Name Email Summary Situation: Summary: One sentence One paragraph One page Full One sentence summary One paragraph summary Expand each sentence of your one paragraph summary to a paragraph One page summary Full summary Next What if...? Characters Names Filter Basic info Importance Motivation Goal Conflict Epiphany <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> Notes Detailed info Plots Plot Character(s) Description Result Resolution steps World Populates with empty data More Source of passion Source of conflict Outline Editor Debug FlatData Persos Labels &File &Recent &Help &Tools &Edit &View &Mode &Cheat sheet Sea&rch &Navigation &Open Ctrl+O &Save Ctrl+S Sa&ve as... Ctrl+Shift+S &Quit Ctrl+Q &Show help texts Ctrl+Shift+B &Spellcheck F9 &Labels... &Status... Tree &Simple &Fiction Index cards S&ettings F8 &Close project Co&mpile F6 &Frequency Analyzer Book information &About About Manuskript Manuskript Project {} saved. WARNING: Project {} not saved. Project {} loaded. Project {} loaded with some errors: * {} wasn't found in project file. Project {} loaded with some errors. (~{} pages) Words: {}{} Book summary Project tree Metadata Story line Enter information about your book, and yourself. The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Create your characters. Develop plots. Build worlds. Create hierarchy of broad categories down to specific details. Create the outline of your masterpiece. Write. Debug info. Sometimes useful. Dictionary Nothing POV Label Progress Compile Icon color Text color Background color Icon Text Background Border Corner Add plot step &Import… F7 &Copy Ctrl+C C&ut Ctrl+X &Paste Ctrl+V &Split… Ctrl+Shift+K Sp&lit at cursor Ctrl+K Ctrl+M Ctrl+D Del &Move Up Ctrl+Shift+Up M&ove Down Ctrl+Shift+Down Dupl&icate &Delete &Rename F2 Organi&ze M&erge Remove selected plot step(s) &Format &Header &Level 1 (setext) Ctrl+Alt+1 Level &2 Ctrl+Alt+2 Level &1 (atx) Ctrl+1 L&evel 2 Ctrl+2 Level &3 Ctrl+3 Level &4 Ctrl+4 Level &5 Ctrl+5 Level &6 Ctrl+6 &Bold Ctrl+B &Italic Ctrl+I &Strike &Verbatim Su&perscript Ctrl++ Subsc&ript Ctrl+- Co&mment block Ctrl+Shift+C Clear &formats Ctrl+0 &Comment line(s) &Ordered list &Unordered list B&lockquote The file {} does not exist. Has it been moved or deleted? Install {}{} to use spellcheck {} has no installed dictionaries {}{} is not installed Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings Settings General Revisions Views Labels Status Fullscreen General settings Application settings Loading Automatically load last project on startup Saving Automatically save every minutes. If no changes during seconds. Save on project close <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> Save to one single file Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. Keep revisions S&mart remove Keep: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. revisions per day for the last month revisions per minute for the last 10 minutes revisions per hour for the last day revisions per 10 minutes for the last hour revisions per week till the end of time Views settings Tree Colors Icon color: Nothing POV Label Progress Compile Text color: Background color: Folders Show ite&m count Show summary &Nothing Text Outline Visible columns Goal Word count Percentage Title Index cards Item colors Border color: Corner color: Background Color: Ctrl+S Image: Text editor Font Family: Size: Misspelled: Background: Paragraphs Line spacing: Single 1.5 lines Double Proportional % Tab width: px Indent 1st line Spacing: New Edit Delete Theme name: Apply Cancel Window Background Text Background Text Options Paragraph Options Type: No Image Tiled Centered Stretched Scaled Zoomed Opacity: Position: Left Center Right Width: Corner radius: Margins: Padding: Font: Style Cursor Use block insertion of Alignment: Justify Alignment Icon Size TextLabel Disable blinking Text area Max width Left/Right margins: Top/Bottom margins: S&how progress Show summar&y Show p&rogress Old st&yle Transparent Restore defaults Style: Language: Font size: Restarting Manuskript ensures all settings take effect. Show &word count &Show word count &New style Typewriter mode Focus mode None Sentence Line Paragraph <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions &Add to dictionary &Remove from custom dictionary about About Manuskript Manuskript aboutDialog Version Software Versions in Use: abstractModel Title POV Label Status Compile Word count Goal basicItemView Form POV: Goal: Word count One line summary Few sentences summary: characterModel New character Name Value characterTreeView Main Secondary Minor cheatSheet Form Filter (type the name of anything in your project) Minor Secondary Main Characters Texts Plots World cmbOutlineCharacterChoser None Main Secondary Minor Various cmbOutlineLabelChoser Various cmbOutlineStatusChoser Various collapsibleDockWidgets Dock Widgets Toolbar completer Form corkDelegate One line summary Full summary editorWidget_ui Form exporter Export Export to: Manage exporters Preview Settings exporterDialog {} (not implemented yet) exporterSettings Form Content Decide here what will be included in the final export. Type Title Text I need more granularity Fi&lters <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> Ignore compile status (include all items) Subitems of: Labels Status Separations Between folders: Empty line Custom Between texts: Between folder and text: Between text and folder: Transformations Typographic replacements: Replace double quotes (") with: Replace single quotes (') with: Remove multiple spaces Custom replacements: Enabled Replace With RegExp If checked, uses regular expression for replacement. If unchecked, replaced as plain text. Preview Font Font: Font size: Folder {}Level {} folder {}Level {} text Replace ... with … Replace --- with — exportersManager Installed Custom Not found {} not found. Install it, or set path manually. <b>Status:</b> uninstalled. <b>Requires:</b> Set {} executable path. frequencyAnalyzer Phrases Frequency Word fullScreenEditor Theme: {} words / {} {} words Spellcheck Navigation New Text Title Title: Show Full Path Theme selector Word count Progress Progress: Auto Show/Hide Clock Clock: Show Seconds generalSettings General Split scenes at: \n---\n Trim long titles (> 32 chars) Import under: Import in a top-level folder helpLabel If you don't wanna see me, you can hide me in Help menu. importer Import Format: Choose file Clear file Preview Settings lastAccessedDirectoryInfo Last accessed directory "{}" loaded. lineEditView Various locker Form Lock screen: Word target Time target words minutes Lock ! ~{} h. ~{} mn. {}:{} {} s. {} remaining {} words remaining mainEditor Form Text Index cards Outline F11 Go to parent item Alt+Up Root {} words / {} {} words markdownSettings Markdown metadataView Form Properties Summary One line summary Full summary Notes / References Revisions myPanel Auto-hide outlineBasics Set POV None Set Status Set Label New Main Secondary Minor Set Custom Icon Restore to default Root Open {} items in new tabs Open {} in a new tab About to remove <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> Select at least two items. Folders are ignored. All items must be on the same level (share the same parent). New &Folder New &Text &Copy C&ut &Paste &Rename &Delete outlineCharacterDelegate None Main Secondary Minor outlineItem {} words / {} ({}) {} words pandocSettings General Table of Content Custom settings for {} persosProxyModel Main Secondary Minors plotDelegate General Promise Problem Progress Resolution Try / Fail No and Yes but Freytag's pyramid Exposition Rising action Climax Falling action Three acts 1. Setup 1. Inciting event 1. Turning point 2. Choice 2. Reversal 2. Disaster 3. Stand up 3. Climax 3. Ending Hero's journey Ordinary world Call to adventure Refusal of the call Meeting with mentor Tests Approach Abyss Reward / Revelation Transformation Atonement Return plotModel New plot Name Meta New step Main Secondary Minor plotTreeView Main Secondary Minor **Plot:** {} plotsProxyModel Main Secondary Minors propertiesView Form POV Status Label Compile Goal Word count references Not a reference: {}. Unknown reference: {}. Path: Stats: POV: Status: Label: Short summary: Long summary: Notes: Basic info Detailed info POV of: Go to {}. Description Result Characters Resolution steps Passion Conflict <b>Unknown reference:</b> {}. Folder: <b>{}</b> Text: <b>{}</b> Character: <b>{}</b> Plot: <b>{}</b> World: <b>{name}</b>{path} Referenced in: Motivation Goal Epiphany Short summary Longer summary revisions Form Options Restore Delete Show modifications Show ancient version Show spaces Show modifications only {} years ago {} months ago {} days ago 1 day ago {} hours ago {} minutes ago {} seconds ago Line {}: Clear all search Form Search for... Search in: All Title Text Summary Notes POV Status Label Options: Case sensitive settingsWindow New status New label newtheme New theme (read-only) Open Image Image files (*.jpg; *.jpeg; *.png) Error Eror Unable to load selected file Unable to add selected image: {} sldImportance Form TextLabel Minor Secondary Main splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> Split '{}' Split items storylineView Form Show Plots Show Characters tabSplitter Open selected items in that view. Split horizontally Close split Split vertically textEditView Various textFormat Form CTRL+B CTRL+I CTRL+U CTRL+P CTRL+L CTRL+E CTRL+R CTRL+J treeView Expand {} Collapse {} Expand All Collapse All welcome Form 1 Templates Empty Novel Novella Short Story Research paper Demo projects Add level Add word count Next time, automatically open last project Open... Recent Create Open project Manuskript project (*.msk);;All files (*) Save project as... Manuskript project (*.msk) Manuskript Create New Project Warning Overwrite existing project {} ? Empty fiction Chapter Scene Trilogy Book Section Empty non-fiction words each. of Text Something <b>Total:</b> {} words (~ {} pages) Fiction Non-fiction Idea Note Research TODO First draft Second draft Final worldModel New item Fantasy world building Physical Climate Topography Astronomy Wild life Flora History Races Diseases Cultural Customs Food Languages Education Dresses Science Calendar Bodily language Ethics Religion Government Politics Gender roles Music and arts Architecture Military Technology Courtship Demography Transportation Medicine Magic system Rules Organization Magical objects Magical places Magical races Important places Important objects Natural resources manuskript-0.10.0/i18n/manuskript_it.qm000066400000000000000000002411541354442177200200140ustar00rootroot00000000000000LbT4TVE@VEVEVEߤVsdeOd#dܴog5mRmsMe&! %#J}YB*$=*y>*yo*?_*%?*0@+EB +fB+Cv+D+F.30#93;XA[oG:G Hw9{J5WJUKQL7XdLGLb^LbM|M6 xMezAMezXMŅ\'NWQ:Rx^QRxCRxRxRxTbTb{TbTb'TbfTbTb.TbTaUjb6Uj&UlV':V"GVMW6e|W6Xy%XgYEY%YȀZZ%ZʳZϳ[W[ %r[ %[ %E[ %[ %B[ %[ٵV3(6nݰIIʯlNoJ6|InحYA !Fz$IY^;Bgq'Ahgz~h<q[29Tu"j=CAPDf3E#!N#DӽҳP.o`2M[D#aN~L,M[]-,U0W>Oj1vd3tcML#>UAIVW]1}#/^cpi@:tRWc.fg>k.(^Xʶ'`&u)PJ'1!Kȳ Ʃ%q&n,0JEUF'N^_KaNlwpB@l.q0drwbbp= n n2nWn|nooorKzT2bIKI}Z~'jsj)ՈCx6Z~6~O9VP\PPPQ QQQQQRRRS S;S`SSSUhU,,Vb]`]‚Gt9%7S\ bX!ĚG{]wnSԵvD>:[*N{:/ /C"0sDB$M?`f}uMv{!&$ f''3^'3w'3T+5!ϖ5@V@VHuQhDFVjW<jjvRjbbjolcelq2sgI}}Z>}ZTs4io4q G"mj\TbN%iMj7"6YÊ Tkqt;j?3&-<5sEߺt ~tYu *0&` )dotcJcőT%ĒA&t/tѣ0%V9$CsiCsCJC LtM+OM+HR!|OTunK`x$l^m?$ mmxmZmmmnopsjr z z{~ ~~,(Z]t?]a.isDž0d00֣g֝c0ރI>:9RǶ1 Z 2@*!ta8/Y9 I'ǹA#t)H0e 11E1~iG4<NlArJ<(rvyS=ЂJkϗϗϗͬ7@;E~C{S"` NLukN°^-ÈQv[(У% sH V r$G Su!wjʧ,N3 7}BnBLHAE#xMP[5j]*}bтhf~2M~2~2 ~"ZWZڬsaj(SnT^wEW~Aq'iʶ!c˙Dvy|$ .  σ F> HZ +4 ?:E Mg! MgV Mg T X;lN ^f ^ ^ƅ ^ g:R r,| x v ze Ih  &$ -Ɇ  j& %k  U Uޜ շ z C! O z & ?@ 08 3 9s]A 9s 9sҧ >cm5 A^T Rb` ZZ dpeN dpe~ dpeF dpeQ d) d) d)F d) d) d); d)s d)` d) d) e" luI n-O o"`ӻ }(7  T B;& f * ډ :" :t ,?' ,֢ 8l 8 89 ʶ ֓? UN N z@ c 9W J A; ; #e F.v Q8Т U~6 ]Y l s33 }j$ %G .  tC HC H N fj 5 $  l d GD L ڔ6 5E u# 5 YWZ _ p iC ӨSb y W! P O R /% 1Ul 4 ;e =fl Cjl G$ Nr SD ZS Z$~V bq i?h) pk` rIj }6 !T?  =FM !      )ĩ ޔ! B $ x$ / " s3  `! 'j a $! $` $x $ n ,e %:* #i s% s s s ɠ _ _F _ _ _ ̺^ C3 u ?  QN+ #F  դ . zZ!  b 4}% 5N  7ؤuw 87>K DYS DYT DYT DZT J` K b i8:G dr PE .;K SX  C  ^ 3 ) 0{ Ğt>Q <[ < < <2 <U a} ⋙b eYp uYF'a2#2)ME6eKf9c,<+HgIOqUhWGz[d$`|08$Wj}tk ̺qaRbRR !YOUfI Sy); A=Q>cB3BxS7)Qy&vR_JR_[d@=fqpt7|oN ~`G~`-"|"|=ki~Ml^ttz:BPi8i'<p>Un convertitore di documenti universale. Pu essere usato per convertire Markdown in una vasta gamma di altri formati.</p> <p>Sito web: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> 

A universal document converter. Can be used to convert markdown to a wide range of other formats.

Website: http://pandoc.org/

ExportUn formato poco conosciuto usato raramente. Ad esempio, da siti web.EA little known format modestly used. You know, web sites for example.ExportzOutput HTML di base che utilizza il modulo Python 'markdown'.5Basic HTML output using the Python module 'markdown'.ExportbLibri per i quali non serve abbattere gli alberi.Books that don't kill trees.Export0Scegli il file di outputChoose output file…ExportClasse:Class:Export2Converti in formato ePUB3Convert to ePUB3ExportvErrore durante l'elaborazione dell'espressione regolare: {})Could not process regular expression: {}ExportExporter predefinito, fornisce formati di base usati da altri exporter.ADefault exporter, provides basic formats used by other exporters.ExportDisabilita il blocco dei metadati YAML. Usalo se ottieni un errore relativo a YAML.DDisable YAML metadata block. Use that if you get YAML related error.Export ErroreErrorExport Esporta in markdown, usando pandoc. Permette maggiori opzioni di formattazione rispetto all'esportatore predefinito di Manuskript.hExport to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter.Export(Dimensione del font: Font size:ExportOutput HTML HTML OutputExportSorgente HTML HTML SourceExport(Include un sommario.Include a table of contents.Export,Proprio come il testo piano, eccetto per l'aggiunta di titoli markdown. Presuppone che i testi siano formattati in markdown.Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown.ExportHMotore LaTeX usato per produrre PDF.%LaTeX engine used to produce the PDF.Export LaTeX un word processor ed un linguaggio markup usato per creare bellissimi documenti.LaTeX is a word processor and document markup language used to create beautiful documents.ExportInterlinea: Line spacing:Export"Sorgente MarkdownMarkdown sourceExportFDocumento Microsoft Office (.docx)."Microsoft Office (.docx) document.Export< necessario installare LaTeX.Needs LaTeX to be installed.ExportDNormalizza il documento (pulitore) Normalize the document (cleaner)ExportZNumero di sezioni da includere nel sommario: ,Number of sections level to include in TOC: ExportnFormato OpenDocument. Usato da LibreOffice per esempio.5OpenDocument format. Used by LibreOffice for example.Export,Dimensione del foglio: Paper size:ExportTesto normale Plain textExport8Anteprima con evidenziatore.Preview with highlighter.Export2modulo Python 'markdown'.Python module 'markdown'.ExportdFiles HTML autosufficienti, non servono dipendenze/Self-contained HTML files, with no dependenciesExportjLa pi semplice esportazione in testo piano. Ti permette di usare il tuo markup non riconosciuto da Manuskript, per esempio <a href='www.fountain.io'>Fountain</a>.Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example Fountain.ExportdSpecifica il livello di base per le intestazioni: $Specify the base level for headers: ExportTDocumento autonomo (non solo un frammento))Standalone document (not just a fragment)ExportLo scopo di questo formato di fornire un modo per scambiare informazioni tra outliner e servizi Internet che possono essere sfogliati o controllati attraverso un outliner.The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner.Export@Output tipograficamente correttoTypographically correct outputExportLUsa <q> tags per le virgolette in HTMLUse tags for quotes in HTMLExport:Usa intestazioni in stile ATXUse ATX-style headersExportpUsa links di stile di riferimento anzich links in linea1Use reference-style links instead of inline linksExportuna installazione LaTeX valida. Le raccomandazioni su Pandoc possono essere trovate su: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. Se vuoi il supporto a Unicode, hai bisogno di XeLaTeX.a valid LaTeX installation. Pandoc recommendations can be found on: pandoc.org/installing.html. If you want Unicode support, you need XeLaTeX.Export`reStructuredText un leggero linguaggio markup.2reStructuredText is a lightweight markup language.Export...ExportersManagerDescrizione DescriptionExportersManager0Gestisci gli esportatoriManage ExportersExportersManager ManuskriptExportersManager0Offre esportazione versoOffers export toExportersManagerPercorso:Path:ExportersManager StatoStatusExportersManager Stato:Status:ExportersManagerVersione:Version:ExportersManager{Testo guida} {HelpText}ExportersManagerAnalizzaAnalyzeFrequencyAnalyzerREscludi parole (separate da una virgola): Exclude words (comma separated):FrequencyAnalyzer2Analizzatore di frequenzaFrequency AnalyzerFrequencyAnalyzer$Dimensione minima: Minimum size:FrequencyAnalyzer(Numero di parole: daNumber of words: fromFrequencyAnalyzer*Frequenza della frasePhrase frequencyFrequencyAnalyzerImpostazioniSettingsFrequencyAnalyzer,Frequenza della parolaWord frequencyFrequencyAnalyzeratoFrequencyAnalyzerX<b>Info:</b> Un semplice parser che passer attraverso un documento markdown e creer un oggetto per ogni titolo.<br/>&nbsp;Info: A very simple parser that will go through a markdown document and create items for each titles.
 Import<b>Info:</b> Manuskript pu importare da <b>markdown</b> o <b>OPML</b>. Pandoc convertir i documenti in entrambi (vedi le opzioni in basso), e poi li importer in Manuskript. L'uno o l'altro potrebbe dare risultati migliori a seconda del documento. <br/>&nbsp;}Info: Manuskript can import from markdown or OPML. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document.
 Import<p><b>Info:</b> Importa l'intera struttura di una directory. Le cartelle sono aggiunte come cartelle, e i documenti di testo al loro interno (scegli tu quali in base all'estensione) sono aggiunti come scene.</p> <p>Sono supportati solo i files di testo (non immagini, binari o altro).</p>R

Info: Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.

Only text files are supported (not images, binary or others).

Import<p>Pandoc deve creare delle cosmetiche / non-semantiche interruzioni di linea?</p><p> <b>auto</b>: a capo a 72 caratteri.<br> <b>nessuno</b>: nessuna interruzione.<br> <b>preserva</b>: tenta di preservare le interruzioni di linea del documento originale.</p>Q

Should pandoc create cosmetic / non-semantic line-breaks?

auto: wraps at 72 characters.
none: no line wrap.
preserve: tries to preserves line wrap from the original document.

Import4Valori separati da virgoleComma separated valuesImport4Apertura del file fallita.File open failed.Import Importa cartella Folder importImportBImporta la cartella e poi i filesImport folder then filesImport"Importa tip come:Import tip as:ImportImporta usando: Import using:Import>Includi solo queste estensioni:Include only those extensions:Import0Importa file in MarkdownMarkdown importImport*Importa mappa mentaleMind Map ImportImport*Importa mappa mentaleMind Map importImportImporta OPML OPML ImportImportImporta Pandoc Pandoc importImport6Ordina gli oggetti per nomeSort items by nameImportrQuesto non sembra essere un file di mappa mentale valido.1This does not appear to be a valid Mind Map file.ImportZQuesto non sembra essere un file OPML valido.-This does not appear to be a valid OPML file.ImportSenza titoloUntitledImportLinee a capo: Wrap lines:Import*Inserisci riferimentoInsert referenceMDEditCompleter (~{} pagine) (~{} pages) MainWindowN * {} non trovato nel file di progetto.# * {} wasn't found in project file. MainWindow&A proposito&About MainWindow&Grassetto&Bold MainWindow&Promemoria &Cheat sheet MainWindow &Chiudi progetto&Close project MainWindow*Linea(e) di &commento&Comment line(s) MainWindow &Copia&Copy MainWindow&Cancella&Delete MainWindow&Modifica&Edit MainWindow&Narrativa&Fiction MainWindow&File MainWindow&Formato&Format MainWindow4&Analizzatore di frequenza&Frequency Analyzer MainWindow&Intestazione&Header MainWindow &Guida&Help MainWindow&Importa & &Import… MainWindow&Corsivo&Italic MainWindow&Etichette... &Labels... MainWindow&&Livello 1 (setext)&Level 1 (setext) MainWindow&Modalit&Mode MainWindow&Sposta in alto&Move Up MainWindow&Navigazione &Navigation MainWindow &Apri&Open MainWindow &Elenco numerato &Ordered list MainWindow&Incolla&Paste MainWindow &Esci&Quit MainWindow&Recente&Recent MainWindow&Rinomina&Rename MainWindow &Salva&Save MainWindow &Mostra la guida&Show help texts MainWindow&Semplice&Simple MainWindow,&Controllo ortografico &Spellcheck MainWindow&Dividi & &Split… MainWindow&Stato... &Status... MainWindow&Barrato&Strike MainWindow&Strumenti&Tools MainWindow&Elenco puntato&Unordered list MainWindow$&Parola per parola &Verbatim MainWindow&Visualizza&View MainWindow<html><head/><body><p align="right">Un paragrafo<br/>riassunto</p></body></html>O

One paragraph
summary

 MainWindow<html><head/><body><p align="right">Una frase<br/>riassunto</p></body></html>N

One sentence
summary

 MainWindow2A proposito di ManuskriptAbout Manuskript MainWindow@Aggiungi un passaggio alla trama Add plot step MainWindow AutoreAuthor MainWindow&Citazione (b&locco) B&lockquote MainWindow Sfondo Background MainWindow&Colore dello sfondoBackground color MainWindow(Informazioni di base Basic info MainWindow&Ragguagli sul libroBook information MainWindow&Riassunto del libro Book summary MainWindow BordoBorder MainWindowCostruisci i mondi. Crea una gerarchia di ampie categorie fino ad arrivare ai dettagli specifici.MBuild worlds. Create hierarchy of broad categories down to specific details. MainWindowT&agliaC&ut MainWindowPersonaggio(i) Character(s) MainWindowPersonaggi Characters MainWindow&Cancella i &formatiClear &formats MainWindow&Blocco di co&mmentiCo&mment block MainWindow2Co&mpila per esportazioneCo&mpile MainWindowCompilatoCompile MainWindowConflittoConflict MainWindow AngoloCorner MainWindowHCrea il contorno del tuo capolavoro.'Create the outline of your masterpiece. MainWindow.Crea i tuoi personaggi.Create your characters. MainWindow Ctrl++Ctrl++ MainWindow Ctrl+-Ctrl+- MainWindow Ctrl+0Ctrl+0 MainWindow Ctrl+1Ctrl+1 MainWindow Ctrl+2Ctrl+2 MainWindow Ctrl+3Ctrl+3 MainWindow Ctrl+4Ctrl+4 MainWindow Ctrl+5Ctrl+5 MainWindow Ctrl+6Ctrl+6 MainWindowCtrl+Alt+1 Ctrl+Alt+1 MainWindowCtrl+Alt+2 Ctrl+Alt+2 MainWindow Ctrl+BCtrl+B MainWindowCtrl+C MainWindowCtrl+D MainWindow Ctrl+ICtrl+I MainWindowCtrl+K MainWindowCtrl+M MainWindowCtrl+O MainWindowCtrl+Q MainWindowCtrl+S MainWindow Ctrl+Shift+B MainWindowCtrl+Shift+C Ctrl+Shift+C MainWindow,Ctrl+Shift+Freccia giCtrl+Shift+Down MainWindow Ctrl+Shift+K MainWindow Ctrl+Shift+S MainWindow*Ctrl+Shift+Freccia su Ctrl+Shift+Up MainWindowCtrl+V MainWindowCtrl+X MainWindowMessa a puntoDebug MainWindowhInformazioni di debug. A volte possono essere utili.Debug info. Sometimes useful. MainWindowCancDel MainWindowDescrizione Description MainWindow0Informazioni dettagliate Detailed info MainWindow$Sviluppa le trame.Develop plots. MainWindowDizionario Dictionary MainWindowDupl&ica Dupl&icate MainWindowEditor di testoEditor MainWindowEmail MainWindowbInserisci informazioni sul tuo libro, e su di te.0Enter information about your book, and yourself. MainWindowEpifaniaEpiphany MainWindowEspandi ogni frase del riassunto in un paragrafo in un nuovo paragrafoAExpand each sentence of your one paragraph summary to a paragraph MainWindowF2 MainWindowF6 MainWindowF7 MainWindowF8 MainWindowF9 MainWindow FiltroFilter MainWindowDati grezziFlatData MainWindowCompletoFull MainWindow$Riassunto completo Full summary MainWindowGeneraleGeneral MainWindow GenereGenre MainWindowObiettivoGoal MainWindow IconaIcon MainWindow"Colore dell'icona Icon color MainWindowImportanza Importance MainWindow Schede Index cards MainWindowbInstalla {}{} per usare il correttore ortograficoInstall {}{} to use spellcheck MainWindowL&ivello 2L&evel 2 MainWindowEtichettaLabel MainWindowEtichetteLabels MainWindow Livello &1 (atx)Level &1 (atx) MainWindowLivello &2Level &2 MainWindowLivello &3Level &3 MainWindowLivello &4Level &4 MainWindowLivello &5Level &5 MainWindowLivello &6Level &6 MainWindowLicenzaLicense MainWindowU&nisciM&erge MainWindow Sp&osta in basso M&ove Down MainWindow Manuskript MainWindowMetadatiMetadata MainWindow Di piMore MainWindowMotivazione Motivation MainWindowNomeName MainWindowNomiNames MainWindow AvantiNext MainWindowNoteNotes MainWindow NienteNothing MainWindowUna paginaOne page MainWindow.Riassunto in una paginaOne page summary MainWindowUn paragrafo One paragraph MainWindow2Riassunto in un paragrafoOne paragraph summary MainWindowUna frase One sentence MainWindow,Riassunto in una fraseOne sentence summary MainWindowOrgani&zza Organi&ze MainWindow Quadro d'insiemeOutline MainWindowPOV MainWindowPersonaggiPersos MainWindow TramaPlot MainWindow TramePlots MainWindow*Popola con nuovi datiPopulates with empty data MainWindowAvanzamentoProgress MainWindow:Schema ad albero del progetto Project tree MainWindowNProgetto {} caricato con alcuni errori.#Project {} loaded with some errors. MainWindowNProgetto {} caricato con alcuni errori:#Project {} loaded with some errors: MainWindow*Progetto {} caricato.Project {} loaded. MainWindow(Progetto {} salvato.Project {} saved. MainWindow^Rimuovi il passaggio(i) di trama selezionato(i)Remove selected plot step(s) MainWindow&Passaggi risolutiviResolution steps MainWindow EsitoResult MainWindowI&mpostazioni S&ettings MainWindowSal&va come... Sa&ve as... MainWindowRice&rcaSea&rch MainWindow SerieSeries MainWindowSituazione: Situation: MainWindow$Fonte di conflittoSource of conflict MainWindow"Fonte di passioneSource of passion MainWindow$Di&vidi al cursoreSp&lit at cursor MainWindow*Sviluppo della storia Story line MainWindow A&pice Su&perscript MainWindowP&edice Subsc&ript MainWindowSottotitoloSubtitle MainWindowRiassuntoSummary MainWindowRiassunto:Summary: MainWindownPrenditi il tempo per pensare ad una frase riassuntiva (~50 parole) del tuo libro. Poi espandila ad un paragrafo, poi ad una pagina, poi ad un riassunto completo.Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. MainWindow TestoText MainWindow Colore del testo Text color MainWindow~La situazione iniziale, in forma di domanda tipo 'Cosa succede se...?'. Es: 'Cosa succede se il pericoloso mago cattivo non riesce ad uccidere un bambino?' (Harry Potter)The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) MainWindowjIl file {} non esiste. stato spostato o cancellato?9The file {} does not exist. Has it been moved or deleted? MainWindow TitoloTitle MainWindow AlberoTree MainWindowVolume MainWindowHATTENZIONE: Progetto {} non salvato.WARNING: Project {} not saved. MainWindow&Cosa succede se...? What if...? MainWindowParole: {}{} Words: {}{} MainWindowAmbientazioneWorld MainWindowScrivi.Write. MainWindowF{} non vi sono dizionari installati {} has no installed dictionaries MainWindow*{}{} non installato{}{} is not installed MainWindow pxSettings%Settings&Nuovo stile &New styleSettings&Niente&NothingSettings0&Mostra conteggio parole&Show word countSettings1.5 linee 1.5 linesSettingsd<html><head/><body><p>Se spunti questa opzione, il progetto sar salvato come singolo file. Sar pi facile la copia o il backup, ma non consentir l' editing collaborativo, o il versionning.<br/>Se non la spunti, il progetto sar salvato come una cartella contenente molti piccoli files.</p></body></html>

If you check this option, your project will be save as one single file. Easier to copy or backup, but does not allow collaborative editing, or versionning.
If this is unchecked, your project will be save as a folder containing many small files.

SettingsAllineamento AlignmentSettingsAllineamento: Alignment:Settings<Impostazioni dell'applicazioneApplication settingsSettingsApplicaApplySettingsdCarica automaticamente l'ultimo progetto all'avvio*Automatically load last project on startupSettings4Salva automaticamente ogniAutomatically save everySettings Sfondo BackgroundSettings(Colore dello sfondo:Background color:SettingsSfondo: Background:Settings"Colore del bordo: Border color:SettingsAnnullaCancelSettings CentroCenterSettingsCentratoCenteredSettingsColore:Color:Settings ColoriColorsSettingsCompilatoCompileSettings&Colore dell'angolo: Corner color:Settings&Raggio dell'angolo:Corner radius:SettingsCtrl+SSettingsCursoreCursorSettingsCancellaDeleteSettings8Disabilita il lampeggiamentoDisable blinkingSettings DoppioDoubleSettingsModificaEditSettingsFamiglia:Family:Settings2Modalit di messa a fuoco Focus modeSettingsCartelleFoldersSettingsFontSettings(Dimensione dei font: Font size:SettingsFont:SettingsSchermo intero FullscreenSettingsGeneraleGeneralSettings*Impostazioni generaliGeneral settingsSettingsObiettivoGoalSettings*Dimensione dell'icona Icon SizeSettings$Colore dell'icona: Icon color:SettingsDSe non ci sono cambiamenti duranteIf no changes duringSettingsImmagine:Image:Settings&Indenta la 1a lineaIndent 1st lineSettings Schede Index cardsSettings*Colori degli elementi Item colorsSettingsGiustificaJustifySettings*Mantieni le revisioniKeep revisionsSettingsMantieni:Keep:SettingsEtichettaLabelSettingsEtichetteLabelsSettingsLingua: Language:SettingsSinistraLeftSettingsMargini sx/dx:Left/Right margins:Settings LineaLineSettingsInterlinea: Line spacing:SettingsCaricamentoLoadingSettingsMargini:Margins:Settings"Larghezza massima Max widthSettings*Errori di ortografia: Misspelled:Settings NuovoNewSettings Nessuna immagineNo ImageSettingsNessunoNoneSettings NienteNothingSettingsVecchio st&ile Old st&yleSettingsOpacit:Opacity:Settings Quadro d'insiemeOutlineSettingsPOVSettingsRiempimento:Padding:SettingsParagrafo ParagraphSettings*Opzioni del paragrafoParagraph OptionsSettingsParagrafi ParagraphsSettingsPercentuale PercentageSettingsPosizione: Position:SettingsAvanzamentoProgressSettingsProporzionale ProportionalSettingsRiavvia Manuskript per essere certo che le impostazioni abbiano effetto.7Restarting Manuskript ensures all settings take effect.Settings:Ripristina opzioni di defaultRestore defaultsSettingsRevisioni RevisionsSettingsLe revisioni sono un modo per tenere traccia delle modifiche. Per ogni elemento di testo, memorizza tutte le modifiche apportate al testo principale, consentendo di vedere e ripristinare le versioni precedenti.Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions.Settings DestraRightSettings&Mo&stra avanzamentoS&how progressSettings.Ri&mozione intelligente S&mart removeSettings Salva all'uscita Save on quitSettings.Salva come singolo fileSave to one single fileSettingsSalvataggioSavingSettingsScalatoScaledSettings FraseSentenceSettingsImpostazioniSettingsSettings0Mostra &conteggio paroleShow &word countSettings4Mostra conteggio ele&mentiShow ite&m countSettings&Most&ra avanzamentoShow p&rogressSettings"Mostra riass&unto Show summar&ySettings&Mostra il riassunto Show summarySettingsSingoloSingleSettingsDimensione:Size:Settings\La rimozione intelligente consente di mantenere solo un certo numero di revisioni. Si raccomanda di usarla, per evitare di memorizzare migliaia di cambiamenti insignificanti.Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes.SettingsSpaziatura:Spacing:Settings StatoStatusSettingsStirato StretchedSettings StileStyleSettings Stile:Style:SettingsLarghezza Tab: Tab width:Settings TestoTextSettings Sfondo del testoText BackgroundSettings"Opzioni del testo Text OptionsSettingsArea del testo Text areaSettings"Colore del testo: Text color:SettingsEditor di testo Text editorSettings$Etichetta di testo TextLabelSettingsNome del tema: Theme name:SettingsPiastrellatoTiledSettings TitoloTitleSettings Margini sup/inf:Top/Bottom margins:SettingsTrasparente TransparentSettings AlberoTreeSettings Tipo:Type:Settings@Suono della macchina da scrivereTypewriter modeSettings:Usa un blocco d'inserzione diUse block insertion ofSettingsVisualizzazioniViewsSettings>Impostazioni di visualizzazioneViews settingsSettings Colonne visibiliVisible columnsSettingsLarghezza:Width:Settings*Sfondo della finestraWindow BackgroundSettings Conteggio parole Word countSettingsZoomatoZoomedSettingsminuti.minutes.SettingsRrevisioni ogni 10 minuti per l'ultima ora*revisions per 10 minutes for the last hourSettingsJrevisioni al giorno per l'ultimo mese$revisions per day for the last monthSettingsJrevisioni all'ora per l'ultimo giorno#revisions per hour for the last daySettingsXrevisioni al minuto per gli ultimi 10 minuti,revisions per minute for the last 10 minutesSettingsbrevisioni alla settimana fino alla fine dei tempi'revisions per week till the end of timeSettingssecondi.seconds.Settings.&Aggiungi al dizionario&Add to dictionary SpellActionB&Rimuovi dal dizionario personale&Remove from custom dictionary SpellAction0Suggerimenti ortograficiSpelling Suggestions SpellAction2A proposito di ManuskriptAbout Manuskriptabout Manuskriptabout:Versione del software in uso:Software Versions in Use: aboutDialogVersioneVersion aboutDialogCompilaCompile abstractModelObiettivoGoal abstractModelEtichettaLabel abstractModelPOV abstractModel StatoStatus abstractModel TitoloTitle abstractModel Conteggio parole Word count abstractModel0Traduzione caricata: {}.Loaded translation from {}: {}.appNota: nessun traduttore trovato o caricato da {} per la lingua {}.:Note: No translator found or loaded from {} for locale {}.app2Riassunto un poche frasi:Few sentences summary: basicItemView ModuloForm basicItemViewObiettivo:Goal: basicItemView*Riassunto in una rigaOne line summary basicItemViewPOV: basicItemView Conteggio parole Word count basicItemViewNomeNamecharacterModel"Nuovo personaggio New charactercharacterModel ValoreValuecharacterModelPrincipaleMaincharacterTreeView MinoreMinorcharacterTreeViewSecondario SecondarycharacterTreeViewPersonaggi Characters cheatSheettFiltro (digita il nome di qualsiasi cosa nel tuo progetto)2Filter (type the name of anything in your project) cheatSheet ModuloForm cheatSheetPrincipaleMain cheatSheet MinoreMinor cheatSheet TramePlots cheatSheetSecondario Secondary cheatSheet TestiTexts cheatSheetAmbientazioneWorld cheatSheetPrincipaleMaincmbOutlineCharacterChoser MinoreMinorcmbOutlineCharacterChoserNessunoNonecmbOutlineCharacterChoserSecondario SecondarycmbOutlineCharacterChoserVariVariouscmbOutlineCharacterChoserVariVariouscmbOutlineLabelChoserVariVariouscmbOutlineStatusChoserDBarra degli strumenti Dock WidgetsDock Widgets ToolbarcollapsibleDockWidgets ModuloForm completer$Riassunto completo Full summary corkDelegate*Riassunto in una rigaOne line summary corkDelegate ModuloFormeditorWidget_uiEsportaExportexporterEsporta come: Export to:exporter0Gestisci gli esportatoriManage exportersexporterAnteprimaPreviewexporterImpostazioniSettingsexporter8{} (non ancora implementato){} (not implemented yet)exporterDialogh<html><head/><body><p>Filtra gli elementi da includere nell'esportazione finale.<br/><span style=" color:#773333;">(Non ancora implementato completamente.)</span></p></body></html>

Filters what items will be included in the final export.
(Not fully implemented yet.)

exporterSettings*Tra cartella e testo:Between folder and text:exporterSettingsTra cartelle:Between folders:exporterSettings*Tra testo e cartella:Between text and folder:exporterSettingsTra i testi:Between texts:exporterSettingsContenutoContentexporterSettingsPersonalizzatoCustomexporterSettings8Sostituzioni personalizzate:Custom replacements:exporterSettingsnDecidi qui cosa verr incluso nell'esportazione finale.6Decide here what will be included in the final export.exporterSettingsRiga vuota Empty lineexporterSettingsAbilitatoEnabledexporterSettingsFi&ltriFi<ersexporterSettingsCartellaFolderexporterSettingsFontexporterSettings(Dimensione del font: Font size:exporterSettingsFont:exporterSettings ModuloFormexporterSettings@Ho bisogno di maggiore dettaglioI need more granularityexporterSettingsSe selezionato, usa l'espressione regolare per la sostituzione. Se deselezionato, sostituito come testo piano.ZIf checked, uses regular expression for replacement. If unchecked, replaced as plain text.exporterSettingsxIgnora la spunta su 'compilato' (includi tutti gli elementi))Ignore compile status (include all items)exporterSettingsEtichetteLabelsexporterSettingsAnteprimaPreviewexporterSettingsRegExpexporterSettings4Rimuovi gli spazi multipliRemove multiple spacesexporterSettingsSostituisciReplaceexporterSettings*Sostituisci --- con Replace --- with —exporterSettings*Sostituisci ... con &Replace ... with …exporterSettingsRSostituisci le doppie virgolette (") con:Replace double quotes (") with:exporterSettingsTSostituisci le singole virgolette (') con:Replace single quotes (') with:exporterSettingsSeparazioni SeparationsexporterSettings StatoStatusexporterSettings"Sottoelemento di: Subitems of:exporterSettings TestoTextexporterSettings TitoloTitleexporterSettingsTrasformazioniTransformationsexporterSettingsTipoTypeexporterSettings4Sostituzioni tipografiche:Typographic replacements:exporterSettingsConWithexporterSettings*{}Livello {} cartella{}Level {} folderexporterSettings${}Livello {} testo{}Level {} textexporterSettings"<b>Richiede:</b> Requires: exportersManager:<b>Stato:</b> non installato.Status: uninstalled.exportersManagerPersonalizzatoCustomexportersManagerInstallato InstalledexportersManagerNon trovato Not foundexportersManagerNImposta {} il percorso dell'eseguibile.Set {} executable path.exportersManager|{} non trovato. Installalo, o imposta il percorso manualmente./{} not found. Install it, or set path manually.exportersManagerFrequenza FrequencyfrequencyAnalyzer FrasiPhrasesfrequencyAnalyzer ParolaWordfrequencyAnalyzerOrologioClockfullScreenEditor4Orologio: mostra i secondiClock: Show SecondsfullScreenEditorNavigazione NavigationfullScreenEditorNuovo testoNew TextfullScreenEditorAvanzamentoProgressfullScreenEditorXAvanzamento: mostra/nascondi automaticamenteProgress: Auto Show/HidefullScreenEditor*Controllo ortografico SpellcheckfullScreenEditor$Selettore del temaTheme selectorfullScreenEditor Tema:Theme:fullScreenEditor TitoloTitlefullScreenEditorFTitolo: Mostra il percorso completoTitle: Show Full PathfullScreenEditor Conteggio parole Word countfullScreenEditor{} parole{} wordsfullScreenEditor{} parole / {} {} words / {}fullScreenEditorGeneraleGeneralgeneralSettingsXImporta in una cartella di livello superioreImport in a top-level foldergeneralSettingsImporta sotto: Import under:generalSettings&Dividi le scene in:Split scenes at:generalSettingsNTaglia i titoli lunghi (> 32 caratteri)Trim long titles (> 32 chars)generalSettings\n---\ngeneralSettingsjSe non vuoi vedermi, puoi nascondermi nel menu Guida.8If you don't wanna see me, you can hide me in Help menu. helpLabelScegli file Choose fileimporterCancella file Clear fileimporterFormato:Format:importerImportaImportimporterAnteprimaPreviewimporterImpostazioniSettingsimporterjL'ultima directory accessibile "{}" stata caricata.$Last accessed directory "{}" loaded.lastAccessedDirectoryInfoVariVarious lineEditView minuti minuteslocker parole wordslocker ModuloFormlockerBlocca !Lock !lockerBlocca schermo: Lock screen:locker$Obiettivo di tempo Time targetlocker&Obiettivo di parole Word targetlocker{} rimanenti {} remaininglocker{} sec.{} s.locker&{} parole rimanenti{} words remaininglocker{}:{}locker~{} h.locker~{} min.~{} mn.lockerAlt+Up mainEditorF11 mainEditor ModuloForm mainEditor,Vai all'elemento padreGo to parent item mainEditor Schede Index cards mainEditor Quadro d'insiemeOutline mainEditor RadiceRoot mainEditor TestoText mainEditor{} parole  {} words  mainEditor{} parole / {} {} words / {}  mainEditorMarkdownmarkdownSettings ModuloForm metadataView$Riassunto completo Full summary metadataView$Note / RiferimentiNotes / References metadataView*Riassunto in una rigaOne line summary metadataViewPropriet Properties metadataViewRevisioni Revisions metadataViewRiassuntoSummary metadataView0Nascondi automaticamente Auto-hidemyPanel &Copia&Copy outlineBasics&Cancella&Delete outlineBasics&Incolla&Paste outlineBasics&Rinomina&Rename outlineBasics<p><b>Sei in procinto di rimuovere {} oggetto(i).</b></p><p>Sei sicuro?</p>D

You're about to delete {} item(s).

Are you sure?

 outlineBasics0In procinto di rimuovereAbout to remove outlineBasicsTutti gli elementi devono essere sullo stesso livello (condividere lo stesso genitore).Riferimento sconosciuto:</b> {}.Unknown reference: {}. references(Informazioni di base Basic info references,Personaggio: <b>{}</b>Character: {} referencesPersonaggi Characters referencesConflittoConflict referencesDescrizione Description references0Informazioni dettagliate Detailed info referencesEpifaniaEpiphany references&Cartella: <b>{}</b>Folder: {} referencesVai a {}. Go to {}. referencesObiettivoGoal referencesEtichetta:Label: references"Riassunto esteso: Long summary: references Riassunto estesoLonger summary referencesMotivazione Motivation references2Non un riferimento: {}.Not a reference: {}. references Note:Notes: referencesPOV di:POV of: referencesPOV: referencesPassionePassion referencesPercorso:Path: references Trama: <b>{}</b>Plot: {} referencesRiferimento in:Referenced in: references&Passaggi risolutiviResolution steps references EsitoResult referencesRiassunto breve Short summary references Riassunto breve:Short summary: referencesStatistiche:Stats: references Stato:Status: references Testo: <b>{}</b>Text: {} references8Riferimento sconosciuto: {}.Unknown reference: {}. references<Mondo: <b>{nome}</b>{percorso}World: {name}{path} references1 giorno fa 1 day ago revisionsCancella tutto Clear all revisionsCancellaDelete revisions ModuloForm revisionsRiga {}:Line {}: revisionsOpzioniOptions revisionsRipristinaRestore revisions4Mostra la vecchia versioneShow ancient version revisions Mostra modificheShow modifications revisions0Mostra solo le modificheShow modifications only revisionsMostra spazi Show spaces revisions{} giorni fa {} days ago revisions{} ore fa {} hours ago revisions{} minuti fa{} minutes ago revisions{} mesi fa {} months ago revisions{} secondi fa{} seconds ago revisions{} anni fa {} years ago revisions TuttoAllsearch>Tiene conto del maiusc / minuscCase sensitivesearch ModuloFormsearchEtichettaLabelsearchNoteNotessearchOpzioni:Options:searchPOVsearchCerca... Search for...searchCerca in: Search in:search StatoStatussearchRiassuntoSummarysearch TestoTextsearch TitoloTitlesearch (sola lettura) (read-only)settingsWindow ErroreErrorsettingsWindowPFiles di immagine (*.jpg; *.jpeg; *.png)"Image files (*.jpg; *.jpeg; *.png)settingsWindowNuova etichetta New labelsettingsWindowNuovo stato New statussettingsWindowNuovo tema New themesettingsWindowApri immagine Open ImagesettingsWindowbImpossibile aggiungere l'immagine selezionata: {} Unable to add selected image: {}settingsWindowPImpossibile caricare il file selezionatoUnable to load selected filesettingsWindownuovo temanewthemesettingsWindow ModuloForm sldImportancePrincipaleMain sldImportance MinoreMinor sldImportanceSecondario Secondary sldImportance$Etichetta di testo TextLabel sldImportance4 <p>Dividi l'elemento(i) selezionato nel punto indicato.</p> <p>Se uno degli oggetti selezionati una cartella, sar applicato ricorsivamente a <i>tutti</i> gli elementi figli.</p> <p>Il punto di divisione pu contenere le seguenti sequenze di fuga: <ul> <li><b><code>\n</code></b>: interruzione di linea</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> 

Split selected item(s) at the given mark.

If one of the selected item is a folder, it will be applied recursively to all of it's children items.

The split mark can contain following escape sequences:

  • \n: line break
  • \t: tab

Mark:

 splitDialogDividi '{}' Split '{}' splitDialogDividi elementi Split items splitDialog ModuloForm storylineView&Mostra i personaggiShow Characters storylineViewMostra le trame Show Plots storylineView&Chiudi la divisione Close split tabSplitterdApri gli elementi selezionati in questa schermata.!Open selected items in that view. tabSplitter,Dividi orizzontalmenteSplit horizontally tabSplitter(Dividi verticalmenteSplit vertically tabSplitterVariVarious textEditViewCTRL+B textFormatCTRL+E textFormatCTRL+I textFormatCTRL+J textFormatCTRL+L textFormatCTRL+P textFormatCTRL+R textFormatCTRL+U textFormat ModuloForm textFormatCollassa tutto Collapse AlltreeViewCollassa {} Collapse {}treeViewEspandi tutto Expand AlltreeViewEspandi {} Expand {}treeView1welcomeL<b>Totale:</b> {} parole (~ {} pagine)#Total: {} words (~ {} pages)welcome Aggiungi livello Add levelwelcome2Aggiungi conteggio paroleAdd word countwelcome LibroBookwelcomeCapitoloChapterwelcomeCreaCreatewelcome,Crea un nuovo progettoCreate New Projectwelcome*Progetto dimostrativo Demo projectswelcome VuotoEmptywelcomeNarrativa vuota Empty fictionwelcome Saggistica vuotaEmpty non-fictionwelcomeLetteraturaFictionwelcome$Stesura definitivaFinalwelcomePrima stesura First draftwelcome ModuloFormwelcomeIdeawelcome Manuskriptwelcome<Progetto di Manuskript (*.msk)Manuskript project (*.msk)welcomebProgetto di Manuskript (*.msk);;Tutti i files (*))Manuskript project (*.msk);;All files (*)welcomerLa prossima volta, apri automaticamente l'ultimo progetto*Next time, automatically open last projectwelcomeSaggistica Non-fictionwelcomeNotaNotewelcomeRomanzoNovelwelcomeRomanzo breveNovellawelcome Apri un progetto Open projectwelcomeApri...Open...welcomePSovrascrivere il progetto esistente {} ?Overwrite existing project {} ?welcomeRecenteRecentwelcomeRicercaResearchwelcome(Documento di ricercaResearch paperwelcome2Salva il progetto come...Save project as...welcome ScenaScenewelcomeSeconda stesura Second draftwelcomeSezioneSectionwelcomeRacconto Short StorywelcomeQualcosa SomethingwelcomeTODOwelcomeModelli Templateswelcome TestoTextwelcomeTrilogiaTrilogywelcomeAttenzioneWarningwelcomediofwelcomeparole ognuno. words each.welcomeArchitettura Architecture worldModelAstronomia Astronomy worldModel(Linguaggio del corpoBodily language worldModelCalendarioCalendar worldModel ClimaClimate worldModelCorteggiamento Courtship worldModelCulturaCultural worldModelUsi e costumiCustoms worldModelDemografia Demography worldModelMalattieDiseases worldModelVestiarioDresses worldModelEducazione Education worldModelAspetti eticiEthics worldModelBCostruzione del mondo di fantasiaFantasy world building worldModelFlora worldModelCiboFood worldModelRuoli di genere Gender roles worldModel Forma di governo Government worldModel StoriaHistory worldModel$Oggetti importantiImportant objects worldModel"Luoghi importantiImportant places worldModelLinguaggi Languages worldModel Sistema di magia Magic system worldModelOggetti magiciMagical objects worldModelLuoghi magiciMagical places worldModelRazze magiche Magical races worldModelMedicinaMedicine worldModelForze armateMilitary worldModelMusica e artiMusic and arts worldModel Risorse naturaliNatural resources worldModelNuovo elementoNew item worldModelOrganizzazione Organization worldModel FisicaPhysical worldModelPoliticaPolitics worldModel RazzeRaces worldModelReligioneReligion worldModel RegoleRules worldModel,Conoscenze scentificheScience worldModelTecnologia Technology worldModelTopografia Topography worldModel$Mezzi di trasportoTransportation worldModel"Ambiente naturale Wild life worldModelmanuskript-0.10.0/i18n/manuskript_it.ts000066400000000000000000005502751354442177200200340ustar00rootroot00000000000000 Export Basic HTML output using the Python module 'markdown'. Output HTML di base che utilizza il modulo Python 'markdown'. Python module 'markdown'. modulo Python 'markdown'. Markdown source Sorgente Markdown HTML Source Sorgente HTML HTML Output Output HTML Default exporter, provides basic formats used by other exporters. Exporter predefinito, fornisce formati di base usati da altri exporter. Preview with highlighter. Anteprima con evidenziatore. Plain text Testo normale A little known format modestly used. You know, web sites for example. Un formato poco conosciuto usato raramente. Ad esempio, da siti web. Needs LaTeX to be installed. È necessario installare LaTeX. Error Errore Standalone document (not just a fragment) Documento autonomo (non solo un frammento) Include a table of contents. Include un sommario. Number of sections level to include in TOC: Numero di sezioni da includere nel sommario: Typographically correct output Output tipograficamente corretto Normalize the document (cleaner) Normalizza il documento (pulitore) Specify the base level for headers: Specifica il livello di base per le intestazioni: Use reference-style links instead of inline links Usa links di stile di riferimento anziché links in linea Use ATX-style headers Usa intestazioni in stile ATX Use <q> tags for quotes in HTML Usa <q> tags per le virgolette in HTML LaTeX engine used to produce the PDF. Motore LaTeX usato per produrre PDF. Paper size: Dimensione del foglio: Font size: Dimensione del font: Class: Classe: Line spacing: Interlinea: Books that don't kill trees. Libri per i quali non serve abbattere gli alberi. OpenDocument format. Used by LibreOffice for example. Formato OpenDocument. Usato da LibreOffice per esempio. Microsoft Office (.docx) document. Documento Microsoft Office (.docx). reStructuredText is a lightweight markup language. reStructuredText è un leggero linguaggio markup. Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. Proprio come il testo piano, eccetto per l'aggiunta di titoli markdown. Presuppone che i testi siano formattati in markdown. Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. La più semplice esportazione in testo piano. Ti permette di usare il tuo markup non riconosciuto da Manuskript, per esempio <a href='www.fountain.io'>Fountain</a>. <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> <p>Un convertitore di documenti universale. Può essere usato per convertire Markdown in una vasta gamma di altri formati.</p> <p>Sito web: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. una installazione LaTeX valida. Le raccomandazioni su Pandoc possono essere trovate su: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. Se vuoi il supporto a Unicode, hai bisogno di XeLaTeX. Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. Esporta in markdown, usando pandoc. Permette maggiori opzioni di formattazione rispetto all'esportatore predefinito di Manuskript. LaTeX is a word processor and document markup language used to create beautiful documents. LaTeX è un word processor ed un linguaggio markup usato per creare bellissimi documenti. The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. Lo scopo di questo formato è di fornire un modo per scambiare informazioni tra outliner e servizi Internet che possono essere sfogliati o controllati attraverso un outliner. Disable YAML metadata block. Use that if you get YAML related error. Disabilita il blocco dei metadati YAML. Usalo se ottieni un errore relativo a YAML. Convert to ePUB3 Converti in formato ePUB3 Self-contained HTML files, with no dependencies Files HTML autosufficienti, non servono dipendenze Could not process regular expression: {} Errore durante l'elaborazione dell'espressione regolare: {} Choose output file… Scegli il file di output ExportersManager Manage Exporters Gestisci gli esportatori Manuskript Description Descrizione Offers export to Offre esportazione verso Status Stato Status: Stato: Version: Versione: Path: Percorso: ... {HelpText} {Testo guida} FrequencyAnalyzer Frequency Analyzer Analizzatore di frequenza Word frequency Frequenza della parola Settings Impostazioni Minimum size: Dimensione minima: Exclude words (comma separated): Escludi parole (separate da una virgola): Analyze Analizza Phrase frequency Frequenza della frase Number of words: from Numero di parole: da to a Import Markdown import Importa file in Markdown <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; <b>Info:</b> Un semplice parser che passerà attraverso un documento markdown e creerà un oggetto per ogni titolo.<br/>&nbsp; Folder import Importa cartella <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> <p><b>Info:</b> Importa l'intera struttura di una directory. Le cartelle sono aggiunte come cartelle, e i documenti di testo al loro interno (scegli tu quali in base all'estensione) sono aggiunti come scene.</p> <p>Sono supportati solo i files di testo (non immagini, binari o altro).</p> Include only those extensions: Includi solo queste estensioni: Comma separated values Valori separati da virgole Sort items by name Ordina gli oggetti per nome Import folder then files Importa la cartella e poi i files OPML Import Importa OPML File open failed. Apertura del file fallita. This does not appear to be a valid OPML file. Questo non sembra essere un file OPML valido. Pandoc import Importa Pandoc <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; <b>Info:</b> Manuskript può importare da <b>markdown</b> o <b>OPML</b>. Pandoc convertirà i documenti in entrambi (vedi le opzioni in basso), e poi li importerà in Manuskript. L'uno o l'altro potrebbe dare risultati migliori a seconda del documento. <br/>&nbsp; Import using: Importa usando: Wrap lines: Linee a capo: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> <p>Pandoc deve creare delle cosmetiche / non-semantiche interruzioni di linea?</p><p> <b>auto</b>: a capo a 72 caratteri.<br> <b>nessuno</b>: nessuna interruzione.<br> <b>preserva</b>: tenta di preservare le interruzioni di linea del documento originale.</p> Mind Map Import Importa mappa mentale This does not appear to be a valid Mind Map file. Questo non sembra essere un file di mappa mentale valido. Mind Map import Importa mappa mentale Import tip as: Importa tip come: Untitled Senza titolo MDEditCompleter Insert reference Inserisci riferimento MainWindow General Generale Title Titolo Subtitle Sottotitolo Series Serie Volume Genre Genere License Licenza Author Autore Name Nome Email Summary Riassunto Situation: Situazione: Summary: Riassunto: One sentence Una frase One paragraph Un paragrafo One page Una pagina Full Completo One sentence summary Riassunto in una frase One paragraph summary Riassunto in un paragrafo Expand each sentence of your one paragraph summary to a paragraph Espandi ogni frase del riassunto in un paragrafo in un nuovo paragrafo One page summary Riassunto in una pagina Full summary Riassunto completo Next Avanti What if...? Cosa succede se...? Characters Personaggi Names Nomi Filter Filtro Basic info Informazioni di base Importance Importanza Motivation Motivazione Goal Obiettivo Conflict Conflitto Epiphany Epifania <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="right">Una frase<br/>riassunto</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> <html><head/><body><p align="right">Un paragrafo<br/>riassunto</p></body></html> Notes Note Detailed info Informazioni dettagliate Plots Trame Plot Trama Character(s) Personaggio(i) Description Descrizione Result Esito Resolution steps Passaggi risolutivi World Ambientazione Populates with empty data Popola con nuovi dati More Di più Source of passion Fonte di passione Source of conflict Fonte di conflitto Outline Quadro d'insieme Editor Editor di testo Debug Messa a punto FlatData Dati grezzi Persos Personaggi Labels Etichette &File &Recent &Recente &Help &Guida &Tools &Strumenti &Edit &Modifica &View &Visualizza &Mode &Modalità &Cheat sheet &Promemoria Sea&rch Rice&rca &Navigation &Navigazione &Open &Apri Ctrl+O &Save &Salva Ctrl+S Sa&ve as... Sal&va come... Ctrl+Shift+S &Quit &Esci Ctrl+Q &Show help texts &Mostra la guida Ctrl+Shift+B &Spellcheck &Controllo ortografico F9 &Labels... &Etichette... &Status... &Stato... Tree Albero &Simple &Semplice &Fiction &Narrativa Index cards Schede S&ettings I&mpostazioni F8 &Close project &Chiudi progetto Co&mpile Co&mpila per esportazione F6 &Frequency Analyzer &Analizzatore di frequenza Book information Ragguagli sul libro &About &A proposito About Manuskript A proposito di Manuskript Manuskript Project {} saved. Progetto {} salvato. WARNING: Project {} not saved. ATTENZIONE: Progetto {} non salvato. Project {} loaded. Progetto {} caricato. Project {} loaded with some errors: Progetto {} caricato con alcuni errori: * {} wasn't found in project file. * {} non trovato nel file di progetto. Project {} loaded with some errors. Progetto {} caricato con alcuni errori. (~{} pages) (~{} pagine) Words: {}{} Parole: {}{} Book summary Riassunto del libro Project tree Schema ad albero del progetto Metadata Metadati Story line Sviluppo della storia Enter information about your book, and yourself. Inserisci informazioni sul tuo libro, e su di te. The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) La situazione iniziale, in forma di domanda tipo 'Cosa succede se...?'. Es: 'Cosa succede se il pericoloso mago cattivo non riesce ad uccidere un bambino?' (Harry Potter) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Prenditi il tempo per pensare ad una frase riassuntiva (~50 parole) del tuo libro. Poi espandila ad un paragrafo, poi ad una pagina, poi ad un riassunto completo. Create your characters. Crea i tuoi personaggi. Develop plots. Sviluppa le trame. Build worlds. Create hierarchy of broad categories down to specific details. Costruisci i mondi. Crea una gerarchia di ampie categorie fino ad arrivare ai dettagli specifici. Create the outline of your masterpiece. Crea il contorno del tuo capolavoro. Write. Scrivi. Debug info. Sometimes useful. Informazioni di debug. A volte possono essere utili. Dictionary Dizionario Nothing Niente POV Label Etichetta Progress Avanzamento Compile Compilato Icon color Colore dell'icona Text color Colore del testo Background color Colore dello sfondo Icon Icona Text Testo Background Sfondo Border Bordo Corner Angolo Add plot step Aggiungi un passaggio alla trama &Import… &Importa… F7 &Copy &Copia Ctrl+C C&ut T&aglia Ctrl+X &Paste &Incolla Ctrl+V &Split… &Dividi… Ctrl+Shift+K Sp&lit at cursor Di&vidi al cursore Ctrl+K Ctrl+M Ctrl+D Del Canc &Move Up &Sposta in alto Ctrl+Shift+Up Ctrl+Shift+Freccia su M&ove Down Sp&osta in basso Ctrl+Shift+Down Ctrl+Shift+Freccia giù Dupl&icate Dupl&ica &Delete &Cancella &Rename &Rinomina F2 Organi&ze Organi&zza M&erge U&nisci Remove selected plot step(s) Rimuovi il passaggio(i) di trama selezionato(i) &Format &Formato &Header &Intestazione &Level 1 (setext) &Livello 1 (setext) Ctrl+Alt+1 Ctrl+Alt+1 Level &2 Livello &2 Ctrl+Alt+2 Ctrl+Alt+2 Level &1 (atx) Livello &1 (atx) Ctrl+1 Ctrl+1 L&evel 2 L&ivello 2 Ctrl+2 Ctrl+2 Level &3 Livello &3 Ctrl+3 Ctrl+3 Level &4 Livello &4 Ctrl+4 Ctrl+4 Level &5 Livello &5 Ctrl+5 Ctrl+5 Level &6 Livello &6 Ctrl+6 Ctrl+6 &Bold &Grassetto Ctrl+B Ctrl+B &Italic &Corsivo Ctrl+I Ctrl+I &Strike &Barrato &Verbatim &Parola per parola Su&perscript A&pice Ctrl++ Ctrl++ Subsc&ript P&edice Ctrl+- Ctrl+- Co&mment block Blocco di co&mmenti Ctrl+Shift+C Ctrl+Shift+C Clear &formats Cancella i &formati Ctrl+0 Ctrl+0 &Comment line(s) Linea(e) di &commento &Ordered list &Elenco numerato &Unordered list &Elenco puntato B&lockquote Citazione (b&locco) The file {} does not exist. Has it been moved or deleted? Il file {} non esiste. È stato spostato o cancellato? Install {}{} to use spellcheck Installa {}{} per usare il correttore ortografico {} has no installed dictionaries {} non vi sono dizionari installati {}{} is not installed {}{} non è installato Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings Settings Impostazioni General Generale Revisions Revisioni Views Visualizzazioni Labels Etichette Status Stato Fullscreen Schermo intero General settings Impostazioni generali Application settings Impostazioni dell'applicazione Loading Caricamento Automatically load last project on startup Carica automaticamente l'ultimo progetto all'avvio Saving Salvataggio Automatically save every Salva automaticamente ogni minutes. minuti. If no changes during Se non ci sono cambiamenti durante seconds. secondi. Save on project close Salva all'uscita <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> <html><head/><body><p>Se spunti questa opzione, il progetto sarà salvato come singolo file. Sarà più facile la copia o il backup, ma non consentirà l' editing collaborativo, o il versionning.<br/>Se non la spunti, il progetto sarà salvato come una cartella contenente molti piccoli files.</p></body></html> Save to one single file Salva come singolo file Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. Le revisioni sono un modo per tenere traccia delle modifiche. Per ogni elemento di testo, memorizza tutte le modifiche apportate al testo principale, consentendo di vedere e ripristinare le versioni precedenti. Keep revisions Mantieni le revisioni S&mart remove Ri&mozione intelligente Keep: Mantieni: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. La rimozione intelligente consente di mantenere solo un certo numero di revisioni. Si raccomanda di usarla, per evitare di memorizzare migliaia di cambiamenti insignificanti. revisions per day for the last month revisioni al giorno per l'ultimo mese revisions per minute for the last 10 minutes revisioni al minuto per gli ultimi 10 minuti revisions per hour for the last day revisioni all'ora per l'ultimo giorno revisions per 10 minutes for the last hour revisioni ogni 10 minuti per l'ultima ora revisions per week till the end of time revisioni alla settimana fino alla fine dei tempi Views settings Impostazioni di visualizzazione Tree Albero Colors Colori Icon color: Colore dell'icona: Nothing Niente POV Label Etichetta Progress Avanzamento Compile Compilato Text color: Colore del testo: Background color: Colore dello sfondo: Folders Cartelle Show ite&m count Mostra conteggio ele&menti Show summary Mostra il riassunto &Nothing &Niente Text Testo Outline Quadro d'insieme Visible columns Colonne visibili Goal Obiettivo Word count Conteggio parole Percentage Percentuale Title Titolo Index cards Schede Item colors Colori degli elementi Border color: Colore del bordo: Corner color: Colore dell'angolo: Background Sfondo Color: Colore: Ctrl+S Image: Immagine: Text editor Editor di testo Font Family: Famiglia: Size: Dimensione: Misspelled: Errori di ortografia: Background: Sfondo: Paragraphs Paragrafi Line spacing: Interlinea: Single Singolo 1.5 lines 1.5 linee Double Doppio Proportional Proporzionale % Tab width: Larghezza Tab: px Indent 1st line Indenta la 1a linea Spacing: Spaziatura: New Nuovo Edit Modifica Delete Cancella Theme name: Nome del tema: Apply Applica Cancel Annulla Window Background Sfondo della finestra Text Background Sfondo del testo Text Options Opzioni del testo Paragraph Options Opzioni del paragrafo Type: Tipo: No Image Nessuna immagine Tiled Piastrellato Centered Centrato Stretched Stirato Scaled Scalato Zoomed Zoomato Opacity: Opacità: Position: Posizione: Left Sinistra Center Centro Right Destra Width: Larghezza: Corner radius: Raggio dell'angolo: Margins: Margini: Padding: Riempimento: Font: Style Stile Cursor Cursore Use block insertion of Usa un blocco d'inserzione di Alignment: Allineamento: Justify Giustifica Alignment Allineamento Icon Size Dimensione dell'icona TextLabel Etichetta di testo Disable blinking Disabilita il lampeggiamento Text area Area del testo Max width Larghezza massima Left/Right margins: Margini sx/dx: Top/Bottom margins: Margini sup/inf: S&how progress Mo&stra avanzamento Show summar&y Mostra riass&unto Show p&rogress Most&ra avanzamento Old st&yle Vecchio st&ile Transparent Trasparente Restore defaults Ripristina opzioni di default Style: Stile: Language: Lingua: Font size: Dimensione dei font: Restarting Manuskript ensures all settings take effect. Riavvia Manuskript per essere certo che le impostazioni abbiano effetto. Show &word count Mostra &conteggio parole &Show word count &Mostra conteggio parole &New style &Nuovo stile Typewriter mode Suono della macchina da scrivere Focus mode Modalità di messa a fuoco None Nessuno Sentence Frase Line Linea Paragraph Paragrafo <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions Suggerimenti ortografici &Add to dictionary &Aggiungi al dizionario &Remove from custom dictionary &Rimuovi dal dizionario personale about About Manuskript A proposito di Manuskript Manuskript aboutDialog Version Versione Software Versions in Use: Versione del software in uso: abstractModel Title Titolo POV Label Etichetta Status Stato Compile Compila Word count Conteggio parole Goal Obiettivo basicItemView Form Modulo POV: Goal: Obiettivo: Word count Conteggio parole One line summary Riassunto in una riga Few sentences summary: Riassunto un poche frasi: characterModel New character Nuovo personaggio Name Nome Value Valore characterTreeView Main Principale Secondary Secondario Minor Minore cheatSheet Form Modulo Filter (type the name of anything in your project) Filtro (digita il nome di qualsiasi cosa nel tuo progetto) Minor Minore Secondary Secondario Main Principale Characters Personaggi Texts Testi Plots Trame World Ambientazione cmbOutlineCharacterChoser None Nessuno Main Principale Secondary Secondario Minor Minore Various Vari cmbOutlineLabelChoser Various Vari cmbOutlineStatusChoser Various Vari collapsibleDockWidgets Dock Widgets Toolbar Barra degli strumenti Dock Widgets completer Form Modulo corkDelegate One line summary Riassunto in una riga Full summary Riassunto completo editorWidget_ui Form Modulo exporter Export Esporta Export to: Esporta come: Manage exporters Gestisci gli esportatori Preview Anteprima Settings Impostazioni exporterDialog {} (not implemented yet) {} (non ancora implementato) exporterSettings Form Modulo Content Contenuto Decide here what will be included in the final export. Decidi qui cosa verrà incluso nell'esportazione finale. Type Tipo Title Titolo Text Testo I need more granularity Ho bisogno di maggiore dettaglio Fi&lters Fi&ltri <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> <html><head/><body><p>Filtra gli elementi da includere nell'esportazione finale.<br/><span style=" color:#773333;">(Non ancora implementato completamente.)</span></p></body></html> Ignore compile status (include all items) Ignora la spunta su 'compilato' (includi tutti gli elementi) Subitems of: Sottoelemento di: Labels Etichette Status Stato Separations Separazioni Between folders: Tra cartelle: Empty line Riga vuota Custom Personalizzato Between texts: Tra i testi: Between folder and text: Tra cartella e testo: Between text and folder: Tra testo e cartella: Transformations Trasformazioni Typographic replacements: Sostituzioni tipografiche: Replace double quotes (") with: Sostituisci le doppie virgolette (") con: Replace single quotes (') with: Sostituisci le singole virgolette (') con: Remove multiple spaces Rimuovi gli spazi multipli Custom replacements: Sostituzioni personalizzate: Enabled Abilitato Replace Sostituisci With Con RegExp If checked, uses regular expression for replacement. If unchecked, replaced as plain text. Se selezionato, usa l'espressione regolare per la sostituzione. Se deselezionato, sostituito come testo piano. Preview Anteprima Font Font: Font size: Dimensione del font: Folder Cartella {}Level {} folder {}Livello {} cartella {}Level {} text {}Livello {} testo Replace ... with … Sostituisci ... con … Replace --- with — Sostituisci --- con — exportersManager Installed Installato Custom Personalizzato Not found Non trovato {} not found. Install it, or set path manually. {} non trovato. Installalo, o imposta il percorso manualmente. <b>Status:</b> uninstalled. <b>Stato:</b> non installato. <b>Requires:</b> <b>Richiede:</b> Set {} executable path. Imposta {} il percorso dell'eseguibile. frequencyAnalyzer Phrases Frasi Frequency Frequenza Word Parola fullScreenEditor Theme: Tema: {} words / {} {} parole / {} {} words {} parole Spellcheck Controllo ortografico Navigation Navigazione New Text Nuovo testo Title Titolo Title: Show Full Path Titolo: Mostra il percorso completo Theme selector Selettore del tema Word count Conteggio parole Progress Avanzamento Progress: Auto Show/Hide Avanzamento: mostra/nascondi automaticamente Clock Orologio Clock: Show Seconds Orologio: mostra i secondi generalSettings General Generale Split scenes at: Dividi le scene in: \n---\n Trim long titles (> 32 chars) Taglia i titoli lunghi (> 32 caratteri) Import under: Importa sotto: Import in a top-level folder Importa in una cartella di livello superiore helpLabel If you don't wanna see me, you can hide me in Help menu. Se non vuoi vedermi, puoi nascondermi nel menu Guida. importer Import Importa Format: Formato: Choose file Scegli file Clear file Cancella file Preview Anteprima Settings Impostazioni lastAccessedDirectoryInfo Last accessed directory "{}" loaded. L'ultima directory accessibile "{}" è stata caricata. lineEditView Various Vari locker Form Modulo Lock screen: Blocca schermo: Word target Obiettivo di parole Time target Obiettivo di tempo words parole minutes minuti Lock ! Blocca ! ~{} h. ~{} mn. ~{} min. {}:{} {} s. {} sec. {} remaining {} rimanenti {} words remaining {} parole rimanenti mainEditor Form Modulo Text Testo Index cards Schede Outline Quadro d'insieme F11 Go to parent item Vai all'elemento padre Alt+Up Root Radice {} words / {} {} parole / {} {} words {} parole markdownSettings Markdown metadataView Form Modulo Properties Proprietà Summary Riassunto One line summary Riassunto in una riga Full summary Riassunto completo Notes / References Note / Riferimenti Revisions Revisioni myPanel Auto-hide Nascondi automaticamente outlineBasics Set POV Imposta POV None Nessuno Set Status Imposta Stato Set Label imposta etichetta New Nuovo Main Principale Secondary Secondario Minor Minore Set Custom Icon Imposta icona personalizzata Restore to default Ripristina impostazioni di default Root Radice Open {} items in new tabs Apri {} l'oggetto in una nuova scheda Open {} in a new tab Apri {} in una nuova scheda About to remove In procinto di rimuovere <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> <p><b>Sei in procinto di rimuovere {} oggetto(i).</b></p><p>Sei sicuro?</p> Select at least two items. Folders are ignored. Seleziona almeno due elementi Le cartelle sono ignorate. All items must be on the same level (share the same parent). Tutti gli elementi devono essere sullo stesso livello (condividere lo stesso genitore). New &Folder Nuova &Cartella New &Text Nuovo &Testo &Copy &Copia C&ut T&aglia &Paste &Incolla &Rename &Rinomina &Delete &Cancella outlineCharacterDelegate None Nessuno Main Principale Secondary Secondario Minor Minore outlineItem {} words / {} ({}) {} parole / {} ({}) {} words {} parole pandocSettings General Generale Table of Content Tavola dei contenuti Custom settings for {} Impostazioni personali per {} persosProxyModel Main Principale Secondary Secondario Minors Minori plotDelegate General Generale Promise Promessa Problem Problema Progress Progressione Resolution Risoluzione Try / Fail Tentativo / Fallimento No and No e Yes but Sì ma Freytag's pyramid Piramide di Freytag Exposition Esposizione Rising action Azione in aumento Climax Culmine dell'azione Falling action Caduta dell'azione Three acts Tre atti 1. Setup 1. Impostazione 1. Inciting event 1. Evento scatenante 1. Turning point 1. Punto di svolta 2. Choice 2. La scelta 2. Reversal 2. Rovesciamento 2. Disaster 2. Disastro 3. Stand up 3. Risollevamento 3. Climax 3. Culmine 3. Ending 3. Finale Hero's journey Il viaggio dell'eroe Ordinary world Mondo ordinario Call to adventure Chiamata all'avventura Refusal of the call Rifiuto della chiamata Meeting with mentor Incontro con il mentore Tests Le prove Approach Avvicinamento Abyss Abisso Reward / Revelation Ricompensa / Rivelazione Transformation Trasformazione Atonement Espiazione Return Ritorno plotModel New plot Nuova trama Name Nome Meta New step Nuovo passaggio Main Principale Secondary Secondario Minor Minore plotTreeView Main Principale Secondary Secondario Minor Minore **Plot:** {} **Trama:** {} plotsProxyModel Main Principale Secondary Secondario Minors Minori propertiesView Form Modulo POV Status Stato Label Etichetta Compile Compilato Goal Obiettivo Word count Conteggio parole references Not a reference: {}. Non è un riferimento: {}. Unknown reference: {}. Riferimento sconosciuto: {}. Path: Percorso: Stats: Statistiche: POV: Status: Stato: Label: Etichetta: Short summary: Riassunto breve: Long summary: Riassunto esteso: Notes: Note: Basic info Informazioni di base Detailed info Informazioni dettagliate POV of: POV di: Go to {}. Vai a {}. Description Descrizione Result Esito Characters Personaggi Resolution steps Passaggi risolutivi Passion Passione Conflict Conflitto <b>Unknown reference:</b> {}. <b>Riferimento sconosciuto:</b> {}. Folder: <b>{}</b> Cartella: <b>{}</b> Text: <b>{}</b> Testo: <b>{}</b> Character: <b>{}</b> Personaggio: <b>{}</b> Plot: <b>{}</b> Trama: <b>{}</b> World: <b>{name}</b>{path} Mondo: <b>{nome}</b>{percorso} Referenced in: Riferimento in: Motivation Motivazione Goal Obiettivo Epiphany Epifania Short summary Riassunto breve Longer summary Riassunto esteso revisions Form Modulo Options Opzioni Restore Ripristina Delete Cancella Show modifications Mostra modifiche Show ancient version Mostra la vecchia versione Show spaces Mostra spazi Show modifications only Mostra solo le modifiche {} years ago {} anni fa {} months ago {} mesi fa {} days ago {} giorni fa 1 day ago 1 giorno fa {} hours ago {} ore fa {} minutes ago {} minuti fa {} seconds ago {} secondi fa Line {}: Riga {}: Clear all Cancella tutto search Form Modulo Search for... Cerca... Search in: Cerca in: All Tutto Title Titolo Text Testo Summary Riassunto Notes Note POV Status Stato Label Etichetta Options: Opzioni: Case sensitive Tiene conto del maiusc / minusc settingsWindow New status Nuovo stato New label Nuova etichetta newtheme nuovo tema New theme Nuovo tema (read-only) (sola lettura) Open Image Apri immagine Image files (*.jpg; *.jpeg; *.png) Files di immagine (*.jpg; *.jpeg; *.png) Error Errore Unable to load selected file Impossibile caricare il file selezionato Unable to add selected image: {} Impossibile aggiungere l'immagine selezionata: {} sldImportance Form Modulo TextLabel Etichetta di testo Minor Minore Secondary Secondario Main Principale splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> <p>Dividi l'elemento(i) selezionato nel punto indicato.</p> <p>Se uno degli oggetti selezionati è una cartella, sarà applicato ricorsivamente a <i>tutti</i> gli elementi figli.</p> <p>Il punto di divisione può contenere le seguenti sequenze di fuga: <ul> <li><b><code>\n</code></b>: interruzione di linea</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> Split '{}' Dividi '{}' Split items Dividi elementi storylineView Form Modulo Show Plots Mostra le trame Show Characters Mostra i personaggi tabSplitter Open selected items in that view. Apri gli elementi selezionati in questa schermata. Split horizontally Dividi orizzontalmente Close split Chiudi la divisione Split vertically Dividi verticalmente textEditView Various Vari textFormat Form Modulo CTRL+B CTRL+I CTRL+U CTRL+P CTRL+L CTRL+E CTRL+R CTRL+J treeView Expand {} Espandi {} Collapse {} Collassa {} Expand All Espandi tutto Collapse All Collassa tutto welcome Form Modulo 1 Templates Modelli Empty Vuoto Novel Romanzo Novella Romanzo breve Short Story Racconto Research paper Documento di ricerca Demo projects Progetto dimostrativo Add level Aggiungi livello Add word count Aggiungi conteggio parole Next time, automatically open last project La prossima volta, apri automaticamente l'ultimo progetto Open... Apri... Recent Recente Create Crea Open project Apri un progetto Manuskript project (*.msk);;All files (*) Progetto di Manuskript (*.msk);;Tutti i files (*) Save project as... Salva il progetto come... Manuskript project (*.msk) Progetto di Manuskript (*.msk) Manuskript Create New Project Crea un nuovo progetto Warning Attenzione Overwrite existing project {} ? Sovrascrivere il progetto esistente {} ? Empty fiction Narrativa vuota Chapter Capitolo Scene Scena Trilogy Trilogia Book Libro Section Sezione Empty non-fiction Saggistica vuota words each. parole ognuno. of di Text Testo Something Qualcosa <b>Total:</b> {} words (~ {} pages) <b>Totale:</b> {} parole (~ {} pagine) Fiction Letteratura Non-fiction Saggistica Idea Note Nota Research Ricerca TODO First draft Prima stesura Second draft Seconda stesura Final Stesura definitiva worldModel New item Nuovo elemento Fantasy world building Costruzione del mondo di fantasia Physical Fisica Climate Clima Topography Topografia Astronomy Astronomia Wild life Ambiente naturale Flora History Storia Races Razze Diseases Malattie Cultural Cultura Customs Usi e costumi Food Cibo Languages Linguaggi Education Educazione Dresses Vestiario Science Conoscenze scentifiche Calendar Calendario Bodily language Linguaggio del corpo Ethics Aspetti etici Religion Religione Government Forma di governo Politics Politica Gender roles Ruoli di genere Music and arts Musica e arti Architecture Architettura Military Forze armate Technology Tecnologia Courtship Corteggiamento Demography Demografia Transportation Mezzi di trasporto Medicine Medicina Magic system Sistema di magia Rules Regole Organization Organizzazione Magical objects Oggetti magici Magical places Luoghi magici Magical races Razze magiche Important places Luoghi importanti Important objects Oggetti importanti Natural resources Risorse naturali manuskript-0.10.0/i18n/manuskript_ja.qm000066400000000000000000001341721354442177200177730ustar00rootroot00000000000000'1v&3tcZ;ML#UAIYV^3i@RWuk.(^- )PT ^Jw! lȳv[Ʃ0J ?E*XF_xaNblwpKq04ar<wb3TpxInnnn1nbooorzTfb#h$IBxZBjsf6ZB6C&@''((N((()C**,D(bC]e]oGt%D7SXO b,nSzTUvaDg:.*gNھ / H/Cs=?1}G0!&$'z'31V'3Hp'3j +&5!v5ff@V@VjNlqsgDO}Z }ZIKTj~46 QpGOOm7)NS$\0lqSuÊsyT8itj?<5;ߺVYu)Z*0zH` FotcW%Ē`&t3/tx0k=jCs6vJCM+&R!| Tun$^`xl^m?$pmW^m\m]msmmbn:rz RzJ~~E~g,Za]T^= ~'j˙GDlvyAtq . σ ` F> HZ\ +4~ Mg Mg+ TB ^5 ^L5 ^r ^p g: r,| x < z I6!  # -t 7L  UK UD շ z Ce 'e zL $ 0 ?@n 08 3U 9sx >c90 dpe& dpeC? dpe[ dpe d)^ d)_ d)` d) d) d) d) d)Q d) d) lu# o"`y }(I VB T fV *f ~ o :* : ,L ,{ 88 8{+ 8 ʶy ֓ Ut N zC 9,W JnT ;e #e{W F.L^ Q8w. U~ }j& %XB . E t H H|0 f7 5 O ) 8 G LYr ڔ u 5f Y, _ eX iCm ӨSgD y$ |m  RX / 4 d ;N Cj9 Gg Nr] SE ZO Z$B bk pk1 rIjl@ }b D )qk ޔI  \ sh  `" 2T $ $2 $Z $ ,5s %P #6 s sP& sbq ɠ[P u   Oe z . zZCg   4}e 5N 87>$ DY)C DY) DZ* J{ K_ bEI 4 P . S ]* ai z ^T ) 0@ Ğt </ <F <tf < <D ⋙3 e- 'ak.2#2)%6e$93Uh(WG@[/Ua0z$S  0Y$,jBk̺C xpW+,5 S)k;=QQ>42B3POBxS%QyMR_$-d@ fqTFtp|oN~`s~`)-"|T"|Q8#e]tt@+:miip0S0n0000000o0B0~0w000f0J00Z0nY0kOu(0U00~0[000T0Oz0k00000000gOu(0U000S0h0L0B00~0Y0EA little known format modestly used. You know, web sites for example.ExportJPython0n 'markdown'000000O0c0fHTML0QR0Y005Basic HTML output using the Python module 'markdown'.ExportQR00000xb...Choose output file...Export ClassClass:ExportePUB30kY cConvert to ePUB3ExporttManuskript0n000000nQRj_0o0N0nQR0000000gOu(0U00Wg,v0j0000000k[_0W0f0D0~0Y0ADefault exporter, provides basic formats used by other exporters.ExportYAML0000000000q!R0k0W0~0Y0 YAML#0n0000Lvzu0W0_X4T0o00S0n000000g R0k0W0f0Q^f0W0f0O0`0U0D0DDisable YAML metadata block. Use that if you get YAML related error.Export ErrorErrorExport&kchs0nQtN-0k0000Lvzu {})Error processing regular expression : {}Exportpandoc0Ou(0W0f0000000kQR0Y00pandoc0oHaskell0n000000Y c0000g0B00i00jef_b_0k[_0W0f0D00 pandoc0o0manuskript0njnQRj_000j_0g0B00hExport to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter.Export0000000 Font size:ExportHTML QR HTML OutputExportHTML Source HTML SourceExportvk!0kT+000Include a table of contents.Export0000000hT 0X_b0gQ0W0LR0g0M00S0h0d0D0f0000000000hT 0X0g0B00 00000o0000000g0000000U00f0D00S0h0RMc0h0W0f0D00Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown.Export8PDF0ub0Y00_00k0o0LaTeX00000Ou(0Y00%LaTeX engine used to produce the PDF.ExportVLaTeX0o00W0Def0O\b0Y00_00n000000000hef000000׊0g0B00LaTeX is a word processor and document markup language used to create beautiful documents.ExportL Line spacing:ExportMarkdown sourceMarkdown sourceExport6Microsoft Office ef (.docx)"Microsoft Office (.docx) document.Export,LaTeX00000000Y0_ʼn0L0B00~0Y0Needs LaTeX to be installed.Exportef0nkcS (ett) Normalize the document (cleaner)Export$vk!0kT+00000000000nep ,Number of sections level to include in TOC: ExportdOpenDocument 00000000S0n_b_0o0O0H0p LibreOffice {I0gOu(0U0005OpenDocument format. Used by LibreOffice for example.Export u(}000 Paper size:ExportPlain text Plain textExport"ie0_7hy:0W0f0nNRMx0Y00Preview with highlighter.Export,Python00000 'markdown'Python module 'markdown'.Export*YO[X0n0j0D][}PW0nHTML0000/Self-contained HTML files, with no dependenciesExport000000000kQR0Y0g0|!SX0j-[0g0Y0 <a href='www.fountain.io'>Vtl4</a>0j0i0Manuskript0k0o0j0D000Ou(0g0M0~0Y0Simplest export to plain text. Allows you to use your own markup not understood by manuskript, for example Fountain.Export(Q0W0n000000000c[0W0~0Y0 $Specify the base level for headers: Export rzef (SX0j0erG0g0o0j0D))Standalone document (not just a fragment)Export0HTML0g_u({&0y:0Y0k0o0`<q>`000Ou(Use tags for quotes in HTMLExportATX_b_0n00000Ou(Use ATX-style headersExport,000000000nN000k0Sqg0000Ou(1Use reference-style links instead of inline linksExportBreStructuredText 0o0n000000׊0g0B002reStructuredText is a lightweight markup language.Export......ExportersManagerf DescriptionExportersManagerQRj_0n{tManage ExportersExportersManagerManuskript ManuskriptExportersManager00Path:ExportersManagerraKStatusExportersManagerraKStatus:ExportersManager 00000Version:ExportersManagergAnalyzeFrequencyAnalyzer000S:R00nSX0dY Exclude words (comma separated):FrequencyAnalyzer g\000 Minimum size:FrequencyAnalyzer[WepfromNumber of words: fromFrequencyAnalyzer00000n;^Phrase frequencyFrequencyAnalyzer-[SettingsFrequencyAnalyzer SX0n;^Word frequencyFrequencyAnalyzer000S:R0P$Comma separated valuesImport 000000O0S0h0L0g0M0~0[00File open failed.Import000000R Folder importImport00000h00000RImport folder then filesImport&000000n0000oNN 0n0h0J00g0Y0Import tip as:Importk!0nb_5[P0n00R0Y0Include only those extensions:Import0000000n00Markdown importImportMind Map0n00000Mind Map ImportImportMind Map 00000Mind Map importImportOPML 00 OPML ImportImportPandoc R Pandoc importImportv0T RM0kN&0yf0H0Sort items by nameImport40S00og R0j00000000n00000g0o0B00~0[001This does not appear to be a valid Mind Map file.Import,0S00og R0jOPML00000g0o0B00~0[00-This does not appear to be a valid OPML file.ImportUntitledUntitledImportL0b00Y Wrap lines:Import Sqg0c?QeInsert referenceMDEditCompleterAbout (&A)&About MainWindowP_ؓ2 &Cheat sheet MainWindow00000000X0 (&C)&Close project MainWindowlȈL (&C)&Comment line(s) MainWindow000&Copy MainWindowRJd&Delete MainWindow} (&E)&Edit MainWindow 000000&Fiction MainWindow0000 (&F)&File MainWindow 000000&Format MainWindow000&Header MainWindow000 (&H)&Help MainWindow 00000 & &Import… MainWindow000... (&L) &Labels... MainWindow000 (&M)&Mode MainWindowN 0kyR (&M)&Move Up MainWindow0000000 (&N) &Navigation MainWindow0O (&O)&Open MainWindowujS000 (&O) &Ordered list MainWindow0N0Q&Paste MainWindow}BN (&Q)&Quit MainWindowgOu(0W0_0000 (&R)&Recent MainWindow T RM0nY f&Rename MainWindowO[X (&S)&Save MainWindow000ef0hy: (&S)&Show help texts MainWindow0000&Simple MainWindow0000000 &Spellcheck MainWindowRRr &Split… MainWindowraK... (&S) &Status... MainWindow000 (&T)&Tools MainWindowujS0j0W000 (&U)&Unordered list MainWindow (&V)&View MainWindow<html><head/><body><p align="right">Nk=<br/>}</p></body></html>O

One paragraph
summary

 MainWindow~<html><head/><body><p align="right">Ne<br/>}</p></body></html>N

One sentence
summary

 MainWindowManuskript0k0d0D0fAbout Manuskript MainWindow000000000R Add plot step MainWindowO\Author MainWindow_u({& (&B) B&lockquote MainWindowfo Background MainWindowforBackground color MainWindowWg,`X1 Basic info MainWindowg,0n`X1Book information MainWindowg,0n} Book summary MainWindowXuL}Border MainWindowfNuL0Ru 0W0~0W00F0Manuskript0o0N,v0j00n0K0s}00j00n0~0g0i00j-[0O\b0W0~0Y0MBuild worlds. Create hierarchy of broad categories down to specific details. MainWindowR0S0C&ut MainWindowv{X4Nri Character(s) MainWindowv{X4Nri Characters MainWindow 00000Co&mpile MainWindow}~Compile MainWindow[zConflict MainWindowCorner MainWindow0B0j0_0nPO\0n*0O\00~0Y0'Create the outline of your masterpiece. MainWindow 0B0j0_0nv{X4Nri0O\00~0W00F0Create your characters. MainWindow Ctrl+0Ctrl+0 MainWindow Ctrl+CCtrl+C MainWindow Ctrl+DCtrl+D MainWindow Ctrl+KCtrl+K MainWindow Ctrl+MCtrl+M MainWindow Ctrl+OCtrl+O MainWindow Ctrl+QCtrl+Q MainWindow Ctrl+SCtrl+S MainWindowCtrl+Shift+B Ctrl+Shift+B MainWindowCtrl+Shift+DownCtrl+Shift+Down MainWindowCtrl+Shift+K Ctrl+Shift+K MainWindowCtrl+Shift+S Ctrl+Shift+S MainWindowCtrl+Shift+Up Ctrl+Shift+Up MainWindow Ctrl+VCtrl+V MainWindow Ctrl+XCtrl+X MainWindow0000Debug MainWindow"0000`X10fB0kOR)0j00n0g0Y0Debug info. Sometimes useful. MainWindowDelDel MainWindowf Description MainWindows}0`X1 Detailed info MainWindow00000O\b0W0~0Y0Develop plots. MainWindowf Dictionary MainWindow000 Dupl&icate MainWindow}ƀEditor MainWindow [P000Email MainWindow60B0j0_0ng,0h0B0j0_ꎫ0k0Y0`X10QeR0W0f0O0`0U0D00Enter information about your book, and yourself. MainWindowg,0aTs0`0Epiphany MainWindowk=0n}0nTe00k=0k\UAExpand each sentence of your one paragraph summary to a paragraph MainWindowF2F2 MainWindowF6F6 MainWindowF7F7 MainWindowF8F8 MainWindowF9F9 MainWindow 00000Filter MainWindowQhOSFull MainWindow QhOS0n} Full summary MainWindowQh,General MainWindow0000Genre MainWindowvvGoal MainWindow0000Icon MainWindow 00000nr Icon color MainWindow͉-[ Importance MainWindowR0000000j_0Ou(0Y00k0o PyEnchant 00000000W0f0O0`0U0D0#Install PyEnchant to use spellcheck MainWindow000Label MainWindow000Labels MainWindow 00000License MainWindow000M&erge MainWindowN 0kyR (&O) M&ove Down MainWindowManuskript Manuskript MainWindow 00000Metadata MainWindowRj_0e0Q Motivation MainWindowT RMName MainWindowT RMNames MainWindowk!0xNext MainWindowPNotes MainWindowN000One page MainWindow10000n}One page summary MainWindowNk= One paragraph MainWindow Nk=0n}One paragraph summary MainWindowNe One sentence MainWindow Ne0n}One sentence summary MainWindowett Organi&ze MainWindowiOutline MainWindowPOVPOV MainWindow0000Plot MainWindow0000Plots MainWindowzz0000nubPopulates with empty data MainWindow2cWProgress MainWindow000000000 Project tree MainWindowxb0W0_00000RJd0Y0Remove selected plot step(s) MainWindowlzbKResolution steps MainWindow}PgResult MainWindow-[ S&ettings MainWindow T RM0N0Q0fO[X... (&V) Sa&ve as... MainWindowi}" (&R)Sea&rch MainWindow0000Series MainWindow00000000 Situation: MainWindow [z0nSVSource of conflict MainWindow`q0nn (LRSt)Source of passion MainWindow0000OMn0gRRrSp&lit at cursor MainWindow[PhLSubtitle MainWindow}Summary MainWindow}Summary: MainWindow0B0j0_0ng,0n}050SX0{0i0g0H0f0O0`0U0D00S0nO\im0ofB00K0Q00y0M0g0W00F0 0]00k=00000k=0h0W00g_0k[Qh0j}0f0M0~0Y0Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. MainWindow0000Text MainWindowe[Wr Text color MainWindow:0000 {} 0o[XW(0W0~0[00yR0~0_0oRJd0W0~0W0_0K9The file {} does not exist. Has it been moved or deleted? MainWindowhLTitle MainWindow000Tree MainWindow]Volume MainWindow 00W & & What if...? MainWindow[Wep{}{} Words: {}{} MainWindowNuLWorld MainWindow px pxSettings%%Settingse0W0D0000 &New styleSettingsSXep0hy: (&S)&Show word countSettings 1.5 L 1.5 linesSettingsX<html><head/><body><p>0S0n-[0g R0k0Y00h00000000oSXN0n00000h0W0fO[X0U00~0Y000000000000o|!SX0g0Y0L0YNep0g0nQqT }000000{t0k0oN T0M0g0Y0<br/>0S0n-[0q!R0k0W0_X4T00000000oYep0n\0U0j00000h0W0f0c[0n00000kO[X0U00~0Y0</p></body></html>

If you check this option, your project will be save as one single file. Easier to copy or backup, but does not allow collaborative editing, or versionning.
If this is unchecked, your project will be save as a folder containing many small files.

Settings OMnT00[ AlignmentSettings OMnT00[ Alignment:Settings000000000n-[Application settingsSettingsiu(ApplySettings2wRfB0RMV0n}BNfB0k0D0f0D0_00000000O*Automatically load last project on startupSettingsRO[X0nAutomatically save everySettingsfo BackgroundSettingsforBackground color:Settingsfo Background:Settings}0nr Border color:SettingsSmCancelSettingsN-Y.CenterSettingsN-Y.c0HCenteredSettingsrColor:SettingsrColorsSettings}~CompileSettings0nr Corner color:Settings 0nSJ_Corner radius:Settings Ctrl+SCtrl+SSettings0000CursorSettingsRJdDeleteSettingspn0q!R0k0Y0Disable blinkingSettings2P DoubleSettings}EditSettings[WOSFamily:Settings N-000 (Zen mode) Focus modeSettings0000FoldersSettings0000FontSettings0000000 Font size:Settings 0000Font:SettingsQh,GeneralSettings Qh,0n-[General settingsSettingsvvGoalSettings00000nY'0M0U Icon SizeSettings00000nr Icon color:SettingsY f0L0j0DX4TIf no changes duringSettingsu;PImage:Settings1Lv0[WN 0RIndent 1st lineSettingsv0nr Item colorsSettingsh!kcJustifySettings e90n}}Keep revisionsSettingsOuYKeep:Settings000LabelSettings000LabelsSettings Language:Settings]LeftSettings]S0nYPtOYv}Left/Right margins:SettingsLLineSettingsL Line spacing:Settings YPtOYv}Margins:SettingsgY'^E Max widthSettings }0U0D Misspelled:Settingsu;P0j0WNo ImageSettings0D0D0HNoneSettingse0000 (&Y) Old st&yleSettingsf^Opacity:SettingsiOutlineSettingsPOVPOVSettings QPtOYv}Padding:Settingsk= ParagraphSettingsk=00000Paragraph OptionsSettingsk= ParagraphsSettings RrT (%) PercentageSettingsOMn Position:Settings2cWProgressSettingsD-[0g R0k0Y00_00k0o0Manuskript0QwR0W0f0O0`0U0D07Restarting Manuskript ensures all settings take effect.Settings000000kb;0YRestore defaultsSettings000000o0Y f00Y00_00nj_0g0Y0T00000o000000000kR0H0_Y fp0O[X0W0NRM0n000000hy:0T0g0M000F0k0j0c0f0D0~0Y0Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions.SettingsSRightSettings2cWrl0hy: (&H)S&how progressSettings [gv0jRJd S&mart removeSettings }BNfB0kO[X Save on quitSettingsSXN0n00000kO[XSave to one single fileSettingsRO[XSavingSettings~.\:ScaledSettingseSentenceSettings-[SettingsSettingsSXep0hy: (&W)Show &word countSettings2Lrl0hy: (&S)Show p&rogressSettings}0hy: (&Y) Show summar&ySettings }0 Show summarySettingsY'0M0USize:Settings[gv0jRJd0R)u(0Y00h0000000nO[Xep0R6P0g0M0~0Y00S0nj_0o0g R0k0Y00S0h0_70O0JR00W0~0Y00S0nj_0Ou(0W0j0DX4T0000000n00000LepSC00nep0k00`P00L0B00~0Y0Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes.SettingsSpacing:SettingsraKStatusSettings0000StyleSettings 0000Style:Settings00^E Tab width:Settings00000nfoText BackgroundSettings000000000 Text OptionsSettings0000000 Text areaSettingse[Wr Text color:Settings00000000 Text editorSettings0000000 TextLabelSettingsN;LT  Theme name:Settings000TiledSettingshLTitleSettingsN N 0nYPtOYv}Top/Bottom margins:Settings N (Transparent) TransparentSettingsWType:Settings0000000000Typewriter modeSettings0000c?Qe0Ou(Use block insertion ofSettingshy:RVisible columnsSettings^EWidth:Settings000000nfoWindow BackgroundSettingsSXep Word countSettingsbY'ZoomedSettingsRminutes.Settings"NS1fB0k0J0Q010R0T0h0ne9*revisions per 10 minutes for the last hourSettingsQHg0nNe0B0_00n00000$revisions per day for the last monthSettings g}Be0n1fB0B0_00n00000#revisions per hour for the last daySettings*NS10R0k0J0Q01R0B0_00n00000,revisions per minute for the last 10 minutesSettingsyseconds.Settingsf0R (&A)&Add to dictionary SpellAction0000f0K0RJd (&R)&Remove from custom dictionary SpellAction }00nPSpelling Suggestions SpellActionManuskript0k0d0D0fAbout ManuskriptaboutManuskript Manuskriptabout Ou(N-0n00000000000Software Versions in Use: aboutDialog 00000Version aboutDialog}~Compile abstractModelvvGoal abstractModel000Label abstractModelPOVPOV abstractModelraKStatus abstractModelhLTitle abstractModelSXep Word count abstractModel ez0n}Few sentences summary: basicItemViewvvGoal: basicItemView NL0n}One line summary basicItemViewPOVPOV: basicItemViewSXep Word count basicItemViewT RMNamecharacterModele0W0Dv{X4Nri New charactercharacterModelP$ValuecharacterModel ͉0g0o0j0DMinorcharacterTreeView{,N SecondarycharacterTreeViewv{X4Nri Characters cheatSheet(}^00 (000000Q0nNa0nT RM)2Filter (type the name of anything in your project) cheatSheet ͉0g0o0j0DMinor cheatSheet0000Plots cheatSheet{,N Secondary cheatSheet0000Texts cheatSheetNuLWorld cheatSheet ͉0g0o0j0DMinorcmbOutlineCharacterChoser{,N SecondarycmbOutlineCharacterChoser(Dock Widgets ToolbarDock Widgets ToolbarcollapsibleDockWidgets 0Y0y0f0n} Full summary corkDelegate NL0n}One line summary corkDelegateQRExportexporterQRQH Export to:exporterQRj_0n{tManage exportersexporterNRMx (00000)Previewexporter-[Settingsexporter {} (0~0`[0U00f0D0~0[0){} (not implemented yet)exporterDialog<html><head/><body><p>g}B0nQR0kT+00v0}^000~0Y0<br/><span style=" color:#773333;">(la0S0nj_0o00~0`[Qh0g0o0j0O0[v0j[0g0Y)</span></p></body></html>

Filters what items will be included in the final export.
(Not fully implemented yet.)

exporterSettings00000h00000nBetween folder and text:exporterSettings 0000Between folders:exporterSettings00000h00000nBetween text and folder:exporterSettingsezBetween texts:exporterSettings CustomCustomexporterSettings0000ncCustom replacements:exporterSettings g}Bv0kQR0Y0ri0lz[0W0~0Y06Decide here what will be included in the final export.exporterSettingszzL Empty lineexporterSettingsg REnabledexporterSettings}^00 (&L)Fi<ersexporterSettings0000FolderexporterSettings0000FontexporterSettings0000000 Font size:exporterSettings 0000Font:exporterSettings}00K0D|^0L_ʼn0g0YI need more granularityexporterSettingsd00000Y00h0nc0k0okchs0Ou(0W0~0Y000000W0j0DX4T0o0^80n00000h0W0fnc0W0~0Y0ZIf checked, uses regular expression for replacement. If unchecked, replaced as plain text.exporterSettings.}~0nraK0q!0Y0 (0Y0y0f0nv0T+00))Ignore compile status (include all items)exporterSettings000LabelsexporterSettingsNRMx (00000)PreviewexporterSettingskchsRegExpexporterSettings͉0W0_zzv}0RJdRemove multiple spacesexporterSettingsncReplaceexporterSettings--- 0  0kn0Mc0H0Replace --- with —exporterSettings & 0 & 0kn0Mc0H0Replace ... with …exporterSettings(N_u({& (") 00k!0kn0Mc0H0Replace double quotes (") with:exporterSettings(N_u({& (') 00k!0kn0Mc0H0Replace single quotes (') with:exporterSettingsR SeparationsexporterSettingsraKStatusexporterSettings[Pv Subitems of:exporterSettings0000TextexporterSettingshLTitleexporterSettingsY cTransformationsexporterSettingsWTypeexporterSettings ie0nncTypographic replacements:exporterSettings{}000 {} 0000{}Level {} folderexporterSettings{}000 {} 0000{}Level {} textexporterSettings<b>_ʼn</b> Requires: exportersManager.<b>raK</b> uninstalled.Status: uninstalled.exportersManager0000CustomexportersManager000000n InstalledexportersManager0d0K00~0[0 Not foundexportersManager [L000 {} 0k-[0W0~0Y0Set {} executable path.exportersManagerd{} 0o00d0K00~0[000000000Y00K000W0O0o0[L00000bKR0g000kc[0W0f0O0`0U0D0/{} not found. Install it, or set path manually.exportersManager;^ FrequencyfrequencyAnalyzer0000PhrasesfrequencyAnalyzerSXWordfrequencyAnalyzer2cWProgressfullScreenEditor$2cW Auto Show/HideProgress: Auto Show/HidefullScreenEditor}0qgT SpellcheckfullScreenEditor N;L0nxbTheme selectorfullScreenEditorN;LTheme:fullScreenEditorhLTitlefullScreenEditorhL00000hy:Title: Show Full PathfullScreenEditorSXep Word countfullScreenEditor {} SX{} wordsfullScreenEditor{} SX / {} {} words / {}fullScreenEditorQh,GeneralgeneralSettingsgN OM00000k00000Import in a top-level foldergeneralSettings&w0DhL0RJ0 (hL0o32e[W0~0g)Trim long titles (> 32 chars)generalSettings\n---\n\n---\ngeneralSettingsNRMx (00000)Previewimporter>g_0k00000W0_000000 "{}" 0L0000U00~0W0_0$Last accessed directory "{}" loaded.lastAccessedDirectoryInfo R minuteslocker SX wordslocker000Lock !lockerfBvj Time targetlocker[aSX Word targetlocker k0 {} {} remaininglocker {} y.{} s.locker{} OYRpSX{} words remaininglocker {}:{}{}:{}locker ~{} fB.~{} h.locker ~{} R.~{} mn.locker Alt+UpAlt+Up mainEditorF11F11 mainEditor0nv0kyRGo to parent item mainEditor}"_v2 Index cards mainEditoriOutline mainEditor0000Text mainEditor {} SX  {} words  mainEditor{} SX / {} {} words / {}  mainEditorMarkdownMarkdownmarkdownSettings 0Y0y0f0n} Full summary metadataView 000/SqgNotes / References metadataView NL0n}One line summary metadataView\^`' Properties metadataViewe9 Revisions metadataView}Summary metadataView Rv0k0Y Auto-hidemyPanel000 (&C)&Copy outlineBasicsRJd (&D)&Delete outlineBasics0N0Q (&P)&Paste outlineBasicsT RM0Y f (&R)&Rename outlineBasicsl<p><b>0B0j0_0o {} P 0nv0RJd0W00F0h0W0f0D0~0Y0</b></p><p>000W0D0g0Y0K</p>D

You're about to delete {} item(s).

Are you sure?

 outlineBasicsRJd0W00F0h0W0f0D0~0YAbout to remove outlineBasicsD0Y0y0f0nv0oT 0X0000k0j0Q00p0j00~0[0 (T 0X0c0a0~0Y)0{}</b>Character: {} referencesv{X4Nri Characters referencesvvGoal references000Label: references w0D} Long summary: references 00w0D}Longer summary references 00w0D} Short summary references w0D}Short summary: referencesraKStatus: references,NuL<b>{name}</b>{path}World: {name}{path} references1 eRM 1 day ago revisions 0Y0y0fmS Clear all revisions L {}Line {}: revisionsY f0n00hy:Show modifications only revisions zzv}0hy: Show spaces revisions {} eRM {} days ago revisions {} fBRM {} hours ago revisions {} RRM{} minutes ago revisions {} 0gRM {} months ago revisions {} yRM{} seconds ago revisions {} ^tRM {} years ago revisions0Y0y0fAllsearchY'e[W0h\e[W0S:R%Case sensitivesearch000Labelsearch000NotessearchPOVPOVsearchi}"0Y0... Search for...search0gi}" Search in:searchraKStatussearch}Summarysearch0000TextsearchhLTitlesearch (0S0\u() (read-only)settingsWindow ErrorErrorsettingsWindow2u;P (*.jpg; *.jpeg; *.png)"Image files (*.jpg; *.jpeg; *.png)settingsWindow e0W0D000 New labelsettingsWindow e0W0DraK New statussettingsWindow e0W0DN;L New themesettingsWindow u;P00O Open ImagesettingsWindow$xb0W0_u;P0R0g0M0~0[0 {} Unable to add selected image: {}settingsWindow&xb0W0_00000000~0[00g0W0_Unable to load selected filesettingsWindow e0W0DN;LnewthemesettingsWindow ͉0g0o0j0DMinor sldImportance{,N Secondary sldImportance0000000 TextLabel sldImportanceRRr '{}' Split '{}' splitDialogxb0W0_v0RRr0Y0 Split items splitDialogv{X4Nri0hy:Show Characters storylineView00000hy: Show Plots storylineViewu;b0nRRr00X0 Close split tabSplitter"0S0nu;b0gxb0W0_v00M0~0Y0!Open selected items in that view. tabSplitteru;b0l4^seT0kRRr0Y0Split horizontally tabSplitter~&0kRRrSplit vertically tabSplitter CTRL+BCTRL+B textFormat CTRL+ECTRL+E textFormat CTRL+ICTRL+I textFormat CTRL+JCTRL+J textFormat CTRL+LCTRL+L textFormat CTRL+PCTRL+P textFormat CTRL+RCTRL+R textFormat CTRL+UCTRL+U textFormat0Y0y0fb0us0 Collapse AlltreeViewb0us0 {} Collapse {}treeView 0Y0y0f\U Expand AlltreeView \U {} Expand {}treeView11welcome6<b>T</b> {} SX (} {} 000)#Total: {} words (~ {} pages)welcome 0000R Add levelwelcomeXR0W0_SXepAdd word countwelcomeg,Bookwelcome 00000ChapterwelcomeO\bCreatewelcomee0W0D0000000O\b0Y0Create New Projectwelcome00000000 Demo projectswelcomezzEmptywelcomelz[z?FinalwelcomeRz? First draftwelcome 00000IdeawelcomeManuskript Manuskriptwelcome4Manuskript project (*.msk)Manuskript project (*.msk)welcomeRManuskript project (*.msk);;All files (*))Manuskript project (*.msk);;All files (*)welcome>k!VލwRfB0o0RMV}BNfB0k0D0f0D0_0000000Rv0k0O*Next time, automatically open last projectwelcome000Notewelcome\NovelwelcomeN-}\Novellawelcome00000000O Open projectwelcome 0O...Open...welcome,e[X0n000000 {} 0N f0M0W0~0Y0KOverwrite existing project {} ?welcome gO0c0_RecentwelcomexzvResearchwelcomexzveResearch paperwelcome$T RM0N0Q0f0000000O[X...Save project as...welcome000Scenewelcome{,Nz? Second draftwelcome 00000Sectionwelcomew}\ Short StorywelcomeTODOTODOwelcome 000000 Templateswelcome0000TextwelcomeN O\TrilogywelcomefTJWarningwelcomeSX (Tv)0 words each.welcome^{ɈS Architecture worldModelY)e Astronomy worldModel&c/0bKc/0{I0nNՃI0k00a`0nO0HeBodily language worldModelfCalendar worldModellPClimate worldModellBZZ Courtship worldModeleSCultural worldModelCustoms worldModelNS}q Demography worldModelulDiseases worldModelg Dresses worldModel[fUO Education worldModelP+tEthics worldModelzz`0nNuL0{0OFantasy world building worldModeli riFlora worldModelFood worldModel`'R%0k00_yRr Gender roles worldModel}qlOS Government worldModelktSHistory worldModel ͉0jSQwImportant objects worldModel ͉0jX4b@Important places worldModel Languages worldModelTSOS| Magic system worldModelTSSQwMagical objects worldModel TS0nX4b@Magical places worldModelTS0k00Tz. Magical races worldModelS;vBMedicine worldModelNMilitary worldModel i}0SMusic and arts worldModelY)q6nNatural resources worldModel e0W0DvNew item worldModelVOS Organization worldModelq6Physical worldModele?lPolitics worldModelNz.0le0z.eRaces worldModel[eYReligion worldModel RG0{Rules worldModely[fScience worldModelbS Technology worldModelW0_b Topography worldModelNTransportation worldModeluRri Wild life worldModelmanuskript-0.10.0/i18n/manuskript_ja.ts000066400000000000000000005505651354442177200200140ustar00rootroot00000000000000 Export Basic HTML output using the Python module 'markdown'. Pythonの 'markdown'モジュールを使ってHTMLを出力する。 Python module 'markdown'. Pythonモジュール 'markdown' Markdown source Markdown source HTML Source HTML Source HTML Output HTML 出力 Default exporter, provides basic formats used by other exporters. Manuskriptのデフォルトの出力機能は、他の出力ソフトウェアで使用される基本的なフォーマットに対応しています。 Preview with highlighter. 構文を強調表示しての事前確認する。 Plain text Plain text A little known format modestly used. You know, web sites for example. このフォーマットはあまり知られておらず、滅多に使用されません。ごく稀に、ウェブサイトで使用されることがあります。 Needs LaTeX to be installed. LaTeXをインストールする必要があります。 Error Error Standalone document (not just a fragment) 独立文書 (単なる断片ではない) Include a table of contents. 目次に含める。 Number of sections level to include in TOC: 目次に含めるセクションレベルの数: Typographically correct output Normalize the document (cleaner) 文書の正規化 (整理) Specify the base level for headers: 見出しのデフォルトレベルを指定します。 Use reference-style links instead of inline links インラインリンクの代わりに、参照リンクを使用 Use ATX-style headers ATX形式のスタイルを使用 Self-contained HTML files, with no dependencies 外部依存のない自己完結型のHTMLファイル Use <q> tags for quotes in HTML HTMLで引用符を示すには、`<q>`タグを使用 LaTeX engine used to produce the PDF. PDFを生成するためには、LaTeXエンジンを使用する。 Paper size: 用紙サイズ: Font size: フォントサイズ: Class: Class: Line spacing: 行間: Books that don't kill trees. OpenDocument format. Used by LibreOffice for example. OpenDocument フォーマット。この形式は、例えば LibreOffice 等で使用される。 Microsoft Office (.docx) document. Microsoft Office 文書 (.docx) reStructuredText is a lightweight markup language. reStructuredText は軽量のマークアップ言語である。 Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. マークダウンと同じ形で見出しが追加できることを除いて、プレーンテキストと同じである。 テキストはマークダウンでフォーマットされていることを前提としている。 Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. プレーンテキストに出力する最も簡単な設定です。 <a href='www.fountain.io'>噴水</a>など、Manuskriptにはないタグを使用できます。 <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. pandocを使用してマークダウンに出力する。pandocはHaskell製のドキュメント変換ツールであり、様々な文書形式に対応している。 pandocは、manuskriptの標準出力機能よりも高機能である。 LaTeX is a word processor and document markup language used to create beautiful documents. LaTeXは、美しい文書を作成するためのワードプロセッサと文書マークアップ言語である。 The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. Disable YAML metadata block. Use that if you get YAML related error. YAMLメタデータブロックを無効にします。 YAML関連のエラーが発生した場合は、このオプションを有効にして、再度試してください。 Convert to ePUB3 ePUB3に変換 Could not process regular expression: {} 正規表現の処理中にエラーが発生: {} Choose output file… 出力ファイルを選択... ExportersManager Manage Exporters 出力機能の管理 Manuskript Manuskript Description 説明 Offers export to Status 状態 Status: 状態: Version: バージョン: Path: パス: ... ... {HelpText} FrequencyAnalyzer Frequency Analyzer Word frequency 単語の頻度 Settings 設定 Minimum size: 最小サイズ: Exclude words (comma separated): カンマ区切りの単語を除外: Analyze 解析 Phrase frequency フレーズの頻度 Number of words: from 字数:from to Import Markdown import マークダウンの読み込み <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; Folder import フォルダーを追加 <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> Include only those extensions: 次の拡張子のみを追加する: Comma separated values カンマ区切り値 Sort items by name 項目を名前順に並べ替える Import folder then files フォルダとファイルを追加 OPML Import OPML 読み込み File open failed. ファイルを開くことができません。 This does not appear to be a valid OPML file. これは有効なOPMLファイルではありません。 Pandoc import Pandoc 追加 <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; Import using: Wrap lines: 行を折り返す: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> Mind Map Import Mind Mapのインポート This does not appear to be a valid Mind Map file. これは有効なマインドマップのファイルではありません。 Mind Map import Mind Map インポート Import tip as: インポートのヒントは以下のとおりです。 Untitled Untitled MDEditCompleter Insert reference 参照を挿入 MainWindow General 全般 Title 表題 Subtitle 子表題 Series シリーズ Volume Genre ジャンル License ライセンス Author 作者 Name 名前 Email 電子メール Summary 要約: Situation: シチュエーション: Summary: 要約: One sentence 一文 One paragraph 一段落 One page 一ページ Full 全体 One sentence summary 一文の要約 One paragraph summary 一段落の要約 Expand each sentence of your one paragraph summary to a paragraph 段落の要約の各文を、段落に展開 One page summary 1ページの要約 Full summary 全体の要約 Next 次へ What if...? もし……? Characters 登場人物 Names 名前 Filter フィルター Basic info 基本情報 Importance 重要設定 Motivation 動機づけ Goal 目的 Conflict 対立 Epiphany 本質・意味・悟り <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="right">一文<br/>要約</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> <html><head/><body><p align="right">一段落<br/>要約</p></body></html> Notes 備考 Detailed info 詳細情報 Plots プロット Plot プロット Character(s) 登場人物 Description 説明 Result 結果 Resolution steps 解決手順 World 世界 Populates with empty data 空データの生成 More Source of passion 情熱の源 (行動原理) Source of conflict 対立の原因 Outline 概要 Editor 編集者 Debug デバッグ FlatData Persos Labels ラベル &File ファイル (&F) &Recent 最近使用したファイル (&R) &Help ヘルプ (&H) &Tools ツール (&T) &Edit 編集 (&E) &View 閲覧 (&V) &Mode モード (&M) &Cheat sheet 備忘録 Sea&rch 検索 (&R) &Navigation ナビゲーション (&N) &Open 開く (&O) Ctrl+O Ctrl+O &Save 保存 (&S) Ctrl+S Ctrl+S Sa&ve as... 名前を付けて保存... (&V) Ctrl+Shift+S Ctrl+Shift+S &Quit 終了 (&Q) Ctrl+Q Ctrl+Q &Show help texts ヘルプ文書を表示 (&S) Ctrl+Shift+B Ctrl+Shift+B &Spellcheck スペルチェック F9 F9 &Labels... ラベル... (&L) &Status... 状態... (&S) Tree ツリー &Simple シンプル &Fiction フィクション Index cards 索引目録 S&ettings 設定 F8 F8 &Close project プロジェクトを閉じる (&C) Co&mpile コンパイル F6 F6 &Frequency Analyzer Book information 本の情報 &About About (&A) About Manuskript Manuskriptについて Manuskript Manuskript Project {} saved. WARNING: Project {} not saved. Project {} loaded. Project {} loaded with some errors: * {} wasn't found in project file. Project {} loaded with some errors. (~{} pages) Words: {}{} 字数:{}{} Book summary 本の要約 Project tree プロジェクトツリー Metadata メタデータ Story line Enter information about your book, and yourself. あなたの本とあなた自身に関する情報を入力してください。 The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. あなたの本の要約を50単語ほどで考えてください。この作業は時間をかけるべきでしょう。 それを段落、ページに落とし込み、最後に完全な要約を書きます。 Create your characters. あなたの登場人物を作りましょう。 Develop plots. プロットを作成します。 Build worlds. Create hierarchy of broad categories down to specific details. 世界を創造しましょう。Manuskriptは、一般的なものから詳細なものまで、様々な設定を作成します。 Create the outline of your masterpiece. あなたの傑作の輪郭を作ります。 Write. Debug info. Sometimes useful. デバッグ情報。時に便利なものです。 Dictionary 辞書 Nothing POV POV Label ラベル Progress 進捗 Compile 編纂 Icon color アイコンの色 Text color 文字色 Background color 背景色 Icon アイコン Text テキスト Background 背景 Border 境界線 Corner Add plot step プロットステップを追加 &Import… インポート… F7 F7 &Copy コピー Ctrl+C Ctrl+C C&ut 切り取り Ctrl+X Ctrl+X &Paste 貼り付け Ctrl+V Ctrl+V &Split… 分割 Ctrl+Shift+K Ctrl+Shift+K Sp&lit at cursor カーソル位置で分割 Ctrl+K Ctrl+K Ctrl+M Ctrl+M Ctrl+D Ctrl+D Del Del &Move Up 上に移動 (&M) Ctrl+Shift+Up Ctrl+Shift+Up M&ove Down 下に移動 (&O) Ctrl+Shift+Down Ctrl+Shift+Down Dupl&icate コピー &Delete 削除 &Rename 名前の変更 F2 F2 Organi&ze 整理 M&erge マージ &Format フォーマット &Header ヘッダ &Level 1 (setext) Ctrl+Alt+1 Level &2 Ctrl+Alt+2 Level &1 (atx) Ctrl+1 Ctrl+1 L&evel 2 Ctrl+2 Ctrl+2 Level &3 Ctrl+3 Ctrl+3 Level &4 Ctrl+4 Ctrl+4 Level &5 Ctrl+5 Ctrl+5 Level &6 Ctrl+6 Ctrl+6 &Bold Ctrl+B &Italic Ctrl+I &Strike &Verbatim Su&perscript Ctrl++ Subsc&ript Ctrl+- Co&mment block Ctrl+Shift+C Clear &formats Ctrl+0 Ctrl+0 &Comment line(s) 注釈行 (&C) &Ordered list 番号リスト (&O) &Unordered list 番号なしリスト (&U) B&lockquote 引用符 (&B) Remove selected plot step(s) 選択したプロットを削除する The file {} does not exist. Has it been moved or deleted? ファイル {} は存在しません。移動または削除しましたか? Install {}{} to use spellcheck {} has no installed dictionaries {}{} is not installed Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings Settings 設定 General 全般 Revisions 改訂 Views Labels ラベル Status 状態 Fullscreen General settings 全般の設定 Application settings アプリケーションの設定 Loading Automatically load last project on startup 起動時、前回の終了時に開いていたプロジェクトを開く Saving 自動保存 Automatically save every 自動保存の間隔 minutes. If no changes during 変更がない場合 seconds. Save on project close 終了時に保存 <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> <html><head/><body><p>この設定を有効にすると、プロジェクトは単一のファイルとして保存されます。コピーやバックアップは簡単ですが、多人数での共同編集やバージョン管理には不向きです。<br/>この設定を無効にした場合、プロジェクトは多数の小さなファイルとして、指定のフォルダに保存されます。</p></body></html> Save to one single file 単一のファイルに保存 Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. リビジョンは、変更を追跡するための機能です。各テキストは、メインテキストに加えた変更点を保存し、以前のバージョンを表示・複合できるようになっています。 Keep revisions 改訂の継続 S&mart remove 定期的な削除 Keep: 保留: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. 定期的な削除を利用すると、リビジョンの保存数を制限できます。この機能は、有効にすることを強くお勧めします。この機能を使用しない場合、リビジョンのファイルが数千もの数に膨らむ恐れがあります。 revisions per day for the last month 先月の一日あたりのリビジョン revisions per minute for the last 10 minutes 過去10分間における1分あたりのリビジョン revisions per hour for the last day 最終日の1時間あたりのリビジョン revisions per 10 minutes for the last hour 過去1時間における10分ごとの改訂 revisions per week till the end of time Views settings Tree ツリー Colors Icon color: アイコンの色: Nothing POV POV Label ラベル Progress 進捗 Compile 編纂 Text color: 文字色: Background color: 背景色: Folders フォルダ Show ite&m count Show summary 要約を閲覧 &Nothing Text テキスト Outline 概要 Visible columns 表示列 Goal 目的 Word count 単語数 Percentage 割合 (%) Title 表題 Index cards 索引目録 Item colors 項目の色 Border color: 線の色: Corner color: 角の色: Background 背景 Color: 色: Ctrl+S Ctrl+S Image: 画像: Text editor テキストエディタ Font フォント Family: 字体: Size: 大きさ: Misspelled: 綴り間違い: Background: 背景: Paragraphs 段落 Line spacing: 行間隔: Single 1.5 lines 1.5 行 Double 2倍 Proportional % % Tab width: タブ幅: px px Indent 1st line 1行目を字下げ Spacing: 間隔: New Edit 編集 Delete 削除 Theme name: 主題名: Apply 適用 Cancel 取消 Window Background ウィンドウの背景 Text Background テキストの背景 Text Options テキストオプション Paragraph Options 段落オプション Type: 型: No Image 画像なし Tiled タイル Centered 中央揃え Stretched Scaled 縮尺 Zoomed 拡大 Opacity: 透明度: Position: 位置: Left Center 中央 Right Width: 幅: Corner radius: 角の半径: Margins: 外側余白: Padding: 内側余白: Font: フォント: Style スタイル Cursor カーソル Use block insertion of ブロック挿入を使用 Alignment: 位置合わせ: Justify 校正 Alignment 位置合わせ Icon Size アイコンの大きさ TextLabel テキストラベル Disable blinking 点滅を無効にする Text area テキストエリア Max width 最大幅 Left/Right margins: 左右の外側余白: Top/Bottom margins: 上下の外側余白: S&how progress 進捗状況を表示 (&H) Show summar&y 要約を表示 (&Y) Show p&rogress 進行状況を表示 (&S) Old st&yle 旧スタイル (&Y) Transparent 透過 (Transparent) Restore defaults デフォルトに戻す Style: スタイル: Language: 言語: Font size: フォントサイズ: Restarting Manuskript ensures all settings take effect. 設定を有効にするためには、Manuskriptを再起動してください。 Show &word count 単語数を表示 (&W) &Show word count 単語数を表示 (&S) &New style 新しいスタイル Typewriter mode タイプライターモード Focus mode 集中モード (Zen mode) None いいえ Sentence Line Paragraph 段落 <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions 綴りの候補 &Add to dictionary 辞書を追加 (&A) &Remove from custom dictionary カスタム辞書から削除 (&R) about About Manuskript Manuskriptについて Manuskript Manuskript aboutDialog Version バージョン Software Versions in Use: 使用中のソフトウェアバージョン: abstractModel Title 表題 POV POV Label ラベル Status 状態 Compile 編纂 Word count 単語数 Goal 目的 basicItemView Form POV: POV: Goal: 目的: Word count 単語数 One line summary 一行の要約 Few sentences summary: 文章の要約: characterModel New character 新しい登場人物 Name 名前 Value characterTreeView Main Secondary 第二項 Minor 重要ではない cheatSheet Form Filter (type the name of anything in your project) 絞り込み (プロジェクト内の任意の名前) Minor 重要ではない Secondary 第二項 Main Characters 登場人物 Texts テキスト Plots プロット World 世界 cmbOutlineCharacterChoser None いいえ Main Secondary 第二項 Minor 重要ではない Various cmbOutlineLabelChoser Various cmbOutlineStatusChoser Various collapsibleDockWidgets Dock Widgets Toolbar Dock Widgets Toolbar completer Form corkDelegate One line summary 一行の要約 Full summary すべての要約 editorWidget_ui Form exporter Export 出力 Export to: 出力先: Manage exporters 出力機能の管理 Preview 事前確認 (プレビュー) Settings 設定 exporterDialog {} (not implemented yet) {} (まだ実装されていません) exporterSettings Form Content Decide here what will be included in the final export. 最終的に出力する物を決定します。 Type Title 表題 Text テキスト I need more granularity 細かい粒度が必要です Fi&lters 絞り込み (&L) <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> <html><head/><body><p>最終の出力に含める項目を絞り込みます。<br/><span style=" color:#773333;">(注意:この機能は、まだ完全ではなく、実験的な実装です)</span></p></body></html> Ignore compile status (include all items) 編纂の状態を無視する (すべての項目を含める) Subitems of: 子項目: Labels ラベル Status 状態 Separations 分離 Between folders: フォルダ間: Empty line 空行 Custom Custom Between texts: 文章間: Between folder and text: フォルダとテキストの間: Between text and folder: テキストとフォルダの間: Transformations 変換 Typographic replacements: 構文の置換: Replace double quotes (") with: 二重引用符 (") を、次に置き換える: Replace single quotes (') with: 一重引用符 (') を、次に置き換える: Remove multiple spaces 重複した空白を削除 Custom replacements: カスタム置換: Enabled 有効 Replace 置換 With RegExp 正規表現 If checked, uses regular expression for replacement. If unchecked, replaced as plain text. チェックすると、置換には正規表現を使用します。チェックしない場合は、通常のテキストとして置換します。 Preview 事前確認 (プレビュー) Font フォント Font: フォント: Font size: フォントサイズ: Folder フォルダ {}Level {} folder {}レベル {} フォルダ {}Level {} text {}レベル {} テキスト Replace ... with … … を … に置き換える Replace --- with — --- を — に置き換える exportersManager Installed インストール済 Custom カスタム Not found 見つかりません {} not found. Install it, or set path manually. {} は、見つかりません。インストールするか、もしくは、実行ファイルを手動でパスに指定してください。 <b>Status:</b> uninstalled. <b>状態:</b> uninstalled. <b>Requires:</b> <b>必要:</b> Set {} executable path. 実行パスを {} に設定します。 frequencyAnalyzer Phrases フレーズ Frequency 頻度 Word 単語 fullScreenEditor Theme: 主題: {} words / {} {} 単語 / {} {} words {} 単語 Spellcheck 綴り照合 Navigation New Text Title 表題 Title: Show Full Path 表題:フルパスを表示 Theme selector 主題の選択 Word count 単語数 Progress 進捗 Progress: Auto Show/Hide 進捗: Auto Show/Hide Clock Clock: Show Seconds generalSettings General 全般 Split scenes at: \n---\n \n---\n Trim long titles (> 32 chars) 長い表題を削る (表題は32文字まで) Import under: Import in a top-level folder 最上位フォルダにインポート helpLabel If you don't wanna see me, you can hide me in Help menu. importer Import Format: Choose file Clear file Preview 事前確認 (プレビュー) Settings 設定 lastAccessedDirectoryInfo Last accessed directory "{}" loaded. 最後にアクセスしたディレクトリ "{}" がロードされました。 lineEditView Various locker Form Lock screen: Word target 対象単語 Time target 時間目標 words 単語 minutes Lock ! ロック! ~{} h. ~{} 時. ~{} mn. ~{} 分. {}:{} {}:{} {} s. {} 秒. {} remaining 残り {} {} words remaining {} 余剰単語 mainEditor Form Text テキスト Index cards 索引目録 Outline 概要 F11 F11 Go to parent item 親の項目に移動 Alt+Up Alt+Up Root {} words / {} {} 単語 / {} {} words {} 単語 markdownSettings Markdown Markdown metadataView Form Properties 属性 Summary 要約 One line summary 一行の要約 Full summary すべての要約 Notes / References ノート/参照 Revisions 改訂 myPanel Auto-hide 自動的に隠す outlineBasics Set POV POV 設置 None いいえ Set Status 状態を設定 Set Label ラベルを設定 New Main Secondary 第二項 Minor 重要ではない Set Custom Icon カスタムアイコンを設定 Restore to default 標準値に戻す Root Open {} items in new tabs 新しいタブで {} 項目を開く Open {} in a new tab 新しいタブで {} を開く About to remove 削除しようとしています <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> <p><b>あなたは {} 個の項目を削除しようとしています。</b></p><p>よろしいですか?</p> Select at least two items. Folders are ignored. 少なくとも2つの項目を選択してください。フォルダは無視されます。 All items must be on the same level (share the same parent). すべての項目は同じレベルになければなりません (同じ親を持ちます)。 New &Folder 新しいフォルダ (&F) New &Text 新しいテキスト (&T) &Copy コピー (&C) C&ut 切り取り (&U) &Paste 貼り付け (&P) &Rename 名前を変更 (&R) &Delete 削除 (&D) outlineCharacterDelegate None いいえ Main Secondary 第二項 Minor 重要ではない outlineItem {} words / {} ({}) {} 単語 / {} ({}) {} words {} 単語 pandocSettings General 全般 Table of Content Custom settings for {} persosProxyModel Main Secondary 第二項 Minors 重要ではない plotDelegate General 全般 Promise Problem Progress 進捗 Resolution Try / Fail No and Yes but Freytag's pyramid Exposition Rising action Climax Falling action Three acts 1. Setup 1. Inciting event 1. Turning point 2. Choice 2. Reversal 2. Disaster 3. Stand up 3. Climax 3. Ending Hero's journey Ordinary world Call to adventure Refusal of the call Meeting with mentor Tests Approach Abyss Reward / Revelation Transformation Atonement Return plotModel New plot Name 名前 Meta New step Main Secondary 第二項 Minor 重要ではない plotTreeView Main Secondary 第二項 Minor 重要ではない **Plot:** {} plotsProxyModel Main Secondary 第二項 Minors 重要ではない propertiesView Form POV POV Status 状態 Label ラベル Compile 編纂 Goal 目的 Word count 単語数 references Not a reference: {}. Unknown reference: {}. Path: パス: Stats: POV: POV: Status: 状態: Label: ラベル: Short summary: 短い要約: Long summary: 長い要約: Notes: Basic info 基本情報 Detailed info 詳細情報 POV of: Go to {}. Description 説明 Result 結果 Characters 登場人物 Resolution steps 解決手順 Passion Conflict 対立 <b>Unknown reference:</b> {}. Folder: <b>{}</b> Text: <b>{}</b> Character: <b>{}</b> 登場人物: <b>{}</b> Plot: <b>{}</b> World: <b>{name}</b>{path} 世界:<b>{name}</b>{path} Referenced in: Motivation 動機づけ Goal 目的 Epiphany 本質・意味・悟り Short summary より短い要約 Longer summary より長い要約 revisions Form Options Restore Delete 削除 Show modifications Show ancient version Show spaces 空白を表示 Show modifications only 変更のみを表示 {} years ago {} 年前 {} months ago {} ヶ月前 {} days ago {} 日前 1 day ago 1 日前 {} hours ago {} 時間前 {} minutes ago {} 分前 {} seconds ago {} 秒前 Line {}: 行 {}: Clear all すべて消去 search Form Search for... 検索する... Search in: で検索: All すべて Title 表題 Text テキスト Summary 要約 Notes ノート POV POV Status 状態 Label ラベル Options: Case sensitive 大文字と小文字を区別 settingsWindow New status 新しい状態 New label 新しいラベル newtheme 新しい主題 New theme 新しい主題 (read-only) (読み取り専用) Open Image 画像を開く Image files (*.jpg; *.jpeg; *.png) 画像 (*.jpg; *.jpeg; *.png) Error Error Unable to load selected file 選択したファイルを読み込めませんでした Unable to add selected image: {} 選択した画像を追加できません: {} sldImportance Form TextLabel テキストラベル Minor 重要ではない Secondary 第二項 Main splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> Split '{}' 分割 '{}' Split items 選択した項目を分割する storylineView Form Show Plots プロットを表示 Show Characters 登場人物を表示 tabSplitter Open selected items in that view. この画面で選択した項目を開きます。 Split horizontally 画面を水平方向に分割する Close split 画面の分割を閉じる Split vertically 縦に分割 textEditView Various textFormat Form CTRL+B CTRL+B CTRL+I CTRL+I CTRL+U CTRL+U CTRL+P CTRL+P CTRL+L CTRL+L CTRL+E CTRL+E CTRL+R CTRL+R CTRL+J CTRL+J treeView Expand {} 展開 {} Collapse {} 折り畳む {} Expand All すべて展開 Collapse All すべて折り畳む welcome Form 1 1 Templates テンプレート Empty Novel 小説 Novella 中編小説 Short Story 短編小説 Research paper 研究論文 Demo projects デモプロジェクト Add level レベルを追加 Add word count 増加した単語数 Next time, automatically open last project 次回起動時は、前回終了時に開いていたプロジェクトを自動的に開く Open... 開く... Recent 最近使った Create 作成 Open project プロジェクトを開く Manuskript project (*.msk);;All files (*) Manuskript project (*.msk);;All files (*) Save project as... 名前を付けてプロジェクトを保存... Manuskript project (*.msk) Manuskript project (*.msk) Manuskript Manuskript Create New Project 新しいプロジェクトを作成する Warning 警告 Overwrite existing project {} ? 既存のプロジェクト {} を上書きしますか? Empty fiction Chapter チャプター Scene シーン Trilogy 三部作 Book Section セクション Empty non-fiction words each. 単語 (各項目)。 of Text テキスト Something <b>Total:</b> {} words (~ {} pages) <b>合計:</b> {} 単語 (約 {} ページ) Fiction Non-fiction Idea アイディア Note ノート Research 研究 TODO TODO First draft 初稿 Second draft 第二稿 Final 決定稿 worldModel New item 新しい項目 Fantasy world building 空想の世界を築く Physical 自然 Climate 気候 Topography 地形 Astronomy 天文 Wild life 野生動物 Flora 植物 History 歴史 Races 人種・民族・種族 Diseases 病気 Cultural 文化 Customs 風習 Food Languages 言語 Education 学問 Dresses 服装 Science 科学 Calendar Bodily language 身振り手振り等の仕草による意思の伝え方 Ethics 倫理 Religion 宗教 Government 統治体 Politics 政治 Gender roles 性別による役割 Music and arts 音楽、芸術 Architecture 建築術 Military 軍事 Technology 技術 Courtship 求婚 Demography 人口統計 Transportation 交通 Medicine 医療 Magic system 魔術体系 Rules 規則・規範 Organization 団体 Magical objects 魔術道具 Magical places 魔術の場所 Magical races 魔術による品種 Important places 重要な場所 Important objects 重要な道具 Natural resources 天然資源 manuskript-0.10.0/i18n/manuskript_nb_NO.qm000066400000000000000000001726201354442177200203740ustar00rootroot00000000000000LFTyTVEcVE}VE VEV/sdI!dAdPmdnRoe JZv-5*$(*y)*y **5*%**0++E,+f-+-+.Z+0.3:0ח93^;|A[G:ZGHw9XJ5#J61v83tctML#UAIsV0Wb]1}^GXi@&3tpRrpW^S.wJ>Jk.(^> ʶ'&)kDnP{fJ'!!\ ȳ5Ʃ&n^0J E;FN^<_aNlwp,l.Qq0Gr?wbFp7(!nnn7n\nƁoƦoor/zTɒb2W4IZZZj_jՈ D6Z[76[Z6}Vb7X77788M8~88999::7:\:::\8<<3,\,b\[]]DGt%R%\7Ss8 b=ĚG3{BnSv@D):@3*%NU:/ a/Cs.?˻D}`Mpv!&$'_'3B'3ay'3.+*5!5 @V @V:HuQhDVjW'jzjUjFVjclcHlqzsg\}}Z }ZbXTw4L4 l*GiimM;^N%kM=hjymvugmÊgTNct'%j?/&<5Rߺq^ ~T[Yu:u,*&0a` _:otcrcYTj%Ē~&t/t09$CsLlCsCJCLtM+6FM+R!|Tun3`x؊l^m?$mqmvmymRmmVnPpS.rȒz lzd {~~]~,Zc]SAa.kSDžg0H0dW0֣A֝c`ރI):nnRJ1`Z_z ν2+!bTa$>o I+ǹ'#tq)H@0eĿ1/W1~M,G4Nol+rJ'^rVfySЂ2ϗϗYϗ8$Y@IEc~dS<` Luk5°^UÈv[Уem se< QG=S{!}jk,N3 ǁ7jBnBLHAE,MP[5jo]*Ybhf%~25~2{5~2~dօZZbڬ{WaM(dSnT^V/~,#'ʶm?˙`DcvyYZ .~ s σ! F>  HZxY +4 ?:E Mg2 Mg< Mg Tē X;O ^I ^e ^9 ^ g: r,| x U zi IL  ٰ - l MV %N Ϝ Ueq U> շ z? C 6 ze  ?@ 08= 3o 9sA 9s`b 9s >cO A^ Rb`m Z dpe6 dpe[} dpeu dpe d)z d)| d)} d)* d)1 d)5 d)I d) d)d d) ex lu2| n 7 o"` }(b pB T B; fp *u : : ,* ,@ 8O 8 8 ʶ ֓* U N z+^ = 9=y J( + ;' #e F.f4 Q8, U~#k ]Y l s3 }j9 %r . t- H. H Ӛ fM 5Ў ш OE  G. Ls ڔ# 5/ ub 5{ Y=L _ iCd ӨS y W   Rr /Y 1U 4 \ ;ҡ =fN CjO G Nrz# S]^ Zj Z$[ b i?K pkD rIj }# !T ]* =0 y ~A ~~ ~  Ž ) ޔ c x$ #  sa Ι `c 'j E) $ $E $u $˕ n ,I %% #L s9 sjH s s\ ɠu Ck C C D D? ̺B Cf u *i ʬ QNw  ie g l .  zZ[  F 4} 5N k 7ؤU 87>4J DY: DY; DY; DZ; J KL b] i8: H\ Pп .& S y@   ^c )F 0X Ğt)A <@ <^ < <z < as ⋙F e> N uY0/'a%2#I2)46e39G<+HKRIOqUh\WGX@^`$n   0tR$=jZ<kb̺[a9b9N A <|I S5);=Qk>GB3jBxS#QyR_3@R_1d@ fqnypCt$0|oN~`~`w"|n"|N3i>~5ElC$ttW:,Pi$iگ~<p>En universell dokumentkonverterer. Kan brukes til konvertere Markdown til en rekke andre formater.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> 

A universal document converter. Can be used to convert markdown to a wide range of other formats.

Website: http://pandoc.org/

ExportEt lite kjent format i moderat bruk. Du vet, nettsider for eksempel.EA little known format modestly used. You know, web sites for example.ExportrGrunnleggende HTML-eksport via Python-modulen 'markdown'.5Basic HTML output using the Python module 'markdown'.Export6Bker som ikke dreper trr.Books that don't kill trees.ExportVelg utdatafil &Choose output file…ExportKlasse:Class:Export&Konverter til ePUB3Convert to ePUB3ExportZFeil under behandling av regulrt uttrykk: {})Could not process regular expression: {}ExportForvalgt eksportr, tilbyr grunnleggende format brukt av andre eksportrer.ADefault exporter, provides basic formats used by other exporters.ExportDDisable YAML metadata block. Use that if you get YAML related error.ExportErrorExporthExport to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter.Export Skriftstrrelse: Font size:Export HTML OutputExport HTML SourceExport:Inkluder innholdsfortegnelse.Include a table of contents.ExportJust like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown.ExportbLaTex-motor brukt til produsere PDF-dokumentet.%LaTeX engine used to produce the PDF.ExportLaTeX is a word processor and document markup language used to create beautiful documents.ExportLinjeavstand: Line spacing:ExportMarkdown sourceExportFMicrosoft Office (.docx) -dokument."Microsoft Office (.docx) document.Export<Krever at LaTex er installert.Needs LaTeX to be installed.Export<Normaliser dokumentet (renere) Normalize the document (cleaner)ExportLAantal niveau's voor de inhoudstafel: ,Number of sections level to include in TOC: ExportnOpenDocument-format. Brukt av for eksempel LibreOffice.5OpenDocument format. Used by LibreOffice for example.ExportPapirstrrelse: Paper size:ExportKlartekst Plain textExport4Forhndsvis med framhever.Preview with highlighter.Export0Python-modul 'markdown'.Python module 'markdown'.Export`Frittstende HTML-filer, uten noen avhengigheter/Self-contained HTML files, with no dependenciesExport<Enkleste eksport til kartekst. Tillater deg bruke ditt egen oppmerking, som ikke forsts av Manuskript, for eksempel <a href='www.fountain.io'>Fountain</a>.Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example Fountain.Export0Angi rotniv for hoder: $Specify the base level for headers: ExportZFrittstende dokument (ikke bare et fragment))Standalone document (not just a fragment)ExportThe purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner.Export4Typografisk korrekt utdataTypographically correct outputExportJGebruik <q> tags voor citaten in HTMLUse tags for quotes in HTMLExport*Bruk hoder i ATX-stilUse ATX-style headersExportnBruk lenker i referansestil istedenfor innebygde lenker1Use reference-style links instead of inline linksExporten gyldig LaTeX-installasjon. Pandoc anbefalinger er finne p: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. Hvis du nsker Unicode-sttte, trenger du XeLaTeX.a valid LaTeX installation. Pandoc recommendations can be found on: pandoc.org/installing.html. If you want Unicode support, you need XeLaTeX.ExportZreStructuredText er et lett oppmerkingssprk.2reStructuredText is a lightweight markup language.Export...ExportersManager DescriptionExportersManager(Behandle eksportrerManage ExportersExportersManager ManuskriptExportersManager$Tilbyr eksport tilOffers export toExportersManagerSti:Path:ExportersManagerStatusExportersManagerStatus:ExportersManagerVersion:ExportersManager {HelpText}ExportersManagerAnalyserAnalyzeFrequencyAnalyzer4Unnlat ord (kommainndelt): Exclude words (comma separated):FrequencyAnalyzerFrekvensanalyseFrequency AnalyzerFrequencyAnalyzer$Minimumsstrrelse: Minimum size:FrequencyAnalyzerAntall ord: fraNumber of words: fromFrequencyAnalyzerFrasefrekvensPhrase frequencyFrequencyAnalyzerInnstillingerSettingsFrequencyAnalyzerWord frequencyFrequencyAnalyzertoFrequencyAnalyzerInfo: A very simple parser that will go through a markdown document and create items for each titles.
 Import}Info: Manuskript can import from markdown or OPML. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document.
 ImportR

Info: Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.

Only text files are supported (not images, binary or others).

ImportQ

Should pandoc create cosmetic / non-semantic line-breaks?

auto: wraps at 72 characters.
none: no line wrap.
preserve: tries to preserves line wrap from the original document.

Import*Kommainndelte verdierComma separated valuesImport(Filpning mislyktes.File open failed.ImportMappeimport Folder importImportImport folder then filesImportImport tip as:ImportImporter med: Import using:ImportInclude only those extensions:ImportMarkdown importImportMind Map ImportImportMind Map importImportOPML-import OPML ImportImportPandoc-import Pandoc importImport6Sorter elementer etter navnSort items by nameImport1This does not appear to be a valid Mind Map file.Import^Dette later ikke til vre en gyldig OPML-fil.-This does not appear to be a valid OPML file.ImportUten tittelUntitledImportLinjebryting: Wrap lines:Import$Sett inn referanseInsert referenceMDEditCompleter (~{} pages) MainWindowJ * {} ble ikke funnet i prosjektfila.# * {} wasn't found in project file. MainWindow&Om&About MainWindow&Fet&Bold MainWindow&Jukseark &Cheat sheet MainWindow&Lukk prosjekt&Close project MainWindow$&Kommentarlinje(r)&Comment line(s) MainWindow&Kopier&Copy MainWindow&Delete MainWindow&Rediger&Edit MainWindow"&Skjnnlitteratur&Fiction MainWindow&File MainWindow&Formater&Format MainWindow&Frevensanalyse&Frequency Analyzer MainWindow &Hode&Header MainWindow&Help MainWindow&Importer & &Import… MainWindow&Kursiv&Italic MainWindow &Labels... MainWindow &Niv 1 (setext)&Level 1 (setext) MainWindow&Mode MainWindow&Move Up MainWindow &Navigation MainWindow&Open MainWindow&Anordnet liste &Ordered list MainWindow&Lim inn&Paste MainWindow&Avslutt&Quit MainWindow &Nylig&Recent MainWindow&Gi nytt navn&Rename MainWindow &Lagre&Save MainWindow$&Vis hjelpetekster&Show help texts MainWindow&Enkelt&Simple MainWindow&Stavekontroll &Spellcheck MainWindow&Del opp & &Split… MainWindow &Status... MainWindow&Gjennomstrek&Strike MainWindow&Verkty&Tools MainWindow(&Ikke anordnet liste&Unordered list MainWindow&Verbatim &Verbatim MainWindow&View MainWindowO

One paragraph
summary

 MainWindowN

One sentence
summary

 MainWindowOm ManuskriptAbout Manuskript MainWindow$Legg til plottsteg Add plot step MainWindowAuthor MainWindowB&lokksitat B&lockquote MainWindowBakgrunn Background MainWindowBakgrunnsfargeBackground color MainWindow$Grunnleggende info Basic info MainWindowBokinformasjonBook information MainWindowBoksammendrag Book summary MainWindowKantBorder MainWindowMBuild worlds. Create hierarchy of broad categories down to specific details. MainWindowC&ut MainWindowKarakter(er) Character(s) MainWindow Characters MainWindowTm &formaterClear &formats MainWindowKo&mmentarblokkCo&mment block MainWindow&KompilerCo&mpile MainWindowKompilerCompile MainWindowKonfliktConflict MainWindow HjrneCorner MainWindow'Create the outline of your masterpiece. MainWindow.Opprett dine karaktererCreate your characters. MainWindow Ctrl++Ctrl++ MainWindow Ctrl+-Ctrl+- MainWindow Ctrl+0Ctrl+0 MainWindow Ctrl+1Ctrl+1 MainWindow Ctrl+2Ctrl+2 MainWindow Ctrl+3Ctrl+3 MainWindow Ctrl+4Ctrl+4 MainWindow Ctrl+5Ctrl+5 MainWindow Ctrl+6Ctrl+6 MainWindowCtrl+Alt+1 Ctrl+Alt+1 MainWindowCtrl+Alt+2 Ctrl+Alt+2 MainWindow Ctrl+BCtrl+B MainWindowCtrl+C MainWindowCtrl+D MainWindow Ctrl+ICtrl+I MainWindowCtrl+K MainWindowCtrl+M MainWindowCtrl+O MainWindowCtrl+Q MainWindowCtrl+S MainWindow Ctrl+Shift+B MainWindowCtrl+Shift+C Ctrl+Shift+C MainWindowCtrl+Shift+Down MainWindow Ctrl+Shift+K MainWindow Ctrl+Shift+S MainWindow Ctrl+Shift+Up MainWindowCtrl+V MainWindowCtrl+X MainWindowDebug MainWindowDebug info. Sometimes useful. MainWindowDel MainWindow Description MainWindowDetaljert info Detailed info MainWindowDevelop plots. MainWindow Ordbok Dictionary MainWindow Dupl&icate MainWindowEditor MainWindowEmail MainWindow0Enter information about your book, and yourself. MainWindowpenbarelseEpiphany MainWindowUtvid hver setning fra din enkle avsnittsammendrag til et avsnittAExpand each sentence of your one paragraph summary to a paragraph MainWindowF2 MainWindowF6 MainWindowF7 MainWindowF8 MainWindowF9 MainWindowFilter MainWindowFlatData MainWindowFull MainWindow(Helhetlig sammendrag Full summary MainWindowGeneral MainWindowGenre MainWindowMlGoal MainWindowIcon MainWindow Icon color MainWindowViktighet Importance MainWindow Index cards MainWindowPInstaller {}{} for bruke stavekontrollInstall {}{} to use spellcheck MainWindowN&iv 2L&evel 2 MainWindowLabel MainWindowLabels MainWindowNiv %2 (atx)Level &1 (atx) MainWindowNiv &2Level &2 MainWindowNiv &3Level &3 MainWindowNiv &4Level &4 MainWindowNiv &5Level &5 MainWindowNiv &6Level &6 MainWindow LisensLicense MainWindow &FlettM&erge MainWindow M&ove Down MainWindow Manuskript MainWindowMetadata MainWindowMerMore MainWindowMotivasjon Motivation MainWindowName MainWindowNavnNames MainWindow NesteNext MainWindowNotes MainWindowIngentingNothing MainWindowEi sideOne page MainWindow$nsiderssammendragOne page summary MainWindowEtt avsnitt One paragraph MainWindow0Sammendrag i ett avsnittOne paragraph summary MainWindowEi setning One sentence MainWindow.Sammendrag i ei setningOne sentence summary MainWindow&Organiser Organi&ze MainWindow UtkastOutline MainWindowPOV MainWindowPersonerPersos MainWindowHandlingPlot MainWindowHandlingerPlots MainWindowPopulates with empty data MainWindowFremdriftProgress MainWindowProsjekttre Project tree MainWindowHProsjekt {} innlastet med noen feil.#Project {} loaded with some errors. MainWindowHProsjekt {} innlastet med noen feil:#Project {} loaded with some errors: MainWindow,Prosjekt {} innlastet.Project {} loaded. MainWindow&Prosjekt {} lagret.Project {} saved. MainWindow,Fjern valgte plottstegRemove selected plot step(s) MainWindowLsningsstegResolution steps MainWindowResultatResult MainWindow&Innstillinger S&ettings MainWindow Sa&ve as... MainWindow&SkSea&rch MainWindowSeries MainWindowSituasjon: Situation: MainWindowKonfliktopphavSource of conflict MainWindowSource of passion MainWindowSp&lit at cursor MainWindow Story line MainWindowHe&vet skrift Su&perscript MainWindowSenket sk&rift Subsc&ript MainWindowUndertittelSubtitle MainWindowSammendragSummary MainWindowSammendrag:Summary: MainWindowTake time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. MainWindowText MainWindow Text color MainWindowThe basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) MainWindowtFilen {} finnes ikke. Har den blitt flyttet eller slettet?9The file {} does not exist. Has it been moved or deleted? MainWindow TittelTitle MainWindowTreTree MainWindowLydstyrkeVolume MainWindowJADVARSEL: Prosjekt {} er ikke lagret.WARNING: Project {} not saved. MainWindowHva om &? What if...? MainWindowOrd: {}{} Words: {}{} MainWindow VerdenWorld MainWindow Skriv.Write. MainWindowB{} har ingen installerte ordbker {} has no installed dictionaries MainWindow.{}{} er ikke installert{}{} is not installed MainWindow pxSettings%Settings&Ny stil &New styleSettings&Ingenting&NothingSettings&Vis ordantall&Show word countSettings 1.5 linesSettings

If you check this option, your project will be save as one single file. Easier to copy or backup, but does not allow collaborative editing, or versionning.
If this is unchecked, your project will be save as a folder containing many small files.

SettingsJustering AlignmentSettingsJustering: Alignment:SettingsProgramstilApplication settingsSettingsLegg tilApplySettings^Last inn siste prosjekt automatisk ved oppstart*Automatically load last project on startupSettings*Lagre automatisk hverAutomatically save everySettingsBakgrunn BackgroundSettingsBakgrunnsfarge:Background color:SettingsBakgrunn: Background:Settings Border color:Settings AvbrytCancelSettingsSentrertCenterSettingsSentrertCenteredSettingsColor:SettingsColorsSettingsKompilerCompileSettingsHjrnefarge: Corner color:SettingsHjrneradius:Corner radius:SettingsCtrl+SSettings PekerCursorSettingsDeleteSettingsDisable blinkingSettingsDoubleSettingsRedigerEditSettingsFamilie:Family:SettingsFokusmodus Focus modeSettings MapperFoldersSettingsFontSettings Skriftstrrelse: Font size:SettingsFont:Settings$Fullskjermsvisning FullscreenSettingsGeneralSettings$HovedinnstillingerGeneral settingsSettingsMlGoalSettingsIkonstrrelse Icon SizeSettings Icon color:Settings@Hvis ingenting har endret seg pIf no changes duringSettingsImage:SettingsIndent 1st lineSettings Index cardsSettingsElementfarger Item colorsSettings JusterJustifySettingsKeep revisionsSettingsBehold:Keep:SettingsLabelSettingsLabelsSettings Sprk: Language:SettingsVenstreLeftSettingsLeft/Right margins:Settings LinjeLineSettings Line spacing:Settings LasterLoadingSettingsMargins:Settings Max widthSettingsFeilstavet: Misspelled:SettingsNewSettingsNo ImageSettings IngenNoneSettingsIngentingNothingSettingsGammel st&il Old st&yleSettingsDekkevne:Opacity:SettingsOutlineSettingsPOVSettingsPadding:SettingsParagraf ParagraphSettingsAvsnittsvalgParagraph OptionsSettingsAvsnitt ParagraphsSettingsProsentsats PercentageSettings Position:SettingsFramdriftProgressSettings ProportionalSettingsDet kan hende du m starte Manuskript p ny for at endringene skal tre i effekt ordentlig.7Restarting Manuskript ensures all settings take effect.Settings&Gjenopprett forvalgRestore defaultsSettings RevisionsSettingsRevisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions.SettingsRightSettingsS&how progressSettings&Smart fjerning S&mart removeSettings(Lagre ved avslutning Save on quitSettingsLagre i ei filSave to one single fileSettings LagrerSavingSettingsSkalertScaledSettingsSetningSentenceSettingsInnstillingerSettingsSettingsVis &ordantallShow &word countSettingsShow ite&m countSettingsVis f&remdriftShow p&rogressSettingsVis sammendr&ag Show summar&ySettingsVis sammendrag Show summarySettingsSingleSettingsStrrelse:Size:SettingsSmart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes.SettingsSpacing:SettingsStatusSettingsStrukket StretchedSettingsStyleSettingsStilStyle:Settings Tab width:SettingsTextSettingsTekstbakgrunnText BackgroundSettings Text OptionsSettings Text areaSettings Text color:Settings Text editorSettings TextLabelSettings Theme name:SettingsTiledSettings TittelTitleSettingsTop/Bottom margins:SettingsGjennomsiktig TransparentSettingsTreeSettingsType:Settings$SkrivemaskinsmodusTypewriter modeSettingsUse block insertion ofSettingsViewsSettingsViews settingsSettings Synlige kolonnerVisible columnsSettingsBredde:Width:SettingsVindusbakgrunnWindow BackgroundSettingsAntall ord Word countSettingsForstrretZoomedSettingsminutes.Settings*revisions per 10 minutes for the last hourSettings$revisions per day for the last monthSettings#revisions per hour for the last daySettings,revisions per minute for the last 10 minutesSettings'revisions per week till the end of timeSettingssekunder.seconds.Settings$&Legg til i ordbok&Add to dictionary SpellAction&Remove from custom dictionary SpellActionSpelling Suggestions SpellActionOm ManuskriptAbout Manuskriptabout Manuskriptabout8Programvareversjoner i bruk:Software Versions in Use: aboutDialogVersion aboutDialogKompilerCompile abstractModelMlGoal abstractModelLabel abstractModelPOV abstractModelStatus abstractModel TittelTitle abstractModelAntall ord Word count abstractModel8Lastet inn oversettelse: {}.Loaded translation from {}: {}.appMerk: Fant ingen oversetter, eller lastet fra {} for lokaliteten {}.:Note: No translator found or loaded from {} for locale {}.appNSammendrag bestende av noen setninger:Few sentences summary: basicItemView SkjemaForm basicItemViewMl:Goal: basicItemView$nlinjessammendragOne line summary basicItemViewPOV: basicItemViewAntall ord Word count basicItemViewNamecharacterModelNytt tegn New charactercharacterModel VerdiValuecharacterModel HovedMaincharacterTreeViewMinorcharacterTreeViewSekundr SecondarycharacterTreeViewTegn Characters cheatSheetfFiltrer (skriv inn navnet p noe i prosjektet ditt)2Filter (type the name of anything in your project) cheatSheet SkjemaForm cheatSheet HovedMain cheatSheetMinor cheatSheet PlottPlots cheatSheetSekundr Secondary cheatSheetTeksterTexts cheatSheetWorld cheatSheet HovedMaincmbOutlineCharacterChoserMinorcmbOutlineCharacterChoserNonecmbOutlineCharacterChoserSekundr SecondarycmbOutlineCharacterChoserYmseVariouscmbOutlineCharacterChoserYmseVariouscmbOutlineLabelChoserYmseVariouscmbOutlineStatusChoserDock Widgets ToolbarcollapsibleDockWidgets SkjemaForm completer,Fullstendig sammendrag Full summary corkDelegate$nlinjessammendragOne line summary corkDelegate SkjemaFormeditorWidget_uiExportexporter Export to:exporter&Hndter eksportrerManage exportersexporterForhndsvisPreviewexporterInnstillingerSettingsexporter{} (not implemented yet)exporterDialog

Filters what items will be included in the final export.
(Not fully implemented yet.)

exporterSettingsBetween folder and text:exporterSettingsMellom mapper:Between folders:exporterSettingsBetween text and folder:exporterSettingsMellom tekster:Between texts:exporterSettingsContentexporterSettingsEgendefinertCustomexporterSettingsCustom replacements:exporterSettings6Decide here what will be included in the final export.exporterSettingsTom linje Empty lineexporterSettingsPskruddEnabledexporterSettingsFi<ersexporterSettings MappeFolderexporterSettingsFontexporterSettings Skriftstrrelse: Font size:exporterSettingsFont:exporterSettingsFormexporterSettingsI need more granularityexporterSettingsZIf checked, uses regular expression for replacement. If unchecked, replaced as plain text.exporterSettings)Ignore compile status (include all items)exporterSettingsLabelsexporterSettingsPreviewexporterSettingsRegExpexporterSettingsRemove multiple spacesexporterSettingsErstattReplaceexporterSettings"Erstatt --- med Replace --- with —exporterSettings"Erstatt ... med &Replace ... with …exporterSettingsReplace double quotes (") with:exporterSettingsReplace single quotes (') with:exporterSettingsInndelinger SeparationsexporterSettingsStatusexporterSettings Subitems of:exporterSettingsTextexporterSettings TittelTitleexporterSettingsTransformationsexporterSettingsTypeexporterSettingsTypographic replacements:exporterSettingsWithexporterSettings{}Niv {} mappe{}Level {} folderexporterSettings{}Level {} textexporterSettings<b>Krever:</b> Requires: exportersManagerStatus: uninstalled.exportersManagerEgendefinertCustomexportersManagerInstallert InstalledexportersManagerIkke funnet Not foundexportersManagerSet {} executable path.exportersManager/{} not found. Install it, or set path manually.exportersManager FrequencyfrequencyAnalyzerPhrasesfrequencyAnalyzerWordfrequencyAnalyzer KlokkeClockfullScreenEditor(Klokke: Vis sekunderClock: Show SecondsfullScreenEditorNavigasjon NavigationfullScreenEditorNy tekstNew TextfullScreenEditorFramdriftProgressfullScreenEditorLFramdrift: Automatisk visning/skjulingProgress: Auto Show/HidefullScreenEditorStavekontroll SpellcheckfullScreenEditorDraktvalgTheme selectorfullScreenEditorTheme:fullScreenEditor TittelTitlefullScreenEditor(Tittel: Vis full stiTitle: Show Full PathfullScreenEditorOrdtelling Word countfullScreenEditor {} ord{} wordsfullScreenEditor {} words / {}fullScreenEditorGeneralgeneralSettingsImport in a top-level foldergeneralSettings Import under:generalSettingsSplit scenes at:generalSettingsTrim long titles (> 32 chars)generalSettings\n---\ngeneralSettings8If you don't wanna see me, you can hide me in Help menu. helpLabelVelg fil Choose fileimporter Clear fileimporterFormat:importerImportimporterPreviewimporterSettingsimporter:Sist brukte mappe "{}" valgt.$Last accessed directory "{}" loaded.lastAccessedDirectoryInfoVarious lineEditView minuteslocker wordslockerFormlockerLock !locker Lock screen:locker Time targetlocker Word targetlocker{} gjenstr {} remaininglocker{} s.locker{} ord gjenstr{} words remaininglocker{}:{}locker~{} h.locker~{} mn.lockerAlt+Up mainEditorF11 mainEditor SkjemaForm mainEditorGo to parent item mainEditorIndekskort Index cards mainEditorOutline mainEditorRoot mainEditorText mainEditor{} ord  {} words  mainEditor{} ord / {} {} words / {}  mainEditorMarkdownmarkdownSettings SkjemaForm metadataView,Fullstendig sammendrag Full summary metadataViewNotes / References metadataView$nlinjessammendragOne line summary metadataView Properties metadataViewRevisjoner Revisions metadataViewSammendragSummary metadataView Auto-hidemyPanel&Kopier&Copy outlineBasics&Delete outlineBasics&Lim inn&Paste outlineBasics&Gi nytt navn&Rename outlineBasicsD

You're about to delete {} item(s).

Are you sure?

 outlineBasics$Iferd med fjerneAbout to remove outlineBasicsUkjent referanse:</b> {}.Unknown reference: {}. references$Grunnleggende info Basic info referencesCharacter: {} references Characters referencesKonfliktConflict references Description referencesDetaljert info Detailed info referencespenbaringEpiphany references Mappe: <b>{}</b>Folder: {} references Go to {}. referencesMlGoal referencesLabel: references"Langt sammendrag: Long summary: references"Lengre sammendragLonger summary referencesMotivasjon Motivation referencesNot a reference: {}. referencesNotes: referencesPOV of: referencesPOV: referencesPassion referencesSti:Path: references Plott: <b>{}</b>Plot: {} referencesReferenced in: referencesResolution steps referencesResultatResult referencesKort sammendrag Short summary references Kort sammendrag:Short summary: referencesStats: referencesStatus: referencesText: {} referencesUnknown reference: {}. referencesWorld: {name}{path} references i gr 1 day ago revisionsTm alt Clear all revisionsDelete revisionsForm revisionsLine {}: revisionsOptions revisionsRestore revisionsShow ancient version revisionsVis endringerShow modifications revisionsShow modifications only revisions Show spaces revisions{} dager siden {} days ago revisions{} timer siden {} hours ago revisions"{} minutter siden{} minutes ago revisions {} months ago revisions"{} sekunder siden{} seconds ago revisions {} years ago revisionsAlleAllsearchCase sensitivesearch SkjemaFormsearchLabelsearchNotessearchOptions:searchPOVsearchSk etter & Search for...search Sk i: Search in:searchStatussearchSammendragSummarysearchTextsearch TittelTitlesearch (read-only)settingsWindowFeilErrorsettingsWindowBBildefiler (*.jpg; *.jpeg; *.png)"Image files (*.jpg; *.jpeg; *.png)settingsWindow New labelsettingsWindow New statussettingsWindow New themesettingsWindowpne bilde Open ImagesettingsWindowHKunne ikke legge til valgt bilde: {} Unable to add selected image: {}settingsWindow<Kunne ikke laste inn valgt filUnable to load selected filesettingsWindownewthemesettingsWindowForm sldImportance HovedMain sldImportanceMinor sldImportance Secondary sldImportance TextLabel sldImportance <p>Del valgte element(er) ved gitt merke.</p> <p>Hvis ett av de valgte elementene er en mappe, vil det bli utfrt rekursivt for <i>alle</i> dens underelementer.</p> <p>Delingsmerket kan inneholde flgende skiftesekvenser: <ul> <li><b><code>\n</code></b>: Linjeskift</li> <li><b><code>\t</code></b>: Tab</li> </ul> </p> <p><b>Merke:</b></p> 

Split selected item(s) at the given mark.

If one of the selected item is a folder, it will be applied recursively to all of it's children items.

The split mark can contain following escape sequences:

  • \n: line break
  • \t: tab

Mark:

 splitDialogDel '{}' Split '{}' splitDialog Split items splitDialogForm storylineViewShow Characters storylineView Show Plots storylineView Close split tabSplitter!Open selected items in that view. tabSplitterDel vannrettSplit horizontally tabSplitterDel loddrettSplit vertically tabSplitterYmseVarious textEditViewCTRL+B textFormatCTRL+E textFormatCTRL+I textFormatCTRL+J textFormatCTRL+L textFormatCTRL+P textFormatCTRL+R textFormatCTRL+U textFormatForm textFormat Fold sammen alle Collapse AlltreeViewFold sammen {} Collapse {}treeViewUtvid alle Expand AlltreeViewUtvid {} Expand {}treeView1welcome#Total: {} words (~ {} pages)welcomeLegg til niv Add levelwelcome$Legg til ordantallAdd word countwelcomeBookwelcomeChapterwelcomeOpprettCreatewelcome*Opprett nytt prosjektCreate New ProjectwelcomeDemoprosjekter Demo projectswelcomeTomEmptywelcome Empty fictionwelcomeEmpty non-fictionwelcomeFictionwelcomeSluttproduktFinalwelcomeFrste utkast First draftwelcome SkjemaFormwelcomeIdeawelcome Manuskriptwelcome6Manuskript-prosjekt (*.msk)Manuskript project (*.msk)welcomeVManuskript-prosjekt (*.msk);;Alle filer (*))Manuskript project (*.msk);;All files (*)welcome*Next time, automatically open last projectwelcome Non-fictionwelcomeNotewelcome RomanNovelwelcomeNovelleNovellawelcome Open projectwelcomeOpen...welcomeFOverskriv eksisterende prosjekt {}?Overwrite existing project {} ?welcomeRecentwelcomeResearchwelcomeResearch paperwelcome&Lagre prosjekt som &Save project as...welcomeScenewelcomeAndre utkast Second draftwelcomeAvsnittSectionwelcome Short StorywelcomeNoe SomethingwelcomeTODOwelcome Maler TemplateswelcomeTextwelcomeTrilogiTrilogywelcomeAdvarselWarningwelcomeofwelcomeord hver. words each.welcomeArkitektur Architecture worldModelAstronomi Astronomy worldModelKroppssprkBodily language worldModelKalenderCalendar worldModelClimate worldModelOppvartning Courtship worldModel*Kulturelle egenskaperCultural worldModelSkikkerCustoms worldModelDemografi Demography worldModelSykdommerDiseases worldModelBekledningDresses worldModelUtdanning Education worldModel EtikkEthics worldModelFantasy world building worldModelFlora worldModelMatFood worldModelKjnnsroller Gender roles worldModelMyndigheter Government worldModelHistorikkHistory worldModel Viktige objekterImportant objects worldModelViktige stederImportant places worldModel Sprk Languages worldModelMagisystem Magic system worldModel Magiske objekterMagical objects worldModelMagiske stederMagical places worldModelMagiske raser Magical races worldModelMedisinMedicine worldModelMilitrMilitary worldModelMusikk og kunstMusic and arts worldModelNaturressurserNatural resources worldModelNew item worldModelOrganisasjon Organization worldModelPhysical worldModelPolitikkPolitics worldModel RaserRaces worldModelReligion worldModel ReglerRules worldModelForskningScience worldModel Technology worldModel Topography worldModelTransportTransportation worldModelDyreliv Wild life worldModelmanuskript-0.10.0/i18n/manuskript_nb_NO.ts000066400000000000000000005244261354442177200204120ustar00rootroot00000000000000 Export Basic HTML output using the Python module 'markdown'. Grunnleggende HTML-eksport via Python-modulen 'markdown'. Python module 'markdown'. Python-modul 'markdown'. Markdown source HTML Source HTML Output Default exporter, provides basic formats used by other exporters. Forvalgt eksportør, tilbyr grunnleggende format brukt av andre eksportører. Preview with highlighter. Forhåndsvis med framhever. Plain text Klartekst A little known format modestly used. You know, web sites for example. Et lite kjent format i moderat bruk. Du vet, nettsider for eksempel. Needs LaTeX to be installed. Krever at LaTex er installert. Error Standalone document (not just a fragment) Frittstående dokument (ikke bare et fragment) Include a table of contents. Inkluder innholdsfortegnelse. Number of sections level to include in TOC: Aantal niveau's voor de inhoudstafel: Typographically correct output Typografisk korrekt utdata Normalize the document (cleaner) Normaliser dokumentet (renere) Specify the base level for headers: Angi rotnivå for hoder: Use reference-style links instead of inline links Bruk lenker i referansestil istedenfor innebygde lenker Use ATX-style headers Bruk hoder i ATX-stil Self-contained HTML files, with no dependencies Frittstående HTML-filer, uten noen avhengigheter Use <q> tags for quotes in HTML Gebruik <q> tags voor citaten in HTML LaTeX engine used to produce the PDF. LaTex-motor brukt til å produsere PDF-dokumentet. Paper size: Papirstørrelse: Font size: Skriftstørrelse: Class: Klasse: Line spacing: Linjeavstand: Books that don't kill trees. Bøker som ikke dreper trær. OpenDocument format. Used by LibreOffice for example. OpenDocument-format. Brukt av for eksempel LibreOffice. Microsoft Office (.docx) document. Microsoft Office (.docx) -dokument. reStructuredText is a lightweight markup language. reStructuredText er et lett oppmerkingsspråk. Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. Enkleste eksport til kartekst. Tillater deg å bruke ditt egen oppmerking, som ikke forstås av Manuskript, for eksempel <a href='www.fountain.io'>Fountain</a>. <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> <p>En universell dokumentkonverterer. Kan brukes til å konvertere Markdown til en rekke andre formater.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. en gyldig LaTeX-installasjon. Pandoc anbefalinger er å finne på: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. Hvis du ønsker Unicode-støtte, trenger du XeLaTeX. Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. LaTeX is a word processor and document markup language used to create beautiful documents. The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. Disable YAML metadata block. Use that if you get YAML related error. Convert to ePUB3 Konverter til ePUB3 Could not process regular expression: {} Feil under behandling av regulært uttrykk: {} Choose output file… Velg utdatafil… ExportersManager Manage Exporters Behandle eksportører Manuskript Description Offers export to Tilbyr eksport til Status Status: Version: Path: Sti: ... {HelpText} FrequencyAnalyzer Frequency Analyzer Frekvensanalyse Word frequency Settings Innstillinger Minimum size: Minimumsstørrelse: Exclude words (comma separated): Unnlat ord (kommainndelt): Analyze Analyser Phrase frequency Frasefrekvens Number of words: from Antall ord: fra to Import Markdown import <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; Folder import Mappeimport <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> Include only those extensions: Comma separated values Kommainndelte verdier Sort items by name Sorter elementer etter navn Import folder then files OPML Import OPML-import File open failed. Filåpning mislyktes. This does not appear to be a valid OPML file. Dette later ikke til å være en gyldig OPML-fil. Pandoc import Pandoc-import <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; Import using: Importer med: Wrap lines: Linjebryting: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> Mind Map Import This does not appear to be a valid Mind Map file. Mind Map import Import tip as: Untitled Uten tittel MDEditCompleter Insert reference Sett inn referanse MainWindow General Title Tittel Subtitle Undertittel Series Volume Lydstyrke Genre License Lisens Author Name Email Summary Sammendrag Situation: Situasjon: Summary: Sammendrag: One sentence Ei setning One paragraph Ett avsnitt One page Ei side Full One sentence summary Sammendrag i ei setning One paragraph summary Sammendrag i ett avsnitt Expand each sentence of your one paragraph summary to a paragraph Utvid hver setning fra din enkle avsnittsammendrag til et avsnitt One page summary Énsiderssammendrag Full summary Helhetlig sammendrag Next Neste What if...? Hva om…? Characters Names Navn Filter Basic info Grunnleggende info Importance Viktighet Motivation Motivasjon Goal Mål Conflict Konflikt Epiphany Åpenbarelse <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> Notes Detailed info Detaljert info Plots Handlinger Plot Handling Character(s) Karakter(er) Description Result Resultat Resolution steps Løsningssteg World Verden Populates with empty data More Mer Source of passion Source of conflict Konfliktopphav Outline Utkast Editor Debug FlatData Persos Personer Labels &File &Recent &Nylig &Help &Tools &Verktøy &Edit &Rediger &View &Mode &Cheat sheet &Jukseark Sea&rch &Søk &Navigation &Open Ctrl+O &Save &Lagre Ctrl+S Sa&ve as... Ctrl+Shift+S &Quit &Avslutt Ctrl+Q &Show help texts &Vis hjelpetekster Ctrl+Shift+B &Spellcheck &Stavekontroll F9 &Labels... &Status... Tree Tre &Simple &Enkelt &Fiction &Skjønnlitteratur Index cards S&ettings &Innstillinger F8 &Close project &Lukk prosjekt Co&mpile &Kompiler F6 &Frequency Analyzer &Frevensanalyse Book information Bokinformasjon &About &Om About Manuskript Om Manuskript Manuskript Project {} saved. Prosjekt {} lagret. WARNING: Project {} not saved. ADVARSEL: Prosjekt {} er ikke lagret. Project {} loaded. Prosjekt {} innlastet. Project {} loaded with some errors: Prosjekt {} innlastet med noen feil: * {} wasn't found in project file. * {} ble ikke funnet i prosjektfila. Project {} loaded with some errors. Prosjekt {} innlastet med noen feil. (~{} pages) Words: {}{} Ord: {}{} Book summary Boksammendrag Project tree Prosjekttre Metadata Story line Enter information about your book, and yourself. The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Create your characters. Opprett dine karakterer Develop plots. Build worlds. Create hierarchy of broad categories down to specific details. Create the outline of your masterpiece. Write. Skriv. Debug info. Sometimes useful. Dictionary Ordbok Nothing Ingenting POV Label Progress Fremdrift Compile Kompiler Icon color Text color Background color Bakgrunnsfarge Icon Text Background Bakgrunn Border Kant Corner Hjørne Add plot step Legg til plottsteg &Import… &Importer… F7 &Copy &Kopier Ctrl+C C&ut Ctrl+X &Paste &Lim inn Ctrl+V &Split… &Del opp… Ctrl+Shift+K Sp&lit at cursor Ctrl+K Ctrl+M Ctrl+D Del &Move Up Ctrl+Shift+Up M&ove Down Ctrl+Shift+Down Dupl&icate &Delete &Rename &Gi nytt navn F2 Organi&ze &Organiser M&erge &Flett &Format &Formater &Header &Hode &Level 1 (setext) &Nivå 1 (setext) Ctrl+Alt+1 Ctrl+Alt+1 Level &2 Nivå &2 Ctrl+Alt+2 Ctrl+Alt+2 Level &1 (atx) Nivå %2 (atx) Ctrl+1 Ctrl+1 L&evel 2 N&ivå 2 Ctrl+2 Ctrl+2 Level &3 Nivå &3 Ctrl+3 Ctrl+3 Level &4 Nivå &4 Ctrl+4 Ctrl+4 Level &5 Nivå &5 Ctrl+5 Ctrl+5 Level &6 Nivå &6 Ctrl+6 Ctrl+6 &Bold &Fet Ctrl+B Ctrl+B &Italic &Kursiv Ctrl+I Ctrl+I &Strike &Gjennomstrek &Verbatim &Verbatim Su&perscript He&vet skrift Ctrl++ Ctrl++ Subsc&ript Senket sk&rift Ctrl+- Ctrl+- Co&mment block Ko&mmentarblokk Ctrl+Shift+C Ctrl+Shift+C Clear &formats Tøm &formater Ctrl+0 Ctrl+0 &Comment line(s) &Kommentarlinje(r) &Ordered list &Anordnet liste &Unordered list &Ikke anordnet liste B&lockquote B&lokksitat Remove selected plot step(s) Fjern valgte plottsteg The file {} does not exist. Has it been moved or deleted? Filen {} finnes ikke. Har den blitt flyttet eller slettet? Install {}{} to use spellcheck Installer {}{} for å bruke stavekontroll {} has no installed dictionaries {} har ingen installerte ordbøker {}{} is not installed {}{} er ikke installert Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings Settings Innstillinger General Revisions Views Labels Status Fullscreen Fullskjermsvisning General settings Hovedinnstillinger Application settings Programstil Loading Laster Automatically load last project on startup Last inn siste prosjekt automatisk ved oppstart Saving Lagrer Automatically save every Lagre automatisk hver minutes. If no changes during Hvis ingenting har endret seg på seconds. sekunder. Save on project close Lagre ved avslutning <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> Save to one single file Lagre i ei fil Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. Keep revisions S&mart remove &Smart fjerning Keep: Behold: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. revisions per day for the last month revisions per minute for the last 10 minutes revisions per hour for the last day revisions per 10 minutes for the last hour revisions per week till the end of time Views settings Tree Colors Icon color: Nothing Ingenting POV Label Progress Framdrift Compile Kompiler Text color: Background color: Bakgrunnsfarge: Folders Mapper Show ite&m count Show summary Vis sammendrag &Nothing &Ingenting Text Outline Visible columns Synlige kolonner Goal Mål Word count Antall ord Percentage Prosentsats Title Tittel Index cards Item colors Elementfarger Border color: Corner color: Hjørnefarge: Background Bakgrunn Color: Ctrl+S Image: Text editor Font Family: Familie: Size: Størrelse: Misspelled: Feilstavet: Background: Bakgrunn: Paragraphs Avsnitt Line spacing: Single 1.5 lines Double Proportional % Tab width: px Indent 1st line Spacing: New Edit Rediger Delete Theme name: Apply Legg til Cancel Avbryt Window Background Vindusbakgrunn Text Background Tekstbakgrunn Text Options Paragraph Options Avsnittsvalg Type: No Image Tiled Centered Sentrert Stretched Strukket Scaled Skalert Zoomed Forstørret Opacity: Dekkevne: Position: Left Venstre Center Sentrert Right Width: Bredde: Corner radius: Hjørneradius: Margins: Padding: Font: Style Cursor Peker Use block insertion of Alignment: Justering: Justify Juster Alignment Justering Icon Size Ikonstørrelse TextLabel Disable blinking Text area Max width Left/Right margins: Top/Bottom margins: S&how progress Show summar&y Vis sammendr&ag Show p&rogress Vis f&remdrift Old st&yle Gammel st&il Transparent Gjennomsiktig Restore defaults Gjenopprett forvalg Style: Stil Language: Språk: Font size: Skriftstørrelse: Restarting Manuskript ensures all settings take effect. Det kan hende du må starte Manuskript på ny for at endringene skal tre i effekt ordentlig. Show &word count Vis &ordantall &Show word count &Vis ordantall &New style &Ny stil Typewriter mode Skrivemaskinsmodus Focus mode Fokusmodus None Ingen Sentence Setning Line Linje Paragraph Paragraf <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions &Add to dictionary &Legg til i ordbok &Remove from custom dictionary about About Manuskript Om Manuskript Manuskript aboutDialog Version Software Versions in Use: Programvareversjoner i bruk: abstractModel Title Tittel POV Label Status Compile Kompiler Word count Antall ord Goal Mål basicItemView Form Skjema POV: Goal: Mål: Word count Antall ord One line summary Énlinjessammendrag Few sentences summary: Sammendrag bestående av noen setninger: characterModel New character Nytt tegn Name Value Verdi characterTreeView Main Hoved Secondary Sekundær Minor cheatSheet Form Skjema Filter (type the name of anything in your project) Filtrer (skriv inn navnet på noe i prosjektet ditt) Minor Secondary Sekundær Main Hoved Characters Tegn Texts Tekster Plots Plott World cmbOutlineCharacterChoser None Main Hoved Secondary Sekundær Minor Various Ymse cmbOutlineLabelChoser Various Ymse cmbOutlineStatusChoser Various Ymse collapsibleDockWidgets Dock Widgets Toolbar completer Form Skjema corkDelegate One line summary Énlinjessammendrag Full summary Fullstendig sammendrag editorWidget_ui Form Skjema exporter Export Export to: Manage exporters Håndter eksportører Preview Forhåndsvis Settings Innstillinger exporterDialog {} (not implemented yet) exporterSettings Form Content Decide here what will be included in the final export. Type Title Tittel Text I need more granularity Fi&lters <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> Ignore compile status (include all items) Subitems of: Labels Status Separations Inndelinger Between folders: Mellom mapper: Empty line Tom linje Custom Egendefinert Between texts: Mellom tekster: Between folder and text: Between text and folder: Transformations Typographic replacements: Replace double quotes (") with: Replace single quotes (') with: Remove multiple spaces Custom replacements: Enabled Påskrudd Replace Erstatt With RegExp If checked, uses regular expression for replacement. If unchecked, replaced as plain text. Preview Font Font: Font size: Skriftstørrelse: Folder Mappe {}Level {} folder {}Nivå {} mappe {}Level {} text Replace ... with … Erstatt ... med … Replace --- with — Erstatt --- med — exportersManager Installed Installert Custom Egendefinert Not found Ikke funnet {} not found. Install it, or set path manually. <b>Status:</b> uninstalled. <b>Requires:</b> <b>Krever:</b> Set {} executable path. frequencyAnalyzer Phrases Frequency Word fullScreenEditor Theme: {} words / {} {} words {} ord Spellcheck Stavekontroll Navigation Navigasjon New Text Ny tekst Title Tittel Title: Show Full Path Tittel: Vis full sti Theme selector Draktvalg Word count Ordtelling Progress Framdrift Progress: Auto Show/Hide Framdrift: Automatisk visning/skjuling Clock Klokke Clock: Show Seconds Klokke: Vis sekunder generalSettings General Split scenes at: \n---\n Trim long titles (> 32 chars) Import under: Import in a top-level folder helpLabel If you don't wanna see me, you can hide me in Help menu. importer Import Format: Choose file Velg fil Clear file Preview Settings lastAccessedDirectoryInfo Last accessed directory "{}" loaded. Sist brukte mappe "{}" valgt. lineEditView Various locker Form Lock screen: Word target Time target words minutes Lock ! ~{} h. ~{} mn. {}:{} {} s. {} remaining {} gjenstår {} words remaining {} ord gjenstår mainEditor Form Skjema Text Index cards Indekskort Outline F11 Go to parent item Alt+Up Root {} words / {} {} ord / {} {} words {} ord markdownSettings Markdown metadataView Form Skjema Properties Summary Sammendrag One line summary Énlinjessammendrag Full summary Fullstendig sammendrag Notes / References Revisions Revisjoner myPanel Auto-hide outlineBasics Set POV None Set Status Set Label New Main Hoved Secondary Sekundær Minor Set Custom Icon Sett egendefinert ikon Restore to default Tilbakestill til forvalg Root Open {} items in new tabs Open {} in a new tab About to remove Iferd med å fjerne <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> Select at least two items. Folders are ignored. All items must be on the same level (share the same parent). New &Folder Ny &mappe New &Text &Copy &Kopier C&ut &Paste &Lim inn &Rename &Gi nytt navn &Delete outlineCharacterDelegate None Main Hoved Secondary Sekundær Minor outlineItem {} words / {} ({}) {} ord / {} ({}) {} words {} ord pandocSettings General Table of Content Custom settings for {} Egendefinerte innstillinger for {} persosProxyModel Main Hoved Secondary Sekundær Minors plotDelegate General Promise Løfte Problem Progress Framdrift Resolution Løsning Try / Fail Prøv / feil No and Nei, og Yes but Ja, men Freytag's pyramid Exposition Rising action Climax Falling action Three acts 1. Setup 1. Oppsett 1. Inciting event 1. Igangsettende hendelse 1. Turning point 1. Vendepunkt 2. Choice 2. Valg 2. Reversal 2. Disaster 2. Katastrofe 3. Stand up 3. Climax 3. Ending 3. Slutt Hero's journey Ordinary world Call to adventure Refusal of the call Meeting with mentor Tests Tester Approach Abyss Reward / Revelation Transformation Atonement Return plotModel New plot Name Meta New step Main Secondary Minor plotTreeView Main Secondary Minor **Plot:** {} plotsProxyModel Main Secondary Sekundær Minors propertiesView Form POV Status Label Compile Goal Word count references Not a reference: {}. Unknown reference: {}. Path: Sti: Stats: POV: Status: Label: Short summary: Kort sammendrag: Long summary: Langt sammendrag: Notes: Basic info Grunnleggende info Detailed info Detaljert info POV of: Go to {}. Description Result Resultat Characters Resolution steps Passion Conflict Konflikt <b>Unknown reference:</b> {}. <b>Ukjent referanse:</b> {}. Folder: <b>{}</b> Mappe: <b>{}</b> Text: <b>{}</b> Character: <b>{}</b> Plot: <b>{}</b> Plott: <b>{}</b> World: <b>{name}</b>{path} Referenced in: Motivation Motivasjon Goal Mål Epiphany Åpenbaring Short summary Kort sammendrag Longer summary Lengre sammendrag revisions Form Options Restore Delete Show modifications Vis endringer Show ancient version Show spaces Show modifications only {} years ago {} months ago {} days ago {} dager siden 1 day ago i går {} hours ago {} timer siden {} minutes ago {} minutter siden {} seconds ago {} sekunder siden Line {}: Clear all Tøm alt search Form Skjema Search for... Søk etter… Search in: Søk i: All Alle Title Tittel Text Summary Sammendrag Notes POV Status Label Options: Case sensitive settingsWindow New status New label newtheme New theme (read-only) Open Image Åpne bilde Image files (*.jpg; *.jpeg; *.png) Bildefiler (*.jpg; *.jpeg; *.png) Error Feil Unable to load selected file Kunne ikke laste inn valgt fil Unable to add selected image: {} Kunne ikke legge til valgt bilde: {} sldImportance Form TextLabel Minor Secondary Main Hoved splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> <p>Del valgte element(er) ved gitt merke.</p> <p>Hvis ett av de valgte elementene er en mappe, vil det bli utført rekursivt for <i>alle</i> dens underelementer.</p> <p>Delingsmerket kan inneholde følgende skiftesekvenser: <ul> <li><b><code>\n</code></b>: Linjeskift</li> <li><b><code>\t</code></b>: Tab</li> </ul> </p> <p><b>Merke:</b></p> Split '{}' Del '{}' Split items storylineView Form Show Plots Show Characters tabSplitter Open selected items in that view. Split horizontally Del vannrett Close split Split vertically Del loddrett textEditView Various Ymse textFormat Form CTRL+B CTRL+I CTRL+U CTRL+P CTRL+L CTRL+E CTRL+R CTRL+J treeView Expand {} Utvid {} Collapse {} Fold sammen {} Expand All Utvid alle Collapse All Fold sammen alle welcome Form Skjema 1 Templates Maler Empty Tom Novel Roman Novella Novelle Short Story Research paper Demo projects Demoprosjekter Add level Legg til nivå Add word count Legg til ordantall Next time, automatically open last project Open... Recent Create Opprett Open project Manuskript project (*.msk);;All files (*) Manuskript-prosjekt (*.msk);;Alle filer (*) Save project as... Lagre prosjekt som… Manuskript project (*.msk) Manuskript-prosjekt (*.msk) Manuskript Create New Project Opprett nytt prosjekt Warning Advarsel Overwrite existing project {} ? Overskriv eksisterende prosjekt {}? Empty fiction Chapter Scene Trilogy Trilogi Book Section Avsnitt Empty non-fiction words each. ord hver. of Text Something Noe <b>Total:</b> {} words (~ {} pages) Fiction Non-fiction Idea Note Research TODO First draft Første utkast Second draft Andre utkast Final Sluttprodukt worldModel New item Fantasy world building Physical Climate Topography Astronomy Astronomi Wild life Dyreliv Flora History Historikk Races Raser Diseases Sykdommer Cultural Kulturelle egenskaper Customs Skikker Food Mat Languages Språk Education Utdanning Dresses Bekledning Science Forskning Calendar Kalender Bodily language Kroppsspråk Ethics Etikk Religion Government Myndigheter Politics Politikk Gender roles Kjønnsroller Music and arts Musikk og kunst Architecture Arkitektur Military Militær Technology Courtship Oppvartning Demography Demografi Transportation Transport Medicine Medisin Magic system Magisystem Rules Regler Organization Organisasjon Magical objects Magiske objekter Magical places Magiske steder Magical races Magiske raser Important places Viktige steder Important objects Viktige objekter Natural resources Naturressurser manuskript-0.10.0/i18n/manuskript_nl.qm000066400000000000000000001404211354442177200200040ustar00rootroot00000000000000-LA"TbT2VEeVE~&VEVsdC8Ddyd~GZp9yI2\nepq's ^JM*$**y+2*y{*+|*%+*0,+E-?+f-+-+.m+/.38093P;qA[G:"GHw9LgJ9 L7:LGLbZLb7M|nM6oMezPMezlnMŅ<NWb]Q:RARx>RxRcRxa8RxRxTbcTbdTbeTb}TbuTbeTboTbcT@UjAEUjUl$V':jVOV{W6C[W6dXyXVYEYYȀRZXZ%ZOZʳNZϳe;[[[ %I[ %[[ %a[ %pb[ %[ٵ)\\\c_\]\\^i$J ^i$e_gUn=e(^w-x3sY(.Qv(YUBwQ"ro(f/~@8~.0ZHED0D`;- NE|P2SiMtW\9?3]16ݰ0ʯQl3N1kMn| YW2^;Btgqh6z~hvq<`(Xu*{-{PD{f3/##hҳnLP.rh?M[.#UNuh~L0W>31v3tc`ML#UAI_VNWS#]1}^Bi@(t]R^WP;D DKk.(^:ʶ'&)X|Zd4Jx'%!ȳvƩ &n0J6E8F^N^u_yaNhlwp-cl.q0BprdwbApx*9nnnnnBogoor~LzT}b1F2FIMZMjjՈ.Y6ZN6N:3Vt[4c4445'5X55566677B7g777N88,O,bN]j]r0Gt(%Ol7S^{ b:wĚGXnSzvgD*:<;*kNo:G/Cs.??}QSMvv4 !&$ ,' '3>>'3R'3m+5!w+5k@V'@VHu QhDVjW*jzjJjAijSlcClqEsgO?}}Z:}ZRTn!4E4) YGWWE8&N%XMIWjyZaoÊsTFit)j?&<5IUߺ]] ~J/Yu j`*w0jR` Potc]TX$%Ēf&t/txt09$CsDCsChJC LtM+3M+R!|Tun1`x3l^m?$rm]mambmmhnHpIzrz YzTJ{H~~l?,qUZg]I|=a.IDžV0B0To0yZ֣z֝cQ:[4[\1 ZP 42,!!Ssva';k I$ǹR#t])H 0e1/1~EjG4~N[l,rJ)rJySЂ1ϗhGϗmϗvW'@>ET#TS` L°^Èvm|["УBZq ysUwswG:S)!jt,N3 "7XQBnuBLJHAE,MP[5j\]*M,bxShfl~23%~2d ~2 ZpZSGzڬfaaF(TSnqT^J/8~-'nʶmZ)˙RDovyL . _. σ F> HZa +4} Mg Mg9 Mg T ^C ^Uz ^ g:2 r,|g z R  -t%  E %F  UU- U շ/ z8 Ci 4- zUT ?@q 08 3\F 9s= 9sQ 9sy0 >cG5 A^ Rb` Z dpe3u dpeN] dpe` dpe d)c d)e d)f d) d) d) d) d) ejx n# o"`y }(Sl T B;!Q f\ *V } r[ : : ,+V ,{ 8F 8{S 8 ʶQ ֓+ Uu' N [ z,S g 9:% JqP , ;jE #e{{ Q8w U~& ]Y' l s3t }j # %^d . t.! H.G H| fE 5 _ F  G. L_r ڔ' 5/a u 5kc Y9 _ j iCp ӨSk y W |A R^ / 1U 4 i ;* CjG Gk Nrc/ Z$M bo% i?D pk@ rIjoi }& !T O 0 fQ f f v  )sG ޔ  x$  sl  ` 'jwL @h $ $@? $`e $ n ,C %( #EB s sW shk sv{ ɠ` > > ? ?Y ? ̺= CU u  + K e W U {) .j zZN ^ p 4} V 5N 87>2k DY7 DY8T DZ8 J K bO i8:v B P .)I S b gw z ^ ) 0L Ğt+ << <Pb <tW < < ⋙A e;6 c uY4'an2#42)26e29A<+HDIOqUh:WGL@<gJzm$Z|p0_$:NjMZk[̺Na6b6Y r9DC S)n; =QX>BEBxS'GQyAR_1R_id@fq[p t'z|oN~`s~`9"|["|F9il>cttL:p-i(i<p>Een universele documentconverter. Kan worden gebruikt om de markdown om te zetten in een breed scala van andere formaten.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> 

A universal document converter. Can be used to convert markdown to a wide range of other formats.

Website: http://pandoc.org/

ExportEen weinig bekende en weinig gebruikte indeling. Voor websites bijvoorbeeld.EA little known format modestly used. You know, web sites for example.ExportfBasis HTML uitvoer met de 'markdown' python module.5Basic HTML output using the Python module 'markdown'.Export8Boeken die bomen niet doden.Books that don't kill trees.Export0Kies uitvoerbestand.....Choose output file…ExportKlasse:Class:ExportConvert to ePUB3ExportfFout bij de verwerking van reguliere expressie : {})Could not process regular expression: {}ExportStandaard exporter, biedt basis formaten aan die door andere exporters gebruikt wordt.ADefault exporter, provides basic formats used by other exporters.ExportDDisable YAML metadata block. Use that if you get YAML related error.ExportFoutErrorExportExporteer naar markdown, doormiddel van pandoc. Zorgt voor meer opmaak opties dan de basis manuscript exporteur.hExport to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter.ExportTekengrootte: Font size:ExportHTML uitvoer HTML OutputExportHTML code HTML SourceExport,Inhoudstafel invoegen.Include a table of contents.ExportJNet als tekst zonder opmaak, met de uitzondering dat het markdown titels toevoegt. Veronderstelt dat de teksten zijn opgemaakt in markdown.Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown.Export2latex: het LaTeX-formaat.%LaTeX engine used to produce the PDF.Export<LaTeX is een woorden verwerker en documenten markup taal die gebruikt wordt om schitterende documenten te maken.LaTeX is a word processor and document markup language used to create beautiful documents.ExportRegelafstand: Line spacing:ExportMarkdown codeMarkdown sourceExport"Microsoft Office (.docx) document.Export<Latex moet genstalleerd zijn.Needs LaTeX to be installed.ExportNormaliseer Normalize the document (cleaner)ExportbAantal niveau's op te nemen in de inhoudsopgave: ,Number of sections level to include in TOC: Export|OpenDocument-indeling. Bijvoorbeeld gebruikt door LibreOffice.5OpenDocument format. Used by LibreOffice for example.ExportPapierformaat: Paper size:Export&Tekst zonder opmaak Plain textExport8Vooruitblik met markeringen.Preview with highlighter.Export2python 'markdown' module.Python module 'markdown'.ExporthZelfstandige html-bestanden, zonder afhankelijkheden/Self-contained HTML files, with no dependenciesExportvSimpelste export naar ongemarkeerde text. Laat je je eigen markup gebruiken die niet begrepen wordt door manuskript, bijvoorbeeld <a href='www.fountain.io'>Fountain</a>.Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example Fountain.ExportLGeef het basisniveau voor kopteksten: $Specify the base level for headers: Export`Alleenstaand document (niet alleen een fragment))Standalone document (not just a fragment)ExportThe purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner.Export:Typografisch correcte uitvoerTypographically correct outputExportZGebruik <q>tags voor aanhalingstekens in HTMLUse tags for quotes in HTMLExport:Gebruik van ATX-stijl headersUse ATX-style headersExportvReferentie-stijl links gebruiken in plaats van inline links1Use reference-style links instead of inline linksExporteen geldige LaTeX-installatie. Pandoc-aanbevelingen zijn te vinden op: <a href="https://pandoc.org/installing.html">pandoc.org/installeren.html</a>. Als u Unicode-ondersteuning wilt, heeft u XeLaTeX nodig.a valid LaTeX installation. Pandoc recommendations can be found on: pandoc.org/installing.html. If you want Unicode support, you need XeLaTeX.ExportdreStructuredText is een lichtgewicht opmaaktaal...2reStructuredText is a lightweight markup language.Export...ExportersManager DescriptionExportersManagerManage ExportersExportersManager ManuskriptExportersManagerOffers export toExportersManagerPath:ExportersManagerStatusExportersManagerStatus:ExportersManagerVersion:ExportersManager {HelpText}ExportersManagerAnalyzeFrequencyAnalyzerLWoorden uitsluiten (komma gescheiden): Exclude words (comma separated):FrequencyAnalyzerFrequency AnalyzerFrequencyAnalyzer Minimum size:FrequencyAnalyzerNumber of words: fromFrequencyAnalyzerPhrase frequencyFrequencyAnalyzerSettingsFrequencyAnalyzerWord frequencyFrequencyAnalyzertoFrequencyAnalyzerInfo: A very simple parser that will go through a markdown document and create items for each titles.
 Import}Info: Manuskript can import from markdown or OPML. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document.
 ImportR

Info: Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.

Only text files are supported (not images, binary or others).

ImportQ

Should pandoc create cosmetic / non-semantic line-breaks?

auto: wraps at 72 characters.
none: no line wrap.
preserve: tries to preserves line wrap from the original document.

Import>Door komma's gescheiden waardenComma separated valuesImportFile open failed.Import Folder importImportImport folder then filesImportImport tip as:Import Import using:ImportInclude only those extensions:ImportMarkdown importImportMind Map ImportImportMind Map importImport OPML ImportImport Pandoc importImportSort items by nameImport1This does not appear to be a valid Mind Map file.Import-This does not appear to be a valid OPML file.ImportUntitledImport Wrap lines:ImportInsert referenceMDEditCompleter (~{} pages) MainWindow# * {} wasn't found in project file. MainWindow&About MainWindow&Dikgedrukt&Bold MainWindow &Cheat sheet MainWindow&Close project MainWindow&Copy MainWindow&Delete MainWindow&Edit MainWindow&Fiction MainWindow&File MainWindow&Opmaken&Format MainWindow&Frequency Analyzer MainWindow&Header&Header MainWindow&Help MainWindow &Import… MainWindow&Schuingedrukt&Italic MainWindow &Labels... MainWindow&Mode MainWindow&Move Up MainWindow &Navigation MainWindow&Open MainWindow&Paste MainWindow&Quit MainWindow&Recent MainWindow&Rename MainWindow&Save MainWindow&Show help texts MainWindow&Simple MainWindow &Spellcheck MainWindow &Split… MainWindow &Status... MainWindow&Doorgestreept&Strike MainWindow&Tools MainWindow&View MainWindowO

One paragraph
summary

 MainWindowN

One sentence
summary

 MainWindowAbout Manuskript MainWindow$Plotstap toevoegen Add plot step MainWindowAuthor MainWindow Background MainWindowBackground color MainWindow Basic info MainWindowBook information MainWindow Book summary MainWindowBorder MainWindowMBuild worlds. Create hierarchy of broad categories down to specific details. MainWindowC&ut MainWindow Character(s) MainWindow Characters MainWindowCo&mpile MainWindowCompile MainWindowConflict MainWindowCorner MainWindow'Create the outline of your masterpiece. MainWindowCreate your characters. MainWindow Ctrl++Ctrl++ MainWindow Ctrl+-Ctrl+- MainWindow Ctrl+0Ctrl+0 MainWindow Ctrl+1Ctrl+1 MainWindow Ctrl+2Ctrl+2 MainWindow Ctrl+3Ctrl+3 MainWindow Ctrl+4Ctrl+4 MainWindow Ctrl+5Ctrl+5 MainWindow Ctrl+6Ctrl+6 MainWindowCtrl+Alt+1 Ctrl+Alt+1 MainWindowCtrl+Alt+2 Ctrl+Alt+2 MainWindow Ctrl+BCtrl+B MainWindowCtrl+C MainWindowCtrl+D MainWindow Ctrl+ICtrl+I MainWindowCtrl+K MainWindowCtrl+M MainWindowCtrl+O MainWindowCtrl+Q MainWindowCtrl+S MainWindow Ctrl+Shift+B MainWindowCtrl+Shift+Down MainWindow Ctrl+Shift+K MainWindow Ctrl+Shift+S MainWindow Ctrl+Shift+Up MainWindowCtrl+V MainWindowCtrl+X MainWindowDebug MainWindowDebug info. Sometimes useful. MainWindowDel MainWindow Description MainWindow Detailed info MainWindowDevelop plots. MainWindow Dictionary MainWindow Dupl&icate MainWindowEditor MainWindowEmail MainWindow0Enter information about your book, and yourself. MainWindowEpiphany MainWindowAExpand each sentence of your one paragraph summary to a paragraph MainWindowF2 MainWindowF6 MainWindowF7 MainWindowF8 MainWindowF9 MainWindowFilter MainWindowFlatData MainWindowFull MainWindow Full summary MainWindowGeneral MainWindowGenre MainWindowGoal MainWindowIcon MainWindow Icon color MainWindow Importance MainWindow Index cards MainWindowL&level 2L&evel 2 MainWindowLabel MainWindowLabels MainWindowNiveau &1 (atx)Level &1 (atx) MainWindowNiveau &2Level &2 MainWindowNiveau &3Level &3 MainWindowNiveau &4Level &4 MainWindowNiveau &5Level &5 MainWindowNiveau &6Level &6 MainWindowLicense MainWindowM&erge MainWindow M&ove Down MainWindow Manuskript MainWindowMetadata MainWindowMore MainWindow Motivation MainWindowName MainWindowNames MainWindowNext MainWindowNotes MainWindowNothing MainWindowOne page MainWindowOne page summary MainWindow One paragraph MainWindowOne paragraph summary MainWindow One sentence MainWindowOne sentence summary MainWindow Organi&ze MainWindowOutline MainWindowPOV MainWindowPersos MainWindowPlot MainWindowPlots MainWindowPopulates with empty data MainWindowProgress MainWindow Project tree MainWindow#Project {} loaded with some errors. MainWindow#Project {} loaded with some errors: MainWindowProject {} loaded. MainWindowProject {} saved. MainWindowResolution steps MainWindowResult MainWindow S&ettings MainWindow Sa&ve as... MainWindowSea&rch MainWindowSeries MainWindow Situation: MainWindowSource of conflict MainWindowSource of passion MainWindowSp&lit at cursor MainWindow Story line MainWindowSubtitle MainWindowSummary MainWindowSummary: MainWindowTake time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. MainWindowText MainWindow Text color MainWindowThe basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) MainWindowTitle MainWindowTree MainWindowVolume MainWindowWARNING: Project {} not saved. MainWindow What if...? MainWindow Words: {}{} MainWindowWorld MainWindowWrite. MainWindow pxSettings%Settings&NothingSettings 1.5 linesSettings

If you check this option, your project will be save as one single file. Easier to copy or backup, but does not allow collaborative editing, or versionning.
If this is unchecked, your project will be save as a folder containing many small files.

Settings AlignmentSettings Alignment:SettingsApplySettings*Automatically load last project on startupSettingsAutomatically save everySettings BackgroundSettingsBackground color:Settings Background:Settings Border color:SettingsCancelSettingsCenterSettingsCenteredSettingsColor:SettingsColorsSettingsCompileSettings Corner color:SettingsCorner radius:SettingsCtrl+SSettingsCursorSettingsDeleteSettingsDisable blinkingSettingsDoubleSettingsEditSettingsFamily:SettingsFoldersSettingsFontSettingsFont:Settings FullscreenSettingsGeneralSettingsGeneral settingsSettingsGoalSettings Icon SizeSettings Icon color:SettingsIf no changes duringSettingsImage:SettingsIndent 1st lineSettings Index cardsSettings Item colorsSettingsJustifySettingsKeep revisionsSettingsKeep:SettingsLabelSettingsLabelsSettingsLeftSettingsLeft/Right margins:Settings Line spacing:SettingsLoadingSettingsMargins:Settings Max widthSettings Misspelled:SettingsNewSettingsNo ImageSettingsNothingSettings Old st&yleSettingsOpacity:SettingsOutlineSettingsPOVSettingsPadding:SettingsParagraph OptionsSettings ParagraphsSettings PercentageSettings Position:SettingsProgressSettings ProportionalSettingsRestore defaultsSettings RevisionsSettingsRevisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions.SettingsRightSettingsS&how progressSettings S&mart removeSettings Save on quitSettingsSave to one single fileSettingsSavingSettingsScaledSettingsSettingsSettingsShow ite&m countSettingsShow p&rogressSettings Show summar&ySettings Show summarySettingsSingleSettingsSize:SettingsSmart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes.SettingsSpacing:SettingsStatusSettings StretchedSettingsStyleSettings Tab width:SettingsTextSettingsText BackgroundSettings Text OptionsSettings Text areaSettings Text color:Settings Text editorSettings TextLabelSettings Theme name:SettingsTiledSettingsTitleSettingsTop/Bottom margins:Settings TransparentSettingsTreeSettingsType:SettingsUse block insertion ofSettingsViewsSettingsViews settingsSettingsVisible columnsSettingsWidth:SettingsWindow BackgroundSettings Word countSettingsZoomedSettingsminutes.Settings*revisions per 10 minutes for the last hourSettings$revisions per day for the last monthSettings#revisions per hour for the last daySettings,revisions per minute for the last 10 minutesSettings'revisions per week till the end of timeSettingsseconds.Settings&Add to dictionary SpellAction&Remove from custom dictionary SpellActionSpelling Suggestions SpellActionAbout Manuskriptabout ManuskriptaboutSoftware Versions in Use: aboutDialogVersion aboutDialogCompile abstractModelGoal abstractModelLabel abstractModelPOV abstractModelStatus abstractModelTitle abstractModel Word count abstractModelFew sentences summary: basicItemViewForm basicItemViewGoal: basicItemViewOne line summary basicItemViewPOV: basicItemView Word count basicItemViewNamecharacterModel New charactercharacterModelValuecharacterModelMaincharacterTreeViewMinorcharacterTreeView SecondarycharacterTreeView Characters cheatSheet2Filter (type the name of anything in your project) cheatSheetForm cheatSheetMain cheatSheetMinor cheatSheetPlots cheatSheet Secondary cheatSheetTexts cheatSheetWorld cheatSheetMaincmbOutlineCharacterChoserMinorcmbOutlineCharacterChoserNonecmbOutlineCharacterChoser SecondarycmbOutlineCharacterChoserVariouscmbOutlineCharacterChoserVariouscmbOutlineLabelChoserVariouscmbOutlineStatusChoserDock Widgets ToolbarcollapsibleDockWidgetsForm completer Full summary corkDelegateOne line summary corkDelegateFormeditorWidget_uiExportexporter Export to:exporterManage exportersexporterPreviewexporterSettingsexporter{} (not implemented yet)exporterDialog

Filters what items will be included in the final export.
(Not fully implemented yet.)

exporterSettingsBetween folder and text:exporterSettingsBetween folders:exporterSettingsBetween text and folder:exporterSettingsBetween texts:exporterSettingsContentexporterSettingsCustomexporterSettingsCustom replacements:exporterSettings6Decide here what will be included in the final export.exporterSettings Empty lineexporterSettingsEnabledexporterSettingsFi<ersexporterSettingsFolderexporterSettingsFontexporterSettings Font size:exporterSettingsFont:exporterSettingsFormexporterSettingsI need more granularityexporterSettingsZIf checked, uses regular expression for replacement. If unchecked, replaced as plain text.exporterSettings)Ignore compile status (include all items)exporterSettingsLabelsexporterSettingsPreviewexporterSettingsRegExpexporterSettingsRemove multiple spacesexporterSettingsReplaceexporterSettingsReplace --- with —exporterSettingsReplace ... with …exporterSettingsReplace double quotes (") with:exporterSettingsReplace single quotes (') with:exporterSettings SeparationsexporterSettingsStatusexporterSettings Subitems of:exporterSettingsTextexporterSettingsTitleexporterSettingsTransformationsexporterSettingsTypeexporterSettingsTypographic replacements:exporterSettingsWithexporterSettings{}Level {} folderexporterSettings{}Level {} textexporterSettingsRequires: exportersManagerStatus: uninstalled.exportersManagerCustomexportersManager InstalledexportersManager Not foundexportersManagerSet {} executable path.exportersManager/{} not found. Install it, or set path manually.exportersManager FrequencyfrequencyAnalyzerPhrasesfrequencyAnalyzerWordfrequencyAnalyzerTheme:fullScreenEditor{} wordsfullScreenEditor {} words / {}fullScreenEditorGeneralgeneralSettingsImport in a top-level foldergeneralSettings Import under:generalSettingsSplit scenes at:generalSettingsTrim long titles (> 32 chars)generalSettings\n---\ngeneralSettings8If you don't wanna see me, you can hide me in Help menu. helpLabel Clear fileimporterFormat:importerImportimporterPreviewimporterSettingsimporterVarious lineEditView minuteslocker wordslockerFormlockerLock !locker Lock screen:locker Time targetlocker Word targetlocker {} remaininglocker{} s.locker{} words remaininglocker{}:{}locker~{} h.locker~{} mn.lockerAlt+Up mainEditorF11 mainEditorForm mainEditorGo to parent item mainEditor Index cards mainEditorOutline mainEditorRoot mainEditorText mainEditor {} words  mainEditor{} words / {}  mainEditorMarkdownmarkdownSettingsForm metadataView Full summary metadataViewNotes / References metadataViewOne line summary metadataView Properties metadataView Revisions metadataViewSummary metadataView Auto-hidemyPanel&Copy outlineBasics&Delete outlineBasics&Paste outlineBasics&Rename outlineBasicsD

You're about to delete {} item(s).

Are you sure?

 outlineBasicsAbout to remove outlineBasicsUnknown reference: {}. references Basic info referencesCharacter: {} references Characters referencesConflict references Description references Detailed info referencesEpiphany referencesFolder: {} references Go to {}. referencesGoal referencesLabel: references Long summary: referencesLonger summary references Motivation referencesNot a reference: {}. referencesNotes: referencesPOV of: referencesPOV: referencesPassion referencesPath: referencesPlot: {} referencesReferenced in: referencesResolution steps referencesResult references Short summary referencesShort summary: referencesStats: referencesStatus: referencesText: {} referencesUnknown reference: {}. referencesWorld: {name}{path} references 1 day ago revisions Clear all revisionsDelete revisionsForm revisionsLine {}: revisionsOptions revisionsRestore revisionsShow ancient version revisionsShow modifications revisionsShow modifications only revisions Show spaces revisions {} days ago revisions {} hours ago revisions{} minutes ago revisions {} months ago revisions{} seconds ago revisions {} years ago revisionsAllsearchCase sensitivesearchFormsearchLabelsearchNotessearchOptions:searchPOVsearch Search for...search Search in:searchStatussearchSummarysearchTextsearchTitlesearch (read-only)settingsWindowFoutErrorsettingsWindow New labelsettingsWindow New statussettingsWindow New themesettingsWindownewthemesettingsWindowForm sldImportanceMain sldImportanceMinor sldImportance Secondary sldImportance TextLabel sldImportance Split '{}' splitDialog Split items splitDialogForm storylineViewShow Characters storylineView Show Plots storylineView Close split tabSplitter!Open selected items in that view. tabSplitterSplit horizontally tabSplitterSplit vertically tabSplitterVarious textEditViewCTRL+B textFormatCTRL+E textFormatCTRL+I textFormatCTRL+J textFormatCTRL+L textFormatCTRL+P textFormatCTRL+R textFormatCTRL+U textFormatForm textFormat Collapse AlltreeView Collapse {}treeView Expand AlltreeView Expand {}treeView1welcome#Total: {} words (~ {} pages)welcome Add levelwelcomeBookwelcomeChapterwelcomeCreatewelcomeCreate New Projectwelcome Demo projectswelcomeEmptywelcome Empty fictionwelcomeEmpty non-fictionwelcomeFictionwelcomeFinalwelcome First draftwelcomeFormwelcomeIdeawelcome ManuskriptwelcomeManuskript project (*.msk)welcome)Manuskript project (*.msk);;All files (*)welcome*Next time, automatically open last projectwelcome Non-fictionwelcomeNotewelcomeNovelwelcomeNovellawelcome Open projectwelcomeOpen...welcomeOverwrite existing project {} ?welcomeRecentwelcomeResearchwelcomeResearch paperwelcomeSave project as...welcomeScenewelcome Second draftwelcomeSectionwelcome Short Storywelcome SomethingwelcomeTODOwelcome TemplateswelcomeTextwelcomeTrilogywelcomeWarningwelcomeofwelcome words each.welcome Architecture worldModel Astronomy worldModelBodily language worldModelCalendar worldModelClimate worldModel Courtship worldModelCultural worldModelCustoms worldModel Demography worldModelDiseases worldModelDresses worldModel Education worldModelEthics worldModelFantasy world building worldModelFlora worldModelFood worldModel Gender roles worldModel Government worldModelHistory worldModel(Belangrijke objectenImportant objects worldModelImportant places worldModel Languages worldModel Magic system worldModelMagical objects worldModelMagical places worldModel Magical races worldModelMedicine worldModelMilitary worldModelMusic and arts worldModelNew item worldModel Organization worldModelPhysical worldModelPolitics worldModelRaces worldModelReligion worldModelRules worldModelScience worldModel Technology worldModel Topography worldModelTransportation worldModel Wild life worldModelmanuskript-0.10.0/i18n/manuskript_nl.ts000066400000000000000000005133161354442177200200240ustar00rootroot00000000000000 Export Basic HTML output using the Python module 'markdown'. Basis HTML uitvoer met de 'markdown' python module. Python module 'markdown'. python 'markdown' module. Markdown source Markdown code HTML Source HTML code HTML Output HTML uitvoer Default exporter, provides basic formats used by other exporters. Standaard exporter, biedt basis formaten aan die door andere exporters gebruikt wordt. Preview with highlighter. Vooruitblik met markeringen. Plain text Tekst zonder opmaak A little known format modestly used. You know, web sites for example. Een weinig bekende en weinig gebruikte indeling. Voor websites bijvoorbeeld. Needs LaTeX to be installed. Latex moet geïnstalleerd zijn. Error Fout Standalone document (not just a fragment) Alleenstaand document (niet alleen een fragment) Include a table of contents. Inhoudstafel invoegen. Number of sections level to include in TOC: Aantal niveau's op te nemen in de inhoudsopgave: Typographically correct output Typografisch correcte uitvoer Normalize the document (cleaner) Normaliseer Specify the base level for headers: Geef het basisniveau voor kopteksten: Use reference-style links instead of inline links Referentie-stijl links gebruiken in plaats van inline links Use ATX-style headers Gebruik van ATX-stijl headers Self-contained HTML files, with no dependencies Zelfstandige html-bestanden, zonder afhankelijkheden Use <q> tags for quotes in HTML Gebruik <q>tags voor aanhalingstekens in HTML LaTeX engine used to produce the PDF. latex: het LaTeX-formaat. Paper size: Papierformaat: Font size: Tekengrootte: Class: Klasse: Line spacing: Regelafstand: Books that don't kill trees. Boeken die bomen niet doden. OpenDocument format. Used by LibreOffice for example. OpenDocument-indeling. Bijvoorbeeld gebruikt door LibreOffice. Microsoft Office (.docx) document. reStructuredText is a lightweight markup language. reStructuredText is een lichtgewicht opmaaktaal... Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. Net als tekst zonder opmaak, met de uitzondering dat het markdown titels toevoegt. Veronderstelt dat de teksten zijn opgemaakt in markdown. Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. Simpelste export naar ongemarkeerde text. Laat je je eigen markup gebruiken die niet begrepen wordt door manuskript, bijvoorbeeld <a href='www.fountain.io'>Fountain</a>. <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> <p>Een universele documentconverter. Kan worden gebruikt om de markdown om te zetten in een breed scala van andere formaten.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. een geldige LaTeX-installatie. Pandoc-aanbevelingen zijn te vinden op: <a href="https://pandoc.org/installing.html">pandoc.org/installeren.html</a>. Als u Unicode-ondersteuning wilt, heeft u XeLaTeX nodig. Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. Exporteer naar markdown, doormiddel van pandoc. Zorgt voor meer opmaak opties dan de basis manuscript exporteur. LaTeX is a word processor and document markup language used to create beautiful documents. LaTeX is een woorden verwerker en documenten markup taal die gebruikt wordt om schitterende documenten te maken. The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. Disable YAML metadata block. Use that if you get YAML related error. Convert to ePUB3 Could not process regular expression: {} Fout bij de verwerking van reguliere expressie : {} Choose output file… Kies uitvoerbestand..... ExportersManager Manage Exporters Manuskript Description Offers export to Status Status: Version: Path: ... {HelpText} FrequencyAnalyzer Frequency Analyzer Word frequency Settings Minimum size: Exclude words (comma separated): Woorden uitsluiten (komma gescheiden): Analyze Phrase frequency Number of words: from to Import Markdown import <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; Folder import <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> Include only those extensions: Comma separated values Door komma's gescheiden waarden Sort items by name Import folder then files OPML Import File open failed. This does not appear to be a valid OPML file. Pandoc import <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; Import using: Wrap lines: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> Mind Map Import This does not appear to be a valid Mind Map file. Mind Map import Import tip as: Untitled MDEditCompleter Insert reference MainWindow General Title Subtitle Series Volume Genre License Author Name Email Summary Situation: Summary: One sentence One paragraph One page Full One sentence summary One paragraph summary Expand each sentence of your one paragraph summary to a paragraph One page summary Full summary Next What if...? Characters Names Filter Basic info Importance Motivation Goal Conflict Epiphany <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> Notes Detailed info Plots Plot Character(s) Description Result Resolution steps World Populates with empty data More Source of passion Source of conflict Outline Editor Debug FlatData Persos Labels &File &Recent &Help &Tools &Edit &View &Mode &Cheat sheet Sea&rch &Navigation &Open Ctrl+O &Save Ctrl+S Sa&ve as... Ctrl+Shift+S &Quit Ctrl+Q &Show help texts Ctrl+Shift+B &Spellcheck F9 &Labels... &Status... Tree &Simple &Fiction Index cards S&ettings F8 &Close project Co&mpile F6 &Frequency Analyzer Book information &About About Manuskript Manuskript Project {} saved. WARNING: Project {} not saved. Project {} loaded. Project {} loaded with some errors: * {} wasn't found in project file. Project {} loaded with some errors. (~{} pages) Words: {}{} Book summary Project tree Metadata Story line Enter information about your book, and yourself. The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Create your characters. Develop plots. Build worlds. Create hierarchy of broad categories down to specific details. Create the outline of your masterpiece. Write. Debug info. Sometimes useful. Dictionary Nothing POV Label Progress Compile Icon color Text color Background color Icon Text Background Border Corner Add plot step Plotstap toevoegen &Import… F7 &Copy Ctrl+C C&ut Ctrl+X &Paste Ctrl+V &Split… Ctrl+Shift+K Sp&lit at cursor Ctrl+K Ctrl+M Ctrl+D Del &Move Up Ctrl+Shift+Up M&ove Down Ctrl+Shift+Down Dupl&icate &Delete &Rename F2 Organi&ze M&erge &Format &Opmaken &Header &Header &Level 1 (setext) Ctrl+Alt+1 Ctrl+Alt+1 Level &2 Niveau &2 Ctrl+Alt+2 Ctrl+Alt+2 Level &1 (atx) Niveau &1 (atx) Ctrl+1 Ctrl+1 L&evel 2 L&level 2 Ctrl+2 Ctrl+2 Level &3 Niveau &3 Ctrl+3 Ctrl+3 Level &4 Niveau &4 Ctrl+4 Ctrl+4 Level &5 Niveau &5 Ctrl+5 Ctrl+5 Level &6 Niveau &6 Ctrl+6 Ctrl+6 &Bold &Dikgedrukt Ctrl+B Ctrl+B &Italic &Schuingedrukt Ctrl+I Ctrl+I &Strike &Doorgestreept &Verbatim Su&perscript Ctrl++ Ctrl++ Subsc&ript Ctrl+- Ctrl+- Co&mment block Ctrl+Shift+C Clear &formats Ctrl+0 Ctrl+0 &Comment line(s) &Ordered list &Unordered list B&lockquote Remove selected plot step(s) The file {} does not exist. Has it been moved or deleted? Install {}{} to use spellcheck {} has no installed dictionaries {}{} is not installed Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings Settings General Revisions Views Labels Status Fullscreen General settings Application settings Loading Automatically load last project on startup Saving Automatically save every minutes. If no changes during seconds. Save on project close <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> Save to one single file Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. Keep revisions S&mart remove Keep: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. revisions per day for the last month revisions per minute for the last 10 minutes revisions per hour for the last day revisions per 10 minutes for the last hour revisions per week till the end of time Views settings Tree Colors Icon color: Nothing POV Label Progress Compile Text color: Background color: Folders Show ite&m count Show summary &Nothing Text Outline Visible columns Goal Word count Percentage Title Index cards Item colors Border color: Corner color: Background Color: Ctrl+S Image: Text editor Font Family: Size: Misspelled: Background: Paragraphs Line spacing: Single 1.5 lines Double Proportional % Tab width: px Indent 1st line Spacing: New Edit Delete Theme name: Apply Cancel Window Background Text Background Text Options Paragraph Options Type: No Image Tiled Centered Stretched Scaled Zoomed Opacity: Position: Left Center Right Width: Corner radius: Margins: Padding: Font: Style Cursor Use block insertion of Alignment: Justify Alignment Icon Size TextLabel Disable blinking Text area Max width Left/Right margins: Top/Bottom margins: S&how progress Show summar&y Show p&rogress Old st&yle Transparent Restore defaults Style: Language: Font size: Restarting Manuskript ensures all settings take effect. Show &word count &Show word count &New style Typewriter mode Focus mode None Sentence Line Paragraph <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions &Add to dictionary &Remove from custom dictionary about About Manuskript Manuskript aboutDialog Version Software Versions in Use: abstractModel Title POV Label Status Compile Word count Goal basicItemView Form POV: Goal: Word count One line summary Few sentences summary: characterModel New character Name Value characterTreeView Main Secondary Minor cheatSheet Form Filter (type the name of anything in your project) Minor Secondary Main Characters Texts Plots World cmbOutlineCharacterChoser None Main Secondary Minor Various cmbOutlineLabelChoser Various cmbOutlineStatusChoser Various collapsibleDockWidgets Dock Widgets Toolbar completer Form corkDelegate One line summary Full summary editorWidget_ui Form exporter Export Export to: Manage exporters Preview Settings exporterDialog {} (not implemented yet) exporterSettings Form Content Decide here what will be included in the final export. Type Title Text I need more granularity Fi&lters <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> Ignore compile status (include all items) Subitems of: Labels Status Separations Between folders: Empty line Custom Between texts: Between folder and text: Between text and folder: Transformations Typographic replacements: Replace double quotes (") with: Replace single quotes (') with: Remove multiple spaces Custom replacements: Enabled Replace With RegExp If checked, uses regular expression for replacement. If unchecked, replaced as plain text. Preview Font Font: Font size: Folder {}Level {} folder {}Level {} text Replace ... with … Replace --- with — exportersManager Installed Custom Not found {} not found. Install it, or set path manually. <b>Status:</b> uninstalled. <b>Requires:</b> Set {} executable path. frequencyAnalyzer Phrases Frequency Word fullScreenEditor Theme: {} words / {} {} words Spellcheck Navigation New Text Title Title: Show Full Path Theme selector Word count Progress Progress: Auto Show/Hide Clock Clock: Show Seconds generalSettings General Split scenes at: \n---\n Trim long titles (> 32 chars) Import under: Import in a top-level folder helpLabel If you don't wanna see me, you can hide me in Help menu. importer Import Format: Choose file Clear file Preview Settings lastAccessedDirectoryInfo Last accessed directory "{}" loaded. lineEditView Various locker Form Lock screen: Word target Time target words minutes Lock ! ~{} h. ~{} mn. {}:{} {} s. {} remaining {} words remaining mainEditor Form Text Index cards Outline F11 Go to parent item Alt+Up Root {} words / {} {} words markdownSettings Markdown metadataView Form Properties Summary One line summary Full summary Notes / References Revisions myPanel Auto-hide outlineBasics Set POV None Set Status Set Label New Main Secondary Minor Set Custom Icon Restore to default Root Open {} items in new tabs Open {} in a new tab About to remove <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> Select at least two items. Folders are ignored. All items must be on the same level (share the same parent). New &Folder New &Text &Copy C&ut &Paste &Rename &Delete outlineCharacterDelegate None Main Secondary Minor outlineItem {} words / {} ({}) {} words pandocSettings General Table of Content Custom settings for {} persosProxyModel Main Secondary Minors plotDelegate General Promise Problem Progress Resolution Try / Fail No and Yes but Freytag's pyramid Exposition Rising action Climax Falling action Three acts 1. Setup 1. Inciting event 1. Turning point 2. Choice 2. Reversal 2. Disaster 3. Stand up 3. Climax 3. Ending Hero's journey Ordinary world Call to adventure Refusal of the call Meeting with mentor Tests Approach Abyss Reward / Revelation Transformation Atonement Return plotModel New plot Name Meta New step Main Secondary Minor plotTreeView Main Secondary Minor **Plot:** {} plotsProxyModel Main Secondary Minors propertiesView Form POV Status Label Compile Goal Word count references Not a reference: {}. Unknown reference: {}. Path: Stats: POV: Status: Label: Short summary: Long summary: Notes: Basic info Detailed info POV of: Go to {}. Description Result Characters Resolution steps Passion Conflict <b>Unknown reference:</b> {}. Folder: <b>{}</b> Text: <b>{}</b> Character: <b>{}</b> Plot: <b>{}</b> World: <b>{name}</b>{path} Referenced in: Motivation Goal Epiphany Short summary Longer summary revisions Form Options Restore Delete Show modifications Show ancient version Show spaces Show modifications only {} years ago {} months ago {} days ago 1 day ago {} hours ago {} minutes ago {} seconds ago Line {}: Clear all search Form Search for... Search in: All Title Text Summary Notes POV Status Label Options: Case sensitive settingsWindow New status New label newtheme New theme (read-only) Open Image Image files (*.jpg; *.jpeg; *.png) Error Fout Unable to load selected file Unable to add selected image: {} sldImportance Form TextLabel Minor Secondary Main splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> Split '{}' Split items storylineView Form Show Plots Show Characters tabSplitter Open selected items in that view. Split horizontally Close split Split vertically textEditView Various textFormat Form CTRL+B CTRL+I CTRL+U CTRL+P CTRL+L CTRL+E CTRL+R CTRL+J treeView Expand {} Collapse {} Expand All Collapse All welcome Form 1 Templates Empty Novel Novella Short Story Research paper Demo projects Add level Add word count Next time, automatically open last project Open... Recent Create Open project Manuskript project (*.msk);;All files (*) Save project as... Manuskript project (*.msk) Manuskript Create New Project Warning Overwrite existing project {} ? Empty fiction Chapter Scene Trilogy Book Section Empty non-fiction words each. of Text Something <b>Total:</b> {} words (~ {} pages) Fiction Non-fiction Idea Note Research TODO First draft Second draft Final worldModel New item Fantasy world building Physical Climate Topography Astronomy Wild life Flora History Races Diseases Cultural Customs Food Languages Education Dresses Science Calendar Bodily language Ethics Religion Government Politics Gender roles Music and arts Architecture Military Technology Courtship Demography Transportation Medicine Magic system Rules Organization Magical objects Magical places Magical races Important places Important objects Belangrijke objecten Natural resources manuskript-0.10.0/i18n/manuskript_pl.qm000066400000000000000000002311431354442177200200100ustar00rootroot000000000000009L\TTZVEVE`VE?VE֞Vfsd_ dCdӪiOQʂ# klEe;q NJw47=*$7*y9*yͳ*9w*%9*0:+E<:+f<+=+><+@.3093|V;A[?G:BGHw9uMJ5JOKQOL7RHLGxLb8LbM|^M6Mez{MezMŅV#NWQ:YRxX?RxRxRx?RxTbTbTbTbOTbVTbTbrTb?T[Uj\@UjUlV':+VVW6_W6XyXYE Y+YȀٝZZ%ZʳYZϳ{[C[ %l[ %}[ %[ %[ %R[ %L[ٵ6\r\\\a^i$n^i$gUnV4V^-Lsr!)3}(YBw}Lraof@~[a=0.Bi$pDC4D^"st- NEϊP2ai@MtzQ36ݰC{ʯ~lH1D.vnY; 0FzY$^;BgqFhSzM~hNqU>3u7=aPDf3@ ##ӽҳP.%ZM[>#NÛ~L,M[y-,U0W>I 1v3tc ML#PUAI<VW]1} ^]i@4tRDW{#.`aHk.(^Rxʶ' &)J'-! )ȳƩ"&n~0JEO4F N^_kaNlwpn!?vZF}}MvS !!&$ ,']'3Xs'3'3+v5!ƪ5@V@VHuQhDVjW6jnjoj\rjlc_^lqsgy}}Z}ZT I4cW4 G1jmdBNbN%Mj@sMÊTeCt6j?&=<5lߺ( ~nMYu j*50U`  |otccTZ%Ē&t/tȩ09$GCsbCsCקJCFLt>M+HM+R!|=TunD`x l^ Bm?$gmmmmmmvni|pm rz z6{z~ ~{j~},Zq]mVa.mDž0^0{0֣̹֝c~ރI8:=R1 Z}   \2:d!:n|a2SS Ilǹ#t_)H0e|1?Q1~cG4TNl;,rJ6LrphySЂD]ϗ ϗϗł2kN@߻E~S` LukG°^oÈv[%У' ʯs"^ kG>S!ju,N+3 N7BnBLHAE MP[5j]*vbvhfE~2GX~2~2[~4ZZR.ڬad(fSnnT^p?~;'ʶo˙Dvyv05 .  σ5 F> HZ[ +4 ?:EĢ Mg MgP Mg T$ X;f2 ^`N ^N ^ ^߆ g: r,| x o z Ibw * [ -v  d %e  g U UՄ շ z C I z #y ?@ 08d 3 9sW% 9s~F 9s >cg+ A^ Rb`} Z dpeHj dpex dpe dpe d)F d)C d) d) d) d) d) d) d)\ d)| e luC n) o"` }(  T\ B;# f * ѹ  : . : ,9G , 8f 82 8 ʶ ֓:$ U N ' z: w 9Q Jf ;i ;g #er F. Q8ǔ U~0 ]Y| l4 m^V s3 }j"' % . t= H= HO  fdo 5   fu N G> L ڔ1S 5? u 5M YQ\ _@ iCF ӨS y w Wp ΐ  Rd / 1UF 4 * ; =fe Cjf G NrS Sz Z Z$w b i?b pkZy rIjy }0x !To z =@    Y   ) ޔW  x$Q  h s   ` 'j Z $- $Z $ $< n1 ,_ %4 #c s#7 s s= sŴ ɠc X Y, Ye Y Y ̺X C u ڧ 9 / QN }  K .6 zZx   4}"~ 5N 7ؤo 87>E DYM DYN DYN DZN J K` b{ i8:! ^ P .5 SD 6  N ^ ) 0u Ğt8m <U <|& < < < aC ⋙\ eSn t uY'@C2# ^2)G6eEH9]L<+ݟHaIXOq4UhWGtUJˢ$|0$Qjwk̺y aKbK P` Sk; =QJ>^B3 BxS1QyR_DR_d@fqpt2|oN~`;~`K"|"|di\~G?lXttt}:<i3>i<p>Uniwersalny konwerter dokumentw. Mo|e by u|ywany do konwersji jzyka Markdown do szerokiej gamy innych formatw.</p> <p>Strona internetowa: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> 

A universal document converter. Can be used to convert markdown to a wide range of other formats.

Website: http://pandoc.org/

ExportFormat maBo znany, rzadko u|ywany. No wiesz, na przykBad do stron internetowych.EA little known format modestly used. You know, web sites for example.ExportvPodstawowe wyj[cie HTML u|ywajce moduBu Python 'markdown'.5Basic HTML output using the Python module 'markdown'.ExportDKsi|ki, ktre nie zabijaj drzew.Books that don't kill trees.Export,Wybierz plik wyj[ciowyChoose output file…Export Klasa:Class:Export$Konwertuj do ePUB3Convert to ePUB3ExporthBBd podczas przetwarzania wyra|enia regularnego: {})Could not process regular expression: {}ExportDomy[lny eksporter, zapewnia podstawowe formaty u|ywane przez inne eksportery.ADefault exporter, provides basic formats used by other exporters.ExportWyBcz blok metadanych YAML. WBcz t opcj je[li otrzymasz bBd zwizany z YAML.DDisable YAML metadata block. Use that if you get YAML related error.ExportBBdErrorExportEksport do formatu markdown, za pomoc programu pandoc. Pozwala na wicej opcji formatowania ni| podstawowy eksporter Manuskript.hExport to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter.Export"Rozmiar czcionki: Font size:ExportWyj[cie HTML HTML OutputExportyrdBo HTML HTML SourceExport&DoBcz spis tre[ci.Include a table of contents.ExportTak jak zwykBy tekst, z wyjtkiem dodawania znacznikw tytuBw. ZakBada, |e teksty s sformatowane za pomoc znacznikw.Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown.ExportZSilnik LaTeX u|ywany do tworzenia plikw PDF.%LaTeX engine used to produce the PDF.ExportLaTeX to procesor tekstu i jzyk znacznikw dokumentu u|ywany do tworzenia piknych dokumentw.LaTeX is a word processor and document markup language used to create beautiful documents.Export&Rozmiar interlinii: Line spacing:ExportyrdBo markdownMarkdown sourceExportDDokument Microsoft Office (.docx)."Microsoft Office (.docx) document.Export:Wymaga zainstalowanego LaTeX.Needs LaTeX to be installed.ExportPZnormalizuj dokument (czystsza skBadnia) Normalize the document (cleaner)ExportTLiczba poziomw sekcji do zawarcia w TOC: ,Number of sections level to include in TOC: ExportfFormat OpenDocument. U|ywany przez np. LibreOffice.5OpenDocument format. Used by LibreOffice for example.Export Rozmiar papieru: Paper size:ExportZwykBy tekst Plain textExport.Podgld z zaznaczeniem.Preview with highlighter.Export0moduB Python 'markdown'.Python module 'markdown'.Export`Samozawierajce pliki html, bez plikw zale|nych/Self-contained HTML files, with no dependenciesExportHNajprostszy eksport do zwykBego tekstu. Pozwala na u|ycie wBasnego jzyka markup niezrozumiaBego dla manuskript, na przykBad <a href='www.fountain.io'>Fountain</a>.Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example Fountain.ExportFUstal bazowy poziom dla nagBwkw: $Specify the base level for headers: ExportRSamodzielny dokument (nie tylko fragment))Standalone document (not just a fragment)ExportRCelem tego formatu jest zapewnienie sposobu wymiany informacji pomidzy outlinerem a serwisami internetowymi, ktre mog by przegldane lub kontrolowane przez outliner.The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner.Export.Typograficznie poprawneTypographically correct outputExport@U|yj taga <q> dla cytatw w HTMLUse tags for quotes in HTMLExport.U|yj nagBwkw typu AXTUse ATX-style headersExportTU|yj odno[nikw zamiast linkw wbudowanych1Use reference-style links instead of inline linksExportprawidBowa instalacja LaTeX. Zobacz rekomendacje pandoc na: <a href="http://pandoc.org/installing.html">http://pandoc.org/installing.html</a>. Je[li chcesz wsparcia unicode, potrzebujesz XeLateX.a valid LaTeX installation. Pandoc recommendations can be found on: pandoc.org/installing.html. If you want Unicode support, you need XeLaTeX.ExportVreStructuredText to lekki jzyk znacznikw.2reStructuredText is a lightweight markup language.Export......ExportersManagerOpis DescriptionExportersManager,Zarzdzaj EksporteramiManage ExportersExportersManagerManuskript ManuskriptExportersManagerEksportuj doOffers export toExportersManagerZcie|ka:Path:ExportersManager StatusStatusExportersManagerStatus:Status:ExportersManagerWersja:Version:ExportersManager{TekstPomocy} {HelpText}ExportersManagerAnalizujAnalyzeFrequencyAnalyzerNWyklucz sBowa (oddzielone przecinkiem): Exclude words (comma separated):FrequencyAnalyzer2Analizator Czstotliwo[ciFrequency AnalyzerFrequencyAnalyzer$Minimalny rozmiar: Minimum size:FrequencyAnalyzerLiczba sBw: odNumber of words: fromFrequencyAnalyzer*Czstotliwo[ wyra|eDPhrase frequencyFrequencyAnalyzerUstawieniaSettingsFrequencyAnalyzer$Czstotliwo[ sBwWord frequencyFrequencyAnalyzerdotoFrequencyAnalyzer<b>Informacja:</b> Bardzo prosty parser, ktry prze[ledzi znaczniki dokumentu i stworzy pozycje dla ka|dego tytuBu.<br/>&nbsp;Info: A very simple parser that will go through a markdown document and create items for each titles.
 ImportL<b>Informacja:</b>Manuskript potrafi importowa <b>markdown</b> i <b>OPML</b>. Pandoc przekonwertuje twoje dokumenty do ktrego[ z nich (zobacz opcj poni|ej) i zostan one zaimportowane do programu manuskript. Ktry[ z nich powinien da lepsze efekty, zale|nie od twojego dokumentu.<br/>&nbsp;}Info: Manuskript can import from markdown or OPML. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document.
 Import<p><b>Informacja:</b>Importuje struktur caBego katalogu. Foldery s dodawane jako foldery a pliki tekstowe wewntrz folderw (ty wybierasz ktre poprzez rozszerzenie) jako sceny.</p> <p>Wspierane s tylko pliki tekstowe (nie obrazy, pliki binarne, inne).</p>R

Info: Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.

Only text files are supported (not images, binary or others).

Import<p>Czy pandoc powinien stworzy kosmetyczne/niesemantyczne przerywanie wierszy?</p> <p><b>automatycznie</b>: zawija do 72 znakw.<br> <b>brak</b>: nie zawija wierszy.<br> <b>zachowaj</b>: prbuje zachowa zawijanie wierszy z oryginalnego dokumentu.</p>Q

Should pandoc create cosmetic / non-semantic line-breaks?

auto: wraps at 72 characters.
none: no line wrap.
preserve: tries to preserves line wrap from the original document.

Import>Warto[ci oddzielone przecinkiemComma separated valuesImport@Otwarcie pliku nie powiodBo si.File open failed.ImportImport folderu Folder importImportHZaimportuj folder, a nastpnie plikiImport folder then filesImport0Importuj wskazwk jako:Import tip as:Import(Zaimportuj u|ywajc: Import using:ImportJUwzgldnij wyBcznie te rozszerzenia:Include only those extensions:ImportImport markdownMarkdown importImportImport Mind MapMind Map ImportImport"Importuj Mind MapMind Map importImportImport OPML OPML ImportImportImport Pandoc Pandoc importImport0Sortuj elementy wg nazwySort items by nameImportJTo nie jest prawidBowy plik Mind Map.1This does not appear to be a valid Mind Map file.ImportBTo nie jest prawidBowy plik OPML.-This does not appear to be a valid OPML file.ImportBez tytuBuUntitledImportZawijaj linie: Wrap lines:Import"Wprowadz odno[nikInsert referenceMDEditCompleter (~{} stron) (~{} pages) MainWindowL * {} nie znaleziono w pliku projektu.# * {} wasn't found in project file. MainWindow&O programie&About MainWindowPogru&bienie&Bold MainWindowZ&cigawka &Cheat sheet MainWindow &Zamknij projekt&Close project MainWindow,&Wiersz(-e) komentarza&Comment line(s) MainWindow&Kopiuj&Copy MainWindow &UsuD&Delete MainWindow&Edycja&Edit MainWindow&%Fikcji literackiej&Fiction MainWindow &Plik&File MainWindow&Formatowanie&Format MainWindow.&Analiza czstotliwo[ci&Frequency Analyzer MainWindow&NagBwek&Header MainWindow &Pomoc&Help MainWindow&importuj & &Import… MainWindowPochylen&ie&Italic MainWindow&Etykiety... &Labels... MainWindow$&Poziom 1 (setext)&Level 1 (setext) MainWindow &Tryb&Mode MainWindowP&rzesuD w gr&Move Up MainWindow&Nawigacja &Navigation MainWindow&Otwrz&Open MainWindow&Numerowanie &Ordered list MainWindow W&klej&Paste MainWindow&Zamknij&Quit MainWindow&Ostatnie&Recent MainWindow&ZmieD nazw&Rename MainWindow&Zapisz&Save MainWindow$&Poka| podpowiedzi&Show help texts MainWindow&Uproszczony&Simple MainWindow(&Sprawdzanie pisowni &Spellcheck MainWindow&Podziel & &Split… MainWindow&Status... &Status... MainWindow&Przekre[lenie&Strike MainWindow&Narzdzia&Tools MainWindow&Wypunktowanie&Unordered list MainWindow&DosBownie &Verbatim MainWindow &Widok&View MainWindow<html><head/><body><p align="right">Podsumowanie<br/> w jednym akapicie</p></body></html>O

One paragraph
summary

 MainWindow<html><head/><body><p align="right">Podsumowanie<br/> w jednym zdaniu</p></body></html>N

One sentence
summary

 MainWindowO ManuskriptAbout Manuskript MainWindow"Dodaj etap fabuBy Add plot step MainWindow AutorAuthor MainWindow &Cytat B&lockquote MainWindowTBo Background MainWindowKolor tBaBackground color MainWindow*Podstawowe informacje Basic info MainWindow(Informacje o ksi|ceBook information MainWindow(Podsumowanie ksi|ki Book summary MainWindow RamkaBorder MainWindowBuduj [wiaty. Stwrz hierarchi szeroko zarysowanych kategorii do konkretnych szczegBw.MBuild worlds. Create hierarchy of broad categories down to specific details. MainWindow&WytnijC&ut MainWindowPosta/-ci Character(s) MainWindowPostaci Characters MainWindow*Wyczy[ &formatowanieClear &formats MainWindowBlok komentarzaCo&mment block MainWindow&KompilujCo&mpile MainWindowKompilujCompile MainWindowKonfliktConflict MainWindowNaro|nikCorner MainWindow8Stwrz zarys swojego dzieBa.'Create the outline of your masterpiece. MainWindow0Stwrz swoich bohaterw.Create your characters. MainWindow Ctrl++Ctrl++ MainWindow Ctrl+-Ctrl+- MainWindow Ctrl+0Ctrl+0 MainWindow Ctrl+1Ctrl+1 MainWindow Ctrl+2Ctrl+2 MainWindow Ctrl+3Ctrl+3 MainWindow Ctrl+4Ctrl+4 MainWindow Ctrl+5Ctrl+5 MainWindow Ctrl+6Ctrl+6 MainWindowCtrl+Alt+1 Ctrl+Alt+1 MainWindowCtrl+Alt+2 Ctrl+Alt+2 MainWindow Ctrl+BCtrl+B MainWindow Ctrl+CCtrl+C MainWindow Ctrl+DCtrl+D MainWindow Ctrl+ICtrl+I MainWindow Ctrl+KCtrl+K MainWindow Ctrl+MCtrl+M MainWindow Ctrl+OCtrl+O MainWindow Ctrl+QCtrl+Q MainWindow Ctrl+SCtrl+S MainWindowCtrl+Shift+B Ctrl+Shift+B MainWindowCtrl+Shift+C Ctrl+Shift+C MainWindowCtrl+Shift+DownCtrl+Shift+Down MainWindowCtrl+Shift+K Ctrl+Shift+K MainWindowCtrl+Shift+S Ctrl+Shift+S MainWindowCtrl+Shift+Up Ctrl+Shift+Up MainWindow Ctrl+VCtrl+V MainWindow Ctrl+XCtrl+X MainWindowDebugowanieDebug MainWindowXInformacje debugowania. Czasem s u|yteczne.Debug info. Sometimes useful. MainWindowDelDel MainWindowOpis Description MainWindow,SzczegBowe informacje Detailed info MainWindowOpracuj wtki.Develop plots. MainWindowSBownik Dictionary MainWindowDupl&ikuj Dupl&icate MainWindow EdytorEditor MainWindow E-mailEmail MainWindowXWpisz informacje o swojej ksi|ce i o sobie.0Enter information about your book, and yourself. MainWindow(Epifania (ol[nienie)Epiphany MainWindowRozwiD ka|de zdanie podsumowania jednego akapitu do caBego akapituAExpand each sentence of your one paragraph summary to a paragraph MainWindowF2F2 MainWindowF6F6 MainWindowF7F7 MainWindowF8F8 MainWindowF9F9 MainWindowFiltrujFilter MainWindowFlatDataFlatData MainWindow PeBneFull MainWindow$PeBne podsumowanie Full summary MainWindow OglneGeneral MainWindowGatunekGenre MainWindowCelGoal MainWindow IkonaIcon MainWindowKolor ikony Icon color MainWindowZnaczenie Importance MainWindow Karty katalogowe Index cards MainWindowZZainstaluj {}{}, aby u|y sprawdzania pisowniInstall {}{} to use spellcheck MainWindowP&oziom 2L&evel 2 MainWindowEtykietaLabel MainWindowEtykietyLabels MainWindowPoziom &1 (atx)Level &1 (atx) MainWindowPoziom &2Level &2 MainWindowPoziom &3Level &3 MainWindowPoziom &4Level &4 MainWindowPoziom &5Level &5 MainWindowPoziom &6Level &6 MainWindowLicencjaLicense MainWindowP&oBczM&erge MainWindowPr&zesuD w dB M&ove Down MainWindowManuskript Manuskript MainWindowMetadaneMetadata MainWindow WicejMore MainWindowUmotywowanie Motivation MainWindowImi i nazwiskoName MainWindow ImionaNames MainWindow DalejNext MainWindowNotatkiNotes MainWindowNicNothing MainWindow W jednej stronieOne page MainWindow8Podsumowanie jednostronicoweOne page summary MainWindow"W jednym akapicie One paragraph MainWindow6Podsumowanie jednoakapitoweOne paragraph summary MainWindowW jednym zdaniu One sentence MainWindow4Podsumowanie jednozdanioweOne sentence summary MainWindowOrgani&zuj Organi&ze MainWindow ZarysOutline MainWindowPunkt widzeniaPOV MainWindow OsobyPersos MainWindow WtekPlot MainWindow WtkiPlots MainWindow.ZapeBnia pustymi danymiPopulates with empty data MainWindow PostpProgress MainWindowDrzewo projektu Project tree MainWindow<Projekt {} wczytany z bBdami.#Project {} loaded with some errors. MainWindow<Projekt {} wczytany z bBdami:#Project {} loaded with some errors: MainWindow(Projekt {} wczytany.Project {} loaded. MainWindow(Projekt {} zapisany.Project {} saved. MainWindow8UsuD wybrany(e) etapy fabuByRemove selected plot step(s) MainWindow>Kroki prowadzce do rozwizaniaResolution steps MainWindow SkutekResult MainWindowU&stawienia S&ettings MainWindowZa&pisz jako... Sa&ve as... MainWindow&SzukajSea&rch MainWindowCyklSeries MainWindowSytuacja: Situation: MainWindow yrdBo konfliktuSource of conflict MainWindowyrdBo pasjiSource of passion MainWindow4Po&dziel w miejscu kursoraSp&lit at cursor MainWindowLinia fabularna Story line MainWindowIndeks &grny Su&perscript MainWindowIndeks &dolny Subsc&ript MainWindowPodtytuBSubtitle MainWindowPodsumowanieSummary MainWindowPodsumowanie:Summary: MainWindow`Po[wi czas na przemy[lenie jednego zdania (ok. 50 sBw) podsumowania swojej ksi|ki. Nastpnie rozwiD je do akapitu, nastpnie do strony, a nastpnie do peBnego podsumowania.Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. MainWindow TekstText MainWindowKolor tekstu Text color MainWindowBPodstawowa sytuacja, sformuBowana jako pytanie "Co je[li...?". Na przykBad: "Co je[li najniebezpieczniejszy zBy czarownik nie mgB zabi dziecka?" (Harry Potter)The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) MainWindowxPlik {} nie istnieje. Czy zostaB przeniesiony lub skasowany?9The file {} does not exist. Has it been moved or deleted? MainWindow TytuBTitle MainWindow DrzewoTree MainWindowTomVolume MainWindow@UWAGA: Nie zapisano projektu {}.WARNING: Project {} not saved. MainWindowCo je[li...? What if...? MainWindowSBowa: {}{} Words: {}{} MainWindow ZwiatWorld MainWindow Pisz.Write. MainWindowF{} nie ma zainstalowanych sBownikw {} has no installed dictionaries MainWindow4{}{} jest niezainstalowany{}{} is not installed MainWindow px pxSettings%%Settings&Nowy styl &New styleSettings&Nic&NothingSettings$Poka| liczb &sBw&Show word countSettings1.5 linii 1.5 linesSettings<html><head/><body><p>Je[li wybierzesz t opcj twj projekt zostanie zapisany jako pojedynczy plik. Aatwiej go kopiowa lub tworzy kopi zapasow, ale nie pozwala on na wspBprac w zespole i wersjonowanie.<br/>Je[li ta opcja jest odznaczona twj projekt zostanie zapisany jako folder zawierajcy wiele maBych plikw.</p></body></html>

If you check this option, your project will be save as one single file. Easier to copy or backup, but does not allow collaborative editing, or versionning.
If this is unchecked, your project will be save as a folder containing many small files.

SettingsWyrwnanie AlignmentSettingsWyrwnanie: Alignment:Settings(Ustawienia aplikacjiApplication settingsSettingsZastosujApplySettingsjPo uruchomieniu automatycznie wczytaj ostatni projekt*Automatically load last project on startupSettings0Zapisuj automatycznie coAutomatically save everySettingsTBo BackgroundSettingsKolor tBa:Background color:SettingsTBo: Background:Settings$Kolor obramowania: Border color:Settings AnulujCancelSettingsWy[rodkowanieCenterSettingsWy[rodkowanieCenteredSettings Kolor:Color:Settings KoloryColorsSettingsKompilujCompileSettings Kolor naro|nika: Corner color:Settings$PromieD naro|nika:Corner radius:Settings Ctrl+SCtrl+SSettings KursorCursorSettingsUsuDDeleteSettingsWyBcz miganieDisable blinkingSettingsPodwjnaDoubleSettings EdytujEditSettingsRodzina:Family:SettingsTryb skupienia Focus modeSettingsFolderyFoldersSettingsKrj tekstuFontSettingsRozmiar tekstu: Font size:SettingsKrj tekstu:Font:SettingsPeBny ekran FullscreenSettings OglneGeneralSettings"Ustawienia oglneGeneral settingsSettingsCelGoalSettingsRozmiar ikony Icon SizeSettingsKolor ikony: Icon color:Settings@Je[li nie ma |adnych zmian przezIf no changes duringSettings Obraz:Image:Settings.Wcicie pierwszej liniiIndent 1st lineSettings Karty katalogowe Index cardsSettings Kolory elementw Item colorsSettingsJustowanieJustifySettings Zachowuj korektyKeep revisionsSettingsZachowaj:Keep:SettingsEtykietaLabelSettingsEtykietyLabelsSettings Jzyk: Language:SettingsDo lewejLeftSettings(Lewy/Prawy margines:Left/Right margins:Settings LiniaLineSettingsInterlinia: Line spacing:SettingsWczytywanieLoadingSettings*Marginesy zewntrzne:Margins:Settings(Szeroko[ maksymalna Max widthSettings"BBdnie napisane: Misspelled:SettingsNowyNewSettingsBrak obrazuNo ImageSettings {adenNoneSettingsNicNothingSettingsPoprzedni st&yl Old st&yleSettings Przezroczysto[:Opacity:Settings ZarysOutlineSettingsPunkt widzeniaPOVSettings*Marginesy wewntrzne:Padding:Settings Akapit ParagraphSettingsOpcje akapituParagraph OptionsSettingsAkapity ParagraphsSettingsProcent PercentageSettingsPozycja: Position:Settings PostpProgressSettingsProporcjonalna ProportionalSettingsMo|e by konieczne ponowne uruchomienie programu manuskript, aby te ustawienia zaczBy dziaBa poprawnie.7Restarting Manuskript ensures all settings take effect.Settings4Przywr warto[ci domy[lneRestore defaultsSettingsKorekty RevisionsSettingsbKorekty to sposb na [ledzenie zmian. Dla ka|dego pliku tekstowego przechowuje wszelkie zmiany wprowadzone w tek[cie gBwnym, co pozwala zobaczy i przywrci poprzednie wersje.Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions.SettingsDo prawejRightSettingsPoka| po&stpS&how progressSettings,I&nteligentne usuwanie S&mart removeSettings,Zapisz przy zamkniciu Save on quitSettings.Zapisz do jednego plikuSave to one single fileSettingsZapisywanieSavingSettingsSkalowanieScaledSettings ZdanieSentenceSettingsUstawieniaSettingsSettings"Poka| liczb sBwShow &word countSettings.Poka| liczb ele&mentwShow ite&m countSettingsPoka| p&ostpShow p&rogressSettings&Poka| podsumowani&e Show summar&ySettings$Poka| podsumowanie Show summarySettingsPojedynczaSingleSettingsRozmiar:Size:Settings>Inteligentne czyszczenie pozwala na zachowanie pewnej liczby korekt. Zdecydowanie zaleca si jego u|ycie, |eby pliki nie byBy peBne tysica nieistotnych zmian.Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes.SettingsRozstaw:Spacing:Settings StatusStatusSettingsRozcignicie StretchedSettingsStylStyleSettings Styl:Style:Settings$Szeroko[ wcicia: Tab width:Settings TekstTextSettingsTBo tekstuText BackgroundSettingsOpcje tekstu Text OptionsSettingsObszar tekstu Text areaSettingsKolor tekstu: Text color:SettingsEdytor tekstu Text editorSettingsTekstEtykiety TextLabelSettingsNazwa motywu: Theme name:SettingsKafelkowanieTiledSettings TytuBTitleSettings*Grny/Dolny margines:Top/Bottom margins:SettingsPrzezroczysty TransparentSettings DrzewoTreeSettingsRodzaj:Type:Settings.Tryb maszyny do pisaniaTypewriter modeSettings2U|yj wstawiania blokowegoUse block insertion ofSettings WidokiViewsSettings"Ustawienia widokuViews settingsSettings Widoczne kolumnyVisible columnsSettingsSzeroko[:Width:SettingsTBo oknaWindow BackgroundSettingsLiczba sBw Word countSettingsDopasowanieZoomedSettings minut.minutes.SettingsNkorekty co 10 minut z ostatniej godziny*revisions per 10 minutes for the last hourSettingsJkorekty dzienne z ostatniego miesica$revisions per day for the last monthSettingsHkorekty co godzin z ostatniego dnia#revisions per hour for the last daySettingsLkorekty co minut z ostatnich 10 minut,revisions per minute for the last 10 minutesSettingsDkorekty co tydzieD do koDca [wiata'revisions per week till the end of timeSettingssekund.seconds.Settings$Dod&aj do sBownika&Add to dictionary SpellAction:&UsuD ze sBownika u|ytkownika&Remove from custom dictionary SpellAction Sugestie pisowniSpelling Suggestions SpellAction,O programie ManuskriptAbout ManuskriptaboutManuskript Manuskriptabout>Wersja oprogramowania w u|yciu:Software Versions in Use: aboutDialog WersjaVersion aboutDialogKompilujCompile abstractModelCelGoal abstractModelEtykietaLabel abstractModelPunkt widzeniaPOV abstractModel StatusStatus abstractModel TytuBTitle abstractModelLiczba sBw Word count abstractModel:Wczytane tBumaczenie z {}:{}.Loaded translation from {}: {}.app~Uwaga: Nie znaleziono tBumacza lub nie wczytano lokalizacji {}.:Note: No translator found or loaded from {} for locale {}.app<Podsumowanie w kilku zdaniach:Few sentences summary: basicItemViewFormularzForm basicItemViewCel:Goal: basicItemView6Podsumowanie w jednej liniiOne line summary basicItemViewPunkt widzenia:POV: basicItemViewLiczba sBw Word count basicItemViewImiNamecharacterModelNowa posta New charactercharacterModelWarto[ValuecharacterModel GBwnyMaincharacterTreeViewEpizodycznyMinorcharacterTreeViewPoboczny SecondarycharacterTreeViewPostacie Characters cheatSheethFiltruj (wpisz nazw czegokolwiek w twoim projekcie)2Filter (type the name of anything in your project) cheatSheetFormularzForm cheatSheet GBwnyMain cheatSheetEpizodycznyMinor cheatSheet WtkiPlots cheatSheetPoboczny Secondary cheatSheet TekstyTexts cheatSheet ZwiatWorld cheatSheet GBwnyMaincmbOutlineCharacterChoserEpizodycznyMinorcmbOutlineCharacterChoserNicNonecmbOutlineCharacterChoserPoboczny SecondarycmbOutlineCharacterChoser R|neVariouscmbOutlineCharacterChoser R|neVariouscmbOutlineLabelChoser R|neVariouscmbOutlineStatusChoserBZadokuj Narzdziownik z Wid|etamiDock Widgets ToolbarcollapsibleDockWidgetsFormularzForm completer$PeBne podsumowanie Full summary corkDelegate6Podsumowanie w jednej liniiOne line summary corkDelegateFormularzFormeditorWidget_uiEksportujExportexporterEksportuj do: Export to:exporter,Zarzdzaj eksporteramiManage exportersexporterPodgldPreviewexporterUstawieniaSettingsexporterB{} (jeszcze nie zaimplementowano){} (not implemented yet)exporterDialogl<html><head/><body><p>Filtruje ktre elementy bd zawarte w ostatecznym eksporcie.<br/><span style=" color:#773333;">(Jeszcze nie w peBni zaimplementowane.)</span></p></body></html>

Filters what items will be included in the final export.
(Not fully implemented yet.)

exporterSettings4Midzy folderem a tekstem:Between folder and text:exporterSettings&Pomidzy folderami:Between folders:exporterSettings4Midzy tekstem a folderem:Between text and folder:exporterSettings$Pomidzy tekstami:Between texts:exporterSettings Tre[ContentexporterSettings WBasnyCustomexporterSettings(WBasne zastpowanie:Custom replacements:exporterSettingsfZdecyduj co ma by zawarte w ostatecznym eksporcie.6Decide here what will be included in the final export.exporterSettingsPusta linia Empty lineexporterSettingsWBczoneEnabledexporterSettingsFi&ltryFi<ersexporterSettings FolderFolderexporterSettingsKrj pismaFontexporterSettingsRozmiar tekstu: Font size:exporterSettingsKrj pisma:Font:exporterSettingsFormularzFormexporterSettings@Potrzebuj wikszej ziarnisto[ciI need more granularityexporterSettingsJe[li zaznaczone, u|ywaj regularnych wyra|eD do zastpowania. Je[li odznaczone, zastpuje jako zwykBy tekst.ZIf checked, uses regular expression for replacement. If unchecked, replaced as plain text.exporterSettingsnIgnoruj status kompilatora (zawrzyj wszystkie elementy))Ignore compile status (include all items)exporterSettingsEtykietyLabelsexporterSettingsPodgldPreviewexporterSettings RegExpRegExpexporterSettings(UsuD podwjne spacjeRemove multiple spacesexporterSettings ZastpReplaceexporterSettings(Zastp --- znakiem Replace --- with —exporterSettings,Zastp ... znakiem Replace ... with …exporterSettingsNZastp podwjne cudzysBowy (") znakiem:Replace double quotes (") with:exporterSettingsRZastp pojedyncze cudzysBowy (') znakiem:Replace single quotes (') with:exporterSettingsOdstpy SeparationsexporterSettings StatusStatusexporterSettings*Elementy podlegajce: Subitems of:exporterSettings TekstTextexporterSettings TytuBTitleexporterSettingsTransformacjeTransformationsexporterSettings RodzajTypeexporterSettings4Zastpienia typograficzne:Typographic replacements:exporterSettingsZWithexporterSettings&{}Poziom {} folderu{}Level {} folderexporterSettings${}Poziom {} tekstu{}Level {} textexporterSettings<b>Wymaga:</b> Requires: exportersManager:<b>Status:</b> odinstalowane.Status: uninstalled.exportersManager WBasnyCustomexportersManagerZainstalowane InstalledexportersManagerNie znaleziono Not foundexportersManager8Ustaw {} [cie|k wykonujc.Set {} executable path.exportersManagerx{} nie znaleziono. Zainstaluj to albo ustaw [cie|k rcznie./{} not found. Install it, or set path manually.exportersManagerCzstotliwo[ FrequencyfrequencyAnalyzer FrazyPhrasesfrequencyAnalyzer SBowoWordfrequencyAnalyzer ZegarClockfullScreenEditor.Zegar: wy[wietl sekundyClock: Show SecondsfullScreenEditorNawigacja NavigationfullScreenEditorNowy tekstNew TextfullScreenEditor PostpProgressfullScreenEditorBPostp: automatycznie poka|/ukryjProgress: Auto Show/HidefullScreenEditor&Sprawdzanie pisowni SpellcheckfullScreenEditorWybr motywwTheme selectorfullScreenEditor Motyw:Theme:fullScreenEditor TytuBTitlefullScreenEditor4TytuB: poka| peBn [cie|kTitle: Show Full PathfullScreenEditorLicznik sBw Word countfullScreenEditor{} sBw{} wordsfullScreenEditor{} sBw / {} {} words / {}fullScreenEditor OglneGeneralgeneralSettings>Importuj na najwy|szym folderzeImport in a top-level foldergeneralSettingsImportuj pod: Import under:generalSettings Podziel sceny w:Split scenes at:generalSettingsFPrzytnij dBugie tytuBy (> 32 znaki)Trim long titles (> 32 chars)generalSettings\n---\n\n---\ngeneralSettingsxJe[li nie chcesz nie widzie mo|esz mnie ukry w menu Pomoc.8If you don't wanna see me, you can hide me in Help menu. helpLabelWybierz plik Choose fileimporterWyczy[ plik Clear fileimporterFormat:Format:importer ImportImportimporterPodgldPreviewimporterUstawieniaSettingsimporter R|neVarious lineEditView minut minuteslocker sBw wordslockerFormularzFormlockerZablokuj !Lock !lockerEkran blokady: Lock screen:lockerCel czasowy Time targetlockerCel sBw Word targetlocker{} pozostaBo {} remaininglocker {} s.{} s.locker"{} pozostaBo sBw{} words remaininglocker {}:{}{}:{}locker~{} godz.~{} h.locker~{} mn.~{} mn.lockerAlt+GraAlt+Up mainEditorF11F11 mainEditorFormularzForm mainEditor.Idz do elementu-rodzicaGo to parent item mainEditor Karty katalogowe Index cards mainEditor ZarysOutline mainEditorKatalog gBwnyRoot mainEditor TekstText mainEditor{} sBw  {} words  mainEditor{} sBw / {} {} words / {}  mainEditorMarkdownMarkdownmarkdownSettingsFormularzForm metadataView$PeBne podsumowanie Full summary metadataView(Notatki / ReferencjeNotes / References metadataView:Podsumowanie w jednej linijceOne line summary metadataViewWBa[ciwo[ci Properties metadataViewKorekty Revisions metadataViewPodsumowanieSummary metadataViewAuto-ukrywanie Auto-hidemyPanel&Kopiuj&Copy outlineBasics &UsuD&Delete outlineBasics &Wklej&Paste outlineBasics&ZmieD nazw&Rename outlineBasics<p><b>Za chwil usuniesz {} plik(i).</b></p><p>Czy jeste[ tego pewien?</p>D

You're about to delete {} item(s).

Are you sure?

 outlineBasicsZaraz usunAbout to remove outlineBasicsWszystkie elementy musz znajdowa si w tym samym katalogu (musz mie tego samego rodzica).<b>Nieznana referencja:</b> {}.Unknown reference: {}. references*Podstawowe informacje Basic info references"Posta: <b>{}</b>Character: {} referencesPostaci Characters referencesKonfliktConflict referencesOpis Description references,SzczegBowe informacje Detailed info references(Epifania (ol[nienie)Epiphany references&Folder: <b>1{}</b>2Folder: {} referencesIdz do {}. Go to {}. referencesCelGoal referencesEtykieta:Label: references(DBugie podsumowanie: Long summary: references(DBu|sze podsumowanieLonger summary referencesUmotywowanie Motivation references0Nie jest referencj: {}.Not a reference: {}. referencesNotatki:Notes: referencesPunkt widzenia:POV of: referencesPunkt widzenia:POV: references PasjaPassion referencesZcie|ka:Path: references Wtek: <b>{}</b>Plot: {} referencesOdniesione w:Referenced in: references"Kroki rozwizaniaResolution steps referencesRezultatResult references(Krtkie podsumowanie Short summary references*Krtkie podsumowanie:Short summary: referencesStatystyki:Stats: referencesStatus:Status: references Tekst: <b>{}</b>Text: {} references0Nieznana referencja: {}.Unknown reference: {}. references<Zwiat: <b>{nazwa}</b>{[cie|ka}World: {name}{path} references1 dzieD temu 1 day ago revisions Wyczy[ wszystko Clear all revisionsUsuDDelete revisionsFormularzForm revisionsLinia {}:Line {}: revisions OpcjeOptions revisionsPrzywrRestore revisions$Poka| dawn wersjShow ancient version revisions"Poka| modyfikacjeShow modifications revisions.Poka| tylko modyfikacjeShow modifications only revisionsPoka| spacje Show spaces revisions{} dni temu {} days ago revisions{} godzin temu {} hours ago revisions{} minut temu{} minutes ago revisions {} miesicy temu {} months ago revisions{} sekund temu{} seconds ago revisions{} lat temu {} years ago revisionsWszystkoAllsearch4Uwzgldniaj wielko[ literCase sensitivesearchFormularzFormsearchEtykietaLabelsearchNotatkiNotessearch Opcje:Options:searchPunkt widzeniaPOVsearchSzukaj... Search for...searchSzukaj w: Search in:search StatusStatussearchPodsumowanieSummarysearch TekstTextsearch TytuBTitlesearch& (tylko-do-odczytu) (read-only)settingsWindowBBdErrorsettingsWindowFPliki obrazu (*.jpg; *.jpeg; *.png)"Image files (*.jpg; *.jpeg; *.png)settingsWindowNowa etykieta New labelsettingsWindowNowy status New statussettingsWindowNowy motyw New themesettingsWindowOtwrz obraz Open ImagesettingsWindowBBBd dodania wybranego obrazu: {} Unable to add selected image: {}settingsWindow@BBd wczytywania wybranego plikuUnable to load selected filesettingsWindownowymotywnewthemesettingsWindowFormularzForm sldImportance GBwnyMain sldImportanceEpizodycznyMinor sldImportancePoboczny Secondary sldImportance EtykietaTekstowa TextLabel sldImportanceRozdziel '{}' Split '{}' splitDialog.Obiekty do rozdzielenia Split items splitDialogFormularzForm storylineViewPoka| PostacieShow Characters storylineView,Poka| wtki narracyjne Show Plots storylineView6Zamknij rozdzielenie widoku Close split tabSplitterNOtwrz zaznaczone obiekty w tym widoku.!Open selected items in that view. tabSplitter Rozdziel poziomoSplit horizontally tabSplitter Rozdziel pionowoSplit vertically tabSplitter R|neVarious textEditView CTRL+BCTRL+B textFormat CTRL+ECTRL+E textFormat CTRL+ICTRL+I textFormat CTRL+JCTRL+J textFormat CTRL+LCTRL+L textFormat CTRL+PCTRL+P textFormat CTRL+RCTRL+R textFormat CTRL+UCTRL+U textFormatFormularzForm textFormat(Minimalizuj Wszystko Collapse AlltreeViewMinimalizuj Collapse {}treeView*Maksymalizuj Wszystko Expand AlltreeViewMaksymalizuj {} Expand {}treeView11welcomeH<b>Acznie:</b> {} sBw (~ {} stron)#Total: {} words (~ {} pages)welcomeDodaj poziom Add levelwelcome$Dodaj licznik sBwAdd word countwelcomeKsi|kaBookwelcomeRozdziaBChapterwelcomeNowyCreatewelcomeNowy ProjektCreate New Projectwelcome,Projekt demonstracyjny Demo projectswelcome PustyEmptywelcomePusta historia Empty fictionwelcomePusty artykuBEmpty non-fictionwelcome FikcjaFictionwelcomeWersja finalnaFinalwelcomePierwszy szkic First draftwelcomeFormularzFormwelcome PomysBIdeawelcomeManuskript Manuskriptwelcome4projekt Manuskript (*.msk)Manuskript project (*.msk)welcome^projekt Manuskript (*.msk);;Wszystkie pliki (*))Manuskript project (*.msk);;All files (*)welcomehNastpnym razem automatycznie otwrz ostatni projekt*Next time, automatically open last projectwelcomeArtykuB Non-fictionwelcome UwagiNotewelcomePowie[NovelwelcomeKrtka powie[NovellawelcomeOtwrz projekt Open projectwelcomeOtwrz...Open...welcome8Nadpisa obecny projekt {} ?Overwrite existing project {} ?welcomeOstatnieRecentwelcomePraca badawczaResearchwelcomeArtykuB naukowyResearch paperwelcome,Zapisz projekt jako...Save project as...welcome ScenaScenewelcomeDrugi szkic Second draftwelcome SekcjaSectionwelcomeOpowiadanie Short StorywelcomeCo[ SomethingwelcomeDO ZROBIENIATODOwelcomeSzablony Templateswelcome TekstTextwelcomeTrylogiaTrilogywelcomeOstrze|enieWarningwelcomezofwelcomesBw ka|dy. words each.welcomeArchitektura Architecture worldModelAstronomia Astronomy worldModel Jzyk mowy ciaBaBodily language worldModelKalendarzCalendar worldModel KlimatClimate worldModel Zaloty Courtship worldModelKulturyCultural worldModelZwyczajeCustoms worldModelDemografia Demography worldModelChorobyDiseases worldModel UbirDresses worldModelEdukacja Education worldModel EtykaEthics worldModel0Budowanie [wiata fantasyFantasy world building worldModel FloraFlora worldModel{ywno[Food worldModel*Role zwizane z pBci Gender roles worldModel0Rzd (ustrj polityczny) Government worldModelHistoriaHistory worldModelWa|ne obiektyImportant objects worldModelWa|ne miejscaImportant places worldModel Jzyki Languages worldModel Magia Magic system worldModel Magiczne obiektyMagical objects worldModel Magiczne miejscaMagical places worldModelMagiczne rasy Magical races worldModelMedycynaMedicine worldModelWojskowo[Military worldModelMuzyka i sztukaMusic and arts worldModel Zasoby naturalneNatural resources worldModelNowy obiektNew item worldModelOrganizacje Organization worldModelWygld fizycznyPhysical worldModelPolitykaPolitics worldModelRasyRaces worldModelReligieReligion worldModel ZasadyRules worldModel NaukaScience worldModelTechnologia Technology worldModelTopografia Topography worldModelTransportTransportation worldModelDzika przyroda Wild life worldModel , manuskript-0.10.0/i18n/manuskript_pl.ts000066400000000000000000005457011354442177200200310ustar00rootroot00000000000000 Export Standalone document (not just a fragment) Samodzielny dokument (nie tylko fragment) Include a table of contents. Dołącz spis treści. Number of sections level to include in TOC: Liczba poziomów sekcji do zawarcia w TOC: Typographically correct output Typograficznie poprawne Normalize the document (cleaner) Znormalizuj dokument (czystsza składnia) Specify the base level for headers: Ustal bazowy poziom dla nagłówków: Disable YAML metadata block. Use that if you get YAML related error. Wyłącz blok metadanych YAML. Włącz tę opcję jeśli otrzymasz błąd związany z YAML. Use reference-style links instead of inline links Użyj odnośników zamiast linków wbudowanych Use ATX-style headers Użyj nagłówków typu AXT Self-contained HTML files, with no dependencies Samozawierające pliki html, bez plików zależnych Use <q> tags for quotes in HTML Użyj taga <q> dla cytatów w HTML LaTeX engine used to produce the PDF. Silnik LaTeX używany do tworzenia plików PDF. Convert to ePUB3 Konwertuj do ePUB3 Paper size: Rozmiar papieru: Font size: Rozmiar czcionki: Class: Klasa: Line spacing: Rozmiar interlinii: Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. Tak jak zwykły tekst, z wyjątkiem dodawania znaczników tytułów. Zakłada, że teksty są sformatowane za pomocą znaczników. Preview with highlighter. Podgląd z zaznaczeniem. A little known format modestly used. You know, web sites for example. Format mało znany, rzadko używany. No wiesz, na przykład do stron internetowych. Books that don't kill trees. Książki, które nie zabijają drzew. OpenDocument format. Used by LibreOffice for example. Format OpenDocument. Używany przez np. LibreOffice. Microsoft Office (.docx) document. Dokument Microsoft Office (.docx). Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. Eksport do formatu markdown, za pomocą programu pandoc. Pozwala na więcej opcji formatowania niż podstawowy eksporter Manuskript. reStructuredText is a lightweight markup language. reStructuredText to lekki język znaczników. LaTeX is a word processor and document markup language used to create beautiful documents. LaTeX to procesor tekstu i język znaczników dokumentu używany do tworzenia pięknych dokumentów. The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. Celem tego formatu jest zapewnienie sposobu wymiany informacji pomiędzy outlinerem a serwisami internetowymi, które mogą być przeglądane lub kontrolowane przez outliner. Needs LaTeX to be installed. Wymaga zainstalowanego LaTeX. a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. prawidłowa instalacja LaTeX. Zobacz rekomendacje pandoc na: <a href="http://pandoc.org/installing.html">http://pandoc.org/installing.html</a>. Jeśli chcesz wsparcia unicode, potrzebujesz XeLateX. <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> <p>Uniwersalny konwerter dokumentów. Może być używany do konwersji języka Markdown do szerokiej gamy innych formatów.</p> <p>Strona internetowa: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> Error Błąd Basic HTML output using the Python module 'markdown'. Podstawowe wyjście HTML używające modułu Python 'markdown'. Python module 'markdown'. moduł Python 'markdown'. Markdown source Źródło markdown HTML Source Źródło HTML HTML Output Wyjście HTML Plain text Zwykły tekst Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. Najprostszy eksport do zwykłego tekstu. Pozwala na użycie własnego języka markup niezrozumiałego dla manuskript, na przykład <a href='www.fountain.io'>Fountain</a>. Default exporter, provides basic formats used by other exporters. Domyślny eksporter, zapewnia podstawowe formaty używane przez inne eksportery. Could not process regular expression: {} Błąd podczas przetwarzania wyrażenia regularnego: {} Choose output file… Wybierz plik wyjściowy ExportersManager Manage Exporters Zarządzaj Eksporterami Manuskript Manuskript Description Opis Offers export to Eksportuj do Status Status Status: Status: Version: Wersja: Path: Ścieżka: ... ... {HelpText} {TekstPomocy} FrequencyAnalyzer Frequency Analyzer Analizator Częstotliwości Word frequency Częstotliwość słów Settings Ustawienia Minimum size: Minimalny rozmiar: Exclude words (comma separated): Wyklucz słowa (oddzielone przecinkiem): Analyze Analizuj Phrase frequency Częstotliwość wyrażeń Number of words: from Liczba słów: od to do Import Markdown import Import markdown <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; <b>Informacja:</b> Bardzo prosty parser, który prześledzi znaczniki dokumentu i stworzy pozycje dla każdego tytułu.<br/>&nbsp; Folder import Import folderu <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> <p><b>Informacja:</b>Importuje strukturę całego katalogu. Foldery są dodawane jako foldery a pliki tekstowe wewnątrz folderów (ty wybierasz które poprzez rozszerzenie) jako sceny.</p> <p>Wspierane są tylko pliki tekstowe (nie obrazy, pliki binarne, inne).</p> Include only those extensions: Uwzględnij wyłącznie te rozszerzenia: Comma separated values Wartości oddzielone przecinkiem Sort items by name Sortuj elementy wg nazwy Import folder then files Zaimportuj folder, a następnie pliki OPML Import Import OPML File open failed. Otwarcie pliku nie powiodło się. This does not appear to be a valid OPML file. To nie jest prawidłowy plik OPML. Pandoc import Import Pandoc <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; <b>Informacja:</b>Manuskript potrafi importować <b>markdown</b> i <b>OPML</b>. Pandoc przekonwertuje twoje dokumenty do któregoś z nich (zobacz opcję poniżej) i zostaną one zaimportowane do programu manuskript. Któryś z nich powinien dać lepsze efekty, zależnie od twojego dokumentu.<br/>&nbsp; Import using: Zaimportuj używając: Wrap lines: Zawijaj linie: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> <p>Czy pandoc powinien stworzyć kosmetyczne/niesemantyczne przerywanie wierszy?</p> <p><b>automatycznie</b>: zawija do 72 znaków.<br> <b>brak</b>: nie zawija wierszy.<br> <b>zachowaj</b>: próbuje zachować zawijanie wierszy z oryginalnego dokumentu.</p> Mind Map Import Import Mind Map This does not appear to be a valid Mind Map file. To nie jest prawidłowy plik Mind Map. Mind Map import Importuj Mind Map Import tip as: Importuj wskazówkę jako: Untitled Bez tytułu MDEditCompleter Insert reference Wprowadź odnośnik MainWindow General Ogólne Book information Informacje o książce Title Tytuł Subtitle Podtytuł Series Cykl Volume Tom Genre Gatunek License Licencja Author Autor Name Imię i nazwisko Email E-mail Summary Podsumowanie Situation: Sytuacja: Summary: Podsumowanie: One sentence W jednym zdaniu One paragraph W jednym akapicie One page W jednej stronie Full Pełne One sentence summary Podsumowanie jednozdaniowe One paragraph summary Podsumowanie jednoakapitowe Expand each sentence of your one paragraph summary to a paragraph Rozwiń każde zdanie podsumowania jednego akapitu do całego akapitu One page summary Podsumowanie jednostronicowe Full summary Pełne podsumowanie Next Dalej What if...? Co jeśli...? Characters Postaci Names Imiona Filter Filtruj Basic info Podstawowe informacje Motivation Umotywowanie Goal Cel Conflict Konflikt Epiphany Epifania (olśnienie) <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="right">Podsumowanie<br/> w jednym zdaniu</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> <html><head/><body><p align="right">Podsumowanie<br/> w jednym akapicie</p></body></html> Importance Znaczenie Notes Notatki Detailed info Szczegółowe informacje Plots Wątki Plot Wątek Character(s) Postać/-ci Description Opis Result Skutek Resolution steps Kroki prowadzące do rozwiązania Add plot step Dodaj etap fabuły World Świat Populates with empty data Zapełnia pustymi danymi More Więcej Source of passion Źródło pasji Source of conflict Źródło konfliktu Outline Zarys Editor Edytor Debug Debugowanie FlatData FlatData Persos Osoby Labels Etykiety &File &Plik &Recent &Ostatnie &Help &Pomoc &Tools &Narzędzia &Edit &Edycja &Format &Formatowanie &Header &Nagłówek &View &Widok &Mode &Tryb Organi&ze Organi&zuj &Cheat sheet Ś&ciągawka Sea&rch &Szukaj &Navigation &Nawigacja &Open &Otwórz Ctrl+O Ctrl+O &Save &Zapisz Ctrl+S Ctrl+S Sa&ve as... Za&pisz jako... Ctrl+Shift+S Ctrl+Shift+S &Quit &Zamknij Ctrl+Q Ctrl+Q &Show help texts &Pokaż podpowiedzi Ctrl+Shift+B Ctrl+Shift+B &Spellcheck &Sprawdzanie pisowni F9 F9 &Labels... &Etykiety... &Status... &Status... Tree Drzewo &Simple &Uproszczony &Fiction %Fikcji literackiej Index cards Karty katalogowe S&ettings U&stawienia F8 F8 &Close project &Zamknij projekt Co&mpile &Kompiluj F6 F6 &Frequency Analyzer &Analiza częstotliwości &About &O programie About Manuskript O Manuskript F7 F7 &Copy &Kopiuj Ctrl+C Ctrl+C C&ut &Wytnij Ctrl+X Ctrl+X &Paste W&klej Ctrl+V Ctrl+V Ctrl+Shift+K Ctrl+Shift+K Sp&lit at cursor Po&dziel w miejscu kursora Ctrl+K Ctrl+K M&erge P&ołącz Ctrl+M Ctrl+M Dupl&icate Dupl&ikuj &Delete &Usuń Del Del &Move Up P&rzesuń w górę Ctrl+Shift+Up Ctrl+Shift+Up M&ove Down Pr&zesuń w dół Ctrl+Shift+Down Ctrl+Shift+Down &Rename &Zmień nazwę F2 F2 &Level 1 (setext) &Poziom 1 (setext) Ctrl+Alt+1 Ctrl+Alt+1 Level &2 Poziom &2 Ctrl+Alt+2 Ctrl+Alt+2 Level &1 (atx) Poziom &1 (atx) Ctrl+1 Ctrl+1 L&evel 2 P&oziom 2 Ctrl+2 Ctrl+2 Level &3 Poziom &3 Ctrl+3 Ctrl+3 Level &4 Poziom &4 Ctrl+4 Ctrl+4 Level &5 Poziom &5 Ctrl+5 Ctrl+5 Level &6 Poziom &6 Ctrl+6 Ctrl+6 &Bold Pogru&bienie Ctrl+B Ctrl+B &Italic Pochylen&ie Ctrl+I Ctrl+I &Strike &Przekreślenie &Verbatim &Dosłownie Su&perscript Indeks &górny Ctrl++ Ctrl++ Subsc&ript Indeks &dolny Ctrl+- Ctrl+- Co&mment block Blok komentarza Ctrl+Shift+C Ctrl+Shift+C Clear &formats Wyczyść &formatowanie Ctrl+0 Ctrl+0 &Comment line(s) &Wiersz(-e) komentarza Ctrl+D Ctrl+D &Ordered list &Numerowanie &Unordered list &Wypunktowanie B&lockquote &Cytat Manuskript Manuskript Project {} saved. Projekt {} zapisany. WARNING: Project {} not saved. UWAGA: Nie zapisano projektu {}. Project {} loaded. Projekt {} wczytany. Project {} loaded with some errors: Projekt {} wczytany z błędami: * {} wasn't found in project file. * {} nie znaleziono w pliku projektu. Project {} loaded with some errors. Projekt {} wczytany z błędami. (~{} pages) (~{} stron) Words: {}{} Słowa: {}{} Book summary Podsumowanie książki Project tree Drzewo projektu Metadata Metadane Story line Linia fabularna Enter information about your book, and yourself. Wpisz informacje o swojej książce i o sobie. The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) Podstawowa sytuacja, sformułowana jako pytanie "Co jeśli...?". Na przykład: "Co jeśli najniebezpieczniejszy zły czarownik nie mógł zabić dziecka?" (Harry Potter) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Poświęć czas na przemyślenie jednego zdania (ok. 50 słów) podsumowania swojej książki. Następnie rozwiń je do akapitu, następnie do strony, a następnie do pełnego podsumowania. Create your characters. Stwórz swoich bohaterów. Develop plots. Opracuj wątki. Build worlds. Create hierarchy of broad categories down to specific details. Buduj światy. Stwórz hierarchię szeroko zarysowanych kategorii do konkretnych szczegółów. Create the outline of your masterpiece. Stwórz zarys swojego dzieła. Write. Pisz. Debug info. Sometimes useful. Informacje debugowania. Czasem są użyteczne. Dictionary Słownik Nothing Nic POV Punkt widzenia Label Etykieta Progress Postęp Compile Kompiluj Icon color Kolor ikony Text color Kolor tekstu Background color Kolor tła Icon Ikona Text Tekst Background Tło Border Ramka Corner Narożnik &Import… &importuj… &Split… &Podziel… Remove selected plot step(s) Usuń wybrany(e) etapy fabuły The file {} does not exist. Has it been moved or deleted? Plik {} nie istnieje. Czy został przeniesiony lub skasowany? Install {}{} to use spellcheck Zainstaluj {}{}, aby użyć sprawdzania pisowni {} has no installed dictionaries {} nie ma zainstalowanych słowników {}{} is not installed {}{} jest niezainstalowany Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings Settings Ustawienia General Ogólne Revisions Korekty Views Widoki Labels Etykiety Status Status Fullscreen Pełny ekran General settings Ustawienia ogólne Application settings Ustawienia aplikacji Style: Styl: Language: Język: Font size: Rozmiar tekstu: Restarting Manuskript ensures all settings take effect. Może być konieczne ponowne uruchomienie programu manuskript, aby te ustawienia zaczęły działać poprawnie. Loading Wczytywanie Automatically load last project on startup Po uruchomieniu automatycznie wczytaj ostatni projekt Saving Zapisywanie Automatically save every Zapisuj automatycznie co minutes. minut. If no changes during Jeśli nie ma żadnych zmian przez seconds. sekund. Save on project close Zapisz przy zamknięciu <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> <html><head/><body><p>Jeśli wybierzesz tę opcję twój projekt zostanie zapisany jako pojedynczy plik. Łatwiej go kopiować lub tworzyć kopi zapasową, ale nie pozwala on na współpracę w zespole i wersjonowanie.<br/>Jeśli ta opcja jest odznaczona twój projekt zostanie zapisany jako folder zawierający wiele małych plików.</p></body></html> Save to one single file Zapisz do jednego pliku Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. Korekty to sposób na śledzenie zmian. Dla każdego pliku tekstowego przechowuje wszelkie zmiany wprowadzone w tekście głównym, co pozwala zobaczyć i przywrócić poprzednie wersje. Keep revisions Zachowuj korekty S&mart remove I&nteligentne usuwanie Keep: Zachowaj: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. Inteligentne czyszczenie pozwala na zachowanie pewnej liczby korekt. Zdecydowanie zaleca się jego użycie, żeby pliki nie były pełne tysiąca nieistotnych zmian. revisions per day for the last month korekty dzienne z ostatniego miesiąca revisions per minute for the last 10 minutes korekty co minutę z ostatnich 10 minut revisions per hour for the last day korekty co godzinę z ostatniego dnia revisions per 10 minutes for the last hour korekty co 10 minut z ostatniej godziny revisions per week till the end of time korekty co tydzień do końca świata Views settings Ustawienia widoku Tree Drzewo Colors Kolory Icon color: Kolor ikony: Nothing Nic POV Punkt widzenia Label Etykieta Progress Postęp Compile Kompiluj Text color: Kolor tekstu: Background color: Kolor tła: Icon Size Rozmiar ikony TextLabel TekstEtykiety Folders Foldery Show ite&m count Pokaż liczbę ele&mentów Show &word count Pokaż liczbę słów S&how progress Pokaż po&stęp Show summar&y Pokaż podsumowani&e &Nothing &Nic Text Tekst &Show word count Pokaż liczbę &słów Show p&rogress Pokaż p&ostęp Show summary Pokaż podsumowanie Outline Zarys Visible columns Widoczne kolumny Goal Cel Word count Liczba słów Percentage Procent Title Tytuł Index cards Karty katalogowe Background Tło Color: Kolor: Ctrl+S Ctrl+S Image: Obraz: Style Styl Old st&yle Poprzedni st&yl &New style &Nowy styl Item colors Kolory elementów Border color: Kolor obramowania: Corner color: Kolor narożnika: Text editor Edytor tekstu Background: Tło: Transparent Przezroczysty Restore defaults Przywróć wartości domyślne Font Krój tekstu Family: Rodzina: Size: Rozmiar: Misspelled: Błędnie napisane: Text area Obszar tekstu Max width Szerokość maksymalna px px Left/Right margins: Lewy/Prawy margines: Top/Bottom margins: Górny/Dolny margines: Paragraphs Akapity Alignment: Wyrównanie: Left Do lewej Center Wyśrodkowanie Right Do prawej Justify Justowanie Line spacing: Interlinia: Single Pojedyncza 1.5 lines 1.5 linii Double Podwójna Proportional Proporcjonalna % % Tab width: Szerokość wcięcia: Indent 1st line Wcięcie pierwszej linii Spacing: Rozstaw: Cursor Kursor Use block insertion of Użyj wstawiania blokowego Disable blinking Wyłącz miganie Typewriter mode Tryb maszyny do pisania Focus mode Tryb skupienia None Żaden Sentence Zdanie Line Linia Paragraph Akapit New Nowy Edit Edytuj Delete Usuń Theme name: Nazwa motywu: Apply Zastosuj Cancel Anuluj Window Background Tło okna Text Background Tło tekstu Text Options Opcje tekstu Paragraph Options Opcje akapitu Type: Rodzaj: No Image Brak obrazu Tiled Kafelkowanie Centered Wyśrodkowanie Stretched Rozciągnięcie Scaled Skalowanie Zoomed Dopasowanie Opacity: Przezroczystość: Position: Pozycja: Width: Szerokość: Corner radius: Promień narożnika: Margins: Marginesy zewnętrzne: Padding: Marginesy wewnętrzne: Font: Krój tekstu: Alignment Wyrównanie <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions Sugestie pisowni &Add to dictionary Dod&aj do słownika &Remove from custom dictionary &Usuń ze słownika użytkownika about About Manuskript O programie Manuskript Manuskript Manuskript aboutDialog Version Wersja Software Versions in Use: Wersja oprogramowania w użyciu: abstractModel Title Tytuł POV Punkt widzenia Label Etykieta Status Status Compile Kompiluj Word count Liczba słów Goal Cel basicItemView Form Formularz POV: Punkt widzenia: Goal: Cel: Word count Liczba słów One line summary Podsumowanie w jednej linii Few sentences summary: Podsumowanie w kilku zdaniach: characterModel New character Nowa postać Name Imię Value Wartość characterTreeView Main Główny Secondary Poboczny Minor Epizodyczny cheatSheet Form Formularz Filter (type the name of anything in your project) Filtruj (wpisz nazwę czegokolwiek w twoim projekcie) Minor Epizodyczny Secondary Poboczny Main Główny Characters Postacie Texts Teksty Plots Wątki World Świat cmbOutlineCharacterChoser None Nic Main Główny Secondary Poboczny Minor Epizodyczny Various Różne cmbOutlineLabelChoser Various Różne cmbOutlineStatusChoser Various Różne collapsibleDockWidgets Dock Widgets Toolbar Zadokuj Narzędziownik z Widżetami completer Form Formularz corkDelegate One line summary Podsumowanie w jednej linii Full summary Pełne podsumowanie editorWidget_ui Form Formularz exporter Export Eksportuj Export to: Eksportuj do: Manage exporters Zarządzaj eksporterami Preview Podgląd Settings Ustawienia exporterDialog {} (not implemented yet) {} (jeszcze nie zaimplementowano) exporterSettings Form Formularz Content Treść Decide here what will be included in the final export. Zdecyduj co ma być zawarte w ostatecznym eksporcie. Type Rodzaj Title Tytuł Text Tekst I need more granularity Potrzebuję większej ziarnistości Fi&lters Fi&ltry <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> <html><head/><body><p>Filtruje które elementy będą zawarte w ostatecznym eksporcie.<br/><span style=" color:#773333;">(Jeszcze nie w pełni zaimplementowane.)</span></p></body></html> Ignore compile status (include all items) Ignoruj status kompilatora (zawrzyj wszystkie elementy) Subitems of: Elementy podlegające: Labels Etykiety Status Status Separations Odstępy Between folders: Pomiędzy folderami: Empty line Pusta linia Custom Własny Between texts: Pomiędzy tekstami: Between folder and text: Między folderem a tekstem: Between text and folder: Między tekstem a folderem: Transformations Transformacje Typographic replacements: Zastąpienia typograficzne: Replace ... with … Zastąp ... znakiem … Replace --- with — Zastąp --- znakiem — Replace double quotes (") with: Zastąp podwójne cudzysłowy (") znakiem: Replace single quotes (') with: Zastąp pojedyncze cudzysłowy (') znakiem: Remove multiple spaces Usuń podwójne spacje Custom replacements: Własne zastępowanie: Enabled Włączone Replace Zastąp With Z RegExp RegExp If checked, uses regular expression for replacement. If unchecked, replaced as plain text. Jeśli zaznaczone, używaj regularnych wyrażeń do zastępowania. Jeśli odznaczone, zastępuje jako zwykły tekst. Preview Podgląd Font Krój pisma Font: Krój pisma: Font size: Rozmiar tekstu: Folder Folder {}Level {} folder {}Poziom {} folderu {}Level {} text {}Poziom {} tekstu exportersManager Installed Zainstalowane Custom Własny Not found Nie znaleziono {} not found. Install it, or set path manually. {} nie znaleziono. Zainstaluj to albo ustaw ścieżkę ręcznie. <b>Status:</b> uninstalled. <b>Status:</b> odinstalowane. <b>Requires:</b> <b>Wymaga:</b> Set {} executable path. Ustaw {} ścieżkę wykonującą. frequencyAnalyzer Phrases Frazy Frequency Częstotliwość Word Słowo fullScreenEditor Theme: Motyw: {} words / {} {} słów / {} {} words {} słów Spellcheck Sprawdzanie pisowni Navigation Nawigacja New Text Nowy tekst Title Tytuł Title: Show Full Path Tytuł: pokaż pełną ścieżkę Theme selector Wybór motywów Word count Licznik słów Progress Postęp Progress: Auto Show/Hide Postęp: automatycznie pokaż/ukryj Clock Zegar Clock: Show Seconds Zegar: wyświetl sekundy generalSettings General Ogólne Split scenes at: Podziel sceny w: \n---\n \n---\n Trim long titles (> 32 chars) Przytnij długie tytuły (> 32 znaki) Import under: Importuj pod: Import in a top-level folder Importuj na najwyższym folderze helpLabel If you don't wanna see me, you can hide me in Help menu. Jeśli nie chcesz nie widzieć możesz mnie ukryć w menu Pomoc. importer Import Import Format: Format: Choose file Wybierz plik Clear file Wyczyść plik Preview Podgląd Settings Ustawienia lastAccessedDirectoryInfo Last accessed directory "{}" loaded. lineEditView Various Różne locker Form Formularz Lock screen: Ekran blokady: Word target Cel słów Time target Cel czasowy words słów minutes minut Lock ! Zablokuj ! ~{} h. ~{} godz. ~{} mn. ~{} mn. {}:{} {}:{} {} s. {} s. {} remaining {} pozostało {} words remaining {} pozostało słów mainEditor Form Formularz Go to parent item Idź do elementu-rodzica Alt+Up Alt+Góra Text Tekst Index cards Karty katalogowe Outline Zarys F11 F11 Root Katalog główny {} words / {} {} słów / {} {} words {} słów markdownSettings Markdown Markdown metadataView Form Formularz Properties Właściwości Summary Podsumowanie One line summary Podsumowanie w jednej linijce Full summary Pełne podsumowanie Notes / References Notatki / Referencje Revisions Korekty myPanel Auto-hide Auto-ukrywanie outlineBasics Root Katalog główny Open {} items in new tabs Otwórz {} elementy w nowych kartach Open {} in a new tab Otwórz {} w nowej karcie New &Folder Nowy &Folder New &Text Nowy &Tekst C&ut Wy&tnij &Copy &Kopiuj &Paste &Wklej &Delete &Usuń &Rename &Zmień nazwę Set POV Ustaw punkt widzenia None Brak Main Główny Secondary Poboczny Minor Epizodyczny Set Status Ustaw status Set Label Ustaw etykietę Set Custom Icon Ustaw własną ikonę Restore to default Przywróć domyślne New Nowy About to remove Zaraz usunę <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> <p><b>Za chwilę usuniesz {} plik(i).</b></p><p>Czy jesteś tego pewien?</p> Select at least two items. Folders are ignored. Wybierz co najmniej dwa elementy. Foldery są ignorowane. All items must be on the same level (share the same parent). Wszystkie elementy muszą znajdować się w tym samym katalogu (muszą mieć tego samego rodzica). outlineCharacterDelegate None Brak Main Główny Secondary Poboczny Minor Epizodyczny outlineItem {} words / {} ({}) {} słów / {} ({}) {} words {} słów pandocSettings General Ogólne Table of Content Spis treści Custom settings for {} Własne ustawienia dla {} persosProxyModel Main Główny Secondary Poboczny Minors Epizodyczny plotDelegate General Ogólne Promise Obietnica Problem Konflikt Progress Postęp Resolution Rozwiązanie Try / Fail Próba / niepowodzenie No and Nie i Yes but Tak, ale Freytag's pyramid Piramida Freytaga Exposition Przedstawienie Rising action Wzrost akcji Climax Punkt kulminacyjny Falling action Spadek akcji Three acts Trzy akty 1. Setup 1. Układ 1. Inciting event 1. Rozpoczęcie akcji 1. Turning point 1. Punkt zwrotny 2. Choice 2. Wybór 2. Reversal 2. Zwrot 2. Disaster 2. Katastrofa 3. Stand up 3. Stawienie czoła 3. Climax 3. Punkt kulminacyjny 3. Ending 3. Zakończenie Hero's journey Podróż bohatera Ordinary world Zwyczajny świat Call to adventure Zew przygody Refusal of the call Odmowa wezwania Meeting with mentor Spotkanie z mentorem Tests Testy Approach Podejście Abyss Przepaść Reward / Revelation Nagroda / Odkrycie Transformation Przemiana Atonement Odkupienie Return Powrót plotModel New plot Nowy wątek Name Nazwa Meta Meta New step Nowy krok Main Główny Secondary Poboczny Minor Epizodyczny plotTreeView Main Główny Secondary Poboczny Minor Epizodyczny **Plot:** {} **Wątek:** {} plotsProxyModel Main Główny Secondary Poboczne Minors Epizodyczni propertiesView Form Formularz POV Punkt widzenia Status Status Label Etykieta Compile Opracowanie Goal Cel Word count Licznik wyrazów references Not a reference: {}. Nie jest referencją: {}. Unknown reference: {}. Nieznana referencja: {}. Path: Ścieżka: Stats: Statystyki: POV: Punkt widzenia: Status: Status: Label: Etykieta: Short summary: Krótkie podsumowanie: Long summary: Długie podsumowanie: Notes: Notatki: Basic info Podstawowe informacje Detailed info Szczegółowe informacje POV of: Punkt widzenia: Go to {}. Idź do {}. Motivation Umotywowanie Goal Cel Conflict Konflikt Epiphany Epifania (olśnienie) Short summary Krótkie podsumowanie Longer summary Dłuższe podsumowanie Description Opis Result Rezultat Characters Postaci Resolution steps Kroki rozwiązania Passion Pasja <b>Unknown reference:</b> {}. <b>Nieznana referencja:</b> {}. Folder: <b>{}</b> Folder: <b>1{}</b>2 Text: <b>{}</b> Tekst: <b>{}</b> Character: <b>{}</b> Postać: <b>{}</b> Plot: <b>{}</b> Wątek: <b>{}</b> World: <b>{name}</b>{path} Świat: <b>{nazwa}</b>{ścieżka} Referenced in: Odniesione w: revisions Form Formularz Options Opcje Restore Przywróć Delete Usuń Show modifications Pokaż modyfikacje Show ancient version Pokaż dawną wersję Show spaces Pokaż spacje Show modifications only Pokaż tylko modyfikacje {} years ago {} lat temu {} months ago {} miesięcy temu {} days ago {} dni temu 1 day ago 1 dzień temu {} hours ago {} godzin temu {} minutes ago {} minut temu {} seconds ago {} sekund temu Line {}: Linia {}: Clear all Wyczyść wszystko search Form Formularz Search for... Szukaj... Search in: Szukaj w: All Wszystko Title Tytuł Text Tekst Summary Podsumowanie Notes Notatki POV Punkt widzenia Status Status Label Etykieta Options: Opcje: Case sensitive Uwzględniaj wielkość liter settingsWindow New status Nowy status New label Nowa etykieta newtheme nowymotyw New theme Nowy motyw (read-only) (tylko-do-odczytu) Open Image Otwórz obraz Image files (*.jpg; *.jpeg; *.png) Pliki obrazu (*.jpg; *.jpeg; *.png) Error Błąd Unable to load selected file Błąd wczytywania wybranego pliku Unable to add selected image: {} Błąd dodania wybranego obrazu: {} sldImportance Form Formularz TextLabel EtykietaTekstowa Minor Epizodyczny Secondary Poboczny Main Główny splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> Split '{}' Rozdziel '{}' Split items Obiekty do rozdzielenia storylineView Form Formularz Show Plots Pokaż wątki narracyjne Show Characters Pokaż Postacie tabSplitter Open selected items in that view. Otwórz zaznaczone obiekty w tym widoku. Split horizontally Rozdziel poziomo Close split Zamknij rozdzielenie widoku Split vertically Rozdziel pionowo textEditView Various Różne textFormat Form Formularz CTRL+B CTRL+B CTRL+I CTRL+I CTRL+U CTRL+U CTRL+P CTRL+P CTRL+L CTRL+L CTRL+E CTRL+E CTRL+R CTRL+R CTRL+J CTRL+J treeView Expand {} Maksymalizuj {} Collapse {} Minimalizuj Expand All Maksymalizuj Wszystko Collapse All Minimalizuj Wszystko welcome Form Formularz 1 1 Templates Szablony Empty Pusty Novel Powieść Novella Krótka powieść Short Story Opowiadanie Research paper Artykuł naukowy Demo projects Projekt demonstracyjny Add level Dodaj poziom Add word count Dodaj licznik słów Next time, automatically open last project Następnym razem automatycznie otwórz ostatni projekt Open... Otwórz... Recent Ostatnie Create Nowy Open project Otwórz projekt Manuskript project (*.msk);;All files (*) projekt Manuskript (*.msk);;Wszystkie pliki (*) Save project as... Zapisz projekt jako... Manuskript project (*.msk) projekt Manuskript (*.msk) Manuskript Manuskript Create New Project Nowy Projekt Warning Ostrzeżenie Overwrite existing project {} ? Nadpisać obecny projekt {} ? Empty fiction Pusta historia Chapter Rozdział Scene Scena Trilogy Trylogia Book Książka Section Sekcja Empty non-fiction Pusty artykuł words each. słów każdy. of z Text Tekst Something Coś <b>Total:</b> {} words (~ {} pages) <b>Łącznie:</b> {} słów (~ {} stron) Fiction Fikcja Non-fiction Artykuł Idea Pomysł Note Uwagi Research Praca badawcza TODO DO ZROBIENIA First draft Pierwszy szkic Second draft Drugi szkic Final Wersja finalna worldModel New item Nowy obiekt Fantasy world building Budowanie świata fantasy Physical Wygląd fizyczny Climate Klimat Topography Topografia Astronomy Astronomia Wild life Dzika przyroda Flora Flora History Historia Races Rasy Diseases Choroby Cultural Kultury Customs Zwyczaje Food Żywność Languages Języki Education Edukacja Dresses Ubiór Science Nauka Calendar Kalendarz Bodily language Język mowy ciała Ethics Etyka Religion Religie Government Rząd (ustrój polityczny) Politics Polityka Gender roles Role związane z płcią Music and arts Muzyka i sztuka Architecture Architektura Military Wojskowość Technology Technologia Courtship Zaloty Demography Demografia Transportation Transport Medicine Medycyna Magic system Magia Rules Zasady Organization Organizacje Magical objects Magiczne obiekty Magical places Magiczne miejsca Magical races Magiczne rasy Important places Ważne miejsca Important objects Ważne obiekty Natural resources Zasoby naturalne manuskript-0.10.0/i18n/manuskript_pt_BR.qm000066400000000000000000002171241354442177200204060ustar00rootroot00000000000000ӿLUQT_T؄VEVEVEàVasdXddaNceM Jl*y;*y*<*%<|*0=+E=+f>s+>+?p+A1.3=093q";eA[G:GȽHw9jJKL7NLGLbLb;M|{M6JMezpMezMŅQNWQ:tKRxSRxt{RxRxRx4TbTbTbTbCTbnTbϞTbTbTU#UjUUjTUlV':jVVW6XW6XyX|YEYVYȀƝZzZ%Zʳ'ZϳD[[ %c[ %P[ %h[ %[ %~[ %[ٵ9\A\l\\^i$eH^i$tgUnRO73^-s!6Gr(YyBwr0rwo*fAk~TsY.BuaDC~Da"sj-  NEP2vi+Mt}LՉ3q6ΖݰCʯslGDxl9}n Y}^^;BgqahYz{~h&qP6u6:>CPDf3@##'ҳP.S~M[@7#N~L0W>H1v3tcML#UAIVTWu]1} ^Vi@7tRWp:.YZpk.(^N:ʶ'&)J'/!ȳƩ"&n׮0JEKHFKN^_aNhlwp=l.+q0WUrwbUpq:Fnnnn nEojoor#zTbDIEIm*Zm]j9jzՈ6Zm6mHVIIIJJ*JOJtnKtK,o&,|bo]%]iGt6%o7S bMĚG7nSEvD;:P*bNW:/Cs?!?_S}rMДv-!&$'ֿ'3SK'3t'3+5!5@V@VѲHu:QhDˠVjW9jښjejUjw-lcX\lqsgoW}V}Z w}ZumTh4[4V G~]~\JN%I} jB@FATÊST]t9*j?I& <5d"ߺ ~evYu *0u ` GqotvcT%ĒH&t/tO09$Cs[CsCĵJCLt*M+HHM+(R!|TunE=`x@l^m?$m<mmmmjmna{pdGrz zw{~~,Z]e!Ra.dDžz0W0w0֣֝csx: L1 UZq 2<!vva5|N Iǹ#t)H\0e1@1~\gG4Nl=DrJ9arfySЂDϗϗ ϗP50@̋EwYxAS` tLd°^Èv=[&У[ sxGSy!ߕjY,N3 S7aBnBLHAE MP[5j~]*ljb.hfx~2G~2H~2}ZvZvڬa]G(xSnT^f^@~='ʶ!e˙sDvyk .Ԍ < σT F> HZ( +4 ?:Ex Mg MgL Mg_ T ^Y\ ^y ^ ^P g: r,|k z   -N \ %^;  Uy Uª շ z C I4 zyN #n ?@ 08 3 9sR 9ss, 9s? >c_& A^ Rb`} ZX dpeH dpen! dpei dpe+ d) d) d)A d) d) d) d)Y d): d) d) e n* o"`C }(v4 T B;# fm *# : - : ,; , 8^ 8\ 8u ʶ U N  Q 9My J ; #e Q8Z U~3 ]Yd l. s3Y }j" % . ? t? H?8 Hw : f] 5: > p ^  G@ L ڔ4 u` 5 YM& _ G iC ӨS% y* WU   R / 1U` 4 ;k Cj^ G Nr Z$m b i?[E pkS rIjz }3G !T o U     } ) ޔ  x$   k s  `7 'j TW $& $T. $ $9 n& ,X %7} #\# s#& s~ s s ɠB Cy u ǹ F DYJ DYJ DZK Jz K' bp0 i8: W Pm .8 S  H  ^ ) 0k Ğt;^ <Q <p < <6 < aI ⋙V eO B uY'a:2#2)GY6eE9Vr<+sHZI4OqݴUhOWGjKQD$; %0i$MjlkN̺n 8KY S); =Q>WBxS4fQyR_DR_Ad@fqpt4|oN:~` ~`"|"|]ittj:q>5PNi5i<p>Um conversor de documentos universal. Pode ser usado para converter markdown em uma gama de outros formatos.</p> <p>Site: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> 

A universal document converter. Can be used to convert markdown to a wide range of other formats.

Website: http://pandoc.org/

ExportUm formato pouco conhecido usado modestamente. Voc sabe, sites, por exemplo.EA little known format modestly used. You know, web sites for example.ExporthSada HTML bsica usando o mdulo Python 'markdown'.5Basic HTML output using the Python module 'markdown'.Export:Livros que no matam rvores.Books that don't kill trees.ExportClasse:Class:Export&Converte para ePUB3Convert to ePUB3ExportExportador padro, fornece formatos bsicos usados por outros exportadores.ADefault exporter, provides basic formats used by other exporters.ExportDesativar o bloco de metadados YAML. Use isso se voc receber um erro relacionado ao YAML.DDisable YAML metadata block. Use that if you get YAML related error.ExportErroErrorExportExportar para markdown, usando pandoc. Permite mais opes de formatao do que o exportador bsico do manuskript.hExport to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter.Export"Tamanho da Fonte: Font size:ExportDestino HTML HTML OutputExportFonte HTML HTML SourceExport"Inclua um ndice.Include a table of contents.Export(Assim como o texto simples, as excees adicionam ttulos de marcao. Pressupe que os textos so formatados em markdown.Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown.ExportTMecanismo LaTeX usado para produzir o PDF.%LaTeX engine used to produce the PDF.ExportO LaTeX um processador de texto e uma linguagem de marcao de documentos usada para criar documentos.LaTeX is a word processor and document markup language used to create beautiful documents.Export2Espaamento entre linhas: Line spacing:Export"Fonte de MarkdownMarkdown sourceExportLDocumento do Microsoft Office (.docx)."Microsoft Office (.docx) document.ExportHPrecisa de ltex para ser instalado.Needs LaTeX to be installed.ExportDNormalize o documento (mais limpo) Normalize the document (cleaner)ExportVNmero de sees a serem includas no TOC: ,Number of sections level to include in TOC: ExportrFormato OpenDocument. Usado pelo LibreOffice por exemplo.5OpenDocument format. Used by LibreOffice for example.Export"Tamanho do papel: Paper size:ExportTexto simples Plain textExport0Visualizar com marcador.Preview with highlighter.Export2mdulo Python 'markdown'.Python module 'markdown'.ExportZArquivos html independentes, sem dependncias/Self-contained HTML files, with no dependenciesExportjExportao simples para texto simples. Permite que voc use sua prpria marcao no entendida pelo manuskript, por exemplo <a href='www.fountain.io'>Fountain</a>.Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example Fountain.ExportZEspecifique o nvel base para os cabealhos: $Specify the base level for headers: ExportXDocumento autnomo (no apenas um fragmento))Standalone document (not just a fragment)ExporthO objetivo deste formato fornecer uma maneira de trocar informaes entre delineadores e servios da Internet que podem ser pesquisados ou controlados atravs de um delineador.The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner.Export<Sada tipograficamente corretaTypographically correct outputExportLUse as tags <q> para marcaes em HTMLUse tags for quotes in HTMLExport8Use cabealhos no estilo ATXUse ATX-style headersExport^Use links de referncia em vez de links in-line1Use reference-style links instead of inline linksExportuma instalao de ltex vlida. Veja as recomendaes sobre pandoc em: <a href="http://pandoc.org/installing.html">http://pandoc.org/installing.html</a>. Se voc quiser suporte unicode, voc precisa do xelatex.a valid LaTeX installation. Pandoc recommendations can be found on: pandoc.org/installing.html. If you want Unicode support, you need XeLaTeX.ExportjreStructuredText uma linguagem de marcao leve ...2reStructuredText is a lightweight markup language.Export...ExportersManagerDescrio DescriptionExportersManager,Gerenciar exportadoresManage ExportersExportersManager ManuskriptExportersManager.Oferece exportao paraOffers export toExportersManagerCaminho:Path:ExportersManagerSituaoStatusExportersManagerSituao:Status:ExportersManagerVerso:Version:ExportersManager {HelpText}ExportersManagerAnalisarAnalyzeFrequencyAnalyzerRExcluir palavras (separadas por vrgula): Exclude words (comma separated):FrequencyAnalyzer0Analisador de FreqnciaFrequency AnalyzerFrequencyAnalyzerTamanho mnimo: Minimum size:FrequencyAnalyzer,Nmero de palavras: deNumber of words: fromFrequencyAnalyzer&Frequncia de frasePhrase frequencyFrequencyAnalyzerConfiguraesSettingsFrequencyAnalyzer,Freqncia de palavrasWord frequencyFrequencyAnalyzerparatoFrequencyAnalyzerP<b>Info:</b> Um analisador muito simples que ir processa o documento markdown e criar itens para cada ttulo<br/>&nbsp;Info: A very simple parser that will go through a markdown document and create items for each titles.
 Import<b>Info:</b> Manuskript pode importar de <b>markdown</b> ou <b>OPML</b>. Pandoc pode converter seu documento para qualquer (veja opes abaixo), e ento pode ser importado no manuskript. Um ou o outro pode-se trazer melhores resultados dependendo do seu documento. <br/>&nbsp;}Info: Manuskript can import from markdown or OPML. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document.
 Import<p><b>Info:</b> Importa toda estrutura do diretrio. Pastas so adicionadas as pastas, e e os documentos de textos dentro (voc escolhe quais, por extenso) so adicionados como cenas.</p> <p>Somente arquivos de texto so suportados (imagens, arquivos binrios e outros no).</p>R

Info: Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.

Only text files are supported (not images, binary or others).

Import<p>O pandoc pode criar cosmtica/ linhas de quebra no semntica?</p><p> <b>auto</b>: quebra de 72 caracteres.<br> <b>nenhum</b>: sem quebra de linha<br> <b>preservar</b>: tenta preservar a quebra de linha do documento original.</p>Q

Should pandoc create cosmetic / non-semantic line-breaks?

auto: wraps at 72 characters.
none: no line wrap.
preserve: tries to preserves line wrap from the original document.

Import:Valores separados por vrgulaComma separated valuesImport:Falha na abertura do arquivo.File open failed.Import&Importao de pasta Folder importImport>Importar pastas depois arquivosImport folder then filesImport0Dica de importao como:Import tip as:Import$Importao usando: Import using:Import<Inclua apenas essas extenses:Include only those extensions:Import,Importao de MarkdownMarkdown importImport2Importao do Mapa MentalMind Map ImportImport(Importar Mapa MentalMind Map importImportImporta OPML OPML ImportImport"Importao Pandoc Pandoc importImport,Ordenar itens por nomeSort items by nameImportjIsso no parece ser um arquivo de Mapa Mental vlido.1This does not appear to be a valid Mind Map file.ImportVEste no parece ser um arquivo OPML vlido.-This does not appear to be a valid OPML file.ImportSem ttuloUntitledImport Linhas cobertas: Wrap lines:Import$Inserir refernciaInsert referenceMDEditCompleter (~{} pginas) (~{} pages) MainWindow\ * {} no foi encontrado o arquivo do projeto.# * {} wasn't found in project file. MainWindow S&obre&About MainWindow&Folha de notas &Cheat sheet MainWindow"Fe&char o projeto&Close project MainWindow&Copiar&Copy MainWindow&Deletar&Delete MainWindow&Editar&Edit MainWindow&Fico&Fiction MainWindow&Arquivo&File MainWindow2Analizador de &Frequencia&Frequency Analyzer MainWindow &Ajuda&Help MainWindow&Importar & &Import… MainWindow&Rtulos... &Labels... MainWindow &Modo&Mode MainWindow &Mover para cima&Move Up MainWindow&Navegao &Navigation MainWindow &Abrir&Open MainWindow Co&lar&Paste MainWindow &Sair&Quit MainWindow&Recente&Recent MainWindow&Renomear&Rename MainWindow&Salvar&Save MainWindow0&Mostrar textos de ajuda&Show help texts MainWindow&Simples&Simple MainWindow0&Verificao ortogrfica &Spellcheck MainWindow&Separar & &Split… MainWindow &Status... MainWindow&Ferramentas&Tools MainWindow&Vizualizar&View MainWindow<html><head/><body><p align="right">Um pargrafo<br/>sumrio</p></body></html>O

One paragraph
summary

 MainWindow<html><head/><body><p align="right">Uma sentena<br/>sumrio</p></body></html>N

One sentence
summary

 MainWindow$Sobre o ManuskriptAbout Manuskript MainWindowLAdicionar etapa de enredo (CTRL+Enter) Add plot step MainWindow AutorAuthor MainWindow Fundo Background MainWindowCor do fundoBackground color MainWindow"Informao basica Basic info MainWindow(Informaes do livroBook information MainWindow Sumrio do livro Book summary MainWindow BordaBorder MainWindowConstrua mundos. Crie hierarquia de categorias mais amplas at os detalhes especficos.MBuild worlds. Create hierarchy of broad categories down to specific details. MainWindowC&ortarC&ut MainWindowPersonagens Character(s) MainWindowPersonagens Characters MainWindowCo&mpilarCo&mpile MainWindowCompilarCompile MainWindowConflitoConflict MainWindow CantoCorner MainWindow@Crie o esboo da sua obra-prima.'Create the outline of your masterpiece. MainWindow,Crie seus personagens.Create your characters. MainWindowCtrl+C MainWindowCtrl+D MainWindowCtrl+K MainWindowCtrl+M MainWindowCtrl+O MainWindowCtrl+Q MainWindowCtrl+S MainWindow Ctrl+Shift+B MainWindowCtrl+Shift+Down MainWindow Ctrl+Shift+K MainWindow Ctrl+Shift+S MainWindow Ctrl+Shift+Up MainWindowCtrl+V MainWindowCtrl+X MainWindowDepurarDebug MainWindowTInformaes de depurao. s vezes til.Debug info. Sometimes useful. MainWindowDel MainWindowDescrio Description MainWindowInfo Detalhada Detailed info MainWindow&Desenvolva enredos.Develop plots. MainWindowDicionrio Dictionary MainWindowDupl&icar Dupl&icate MainWindowEditor MainWindowEmail MainWindow`Insira informaes sobre seu livro e voc mesmo.0Enter information about your book, and yourself. MainWindowEpifaniaEpiphany MainWindowExpandir cada frase do sumrio de um pargrafo para um pargrafoAExpand each sentence of your one paragraph summary to a paragraph MainWindowF2 MainWindowF6 MainWindowF7 MainWindowF8 MainWindowF9 MainWindow FiltroFilter MainWindowDados simplesFlatData MainWindow CheioFull MainWindow Sumrio completo Full summary MainWindow GeralGeneral MainWindow GneroGenre MainWindowObjetivoGoal MainWindow coneIcon MainWindowCor do cone Icon color MainWindowImportncia Importance MainWindow"Cartes de ndice Index cards MainWindow RtuloLabel MainWindowRtulosLabels MainWindowLicenaLicense MainWindowJu&ntarM&erge MainWindow M&over pra baixo M&ove Down MainWindow Manuskript MainWindowMeta dadosMetadata MainWindowMaisMore MainWindowMotivao Motivation MainWindowNomeName MainWindow NomesNames MainWindowPrximoNext MainWindow NotasNotes MainWindowNadaNothing MainWindowUma pginaOne page MainWindow*Sumrio de uma pginaOne page summary MainWindowUm pargrafo One paragraph MainWindow.Sumrio de um pargrafoOne paragraph summary MainWindowUma frase One sentence MainWindow(Sumrio de uma fraseOne sentence summary MainWindowOrgani&zar Organi&ze MainWindow EsbooOutline MainWindowPonto de VistaPOV MainWindowPersonasPersos MainWindow EnredoPlot MainWindowEnredosPlots MainWindow2Preenche com dados vaziosPopulates with empty data MainWindowProgressoProgress MainWindow"rvore do projeto Project tree MainWindowLProjeto {} carregado com alguns erros.#Project {} loaded with some errors. MainWindow8Projeto {} com alguns erros:#Project {} loaded with some errors: MainWindow*Projeto {} carregado.Project {} loaded. MainWindow"Projeto {} salvo.Project {} saved. MainWindow&Etapas de resoluoResolution steps MainWindowResultadoResult MainWindowConfigura&es S&ettings MainWindowSa&lvar como... Sa&ve as... MainWindowP&rocurarSea&rch MainWindowSeries MainWindowSituao: Situation: MainWindow"Fonte do conflitoSource of conflict MainWindowFonte de paixoSource of passion MainWindow$Sep&arar no cursorSp&lit at cursor MainWindow"Linhas histricas Story line MainWindowLegendaSubtitle MainWindowSumrioSummary MainWindowSumrio:Summary: MainWindowdTire um tempo para pensar em uma frase (~50 palavras) sumrio do seu livro. Ento expanda isso para um pargrafo, depois para uma pgina e, em seguida, para um sumrio completo.Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. MainWindow TextoText MainWindowCor do texto Text color MainWindow>A situao bsica, na forma de um questionamento tipo 'e se ...'. Ex: 'E se o mais perigoso malvado feiticeiro no foi capaz de matar um beb?' (Harry Potter)The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) MainWindow TtuloTitle MainWindow rvoreTree MainWindowVolume MainWindowDAteno: Projeto {} no foi salvo.WARNING: Project {} not saved. MainWindowE se...? What if...? MainWindowPalavras: {}{} Words: {}{} MainWindow MundoWorld MainWindowEscreva.Write. MainWindow pxSettings%Settings &Nada&NothingSettings 1.5 entre linhas 1.5 linesSettingst<html><head/><body><p>Se voc marcar essa opo, seu projeto ser salvo como um nico arquivo. Mais fcil de copiar ou fazer backup, mas no permite edio colaborativa ou controle de verso.<br/>Se isso no for verificado, seu projeto ser salvo como uma pasta contendo muitos arquivos pequenos.</p></body></html>

If you check this option, your project will be save as one single file. Easier to copy or backup, but does not allow collaborative editing, or versionning.
If this is unchecked, your project will be save as a folder containing many small files.

SettingsAlinhamento AlignmentSettingsAlinhamento: Alignment:Settings&Estilo da aplicaoApplication settingsSettingsAplicarApplySettingstCarregar automaticamente o ltimo projeto na inicializao*Automatically load last project on startupSettings8Salvar automaticamente todosAutomatically save everySettings Fundo BackgroundSettingsCor de fundo:Background color:Settings Fundo: Background:SettingsCor da borda: Border color:SettingsCancelarCancelSettings CentroCenterSettingsCentralizadoCenteredSettingsCor:Color:Settings CoresColorsSettingsCompilarCompileSettingsCor do canto: Corner color:SettingsRaio do canto:Corner radius:SettingsCtrl+SSettingsCursorSettingsDeletarDeleteSettingsParar de piscarDisable blinkingSettings DuploDoubleSettings EditarEditSettingsFamilia:Family:Settings PastasFoldersSettings FonteFontSettings Fonte:Font:SettingsTela cheia FullscreenSettings GeralGeneralSettings(Configuraes geraisGeneral settingsSettingsObjetivoGoalSettings Tamanho do cone Icon SizeSettingsCor do cone: Icon color:Settings@Se no houver alteraes duranteIf no changes duringSettingsImagem:Image:Settings.Recuo da primeira linhaIndent 1st lineSettings$ndice dos cartes Index cardsSettingsCores dos Itens Item colorsSettingsJustificadoJustifySettings(Mantenha as revisesKeep revisionsSettingsManter:Keep:Settings RtuloLabelSettingsRtulosLabelsSettingsEsquerdaLeftSettings2Margens Esquerda/Direita:Left/Right margins:Settings2Espaamento entre linhas: Line spacing:SettingsCarregandoLoadingSettingsMargem:Margins:SettingsLargura mxima Max widthSettings.Com erros ortogrficos: Misspelled:SettingsNovoNewSettingsSem imagemNo ImageSettingsNadaNothingSettingsEs&tilo antigo Old st&yleSettingsOpacidade:Opacity:Settings EsbooOutlineSettingsPonto de VistaPOVSettingsPreenchimento:Padding:Settings&Opes do pargrafoParagraph OptionsSettingsPargrafos ParagraphsSettingsPorcentagem PercentageSettingsPosio: Position:SettingsProgressoProgressSettingsProporcional ProportionalSettings$Restaurar o padroRestore defaultsSettingsRevises RevisionsSettingsAs revises so uma maneira de acompanhar as modificaes. Para cada item de texto, ele armazena todas as alteraes feitas no texto principal, permitindo que voc veja e restaure verses anteriores.Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions.SettingsDireitaRightSettings(Mostrar o pr&ogressoS&how progressSettings(&Remoo inteligente S&mart removeSettingsSalvar ao sair Save on quitSettings4Salvar em um nico arquivoSave to one single fileSettingsSalvandoSavingSettingsDivididoScaledSettingsConfiguraesSettingsSettings2&Mostra contagem de itensShow ite&m countSettings(Mostrar o p&rogressoShow p&rogressSettings$Mostrar o sumr&io Show summar&ySettingsMostrar sumrio Show summarySettingsSimplesSingleSettingsTamanho:Size:SettingsRemoo inteligente permite que voc mantenha apenas um certo nmero de revises. Recomenda-se expressamente us-lo, para que o seu arquivo no fique cheio de milhares de alteraes insignificantes.Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes.SettingsEspaamento:Spacing:SettingsStatusSettingsEsticado StretchedSettings EstiloStyleSettings Largura da guia: Tab width:Settings TextoTextSettingsFundo do textoText BackgroundSettingsOpes do texto Text OptionsSettingsrea de texto Text areaSettingsCor do Texto: Text color:SettingsEditor de texto Text editorSettingsRtulo do Texto TextLabelSettingsNome do tema: Theme name:SettingsLado a ladoTiledSettings TtuloTitleSettings&Margens Cima/Baixo:Top/Bottom margins:SettingsTransparente TransparentSettings rvoreTreeSettings Tipo:Type:Settings6Use a insero de blocos deUse block insertion ofSettings Pontos de VistasViewsSettings.Configuraes de visualViews settingsSettings Colunas visveisVisible columnsSettingsLargura:Width:SettingsFundo da janelaWindow BackgroundSettings(Contagem de palavras Word countSettingsCom zoomZoomedSettingsminutos.minutes.SettingsTrevises por 10 minutos para a ltima hora*revisions per 10 minutes for the last hourSettingsJrevises por dia durante o ltimo ms$revisions per day for the last monthSettingsFrevises por hora para o ltimo dia#revisions per hour for the last daySettingsTrevises por minuto nos ltimos 10 minutos,revisions per minute for the last 10 minutesSettingsPrevises por semana at o final do tempo'revisions per week till the end of timeSettingssegundos.seconds.Settings0&Adicionar ao dicionrio&Add to dictionary SpellActionD&Remover do dicionrio customizado&Remove from custom dictionary SpellActionBSugestes de correo ortogrficaSpelling Suggestions SpellAction$Sobre o ManuskriptAbout Manuskriptabout Manuskriptabout6Verses de software em uso:Software Versions in Use: aboutDialogVersion aboutDialogCompilarCompile abstractModelObjetivoGoal abstractModelLabel abstractModelPonto de vistaPOV abstractModelStatus abstractModel TtuloTitle abstractModel(Contagem de palavras Word count abstractModel.Traduo carregada: {}.Loaded translation from {}: {}.appNota: Nenhum tradutor encontrado ou carregado para localidade {}.:Note: No translator found or loaded from {} for locale {}.app2Sumrio de poucas frases:Few sentences summary: basicItemViewFormulrioForm basicItemViewObjetivo:Goal: basicItemView(Sumrio de uma linhaOne line summary basicItemViewPonto de vista:POV: basicItemView(Contagem de palavras Word count basicItemViewNamecharacterModelNovo personagem New charactercharacterModel ValorValuecharacterModelPrincipalMaincharacterTreeViewMinorcharacterTreeViewSecundrio SecondarycharacterTreeViewPersonagens Characters cheatSheettFiltro (digite a palavra de qualquer coisa no seu projeto)2Filter (type the name of anything in your project) cheatSheetFormatoForm cheatSheetPrincipalMain cheatSheetMinor cheatSheetEnredosPlots cheatSheetSecundrio Secondary cheatSheet TextosTexts cheatSheetWorld cheatSheetPrincipalMaincmbOutlineCharacterChoserMinorcmbOutlineCharacterChoserNonecmbOutlineCharacterChoserSecundrio SecondarycmbOutlineCharacterChoser VriosVariouscmbOutlineCharacterChoser VariosVariouscmbOutlineLabelChoser VriosVariouscmbOutlineStatusChoser>Barra de ferramentas de widgetsDock Widgets ToolbarcollapsibleDockWidgetsFormulrioForm completer Sumrio completo Full summary corkDelegate(Sumrio de uma linhaOne line summary corkDelegateFormulrioFormeditorWidget_uiExportexporter Export to:exporter,Gerenciar exportadoresManage exportersexporterVisualizarPreviewexporterConfiguraesSettingsexporter6{} (no implementado ainda){} (not implemented yet)exporterDialog^<html><head/><body><p>Filtra quais itens sero includos na exportao final.<br/><span style=" color:#773333;">(No est completamente implementado.)</span></p></body></html>

Filters what items will be included in the final export.
(Not fully implemented yet.)

exporterSettings*Entre pastas e texto:Between folder and text:exporterSettingsEntre pastas:Between folders:exporterSettings(Entre texto e pasta:Between text and folder:exporterSettingsEntre textos:Between texts:exporterSettingsContentexporterSettingsPersonalizadoCustomexporterSettings:Substituies personalizadas:Custom replacements:exporterSettingshDecida aqui o que ser includo na exportao final.6Decide here what will be included in the final export.exporterSettingsLinha vazia Empty lineexporterSettingsHabilitadoEnabledexporterSettingsFi&ltrosFi<ersexporterSettings PastaFolderexporterSettingsFontexporterSettings"Tamanho da fonte: Font size:exporterSettingsFont:exporterSettingsFormulrioFormexporterSettings@Eu preciso de mais granularidadeI need more granularityexporterSettingsSe marcado, usa a expresso regular para substituio. Se desmarcado, substitudo como texto simples.ZIf checked, uses regular expression for replacement. If unchecked, replaced as plain text.exporterSettingsjIgnore o status de compilao (inclua todos os itens))Ignore compile status (include all items)exporterSettingsLabelsexporterSettingsPr-visualizarPreviewexporterSettingsRegExpexporterSettings,Remover vrios espaosRemove multiple spacesexporterSettingsSubstituirReplaceexporterSettings&Substituir--- com Replace --- with —exporterSettings&Substituir... com &Replace ... with …exporterSettings>Substitua aspas duplas (") por:Replace double quotes (") with:exporterSettingsDSubstitua as aspas simples(') por:Replace single quotes (') with:exporterSettingsSeparaes SeparationsexporterSettingsStatusexporterSettingsSubitens de: Subitems of:exporterSettingsTextexporterSettings TtuloTitleexporterSettingsTransformationsexporterSettingsTypeexporterSettings4Substities tipogrficas:Typographic replacements:exporterSettingsWithexporterSettings{}Nvel{} pasta{}Level {} folderexporterSettings{}Level {} textexporterSettings<b>Requer:</b> Requires: exportersManager<<b>Situao:</b> desinstalado.Status: uninstalled.exportersManagerPersonalizadoCustomexportersManagerInstalado InstalledexportersManagerNo encontrado Not foundexportersManager:Defina {} caminho executvel.Set {} executable path.exportersManager{} no encontrado. Instale-o ou configure o caminho manualmente./{} not found. Install it, or set path manually.exportersManager FrequencyfrequencyAnalyzer FrasesPhrasesfrequencyAnalyzerWordfrequencyAnalyzerProgressoProgressfullScreenEditorTheme:fullScreenEditor TtuloTitlefullScreenEditor(Contagem de palavras Word countfullScreenEditor{} palavras{} wordsfullScreenEditor {} palavras / {} {} words / {}fullScreenEditorGeneralgeneralSettingsNImportar em uma pasta de nvel superiorImport in a top-level foldergeneralSettingsImportar sob: Import under:generalSettings&Cenas divididas em:Split scenes at:generalSettingsDApare ttulos longos (> 32 letras)Trim long titles (> 32 chars)generalSettings\n---\ngeneralSettingstSe voc no quiser me ver, pode me esconder no menu Ajuda.8If you don't wanna see me, you can hide me in Help menu. helpLabel"Escolha o arquivo Choose fileimporter Limpar o arquivo Clear fileimporterFormat:importerImportimporterPr-visualizarPreviewimporterConfiguraesSettingsimporter VriosVarious lineEditView minuteslocker palavras wordslockerFormulrioFormlockerLock !locker Lock screen:lockerMeta de tempo Time targetlocker Meta de palavras Word targetlocker{} falatando {} remaininglocker{} s.locker({} palavras restando{} words remaininglocker{}:{}locker~{} h.locker~{} mn.lockerAlt+Up mainEditorF11 mainEditorFormulrioForm mainEditor Ir para item paiGo to parent item mainEditor"Cartes de ndece Index cards mainEditor EsbooOutline mainEditorRoot mainEditorText mainEditor{} palavras  {} words  mainEditor"{} palavras / {} {} words / {}  mainEditorMarkdownmarkdownSettingsFormulrioForm metadataView Sumrio completo Full summary metadataView&Notas / RefernciasNotes / References metadataView(Sumrio de uma linhaOne line summary metadataView Properties metadataViewRevises Revisions metadataViewSumrioSummary metadataView.Ocultar automaticamente Auto-hidemyPanel&Copiar&Copy outlineBasics&Delete outlineBasics &Colar&Paste outlineBasics&Renomear&Rename outlineBasics<p><b>Voc est prestes a excluir {} iten(s).</b></p><p>Voc tem certeza?</p>D

You're about to delete {} item(s).

Are you sure?

 outlineBasics"Prestes a removerAbout to remove outlineBasicsTodos os itens devem estar no mesmo nvel (estar no mesmo local).Referncia Desconhecida:</b> {}.Unknown reference: {}. references"Informao bsica Basic info references*Personagem: <b>{}</b>Character: {} referencesPersonagens Characters referencesConflitoConflict references Description references(Informao detalhada Detailed info referencesEpifaniaEpiphany references Pasta: <b>{}</b>Folder: {} references Go to {}. referencesObjetivoGoal referencesLabel: referencesSumrio longo: Long summary: referencesSumrio longoLonger summary referencesMotivao Motivation references4No um a referncia: {}.Not a reference: {}. referencesNotes: references$Ponto de vista de:POV of: referencesPonto de Vista:POV: references PaixoPassion referencesCaminho:Path: references"Enredo: <b>{}</b>Plot: {} references Referenciado em:Referenced in: references&Etapas de resoluoResolution steps referencesResultadoResult referencesSumrio curto Short summary referencesSumrio curto:Short summary: referencesStats: referencesStatus: referencesText: {} references8Referncia desconhecida: {}.Unknown reference: {}. referencesWorld: {name}{path} references1 dia atrs 1 day ago revisionsLimpar tudo Clear all revisionsDelete revisionsFormulrioForm revisionsLine {}: revisionsOptions revisionsRestaurarRestore revisions*Mostrar verso antigaShow ancient version revisions(Mostrar modificaesShow modifications revisions8Mostrar somente modificaesShow modifications only revisionsMostrar espaos Show spaces revisions{} dias atrs {} days ago revisions{} horas atrs {} hours ago revisions {} minutos atrs{} minutes ago revisions{} meses atrs {} months ago revisions"{} segundos atrs{} seconds ago revisions{} anos atrs {} years ago revisionsTudoAllsearchDDiferencia maisculas e minsculasCase sensitivesearchFormulrioFormsearchLabelsearchNotessearchOptions:searchPonto de vistaPOVsearchProcurar por... Search for...searchProcurar em: Search in:searchStatussearchSumrioSummarysearchTextsearch TtuloTitlesearch (ler somente) (read-only)settingsWindowErroErrorsettingsWindow New labelsettingsWindow New statussettingsWindow New themesettingsWindownovo temanewthemesettingsWindowFormulrioForm sldImportancePrincipalMain sldImportanceMinor sldImportanceSecundrio Secondary sldImportanceRtulo do texto TextLabel sldImportance* <p>Dividir o(s) item(ns) selecionado(s) na marca indicada.</p> <p>Se um dos itens selecionados for uma pasta, ele ser aplicado recursivamente para <i>todos</i> seus itens filhos.</p> <p>A marca de diviso pode conter as seguintes sequncias de escape: <ul> <li><b><code>\n</code></b>: quebra de linha</li> <li><b><code>\t</code></b>: tabulao</li> </ul> </p> <p><b>Marcador:</b></p> 

Split selected item(s) at the given mark.

If one of the selected item is a folder, it will be applied recursively to all of it's children items.

The split mark can contain following escape sequences:

  • \n: line break
  • \t: tab

Mark:

 splitDialogSeparar '{}' Split '{}' splitDialogSeparar itens Split items splitDialogFormulrioForm storylineView&Mostrar PersonagensShow Characters storylineViewMostrar Enredos Show Plots storylineView Fechar a diviso Close split tabSplitterHAbra itens selecionados nessa vista.!Open selected items in that view. tabSplitter.Dividir horizontalmenteSplit horizontally tabSplitter*Dividir verticalmenteSplit vertically tabSplitter VriosVarious textEditViewCTRL+B textFormatCTRL+E textFormatCTRL+I textFormatCTRL+J textFormatCTRL+L textFormatCTRL+P textFormatCTRL+R textFormatCTRL+U textFormatFormulrioForm textFormatRecolher Tudo Collapse AlltreeViewRecolher {} Collapse {}treeViewExpandir Tudo Expand AlltreeViewExpandir {} Expand {}treeView1welcomeP<b>Total:</b> {} palavras (~ {} pginas)#Total: {} words (~ {} pages)welcomeAdicionar nvel Add levelwelcome<Adicionar contagem de palavrasAdd word countwelcomeBookwelcomeCaptuloChapterwelcome CriarCreatewelcome*Criar um Novo ProjetoCreate New Projectwelcome0Projetos de demonstrao Demo projectswelcome VazioEmptywelcomeFico vazia Empty fictionwelcome No fico vaziaEmpty non-fictionwelcome FicoFictionwelcomeFinalwelcome"Primeiro rascunho First draftwelcomeFormulrioFormwelcomeIdeawelcome Manuskriptwelcome:Projeto do Manuskript (*.msk)Manuskript project (*.msk)welcomebProjeto do Manuskript (*.msk);;Todos arquivos (*))Manuskript project (*.msk);;All files (*)welcomejNa prxima vez, abra automaticamente o ltimo projeto*Next time, automatically open last projectwelcomeNo fico Non-fictionwelcomeNotewelcomeRomanceNovelwelcome NovelaNovellawelcome Open projectwelcomeOpen...welcomeBSubstituir projeto existente {} ?Overwrite existing project {} ?welcomeRecentwelcomePesquisaResearchwelcome$Artigo de pesquisaResearch paperwelcome0Salvar o projeto como...Save project as...welcomeCenaScenewelcome Segundo rascunho Second draftwelcome SeoSectionwelcomeHistria curta Short StorywelcomeAlguma coisa SomethingwelcomeTODOwelcomeModelos TemplateswelcomeTextwelcomeTrilogiaTrilogywelcome AlertaWarningwelcomeofwelcomepalavras cada. words each.welcomeArquitetura Architecture worldModelAstronomia Astronomy worldModel$Linguagem corporalBodily language worldModelCalendrioCalendar worldModel ClimaClimate worldModel Namoro Courtship worldModelCultural worldModelCostumesCustoms worldModelDemografia Demography worldModelDoenasDiseases worldModelVestidosDresses worldModelEducao Education worldModel ticaEthics worldModel>Construo do mundo de fantasiaFantasy world building worldModelFlora worldModel ComidaFood worldModel Papis de gnero Gender roles worldModelGoverno Government worldModelHistriaHistory worldModel&Objetos importantesImportant objects worldModel&Lugares importantesImportant places worldModelIdiomas Languages worldModelSistema mgico Magic system worldModelObjetos mgicosMagical objects worldModelLugares mgicosMagical places worldModel Corridas Mgicas Magical races worldModelMedicinaMedicine worldModelMilitaresMilitary worldModelMsica e artesMusic and arts worldModelNew item worldModelOrganizao Organization worldModel FsicoPhysical worldModelPolticaPolitics worldModelCorridasRaces worldModelReligioReligion worldModel RegrasRules worldModelCinciaScience worldModel Technology worldModelTopografia Topography worldModelTransporteTransportation worldModelVida selvagem Wild life worldModelmanuskript-0.10.0/i18n/manuskript_pt_BR.ts000066400000000000000000005463471354442177200204330ustar00rootroot00000000000000 Export Basic HTML output using the Python module 'markdown'. Saída HTML básica usando o módulo Python 'markdown'. Python module 'markdown'. módulo Python 'markdown'. Markdown source Fonte de Markdown HTML Source Fonte HTML HTML Output Destino HTML Default exporter, provides basic formats used by other exporters. Exportador padrão, fornece formatos básicos usados por outros exportadores. Preview with highlighter. Visualizar com marcador. Plain text Texto simples A little known format modestly used. You know, web sites for example. Um formato pouco conhecido usado modestamente. Você sabe, sites, por exemplo. Needs LaTeX to be installed. Precisa de látex para ser instalado. Error Erro Standalone document (not just a fragment) Documento autônomo (não apenas um fragmento) Include a table of contents. Inclua um índice. Number of sections level to include in TOC: Número de seções a serem incluídas no TOC: Typographically correct output Saída tipograficamente correta Normalize the document (cleaner) Normalize o documento (mais limpo) Specify the base level for headers: Especifique o nível base para os cabeçalhos: Use reference-style links instead of inline links Use links de referência em vez de links in-line Use ATX-style headers Use cabeçalhos no estilo ATX Self-contained HTML files, with no dependencies Arquivos html independentes, sem dependências Use <q> tags for quotes in HTML Use as tags <q> para marcações em HTML LaTeX engine used to produce the PDF. Mecanismo LaTeX usado para produzir o PDF. Paper size: Tamanho do papel: Font size: Tamanho da Fonte: Class: Classe: Line spacing: Espaçamento entre linhas: Books that don't kill trees. Livros que não matam árvores. OpenDocument format. Used by LibreOffice for example. Formato OpenDocument. Usado pelo LibreOffice por exemplo. Microsoft Office (.docx) document. Documento do Microsoft Office (.docx). reStructuredText is a lightweight markup language. reStructuredText é uma linguagem de marcação leve ... Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. Assim como o texto simples, as exceções adicionam títulos de marcação. Pressupõe que os textos são formatados em markdown. Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. Exportação simples para texto simples. Permite que você use sua própria marcação não entendida pelo manuskript, por exemplo <a href='www.fountain.io'>Fountain</a>. <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> <p>Um conversor de documentos universal. Pode ser usado para converter markdown em uma gama de outros formatos.</p> <p>Site: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. uma instalação de látex válida. Veja as recomendações sobre pandoc em: <a href="http://pandoc.org/installing.html">http://pandoc.org/installing.html</a>. Se você quiser suporte unicode, você precisa do xelatex. Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. Exportar para markdown, usando pandoc. Permite mais opções de formatação do que o exportador básico do manuskript. LaTeX is a word processor and document markup language used to create beautiful documents. O LaTeX é um processador de texto e uma linguagem de marcação de documentos usada para criar documentos. The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. O objetivo deste formato é fornecer uma maneira de trocar informações entre delineadores e serviços da Internet que podem ser pesquisados ou controlados através de um delineador. Disable YAML metadata block. Use that if you get YAML related error. Desativar o bloco de metadados YAML. Use isso se você receber um erro relacionado ao YAML. Convert to ePUB3 Converte para ePUB3 Could not process regular expression: {} Choose output file… ExportersManager Manage Exporters Gerenciar exportadores Manuskript Description Descrição Offers export to Oferece exportação para Status Situação Status: Situação: Version: Versão: Path: Caminho: ... {HelpText} FrequencyAnalyzer Frequency Analyzer Analisador de Freqüência Word frequency Freqüência de palavras Settings Configurações Minimum size: Tamanho mínimo: Exclude words (comma separated): Excluir palavras (separadas por vírgula): Analyze Analisar Phrase frequency Frequência de frase Number of words: from Número de palavras: de to para Import Markdown import Importação de Markdown <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; <b>Info:</b> Um analisador muito simples que irá processa o documento markdown e criar itens para cada título<br/>&nbsp; Folder import Importação de pasta <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> <p><b>Info:</b> Importa toda estrutura do diretório. Pastas são adicionadas as pastas, e e os documentos de textos dentro (você escolhe quais, por extensão) são adicionados como cenas.</p> <p>Somente arquivos de texto são suportados (imagens, arquivos binários e outros não).</p> Include only those extensions: Inclua apenas essas extensões: Comma separated values Valores separados por vírgula Sort items by name Ordenar itens por nome Import folder then files Importar pastas depois arquivos OPML Import Importa OPML File open failed. Falha na abertura do arquivo. This does not appear to be a valid OPML file. Este não parece ser um arquivo OPML válido. Pandoc import Importação Pandoc <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; <b>Info:</b> Manuskript pode importar de <b>markdown</b> ou <b>OPML</b>. Pandoc pode converter seu documento para qualquer (veja opções abaixo), e então pode ser importado no manuskript. Um ou o outro pode-se trazer melhores resultados dependendo do seu documento. <br/>&nbsp; Import using: Importação usando: Wrap lines: Linhas cobertas: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> <p>O pandoc pode criar cosmética/ linhas de quebra não semântica?</p><p> <b>auto</b>: quebra de 72 caracteres.<br> <b>nenhum</b>: sem quebra de linha<br> <b>preservar</b>: tenta preservar a quebra de linha do documento original.</p> Mind Map Import Importação do Mapa Mental This does not appear to be a valid Mind Map file. Isso não parece ser um arquivo de Mapa Mental válido. Mind Map import Importar Mapa Mental Import tip as: Dica de importação como: Untitled Sem título MDEditCompleter Insert reference Inserir referência MainWindow General Geral Title Título Subtitle Legenda Series Volume Genre Gênero License Licença Author Autor Name Nome Email Summary Sumário Situation: Situação: Summary: Sumário: One sentence Uma frase One paragraph Um parágrafo One page Uma página Full Cheio One sentence summary Sumário de uma frase One paragraph summary Sumário de um parágrafo Expand each sentence of your one paragraph summary to a paragraph Expandir cada frase do sumário de um parágrafo para um parágrafo One page summary Sumário de uma página Full summary Sumário completo Next Próximo What if...? E se...? Characters Personagens Names Nomes Filter Filtro Basic info Informação basica Importance Importância Motivation Motivação Goal Objetivo Conflict Conflito Epiphany Epifania <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="right">Uma sentença<br/>sumário</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> <html><head/><body><p align="right">Um parágrafo<br/>sumário</p></body></html> Notes Notas Detailed info Info Detalhada Plots Enredos Plot Enredo Character(s) Personagens Description Descrição Result Resultado Resolution steps Etapas de resolução World Mundo Populates with empty data Preenche com dados vazios More Mais Source of passion Fonte de paixão Source of conflict Fonte do conflito Outline Esboço Editor Debug Depurar FlatData Dados simples Persos Personas Labels Rótulos &File &Arquivo &Recent &Recente &Help &Ajuda &Tools &Ferramentas &Edit &Editar &View &Vizualizar &Mode &Modo &Cheat sheet &Folha de notas Sea&rch P&rocurar &Navigation &Navegação &Open &Abrir Ctrl+O &Save &Salvar Ctrl+S Sa&ve as... Sa&lvar como... Ctrl+Shift+S &Quit &Sair Ctrl+Q &Show help texts &Mostrar textos de ajuda Ctrl+Shift+B &Spellcheck &Verificação ortográfica F9 &Labels... &Rótulos... &Status... Tree Árvore &Simple &Simples &Fiction &Ficção Index cards Cartões de índice S&ettings Configuraçõ&es F8 &Close project Fe&char o projeto Co&mpile Co&mpilar F6 &Frequency Analyzer Analizador de &Frequencia Book information Informações do livro &About S&obre About Manuskript Sobre o Manuskript Manuskript Project {} saved. Projeto {} salvo. WARNING: Project {} not saved. Atenção: Projeto {} não foi salvo. Project {} loaded. Projeto {} carregado. Project {} loaded with some errors: Projeto {} com alguns erros: * {} wasn't found in project file. * {} não foi encontrado o arquivo do projeto. Project {} loaded with some errors. Projeto {} carregado com alguns erros. (~{} pages) (~{} páginas) Words: {}{} Palavras: {}{} Book summary Sumário do livro Project tree Árvore do projeto Metadata Meta dados Story line Linhas históricas Enter information about your book, and yourself. Insira informações sobre seu livro e você mesmo. The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) A situação básica, na forma de um questionamento tipo 'e se ...'. Ex: 'E se o mais perigoso malvado feiticeiro não foi capaz de matar um bebê?' (Harry Potter) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Tire um tempo para pensar em uma frase (~50 palavras) sumário do seu livro. Então expanda isso para um parágrafo, depois para uma página e, em seguida, para um sumário completo. Create your characters. Crie seus personagens. Develop plots. Desenvolva enredos. Build worlds. Create hierarchy of broad categories down to specific details. Construa mundos. Crie hierarquia de categorias mais amplas até os detalhes específicos. Create the outline of your masterpiece. Crie o esboço da sua obra-prima. Write. Escreva. Debug info. Sometimes useful. Informações de depuração. Às vezes é útil. Dictionary Dicionário Nothing Nada POV Ponto de Vista Label Rótulo Progress Progresso Compile Compilar Icon color Cor do ícone Text color Cor do texto Background color Cor do fundo Icon Ícone Text Texto Background Fundo Border Borda Corner Canto Add plot step Adicionar etapa de enredo (CTRL+Enter) &Import… &Importar… F7 &Copy &Copiar Ctrl+C C&ut C&ortar Ctrl+X &Paste Co&lar Ctrl+V &Split… &Separar… Ctrl+Shift+K Sp&lit at cursor Sep&arar no cursor Ctrl+K Ctrl+M Ctrl+D Del &Move Up &Mover para cima Ctrl+Shift+Up M&ove Down M&over pra baixo Ctrl+Shift+Down Dupl&icate Dupl&icar &Delete &Deletar &Rename &Renomear F2 Organi&ze Organi&zar M&erge Ju&ntar &Format &Header &Level 1 (setext) Ctrl+Alt+1 Level &2 Ctrl+Alt+2 Level &1 (atx) Ctrl+1 L&evel 2 Ctrl+2 Level &3 Ctrl+3 Level &4 Ctrl+4 Level &5 Ctrl+5 Level &6 Ctrl+6 &Bold Ctrl+B &Italic Ctrl+I &Strike &Verbatim Su&perscript Ctrl++ Subsc&ript Ctrl+- Co&mment block Ctrl+Shift+C Clear &formats Ctrl+0 &Comment line(s) &Ordered list &Unordered list B&lockquote Remove selected plot step(s) The file {} does not exist. Has it been moved or deleted? Install {}{} to use spellcheck {} has no installed dictionaries {}{} is not installed Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings Settings Configurações General Geral Revisions Revisões Views Pontos de Vistas Labels Rótulos Status Fullscreen Tela cheia General settings Configurações gerais Application settings Estilo da aplicação Loading Carregando Automatically load last project on startup Carregar automaticamente o último projeto na inicialização Saving Salvando Automatically save every Salvar automaticamente todos minutes. minutos. If no changes during Se não houver alterações durante seconds. segundos. Save on project close Salvar ao sair <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> <html><head/><body><p>Se você marcar essa opção, seu projeto será salvo como um único arquivo. Mais fácil de copiar ou fazer backup, mas não permite edição colaborativa ou controle de versão.<br/>Se isso não for verificado, seu projeto será salvo como uma pasta contendo muitos arquivos pequenos.</p></body></html> Save to one single file Salvar em um único arquivo Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. As revisões são uma maneira de acompanhar as modificações. Para cada item de texto, ele armazena todas as alterações feitas no texto principal, permitindo que você veja e restaure versões anteriores. Keep revisions Mantenha as revisões S&mart remove &Remoção inteligente Keep: Manter: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. Remoção inteligente permite que você mantenha apenas um certo número de revisões. Recomenda-se expressamente usá-lo, para que o seu arquivo não fique cheio de milhares de alterações insignificantes. revisions per day for the last month revisões por dia durante o último mês revisions per minute for the last 10 minutes revisões por minuto nos últimos 10 minutos revisions per hour for the last day revisões por hora para o último dia revisions per 10 minutes for the last hour revisões por 10 minutos para a última hora revisions per week till the end of time revisões por semana até o final do tempo Views settings Configurações de visual Tree Árvore Colors Cores Icon color: Cor do ícone: Nothing Nada POV Ponto de Vista Label Rótulo Progress Progresso Compile Compilar Text color: Cor do Texto: Background color: Cor de fundo: Folders Pastas Show ite&m count &Mostra contagem de itens Show summary Mostrar sumário &Nothing &Nada Text Texto Outline Esboço Visible columns Colunas visíveis Goal Objetivo Word count Contagem de palavras Percentage Porcentagem Title Título Index cards Índice dos cartões Item colors Cores dos Itens Border color: Cor da borda: Corner color: Cor do canto: Background Fundo Color: Cor: Ctrl+S Image: Imagem: Text editor Editor de texto Font Fonte Family: Familia: Size: Tamanho: Misspelled: Com erros ortográficos: Background: Fundo: Paragraphs Parágrafos Line spacing: Espaçamento entre linhas: Single Simples 1.5 lines 1.5 entre linhas Double Duplo Proportional Proporcional % Tab width: Largura da guia: px Indent 1st line Recuo da primeira linha Spacing: Espaçamento: New Novo Edit Editar Delete Deletar Theme name: Nome do tema: Apply Aplicar Cancel Cancelar Window Background Fundo da janela Text Background Fundo do texto Text Options Opções do texto Paragraph Options Opções do parágrafo Type: Tipo: No Image Sem imagem Tiled Lado a lado Centered Centralizado Stretched Esticado Scaled Dividido Zoomed Com zoom Opacity: Opacidade: Position: Posição: Left Esquerda Center Centro Right Direita Width: Largura: Corner radius: Raio do canto: Margins: Margem: Padding: Preenchimento: Font: Fonte: Style Estilo Cursor Use block insertion of Use a inserção de blocos de Alignment: Alinhamento: Justify Justificado Alignment Alinhamento Icon Size Tamanho do Ícone TextLabel Rótulo do Texto Disable blinking Parar de piscar Text area Área de texto Max width Largura máxima Left/Right margins: Margens Esquerda/Direita: Top/Bottom margins: Margens Cima/Baixo: S&how progress Mostrar o pr&ogresso Show summar&y Mostrar o sumár&io Show p&rogress Mostrar o p&rogresso Old st&yle Es&tilo antigo Transparent Transparente Restore defaults Restaurar o padrão Style: Language: Font size: Restarting Manuskript ensures all settings take effect. Show &word count &Show word count &New style Typewriter mode Focus mode None Sentence Line Paragraph <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions Sugestões de correção ortográfica &Add to dictionary &Adicionar ao dicionário &Remove from custom dictionary &Remover do dicionário customizado about About Manuskript Sobre o Manuskript Manuskript aboutDialog Version Software Versions in Use: Versões de software em uso: abstractModel Title Título POV Ponto de vista Label Status Compile Compilar Word count Contagem de palavras Goal Objetivo basicItemView Form Formulário POV: Ponto de vista: Goal: Objetivo: Word count Contagem de palavras One line summary Sumário de uma linha Few sentences summary: Sumário de poucas frases: characterModel New character Novo personagem Name Value Valor characterTreeView Main Principal Secondary Secundário Minor cheatSheet Form Formato Filter (type the name of anything in your project) Filtro (digite a palavra de qualquer coisa no seu projeto) Minor Secondary Secundário Main Principal Characters Personagens Texts Textos Plots Enredos World cmbOutlineCharacterChoser None Main Principal Secondary Secundário Minor Various Vários cmbOutlineLabelChoser Various Varios cmbOutlineStatusChoser Various Vários collapsibleDockWidgets Dock Widgets Toolbar Barra de ferramentas de widgets completer Form Formulário corkDelegate One line summary Sumário de uma linha Full summary Sumário completo editorWidget_ui Form Formulário exporter Export Export to: Manage exporters Gerenciar exportadores Preview Visualizar Settings Configurações exporterDialog {} (not implemented yet) {} (não implementado ainda) exporterSettings Form Formulário Content Decide here what will be included in the final export. Decida aqui o que será incluído na exportação final. Type Title Título Text I need more granularity Eu preciso de mais granularidade Fi&lters Fi&ltros <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> <html><head/><body><p>Filtra quais itens serão incluídos na exportação final.<br/><span style=" color:#773333;">(Não está completamente implementado.)</span></p></body></html> Ignore compile status (include all items) Ignore o status de compilação (inclua todos os itens) Subitems of: Subitens de: Labels Status Separations Separações Between folders: Entre pastas: Empty line Linha vazia Custom Personalizado Between texts: Entre textos: Between folder and text: Entre pastas e texto: Between text and folder: Entre texto e pasta: Transformations Typographic replacements: Substitições tipográficas: Replace double quotes (") with: Substitua aspas duplas (") por: Replace single quotes (') with: Substitua as aspas simples(') por: Remove multiple spaces Remover vários espaços Custom replacements: Substituições personalizadas: Enabled Habilitado Replace Substituir With RegExp If checked, uses regular expression for replacement. If unchecked, replaced as plain text. Se marcado, usa a expressão regular para substituição. Se desmarcado, substituído como texto simples. Preview Pré-visualizar Font Font: Font size: Tamanho da fonte: Folder Pasta {}Level {} folder {}Nível{} pasta {}Level {} text Replace ... with … Substituir... com … Replace --- with — Substituir--- com — exportersManager Installed Instalado Custom Personalizado Not found Não encontrado {} not found. Install it, or set path manually. {} não encontrado. Instale-o ou configure o caminho manualmente. <b>Status:</b> uninstalled. <b>Situação:</b> desinstalado. <b>Requires:</b> <b>Requer:</b> Set {} executable path. Defina {} caminho executável. frequencyAnalyzer Phrases Frases Frequency Word fullScreenEditor Theme: {} words / {} {} palavras / {} {} words {} palavras Spellcheck Navigation New Text Title Título Title: Show Full Path Theme selector Word count Contagem de palavras Progress Progresso Progress: Auto Show/Hide Clock Clock: Show Seconds generalSettings General Split scenes at: Cenas divididas em: \n---\n Trim long titles (> 32 chars) Apare títulos longos (> 32 letras) Import under: Importar sob: Import in a top-level folder Importar em uma pasta de nível superior helpLabel If you don't wanna see me, you can hide me in Help menu. Se você não quiser me ver, pode me esconder no menu Ajuda. importer Import Format: Choose file Escolha o arquivo Clear file Limpar o arquivo Preview Pré-visualizar Settings Configurações lastAccessedDirectoryInfo Last accessed directory "{}" loaded. lineEditView Various Vários locker Form Formulário Lock screen: Word target Meta de palavras Time target Meta de tempo words palavras minutes Lock ! ~{} h. ~{} mn. {}:{} {} s. {} remaining {} falatando {} words remaining {} palavras restando mainEditor Form Formulário Text Index cards Cartões de índece Outline Esboço F11 Go to parent item Ir para item pai Alt+Up Root {} words / {} {} palavras / {} {} words {} palavras markdownSettings Markdown metadataView Form Formulário Properties Summary Sumário One line summary Sumário de uma linha Full summary Sumário completo Notes / References Notas / Referências Revisions Revisões myPanel Auto-hide Ocultar automaticamente outlineBasics Set POV Setar o ponto de vista None Set Status Set Label New Main Principal Secondary Secundário Minor Set Custom Icon Definir ícone personalizado Restore to default Restaurar para o padrão Root Open {} items in new tabs Open {} in a new tab About to remove Prestes a remover <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> <p><b>Você está prestes a excluir {} iten(s).</b></p><p>Você tem certeza?</p> Select at least two items. Folders are ignored. Selecione pelo menos dois itens. Pastas são ignoradas. All items must be on the same level (share the same parent). Todos os itens devem estar no mesmo nível (estar no mesmo local). New &Folder Nova &Pasta New &Text &Copy &Copiar C&ut &Paste &Colar &Rename &Renomear &Delete outlineCharacterDelegate None Main Principal Secondary Secundário Minor outlineItem {} words / {} ({}) {} palavras / {} ({}) {} words {} palavras pandocSettings General Table of Content Custom settings for {} Configurações personalizadas para {} persosProxyModel Main Principal Secondary Secundário Minors Menores plotDelegate General Promise Promessa Problem Problema Progress Progresso Resolution Resolução Try / Fail Tentativa / Falha No and Não e Yes but Sim mas Freytag's pyramid Pirâmide de Freytag Exposition Exposição Rising action Ação crescente Climax Climáx Falling action Desfecho Three acts Três atos 1. Setup 1. Configuração 1. Inciting event Cruzando o Limiar 1. Turning point 1. Ponto de virada 2. Choice 2. Escolha 2. Reversal 2. Reversão 2. Disaster 2. Disastre 3. Stand up 3. Levante 3. Climax 3. Clímax 3. Ending 3. Finalizando Hero's journey Jornada do herói Ordinary world Mundo normal Call to adventure Chamada para a aventura Refusal of the call Recusa da chamada Meeting with mentor Encontro com o mentor Tests Testes Approach Abordagem Abyss Abismo Reward / Revelation Recompensa / Revelação Transformation Atonement Expiação Return plotModel New plot Novo enredo Name Meta New step Novo passo Main Principal Secondary Secundário Minor plotTreeView Main Principal Secondary Secundário Minor **Plot:** {} **Enredo:** {} plotsProxyModel Main Principal Secondary Secundário Minors Menores propertiesView Form Formulário POV Ponto de Vista Status Label Compile Compilar Goal Objetivo Word count Contagem de palavras references Not a reference: {}. Não é um a referência: {}. Unknown reference: {}. Referência desconhecida: {}. Path: Caminho: Stats: POV: Ponto de Vista: Status: Label: Short summary: Sumário curto: Long summary: Sumário longo: Notes: Basic info Informação básica Detailed info Informação detalhada POV of: Ponto de vista de: Go to {}. Description Result Resultado Characters Personagens Resolution steps Etapas de resolução Passion Paixão Conflict Conflito <b>Unknown reference:</b> {}. <b>Referência Desconhecida:</b> {}. Folder: <b>{}</b> Pasta: <b>{}</b> Text: <b>{}</b> Character: <b>{}</b> Personagem: <b>{}</b> Plot: <b>{}</b> Enredo: <b>{}</b> World: <b>{name}</b>{path} Referenced in: Referenciado em: Motivation Motivação Goal Objetivo Epiphany Epifania Short summary Sumário curto Longer summary Sumário longo revisions Form Formulário Options Restore Restaurar Delete Show modifications Mostrar modificações Show ancient version Mostrar versão antiga Show spaces Mostrar espaços Show modifications only Mostrar somente modificações {} years ago {} anos atrás {} months ago {} meses atrás {} days ago {} dias atrás 1 day ago 1 dia atrás {} hours ago {} horas atrás {} minutes ago {} minutos atrás {} seconds ago {} segundos atrás Line {}: Clear all Limpar tudo search Form Formulário Search for... Procurar por... Search in: Procurar em: All Tudo Title Título Text Summary Sumário Notes POV Ponto de vista Status Label Options: Case sensitive Diferencia maiúsculas e minúsculas settingsWindow New status New label newtheme novo tema New theme (read-only) (ler somente) Open Image Image files (*.jpg; *.jpeg; *.png) Error Erro Unable to load selected file Unable to add selected image: {} sldImportance Form Formulário TextLabel Rótulo do texto Minor Secondary Secundário Main Principal splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> <p>Dividir o(s) item(ns) selecionado(s) na marca indicada.</p> <p>Se um dos itens selecionados for uma pasta, ele será aplicado recursivamente para <i>todos</i> seus itens filhos.</p> <p>A marca de divisão pode conter as seguintes sequências de escape: <ul> <li><b><code>\n</code></b>: quebra de linha</li> <li><b><code>\t</code></b>: tabulação</li> </ul> </p> <p><b>Marcador:</b></p> Split '{}' Separar '{}' Split items Separar itens storylineView Form Formulário Show Plots Mostrar Enredos Show Characters Mostrar Personagens tabSplitter Open selected items in that view. Abra itens selecionados nessa vista. Split horizontally Dividir horizontalmente Close split Fechar a divisão Split vertically Dividir verticalmente textEditView Various Vários textFormat Form Formulário CTRL+B CTRL+I CTRL+U CTRL+P CTRL+L CTRL+E CTRL+R CTRL+J treeView Expand {} Expandir {} Collapse {} Recolher {} Expand All Expandir Tudo Collapse All Recolher Tudo welcome Form Formulário 1 Templates Modelos Empty Vazio Novel Romance Novella Novela Short Story História curta Research paper Artigo de pesquisa Demo projects Projetos de demonstração Add level Adicionar nível Add word count Adicionar contagem de palavras Next time, automatically open last project Na próxima vez, abra automaticamente o último projeto Open... Recent Create Criar Open project Manuskript project (*.msk);;All files (*) Projeto do Manuskript (*.msk);;Todos arquivos (*) Save project as... Salvar o projeto como... Manuskript project (*.msk) Projeto do Manuskript (*.msk) Manuskript Create New Project Criar um Novo Projeto Warning Alerta Overwrite existing project {} ? Substituir projeto existente {} ? Empty fiction Ficção vazia Chapter Capítulo Scene Cena Trilogy Trilogia Book Section Seção Empty non-fiction Não ficção vazia words each. palavras cada. of Text Something Alguma coisa <b>Total:</b> {} words (~ {} pages) <b>Total:</b> {} palavras (~ {} páginas) Fiction Ficção Non-fiction Não ficção Idea Note Research Pesquisa TODO First draft Primeiro rascunho Second draft Segundo rascunho Final worldModel New item Fantasy world building Construção do mundo de fantasia Physical Físico Climate Clima Topography Topografia Astronomy Astronomia Wild life Vida selvagem Flora History História Races Corridas Diseases Doenças Cultural Customs Costumes Food Comida Languages Idiomas Education Educação Dresses Vestidos Science Ciência Calendar Calendário Bodily language Linguagem corporal Ethics Ética Religion Religião Government Governo Politics Política Gender roles Papéis de gênero Music and arts Música e artes Architecture Arquitetura Military Militares Technology Courtship Namoro Demography Demografia Transportation Transporte Medicine Medicina Magic system Sistema mágico Rules Regras Organization Organização Magical objects Objetos mágicos Magical places Lugares mágicos Magical races Corridas Mágicas Important places Lugares importantes Important objects Objetos importantes Natural resources manuskript-0.10.0/i18n/manuskript_pt_PT.qm000066400000000000000000002362551354442177200204340ustar00rootroot00000000000000L`TTVEVEnVEsVEVsdcHddmYnqX e J{CA*$<*y=*y*>c*%>*0?+EA+fA+Bd+C+E.30J93;<A[?G:G Hw9yJ5-JTKQL7WLGLb$LbM|M6MezMezMŅZNWQ:Rx\RxRxRxRxTb TbTb1TbՑTbږTbTbTbT`uUj`UjUlV':V!VW6cW6!Xy X]YE>Y qYȀZtZ%cZʳZϳ[ [ %q([ %9[ %[ %[ %[ %[ٵ;r\8\\\^i$r^i$gUpn[o9 ^_-s"8>(VYBwrofE~`.FnA$tDGDT"syV- !ONEP2i bMt.U36eݰHʯlLH{FnAY@ fFzY^;Bŧgq!hۗz~hʾqY8lu<B3ҋPD2f3D# #ӽҳP.:^M[C#0N_~L,M[-,U0W>M1v E3tcML#UAIVsWx]1}"y^bi@9tGRW#uɹ. e"ek.(^WFʶ'&)J̉'0!iȳʋƩ$&n0J@ESFN^ǘ_aNlwpA<l.Nq0brvwba2pe<n n n n n Jo {o o r֥zT!bHoJOI{Z|/jމjՈK6Z|6|MV| NNOOMO~OOPPBPQQOQQQRRDRu}T<Tm,~,b}]]^Gt8%~7S bVĚG߇{\9nSkQv6D=:Y*N:7/ 0/CsC4#?^} MvU!&$ ''3]3'3'3l+5!$5b@V@VHuQhDYVjXW;jjt~jajlcclq sg~;}{}Z}Z"T24g4< G mhS,N%CMj!WBÊë Tit:j?&C<5qߺ ~rYu (*u0!` otcceT%Ē&t/t709$Csg~CsCJCLtzM+M^M+/R!|فTunI`xal^~m?$mOmmmĐmwmhnnpqr z z\{~ ~~G, Zi]rmR[a.r3Dž-0c400Α֣֝cރI=: ORX1 bZZ 2?8!+sa7QW Iǹ*#t)H0e1D 1~hHG4אNl@rJ;*ruyS?ЂIϗϗϗN7 @DE~BS!` 9L}ukL°^È<v['УU s˚ p`GS>!Zj1,Ni3  7cBnȢBL HAE"MP[5jg]*{6b hf ~2L~2~2~ 6ZCZϨڬ|ai2(XpGSnT^uHDC~@y'ʶ-˙PDvyz . K σ F>f HZq +42 ?:EV Mg R MgU Mgf T X;j ^d ^Z ^Q ^ g:' r,| x t? zd If   -$  h %j&  U U շ% z Cm NR z$ %G ?@ 08 3 9s[ 9s 9sG >ck A^- Rb` Z# dpeM( dpe| dpe dpe0 d)B d)S d) d) d) d)Q d)T d)? d) d) en luH n, o"`] }( d T B;% f * :" :A ,>+ ,P 8k 8ђ 8> ʶ= ֓? U N z? } 9Vo J @C ;! #e F. Q8" U~5 ]Y lu s3& }j# % . tB HB Hҿ  fh 5   j  GC L ڔ5 5D u 5% YV _ iC ӨS y W!0   4 R / : 1Uܞ 4  ; =fjm CjkT Gj NrQ S Z? Z$|^ b i?f pk_) rIj }5& !T ~ =EG   8 u W  R )y ޔ  ( x$  "> sw d ` 'jW _ $ $_l $ $~ ny ,d, %9V #h s% sn s/ sɀ ɠQ ] ] ^! ^X ^ ̺\ C u >  QN}  s X .~ zZ} o Y 4}$@ 5N m 7ؤs 87>J DYR DYR DYSr DZS J KL bQ i8: b P .:] SL P   ^c ) 0y Ğt=S <Z <d <r <j <| aݓ ⋙am eX" uYD'a2#2)K6eJ9a<+$HfBIOqUhWGyZbX$> Z0z$Vj{~k1̺}caPsbP -Td S)(; =Q>bdB3BxS6CQy R_IdR_Hd@fqpt6|oN~`~`Y"|"|8ii~LMl]jttx:A{Poi7i!<p>Um conversor de documentos universal. Pode ser utilizado para converter markdown para um vasto nmero de outros formatos.</p> <p>Pgina web: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> 

A universal document converter. Can be used to convert markdown to a wide range of other formats.

Website: http://pandoc.org/

ExportUm formato mal conhecido e pouco utilizado. Sabe, em websites, por exemplo.EA little known format modestly used. You know, web sites for example.ExportvSada HTML bsica utilizando o mdulo "markdown" do Python.5Basic HTML output using the Python module 'markdown'.Export:Livros que no matam rvores.Books that don't kill trees.Export6Escolha o ficheiro de sadaChoose output file…ExportClasse:Class:Export*Converter para ePUB3Convert to ePUB3ExportZImpossvel processar a expresso regular: {})Could not process regular expression: {}ExportExportador predefinido, oferece formatos bsicos utilizados por outros exportadores.ADefault exporter, provides basic formats used by other exporters.ExportDesactivar bloco de meta-dados YAML. Use se receber um erro YAML.DDisable YAML metadata block. Use that if you get YAML related error.ExportErroErrorExportexportar para markdown, usando pandoc. Permite mais opes de formatao que o exportador do Manuskript.hExport to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter.Export"Tamanho da letra: Font size:ExportSada HTML HTML OutputExportFonte HTML HTML SourceExport$Incluir um ndice.Include a table of contents.ExportTal como texto simples, excepto adio de ttulos markdown. Pressupe que os textos esto formatados em markdown.Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown.ExportLMotor LaTex usado para produzir o PDF.%LaTeX engine used to produce the PDF.Export0LaTeX um processador de texto e uma linguagem marcao de documento usada para criar documentos bonitos.LaTeX is a word processor and document markup language used to create beautiful documents.Export,Espaamento de linhas: Line spacing:ExportFonte markdownMarkdown sourceExportFDocumento Microsoft Office (.docx)."Microsoft Office (.docx) document.Export:Necessita do LaTeX instalado.Needs LaTeX to be installed.ExportBNormalizar documento (mais limpo) Normalize the document (cleaner)Export`Nmero de nveis de seco a incluir no ndice: ,Number of sections level to include in TOC: ExportrFormato OpenDocument. Usado pelo LibreOffice por exemplo.5OpenDocument format. Used by LibreOffice for example.Export"Tamanho do papel: Paper size:ExportTexto simples Plain textExport*Anteviso com realce.Preview with highlighter.Export8Mdulo "markdown" do Python.Python module 'markdown'.Export\Ficheiros HTML auto-contidos, sem dependncias/Self-contained HTML files, with no dependenciesExport\Exportao simples para texto. Permite utilizar a sua prpria marcao no compreendida pelo Manuskript, por exemplo <a href='www.fountain.io'>Fountain</a>.Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example Fountain.ExportTEspecifique o nvel base para cabealhos: $Specify the base level for headers: ExportRDocumento independente (no s fragmento))Standalone document (not just a fragment)ExportO objectivo deste formato oferecer uma forma de trocar informao entre organizadores e servios Internet que podem ser explorados ou controlados via organizador.The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner.Export>Sada tipograficamente correctaTypographically correct outputExportPUsar etiquetas <q> para citaes em HTMLUse tags for quotes in HTMLExport4Usar cabealhos estilo ATXUse ATX-style headersExportrUsar ligaes tipo referncia em vez de ligaes em linha1Use reference-style links instead of inline linksExportuma instalao LaTeX vlida. Pode encontrar as recomendaes Pandoc em: <a href="https://pandoc.org/installing.html">1pandoc.org/installing.html</a>2. Se desejar suporte Unicode, precisar do XeLaTeX.a valid LaTeX installation. Pandoc recommendations can be found on: pandoc.org/installing.html. If you want Unicode support, you need XeLaTeX.ExportdreStructuredText uma linguagem de marcao leve.2reStructuredText is a lightweight markup language.ExportProcurar......ExportersManagerDescrio DescriptionExportersManager$Gerir exportadoresManage ExportersExportersManagerManuskript ManuskriptExportersManager.Oferece exportao paraOffers export toExportersManagerCaminho:Path:ExportersManager EstadoStatusExportersManagerEstado:Status:ExportersManagerVerso:Version:ExportersManager{HelpText} {HelpText}ExportersManagerAnalisarAnalyzeFrequencyAnalyzerHPalavras a excluir (entre vrgulas): Exclude words (comma separated):FrequencyAnalyzer0Analisador de frequnciaFrequency AnalyzerFrequencyAnalyzerTamanho mnimo: Minimum size:FrequencyAnalyzer,Nmero de palavras: deNumber of words: fromFrequencyAnalyzer(Frequncia de frasesPhrase frequencyFrequencyAnalyzerDefiniesSettingsFrequencyAnalyzer,Frequncia de palavrasWord frequencyFrequencyAnalyzerattoFrequencyAnalyzerV<b>Informao:</b> um analisador muito simples que percorre um documento markdown e cria itens para cada ttulo.<br/>&nbsp;Info: A very simple parser that will go through a markdown document and create items for each titles.
 Import <b>Informao:</b> o Manuskript pode importar de <b>markdown</b> ou <b>OPML</b>. O Pandoc vai converter o seu documento para um deles (veja a opo abaixo) e ser depois importado para o Manuskript. Um ou outro podero dar um melhor resultado, dependendo do documento. <br/>&nbsp;}Info: Manuskript can import from markdown or OPML. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document.
 Import<p><b>Informao:</b> importa uma estrutura de pastas completa. As pastas so adicionadas como pastas e os documentos de texto (escolha sua por extenso) so adicionados como cenas.</p> <p>S so suportados ficheiros de texto (nem imagens, binrios ou outros).</p>R

Info: Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.

Only text files are supported (not images, binary or others).

Import<p>Deve o Pandoc criar quebras de linha cosmticas/no-semnticas?</p><p> <b>automtica</b>: quebra aos 72 caracteres.<br> <b>nenhuma</b>: sem quebra de linhas.<br> <b>preservar</b>: tenta preservar a quebra de linhas do documento original.</p>Q

Should pandoc create cosmetic / non-semantic line-breaks?

auto: wraps at 72 characters.
none: no line wrap.
preserve: tries to preserves line wrap from the original document.

Import<Valores separados por vrgulasComma separated valuesImport4Falha ao abrir o ficheiro.File open failed.Import(Importao de pastas Folder importImportDImportar pastas e depois ficheirosImport folder then filesImport&Importar dica como:Import tip as:Import Importar usando: Import using:Import6Incluir s estas extenses:Include only those extensions:Import&Importao markdownMarkdown importImport2Importao de mapa mentalMind Map ImportImport2Importao de mapa mentalMind Map importImportImportao OPML OPML ImportImport"Importao Pandoc Pandoc importImport,Ordenar itens por nomeSort items by nameImportbNo parece ser um ficheiro de mapa mental vlido.1This does not appear to be a valid Mind Map file.ImportNNo parece ser um ficheiro OPML vlido.-This does not appear to be a valid OPML file.ImportSem ttuloUntitledImport"Quebra de linhas: Wrap lines:Import$Inserir refernciaInsert referenceMDEditCompleter (~{} pginas) (~{} pages) MainWindowZ * {} no encontrado no ficheiro do projecto.# * {} wasn't found in project file. MainWindow&Acerca de&About MainWindow&Negrito&Bold MainWindow&Cbula &Cheat sheet MainWindow Fe&char projecto&Close project MainWindow*Lin&has de comentrio&Comment line(s) MainWindow&Copiar&Copy MainWindow&Eliminar&Delete MainWindow&Editar&Edit MainWindow&Fico&Fiction MainWindow&Ficheiro&File MainWindow&Formatar&Format MainWindow2Analisador de &frequncia&Frequency Analyzer MainWindowCabeal&ho&Header MainWindow A&juda&Help MainWindow&Importar & &Import… MainWindow&Itlico&Italic MainWindowEti&quetas... &Labels... MainWindow"Nve&l 1 (defext)&Level 1 (setext) MainWindow &Modo&Mode MainWindow&Mover acima&Move Up MainWindow&Navegao &Navigation MainWindow A&brir&Open MainWindowLista &ordenada &Ordered list MainWindow Co&lar&Paste MainWindow &Sair&Quit MainWindow&Recentes&Recent MainWindow&Renomear&Rename MainWindow&Gravar&Save MainWindow0&Mostrar textos de ajuda&Show help texts MainWindow&Simples&Simple MainWindow&Ortografia &Spellcheck MainWindowDi&vidir & &Split… MainWindowE&stado... &Status... MainWindowRa&surado&Strike MainWindowFerramen&tas&Tools MainWindow$Lista &desordenada&Unordered list MainWindow&Verbatim &Verbatim MainWindow&Ver&View MainWindow<html><head/><body><p align="left">Sinopse<br/>num pargrafo</p></body></html>O

One paragraph
summary

 MainWindow<html><head/><body><p align="left">Sinopse<br/>numa frase</p></body></html>N

One sentence
summary

 MainWindow(Acerca do ManuskriptAbout Manuskript MainWindow2Adicionar passo do enredo Add plot step MainWindow AutorAuthor MainWindow"Citao em b&loco B&lockquote MainWindow Fundo Background MainWindowCor do fundoBackground color MainWindow"Informao bsica Basic info MainWindow&Informao do livroBook information MainWindow Sinopse do livro Book summary MainWindowContornoBorder MainWindowConstrua mundos. Crie uma hierarquia desde categorias vastas at detalhes especficos.MBuild worlds. Create hierarchy of broad categories down to specific details. MainWindowCor&tarC&ut MainWindowPersonagens Character(s) MainWindowPersonagens Characters MainWindow Limpar &formatosClear &formats MainWindow(Bloco de co&mentrioCo&mment block MainWindowCo&mpilarCo&mpile MainWindowCompilarCompile MainWindowConflitoConflict MainWindow CantoCorner MainWindowHCrie o fio da meada para a sua obra.'Create the outline of your masterpiece. MainWindow2Crie os seus personagens.Create your characters. MainWindow Ctrl++Ctrl++ MainWindow Ctrl+-Ctrl+- MainWindow Ctrl+FCtrl+0 MainWindow Ctrl+1Ctrl+1 MainWindow Ctrl+2Ctrl+2 MainWindow Ctrl+3Ctrl+3 MainWindow Ctrl+4Ctrl+4 MainWindow Ctrl+5Ctrl+5 MainWindow Ctrl+6Ctrl+6 MainWindowCtrl+Alt+1 Ctrl+Alt+1 MainWindowCtrl+Alt+2 Ctrl+Alt+2 MainWindow Ctrl+NCtrl+B MainWindow Ctrl+CCtrl+C MainWindow Ctrl+HCtrl+D MainWindow Ctrl+ICtrl+I MainWindow Ctrl+ICtrl+K MainWindow Ctrl+UCtrl+M MainWindow Ctrl+BCtrl+O MainWindow Ctrl+SCtrl+Q MainWindow Ctrl+GCtrl+S MainWindowCtrl+Shift+M Ctrl+Shift+B MainWindowCtrl+Shift+M Ctrl+Shift+C MainWindowCtrl+Shift+!Ctrl+Shift+Down MainWindowCtrl+Shift+V Ctrl+Shift+K MainWindowCtrl+Shift+V Ctrl+Shift+S MainWindowCtrl+Shift+! Ctrl+Shift+Up MainWindow Ctrl+VCtrl+V MainWindow Ctrl+XCtrl+X MainWindowDepuraoDebug MainWindowTInformao de depurao. Por vezes til.Debug info. Sometimes useful. MainWindowDelDel MainWindowDescrio Description MainWindow(Informao detalhada Detailed info MainWindow&Desenvolva enredos.Develop plots. MainWindowDicionrio Dictionary MainWindowDupl&icar Dupl&icate MainWindow EditorEditor MainWindow EmailEmail MainWindowVInsira informao sobre o livro e sobre si.0Enter information about your book, and yourself. MainWindowEpifaniaEpiphany MainWindowExpanda cada frase da sua sinopse num pargrafo para um pargrafoAExpand each sentence of your one paragraph summary to a paragraph MainWindowF2F2 MainWindowF6F6 MainWindowF7F7 MainWindowF8F8 MainWindowF9F9 MainWindow FiltroFilter MainWindowDados simplesFlatData MainWindowCompletaFull MainWindow Sinopse completa Full summary MainWindow GeralGeneral MainWindow GneroGenre MainWindowObjectivoGoal MainWindow coneIcon MainWindowCor do cone Icon color MainWindowImportncia Importance MainWindow Fichas indexadas Index cards MainWindowRInstalar {}{} para verificar a ortografiaInstall {}{} to use spellcheck MainWindowNv&el 2L&evel 2 MainWindowEtiquetaLabel MainWindowEtiquetasLabels MainWindowNvel &1 (atx)Level &1 (atx) MainWindowNvel &2Level &2 MainWindowNvel &3Level &3 MainWindowNvel &4Level &4 MainWindowNvel &5Level &5 MainWindowNvel &6Level &6 MainWindowLicenaLicense MainWindow &UnirM&erge MainWindowM&over abaixo M&ove Down MainWindowManuskript Manuskript MainWindowMeta-dadosMetadata MainWindowMaisMore MainWindowMotivao Motivation MainWindowNomeName MainWindow NomesNames MainWindowSeguinteNext MainWindow NotasNotes MainWindowNadaNothing MainWindowUma pginaOne page MainWindow&Sinopse numa pginaOne page summary MainWindowUm pargrafo One paragraph MainWindow*Sinopse num pargrafoOne paragraph summary MainWindowUma frase One sentence MainWindow$Sinopse numa fraseOne sentence summary MainWindowOrgani&zar Organi&ze MainWindowEsquemaOutline MainWindowPDVPOV MainWindowPersonagensPersos MainWindow EnredoPlot MainWindowEnredosPlots MainWindow6Povoa com categorias vaziasPopulates with empty data MainWindowProgressoProgress MainWindow$rvore do projecto Project tree MainWindowNProjecto {} carregado com alguns erros.#Project {} loaded with some errors. MainWindowNProjecto {} carregado com alguns erros:#Project {} loaded with some errors: MainWindow,Projecto {} carregado.Project {} loaded. MainWindow(Projecto {} gravado.Project {} saved. MainWindowLRemover passos do enredo seleccionadosRemove selected plot step(s) MainWindow&Passos da resoluoResolution steps MainWindowResultadoResult MainWindow&Definies S&ettings MainWindowGra&var como... Sa&ve as... MainWindowP&rocurarSea&rch MainWindow SrieSeries MainWindowSituao: Situation: MainWindow"Fonte do conflitoSource of conflict MainWindowFonte da paixoSource of passion MainWindow$D&ividir no cursorSp&lit at cursor MainWindowFio da histria Story line MainWindowEx&poente Su&perscript MainWindowSubsc&rito Subsc&ript MainWindowSubttuloSubtitle MainWindowSinopseSummary MainWindowSinopse:Summary: MainWindowLeve o seu tempo a pensar numa frase (50 palavras) que resuma o seu livro. Depois expanda-a para um pargrafo, em seguida para uma pgina e finalmente uma sinopse completa.Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. MainWindow TextoText MainWindowCor do texto Text color MainWindowVA situao bsica, na forma de pergunta "E se...?". E.g.: "E se o mais maligno e perigoso feiticeiro no fosse capaz de matar um beb?" (Harry Potter)The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) MainWindowpO ficheiro {} no existe. Ter sido movido ou eliminado?9The file {} does not exist. Has it been moved or deleted? MainWindow TtuloTitle MainWindow rvoreTree MainWindow VolumeVolume MainWindow>AVISO: projecto {} no gravado.WARNING: Project {} not saved. MainWindowE se...? What if...? MainWindowPalavras: {}{} Words: {}{} MainWindow MundoWorld MainWindowEscreva.Write. MainWindowB{} no tem dicionrios instalados {} has no installed dictionaries MainWindow.{}{} no est instalado{}{} is not installed MainWindow px pxSettings%%Settings&Novo estilo &New styleSettings &Nada&NothingSettings4Mo&strar total de palavras&Show word countSettings1,5 linhas 1.5 linesSettingsV<html><head/><body><p>Se marcar esta opo, o seu projecto ser gravado como um nico ficheiro. mais fcil de copiar, mas no permite edio colaborativa ou controlo de verses.<br/>Se no estiver marcada, o seu projecto ser gravado como uma pasta com muitos ficheiros pequenos.</p></body></html>

If you check this option, your project will be save as one single file. Easier to copy or backup, but does not allow collaborative editing, or versionning.
If this is unchecked, your project will be save as a folder containing many small files.

SettingsAlinhamento AlignmentSettingsAlinhamento: Alignment:Settings.Definies da aplicaoApplication settingsSettingsAplicarApplySettingsjCarregar automaticamente o ltimo projecto ao iniciar*Automatically load last project on startupSettings:Gravar automaticamente a cadaAutomatically save everySettings Fundo BackgroundSettingsCor do fundo:Background color:Settings Fundo: Background:Settings Cor do contorno: Border color:SettingsCancelarCancelSettings CentroCenterSettingsCentradaCenteredSettingsCor:Color:Settings CoresColorsSettingsCompilarCompileSettingsCor do canto: Corner color:SettingsRaio do canto:Corner radius:Settings Ctrl+SCtrl+SSettings CursorCursorSettingsEliminarDeleteSettings"Desactivar piscarDisable blinkingSettings DuploDoubleSettings EditarEditSettingsFamlia:Family:SettingsModo Foco Focus modeSettings PastasFoldersSettings LetraFontSettings"Tamanho da letra: Font size:Settings Letra:Font:SettingsEcr completo FullscreenSettings GeralGeneralSettings"Definies geraisGeneral settingsSettingsObjectivoGoalSettings Tamanho do cone Icon SizeSettingsCor do cone: Icon color:Settings@Se no houver alteraes duranteIf no changes duringSettingsImagem:Image:Settings"Indentar 1 linhaIndent 1st lineSettings Fichas indexadas Index cardsSettingsCor dos itens Item colorsSettingsJustificadoJustifySettingsManter revisesKeep revisionsSettingsManter:Keep:SettingsEtiquetaLabelSettingsEtiquetasLabelsSettingsIdioma: Language:SettingsEsquerdaLeftSettings2Margens esquerda/direita:Left/Right margins:Settings LinhaLineSettings,Espaamento de linhas: Line spacing:SettingsCarregamentoLoadingSettingsMargens:Margins:SettingsLargura mxima Max widthSettings Erros: Misspelled:SettingsNovoNewSettingsSem imagemNo ImageSettings NenhumNoneSettingsNadaNothingSettingsEst&ilo antigo Old st&yleSettingsOpacidade:Opacity:SettingsEsquemaOutlineSettingsPDVPOVSettingsEspao:Padding:SettingsPargrafo ParagraphSettings&Opes do pargrafoParagraph OptionsSettingsPargrafos ParagraphsSettingsPercentagem PercentageSettingsPosio: Position:SettingsProgressoProgressSettingsProporcional ProportionalSettings~Reiniciar o Manuskript garante que as definies tenham efeito.7Restarting Manuskript ensures all settings take effect.Settings&Repor predefiniesRestore defaultsSettingsRevises RevisionsSettingsfAs revises so uma forma de manter um registo das modificaes. Para cada item de texto, armazena as alteraes ao texto principal, permitindo ver e restaurar verses anteriores.Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions.SettingsDireitaRightSettings$Mostrar &progressoS&how progressSettings(Re&moo inteligente S&mart removeSettingsGravar ao sair Save on quitSettings2Gravar num nico ficheiroSave to one single fileSettingsGravaoSavingSettingsEscaladaScaledSettings FraseSentenceSettingsDefiniesSettingsSettings4Mostrar total de pala&vrasShow &word countSettings.&Mostrar total de itensShow ite&m countSettings$Mostrar p&rogressoShow p&rogressSettings Mostrar s&inopse Show summar&ySettingsMostrar sinopse Show summarySettingsSimplesSingleSettingsTamanho:Size:SettingsNA remoo inteligente mantm s um certo nmero de revises. Recomenda-se vivamente que a use, para que o seu ficheiro no fique repleto de alteraes insignificantes.Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes.SettingsEspaamento:Spacing:Settings EstadoStatusSettingsEsticada StretchedSettings EstiloStyleSettingsEstilo:Style:Settings*Largura da tabulao: Tab width:Settings TextoTextSettingsFundo do textoText BackgroundSettingsOpes do texto Text OptionsSettingsrea de texto Text areaSettingsCor do texto: Text color:SettingsEditor de texto Text editorSettings Rtulo TextLabelSettingsNome do tema: Theme name:SettingsMosaicoTiledSettings TtuloTitleSettings4Margens superior/inferior:Top/Bottom margins:SettingsTransparente TransparentSettings rvoreTreeSettings Tipo:Type:Settings$Modo DactilografiaTypewriter modeSettings2Usar insero de bloco deUse block insertion ofSettings VistasViewsSettingsAparnciaViews settingsSettings Colunas visveisVisible columnsSettingsLargura:Width:SettingsFundo da janelaWindow BackgroundSettings"Total de palavras Word countSettingsAmpliadaZoomedSettingsminutos.minutes.SettingsTrevises por 10 minutos para a ltima hora*revisions per 10 minutes for the last hourSettingsDrevises por dia para o ltimo ms$revisions per day for the last monthSettingsFrevises por hora para o ltimo dia#revisions per hour for the last daySettings\revises por minuto para os ltimos 10 minutos,revisions per minute for the last 10 minutesSettingsRrevises por semana at ao fim dos tempos'revisions per week till the end of timeSettingssegundos.seconds.Settings0&Adicionar ao dicionrio&Add to dictionary SpellAction<&Remover do dicionrio pessoal&Remove from custom dictionary SpellAction,Sugestes ortogrficasSpelling Suggestions SpellAction(Acerca do ManuskriptAbout ManuskriptaboutManuskript Manuskriptabout:Verses dos programas em uso:Software Versions in Use: aboutDialog VersoVersion aboutDialogCompilarCompile abstractModelObjectivoGoal abstractModelEtiquetaLabel abstractModelPDVPOV abstractModel EstadoStatus abstractModel TtuloTitle abstractModel"Total de palavras Word count abstractModel:Traduo carregada de {}: {}.Loaded translation from {}: {}.appNota: sem tradutor encontrado ou carregado de {} para a configurao regional {}.:Note: No translator found or loaded from {} for locale {}.app2Sinopse em poucas frases:Few sentences summary: basicItemViewFormulrioForm basicItemViewObjectivo:Goal: basicItemView$Sinopse numa linhaOne line summary basicItemViewPDV:POV: basicItemView"Total de palavras Word count basicItemViewNomeNamecharacterModelNovo personagem New charactercharacterModel ValorValuecharacterModelPrincipalMaincharacterTreeView MenorMinorcharacterTreeViewSecundrio SecondarycharacterTreeViewPersonagens Characters cheatSheetrFiltro (escreva o nome de qualquer coisa do seu projecto)2Filter (type the name of anything in your project) cheatSheetFormulrioForm cheatSheetPrincipalMain cheatSheet MenorMinor cheatSheetEnredosPlots cheatSheetSecundrio Secondary cheatSheet TextosTexts cheatSheet MundoWorld cheatSheetPrincipalMaincmbOutlineCharacterChoser MenorMinorcmbOutlineCharacterChoser NenhumNonecmbOutlineCharacterChoserSecundrio SecondarycmbOutlineCharacterChoser VriosVariouscmbOutlineCharacterChoser VriosVariouscmbOutlineLabelChoser VriosVariouscmbOutlineStatusChoser0Ancorar barra de painisDock Widgets ToolbarcollapsibleDockWidgetsFormulrioForm completer Sinopse completa Full summary corkDelegate$Sinopse numa linhaOne line summary corkDelegateFormulrioFormeditorWidget_uiExportarExportexporterExportar para: Export to:exporter$Gerir exportadoresManage exportersexporterAnteverPreviewexporterDefiniesSettingsexporter6{} (ainda no implementado){} (not implemented yet)exporterDialogd<html><head/><body><p>Filtra que itens sero includos na exportao final.<br/><span style=" color:#773333;">(ainda no est completamente implementado)</span></p></body></html>

Filters what items will be included in the final export.
(Not fully implemented yet.)

exporterSettings(Entre pasta e texto:Between folder and text:exporterSettingsEntre pastas:Between folders:exporterSettings(Entre texto e pasta:Between text and folder:exporterSettingsEntre textos:Between texts:exporterSettingsContedoContentexporterSettingsPersonalizadoCustomexporterSettings:Substituies personalizadas:Custom replacements:exporterSettingshDecida aqui o que ser includo na exportao final.6Decide here what will be included in the final export.exporterSettingsLinha vazia Empty lineexporterSettings ActivaEnabledexporterSettingsFi&ltrosFi<ersexporterSettings PastaFolderexporterSettings LetraFontexporterSettings"Tamanho da letra: Font size:exporterSettings Letra:Font:exporterSettingsFormulrioFormexporterSettings0Preciso de mais escolhasI need more granularityexporterSettingsSe marcada, usa expresses regulares para a substituio. Se no, substitui como texto simples.ZIf checked, uses regular expression for replacement. If unchecked, replaced as plain text.exporterSettingsjIgnorar estado de compilao (incluir todos os itens))Ignore compile status (include all items)exporterSettingsEtiquetasLabelsexporterSettingsAnteverPreviewexporterSettings ExpRegRegExpexporterSettings2Remover espaos mltiplosRemove multiple spacesexporterSettingsSubstituirReplaceexporterSettings(Substituir --- por Replace --- with —exporterSettings(Substituir ... por &Replace ... with …exporterSettings@Substituir aspas duplas (") por:Replace double quotes (") with:exporterSettingsBSubstituir aspas simples (') por:Replace single quotes (') with:exporterSettingsSeparaes SeparationsexporterSettings EstadoStatusexporterSettingsSub-itens de: Subitems of:exporterSettings TextoTextexporterSettings TtuloTitleexporterSettingsTransformaesTransformationsexporterSettingsTipoTypeexporterSettings6Substituies tipogrficas:Typographic replacements:exporterSettingsPorWithexporterSettings {}nvel {} pasta{}Level {} folderexporterSettings {}nvel {} texto{}Level {} textexporterSettings<b>Requer:</b> Requires: exportersManager:<b>Estado:</b> no instalado.Status: uninstalled.exportersManagerPersonalizadoCustomexportersManagerInstalado InstalledexportersManagerNo encontrado Not foundexportersManagerBDefinir caminho executvel de {}.Set {} executable path.exportersManagerz{} no encontrado. Instale-o ou defina o caminho manualmente./{} not found. Install it, or set path manually.exportersManagerFrequncia FrequencyfrequencyAnalyzer FrasesPhrasesfrequencyAnalyzerPalavraWordfrequencyAnalyzerRelgioClockfullScreenEditor2Relgio: mostrar segundosClock: Show SecondsfullScreenEditorNavegao NavigationfullScreenEditorNovo textoNew TextfullScreenEditorProgressoProgressfullScreenEditorHProgresso mostrar/ocultar automticoProgress: Auto Show/HidefullScreenEditorOrtografia SpellcheckfullScreenEditor Selector de temaTheme selectorfullScreenEditor Tema:Theme:fullScreenEditor TtuloTitlefullScreenEditor@Ttulo: mostrar caminho completoTitle: Show Full PathfullScreenEditor"Total de palavras Word countfullScreenEditor{} palavras{} wordsfullScreenEditor{} palavras/{} {} words / {}fullScreenEditor GeralGeneralgeneralSettingsJImportar numa pasta de nvel superiorImport in a top-level foldergeneralSettingsImportar sob: Import under:generalSettings"Dividir cenas em:Split scenes at:generalSettingsLAparar ttulos longos (>32 caracteres)Trim long titles (> 32 chars)generalSettings\n---\n\n---\ngeneralSettingshSe no me deseja ver, pode ocultar-me no menu Ajuda.8If you don't wanna see me, you can hide me in Help menu. helpLabel$Escolha o ficheiro Choose fileimporterLimpar ficheiro Clear fileimporterFormato:Format:importerImportarImportimporterAnteverPreviewimporterDefiniesSettingsimporterLCarregada a ltima pasta acedida "{}".$Last accessed directory "{}" loaded.lastAccessedDirectoryInfo VriosVarious lineEditView minutos minuteslocker palavras wordslockerFormulrioFormlockerBloquear!Lock !lockerBloquear ecr: Lock screen:lockerTempo limite Time targetlocker$Nmero de palavras Word targetlocker{} restante {} remaininglocker {} s.{} s.locker*{} palavras restantes{} words remaininglocker {}:{}{}:{}locker ~{} h.~{} h.locker ~{} m.~{} mn.locker Alt+!Alt+Up mainEditorF11F11 mainEditorFormulrioForm mainEditor$Ir para o item-meGo to parent item mainEditor Fichas indexadas Index cards mainEditorEsquemaOutline mainEditorRaizRoot mainEditor TextoText mainEditor{} palavras  {} words  mainEditor{} palavras/{} {} words / {}  mainEditorMarkdownMarkdownmarkdownSettingsFormulrioForm metadataView Sinopse completa Full summary metadataView"Notas/RefernciasNotes / References metadataView$Sinopse numa linhaOne line summary metadataViewPropriedades Properties metadataViewRevises Revisions metadataViewSinopseSummary metadataView.Ocultar automaticamente Auto-hidemyPanel&Copiar&Copy outlineBasics&Eliminar&Delete outlineBasics Co&lar&Paste outlineBasics&Renomear&Rename outlineBasics<p><b>Est prestes a eliminar {} item(ns).</b></p><p>Tem a certeza?</p>D

You're about to delete {} item(s).

Are you sure?

 outlineBasics"Prestes a removerAbout to remove outlineBasicsTodos os itens tm de estar no mesmo nvel (partilhar a mesma me).Referncia desconhecida:</b> {}.Unknown reference: {}. references"Informao bsica Basic info references*Personagem: <b>{}</b>Character: {} referencesPersonagens Characters referencesConflitoConflict referencesDescrio Description references(Informao detalhada Detailed info referencesEpifaniaEpiphany references Pasta: <b>{}</b>Folder: {} referencesIr para {}. Go to {}. referencesObjectivoGoal referencesEtiqueta:Label: referencesSinopse longa: Long summary: references$Sinopse mais longaLonger summary referencesMotivao Motivation references*No referncia: {}.Not a reference: {}. references Notas:Notes: referencesPDV de:POV of: referencesPDV:POV: references PaixoPassion referencesCaminho:Path: references"Enredo: <b>{}</b>Plot: {} referencesReferncia em:Referenced in: references&Passos da resoluoResolution steps referencesResultadoResult referencesSinopse curta Short summary referencesSinopse curta:Short summary: referencesEstatsticas:Stats: referencesEstado:Status: references Texto: <b>{}</b>Text: {} references8Referncia desconhecida: {}.Unknown reference: {}. references4Mundo: <b>{name}</b>{path}World: {name}{path} referencesum dia atrs 1 day ago revisionsLimpar tudo Clear all revisionsEliminarDelete revisionsFormulrioForm revisionsLinha {}:Line {}: revisions OpesOptions revisionsRestaurarRestore revisions.Mostrar verso anteriorShow ancient version revisions(Mostrar modificaesShow modifications revisions.Mostrar s modificaesShow modifications only revisionsMostrar espaos Show spaces revisions{} dias atrs {} days ago revisions{} horas atrs {} hours ago revisions {} minutos atrs{} minutes ago revisions{} meses atrs {} months ago revisions"{} segundos atrs{} seconds ago revisions{} anos atrs {} years ago revisionsTudoAllsearch*Sensvel a maisculasCase sensitivesearchFormulrioFormsearchEtiquetaLabelsearch NotasNotessearchOpes:Options:searchPDVPOVsearchProcurar por... Search for...searchProcurar em: Search in:search EstadoStatussearchSinopseSummarysearch TextoTextsearch TtuloTitlesearch (s de leitura) (read-only)settingsWindowErroErrorsettingsWindowTFicheiros de imagem (*.jpg; *.jpeg; *.png)"Image files (*.jpg; *.jpeg; *.png)settingsWindowNova etiqueta New labelsettingsWindowNovo estado New statussettingsWindowNovo tema New themesettingsWindowAbrir imagem Open ImagesettingsWindow\Impossvel adicionar a imagem seleccionada: {} Unable to add selected image: {}settingsWindowVImpossvel carregar o ficheiro seleccionadoUnable to load selected filesettingsWindownovotemanewthemesettingsWindowFormulrioForm sldImportancePrincipalMain sldImportance MenorMinor sldImportanceSecundrio Secondary sldImportance Rtulo TextLabel sldImportance <p>Divide os itens seleccionados na marca indicada.</p> <p>Se um dos itens for uma pasta, ser aplicado recursivamente a <i>todos</i> os itens-filho.</p> <p>A marca de diviso pode conter as seguintes sequncias: <ul> <li><b><code>\n</code></b>: quebra de linha</li> <li><b><code>\t</code></b>: tabulao</li> </ul> </p> <p><b>Marca:</b></p> 

Split selected item(s) at the given mark.

If one of the selected item is a folder, it will be applied recursively to all of it's children items.

The split mark can contain following escape sequences:

  • \n: line break
  • \t: tab

Mark:

 splitDialogDividir "{}" Split '{}' splitDialogDividir itens Split items splitDialogFormulrioForm storylineView&Mostrar personagensShow Characters storylineViewMostrar enredos Show Plots storylineViewFechar diviso Close split tabSplitterFAbrir itens seleccionados na vista.!Open selected items in that view. tabSplitter*Dividir na horizontalSplit horizontally tabSplitter&Dividir na verticalSplit vertically tabSplitter VriosVarious textEditView CTRL+BCTRL+B textFormat CTRL+ECTRL+E textFormat CTRL+ICTRL+I textFormat CTRL+JCTRL+J textFormat CTRL+LCTRL+L textFormat CTRL+PCTRL+P textFormat CTRL+RCTRL+R textFormat CTRL+UCTRL+U textFormatFormulrioForm textFormatColapsar tudo Collapse AlltreeViewColapsar {} Collapse {}treeViewExpandir tudo Expand AlltreeViewExpandir {} Expand {}treeView11welcomeP<b>Total:</b> {} palavras (~ {} pginas)#Total: {} words (~ {} pages)welcomeAdicionar nvel Add levelwelcome6Adicionar total de palavrasAdd word countwelcome livrosBookwelcomecaptulosChapterwelcome CriarCreatewelcome&Criar novo projectoCreate New Projectwelcome2Projectos de demonstrao Demo projectswelcome VazioEmptywelcomeFico vazia Empty fictionwelcome No-fico vaziaEmpty non-fictionwelcome FicoFictionwelcome FinalFinalwelcome1 rascunho First draftwelcomeFormulrioFormwelcome IdeiaIdeawelcomeManuskript Manuskriptwelcome<Projecto do Manuskript (*.msk)Manuskript project (*.msk)welcomelProjecto do Manuskript (*.msk);;Todos os ficheiros (*))Manuskript project (*.msk);;All files (*)welcomeXNo prximo arranque, abrir o ltimo projecto*Next time, automatically open last projectwelcomeNo-fico Non-fictionwelcomeNotaNotewelcomeRomanceNovelwelcome NovelaNovellawelcomeAbrir projecto Open projectwelcomeAbrir...Open...welcomeFSobrescrever projecto {} existente?Overwrite existing project {} ?welcomeRecentesRecentwelcomeInvestigaoResearchwelcomeInvestigaoResearch paperwelcome.Gravar projecto como...Save project as...welcome cenasScenewelcome2 rascunho Second draftwelcomesecesSectionwelcomeHistria curta Short StorywelcomeAlgo SomethingwelcomeA FAZERTODOwelcomeModelos Templateswelcome TextoTextwelcomeTrilogiaTrilogywelcome AvisoWarningwelcomedeofwelcomepalavras cada. words each.welcomeArquitectura Architecture worldModelAstronomia Astronomy worldModel$Expresso corporalBodily language worldModelCalendrioCalendar worldModel ClimaClimate worldModel Namoro Courtship worldModelCulturaCultural worldModelTradiesCustoms worldModelDemografia Demography worldModelDoenasDiseases worldModel RoupasDresses worldModelEducao Education worldModel ticaEthics worldModelDConstruo de um mundo de fantasiaFantasy world building worldModel FloraFlora worldModel ComidaFood worldModel Papis dos sexos Gender roles worldModelGoverno Government worldModelHistriaHistory worldModel(Objectos importantesImportant objects worldModel$Locais importantesImportant places worldModelIdiomas Languages worldModelSistema mgico Magic system worldModel Objectos mgicosMagical objects worldModelLocais mgicosMagical places worldModelRaas mgicas Magical races worldModelMedicinaMedicine worldModelForas armadasMilitary worldModelMsica e artesMusic and arts worldModel"Recursos naturaisNatural resources worldModelNovo itemNew item worldModelOrganizao Organization worldModel FsicoPhysical worldModelPolticaPolitics worldModel RaasRaces worldModelReligioReligion worldModel RegrasRules worldModelCinciaScience worldModelTecnologia Technology worldModelTopografia Topography worldModelTransportesTransportation worldModel Fauna Wild life worldModelmanuskript-0.10.0/i18n/manuskript_pt_PT.ts000066400000000000000000005476301354442177200204470ustar00rootroot00000000000000 Export Standalone document (not just a fragment) Documento independente (não só fragmento) Include a table of contents. Incluir um índice. Number of sections level to include in TOC: Número de níveis de secção a incluir no índice: Typographically correct output Saída tipograficamente correcta Normalize the document (cleaner) Normalizar documento (mais limpo) Specify the base level for headers: Especifique o nível base para cabeçalhos: Disable YAML metadata block. Use that if you get YAML related error. Desactivar bloco de meta-dados YAML. Use se receber um erro YAML. Use reference-style links instead of inline links Usar ligações tipo referência em vez de ligações em linha Use ATX-style headers Usar cabeçalhos estilo ATX Self-contained HTML files, with no dependencies Ficheiros HTML auto-contidos, sem dependências Use <q> tags for quotes in HTML Usar etiquetas <q> para citações em HTML LaTeX engine used to produce the PDF. Motor LaTex usado para produzir o PDF. Convert to ePUB3 Converter para ePUB3 Paper size: Tamanho do papel: Font size: Tamanho da letra: Class: Classe: Line spacing: Espaçamento de linhas: Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. Tal como texto simples, excepto adição de títulos markdown. Pressupõe que os textos estão formatados em markdown. Preview with highlighter. Antevisão com realce. A little known format modestly used. You know, web sites for example. Um formato mal conhecido e pouco utilizado. Sabe, em websites, por exemplo. Books that don't kill trees. Livros que não matam árvores. OpenDocument format. Used by LibreOffice for example. Formato OpenDocument. Usado pelo LibreOffice por exemplo. Microsoft Office (.docx) document. Documento Microsoft Office (.docx). Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. exportar para markdown, usando pandoc. Permite mais opções de formatação que o exportador do Manuskript. reStructuredText is a lightweight markup language. reStructuredText é uma linguagem de marcação leve. LaTeX is a word processor and document markup language used to create beautiful documents. LaTeX é um processador de texto e uma linguagem marcação de documento usada para criar documentos bonitos. The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. O objectivo deste formato é oferecer uma forma de trocar informação entre organizadores e serviços Internet que podem ser explorados ou controlados via organizador. Needs LaTeX to be installed. Necessita do LaTeX instalado. a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. uma instalação LaTeX válida. Pode encontrar as recomendações Pandoc em: <a href="https://pandoc.org/installing.html">1pandoc.org/installing.html</a>2. Se desejar suporte Unicode, precisará do XeLaTeX. <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> <p>Um conversor de documentos universal. Pode ser utilizado para converter markdown para um vasto número de outros formatos.</p> <p>Página web: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> Error Erro Basic HTML output using the Python module 'markdown'. Saída HTML básica utilizando o módulo "markdown" do Python. Python module 'markdown'. Módulo "markdown" do Python. Markdown source Fonte markdown HTML Source Fonte HTML HTML Output Saída HTML Plain text Texto simples Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. Exportação simples para texto. Permite utilizar a sua própria marcação não compreendida pelo Manuskript, por exemplo <a href='www.fountain.io'>Fountain</a>. Default exporter, provides basic formats used by other exporters. Exportador predefinido, oferece formatos básicos utilizados por outros exportadores. Could not process regular expression: {} Impossível processar a expressão regular: {} Choose output file… Escolha o ficheiro de saída ExportersManager Manage Exporters Gerir exportadores Manuskript Manuskript Description Descrição Offers export to Oferece exportação para Status Estado Status: Estado: Version: Versão: Path: Caminho: ... Procurar... {HelpText} {HelpText} FrequencyAnalyzer Frequency Analyzer Analisador de frequência Word frequency Frequência de palavras Settings Definições Minimum size: Tamanho mínimo: Exclude words (comma separated): Palavras a excluir (entre vírgulas): Analyze Analisar Phrase frequency Frequência de frases Number of words: from Número de palavras: de to até Import Markdown import Importação markdown <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; <b>Informação:</b> um analisador muito simples que percorre um documento markdown e cria itens para cada título.<br/>&nbsp; Folder import Importação de pastas <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> <p><b>Informação:</b> importa uma estrutura de pastas completa. As pastas são adicionadas como pastas e os documentos de texto (escolha sua por extensão) são adicionados como cenas.</p> <p>Só são suportados ficheiros de texto (nem imagens, binários ou outros).</p> Include only those extensions: Incluir só estas extensões: Comma separated values Valores separados por vírgulas Sort items by name Ordenar itens por nome Import folder then files Importar pastas e depois ficheiros OPML Import Importação OPML File open failed. Falha ao abrir o ficheiro. This does not appear to be a valid OPML file. Não parece ser um ficheiro OPML válido. Pandoc import Importação Pandoc <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; <b>Informação:</b> o Manuskript pode importar de <b>markdown</b> ou <b>OPML</b>. O Pandoc vai converter o seu documento para um deles (veja a opção abaixo) e será depois importado para o Manuskript. Um ou outro poderão dar um melhor resultado, dependendo do documento. <br/>&nbsp; Import using: Importar usando: Wrap lines: Quebra de linhas: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> <p>Deve o Pandoc criar quebras de linha cosméticas/não-semânticas?</p><p> <b>automática</b>: quebra aos 72 caracteres.<br> <b>nenhuma</b>: sem quebra de linhas.<br> <b>preservar</b>: tenta preservar a quebra de linhas do documento original.</p> Mind Map Import Importação de mapa mental This does not appear to be a valid Mind Map file. Não parece ser um ficheiro de mapa mental válido. Mind Map import Importação de mapa mental Import tip as: Importar dica como: Untitled Sem título MDEditCompleter Insert reference Inserir referência MainWindow General Geral Book information Informação do livro Title Título Subtitle Subtítulo Series Série Volume Volume Genre Género License Licença Author Autor Name Nome Email Email Summary Sinopse Situation: Situação: Summary: Sinopse: One sentence Uma frase One paragraph Um parágrafo One page Uma página Full Completa One sentence summary Sinopse numa frase One paragraph summary Sinopse num parágrafo Expand each sentence of your one paragraph summary to a paragraph Expanda cada frase da sua sinopse num parágrafo para um parágrafo One page summary Sinopse numa página Full summary Sinopse completa Next Seguinte What if...? E se...? Characters Personagens Names Nomes Filter Filtro Basic info Informação básica Motivation Motivação Goal Objectivo Conflict Conflito Epiphany Epifania <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="left">Sinopse<br/>numa frase</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> <html><head/><body><p align="left">Sinopse<br/>num parágrafo</p></body></html> Importance Importância Notes Notas Detailed info Informação detalhada Plots Enredos Plot Enredo Character(s) Personagens Description Descrição Result Resultado Resolution steps Passos da resolução Add plot step Adicionar passo do enredo Remove selected plot step(s) Remover passos do enredo seleccionados World Mundo Populates with empty data Povoa com categorias vazias More Mais Source of passion Fonte da paixão Source of conflict Fonte do conflito Outline Esquema Editor Editor Debug Depuração FlatData Dados simples Persos Personagens Labels Etiquetas &File &Ficheiro &Recent &Recentes &Help A&juda &Tools Ferramen&tas &Edit &Editar &Format &Formatar &Header Cabeçal&ho &View &Ver &Mode &Modo Organi&ze Organi&zar &Cheat sheet &Cábula Sea&rch P&rocurar &Navigation &Navegação &Open A&brir Ctrl+O Ctrl+B &Save &Gravar Ctrl+S Ctrl+G Sa&ve as... Gra&var como... Ctrl+Shift+S Ctrl+Shift+V &Quit &Sair Ctrl+Q Ctrl+S &Show help texts &Mostrar textos de ajuda Ctrl+Shift+B Ctrl+Shift+M &Spellcheck &Ortografia F9 F9 &Labels... Eti&quetas... &Status... E&stado... Tree Árvore &Simple &Simples &Fiction &Ficção Index cards Fichas indexadas S&ettings &Definições F8 F8 &Close project Fe&char projecto Co&mpile Co&mpilar F6 F6 &Frequency Analyzer Analisador de &frequência &About &Acerca de About Manuskript Acerca do Manuskript &Import… &Importar… F7 F7 &Copy &Copiar Ctrl+C Ctrl+C C&ut Cor&tar Ctrl+X Ctrl+X &Paste Co&lar Ctrl+V Ctrl+V &Split… Di&vidir… Ctrl+Shift+K Ctrl+Shift+V Sp&lit at cursor D&ividir no cursor Ctrl+K Ctrl+I M&erge &Unir Ctrl+M Ctrl+U Dupl&icate Dupl&icar &Delete &Eliminar Del Del &Move Up &Mover acima Ctrl+Shift+Up Ctrl+Shift+↑ M&ove Down M&over abaixo Ctrl+Shift+Down Ctrl+Shift+↓ &Rename &Renomear F2 F2 &Level 1 (setext) Níve&l 1 (defext) Ctrl+Alt+1 Ctrl+Alt+1 Level &2 Nível &2 Ctrl+Alt+2 Ctrl+Alt+2 Level &1 (atx) Nível &1 (atx) Ctrl+1 Ctrl+1 L&evel 2 Nív&el 2 Ctrl+2 Ctrl+2 Level &3 Nível &3 Ctrl+3 Ctrl+3 Level &4 Nível &4 Ctrl+4 Ctrl+4 Level &5 Nível &5 Ctrl+5 Ctrl+5 Level &6 Nível &6 Ctrl+6 Ctrl+6 &Bold &Negrito Ctrl+B Ctrl+N &Italic &Itálico Ctrl+I Ctrl+I &Strike Ra&surado &Verbatim &Verbatim Su&perscript Ex&poente Ctrl++ Ctrl++ Subsc&ript Subsc&rito Ctrl+- Ctrl+- Co&mment block Bloco de co&mentário Ctrl+Shift+C Ctrl+Shift+M Clear &formats Limpar &formatos Ctrl+0 Ctrl+F &Comment line(s) Lin&has de comentário Ctrl+D Ctrl+H &Ordered list Lista &ordenada &Unordered list Lista &desordenada B&lockquote Citação em b&loco The file {} does not exist. Has it been moved or deleted? O ficheiro {} não existe. Terá sido movido ou eliminado? Manuskript Manuskript Project {} saved. Projecto {} gravado. WARNING: Project {} not saved. AVISO: projecto {} não gravado. Project {} loaded. Projecto {} carregado. Project {} loaded with some errors: Projecto {} carregado com alguns erros: * {} wasn't found in project file. * {} não encontrado no ficheiro do projecto. Project {} loaded with some errors. Projecto {} carregado com alguns erros. (~{} pages) (~{} páginas) Words: {}{} Palavras: {}{} Book summary Sinopse do livro Project tree Árvore do projecto Metadata Meta-dados Story line Fio da história Enter information about your book, and yourself. Insira informação sobre o livro e sobre si. The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) A situação básica, na forma de pergunta "E se...?". E.g.: "E se o mais maligno e perigoso feiticeiro não fosse capaz de matar um bebé?" (Harry Potter) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Leve o seu tempo a pensar numa frase (±50 palavras) que resuma o seu livro. Depois expanda-a para um parágrafo, em seguida para uma página e finalmente uma sinopse completa. Create your characters. Crie os seus personagens. Develop plots. Desenvolva enredos. Build worlds. Create hierarchy of broad categories down to specific details. Construa mundos. Crie uma hierarquia desde categorias vastas até detalhes específicos. Create the outline of your masterpiece. Crie o fio da meada para a sua obra. Write. Escreva. Debug info. Sometimes useful. Informação de depuração. Por vezes é útil. Dictionary Dicionário Nothing Nada POV PDV Label Etiqueta Progress Progresso Compile Compilar Icon color Cor do ícone Text color Cor do texto Background color Cor do fundo Icon Ícone Text Texto Background Fundo Border Contorno Corner Canto Install {}{} to use spellcheck Instalar {}{} para verificar a ortografia {} has no installed dictionaries {} não tem dicionários instalados {}{} is not installed {}{} não está instalado Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings Settings Definições General Geral Revisions Revisões Views Vistas Labels Etiquetas Status Estado Fullscreen Ecrã completo General settings Definições gerais Application settings Definições da aplicação Style: Estilo: Language: Idioma: Font size: Tamanho da letra: Restarting Manuskript ensures all settings take effect. Reiniciar o Manuskript garante que as definições tenham efeito. Loading Carregamento Automatically load last project on startup Carregar automaticamente o último projecto ao iniciar Saving Gravação Automatically save every Gravar automaticamente a cada minutes. minutos. If no changes during Se não houver alterações durante seconds. segundos. Save on project close Gravar ao sair <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> <html><head/><body><p>Se marcar esta opção, o seu projecto será gravado como um único ficheiro. É mais fácil de copiar, mas não permite edição colaborativa ou controlo de versões.<br/>Se não estiver marcada, o seu projecto será gravado como uma pasta com muitos ficheiros pequenos.</p></body></html> Save to one single file Gravar num único ficheiro Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. As revisões são uma forma de manter um registo das modificações. Para cada item de texto, armazena as alterações ao texto principal, permitindo ver e restaurar versões anteriores. Keep revisions Manter revisões S&mart remove Re&moção inteligente Keep: Manter: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. A remoção inteligente mantém só um certo número de revisões. Recomenda-se vivamente que a use, para que o seu ficheiro não fique repleto de alterações insignificantes. revisions per day for the last month revisões por dia para o último mês revisions per minute for the last 10 minutes revisões por minuto para os últimos 10 minutos revisions per hour for the last day revisões por hora para o último dia revisions per 10 minutes for the last hour revisões por 10 minutos para a última hora revisions per week till the end of time revisões por semana até ao fim dos tempos Views settings Aparência Tree Árvore Colors Cores Icon color: Cor do ícone: Nothing Nada POV PDV Label Etiqueta Progress Progresso Compile Compilar Text color: Cor do texto: Background color: Cor do fundo: Icon Size Tamanho do ícone TextLabel Rótulo Folders Pastas Show ite&m count &Mostrar total de itens Show &word count Mostrar total de pala&vras S&how progress Mostrar &progresso Show summar&y Mostrar s&inopse &Nothing &Nada Text Texto &Show word count Mo&strar total de palavras Show p&rogress Mostrar p&rogresso Show summary Mostrar sinopse Outline Esquema Visible columns Colunas visíveis Goal Objectivo Word count Total de palavras Percentage Percentagem Title Título Index cards Fichas indexadas Background Fundo Color: Cor: Ctrl+S Ctrl+S Image: Imagem: Style Estilo Old st&yle Est&ilo antigo &New style &Novo estilo Item colors Cor dos itens Border color: Cor do contorno: Corner color: Cor do canto: Text editor Editor de texto Background: Fundo: Transparent Transparente Restore defaults Repor predefinições Font Letra Family: Família: Size: Tamanho: Misspelled: Erros: Text area Área de texto Max width Largura máxima px px Left/Right margins: Margens esquerda/direita: Top/Bottom margins: Margens superior/inferior: Paragraphs Parágrafos Alignment: Alinhamento: Left Esquerda Center Centro Right Direita Justify Justificado Line spacing: Espaçamento de linhas: Single Simples 1.5 lines 1,5 linhas Double Duplo Proportional Proporcional % % Tab width: Largura da tabulação: Indent 1st line Indentar 1ª linha Spacing: Espaçamento: Cursor Cursor Use block insertion of Usar inserção de bloco de Disable blinking Desactivar piscar Typewriter mode Modo Dactilografia Focus mode Modo Foco None Nenhum Sentence Frase Line Linha Paragraph Parágrafo New Novo Edit Editar Delete Eliminar Theme name: Nome do tema: Apply Aplicar Cancel Cancelar Window Background Fundo da janela Text Background Fundo do texto Text Options Opções do texto Paragraph Options Opções do parágrafo Type: Tipo: No Image Sem imagem Tiled Mosaico Centered Centrada Stretched Esticada Scaled Escalada Zoomed Ampliada Opacity: Opacidade: Position: Posição: Width: Largura: Corner radius: Raio do canto: Margins: Margens: Padding: Espaço: Font: Letra: Alignment Alinhamento <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions Sugestões ortográficas &Add to dictionary &Adicionar ao dicionário &Remove from custom dictionary &Remover do dicionário pessoal about About Manuskript Acerca do Manuskript Manuskript Manuskript aboutDialog Version Versão Software Versions in Use: Versões dos programas em uso: abstractModel Title Título POV PDV Label Etiqueta Status Estado Compile Compilar Word count Total de palavras Goal Objectivo basicItemView Form Formulário POV: PDV: Goal: Objectivo: Word count Total de palavras One line summary Sinopse numa linha Few sentences summary: Sinopse em poucas frases: characterModel New character Novo personagem Name Nome Value Valor characterTreeView Main Principal Secondary Secundário Minor Menor cheatSheet Form Formulário Filter (type the name of anything in your project) Filtro (escreva o nome de qualquer coisa do seu projecto) Minor Menor Secondary Secundário Main Principal Characters Personagens Texts Textos Plots Enredos World Mundo cmbOutlineCharacterChoser None Nenhum Main Principal Secondary Secundário Minor Menor Various Vários cmbOutlineLabelChoser Various Vários cmbOutlineStatusChoser Various Vários collapsibleDockWidgets Dock Widgets Toolbar Ancorar barra de painéis completer Form Formulário corkDelegate One line summary Sinopse numa linha Full summary Sinopse completa editorWidget_ui Form Formulário exporter Export Exportar Export to: Exportar para: Manage exporters Gerir exportadores Preview Antever Settings Definições exporterDialog {} (not implemented yet) {} (ainda não implementado) exporterSettings Form Formulário Content Conteúdo Decide here what will be included in the final export. Decida aqui o que será incluído na exportação final. Type Tipo Title Título Text Texto I need more granularity Preciso de mais escolhas Fi&lters Fi&ltros <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> <html><head/><body><p>Filtra que itens serão incluídos na exportação final.<br/><span style=" color:#773333;">(ainda não está completamente implementado)</span></p></body></html> Ignore compile status (include all items) Ignorar estado de compilação (incluir todos os itens) Subitems of: Sub-itens de: Labels Etiquetas Status Estado Separations Separações Between folders: Entre pastas: Empty line Linha vazia Custom Personalizado Between texts: Entre textos: Between folder and text: Entre pasta e texto: Between text and folder: Entre texto e pasta: Transformations Transformações Typographic replacements: Substituições tipográficas: Replace ... with … Substituir ... por … Replace --- with — Substituir --- por — Replace double quotes (") with: Substituir aspas duplas (") por: Replace single quotes (') with: Substituir aspas simples (') por: Remove multiple spaces Remover espaços múltiplos Custom replacements: Substituições personalizadas: Enabled Activa Replace Substituir With Por RegExp ExpReg If checked, uses regular expression for replacement. If unchecked, replaced as plain text. Se marcada, usa expressões regulares para a substituição. Se não, substitui como texto simples. Preview Antever Font Letra Font: Letra: Font size: Tamanho da letra: Folder Pasta {}Level {} folder {}nível {} pasta {}Level {} text {}nível {} texto exportersManager Installed Instalado Custom Personalizado Not found Não encontrado {} not found. Install it, or set path manually. {} não encontrado. Instale-o ou defina o caminho manualmente. <b>Status:</b> uninstalled. <b>Estado:</b> não instalado. <b>Requires:</b> <b>Requer:</b> Set {} executable path. Definir caminho executável de {}. frequencyAnalyzer Phrases Frases Frequency Frequência Word Palavra fullScreenEditor Theme: Tema: {} words / {} {} palavras/{} {} words {} palavras Spellcheck Ortografia Navigation Navegação New Text Novo texto Title Título Title: Show Full Path Título: mostrar caminho completo Theme selector Selector de tema Word count Total de palavras Progress Progresso Progress: Auto Show/Hide Progresso mostrar/ocultar automático Clock Relógio Clock: Show Seconds Relógio: mostrar segundos generalSettings General Geral Split scenes at: Dividir cenas em: \n---\n \n---\n Trim long titles (> 32 chars) Aparar títulos longos (>32 caracteres) Import under: Importar sob: Import in a top-level folder Importar numa pasta de nível superior helpLabel If you don't wanna see me, you can hide me in Help menu. Se não me deseja ver, pode ocultar-me no menu Ajuda. importer Import Importar Format: Formato: Choose file Escolha o ficheiro Clear file Limpar ficheiro Preview Antever Settings Definições lastAccessedDirectoryInfo Last accessed directory "{}" loaded. Carregada a última pasta acedida "{}". lineEditView Various Vários locker Form Formulário Lock screen: Bloquear ecrã: Word target Número de palavras Time target Tempo limite words palavras minutes minutos Lock ! Bloquear! ~{} h. ~{} h. ~{} mn. ~{} m. {}:{} {}:{} {} s. {} s. {} remaining {} restante {} words remaining {} palavras restantes mainEditor Form Formulário Go to parent item Ir para o item-mãe Alt+Up Alt+↑ Text Texto Index cards Fichas indexadas Outline Esquema F11 F11 Root Raiz {} words / {} {} palavras/{} {} words {} palavras markdownSettings Markdown Markdown metadataView Form Formulário Properties Propriedades Summary Sinopse One line summary Sinopse numa linha Full summary Sinopse completa Notes / References Notas/Referências Revisions Revisões myPanel Auto-hide Ocultar automaticamente outlineBasics Root Raiz Open {} items in new tabs Abrir itens {} em novos separadores Open {} in a new tab Abrir {} em novo separador New &Folder Nova &pasta New &Text Novo &texto C&ut Cor&tar &Copy &Copiar &Paste Co&lar &Delete &Eliminar &Rename &Renomear Set POV Definir PVD None Nenhum Main Principal Secondary Secundário Minor Menor Set Status Definir estado Set Label Definir etiqueta Set Custom Icon Definir ícone personalizado Restore to default Repor predefinição New Novo About to remove Prestes a remover <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> <p><b>Está prestes a eliminar {} item(ns).</b></p><p>Tem a certeza?</p> Select at least two items. Folders are ignored. Seleccione pelo menos dois itens. As pastas são ignoradas. All items must be on the same level (share the same parent). Todos os itens têm de estar no mesmo nível (partilhar a mesma mãe). outlineCharacterDelegate None Nenhum Main Principal Secondary Secundário Minor Menor outlineItem {} words / {} ({}) {} palavras/{} ({}) {} words {} palavras pandocSettings General Geral Table of Content Índice Custom settings for {} Definições personalizadas para {} persosProxyModel Main Principal Secondary Secundário Minors Menores plotDelegate General Geral Promise Promessa Problem Problema Progress Progresso Resolution Resolução Try / Fail Tentar/Falhar No and Não e Yes but Sim mas Freytag's pyramid Pirâmide de Freitag Exposition Exposição Rising action Crescendo da acção Climax Clímax Falling action Queda da acção Three acts Três actos 1. Setup 1. Configuração 1. Inciting event 1. Evento incitador 1. Turning point 1. Ponto de viragem 2. Choice 2. Escolha 2. Reversal 2. Reversão 2. Disaster 2. Desastre 3. Stand up 3. Enfrentamento 3. Climax 3. Clímax 3. Ending 3. Final Hero's journey Jornada do herói Ordinary world Mundo normal Call to adventure Chamada para a aventura Refusal of the call Recusa da chamada Meeting with mentor Reunião com o mentor Crossing the Threshold Passar o limite Tests Testes Approach Abordagem Abyss Abismo Reward / Revelation Recompensa/Revelação Transformation Transformação Atonement Expiação Return Regresso plotModel New plot Novo enredo Name Nome Meta Meta New step Novo passo Main Principal Secondary Secundário Minor Menor plotTreeView Main Principal Secondary Secundário Minor Menor **Plot:** {} **Enredo:** {} plotsProxyModel Main Principal Secondary Secundário Minors Menores propertiesView Form Formulário POV PDV Status Estado Label Etiqueta Compile Compilar Goal Objectivo Word count Total de palavras references Not a reference: {}. Não é referência: {}. Unknown reference: {}. Referência desconhecida: {}. Path: Caminho: Stats: Estatísticas: POV: PDV: Status: Estado: Label: Etiqueta: Short summary: Sinopse curta: Long summary: Sinopse longa: Notes: Notas: Basic info Informação básica Detailed info Informação detalhada POV of: PDV de: Go to {}. Ir para {}. Motivation Motivação Goal Objectivo Conflict Conflito Epiphany Epifania Short summary Sinopse curta Longer summary Sinopse mais longa Description Descrição Result Resultado Characters Personagens Resolution steps Passos da resolução Passion Paixão <b>Unknown reference:</b> {}. <b>Referência desconhecida:</b> {}. Folder: <b>{}</b> Pasta: <b>{}</b> Text: <b>{}</b> Texto: <b>{}</b> Character: <b>{}</b> Personagem: <b>{}</b> Plot: <b>{}</b> Enredo: <b>{}</b> World: <b>{name}</b>{path} Mundo: <b>{name}</b>{path} Referenced in: Referência em: revisions Form Formulário Options Opções Restore Restaurar Delete Eliminar Show modifications Mostrar modificações Show ancient version Mostrar versão anterior Show spaces Mostrar espaços Show modifications only Mostrar só modificações {} years ago {} anos atrás {} months ago {} meses atrás {} days ago {} dias atrás 1 day ago um dia atrás {} hours ago {} horas atrás {} minutes ago {} minutos atrás {} seconds ago {} segundos atrás Line {}: Linha {}: Clear all Limpar tudo search Form Formulário Search for... Procurar por... Search in: Procurar em: All Tudo Title Título Text Texto Summary Sinopse Notes Notas POV PDV Status Estado Label Etiqueta Options: Opções: Case sensitive Sensível a maiúsculas settingsWindow New status Novo estado New label Nova etiqueta newtheme novotema New theme Novo tema (read-only) (só de leitura) Open Image Abrir imagem Image files (*.jpg; *.jpeg; *.png) Ficheiros de imagem (*.jpg; *.jpeg; *.png) Error Erro Unable to load selected file Impossível carregar o ficheiro seleccionado Unable to add selected image: {} Impossível adicionar a imagem seleccionada: {} sldImportance Form Formulário TextLabel Rótulo Minor Menor Secondary Secundário Main Principal splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> <p>Divide os itens seleccionados na marca indicada.</p> <p>Se um dos itens for uma pasta, será aplicado recursivamente a <i>todos</i> os itens-filho.</p> <p>A marca de divisão pode conter as seguintes sequências: <ul> <li><b><code>\n</code></b>: quebra de linha</li> <li><b><code>\t</code></b>: tabulação</li> </ul> </p> <p><b>Marca:</b></p> Split '{}' Dividir "{}" Split items Dividir itens storylineView Form Formulário Show Plots Mostrar enredos Show Characters Mostrar personagens tabSplitter Open selected items in that view. Abrir itens seleccionados na vista. Split horizontally Dividir na horizontal Close split Fechar divisão Split vertically Dividir na vertical textEditView Various Vários textFormat Form Formulário CTRL+B CTRL+B CTRL+I CTRL+I CTRL+U CTRL+U CTRL+P CTRL+P CTRL+L CTRL+L CTRL+E CTRL+E CTRL+R CTRL+R CTRL+J CTRL+J treeView Expand {} Expandir {} Collapse {} Colapsar {} Expand All Expandir tudo Collapse All Colapsar tudo welcome Form Formulário 1 1 Templates Modelos Empty Vazio Novel Romance Novella Novela Short Story História curta Research paper Investigação Demo projects Projectos de demonstração Add level Adicionar nível Add word count Adicionar total de palavras Next time, automatically open last project No próximo arranque, abrir o último projecto Open... Abrir... Recent Recentes Create Criar Open project Abrir projecto Manuskript project (*.msk);;All files (*) Projecto do Manuskript (*.msk);;Todos os ficheiros (*) Save project as... Gravar projecto como... Manuskript project (*.msk) Projecto do Manuskript (*.msk) Manuskript Manuskript Create New Project Criar novo projecto Warning Aviso Overwrite existing project {} ? Sobrescrever projecto {} existente? Empty fiction Ficção vazia Chapter capítulos Scene cenas Trilogy Trilogia Book livros Section secções Empty non-fiction Não-ficção vazia words each. palavras cada. of de Text Texto Something Algo <b>Total:</b> {} words (~ {} pages) <b>Total:</b> {} palavras (~ {} páginas) Fiction Ficção Non-fiction Não-ficção Idea Ideia Note Nota Research Investigação TODO A FAZER First draft 1º rascunho Second draft 2º rascunho Final Final worldModel New item Novo item Fantasy world building Construção de um mundo de fantasia Physical Físico Climate Clima Topography Topografia Astronomy Astronomia Natural resources Recursos naturais Wild life Fauna Flora Flora History História Races Raças Diseases Doenças Cultural Cultura Customs Tradições Food Comida Languages Idiomas Education Educação Dresses Roupas Science Ciência Calendar Calendário Bodily language Expressão corporal Ethics Ética Religion Religião Government Governo Politics Política Gender roles Papéis dos sexos Music and arts Música e artes Architecture Arquitectura Military Forças armadas Technology Tecnologia Courtship Namoro Demography Demografia Transportation Transportes Medicine Medicina Magic system Sistema mágico Rules Regras Organization Organização Magical objects Objectos mágicos Magical places Locais mágicos Magical races Raças mágicas Important places Locais importantes Important objects Objectos importantes manuskript-0.10.0/i18n/manuskript_ru.qm000066400000000000000000002366451354442177200200370ustar00rootroot00000000000000UFQUF(UFUFtL]L0]Օ[5~!TTZT֍֍֍D֍֍֍˃֍<֍e֍5֍֍E֍֍֍ ֍ ,Y|Z|c||f|l^Z5+0EM77777-7777:7< F_H5_H5(H5mL>L`OTTtVEBVE|VEVEۺVsdcIdUdؐmUψpeM}  J{<BQ*$=.*y>?*yҍ*>*%?&*0@>+EAd+fB+B+C+F9.30193;A[G:GHw9yMJ5JT@KQ7L7VLGkLbLbM|M6MezqMezMŅZoNWQ:Rx\RxERxRxRxnTbTbTb-TbTblTb.TbTbQT`%Uj`UjUlV':-V"WVW6cW6)Xy X7YE1Y!`YȀZbZ%qZʳZϳ[![ %p[ %U[ %[ %&[ %R[ %*[ٵ;\H\\\1^i$r^i$gUanZ9^-vs#8(?Y<BwrofFo~_[eו.Gym$tDHDT"sx- "<NErP2i MtUdQ36ݰHʯlMIznԳYA IFzY^;Bgq"{huze~hVqY9u<BPD:f3Ed#!`#ӽ)ҳP.I^fM[DY#N~L[,M[Á-,U0W>NV1v 3tcML#vUAIV"W]1}#7^ai@:SteRW?.dek.(^Vʶ'&9)|J#'1!\ȳ%Ʃ%i&n0J ESFN^_iaNlwpAl.q0bor}wb`p HZe +4ָ ?:E Mg! MgU* Mg T{ X;jX ^dp ^ ^ ^ g: r,|p x s z If . ! -Ŏ  h< %i  Uw Uڈ շ z_ C N z % ?@* 08 3 9s[m 9s 9s >ck5 A^ Rb` Z dpeM dpe|m dpe dpe d)X d)Y d) d) d) d)E d) d) d) d) e luIR n-_ o"` }(3 x TB B;&o f *  s 9 :" : ,>y , 8j 8 8 ʶ@ ֓?T U2 N z@  9V Jx @ ;Q #e< F.` Q8̴ U~6Y ]Y l( s3 }j$ % . tC HCH H=  fh 5   j  GD# L ڔ6 5E& u 5c YU _J iCb ӨS y W" ӂ  R4 /!+ 1U݀ 4 & ; =fj Cjk G NrU S~ Z Z${ b# i?fi pk^ rIj }5 !T{ ~\ =E   >    _ ) ޔ ˆ  x$ " s S ` 'j _] $! $_ $ $] nL ,d %9 #g s% sN sa s ɠa ]? ]z ] ] ^+ ̺\Z C u  > 6 QN  A .D zZ|   4}% 5N 7ؤr 87>K4 DYR DYS DYSt DZS J K b~ i8:S b P .: S @  4 ^ W )~ 0y Ğt= <Z9 < < <F <! aޏ ⋙a) eW uYYE'am2#2)Le6eJ9a<+HfIOq*UhWGxYpД$<0n$VBj{ k&̺|aPbQ6 Trd S); g=Q>b$B3BxS6Qy!R_JR_d@fqpIt7Z|oN ~`Q~`=3"|"|i#i~LGl\ttxu:APi8i"<p>#=825@A0;L=K9 :>=25@B5@ 4>:C<5=B>2. >65B 8A?>;L7>20BLAO 4;O ?@5>1@07>20=8O 4>:C<5=B>2 2 D>@<0B5 markdown 2 H8@>:89 480?07>= 4@C38E D>@<0B>2.</p> <p>51A09B: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> 

A universal document converter. Can be used to convert markdown to a wide range of other formats.

Website: http://pandoc.org/

Export0;> 8725AB=K9 D>@<0B, ?@0:B8G5A:8 =5 8A?>;L7C5BAO. K 7=05B5, 4;O 251-A09B>2 =0 ?@8<5@.EA little known format modestly used. You know, web sites for example.Exportz07>2K9 2K2>4 HTML A 8A?>;L7>20=85< Python <>4C;O 'markdown'.5Basic HTML output using the Python module 'markdown'.ExportD=838, :>B>@K5 =5 C1820NB 45@52LO.Books that don't kill trees.Export2K15@8B5 2KE>4=>9 D09;Choose output file…Export ;0AA:Class:Export8@5>1@07>20BL 2 D>@<0B ePUB3Convert to ePUB3Export^5 C40;>AL >1@01>B0BL @53C;O@=>5 2K@065=85: {})Could not process regular expression: {}Export-:A?>@B5@ ?> C<>;G0=8N, ?@54>AB02;O5B >A=>2=K5 D>@<0BK, 8A?>;L7C5<K5 4@C38<8 M:A?>@B5@0<8.ADefault exporter, provides basic formats used by other exporters.ExportB:;NG8BL 1;>: <5B040==KE YAML. A?>;L7C9B5 MB>, 5A;8 ?>;CG05B5 >H81:8 A2O70==K5 A YAML.DDisable YAML metadata block. Use that if you get YAML related error.Export H81:0ErrorExport-:A?>@B 2 markdown, 8A?>;L7CO pandoc. <55B 1>;LH5 =0AB@>5: D>@<0B8@>20=8O, G5< M:A?>@B5@ manuskript.hExport to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter.Export 07<5@ H@8DB0: Font size:ExportHTML @57C;LB0B HTML OutputExport&HTML 8AE>4=K9 B5:AB HTML SourceExport(:;NG8BL >3;02;5=85.Include a table of contents.Export 0: >1KG=K9 B5:AB, 70 8A:;NG5=85< markdown 703>;>2:>2. @54?>;0305BAO, GB> B5:ABK D>@<0B8@CNBAO 2 markdown.Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown.ExportFLaTeX 8A?>;L7>20= 4;O A>740=8O PDF.%LaTeX engine used to produce the PDF.Export0Latex MB> B5:AB>2K9 ?@>F5AA>@ 8 O7K: @07<5B:8 4>:C<5=B>2, 8A?>;L7C5<K9 4;O A>740=8O :@0A82KE 4>:C<5=B>2.LaTeX is a word processor and document markup language used to create beautiful documents.Export.564CAB@>G=K9 8=B5@20;: Line spacing:Export*Markdown 8AE>4=K9 :>4Markdown sourceExportD>:C<5=B Microsoft Office (.docx)."Microsoft Office (.docx) document.ExportN5>1E>48< CAB0=>2;5==K9 @540:B>@ LaTeX.Needs LaTeX to be installed.ExportH>@<0;87>20BL 4>:C<5=B0 (G8AB8;LI8:) Normalize the document (cleaner)Exportf'8A;> C@>2=59 @0745;>2 4;O 2:;NG5=8O 2 >3;02;5=85: ,Number of sections level to include in TOC: Exportv-B> $>@<0B OpenDocument. B:@K205BAO A ?><>ILN LibreOffice.5OpenDocument format. Used by LibreOffice for example.Export 07<5@ 1C<038: Paper size:Export1KG=K9 B5:AB Plain textExportN@5420@8B5;L=K9 ?@>A<>B@ A highlighter.Preview with highlighter.Export2Python <>4C;L 'markdown'.Python module 'markdown'.Exportd2B>=><=K5 HTML D09;K, 157 :0:8E-;81> 7028A8<>AB59/Self-contained HTML files, with no dependenciesExport`@>AB>9 M:A?>@B 2 >1KG=K9 B5:AB. >72>;O5B 20< 8A?>;L7>20BL 20H8 A>1AB25==K5 <5B:8, =5 @0A?>7=0==K5 manuskript, =0?@8<5@ <a href='www.fountain.io'>$>=B0=</a>.Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example Fountain.ExportP#:068B5 107>2K9 C@>25=L 4;O 703>;>2:>2: $Specify the base level for headers: ExportDB45;L=K9 4>:C<5=B (0 =5 D@03<5=B))Standalone document (not just a fragment)Export&5;L MB>3> D>@<0B0->15A?5G8BL 2>7<>6=>ABL >1<5=0 8=D>@<0F859 <564C ?;0=8@>2I8:>< 8 8=B5@=5B-A5@28A0<8, :>B>@K5 <>6=> ?@>A<0B@820BL 8;8 :>=B@>;8@>20BL G5@57 ?;0=8@>2I8:.The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner.Export>"8?>3@0D8G5A:8 ?@028;L=K9 2K2>4Typographically correct outputExportJA?>;L7C9B5 B538 <q> 4;O F8B0B 2 HTMLUse tags for quotes in HTMLExportDA?>;L7>20=85 ATX-AB8;L 703>;>2:>2Use ATX-style headersExportA?>;L7>20BL ?@O<K5 AAK;:C 2 2845 AAK;:8, 0 =5 2AB@>5==K5 AAK;:81Use reference-style links instead of inline linksExport459AB2CNI0O CAB0=>2:0 LaTeX. !<. @5:><5=40F88 pandoc =0: <a href="http://pandoc.org/installing.html">http://pandoc.org/installing.html</a>. A;8 20< =C6=0 ?>445@6:0 N=8:>40, 20< =5>1E>48< XeLaTeX.a valid LaTeX installation. Pandoc recommendations can be found on: pandoc.org/installing.html. If you want Unicode support, you need XeLaTeX.ExportTreStructuredText MB> ;53:89 O7K: @07<5B:8.2reStructuredText is a lightweight markup language.Export...ExportersManager?8A0=85 DescriptionExportersManager.#?@02;5=85 M:A?>@B5@0<8Manage ExportersExportersManager0=CA:@8?B ManuskriptExportersManager-:A?>@B8@C5B 2Offers export toExportersManager CBL:Path:ExportersManager !B0BCAStatusExportersManager!B0BCA:Status:ExportersManager5@A8O:Version:ExportersManager {HelpText}ExportersManager=0;878@>20BLAnalyzeFrequencyAnalyzerLA:;NG8BL A;>20 (@0745;5==K5 70?OB>9): Exclude words (comma separated):FrequencyAnalyzer8=0;870B>@ G0ABKE ?>2B>@5=89Frequency AnalyzerFrequencyAnalyzer&8=8<0;L=K9 @07<5@: Minimum size:FrequencyAnalyzer&>;8G5AB2> A;>2: >BNumber of words: fromFrequencyAnalyzer'0AB>B0 D@07Phrase frequencyFrequencyAnalyzer0AB@>9:8SettingsFrequencyAnalyzer'0AB>B0 A;>2Word frequencyFrequencyAnalyzer4>toFrequencyAnalyzerf<b>=D>@<0F8O:</b> G5=L ?@>AB>9 ?0@A5@, :>B>@K9 ?@>945B ?> 4>:C<5=BC markdown 8 A>740AB M;5<5=BK 4;O :064>3> 703>;>2:0.<br/>&nbsp;Info: A very simple parser that will go through a markdown document and create items for each titles.
 Import0<b>=D>@<0F8O:</b> Manuskript <>65B 8<?>@B8@>20BL 87 <b>markdown</b> 8;8 <b>OPML</b>. Pandoc <>65B ?@5>1@07>20BL 20H 4>:C<5=B 2 ;N1>9 87 =8E (A<. =865), 8 B>340 >= 1C45B 8<?>@B8@>20= 2 manuskript. 48= 8;8 4@C3>9 <>3CB 40BL ;CGH89 @57C;LB0B, 2 7028A8<>AB8 >B 20H53> 4>:C<5=B0. <br/>&nbsp;}Info: Manuskript can import from markdown or OPML. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document.
 Import<p><b>=D>@<0F8O:</b> <?>@B8@C5B 2AN AB@C:BC@C :0B0;>3>2. 0?:8 4>102;ONBAO 2 2845 ?0?>:, 8 B5:AB>2K5 4>:C<5=BK 2 =8E (2K @5H8;8, :0:85 87 =8E ?> @0AH8@5=8N) 4>102;ONBAO 2 :0G5AB25 AF5=K.</p> <p>>445@6820NBAO B>;L:> B5:AB>2K5 D09;K (=5 87>1@065=8O, 42>8G=K9 8;8 4@C385).</p>R

Info: Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.

Only text files are supported (not images, binary or others).

Import<p>!;54C5B ;8 pandoc A>740BL :>A<5B8G5A:85 / =5 A5<0=B8G5A:>9 @07@K2K?</p><p> <b>02B></b>: @07@K205B =0 72 A8<2>;5.<br> <b>=5B</b>: 157 ?5@5=>A0 AB@>:8.<br> <b>A>E@0=8BL</b>: AB0@05BAO A>E@0=8BL @07@K2K AB@>: 87 8AE>4=>3> 4>:C<5=B0.</p>Q

Should pandoc create cosmetic / non-semantic line-breaks?

auto: wraps at 72 characters.
none: no line wrap.
preserve: tries to preserves line wrap from the original document.

Import<=0G5=8O, @0745;5==K5 70?OBK<8Comma separated valuesImport0$09; >B:@KBL =5 C40;>AL.File open failed.Import<?>@B ?0?:8 Folder importImport2<?>@B ?0?:8 ?>B>< D09;>2Import folder then filesImport6!>25BC5< 8<?>@B8@>20BL :0::Import tip as:Import0<?>@B8@>20BL 8A?>;L7CO: Import using:Import>:;NG8BL B>;L:> MB8 @0AH8@5=8O:Include only those extensions:ImportMarkdown 8<?>@BMarkdown importImport<?>@B Mind MapMind Map ImportImport,<?>@B8@>20BL Mind MapMind Map importImport<?>@B OPML OPML ImportImport<?>@B Pandoc Pandoc importImport:!>@B8@>2:0 M;5<5=B>2 ?> 8<5=8Sort items by nameImport@-B> =5 4>?CAB8<K9 Mind Map D09;.1This does not appear to be a valid Mind Map file.Import8-B> =5 4>?CAB8<K9 OPML D09;.-This does not appear to be a valid OPML file.Import57 8<5=8UntitledImport5@5=>A AB@>:: Wrap lines:ImportAB028BL AAK;:CInsert referenceMDEditCompleter (~{} AB@0=8F) (~{} pages) MainWindow@ * {} =5 =0945= 2 D09;5 ?@>5:B0.# * {} wasn't found in project file. MainWindow& ?@>3@0<<5&About MainWindow&8@=K9&Bold MainWindow&(?0@30;:0 &Cheat sheet MainWindow&0:@KBL ?@>5:B&Close project MainWindow&&!B@>:0 :><<5=B0@8O&Comment line(s) MainWindow&>?8@>20BL&Copy MainWindow&#40;8BL&Delete MainWindow& 540:B8@>20BL&Edit MainWindow&K<KA5;&Fiction MainWindow &$09;&File MainWindow&$>@<0B8@>20BL&Format MainWindow<&=0;870B>@ G0AB>BK ?>2B>@5=89&Frequency Analyzer MainWindow&03>;>2>:&Header MainWindow&><>IL&Help MainWindow &Import… MainWindow&C@A82&Italic MainWindow&5B:8... &Labels... MainWindow,&#@>25=L 1 (A B5:AB><)&Level 1 (setext) MainWindow & 568<&Mode MainWindow$&5@5<5AB8BL 225@E&Move Up MainWindow&02830F8O &Navigation MainWindow&B:@KBL&Open MainWindow*&#?>@O4>G5==K9 A?8A>: &Ordered list MainWindow&AB028BL&Paste MainWindow &KE>4&Quit MainWindow&>A;54=89&Recent MainWindow&5@58<5=>20BL&Rename MainWindow&!>E@0=8BL&Save MainWindow2&>:070BL B5:AB ?>4A:07:8&Show help texts MainWindow&@>AB>9&Simple MainWindow(&@>25@:0 >@D>3@0D88 &Spellcheck MainWindow& 0745;8BL & &Split… MainWindow&!B0BCA... &Status... MainWindow&0G5@:=CBK9&Strike MainWindow&=AB@C<5=BK&Tools MainWindow.&5C?>@O4>G5==K9 A?8A>:&Unordered list MainWindow&>A;>2=K9 &Verbatim MainWindow&@>A<>B@&View MainWindow<html><head/><body><p align="right">48= ?0@03@0D<br/>@57N<5</p></body></html>O

One paragraph
summary

 MainWindow<html><head/><body><p align="right">4=> ?@54;>65=85<br/>@57N<5</p></body></html>N

One sentence
summary

 MainWindow 0=CA:@8?BAbout Manuskript MainWindow(>1028BL H038 AN65B0 Add plot step MainWindow 2B>@Author MainWindow;>&: F8B0B0 B&lockquote MainWindow$>= Background MainWindow&25B D>=0Background color MainWindow&A=>2=0O 8=D>@<0F8O Basic info MainWindow$=D>@<0F8O > :=835Book information MainWindow0@0B:>5 A>45@60=85 :=838 Book summary MainWindow@0=8F0Border MainWindow!B@>8BL <8@K. !>7409B5 85@0@E8N >1I8E :0B53>@89 8 4> :>=:@5B=KE 45B0;59.MBuild worlds. Create hierarchy of broad categories down to specific details. MainWindow&K@570BLC&ut MainWindow5@A>=06 Character(s) MainWindow5@A>=06 Characters MainWindow0G8AB8BL &D>@<0B8@>20=85Clear &formats MainWindow$;&>: :><<5=B0@852Co&mment block MainWindow!>&1@0BLCo&mpile MainWindow!>1@0BLCompile MainWindow>=D;8:BConflict MainWindow#3>;Corner MainWindow:!>7409B5 ?;0= 20H53> H5452@0.'Create the outline of your masterpiece. MainWindow4!>7409B5 A2>8E ?5@A>=0659.Create your characters. MainWindow Ctrl++Ctrl++ MainWindow Ctrl+-Ctrl+- MainWindow Ctrl+0Ctrl+0 MainWindow Ctrl+1Ctrl+1 MainWindow Ctrl+2Ctrl+2 MainWindow Ctrl+3Ctrl+3 MainWindow Ctrl+4Ctrl+4 MainWindow Ctrl+5Ctrl+5 MainWindow Ctrl+6Ctrl+6 MainWindowCtrl+Alt+1 Ctrl+Alt+1 MainWindowCtrl+Alt+2 Ctrl+Alt+2 MainWindow Ctrl+BCtrl+B MainWindowCtrl+C MainWindowCtrl+D MainWindow Ctrl+ICtrl+I MainWindowCtrl+K MainWindowCtrl+M MainWindowCtrl+O MainWindowCtrl+Q MainWindowCtrl+S MainWindow Ctrl+Shift+B MainWindowCtrl+Shift+C Ctrl+Shift+C MainWindowCtrl+Shift+Down MainWindow Ctrl+Shift+K MainWindow Ctrl+Shift+S MainWindow Ctrl+Shift+Up MainWindowCtrl+V MainWindowCtrl+X MainWindowB;04:0Debug MainWindowLB;04>G=0O 8=D>@<0F8O. =>340 ?>;57=>.Debug info. Sometimes useful. MainWindow#40;8BLDel MainWindow?8A0=85 Description MainWindow(>4@>1=0O 8=D>@<0F8O Detailed info MainWindow& 07@01>B09B5 AN65B.Develop plots. MainWindow!;>20@L Dictionary MainWindowC?;8&:0BK Dupl&icate MainWindow 540:B>@Editor MainWindow04@5A EmailEmail MainWindowT2548B5 8=D>@<0F8N > A2>59 :=835 8 > A515.0Enter information about your book, and yourself. MainWindow@>7@5=85Epiphany MainWindow 0725@=8B5 :064>5 ?@54;>65=85 20H53> >?8A0=8O >4=8< 0170F5< : 0170FCAExpand each sentence of your one paragraph summary to a paragraph MainWindowF2 MainWindowF6 MainWindowF7 MainWindowF8 MainWindowF9 MainWindow $8;LB@Filter MainWindow!K@K5 0==K5FlatData MainWindowA5Full MainWindow>;=>5 >?8A0=85 Full summary MainWindowA=>2=K5General MainWindow0=@Genre MainWindow&5;LGoal MainWindow :>=:0Icon MainWindow&25B 8:>=:8 Icon color MainWindow=0G5=85 Importance MainWindow=45:A :0@BK Index cards MainWindown#AB0=>28B5 {}{}, GB>1K 8A?>;L7>20BL ?@>25@:C >@D>3@0D88Install {}{} to use spellcheck MainWindow#&@>25=L 2L&evel 2 MainWindow 5B:0Label MainWindow 5B:8Labels MainWindow #@>25=L &1 (atx)Level &1 (atx) MainWindow#@>25=L &2Level &2 MainWindow#@>25=L &3Level &3 MainWindow#@>25=L &4Level &4 MainWindow#@>25=L &5Level &5 MainWindow#@>25=L &6Level &6 MainWindow8F5=78OLicense MainWindow!&>548=8BLM&erge MainWindow"&5@5<5AB8BL 2=87 M&ove Down MainWindow0=CA:@8?B Manuskript MainWindow5B040==K5Metadata MainWindowI5More MainWindow>B820F8O Motivation MainWindow<OName MainWindow<ONames MainWindow!;54CNI89Next MainWindow0<5B:8Notes MainWindow 8G53>Nothing MainWindow4=0 AB@0=8F0One page MainWindow0?8A0=85 >4=>9 AB@0=8F59One page summary MainWindow48= 0170F One paragraph MainWindow(!2>4:0 >4=8< 0170F5<One paragraph summary MainWindow 4=> ?@54;>65=85 One sentence MainWindow*?8A0=85 >4=>9 D@07>9One sentence summary MainWindow@30=8&7>20BL Organi&ze MainWindow !E5<0Outline MainWindow">G:0 7@5=8OPOV MainWindow5@A>=06Persos MainWindow !N65BPlot MainWindow !N65BKPlots MainWindow.0?>;=O5B ?CABK5 40==K5Populates with empty data MainWindow@>3@5AAProgress MainWindow5@52> ?@>5:B0 Project tree MainWindowR@>5:B {} 703@C65= A =5:>B>@K<8 >H81:0<8.#Project {} loaded with some errors. MainWindowN@>5:B {} 703@C65= =5:>B>@K<8 >H81:0<8:#Project {} loaded with some errors: MainWindow&@>5:B {} 703@C65=.Project {} loaded. MainWindow(!>E@0=8BL {} ?@>5:B.Project {} saved. MainWindow8#40;8BL 2K1@0==K9 H03 AN65B0Remove selected plot step(s) MainWindow(038 @072O7:8Resolution steps MainWindow 57C;LB0BResult MainWindow&0AB@>9:8 S&ettings MainWindow"!>E@0&=8BL :0:... Sa&ve as... MainWindow >8&A:Sea&rch MainWindowSeries MainWindow!8BC0F8O: Situation: MainWindow$AB>G=8: :>=D;8:B0Source of conflict MainWindow AB>G=8: AB@0AB8Source of passion MainWindow( 0&745;8BL =0 :C@A>@Sp&lit at cursor MainWindow!N65B=0O ;8=8O Story line MainWindow5&@E=89 8=45:A Su&perscript MainWindow=4&5:A Subsc&ript MainWindow>4703>;>2>:Subtitle MainWindow !2>4:0Summary MainWindow!2>4:0:Summary: MainWindow\>B@0BLB5 2@5<O, GB>1K ?@84C<0BL >4=> ?@54;>65=85 (~50 A;>2) > 20H59 :=835. 0B5< 4>?>;=8B5 53> 4> 0170F0, 70B5< 4> AB@0=8FK, 0 70B5< 4> ?>;=>3> @57N<5.Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. MainWindow "5:ABText MainWindow&25B B5:AB0 Text color MainWindowBA=>2=0O A8BC0F8O, 2 2845 ''B> 5A;8 ...?'. >?@>A. @8<5@: 'B>, 5A;8 A0<0O >?0A=0O 7;>9 2>;H51=8: =5 A<>3 1K C18BL @515=:0? (0@@8 >BB5@)The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) MainWindowf$09; {} =5 ACI5AB2C5B. = 1K; ?5@5<5I5= 8;8 C40;5=?9The file {} does not exist. Has it been moved or deleted? MainWindow03>;>2>:Title MainWindow 5@52>Tree MainWindow 1J5<Volume MainWindow@: @>5:B {} =5 A>E@0=Q=.WARNING: Project {} not saved. MainWindow'B> 5A;8...? What if...? MainWindow!;>20: {}{} Words: {}{} MainWindow8@World MainWindow8A0BL.Write. MainWindowD{} =5 8<55B CAB0=>2;5==KE A;>20@59 {} has no installed dictionaries MainWindow${}{} =5 CAB0=>2;5={}{} is not installed MainWindow ?8:A5;L pxSettings%Settings&>2K9 AB8;L &New styleSettings&5G53>&NothingSettings2&>:070BL :>;8G5AB2> A;>2&Show word countSettings1.5 ;8=88 1.5 linesSettings<html><head/><body><p>A;8 2K 2:;NG8B5 MBC >?F8N, 20H ?@>5:B 1C45B A>E@0=Q= 2 >48= 548=K9 D09;. @>I5 4;O :>?8@>20=8O 8;8 @575@2=>3> A>E@0=5=8O, => =5 4>?CA:05B A>2<5AB=>3> @540:B8@>20=8O 8;8 C?@02;5=8O 25@A8O<8.<br/>5A;8 MB0 >?F8O >B:;NG5=0, 20H ?@>5:B 1C45B A>E@0=Q= :0: ?0?:0, A>45@60I0O =5A:>;L:> D09;>2.</p></body></html>

If you check this option, your project will be save as one single file. Easier to copy or backup, but does not allow collaborative editing, or versionning.
If this is unchecked, your project will be save as a folder containing many small files.

SettingsK@02=820=85 AlignmentSettingsK@02=820=85: Alignment:Settings(0AB@>9:8 ?@8;>65=8OApplication settingsSettings@8<5=8BLApplySettingsj2B><0B8G5A:0O 703@C7:0 ?>A;54=53> ?@>5:B0 ?@8 AB0@B5*Automatically load last project on startupSettings62B><0B8G5A:8 2AQ A>E@0=O5BAutomatically save everySettings$>= BackgroundSettings&25B D>=0:Background color:Settings$>=: Background:Settings&25B 3@0=8FK: Border color:Settings B<5=0CancelSettings &5=B@CenterSettings> F5=B@CCenteredSettings &25B:Color:Settings &25B0ColorsSettings !1>@:0CompileSettings&25B C3;0: Corner color:Settings 048CA C3;0:Corner radius:SettingsCtrl+SSettings C@A>@CursorSettings#40;8BLDeleteSettings"B:;NG8BL <830=85Disable blinkingSettings2>9=>9DoubleSettings 540:B8@>20BLEditSettings !5<LO:Family:Settings" 568< D>:CA8@>2:8 Focus modeSettings 0?:8FoldersSettings (@8DBFontSettings 07<5@ H@8DB0: Font size:Settings (@8DB:Font:Settings>;=K9 M:@0= FullscreenSettingsA=>2=K5GeneralSettings$A=>2=K5 =0AB@>9:8General settingsSettings&5;LGoalSettings 07<5@ :>=:8 Icon SizeSettings&25B0 8:>=>:: Icon color:Settings@A;8 =8:0:8E 87<5=5=89 2 B5G5=88If no changes duringSettings7>1@065=85:Image:Settings BABC? 1-9 ;8=88Indent 1st lineSettings=45:A :0@BK Index cardsSettings&25B0 ?@54<5B>2 Item colorsSettingsK@>2=OBLJustifySettings"!>E@0=8BL 0@80=BKeep revisionsSettings!>E@0=8BL:Keep:Settings 5B:0LabelSettings 5B>:LabelsSettings /7K:: Language:Settings !;520LeftSettings$;52>/?@02> ?>;O:Left/Right margins:Settings 8=8OLineSettings.564CAB@>G=K9 8=B5@20;: Line spacing:Settings03@C7:0LoadingSettings >;O:Margins:Settings&0:A8<0;L=0O H8@8=0 Max widthSettings.@D>3@0D8G5A:0O >H81:0: Misspelled:Settings >2K9NewSettings5B 87>1@065=8ONo ImageSettings CAB>NoneSettings 5G53>NothingSettings!B0@K9 AB&8;L Old st&yleSettings5?@>7@0G=>ABL:Opacity:Settings >=BC@OutlineSettings">G:0 7@5=8OPOVSettingsBABC?:Padding:Settings0@03@0D ParagraphSettings 0@0<5B@K 0170F0Paragraph OptionsSettings0@03@0D ParagraphsSettings@>F5=B PercentageSettings>78F8O: Position:Settings@>3@5AAProgressSettings @>?>@F8>=0;L=K9 ProportionalSettings5@570?CA: Manuskript 30@0=B8@C5B, GB> 2A5 =0AB@>9:8 2ABC?OB 2 A8;C.7Restarting Manuskript ensures all settings take effect.SettingsD>AAB0=>28BL 7=0G5=8O ?> C<>;G0=8NRestore defaultsSettings0@80=B RevisionsSettings0@80=BK - MB> A?>A>1 >BA;56820=8O 87<5=5=89. ;O :064>3> B5:AB>2>3> M;5<5=B0 >= A>E@0=O5B 2A5 87<5=5=8O, 2=5A5==K5 2 >A=>2=>9 B5:AB, GB> ?>72>;O5B ?@>A<0B@820BL 8 2>AAB0=02;820BL ?@54K4CI85 25@A88.Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions.Settings @02>RightSettings &>:070BL CA?5E8S&how progressSettings #&<=K9 AB8@0B5;L S&mart removeSettings 0?8A0BL 8 2K9B8 Save on quitSettings(0?8A0BL 2 >48= D09;Save to one single fileSettings!>E@0=5=85SavingSettings0AHB018@>20BLScaledSettings@54;>65=85SentenceSettings0AB@>9:8SettingsSettings2>:070BL &:>;8G5AB2> A;>2Show &word countSettings@>:07K20BL :>&;8G5AB2> M;5<5=B>2Show ite&m countSettings >:070BL C&A?5E8Show p&rogressSettings >:070BL @57N<&5 Show summar&ySettings>:070BL @57N<5 Show summarySettings48=>G=K9SingleSettings 07<5@:Size:Settingsp#<=K9 AB8@0B5;L - ?>72>;O5B A>E@0=8BL B>;L:> >?@545;5==>5 :>;8G5AB2> 87<5=5=89. 0AB>OB5;L=> @5:><5=4C5BAO 8A?>;L7>20BL 53>, GB>1K D09; =5 70?>;=8;AO BKAOG0<8 =57=0G8B5;L=KE 87<5=5=89.Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes.Settings 0AAB>O=85:Spacing:Settings !B0BCAStatusSettings 0ABO=CBL StretchedSettings !B8;LStyleSettings !B8;L:Style:Settings(8@8=0 2:;04>:: Tab width:Settings "5:ABTextSettings$>= B5:AB0Text BackgroundSettings 0@0<5B@K "5:AB0 Text OptionsSettings""5:AB>20O >1;0ABL Text areaSettings&25B B5:AB0: Text color:Settings$"5:AB>2K9 @540:B>@ Text editorSettings"5:AB>20O <5B:0 TextLabelSettings0720=85 B5<K: Theme name:Settings0<>AB8BLTiledSettings03;0285TitleSettings(5@E=85/86=85 ?>;O:Top/Bottom margins:Settings@>7@0G=K9 TransparentSettings 5@52>TreeSettings!8<2>;:Type:Settings* 568< ?8HCI59 <0H8=:8Typewriter modeSettings0A?>;L7C9B5 1;>: 2AB02:8Use block insertion ofSettings@>A<>B@KViewsSettings(0AB@>9:8 ?@>A<>B@>2Views settingsSettings848<K5 AB>;1FKVisible columnsSettings(8@8=0:Width:Settings$>= >:=0Window BackgroundSettings>;8G5AB2> A;>2 Word countSettings#25;8G8=>ZoomedSettings<8=CBK.minutes.SettingsJ0@80=BK 70 10 <8=CB 70 ?>A;54=89 G0A*revisions per 10 minutes for the last hourSettingsD0@80=BK 2 45=L 70 ?>A;54=89 <5AOF$revisions per day for the last monthSettingsB0@80=BK 70 G0A 70 ?>A;54=89 45=L#revisions per hour for the last daySettingsP0@80=BK 70 <8=CBC 70 ?>A;54=85 10 <8=CB,revisions per minute for the last 10 minutesSettingsN0@80=BK 70 =545;N 4> >:>=G0=8O 2@5<5=8'revisions per week till the end of timeSettingsA5:C=4K.seconds.Settings&&>1028BL 2 A;>20@L&Add to dictionary SpellActionJ&#40;8BL 87 ?>;L7>20B5;LA:>3> A;>20@O&Remove from custom dictionary SpellAction*0@80=BK ?@02>?8A0=8OSpelling Suggestions SpellAction 0=CA:@8?BAbout Manuskriptabout0=CA:@8?B ManuskriptaboutZA?>;L7C5<K5 25@A88 ?@>3@0<<=>3> >15A?5G5=8O:Software Versions in Use: aboutDialog 5@A8OVersion aboutDialog !1>@:0Compile abstractModel&5;LGoal abstractModel 5B:0Label abstractModel">G:0 7@5=8OPOV abstractModel !B0BCAStatus abstractModel03>;>2>:Title abstractModel>;8G5AB2> A;>2 Word count abstractModel:03@C605BAO ?5@52>4 A {}: {}.Loaded translation from {}: {}.app@8<5G0=85: 5@52>4G8: =5 =0945= 8 =5 703@C65= 87 {} 4;O ;>:0;8 {}.:Note: No translator found or loaded from {} for locale {}.appB?8A0=85 2 =5A:>;L:> ?@54;>65=89:Few sentences summary: basicItemView $>@<0Form basicItemView &5;L:Goal: basicItemView,?8A0=85 >4=>9 AB@>:>9One line summary basicItemView">G:0 7@5=8O:POV: basicItemView>;8G5AB2> A;>2 Word count basicItemView<ONamecharacterModel>2K9 ?5@A>=06 New charactercharacterModel=0G5=85ValuecharacterModel;02=0OMaincharacterTreeView57=0G8B5;L=K9MinorcharacterTreeViewB>@8G=K9 SecondarycharacterTreeView5@A>=068 Characters cheatSheetf$8;LB@ (22548B5 =0720=85 G53>-;81> 2 20H5< ?@>5:B5)2Filter (type the name of anything in your project) cheatSheet $>@<0Form cheatSheet;02=0OMain cheatSheet57=0G8B5;L=K9Minor cheatSheet !N65BKPlots cheatSheetB>@8G=K9 Secondary cheatSheet "5:ABKTexts cheatSheet8@World cheatSheet;02=0OMaincmbOutlineCharacterChoser57=0G8B5;L=K9MinorcmbOutlineCharacterChoserNonecmbOutlineCharacterChoserB>@8G=K9 SecondarycmbOutlineCharacterChoser 07;8G=K5VariouscmbOutlineCharacterChoser 07;8G=K5VariouscmbOutlineLabelChoser 07;8G=K5VariouscmbOutlineStatusChoser@0=5;L 8=AB@C<5=B>2 Dock WidgetsDock Widgets ToolbarcollapsibleDockWidgets $>@<0Form completer>;=>5 @57N<5 Full summary corkDelegate,?8A0=85 >4=>9 AB@>:>9One line summary corkDelegate $>@<0FormeditorWidget_ui-:A?>@BExportexporter-:A?>@B 2: Export to:exporter.#?@02;5=85 M:A?>@B5@0<8Manage exportersexporter0@5420@8B5;L=K9 ?@>A<>B@Previewexporter0@0<5B@KSettingsexporter0{} (?>:0 =5 @50;87>20=>){} (not implemented yet)exporterDialogX<html><head/><body><p>$8;LB@K, :0:85 M;5<5=BK 1C4CB 2:;NG5=K 2 >:>=G0B5;L=K9 M:A?>@B.<br/><span style=" color:#773333;">(=5 ?>;=>ABLN @50;87>20=0.)</span></p></body></html>

Filters what items will be included in the final export.
(Not fully implemented yet.)

exporterSettings0564C ?0?:0<8 8 B5:AB><:Between folder and text:exporterSettings564C ?0?:0<8:Between folders:exporterSettings0564C B5:AB>< 8 ?0?:0<8:Between text and folder:exporterSettings564C B5:AB0<8:Between texts:exporterSettings!>45@60=85ContentexporterSettings >;L7>20B5;LA:85CustomexporterSettings0>;L7>20B5;LA:85 70<5=K:Custom replacements:exporterSettingsr 5H8B5 745AL, GB> 1C45B 2:;NG5=> 2 >:>=G0B5;L=K9 M:A?>@B.6Decide here what will be included in the final export.exporterSettingsCAB0O AB@>:0 Empty lineexporterSettings:;NG5=>EnabledexporterSettings$8&;LB@KFi<ersexporterSettings 0?:0FolderexporterSettings (@8DBFontexporterSettings 07<5@ H@8DB0: Font size:exporterSettings (@8DB:Font:exporterSettings $>@<0FormexporterSettings6=5 =C6=> 1>;55 45B0;870F88I need more granularityexporterSettingsA;8 MB>B D;06>: CAB0=>2;5=, 8A?>;L7C5B @53C;O@=>5 2K@065=85 4;O 70<5=K. A;8 D;06>: A=OB, 1C45B 70<5=5= :0: >1KG=K9 B5:AB.ZIf checked, uses regular expression for replacement. If unchecked, replaced as plain text.exporterSettingsb3=>@8@>20BL AB0BCA A1>@:8 (2:;NG0O 2A5 M;5<5=BK))Ignore compile status (include all items)exporterSettings 5B:8LabelsexporterSettings0@5420@8B5;L=K9 ?@>A<>B@PreviewexporterSettings( 53C;O@=>5 2K@065=85RegExpexporterSettings:#40;8BL ?>2B>@ONI85AO ?@>15;KRemove multiple spacesexporterSettings0<5=8BLReplaceexporterSettings"0<5=8BL --- =0 Replace --- with —exporterSettings"0<5=8BL ... =0 &Replace ... with …exporterSettings>0<5=8BL 42>9=K5 :02KG:8 (") A:Replace double quotes (") with:exporterSettingsB0<5=8BL >48=0@=K5 :02KG:8 (') A:Replace single quotes (') with:exporterSettings&25B>45;5=85 SeparationsexporterSettings !B0BCAStatusexporterSettings>4M;5<5=BK: Subitems of:exporterSettings "5:ABTextexporterSettings03>;>2>:TitleexporterSettings@5>1@07>20=8OTransformationsexporterSettings"8?TypeexporterSettings."8?>3@0D8G5A:85 70<5=K:Typographic replacements:exporterSettings!WithexporterSettings${}#@>25=L {} ?0?:0{}Level {} folderexporterSettings${}#@>25=L {} B5:AB{}Level {} textexporterSettings <b>"@51C5B:</b> Requires: exportersManager.<b>!B0BCA:</b> C40;5=K.Status: uninstalled.exportersManager >;L7>20B5;LA:89CustomexportersManager#AB0=>2;5= InstalledexportersManager5 =0945=> Not foundexportersManagerP#AB0=>28BL {} ?CBL : 8A?>;=O5<><C D09;C.Set {} executable path.exportersManagerl{} =5 =0945=. #AB0=>28BL 53>, 8;8 7040BL ?CBL 2@CG=CN./{} not found. Install it, or set path manually.exportersManager'0AB>B0 FrequencyfrequencyAnalyzer $@07KPhrasesfrequencyAnalyzer !;>2>WordfrequencyAnalyzer'0AKClockfullScreenEditor,'0AK: >:070BL A5:C=4KClock: Show SecondsfullScreenEditor02830F8O NavigationfullScreenEditor>2K9 B5:ABNew TextfullScreenEditor@>3@5AAProgressfullScreenEditor<@>3@5AA: 2B> >:070BL/!:@KBLProgress: Auto Show/HidefullScreenEditor&@>25@:0 >@D>3@0D88 SpellcheckfullScreenEditorK1>@ B5<KTheme selectorfullScreenEditor "5<0:Theme:fullScreenEditor03>;>2>:TitlefullScreenEditor<0720=85: >:070BL ?>;=K9 ?CBLTitle: Show Full PathfullScreenEditor>;8G5AB2> A;>2 Word countfullScreenEditor{} A;>20{} wordsfullScreenEditor{} A;>20 / {} {} words / {}fullScreenEditorA=>2=K5GeneralgeneralSettings<<?>@B 2 ?0?:C 25@E=53> C@>2=OImport in a top-level foldergeneralSettings<?>@B ?>: Import under:generalSettings( 0745;5=85 AF5=K =0:Split scenes at:generalSettingsR1@570BL 4;8==K5 =0720=8O (> 32 A8<2>;>2)Trim long titles (> 32 chars)generalSettings\n---\ngeneralSettingsA;8 K =5 E>B8B5 <5=O 2845BL, 2K <>65B5 <5=O A?@OB0BL 2 <5=N ><>IL.8If you don't wanna see me, you can hide me in Help menu. helpLabelK15@8B5 D09; Choose fileimporterG8AB8BL D09; Clear fileimporter$>@<0B:Format:importer <?>@BImportimporter0@5420@8B5;L=K9 ?@>A<>B@Previewimporter0@0<5B@KSettingsimporterZ03@C605BAO >A;54=89 4>ABC? : :0B0;>3C "{}".$Last accessed directory "{}" loaded.lastAccessedDirectoryInfo 07;8G=K5Various lineEditView <8=CBK minuteslocker A;>20 wordslocker $>@<0Formlocker01;>:8@>20=> !Lock !locker"-:@0= 1;>:8@>2:8: Lock screen:locker&5;52K5 A;>20 Time targetlocker&5;52K5 A;>20 Word targetlocker{} >AB02H85AO {} remaininglocker{} A5:.{} s.locker&{} A;>20 >AB02H85AO{} words remaininglocker{}:{}locker ~{} G.~{} h.locker~{} <8=.~{} mn.lockerAlt+Up mainEditorF11 mainEditor $>@<0Form mainEditor@5@59B8 : @>48B5;LA:><C M;5<5=BCGo to parent item mainEditor 0@B>G:8 8=45:A0 Index cards mainEditor >=BC@Outline mainEditor>@=52>9Root mainEditor "5:ABText mainEditor{} A;>20  {} words  mainEditor{} A;>20 / {} {} words / {}  mainEditorMarkdownmarkdownSettings $>@<0Form metadataView>;=>5 @57N<5 Full summary metadataView&@8<5G0=8O / !AK;:8Notes / References metadataView,?8A0=85 >4=>9 AB@>:>9One line summary metadataView!2>9AB20 Properties metadataView7<5=5=8O Revisions metadataView !2>4:0Summary metadataView,2B><0B8G5A:8 A:@K20BL Auto-hidemyPanel&>?8@>20BL&Copy outlineBasics&#40;8BL&Delete outlineBasics&AB028BL&Paste outlineBasics&5@58<5=>20BL&Rename outlineBasics<p><b>K A>18@05B5AL C40;8BL {} M;5<5=B(K).</b></p><p>K C25@5=K?</p>D

You're about to delete {} item(s).

Are you sure?

 outlineBasics#40;5=85About to remove outlineBasicsA5 ?@54<5BK 4>;6=K 1KBL =0 B>< 65 C@>2=5 (8<5BL >4=>3> @>48B5;O).2K9New outlineBasics>2K5 &0?:8 New &Folder outlineBasics>2K9 &"5:AB New &Text outlineBasics CAB>None outlineBasics4B:@KBL {} 2 =>2>9 2:;04:5Open {} in a new tab outlineBasicsHB:@KBL {} M;5<5=BK 2 =>2KE 2:;04:0EOpen {} items in new tabs outlineBasicsD>AAB0=>28BL 7=0G5=8O ?> C<>;G0=8NRestore to default outlineBasics>@=52>9Root outlineBasicsB>@8G=K9 Secondary outlineBasicstK15@8B5 ?> :@09=59 <5@5 420 M;5<5=B0. 0?:8 83=>@8@CNBAO./Select at least two items. Folders are ignored. outlineBasicsD#AB0=>28BL >;L7>20B5;LA:CN :>=:CSet Custom Icon outlineBasics #AB0=>28BL <5B:C Set Label outlineBasics.#AB0=>28BL B>G:C 7@5=8OSet POV outlineBasics"#AB0=>28BL AB0BCA Set Status outlineBasics;02=0OMainoutlineCharacterDelegate57=0G8B5;L=K9MinoroutlineCharacterDelegate CAB>NoneoutlineCharacterDelegateB>@8G=K9 SecondaryoutlineCharacterDelegate{} A;>20{} words outlineItem${} A;>20 / {} ({}){} words / {} ({}) outlineItemB>;L7>20B5;LA:85 =0AB@>9:8 4;O {}Custom settings for {}pandocSettingsA=>2=K5GeneralpandocSettings!>45@60=85Table of ContentpandocSettings;02=0OMainpersosProxyModelB>@>AB5?5==K9MinorspersosProxyModelB>@>AB5?5==K9 SecondarypersosProxyModel81. >4AB@5:0B5;LA:>5 A>1KB851. Inciting event plotDelegate1. #AB0=>2:81. Setup plotDelegate(1. >2>@>B=K9 <><5=B1. Turning point plotDelegate2. K1>@ 2. Choice plotDelegate2. 0B0AB@>D0 2. Disaster plotDelegate2.  072>@>B 2. Reversal plotDelegate3. C;L<8=0F8O 3. Climax plotDelegate3. >=F>2:0 3. Ending plotDelegate3. AB020BL 3. Stand up plotDelegate 574=0Abyss plotDelegate >4E>4Approach plotDelegateA:C?;5=85 Atonement plotDelegate>2 ?@8:;NG5=89Call to adventure plotDelegateC;L<8=0F8OClimax plotDelegate-:A?>78F8O Exposition plotDelegate045=85Falling action plotDelegate$Freytag's ?8@0<840Freytag's pyramid plotDelegateA=>2=K5General plotDelegate"CB5H5AB285 35@>OHero's journey plotDelegate*AB@5G0 A =0AB02=8:><Meeting with mentor plotDelegate 5B 8No and plotDelegate1KG=K9 <8@Ordinary world plotDelegate@>1;5<0Problem plotDelegate@>3@5AAProgress plotDelegate15I0=85Promise plotDelegateB:07 >B 2K7>20Refusal of the call plotDelegate 07@5H5=85 Resolution plotDelegate>72@0BReturn plotDelegate(03@040 / B:@>25=85Reward / Revelation plotDelegate.018@0NI55 ?>?C;O@=>ABL Rising action plotDelegate "5ABKTests plotDelegate"@8 0:B0 Three acts plotDelegate@5>1@07>20=85Transformation plotDelegate">?KB:0 / 5C40G0 Try / Fail plotDelegate 0, =>Yes but plotDelegate;02=0OMain plotModelMeta plotModel57=0G8B5;L=K9Minor plotModel<OName plotModel>2K9 AN65BNew plot plotModel>2K9 H03New step plotModelB>@8G=K9 Secondary plotModel**!N65B:** {} **Plot:** {} plotTreeView;02=0OMain plotTreeView57=0G8B5;L=K9Minor plotTreeViewB>@8G=K9 Secondary plotTreeView;02=0OMainplotsProxyModelB>@>AB5?5==K9MinorsplotsProxyModelB>@>AB5?5==K9 SecondaryplotsProxyModel !1>@:0CompilepropertiesView $>@<0FormpropertiesView&5;LGoalpropertiesView 5B:0LabelpropertiesView">G:0 7@5=8OPOVpropertiesView !B0BCAStatuspropertiesView>;8G5AB2> A;>2 Word countpropertiesView<<b>58725AB=0O AAK;:0:</b> {}.Unknown reference: {}. references&A=>2=0O 8=D>@<0F8O Basic info references&5@A>=06: <b>{}</b>Character: {} references5@A>=068 Characters references>=D;8:BConflict references?8A0=85 Description references(>4@>1=0O 8=D>@<0F8O Detailed info references@>7@5=85Epiphany references 0?:0: <b>{}</b>Folder: {} references>9B8 2 {}. Go to {}. references&5;LGoal references 5B:0:Label: references;8==>5 @57N<5: Long summary: references>;LH>5 @57N<5Longer summary references>B820F8O Motivation references05 O2;O5BAO AAK;:>9: {}.Not a reference: {}. references@8<5G0=8O:Notes: references">G:8 7@5=8O:POV of: references">G:0 7@5=8O:POV: references#2;5G5=85Passion references CBL:Path: references !N65B: <b>{}</b>Plot: {} references!AK;:0 2:Referenced in: references(038 @5H5=8OResolution steps references 57C;LB0BResult references>@>B:>5 @57N<5 Short summary references >@>B:>5 @57N<5:Short summary: references!B0B8AB8:0:Stats: references!B0BCA:Status: references "5:AB: <b>{}</b>Text: {} references.58725AB=0O AAK;:0: {}.Unknown reference: {}. references08@: <b>{name}</b>{path}World: {name}{path} references1 45=L =0704 1 day ago revisionsG8AB8BL 2A5 Clear all revisions#40;8BLDelete revisions $>@<0Form revisions!B@>:0 {}:Line {}: revisions0@0<5B@KOptions revisions>AB0=>28BLRestore revisions.>:070BL 4@52=NN 25@A8NShow ancient version revisions$>:070BL 87<5=5=8OShow modifications revisions2>:070BL B>;L:> 87<5=5=8OShow modifications only revisions >:070BL ?@>15;K Show spaces revisions{} 4=59 =0704 {} days ago revisions{} G0A>2 =0704 {} hours ago revisions{} <8=CB =0704{} minutes ago revisions {} <5AOF52 =0704 {} months ago revisions{} A5:C=4 =0704{} seconds ago revisions{} ;5B =0704 {} years ago revisionsA5Allsearch"#G8BK20BL @538AB@Case sensitivesearch $>@<0Formsearch 5B:0Labelsearch0<5B:8Notessearch0@0<5B@K:Options:search">G:0 7@5=8OPOVsearch>8A: ?>... Search for...search>8A: 2: Search in:search !B0BCAStatussearch  57N<5Summarysearch "5:ABTextsearch03>;>2>:Titlesearch (B>;L:> GB5=85) (read-only)settingsWindow H81:0ErrorsettingsWindowL$09;K 87>1@065=89 (*.jpg *.jpeg *.png)"Image files (*.jpg; *.jpeg; *.png)settingsWindow>20O <5B:0 New labelsettingsWindow>2K9 AB0BCA New statussettingsWindow>20O B5<0 New themesettingsWindow(B:@KB>5 87>1@065=85 Open ImagesettingsWindowZ52>7<>6=> 4>1028BL 2K1@0==>5 87>1@065=85: {} Unable to add selected image: {}settingsWindowF5 C40;>AL 703@C78BL 2K1@0==K9 D09;Unable to load selected filesettingsWindow>20O B5<0newthemesettingsWindow $>@<0Form sldImportance;02=0OMain sldImportance57=0G8B5;L=K9Minor sldImportanceB>@8G=K9 Secondary sldImportance"5:AB>20O 5B:0 TextLabel sldImportance2 <p>@0745;8BL 2K1@0==K9 M;5<5=B(K) ?> 40==>9 <5B:5.</p> <p>A;8 >48= 87 2K1@0==KE M;5<5=B>2 ?0?:0, >=0 1C45B ?@8<5=OBLAO ?>A;54>20B5;L=> <i>2A5</i> C 4>G5@=8E M;5<5=B>2.</p> <p>=0: @0745;5=8O <>65B A>45@60BL A;54CNI85 C?@02;ONI85 ?>A;54>20B5;L=>AB8: <ul> <li><b><code>\n</code></b>: ;8=8O @07@K20</li> <li><b><code>\t</code></b>: B01C;OF8O</li> </ul> </p> <p><b>=0::</b></p> 

Split selected item(s) at the given mark.

If one of the selected item is a folder, it will be applied recursively to all of it's children items.

The split mark can contain following escape sequences:

  • \n: line break
  • \t: tab

Mark:

 splitDialog 0745;8BL '{}' Split '{}' splitDialog$ 0745;8BL M;5<5=BK Split items splitDialog $>@<0Form storylineView$>:070BL 5@A>=068Show Characters storylineView>:070BL !N65BK Show Plots storylineView$0:@KBL @0745;5=85 Close split tabSplitterNB:@KBL 2K1@0==K5 M;5<5=BK 2 MB>< 2845.!Open selected items in that view. tabSplitter.B@078BL ?> 3>@87>=B0;8Split horizontally tabSplitter, 0745;8BL ?> 25@B8:0;8Split vertically tabSplitter 07;8G=K5Various textEditViewCTRL+B textFormatCTRL+E textFormatCTRL+I textFormatCTRL+J textFormatCTRL+L textFormatCTRL+P textFormatCTRL+R textFormatCTRL+U textFormat $>@<0Form textFormat!25@=CBL 2A5 Collapse AlltreeView!25@=CBL {} Collapse {}treeView 0725@=CBL 2A5 Expand AlltreeView 0725@=CBL {} Expand {}treeView1welcomeJ<b>B>3>:</b> {} A;>20 (~ {} AB@0=8F)#Total: {} words (~ {} pages)welcome >1028BL C@>25=L Add levelwelcome0>1028BL :>;8G5AB2> A;>2Add word countwelcome =830Bookwelcome ;020Chapterwelcome!>740BLCreatewelcome(!>740BL =>2K9 ?@>5:BCreate New Projectwelcome05<>=AB@0F8>==K5 ?@>5:BK Demo projectswelcome CABK5Emptywelcome'8ABK9 ;8AB Empty fictionwelcome2CAB0O =0CG=0O ;8B5@0BC@0Empty non-fictionwelcome2%C4>65AB25==0O ;8B5@0BC@0Fictionwelcome:>=G0B5;L=K9Finalwelcome5@2K9 G5@=>28: First draftwelcome $>@<0Formwelcome45OIdeawelcome0=CA:@8?B Manuskriptwelcome20=CA:@8?B ?@>5:B (*.msk)Manuskript project (*.msk)welcomeP0=CA:@8?B ?@>5:B (*.msk);;A5 D09;K (*))Manuskript project (*.msk);;All files (*)welcomer A;54CNI89 @07, 02B><0B8G5A:8 >B:@K20BL ?>A;54=89 ?@>5:B*Next time, automatically open last projectwelcome"0CG=>-?>?C;O@=K5 Non-fictionwelcome0<5B:0Notewelcome  ><0=Novelwelcome>25ABLNovellawelcomeB:@KBL ?@>5:B Open projectwelcomeB:@KBL...Open...welcomeJ5@570?8A0BL ACI5AB2CNI89 ?@>5:B {} ?Overwrite existing project {} ?welcome>A;54=85RecentwelcomeAA;54>20=8OResearchwelcome0CG=0O AB0BLOResearch paperwelcome.!>E@0=8BL ?@>5:B :0:...Save project as...welcome !F5=0ScenewelcomeB>@>9 G5@=>28: Second draftwelcome  0745;Sectionwelcome >@>B:89 @0AA:07 Short Storywelcome 'B>-B> Somethingwelcome!?8A>: 45;TODOwelcome(01;>=K Templateswelcome "5:ABTextwelcome"@8;>38OTrilogywelcome=8<0=85Warningwelcome87ofwelcomeA;>2 :064K9. words each.welcome@E8B5:BC@0 Architecture worldModelAB@>=><8O Astronomy worldModel/7K: B5;0Bodily language worldModel0;5=40@LCalendar worldModel ;8<0BClimate worldModel#E06820=8O Courtship worldModelC;LBC@=K5Cultural worldModel"0<>6=OCustoms worldModel5<>3@0D8O Demography worldModel01>;520=8ODiseases worldModel ;0BLODresses worldModel1@07>20=85 Education worldModel -B8:0Ethics worldModel&40=85 <8@0 DM=B578Fantasy world building worldModel $;>@0Flora worldModel40Food worldModel5=45@=K5 @>;8 Gender roles worldModel@028B5;LAB2> Government worldModelAB>@8OHistory worldModel06=K5 >1J5:BKImportant objects worldModel06=K5 <5AB0Important places worldModel /7K:8 Languages worldModel$038G5A:0O A8AB5<0 Magic system worldModel&038G5A:85 ?@54<5BKMagical objects worldModel>;H51=K5 <5AB0Magical places worldModel038G5A:85 @0AK Magical races worldModel548F8=0Medicine worldModel>5==K5Military worldModel$C7K:0 8 8A:CAAB2>Music and arts worldModel"@8@>4=K5 @5AC@AKNatural resources worldModel>2K9 M;5<5=BNew item worldModel@30=870F8O Organization worldModel$878G5A:85Physical worldModel>;8B8:0Politics worldModel >=:8Races worldModel 5;838OReligion worldModel@028;0Rules worldModel 0C:0Science worldModel"5E=>;>38O Technology worldModel">?>3@0D8O Topography worldModel"@0=A?>@BTransportation worldModel8:0O 687=L Wild life worldModel ) , manuskript-0.10.0/i18n/manuskript_ru.ts000066400000000000000000005771001354442177200200420ustar00rootroot00000000000000 Export Basic HTML output using the Python module 'markdown'. Базовый вывод HTML с использованием Python модуля 'markdown'. Python module 'markdown'. Python модуль 'markdown'. Markdown source Markdown исходный код HTML Source HTML исходный текст HTML Output HTML результат Default exporter, provides basic formats used by other exporters. Экспортер по умолчанию, предоставляет основные форматы, используемые другими экспортерами. Preview with highlighter. Предварительный просмотр с highlighter. Plain text Обычный текст A little known format modestly used. You know, web sites for example. Мало известный формат, практически не используется. Вы знаете, для веб-сайтов на пример. Needs LaTeX to be installed. Необходим установленный редактор LaTeX. Error Ошибка Standalone document (not just a fragment) Отдельный документ (а не фрагмент) Include a table of contents. Включить оглавление. Number of sections level to include in TOC: Число уровней разделов для включения в оглавление: Typographically correct output Типографически правильный вывод Normalize the document (cleaner) Нормализовать документа (чистильщик) Specify the base level for headers: Укажите базовый уровень для заголовков: Use reference-style links instead of inline links Использовать прямые ссылку в виде ссылки, а не встроенные ссылки Use ATX-style headers Использование ATX-стиль заголовков Self-contained HTML files, with no dependencies Автономные HTML файлы, без каких-либо зависимостей Use <q> tags for quotes in HTML Используйте теги <q> для цитат в HTML LaTeX engine used to produce the PDF. LaTeX использован для создания PDF. Paper size: Размер бумаги: Font size: Размер шрифта: Class: Класс: Line spacing: Междустрочный интервал: Books that don't kill trees. Книги, которые не убивают деревья. OpenDocument format. Used by LibreOffice for example. Это Формат OpenDocument. Открывается с помощью LibreOffice. Microsoft Office (.docx) document. Документ Microsoft Office (.docx). reStructuredText is a lightweight markup language. reStructuredText это легкий язык разметки. Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. Как обычный текст, за исключением markdown заголовков. Предполагается, что тексты форматируются в markdown. Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. Простой экспорт в обычный текст. Позволяет вам использовать ваши собственные метки, не распознанные manuskript, например <a href='www.fountain.io'>Фонтан</a>. <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> <p>Универсальный конвертер документов. Может использоваться для преобразования документов в формате markdown в широкий диапазон других форматов.</p> <p>Вебсайт: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. действующая установка LaTeX. См. рекомендации pandoc на: <a href="http://pandoc.org/installing.html">http://pandoc.org/installing.html</a>. Если вам нужна поддержка юникода, вам необходим XeLaTeX. Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. Экспорт в markdown, используя pandoc. Имеет больше настроек форматирования, чем экспортер manuskript. LaTeX is a word processor and document markup language used to create beautiful documents. Latex это текстовый процессор и язык разметки документов, используемый для создания красивых документов. The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. Цель этого формата-обеспечить возможность обмена информацией между планировщиком и интернет-сервисами, которые можно просматривать или контролировать через планировщик. Disable YAML metadata block. Use that if you get YAML related error. Отключить блок метаданных YAML. Используйте это, если получаете ошибки связанные с YAML. Convert to ePUB3 Преобразовать в формат ePUB3 Could not process regular expression: {} Не удалось обработать регулярное выражение: {} Choose output file… Выберите выходной файл… ExportersManager Manage Exporters Управление экспортерами Manuskript Манускрипт Description Описание Offers export to Экспортирует в Status Статус Status: Статус: Version: Версия: Path: Путь: ... {HelpText} FrequencyAnalyzer Frequency Analyzer Анализатор частых повторений Word frequency Частота слов Settings Настройки Minimum size: Минимальный размер: Exclude words (comma separated): Исключить слова (разделенные запятой): Analyze Анализировать Phrase frequency Частота фраз Number of words: from Количество слов: от to до Import Markdown import Markdown импорт <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; <b>Информация:</b> Очень простой парсер, который пройдет по документу markdown и создаст элементы для каждого заголовка.<br/>&nbsp; Folder import Импорт папки <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> <p><b>Информация:</b> Импортирует всю структуру каталогов. Папки добавляются в виде папок, и текстовые документы в них (вы решили, какие из них по расширению) добавляются в качестве сцены.</p> <p>Поддерживаются только текстовые файлы (не изображения, двоичный или другие).</p> Include only those extensions: Включить только эти расширения: Comma separated values Значения, разделенные запятыми Sort items by name Сортировка элементов по имени Import folder then files Импорт папки потом файлов OPML Import Импорт OPML File open failed. Файл открыть не удалось. This does not appear to be a valid OPML file. Это не допустимый OPML файл. Pandoc import Импорт Pandoc <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; <b>Информация:</b> Manuskript может импортировать из <b>markdown</b> или <b>OPML</b>. Pandoc может преобразовать ваш документ в любой из них (см. ниже), и тогда он будет импортирован в manuskript. Один или другой могут дать лучший результат, в зависимости от вашего документа. <br/>&nbsp; Import using: Импортировать используя: Wrap lines: Перенос строк: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> <p>Следует ли pandoc создать косметические / не семантической разрывы?</p><p> <b>авто</b>: разрывает на 72 символе.<br> <b>нет</b>: без переноса строки.<br> <b>сохранить</b>: старается сохранить разрывы строк из исходного документа.</p> Mind Map Import Импорт Mind Map This does not appear to be a valid Mind Map file. Это не допустимый Mind Map файл. Mind Map import Импортировать Mind Map Import tip as: Советуем импортировать как: Untitled Без имени MDEditCompleter Insert reference Вставить ссылку MainWindow General Основные Title Заголовок Subtitle Подзаголовок Series Volume Объем Genre Жанр License Лицензия Author Автор Name Имя Email адрес Email Summary Сводка Situation: Ситуация: Summary: Сводка: One sentence Одно предложение One paragraph Один абзац One page Одна страница Full Все One sentence summary Описание одной фразой One paragraph summary Сводка одним абзацем Expand each sentence of your one paragraph summary to a paragraph Разверните каждое предложение вашего описания одним абзацем к абзацу One page summary Описание одной страницей Full summary Полное описание Next Следующий What if...? Что если...? Characters Персонаж Names Имя Filter Фильтр Basic info Основная информация Importance Значение Motivation Мотивация Goal Цель Conflict Конфликт Epiphany Прозрение <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="right">Одно предложение<br/>резюме</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> <html><head/><body><p align="right">Один параграф<br/>резюме</p></body></html> Notes Заметки Detailed info Подробная информация Plots Сюжеты Plot Сюжет Character(s) Персонаж Description Описание Result Результат Resolution steps Шаги развязки World Мир Populates with empty data Заполняет пустые данные More Еще Source of passion Источник страсти Source of conflict Источник конфликта Outline Схема Editor Редактор Debug Отладка FlatData Сырые Данные Persos Персонаж Labels Метки &File &Файл &Recent &Последний &Help &Помощь &Tools &Инструменты &Edit &Редактировать &View &Просмотр &Mode &Режим &Cheat sheet &Шпаргалка Sea&rch Пои&ск &Navigation &Навигация &Open &Открыть Ctrl+O &Save &Сохранить Ctrl+S Sa&ve as... Сохра&нить как... Ctrl+Shift+S &Quit &Выход Ctrl+Q &Show help texts &Показать текст подсказки Ctrl+Shift+B &Spellcheck &Проверка орфографии F9 &Labels... &Метки... &Status... &Статус... Tree Дерево &Simple &Простой &Fiction &Вымысел Index cards Индекс карты S&ettings Н&астройки F8 &Close project &Закрыть проект Co&mpile Со&брать F6 &Frequency Analyzer &Анализатор частоты повторений Book information Информация о книге &About &О программе About Manuskript О Манускрипт Manuskript Манускрипт Project {} saved. Сохранить {} проект. WARNING: Project {} not saved. ВНИМАНИЕ: Проект {} не сохранён. Project {} loaded. Проект {} загружен. Project {} loaded with some errors: Проект {} загружен некоторыми ошибками: * {} wasn't found in project file. * {} не найден в файле проекта. Project {} loaded with some errors. Проект {} загружен с некоторыми ошибками. (~{} pages) (~{} страниц) Words: {}{} Слова: {}{} Book summary Краткое содержание книги Project tree Дерево проекта Metadata Метаданные Story line Сюжетная линия Enter information about your book, and yourself. Введите информацию о своей книге и о себе. The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) Основная ситуация, в виде 'Что если ...?'. Вопрос. Пример: «Что, если самая опасная                       злой волшебник не смог бы убить ребенка? (Гарри Поттер) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Потратьте время, чтобы придумать одно предложение (~50 слов) о вашей книге. Затем дополните его до                       абзаца, затем до страницы, а затем до полного резюме. Create your characters. Создайте своих персонажей. Develop plots. Разработайте сюжет. Build worlds. Create hierarchy of broad categories down to specific details. Строить миры. Создайте иерархию общих категорий и до конкретных деталей. Create the outline of your masterpiece. Создайте план вашего шедевра. Write. Писать. Debug info. Sometimes useful. Отладочная информация. Иногда полезно. Dictionary Словарь Nothing Ничего POV Точка зрения Label Метка Progress Прогресс Compile Собрать Icon color Цвет иконки Text color Цвет текста Background color Цвет фона Icon Иконка Text Текст Background Фон Border Граница Corner Угол Add plot step Добавить шаги сюжета &Import… F7 &Copy &Копировать Ctrl+C C&ut В&ырезать Ctrl+X &Paste &Вставить Ctrl+V &Split… &Разделить… Ctrl+Shift+K Sp&lit at cursor Ра&зделить на курсор Ctrl+K Ctrl+M Ctrl+D Del Удалить &Move Up &Переместить вверх Ctrl+Shift+Up M&ove Down П&ереместить вниз Ctrl+Shift+Down Dupl&icate Дупли&каты &Delete &Удалить &Rename &Переименовать F2 Organi&ze Органи&зовать M&erge С&оединить &Format &Форматировать &Header &Заголовок &Level 1 (setext) &Уровень 1 (с текстом) Ctrl+Alt+1 Ctrl+Alt+1 Level &2 Уровень &2 Ctrl+Alt+2 Ctrl+Alt+2 Level &1 (atx) Уровень &1 (atx) Ctrl+1 Ctrl+1 L&evel 2 У&ровень 2 Ctrl+2 Ctrl+2 Level &3 Уровень &3 Ctrl+3 Ctrl+3 Level &4 Уровень &4 Ctrl+4 Ctrl+4 Level &5 Уровень &5 Ctrl+5 Ctrl+5 Level &6 Уровень &6 Ctrl+6 Ctrl+6 &Bold &Жирный Ctrl+B Ctrl+B &Italic &Курсив Ctrl+I Ctrl+I &Strike &Зачеркнутый &Verbatim &Дословный Su&perscript Ве&рхний индекс Ctrl++ Ctrl++ Subsc&ript Инд&екс Ctrl+- Ctrl+- Co&mment block Бл&ок комментариев Ctrl+Shift+C Ctrl+Shift+C Clear &formats Очистить &форматирование Ctrl+0 Ctrl+0 &Comment line(s) &Строка комментария &Ordered list &Упорядоченный список &Unordered list &Неупорядоченный список B&lockquote Бло&к цитата Remove selected plot step(s) Удалить выбранный шаг сюжета The file {} does not exist. Has it been moved or deleted? Файл {} не существует. Он был перемещен или удален? Install {}{} to use spellcheck Установите {}{}, чтобы использовать проверку орфографии {} has no installed dictionaries {} не имеет установленных словарей {}{} is not installed {}{} не установлен Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings Settings Настройки General Основные Revisions Вариант Views Просмотры Labels Меток Status Статус Fullscreen Полный экран General settings Основные настройки Application settings Настройки приложения Loading Загрузка Automatically load last project on startup Автоматическая загрузка последнего проекта при старте Saving Сохранение Automatically save every Автоматически всё сохраняет minutes. минуты. If no changes during Если никаких изменений в течении seconds. секунды. Save on project close Записать и выйти <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> <html><head/><body><p>Если вы включите эту опцию, ваш проект будет сохранён в один единый файл. Проще для копирования или резервного сохранения, но не допускает совместного редактирования или управления версиями.<br/>если эта опция отключена, ваш проект будет сохранён как папка, содержащая несколько файлов.</p></body></html> Save to one single file Записать в один файл Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. Варианты - это способ отслеживания изменений. Для каждого текстового элемента он сохраняет все изменения, внесенные в основной текст, что позволяет просматривать и восстанавливать предыдущие версии. Keep revisions Сохранить Вариант S&mart remove У&мный стиратель Keep: Сохранить: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. Умный стиратель - позволяет сохранить только определенное количество изменений. Настоятельно рекомендуется использовать его, чтобы файл не заполнился тысячами незначительных изменений. revisions per day for the last month Варианты в день за последний месяц revisions per minute for the last 10 minutes Варианты за минуту за последние 10 минут revisions per hour for the last day Варианты за час за последний день revisions per 10 minutes for the last hour Варианты за 10 минут за последний час revisions per week till the end of time Варианты за неделю до окончания времени Views settings Настройки просмотров Tree Дерево Colors Цвета Icon color: Цвета иконок: Nothing Нечего POV Точка зрения Label Метка Progress Прогресс Compile Сборка Text color: Цвет текста: Background color: Цвет фона: Folders Папки Show ite&m count Показывать ко&личество элементов Show summary Показать резюме &Nothing &Нечего Text Текст Outline Контур Visible columns Видимые столбцы Goal Цель Word count Количество слов Percentage Процент Title Заглавие Index cards Индекс карты Item colors Цвета предметов Border color: Цвет границы: Corner color: Цвет угла: Background Фон Color: Цвет: Ctrl+S Image: Изображение: Text editor Текстовый редактор Font Шрифт Family: Семья: Size: Размер: Misspelled: Орфографическая ошибка: Background: Фон: Paragraphs Параграф Line spacing: Междустрочный интервал: Single Одиночный 1.5 lines 1.5 линии Double Двойной Proportional Пропорциональный % Tab width: Ширина вкладок: px пиксель Indent 1st line Отступ 1-й линии Spacing: Расстояние: New Новый Edit Редактировать Delete Удалить Theme name: Название темы: Apply Применить Cancel Отмена Window Background Фон окна Text Background Фон текста Text Options Параметры Текста Paragraph Options Параметры абзаца Type: Символ: No Image Нет изображения Tiled Замостить Centered По центру Stretched Растянуть Scaled Масштабировать Zoomed Увеличино Opacity: Непрозрачность: Position: Позиция: Left Слева Center Центр Right Право Width: Ширина: Corner radius: Радиус угла: Margins: Поля: Padding: Отступ: Font: Шрифт: Style Стиль Cursor Курсор Use block insertion of Используйте блок вставки Alignment: Выравнивание: Justify Выровнять Alignment Выравнивание Icon Size Размер Иконки TextLabel Текстовая метка Disable blinking Отключить мигание Text area Текстовая область Max width Максимальная ширина Left/Right margins: Влево/Вправо поля: Top/Bottom margins: Верхние/Нижние поля: S&how progress П&оказать успехи Show summar&y Показать резюм&е Show p&rogress Показать у&спехи Old st&yle Старый ст&иль Transparent Прозрачный Restore defaults Восстановить значения по умолчанию Style: Стиль: Language: Язык: Font size: Размер шрифта: Restarting Manuskript ensures all settings take effect. Перезапуск Manuskript гарантирует, что все настройки вступят в силу. Show &word count Показать &количество слов &Show word count &Показать количество слов &New style &Новый стиль Typewriter mode Режим пишущей машинки Focus mode Режим фокусировки None Пусто Sentence Предложение Line Линия Paragraph Параграф <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions Варианты правописания &Add to dictionary &Добавить в словарь &Remove from custom dictionary &Удалить из пользовательского словаря about About Manuskript О Манускрипт Manuskript Манускрипт aboutDialog Version Версия Software Versions in Use: Используемые версии программного обеспечения: abstractModel Title Заголовок POV Точка зрения Label Метка Status Статус Compile Сборка Word count Количество слов Goal Цель basicItemView Form Форма POV: Точка зрения: Goal: Цель: Word count Количество слов One line summary Описание одной строкой Few sentences summary: Описание в несколько предложений: characterModel New character Новый персонаж Name Имя Value Значение characterTreeView Main Главная Secondary Вторичный Minor Незначительный cheatSheet Form Форма Filter (type the name of anything in your project) Фильтр (введите название чего-либо в вашем проекте) Minor Незначительный Secondary Вторичный Main Главная Characters Персонажи Texts Тексты Plots Сюжеты World Мир cmbOutlineCharacterChoser None Main Главная Secondary Вторичный Minor Незначительный Various Различные cmbOutlineLabelChoser Various Различные cmbOutlineStatusChoser Various Различные collapsibleDockWidgets Dock Widgets Toolbar Панель инструментов Dock Widgets completer Form Форма corkDelegate One line summary Описание одной строкой Full summary Полное резюме editorWidget_ui Form Форма exporter Export Экспорт Export to: Экспорт в: Manage exporters Управление экспортерами Preview Предварительный просмотр Settings Параметры exporterDialog {} (not implemented yet) {} (пока не реализовано) exporterSettings Form Форма Content Содержание Decide here what will be included in the final export. Решите здесь, что будет включено в окончательный экспорт. Type Тип Title Заголовок Text Текст I need more granularity Мне нужно более детализации Fi&lters Фи&льтры <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> <html><head/><body><p>Фильтры, какие элементы будут включены в окончательный экспорт.<br/><span style=" color:#773333;">(не полностью реализована.)</span></p></body></html> Ignore compile status (include all items) Игнорировать статус сборки (включая все элементы) Subitems of: Подэлементы: Labels Метки Status Статус Separations Цветоделение Between folders: Между папками: Empty line Пустая строка Custom Пользовательские Between texts: Между текстами: Between folder and text: Между папками и текстом: Between text and folder: Между текстом и папками: Transformations Преобразования Typographic replacements: Типографические замены: Replace double quotes (") with: Заменить двойные кавычки (") с: Replace single quotes (') with: Заменить одинарные кавычки (') с: Remove multiple spaces Удалить повторяющиеся пробелы Custom replacements: Пользовательские замены: Enabled Включено Replace Заменить With С RegExp Регулярное выражение If checked, uses regular expression for replacement. If unchecked, replaced as plain text. Если этот флажок установлен, использует регулярное выражение для замены. Если флажок снят, будет заменен как обычный текст. Preview Предварительный просмотр Font Шрифт Font: Шрифт: Font size: Размер шрифта: Folder Папка {}Level {} folder {}Уровень {} папка {}Level {} text {}Уровень {} текст Replace ... with … Заменить ... на … Replace --- with — Заменить --- на — exportersManager Installed Установлен Custom Пользовательский Not found Не найдено {} not found. Install it, or set path manually. {} не найден. Установить его, или задать путь вручную. <b>Status:</b> uninstalled. <b>Статус:</b> удалены. <b>Requires:</b> <b>Требует:</b> Set {} executable path. Установить {} путь к исполняемому файлу. frequencyAnalyzer Phrases Фразы Frequency Частота Word Слово fullScreenEditor Theme: Тема: {} words / {} {} слова / {} {} words {} слова Spellcheck Проверка орфографии Navigation Навигация New Text Новый текст Title Заголовок Title: Show Full Path Название: Показать полный путь Theme selector Выбор темы Word count Количество слов Progress Прогресс Progress: Auto Show/Hide Прогресс: Авто Показать/Скрыть Clock Часы Clock: Show Seconds Часы: Показать секунды generalSettings General Основные Split scenes at: Разделение сцены на: \n---\n Trim long titles (> 32 chars) Обрезать длинные названия (> 32 символов) Import under: Импорт по: Import in a top-level folder Импорт в папку верхнего уровня helpLabel If you don't wanna see me, you can hide me in Help menu. Если Вы не хотите меня видеть, вы можете меня спрятать в меню Помощь. importer Import Импорт Format: Формат: Choose file Выберите файл Clear file Очистить файл Preview Предварительный просмотр Settings Параметры lastAccessedDirectoryInfo Last accessed directory "{}" loaded. Загружается Последний доступ к каталогу "{}". lineEditView Various Различные locker Form Форма Lock screen: Экран блокировки: Word target Целевые слова Time target Целевые слова words слова minutes минуты Lock ! Заблокировано ! ~{} h. ~{} ч. ~{} mn. ~{} мин. {}:{} {} s. {} сек. {} remaining {} оставшиеся {} words remaining {} слова оставшиеся mainEditor Form Форма Text Текст Index cards Карточки индекса Outline Контур F11 Go to parent item Перейти к родительскому элементу Alt+Up Root Корневой {} words / {} {} слова / {} {} words {} слова markdownSettings Markdown metadataView Form Форма Properties Свойства Summary Сводка One line summary Описание одной строкой Full summary Полное резюме Notes / References Примечания / Ссылки Revisions Изменения myPanel Auto-hide Автоматически скрывать outlineBasics Set POV Установить точку зрения None Пусто Set Status Установить статус Set Label Установить метку New Новый Main Главная Secondary Вторичный Minor Незначительный Set Custom Icon Установить Пользовательскую Иконку Restore to default Восстановить значения по умолчанию Root Корневой Open {} items in new tabs Открыть {} элементы в новых вкладках Open {} in a new tab Открыть {} в новой вкладке About to remove Удаление <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> <p><b>Вы собираетесь удалить {} элемент(ы).</b></p><p>Вы уверены?</p> Select at least two items. Folders are ignored. Выберите по крайней мере два элемента. Папки игнорируются. All items must be on the same level (share the same parent). Все предметы должны быть на том же уровне (иметь одного родителя). New &Folder Новые &Папки New &Text Новый &Текст &Copy &Копировать C&ut В&ырезать &Paste &Вставить &Rename &Переименовать &Delete &Удалить outlineCharacterDelegate None Пусто Main Главная Secondary Вторичный Minor Незначительный outlineItem {} words / {} ({}) {} слова / {} ({}) {} words {} слова pandocSettings General Основные Table of Content Содержание Custom settings for {} Пользовательские настройки для {} persosProxyModel Main Главная Secondary Второстепенный Minors Второстепенный plotDelegate General Основные Promise Обещание Problem Проблема Progress Прогресс Resolution Разрешение Try / Fail Попытка / Неудача No and Нет и Yes but Да, но Freytag's pyramid Freytag's пирамида Exposition Экспозиция Rising action Набирающее популярность Climax Кульминация Falling action Падение Three acts Три акта 1. Setup 1. Установки 1. Inciting event 1. Подстрекательское событие 1. Turning point 1. Поворотный момент 2. Choice 2. Выбор 2. Reversal 2. Разворот 2. Disaster 2. Катастрофа 3. Stand up 3. Вставать 3. Climax 3. Кульминация 3. Ending 3. Концовка Hero's journey Путешествие героя Ordinary world Обычный мир Call to adventure Зов приключений Refusal of the call Отказ от вызова Meeting with mentor Встреча с наставником Tests Тесты Approach Подход Abyss Бездна Reward / Revelation Награда / Откровение Transformation Преобразование Atonement Искупление Return Возврат plotModel New plot Новый сюжет Name Имя Meta New step Новый шаг Main Главная Secondary Вторичный Minor Незначительный plotTreeView Main Главная Secondary Вторичный Minor Незначительный **Plot:** {} **Сюжет:** {} plotsProxyModel Main Главная Secondary Второстепенный Minors Второстепенный propertiesView Form Форма POV Точка зрения Status Статус Label Метка Compile Сборка Goal Цель Word count Количество слов references Not a reference: {}. Не является ссылкой: {}. Unknown reference: {}. Неизвестная ссылка: {}. Path: Путь: Stats: Статистика: POV: Точка зрения: Status: Статус: Label: Метка: Short summary: Короткое резюме: Long summary: Длинное резюме: Notes: Примечания: Basic info Основная информация Detailed info Подробная информация POV of: Точки зрения: Go to {}. Пойти в {}. Description Описание Result Результат Characters Персонажи Resolution steps Шаги решения Passion Увлечение Conflict Конфликт <b>Unknown reference:</b> {}. <b>Неизвестная ссылка:</b> {}. Folder: <b>{}</b> Папка: <b>{}</b> Text: <b>{}</b> Текст: <b>{}</b> Character: <b>{}</b> Персонаж: <b>{}</b> Plot: <b>{}</b> Сюжет: <b>{}</b> World: <b>{name}</b>{path} Мир: <b>{name}</b>{path} Referenced in: Ссылка в: Motivation Мотивация Goal Цель Epiphany Прозрение Short summary Короткое резюме Longer summary Большое резюме revisions Form Форма Options Параметры Restore Востановить Delete Удалить Show modifications Показать изменения Show ancient version Показать древнюю версию Show spaces Показать пробелы Show modifications only Показать только изменения {} years ago {} лет назад {} months ago {} месяцев назад {} days ago {} дней назад 1 day ago 1 день назад {} hours ago {} часов назад {} minutes ago {} минут назад {} seconds ago {} секунд назад Line {}: Строка {}: Clear all Очистить все search Form Форма Search for... Поиск по... Search in: Поиск в: All Все Title Заголовок Text Текст Summary Резюме Notes Заметки POV Точка зрения Status Статус Label Метка Options: Параметры: Case sensitive Учитывать регистр settingsWindow New status Новый статус New label Новая метка newtheme Новая тема New theme Новая тема (read-only) (только чтение) Open Image Открытое изображение Image files (*.jpg; *.jpeg; *.png) Файлы изображений (*.jpg *.jpeg *.png) Error Ошибка Unable to load selected file Не удалось загрузить выбранный файл Unable to add selected image: {} Невозможно добавить выбранное изображение: {} sldImportance Form Форма TextLabel Текстовая Метка Minor Незначительный Secondary Вторичный Main Главная splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> <p>разделить выбранный элемент(ы) по данной метке.</p> <p>Если один из выбранных элементов папка, она будет применяться последовательно <i>все</i> у дочерних элементов.</p> <p>Знак разделения может содержать следующие управляющие последовательности: <ul> <li><b><code>\n</code></b>: линия разрыва</li> <li><b><code>\t</code></b>: табуляция</li> </ul> </p> <p><b>Знак:</b></p> Split '{}' Разделить '{}' Split items Разделить элементы storylineView Form Форма Show Plots Показать Сюжеты Show Characters Показать Персонажи tabSplitter Open selected items in that view. Открыть выбранные элементы в этом виде. Split horizontally Отразить по горизонтали Close split Закрыть разделение Split vertically Разделить по вертикали textEditView Various Различные textFormat Form Форма CTRL+B CTRL+I CTRL+U CTRL+P CTRL+L CTRL+E CTRL+R CTRL+J treeView Expand {} Развернуть {} Collapse {} Свернуть {} Expand All Развернуть все Collapse All Свернуть все welcome Form Форма 1 Templates Шаблоны Empty Пустые Novel Роман Novella Повесть Short Story Короткий рассказ Research paper Научная статья Demo projects Демонстрационные проекты Add level Добавить уровень Add word count Добавить количество слов Next time, automatically open last project В следующий раз, автоматически открывать последний проект Open... Открыть... Recent Последние Create Создать Open project Открыть проект Manuskript project (*.msk);;All files (*) Манускрипт проект (*.msk);;Все файлы (*) Save project as... Сохранить проект как... Manuskript project (*.msk) Манускрипт проект (*.msk) Manuskript Манускрипт Create New Project Создать новый проект Warning Внимание Overwrite existing project {} ? Перезаписать существующий проект {} ? Empty fiction Чистый лист Chapter Глава Scene Сцена Trilogy Трилогия Book Книга Section Раздел Empty non-fiction Пустая научная литература words each. слов каждый. of из Text Текст Something Что-то <b>Total:</b> {} words (~ {} pages) <b>Итого:</b> {} слова (~ {} страниц) Fiction Художественная литература Non-fiction Научно-популярные Idea Идея Note Заметка Research Исследования TODO Список дел First draft Первый черновик Second draft Второй черновик Final Окончательный worldModel New item Новый элемент Fantasy world building Здание мира фэнтези Physical Физические Climate Климат Topography Топография Astronomy Астрономия Wild life Дикая жизнь Flora Флора History История Races Гонки Diseases Заболевания Cultural Культурные Customs Таможня Food Еда Languages Языки Education Образование Dresses Платья Science Наука Calendar Календарь Bodily language Язык тела Ethics Этика Religion Религия Government Правительство Politics Политика Gender roles Гендерные роли Music and arts Музыка и искусство Architecture Архитектура Military Военные Technology Технология Courtship Ухаживания Demography Демография Transportation Транспорт Medicine Медицина Magic system Магическая система Rules Правила Organization Организация Magical objects Магические предметы Magical places Волшебные места Magical races Магические расы Important places Важные места Important objects Важные объекты Natural resources Природные ресурсы manuskript-0.10.0/i18n/manuskript_sv.qm000066400000000000000000002204441354442177200200270ustar00rootroot00000000000000LUTTVEvVEVE=VEfVsdXiOdd`V,cHe~ -Jl*y:]*y*:*%;B*0;+E,+?.3)0-93qC;A[G:GɓHw9jJKL7NLGLbLbSM|M6 MezpMezIMŅQNWQ:t,RxRRxt\RxRx9Rx TbzTbRTbTbgTb&TbTblTbTTUjU<Uj8UlV':VVځW6XW6XyX|YE;YYȀǑZZ%Zʳ)Zϳ[B[ %c[ %~[ %0[ %][ %.[ %[ٵ8\q\\\^i$e ^i$(gUnR67^-s 5er(aYyBwrErUo*f@~T{g.Aa\DB0D"sj\- NEP2viMt}HL36ϠݰByʯslFC8kwn _Y|^;B]gq-hz~hqP5u9=OYPDf3?##;ҳP.F=S2M[>#ݍN~L0W>G1v`3tcML#UAIVWu]1} p^Vi@6t,RWph.YZ.k.¼(^N0ʶ'&)(3JG'.[!dȳƩ"x&n@0JAEJFN^:_aN|lwp<l.ڳmNq0W-rwbUp9$nnnn8niooormzTbBDIlZmjjՈʢ6Zm{6mGUV*HtHHII8IiInK6Kg,n,hbn]U]Gt5%ol7S bMĚGnStvD9:Pu*Nm:6/Cs>\!z?Sd}rMv\!&$'#'3R'3t'3+5!5@VƼ@V HuQhD̊VjٝW8j$jejUxjwlcX8lqsgo}T}Z }ZuTT34[4۝> 6G}~"\JN%|jyԧJÊÙT]t8j?E&<5cߺ ~eNYu 9}*0t` qotcT~%Ē,&t/t0x9$Cs[eCsVCqJCLtM+GM+nR!|TunD`xl^m?$mHmamQmbmm na#pd'rz Ozw|{~~pa~,$MZ]dCRHa.dDžza0W0w0M֣֝cs[:H1 wZr  2;r!vCSa4N/ Iǹ#t)H20e1?/1~\%G4@Nl;rJ8MrfySЂCqϗϗDϗ4P@}Ew=xS` pL׼°^ÈvS[%У  sx|GSs!j,NV3 7~Bn8BLHAE MP[5j]*l"bhf~2Fn~2~21Z ZuNڬͯa](xNSnT^f>?c~<1'Lʶ9˙sDNvykb . 4 σ F>Q HZ +4 ?:E MgO MgLv Mg֥ T ^Y0 ^yD ^ ^D g:X r,| z  B - \i %]  Ux UT շ0 z C H zy # ?@O 08 3 9sR 9ss 9s >c^ A^n Rb`S Zp dpeF dpem dpe) dpeә d) d) d) d) d)ġ d) d)ѥ d)Ҡ d)X d)$ e n*P o"` }(v T B;# f *# X : :ܲ ,: , 8^[ 8b 8w ʶN U~ N  Q 9MU J ; #e Q8 U~2 ]Y@ l m^V s3c }j! %~ . 7 t= H= H  f\ 5  8 ^  G> L ڔ3J u 5 YM _ c iC ӨSW y W1  C R / 1U 4 ; Cj^ G Nr Z$mD b@ i?[ pkS rIj }2 !T o  j   Y o ) ޔ  x$1 m  3 s, c ` 'jC T $ $S $E $w n^ ,X %6y #[ s" s~Q s s ɠ Cyy u> ș : l QN  } z  . zZn ج  4}" 5N \ 87>D DYI DYJ` DZJ J K- bp i8:q W P .7 S  ( x ^t ) 0j Ğt: <QY <q <$ < <˹ a7 ⋙U eO 4 uY2#2)F+6eD^9VF<+gHZIOqUhUWGj!Q$I0G$Mjllkj̺nI KYg S; =Qz>VBxS3QyzR_CR_Ջd@fqpt4|oNH~`~`"|"|c]Ni:tti:<Pi5ic<p>Universellt konverteringsverktyg fr dokument. Kan anvndas fr att konvertera markdown till mnga olika format.</p> <p>Websida: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> 

A universal document converter. Can be used to convert markdown to a wide range of other formats.

Website: http://pandoc.org/

ExportEtt relativt oknt format som anvnds blygsamt, t.ex. p websidor.EA little known format modestly used. You know, web sites for example.ExportpGrundlggande HTML-export via python-modulen 'markdown'.5Basic HTML output using the Python module 'markdown'.Export8Bcker som inte mrdar trd.Books that don't kill trees.Export Klass:Class:Export*Konvertera till ePUB3Convert to ePUB3ExportStandardexportr. Erbjuder grundlggande format som andra exportrer anvnder.ADefault exporter, provides basic formats used by other exporters.ExportAvaktivera YAML metadata block. Anvnd detta om du fr ett felmeddelande angende YAML.DDisable YAML metadata block. Use that if you get YAML related error.ExportFelErrorExport Exportera till markdown via pandoc. Ger std fr fler formateringsmjligheter jmfrt med den grundlggande Manuskript-exportren.hExport to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter.ExportTeckenstorlek: Font size:ExportHTML-utdata HTML OutputExportHTML-kllkod HTML SourceExport>Inkludera innehllsfrteckning.Include a table of contents.ExportRen text med markdown-titlar Frutstter att texterna har formaterats i markdown.Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown.ExportjLaTeX-motor som anvnds fr att skapa PDF-dokumentet.%LaTeX engine used to produce the PDF.Export LaTeX r ett markupsprk fr ordbehandlare och dokument som anvnds fr att skapa vackra dokument.LaTeX is a word processor and document markup language used to create beautiful documents.ExportRadavstnd: Line spacing:Export Markdown-kllkodMarkdown sourceExportDMicrosoft Office (.docx)-dokument."Microsoft Office (.docx) document.Export@Krver att LaTex r installerat.Needs LaTeX to be installed.Export>Normalisera dokumentet (renare) Normalize the document (cleaner)ExportAntal av sektionsniver fr inkludering i innehllsfrteckningen: ,Number of sections level to include in TOC: ExportdOpenDocument-format. Anvnds t.ex. av LibreOffice.5OpenDocument format. Used by LibreOffice for example.ExportPappersstorlek: Paper size:ExportRen text Plain textExportBFrhandsgranskning med mrkpenna.Preview with highlighter.Export4python-modulen 'markdown'.Python module 'markdown'.ExportTFristende HTML-filer utan andra beroenden/Self-contained HTML files, with no dependenciesExportNEnkel export till ren text. Lter dig anvnda egna markup-format som annars inte frsts av Manuskript, t.ex. <a href='www.fountain.io'>Fountain</a>.Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example Fountain.Export6Vlj rotniv fr rubriker: $Specify the base level for headers: ExportXFristende dokument (inte bara ett fragment))Standalone document (not just a fragment)ExportvDetta format erbjuder en metod fr informationsutbyte mellan outliners och internettjnster som kan visas eller kontrolleras via en outliner.The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner.Export6Typografiskt korrekt utdataTypographically correct outputExportDAnvnd <q>-taggar fr citat i HTMLUse tags for quotes in HTMLExport&Anvnd ATX-rubrikerUse ATX-style headersExportfAnvnd referenslnkar i stllet fr infogade lnkar1Use reference-style links instead of inline linksExporten giltig LaTex-installation. Se vad pandoc rekommenderar p: <a href="http://pandoc.org/installing.html">http://pandoc.org/installing.html</a>. Vill du ha std fr unicode behver du xelatex.a valid LaTeX installation. Pandoc recommendations can be found on: pandoc.org/installing.html. If you want Unicode support, you need XeLaTeX.Export`reStructuredText r ett lttvikts-markupsprk...2reStructuredText is a lightweight markup language.Export......ExportersManagerBeskrivning DescriptionExportersManager$Hantera ExportrerManage ExportersExportersManagerManuskript ManuskriptExportersManager$Kan exportera tillOffers export toExportersManagerSkvg:Path:ExportersManager StatusStatusExportersManagerStatus:Status:ExportersManagerVersion:Version:ExportersManager{HelpText} {HelpText}ExportersManagerAnalyseraAnalyzeFrequencyAnalyzerBExkludera ord (komma-separerade): Exclude words (comma separated):FrequencyAnalyzerFrekvensanalysFrequency AnalyzerFrequencyAnalyzerMinsta storlek: Minimum size:FrequencyAnalyzerAntal ord: frnNumber of words: fromFrequencyAnalyzerFrasfrekvensPhrase frequencyFrequencyAnalyzerInstllningarSettingsFrequencyAnalyzerOrdfrekvensWord frequencyFrequencyAnalyzertilltoFrequencyAnalyzer\<b>Info:</b> En vldigt enkel tolk som kommer att g genom ett Markdown-dokument och skapar objekt fr varje titel.<br/>&nbsp;Info: A very simple parser that will go through a markdown document and create items for each titles.
 Import<b>Info:</b> Manuskript kan importera frn <b>markdown</b> eller <b>OPML</b>. Pandoc kommer att konvertera ditt dokument till endera (se alterntiv nedan), och sedan kommer det att importeras i manuskript. Endera kan ge bttre resultat beroende p ditt dokument. <br/>&nbsp;}Info: Manuskript can import from markdown or OPML. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document.
 Import<p><b>Info:</b> Importerar en hel katalogstruktur. Mappar lggs till som mappar, och vanliga textdokument inuti (du vljer vilka efter filndelse) lggs till som scener.</p> <p>Endast textfiler stds (inte bilder, binrer eller annat).</p>R

Info: Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.

Only text files are supported (not images, binary or others).

Import<p>Ska pandoc skapa kosmetiska / icke-semantiska radbrytningar?</p><p> <b>auto</b>: radbryter efter 72 tecken.<br> <b>none</b>: inga radbrytningar.<br> <b>preserve</b>: frsker att bevara radbrytningar frn originaldokumentet.</p>Q

Should pandoc create cosmetic / non-semantic line-breaks?

auto: wraps at 72 characters.
none: no line wrap.
preserve: tries to preserves line wrap from the original document.

Import*KommasepareradevrdenComma separated valuesImport>Misslyckades med att ppna fil.File open failed.Import Import av mappar Folder importImport<Importera mapp och sedan filerImport folder then filesImport&Importera tips som:Import tip as:ImportImportera via: Import using:ImportJInkludera endast dessa filndelserna:Include only those extensions:Import$Import av MarkdownMarkdown importImport$Import av Mind MapMind Map ImportImportMind Map-importMind Map importImportOPML-import OPML ImportImportPandoc-import Pandoc importImport2Sortera objekt efter namnSort items by nameImport\Detta verkar inte vara en giltig Mind Map-fil.1This does not appear to be a valid Mind Map file.ImportTDetta verkar inte vara en giltig OPML-fil.-This does not appear to be a valid OPML file.ImportNamnlsUntitledImportRadbryt rader: Wrap lines:ImportInfoga referensInsert referenceMDEditCompleter (~{} sidor) (~{} pages) MainWindowF * {} hittades inte i projektfilen.# * {} wasn't found in project file. MainWindow&Om&About MainWindow&Fusklapp &Cheat sheet MainWindowS&tng projekt&Close project MainWindow&Kopiera&Copy MainWindow&Ta bort&Delete MainWindow&Redigera&Edit MainWindow&Sknlitteratur&Fiction MainWindow &Arkiv&File MainWindow&Frekvensanalys&Frequency Analyzer MainWindow &Hjlp&Help MainWindow&Importera & &Import… MainWindow&Etiketter... &Labels... MainWindow &Lge&Mode MainWindow&Flytta upp&Move Up MainWindow&Navigation &Navigation MainWindow &ppna&Open MainWindow&Klistra in&Paste MainWindow&Avsluta&Quit MainWindowS&enaste&Recent MainWindow&Byt namn&Rename MainWindow &Spara&Save MainWindow"&Visa hjlptexter&Show help texts MainWindow&Enkelt&Simple MainWindow$&Stavningskontroll &Spellcheck MainWindow &Dela & &Split… MainWindow&Status... &Status... MainWindow&Verktyg&Tools MainWindow &Visa&View MainWindow<html><head/><body><p align="right">Sammanfattning i ett<br/>stycke</p></body></html>O

One paragraph
summary

 MainWindow<html><head/><body><p align="right">Sammanfattning i en<br/>mening</p></body></html>N

One sentence
summary

 MainWindowOm ManuskriptAbout Manuskript MainWindowZLgg till nytt steg i handlingen (CTRL+Enter) Add plot step MainWindowFrfattareAuthor MainWindowBakgrund Background MainWindowBakgrundsfrgBackground color MainWindow$Grundlggande info Basic info MainWindow(Information om bokenBook information MainWindow.Sammanfattning av boken Book summary MainWindowKantBorder MainWindowUtforma vrldar. Skapa en hierarki av generella kategorier ned till minsta detalj.MBuild worlds. Create hierarchy of broad categories down to specific details. MainWindowK&lipp utC&ut MainWindowKaraktr(er) Character(s) MainWindowKaraktrer Characters MainWindowKo&mpileraCo&mpile MainWindowKompileraCompile MainWindowKonfliktConflict MainWindowHrnCorner MainWindowJSkapa ett utkast fr ditt msterverk.'Create the outline of your masterpiece. MainWindow,Skapa dina karaktrer.Create your characters. MainWindow Ctrl+CCtrl+C MainWindow Ctrl+DCtrl+D MainWindow Ctrl+KCtrl+K MainWindow Ctrl+MCtrl+M MainWindow Ctrl+OCtrl+O MainWindow Ctrl+QCtrl+Q MainWindow Ctrl+SCtrl+S MainWindowCtrl+Shift+B Ctrl+Shift+B MainWindow$Ctrl+Shift+Pil nedCtrl+Shift+Down MainWindowCtrl+Shift+K Ctrl+Shift+K MainWindowCtrl+Shift+S Ctrl+Shift+S MainWindow$Ctrl+Shift+Pil upp Ctrl+Shift+Up MainWindow Ctrl+VCtrl+V MainWindow Ctrl+XCtrl+X MainWindow DebugDebug MainWindowLDebug-information. Kan vara anvndbar.Debug info. Sometimes useful. MainWindowDelDel MainWindowBeskrivning Description MainWindowDetaljerad info Detailed info MainWindow(Utveckla handlingen.Develop plots. MainWindow Ordbok Dictionary MainWindowDupl&icera Dupl&icate MainWindowRedigerareEditor MainWindow E-mailEmail MainWindowVSkriv information om din bok och dig sjlv.0Enter information about your book, and yourself. MainWindowUppenbarelseEpiphany MainWindowHUtvidga varje mening till ett styckeAExpand each sentence of your one paragraph summary to a paragraph MainWindowF2F2 MainWindowF6F6 MainWindowF7F7 MainWindowF8F8 MainWindowF9F9 MainWindow FilterFilter MainWindowFlatDataFlatData MainWindowFullFull MainWindow&Full sammanfattning Full summary MainWindowAllmntGeneral MainWindow GenreGenre MainWindowMlGoal MainWindowIkonIcon MainWindowIkonfrg Icon color MainWindowSignifikans Importance MainWindowRegisterkort Index cards MainWindowEtikettLabel MainWindowEtiketterLabels MainWindow LicensLicense MainWindowSa&mmanfogaM&erge MainWindowFl&ytta ned M&ove Down MainWindowManuskript Manuskript MainWindowMetadataMetadata MainWindowMerMore MainWindowMotivation Motivation MainWindowNamnName MainWindowNamnNames MainWindow NstaNext MainWindowAnteckningarNotes MainWindowIngentingNothing MainWindowEn sidaOne page MainWindow2Sammanfattning p en sidaOne page summary MainWindowEtt stycke One paragraph MainWindow6Sammanfattning i ett styckeOne paragraph summary MainWindowEn mening One sentence MainWindow4Sammanfattning i en meningOne sentence summary MainWindowOrgani&sera Organi&ze MainWindow UtkastOutline MainWindowSynvinkelPOV MainWindow PersosPersos MainWindowHandlingPlot MainWindowHandlingarPlots MainWindow$Fylls med tom dataPopulates with empty data MainWindowFramstegProgress MainWindowProjekttrd Project tree MainWindowDProjekt {} laddades med vissa fel.#Project {} loaded with some errors. MainWindowDProjekt {} laddades med vissa fel:#Project {} loaded with some errors: MainWindow(Projekt {} laddades.Project {} loaded. MainWindow(Projekt {} sparades.Project {} saved. MainWindowLsningsstegResolution steps MainWindowResultatResult MainWindowI&nstllningar S&ettings MainWindowSpara s&om... Sa&ve as... MainWindowS&kSea&rch MainWindow SerieSeries MainWindowSituation: Situation: MainWindowKonfliktkllaSource of conflict MainWindowPassionskllaSource of passion MainWindow De&la vid markrSp&lit at cursor MainWindowHandling Story line MainWindowUndertitelSubtitle MainWindowSammanfattningSummary MainWindowSammanfattning:Summary: MainWindowRTnk ut en kort (ca. 50 ord) mening som sammanfattar din bok. Utveckla den sedan till ett stycke, till en sida och sist till en full sammanfattning.Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. MainWindowTextText MainWindowTextfrg Text color MainWindowzDen grundlggande situationen i form av en "Tnk om...?"-mening. Exempel: 'Tnk om vrldens farligaste onda trollkarl misslyckades med att dda en baby?' (Harry Potter)The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) MainWindow TitelTitle MainWindowTrdTree MainWindow VolymVolume MainWindow@VARNING: Projekt {} sparades ej.WARNING: Project {} not saved. MainWindowTnk om...? What if...? MainWindowOrd: {}{} Words: {}{} MainWindow VrldWorld MainWindow Skriv.Write. MainWindow pixlar pxSettings%%SettingsI&ngenting&NothingSettings1.5 rader 1.5 linesSettingsn<html><head/><body><p>Markeras detta alternativ sparas ditt projekt som en samlad fil. Detta gr det lttare att ta en backup eller gra en kopia, men tillter inte gemensam redigering eller versionshantering.<br/>Markeras alternativet inte sparas ditt projekt som en mapp med mnga sm filer.</p></body></html>

If you check this option, your project will be save as one single file. Easier to copy or backup, but does not allow collaborative editing, or versionning.
If this is unchecked, your project will be save as a folder containing many small files.

SettingsJustering AlignmentSettingsJustering: Alignment:Settings.Applikationens utseendeApplication settingsSettings AnvndApplySettings\Ladda automatiskt senaste projekt vid uppstart*Automatically load last project on startupSettings*Spara automatiskt varAutomatically save everySettingsBakgrund BackgroundSettingsBakgrundsfrg:Background color:SettingsBakgrund: Background:SettingsKantfrg: Border color:Settings AvbrytCancelSettingsCentreraCenterSettingsCentreradCenteredSettings Frg:Color:Settings FrgerColorsSettingsKompileraCompileSettingsHrnfrg: Corner color:SettingsHrnradie:Corner radius:Settings Ctrl+SCtrl+SSettings MarkrCursorSettingsTa bortDeleteSettings(Avaktivera blinkningDisable blinkingSettingsDubbeltDoubleSettingsRedigeraEditSettingsFamilj:Family:Settings MapparFoldersSettingsTypsnittFontSettingsTeckenstorlek: Font size:SettingsTypsnitt:Font:SettingsFullskrm FullscreenSettingsAllmntGeneralSettings,Allmnna instllningarGeneral settingsSettingsMlGoalSettings"Storlek p ikoner Icon SizeSettingsIkonfrg: Icon color:Settings.Om inget har ndrats pIf no changes duringSettings Bild:Image:SettingsIndrag p rad 1Indent 1st lineSettingsRegisterkort Index cardsSettingsObjektfrger Item colorsSettingsJusteradJustifySettings2Aktivera ndringshistorikKeep revisionsSettingsBehll:Keep:SettingsEtikettLabelSettingsEtiketterLabelsSettingsVnsterLeftSettings4Vnster-/Hger-marginaler:Left/Right margins:SettingsRadavstnd: Line spacing:SettingsUppstartLoadingSettingsMarginaler:Margins:SettingsMaximal bredd Max widthSettingsFelstavat: Misspelled:SettingsNyNewSettingsIngen bildNo ImageSettings IngenNoneSettingsIngentingNothingSettingsGammal &stil Old st&yleSettingsOpacitet:Opacity:Settings UtkastOutlineSettingsSynvinkelPOVSettingsUtfyllnad:Padding:Settings(StyckesinstllningarParagraph OptionsSettings Stycke ParagraphsSettingsProcent PercentageSettingsPosition: Position:SettingsFramstegProgressSettingsProportionellt ProportionalSettings0terstll standardvrdenRestore defaultsSettings ndringshistorik RevisionsSettings\ndringshistorik lter dig flja dina ndringar. Fr varje textobjekt sparas ndringar som du har gjort vilket ger dig mjlighet till att se och terskapa tidigare versioner.Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions.Settings HgerRightSettingsVisa &framstegS&how progressSettings$S&mart borttagning S&mart removeSettings Spara vid avslut Save on quitSettings*Spara i en samlad filSave to one single fileSettingsSparandeSavingSettings SkaladScaledSettingsInstllningarSettingsSettings$Visa antal obje&ktShow ite&m countSettingsVisa fram&stegShow p&rogressSettings(Visa samman&fattning Show summar&ySettings&Visa sammanfattning Show summarySettings EnkeltSingleSettingsTeckenstorlek:Size:SettingsLSmart borttagning lter dig behlla ett visst antal ndringar. Du rekommenderas att anvnda den fr att undvika att din fil fylls med tusentals av oviktiga ndringar.Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes.SettingsAvstnd:Spacing:Settings StatusStatusSettingsStrckt StretchedSettingsUtseendeStyleSettingsTabb-bredd: Tab width:SettingsTextTextSettingsTextbakgrundText BackgroundSettings"Textinstllningar Text OptionsSettingsTextomrde Text areaSettingsTextfrg: Text color:SettingsTextredigerare Text editorSettingsTextEtikett TextLabelSettingsTemats namn: Theme name:SettingsSida vid sidaTiledSettings TitelTitleSettings0Topp-/Botten-marginaler:Top/Bottom margins:SettingsTransparent TransparentSettingsTrdTreeSettingsTyp:Type:Settings*Anvnd blockmarkr pUse block insertion ofSettingsVisningarViewsSettings*VisningsinstllningarViews settingsSettings Synliga kolumnerVisible columnsSettings Bredd:Width:SettingsFnsterbakgrundWindow BackgroundSettingsAntal ord Word countSettings ZoomadZoomedSettings minut.minutes.SettingsVndringar per 10 minuter fr senaste timmen*revisions per 10 minutes for the last hourSettingsJndringar per dag fr senaste mnaden$revisions per day for the last monthSettingsJndringar per timme fr senaste dagen#revisions per hour for the last daySettingsXndringar per minut fr senaste 10 minuterna,revisions per minute for the last 10 minutesSettings@ndringar per vecka tills vidare'revisions per week till the end of timeSettingssekunder.seconds.Settings&&Lgg till i ordbok&Add to dictionary SpellAction(&Ta bort frn ordbok&Remove from custom dictionary SpellAction StavningsfrslagSpelling Suggestions SpellActionOm ManuskriptAbout ManuskriptaboutManuskript Manuskriptabout>Programvaruversion som anvnds:Software Versions in Use: aboutDialogVersionVersion aboutDialogKompileraCompile abstractModelMlGoal abstractModelEtikettLabel abstractModelSynvinkelPOV abstractModel StatusStatus abstractModel TitelTitle abstractModelAntal ord Word count abstractModel2Laddade versttning: {}.Loaded translation from {}: {}.appzOBS: Ingen versttning hittades eller laddades fr sprk {}.:Note: No translator found or loaded from {} for locale {}.appDSammanfattning i ett par meningar:Few sentences summary: basicItemViewFormulrForm basicItemViewMl:Goal: basicItemView0Sammanfattning p en radOne line summary basicItemViewSynvinkel:POV: basicItemViewAntal ord Word count basicItemViewNamnNamecharacterModelNy karaktr New charactercharacterModel VrdeValuecharacterModelHuvudkaraktrMaincharacterTreeViewStatistMinorcharacterTreeViewBikaraktr SecondarycharacterTreeViewKaraktrer Characters cheatSheet^Filtrera (skriv namnet p ngot i ditt projekt)2Filter (type the name of anything in your project) cheatSheetFormulrForm cheatSheetHuvudkaraktrMain cheatSheetStatistMinor cheatSheetHandlingarPlots cheatSheetBikaraktr Secondary cheatSheet TexterTexts cheatSheet VrldWorld cheatSheetHuvudkaraktrMaincmbOutlineCharacterChoserStatistMinorcmbOutlineCharacterChoser IngenNonecmbOutlineCharacterChoserBikaraktr SecondarycmbOutlineCharacterChoserDiverseVariouscmbOutlineCharacterChoserDiverseVariouscmbOutlineLabelChoserDiverseVariouscmbOutlineStatusChoser8Verktygsrad fr Dock WidgetsDock Widgets ToolbarcollapsibleDockWidgetsFormulrForm completer&Full sammanfattning Full summary corkDelegate0Sammanfattning p en radOne line summary corkDelegateFormulrFormeditorWidget_uiExporteraExportexporterExportera till: Export to:exporter$Hantera exportrerManage exportersexporterFrhandsgranskaPreviewexporterInstllningarSettingsexporter4{} (ej implementerat nnu){} (not implemented yet)exporterDialogd<html><head/><body><p>Filtrerar vilka objekt som inkluderas i det exporterade materialet.<br/><span style=" color:#773333;">(Ej helt implementerat nnu.)</span></p></body></html>

Filters what items will be included in the final export.
(Not fully implemented yet.)

exporterSettings*Mellan mapp och text:Between folder and text:exporterSettingsMellan mappar:Between folders:exporterSettings*Mellan text och mapp:Between text and folder:exporterSettingsMellan texter:Between texts:exporterSettingsInnehllContentexporterSettingsAnpassadCustomexporterSettings.Anpassade ersttningar:Custom replacements:exporterSettingsHr bestmmer du vad som ska inkluderas i det exporterade materialet.6Decide here what will be included in the final export.exporterSettingsTom rad Empty lineexporterSettingsAktiveradEnabledexporterSettingsFi&lterFi<ersexporterSettingsMappFolderexporterSettingsTypsnittFontexporterSettingsTeckenstorlek: Font size:exporterSettingsTypsnitt:Font:exporterSettingsFormulrFormexporterSettings2Jag behver mer precisionI need more granularityexporterSettingsOm markerad, anvnd reguljra uttryck fr ersttningar. Annars, erstt som ren text.ZIf checked, uses regular expression for replacement. If unchecked, replaced as plain text.exporterSettingsfIgnorera kompileringsstatus (inkludera alla objekt))Ignore compile status (include all items)exporterSettingsEtiketterLabelsexporterSettingsFrhandsgranskaPreviewexporterSettings"Reguljrt UttryckRegExpexporterSettings6Ta bort upprepade mellanrumRemove multiple spacesexporterSettings ErsttReplaceexporterSettings Erstt --- med Replace --- with —exporterSettings$Erstt ... med Replace ... with …exporterSettingsDErstt dubbla citattecken (") med:Replace double quotes (") with:exporterSettingsBErstt enkla citattecken (') med:Replace single quotes (') with:exporterSettingsUppdelningar SeparationsexporterSettings StatusStatusexporterSettings.Underordnade objekt av: Subitems of:exporterSettingsTextTextexporterSettings TitelTitleexporterSettingsOmvandlingarTransformationsexporterSettingsTypTypeexporterSettings4Typografiska ersttningar:Typographic replacements:exporterSettingsMedWithexporterSettings{}Niv {} mapp{}Level {} folderexporterSettings{}Niv {} text{}Level {} textexporterSettings<b>Krver:</b> Requires: exportersManager:<b>Status:</b> avinstallerad.Status: uninstalled.exportersManagerAnpassadCustomexportersManagerInstallerad InstalledexportersManagerHittades ej Not foundexportersManager*Stt skvgen fr {}.Set {} executable path.exportersManagerz{} hittades ej. Installera den, eller stt skvgen manuellt./{} not found. Install it, or set path manually.exportersManagerFrekvens FrequencyfrequencyAnalyzer FraserPhrasesfrequencyAnalyzerOrdWordfrequencyAnalyzerFramstegProgressfullScreenEditor Tema:Theme:fullScreenEditor TitelTitlefullScreenEditorAntal ord Word countfullScreenEditor {} ord{} wordsfullScreenEditor{} ord / {} {} words / {}fullScreenEditorAllmntGeneralgeneralSettings<Importera till en toppnivmappImport in a top-level foldergeneralSettings Importera under: Import under:generalSettings Dela scener vid:Split scenes at:generalSettingsBTrimma lnga titlar (> 32 tecken)Trim long titles (> 32 chars)generalSettings\n---\n\n---\ngeneralSettingspOm du inte vill se mig kan du gmma mig via Hjlp-menyn.8If you don't wanna see me, you can hide me in Help menu. helpLabelVlj fil Choose fileimporterRensa fil Clear fileimporterFormat:Format:importerImporteraImportimporterFrhandsgranskaPreviewimporterInstllningarSettingsimporterDiverseVarious lineEditView minuter minuteslocker ord wordslockerFormulrFormlockerLs!Lock !lockerSkrmls: Lock screen:locker Tidml Time targetlocker Ordml Word targetlocker{} terstr {} remaininglocker {} s.{} s.locker{} ord terstr{} words remaininglocker {}:{}{}:{}locker ~{} t.~{} h.locker~{} min.~{} mn.lockerAlt+UppAlt+Up mainEditorF11F11 mainEditorFormulrForm mainEditor2G till verordnat objektGo to parent item mainEditorRegisterkort Index cards mainEditor UtkastOutline mainEditorRotRoot mainEditorTextText mainEditor{} ord  {} words  mainEditor{} ord / {} {} words / {}  mainEditorMarkdownMarkdownmarkdownSettingsFormulrForm metadataView&Full sammanfattning Full summary metadataView2Anteckningar / ReferenserNotes / References metadataView0Sammanfattning p en radOne line summary metadataViewEgenskaper Properties metadataView ndringshistorik Revisions metadataViewSammanfattningSummary metadataViewGm automatiskt Auto-hidemyPanel&Kopiera&Copy outlineBasics&Ta bort&Delete outlineBasics&Klistra in&Paste outlineBasics&Byt namn&Rename outlineBasics<p><b>Du hller p att ta bort {} objekt.</b></p><p>r du sker?</p>D

You're about to delete {} item(s).

Are you sure?

 outlineBasics*Hller p att ta bortAbout to remove outlineBasicsvAlla objekt mste vara p samma niv (dela samma frlder).Oknd referens:</b> {}.Unknown reference: {}. references$Grundlggande info Basic info references&Karaktr: <b>{}</b>Character: {} referencesKaraktrer Characters referencesKonfliktConflict referencesBeskrivning Description referencesDetaljerad info Detailed info referencesUppenbarelseEpiphany referencesMapp: <b>{}</b>Folder: {} referencesG till {}. Go to {}. referencesMlGoal referencesEtikett:Label: references(Lng sammanfattning: Long summary: references*Lngre sammanfattningLonger summary referencesMotivering Motivation references*Inte en referens: {}.Not a reference: {}. referencesAnteckningar:Notes: referencesSynvinkel:POV of: referencesSynvinkel:POV: referencesPassionPassion referencesSkvg:Path: references&Handling: <b>{}</b>Plot: {} references"Refereras till i:Referenced in: referencesLsningsstegResolution steps referencesResultatResult references&Kort sammanfattning Short summary references(Kort sammanfattning:Short summary: referencesStatistik:Stats: referencesStatus:Status: referencesText: <b>{}</b>Text: {} references&Oknd referens: {}.Unknown reference: {}. references4Vrld: <b>{name}</b>{path}World: {name}{path} references1 dag sedan 1 day ago revisions Rensa Clear all revisionsTa bortDelete revisionsFormulrForm revisionsRad {}:Line {}: revisionsAlternativOptions revisionsterskapaRestore revisions&Visa gammal versionShow ancient version revisionsVisa ndringarShow modifications revisions*Visa endast ndringarShow modifications only revisionsVisa mellanrum Show spaces revisions{} dagar sedan {} days ago revisions{} timmar sedan {} hours ago revisions {} minuter sedan{} minutes ago revisions {} mnader sedan {} months ago revisions"{} sekunder sedan{} seconds ago revisions{} r sedan {} years ago revisionsAlltAllsearch"SkiftlgesknsligCase sensitivesearchFormulrFormsearchEtikettLabelsearchAnteckningarNotessearchAlternativ:Options:searchSynvinkelPOVsearchSk efter... Search for...search Sk i: Search in:search StatusStatussearchSammanfattningSummarysearchTextTextsearch TitelTitlesearch (skrivskyddad) (read-only)settingsWindowFelErrorsettingsWindowNy etikett New labelsettingsWindowNy status New statussettingsWindowNytt tema New themesettingsWindownewthemenewthemesettingsWindowFormulrForm sldImportanceHuvudkaraktrMain sldImportanceStatistMinor sldImportanceBikaraktr Secondary sldImportanceTextLabel TextLabel sldImportance <p>Dela markerade objekt vid det angivna mrket.</p> <p>Om ett av de markerade objekten r en mapp kommer detta att tillmpas rekursivt fr <i>alla</i> dess barnobjekt.</p> <p>Delningsmrket kan innehlla fljande kontrollsekvenser: <ul> <li><b><code>\n</code></b>: radbrytning</li> <li><b><code>\t</code></b>: tabb</li> </ul> </p> <p><b>Mrke:</b></p> 

Split selected item(s) at the given mark.

If one of the selected item is a folder, it will be applied recursively to all of it's children items.

The split mark can contain following escape sequences:

  • \n: line break
  • \t: tab

Mark:

 splitDialogDela '{}' Split '{}' splitDialogDela objekt Split items splitDialogFormulrForm storylineViewVisa KaraktrerShow Characters storylineViewVisa Handlingar Show Plots storylineViewStng delning Close split tabSplitterFppna valda objekt i den visningen.!Open selected items in that view. tabSplitter"Dela horisontelltSplit horizontally tabSplitterDela vertikaltSplit vertically tabSplitterDiverseVarious textEditView CTRL+BCTRL+B textFormat CTRL+ECTRL+E textFormat CTRL+ICTRL+I textFormat CTRL+JCTRL+J textFormat CTRL+LCTRL+L textFormat CTRL+PCTRL+P textFormat CTRL+RCTRL+R textFormat CTRL+UCTRL+U textFormatFormulrForm textFormatMinimera Alla Collapse AlltreeViewMinimera {} Collapse {}treeViewExpandera Alla Expand AlltreeViewExpandera {} Expand {}treeView11welcomeB<b>Total:</b> {} ord (~ {} sidor)#Total: {} words (~ {} pages)welcomeLgg till niv Add levelwelcome&Lgg till antal ordAdd word countwelcomeBokBookwelcomeKapitelChapterwelcome SkapaCreatewelcome$Skapa Nytt ProjektCreate New ProjectwelcomeDemoprojekt Demo projectswelcomeTomEmptywelcome$Tom sknlitteratur Empty fictionwelcome$Tom facklitteraturEmpty non-fictionwelcomeSknlitteraturFictionwelcomeSlutgiltigFinalwelcomeFrsta utkast First draftwelcomeFormulrFormwelcomeIdIdeawelcomeManuskript Manuskriptwelcome4Manuskript-projekt (*.msk)Manuskript project (*.msk)welcomeTManuskript-projekt (*.msk);;Alla filer (*))Manuskript project (*.msk);;All files (*)welcomedppna automatiskt det senaste projektet nsta gng*Next time, automatically open last projectwelcomeFacklitteratur Non-fictionwelcomeAnteckningNotewelcome RomanNovelwelcomeLngre novellNovellawelcomeppna projekt Open projectwelcomeppna...Open...welcomeFSkriv ver existerande projekt {} ?Overwrite existing project {} ?welcomeSenasteRecentwelcome&ReferensinformationResearchwelcomeUppsatsResearch paperwelcome(Spara projekt som...Save project as...welcomeScenScenewelcomeAndra utkast Second draftwelcomeAvsnittSectionwelcomeKortare novell Short StorywelcomeNgonting SomethingwelcomeAtt GraTODOwelcome Mallar TemplateswelcomeTextTextwelcomeTrilogiTrilogywelcomeVarningWarningwelcomeavofwelcomeord vardera. words each.welcomeArkitektur Architecture worldModelAstronomi Astronomy worldModelKropssprkBodily language worldModelKalenderCalendar worldModel KlimatClimate worldModelUppvaktning Courtship worldModel*Kulturella egenskaperCultural worldModelSeder och skickCustoms worldModelDemografi Demography worldModelSjukdomarDiseases worldModel KlderDresses worldModelUtbildning Education worldModelEtikEthics worldModel4Utformning av fantasivrldFantasy world building worldModel FloraFlora worldModelMatFood worldModelKnsroller Gender roles worldModelStatsskick Government worldModelHistoriaHistory worldModelViktiga objektImportant objects worldModelViktiga platserImportant places worldModel Sprk Languages worldModelMagisystem Magic system worldModelMagiska objektMagical objects worldModelMagiska platserMagical places worldModelMagiska raser Magical races worldModelMedicinMedicine worldModelMilitrMilitary worldModelMusik och konstMusic and arts worldModelNytt ObjektNew item worldModelOrganisering Organization worldModel$Fysiska egenskaperPhysical worldModelPolitikPolitics worldModel RaserRaces worldModelReligionReligion worldModel ReglerRules worldModelVetenskapScience worldModelTeknologi Technology worldModelLandskap Topography worldModelTransportTransportation worldModelDjurliv Wild life worldModelmanuskript-0.10.0/i18n/manuskript_sv.ts000066400000000000000000005467741354442177200200610ustar00rootroot00000000000000 Export Default exporter, provides basic formats used by other exporters. Standardexportör. Erbjuder grundläggande format som andra exportörer använder. Basic HTML output using the Python module 'markdown'. Grundläggande HTML-export via python-modulen 'markdown'. Python module 'markdown'. python-modulen 'markdown'. Markdown source Markdown-källkod HTML Source HTML-källkod HTML Output HTML-utdata Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. Ren text med markdown-titlar Förutsätter att texterna har formaterats i markdown. Preview with highlighter. Förhandsgranskning med märkpenna. Plain text Ren text Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. Enkel export till ren text. Låter dig använda egna markup-format som annars inte förstås av Manuskript, t.ex. <a href='www.fountain.io'>Fountain</a>. A little known format modestly used. You know, web sites for example. Ett relativt okänt format som används blygsamt, t.ex. på websidor. <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> <p>Universellt konverteringsverktyg för dokument. Kan användas för att konvertera markdown till många olika format.</p> <p>Websida: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> Error Fel Books that don't kill trees. Böcker som inte mördar träd. OpenDocument format. Used by LibreOffice for example. OpenDocument-format. Används t.ex. av LibreOffice. Microsoft Office (.docx) document. Microsoft Office (.docx)-dokument. Needs LaTeX to be installed. Kräver att LaTex är installerat. a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. en giltig LaTex-installation. Se vad pandoc rekommenderar på: <a href="http://pandoc.org/installing.html">http://pandoc.org/installing.html</a>. Vill du ha stöd för unicode behöver du xelatex. Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. Exportera till markdown via pandoc. Ger stöd för fler formateringsmöjligheter jämfört med den grundläggande Manuskript-exportören. reStructuredText is a lightweight markup language. reStructuredText är ett lättvikts-markupspråk... LaTeX is a word processor and document markup language used to create beautiful documents. LaTeX är ett markupspråk för ordbehandlare och dokument som används för att skapa vackra dokument. The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. Detta format erbjuder en metod för informationsutbyte mellan outliners och internettjänster som kan visas eller kontrolleras via en outliner. Standalone document (not just a fragment) Fristående dokument (inte bara ett fragment) Include a table of contents. Inkludera innehållsförteckning. Number of sections level to include in TOC: Antal av sektionsnivåer för inkludering i innehållsförteckningen: Typographically correct output Typografiskt korrekt utdata Normalize the document (cleaner) Normalisera dokumentet (renare) Specify the base level for headers: Välj rotnivå för rubriker: Use reference-style links instead of inline links Använd referenslänkar i stället för infogade länkar Use ATX-style headers Använd ATX-rubriker Self-contained HTML files, with no dependencies Fristående HTML-filer utan andra beroenden Use <q> tags for quotes in HTML Använd <q>-taggar för citat i HTML LaTeX engine used to produce the PDF. LaTeX-motor som används för att skapa PDF-dokumentet. Paper size: Pappersstorlek: Font size: Teckenstorlek: Class: Klass: Line spacing: Radavstånd: Disable YAML metadata block. Use that if you get YAML related error. Avaktivera YAML metadata block. Använd detta om du får ett felmeddelande angående YAML. Convert to ePUB3 Konvertera till ePUB3 Could not process regular expression: {} Choose output file… ExportersManager Manage Exporters Hantera Exportörer Manuskript Manuskript Description Beskrivning Offers export to Kan exportera till Status Status Status: Status: Version: Version: Path: Sökväg: ... ... {HelpText} {HelpText} FrequencyAnalyzer Frequency Analyzer Frekvensanalys Word frequency Ordfrekvens Settings Inställningar Minimum size: Minsta storlek: Exclude words (comma separated): Exkludera ord (komma-separerade): Analyze Analysera Phrase frequency Frasfrekvens Number of words: from Antal ord: från to till Import Markdown import Import av Markdown <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; <b>Info:</b> En väldigt enkel tolk som kommer att gå genom ett Markdown-dokument och skapar objekt för varje titel.<br/>&nbsp; Folder import Import av mappar <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> <p><b>Info:</b> Importerar en hel katalogstruktur. Mappar läggs till som mappar, och vanliga textdokument inuti (du väljer vilka efter filändelse) läggs till som scener.</p> <p>Endast textfiler stöds (inte bilder, binärer eller annat).</p> Include only those extensions: Inkludera endast dessa filändelserna: Comma separated values Kommasepareradevärden Sort items by name Sortera objekt efter namn Import folder then files Importera mapp och sedan filer OPML Import OPML-import File open failed. Misslyckades med att öppna fil. This does not appear to be a valid OPML file. Detta verkar inte vara en giltig OPML-fil. Pandoc import Pandoc-import <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; <b>Info:</b> Manuskript kan importera från <b>markdown</b> eller <b>OPML</b>. Pandoc kommer att konvertera ditt dokument till endera (se alterntiv nedan), och sedan kommer det att importeras i manuskript. Endera kan ge bättre resultat beroende på ditt dokument. <br/>&nbsp; Import using: Importera via: Wrap lines: Radbryt rader: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> <p>Ska pandoc skapa kosmetiska / icke-semantiska radbrytningar?</p><p> <b>auto</b>: radbryter efter 72 tecken.<br> <b>none</b>: inga radbrytningar.<br> <b>preserve</b>: försöker att bevara radbrytningar från originaldokumentet.</p> Mind Map Import Import av Mind Map This does not appear to be a valid Mind Map file. Detta verkar inte vara en giltig Mind Map-fil. Mind Map import Mind Map-import Import tip as: Importera tips som: Untitled Namnlös MDEditCompleter Insert reference Infoga referens MainWindow General Allmänt Book information Information om boken Title Titel Subtitle Undertitel Series Serie Volume Volym Genre Genre License Licens Author Författare Name Namn Email E-mail Summary Sammanfattning Situation: Situation: Summary: Sammanfattning: One sentence En mening One paragraph Ett stycke One page En sida Full Full One sentence summary Sammanfattning i en mening One paragraph summary Sammanfattning i ett stycke Expand each sentence of your one paragraph summary to a paragraph Utvidga varje mening till ett stycke One page summary Sammanfattning på en sida Full summary Full sammanfattning Next Nästa What if...? Tänk om...? Characters Karaktärer Names Namn Filter Filter Basic info Grundläggande info Motivation Motivation Goal Mål Conflict Konflikt Epiphany Uppenbarelse <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="right">Sammanfattning i en<br/>mening</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> <html><head/><body><p align="right">Sammanfattning i ett<br/>stycke</p></body></html> Importance Signifikans Notes Anteckningar Detailed info Detaljerad info Plots Handlingar Plot Handling Character(s) Karaktär(er) Description Beskrivning Result Resultat Resolution steps Lösningssteg World Värld Populates with empty data Fylls med tom data More Mer Source of passion Passionskälla Source of conflict Konfliktkälla Outline Utkast Editor Redigerare Debug Debug FlatData FlatData Persos Persos Labels Etiketter &File &Arkiv &Recent S&enaste &Help &Hjälp &Tools &Verktyg &Edit &Redigera &View &Visa &Mode &Läge &Cheat sheet &Fusklapp Sea&rch S&ök &Navigation &Navigation &Open &Öppna Ctrl+O Ctrl+O &Save &Spara Ctrl+S Ctrl+S Sa&ve as... Spara s&om... Ctrl+Shift+S Ctrl+Shift+S &Quit &Avsluta Ctrl+Q Ctrl+Q &Show help texts &Visa hjälptexter Ctrl+Shift+B Ctrl+Shift+B &Spellcheck &Stavningskontroll F9 F9 &Labels... &Etiketter... &Status... &Status... Tree Träd &Simple &Enkelt &Fiction &Skönlitteratur Index cards Registerkort S&ettings I&nställningar F8 F8 &Close project S&täng projekt Co&mpile Ko&mpilera F6 F6 &Frequency Analyzer &Frekvensanalys &About &Om About Manuskript Om Manuskript Manuskript Manuskript Project {} saved. Projekt {} sparades. WARNING: Project {} not saved. VARNING: Projekt {} sparades ej. Project {} loaded. Projekt {} laddades. Project {} loaded with some errors: Projekt {} laddades med vissa fel: * {} wasn't found in project file. * {} hittades inte i projektfilen. Project {} loaded with some errors. Projekt {} laddades med vissa fel. (~{} pages) (~{} sidor) Words: {}{} Ord: {}{} Book summary Sammanfattning av boken Project tree Projektträd Metadata Metadata Story line Handling Enter information about your book, and yourself. Skriv information om din bok och dig själv. The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) Den grundläggande situationen i form av en "Tänk om...?"-mening. Exempel: 'Tänk om världens farligaste onda trollkarl misslyckades med att döda en baby?' (Harry Potter) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Tänk ut en kort (ca. 50 ord) mening som sammanfattar din bok. Utveckla den sedan till ett stycke, till en sida och sist till en full sammanfattning. Create your characters. Skapa dina karaktärer. Develop plots. Utveckla handlingen. Build worlds. Create hierarchy of broad categories down to specific details. Utforma världar. Skapa en hierarki av generella kategorier ned till minsta detalj. Create the outline of your masterpiece. Skapa ett utkast för ditt mästerverk. Write. Skriv. Debug info. Sometimes useful. Debug-information. Kan vara användbar. Dictionary Ordbok Nothing Ingenting POV Synvinkel Label Etikett Progress Framsteg Compile Kompilera Icon color Ikonfärg Text color Textfärg Background color Bakgrundsfärg Icon Ikon Text Text Background Bakgrund Border Kant Corner Hörn Add plot step Lägg till nytt steg i handlingen (CTRL+Enter) &Import… &Importera… F7 F7 &Copy &Kopiera Ctrl+C Ctrl+C C&ut K&lipp ut Ctrl+X Ctrl+X &Paste &Klistra in Ctrl+V Ctrl+V &Split… &Dela… Ctrl+Shift+K Ctrl+Shift+K Sp&lit at cursor De&la vid markör Ctrl+K Ctrl+K Ctrl+M Ctrl+M Ctrl+D Ctrl+D Del Del &Move Up &Flytta upp Ctrl+Shift+Up Ctrl+Shift+Pil upp M&ove Down Fl&ytta ned Ctrl+Shift+Down Ctrl+Shift+Pil ned Dupl&icate Dupl&icera &Delete &Ta bort &Rename &Byt namn F2 F2 Organi&ze Organi&sera M&erge Sa&mmanfoga &Format &Header &Level 1 (setext) Ctrl+Alt+1 Level &2 Ctrl+Alt+2 Level &1 (atx) Ctrl+1 L&evel 2 Ctrl+2 Level &3 Ctrl+3 Level &4 Ctrl+4 Level &5 Ctrl+5 Level &6 Ctrl+6 &Bold Ctrl+B &Italic Ctrl+I &Strike &Verbatim Su&perscript Ctrl++ Subsc&ript Ctrl+- Co&mment block Ctrl+Shift+C Clear &formats Ctrl+0 &Comment line(s) &Ordered list &Unordered list B&lockquote Remove selected plot step(s) The file {} does not exist. Has it been moved or deleted? Install {}{} to use spellcheck {} has no installed dictionaries {}{} is not installed Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings Settings Inställningar General Allmänt Revisions Ändringshistorik Views Visningar Labels Etiketter Status Status Fullscreen Fullskärm General settings Allmänna inställningar Application settings Applikationens utseende Loading Uppstart Automatically load last project on startup Ladda automatiskt senaste projekt vid uppstart Saving Sparande Automatically save every Spara automatiskt var minutes. minut. If no changes during Om inget har ändrats på seconds. sekunder. Save on project close Spara vid avslut <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> <html><head/><body><p>Markeras detta alternativ sparas ditt projekt som en samlad fil. Detta gör det lättare att ta en backup eller göra en kopia, men tillåter inte gemensam redigering eller versionshantering.<br/>Markeras alternativet inte sparas ditt projekt som en mapp med många små filer.</p></body></html> Save to one single file Spara i en samlad fil Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. Ändringshistorik låter dig följa dina ändringar. För varje textobjekt sparas ändringar som du har gjort vilket ger dig möjlighet till att se och återskapa tidigare versioner. Keep revisions Aktivera Ändringshistorik S&mart remove S&mart borttagning Keep: Behåll: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. Smart borttagning låter dig behålla ett visst antal ändringar. Du rekommenderas att använda den för att undvika att din fil fylls med tusentals av oviktiga ändringar. revisions per day for the last month ändringar per dag för senaste månaden revisions per minute for the last 10 minutes ändringar per minut för senaste 10 minuterna revisions per hour for the last day ändringar per timme för senaste dagen revisions per 10 minutes for the last hour ändringar per 10 minuter för senaste timmen revisions per week till the end of time ändringar per vecka tills vidare Views settings Visningsinställningar Tree Träd Colors Färger Icon color: Ikonfärg: Nothing Ingenting POV Synvinkel Label Etikett Progress Framsteg Compile Kompilera Text color: Textfärg: Background color: Bakgrundsfärg: Folders Mappar Show ite&m count Visa antal obje&kt Show summary Visa sammanfattning &Nothing I&ngenting Text Text Outline Utkast Visible columns Synliga kolumner Goal Mål Word count Antal ord Percentage Procent Title Titel Index cards Registerkort Background Bakgrund Color: Färg: Ctrl+S Ctrl+S Image: Bild: Style Utseende Item colors Objektfärger Border color: Kantfärg: Corner color: Hörnfärg: Text editor Textredigerare Font Typsnitt Family: Familj: Size: Teckenstorlek: Misspelled: Felstavat: Background: Bakgrund: Cursor Markör Use block insertion of Använd blockmarkör på px pixlar Paragraphs Stycke Line spacing: Radavstånd: Single Enkelt 1.5 lines 1.5 rader Double Dubbelt Proportional Proportionellt % % Tab width: Tabb-bredd: Indent 1st line Indrag på rad 1 Spacing: Avstånd: Alignment: Justering: Left Vänster Center Centrera Right Höger Justify Justerad New Ny Edit Redigera Delete Ta bort Theme name: Temats namn: Apply Använd Cancel Avbryt Window Background Fönsterbakgrund Text Background Textbakgrund Text Options Textinställningar Paragraph Options Styckesinställningar Type: Typ: No Image Ingen bild Tiled Sida vid sida Centered Centrerad Stretched Sträckt Scaled Skalad Zoomed Zoomad Opacity: Opacitet: Position: Position: Width: Bredd: Corner radius: Hörnradie: Margins: Marginaler: Padding: Utfyllnad: Font: Typsnitt: Alignment Justering Icon Size Storlek på ikoner TextLabel TextEtikett Disable blinking Avaktivera blinkning Text area Textområde Max width Maximal bredd Left/Right margins: Vänster-/Höger-marginaler: Top/Bottom margins: Topp-/Botten-marginaler: S&how progress Visa &framsteg Show summar&y Visa samman&fattning Show p&rogress Visa fram&steg Old st&yle Gammal &stil Transparent Transparent Restore defaults Återställ standardvärden Style: Language: Font size: Teckenstorlek: Restarting Manuskript ensures all settings take effect. Show &word count &Show word count &New style Typewriter mode Focus mode None Ingen Sentence Line Paragraph <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions Stavningsförslag &Add to dictionary &Lägg till i ordbok &Remove from custom dictionary &Ta bort från ordbok about About Manuskript Om Manuskript Manuskript Manuskript aboutDialog Version Version Software Versions in Use: Programvaruversion som används: abstractModel Title Titel POV Synvinkel Label Etikett Status Status Compile Kompilera Word count Antal ord Goal Mål basicItemView Form Formulär POV: Synvinkel: Goal: Mål: Word count Antal ord One line summary Sammanfattning på en rad Few sentences summary: Sammanfattning i ett par meningar: characterModel New character Ny karaktär Name Namn Value Värde characterTreeView Main Huvudkaraktär Secondary Bikaraktär Minor Statist cheatSheet Form Formulär Filter (type the name of anything in your project) Filtrera (skriv namnet på något i ditt projekt) Minor Statist Secondary Bikaraktär Main Huvudkaraktär Characters Karaktärer Texts Texter Plots Handlingar World Värld cmbOutlineCharacterChoser None Ingen Main Huvudkaraktär Secondary Bikaraktär Minor Statist Various Diverse cmbOutlineLabelChoser Various Diverse cmbOutlineStatusChoser Various Diverse collapsibleDockWidgets Dock Widgets Toolbar Verktygsrad för Dock Widgets completer Form Formulär corkDelegate One line summary Sammanfattning på en rad Full summary Full sammanfattning editorWidget_ui Form Formulär exporter Export Exportera Export to: Exportera till: Manage exporters Hantera exportörer Preview Förhandsgranska Settings Inställningar exporterDialog {} (not implemented yet) {} (ej implementerat ännu) exporterSettings Form Formulär Content Innehåll Decide here what will be included in the final export. Här bestämmer du vad som ska inkluderas i det exporterade materialet. Type Typ Title Titel Text Text I need more granularity Jag behöver mer precision Fi&lters Fi&lter <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> <html><head/><body><p>Filtrerar vilka objekt som inkluderas i det exporterade materialet.<br/><span style=" color:#773333;">(Ej helt implementerat ännu.)</span></p></body></html> Ignore compile status (include all items) Ignorera kompileringsstatus (inkludera alla objekt) Subitems of: Underordnade objekt av: Labels Etiketter Status Status Separations Uppdelningar Between folders: Mellan mappar: Empty line Tom rad Custom Anpassad Between texts: Mellan texter: Between folder and text: Mellan mapp och text: Between text and folder: Mellan text och mapp: Transformations Omvandlingar Typographic replacements: Typografiska ersättningar: Replace ... with … Ersätt ... med … Replace --- with — Ersätt --- med — Replace double quotes (") with: Ersätt dubbla citattecken (") med: Replace single quotes (') with: Ersätt enkla citattecken (') med: Remove multiple spaces Ta bort upprepade mellanrum Custom replacements: Anpassade ersättningar: Enabled Aktiverad Replace Ersätt With Med RegExp Reguljärt Uttryck If checked, uses regular expression for replacement. If unchecked, replaced as plain text. Om markerad, använd reguljära uttryck för ersättningar. Annars, ersätt som ren text. Preview Förhandsgranska Font Typsnitt Font: Typsnitt: Font size: Teckenstorlek: Folder Mapp {}Level {} folder {}Nivå {} mapp {}Level {} text {}Nivå {} text exportersManager Installed Installerad Custom Anpassad Not found Hittades ej {} not found. Install it, or set path manually. {} hittades ej. Installera den, eller sätt sökvägen manuellt. <b>Status:</b> uninstalled. <b>Status:</b> avinstallerad. <b>Requires:</b> <b>Kräver:</b> Set {} executable path. Sätt sökvägen för {}. frequencyAnalyzer Phrases Fraser Frequency Frekvens Word Ord fullScreenEditor Theme: Tema: {} words / {} {} ord / {} {} words {} ord Spellcheck Navigation New Text Title Titel Title: Show Full Path Theme selector Word count Antal ord Progress Framsteg Progress: Auto Show/Hide Clock Clock: Show Seconds generalSettings General Allmänt Split scenes at: Dela scener vid: \n---\n \n---\n Trim long titles (> 32 chars) Trimma långa titlar (> 32 tecken) Import under: Importera under: Import in a top-level folder Importera till en toppnivåmapp helpLabel If you don't wanna see me, you can hide me in Help menu. Om du inte vill se mig kan du gömma mig via Hjälp-menyn. importer Import Importera Format: Format: Choose file Välj fil Clear file Rensa fil Preview Förhandsgranska Settings Inställningar lastAccessedDirectoryInfo Last accessed directory "{}" loaded. lineEditView Various Diverse locker Form Formulär Lock screen: Skärmlås: Word target Ordmål Time target Tidmål words ord minutes minuter Lock ! Lås! ~{} h. ~{} t. ~{} mn. ~{} min. {}:{} {}:{} {} s. {} s. {} remaining {} återstår {} words remaining {} ord återstår mainEditor Form Formulär Go to parent item Gå till överordnat objekt Alt+Up Alt+Upp Text Text Index cards Registerkort Outline Utkast F11 F11 Root Rot {} words / {} {} ord / {} {} words {} ord markdownSettings Markdown Markdown metadataView Form Formulär Properties Egenskaper Summary Sammanfattning One line summary Sammanfattning på en rad Full summary Full sammanfattning Notes / References Anteckningar / Referenser Revisions Ändringshistorik myPanel Auto-hide Göm automatiskt outlineBasics Set POV Ange Synvinkel None Ingen Main Huvudkaraktär Secondary Bikaraktär Minor Statist Set Status Ange Status Set Label Ange Etikett New Ny Set Custom Icon Välj Anpassad Ikon Restore to default Återställ till standard Root Rot Open {} items in new tabs Öppna {} objekt i nya flikar Open {} in a new tab Öppna {} i en ny flik About to remove Håller på att ta bort <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> <p><b>Du håller på att ta bort {} objekt.</b></p><p>Är du säker?</p> Select at least two items. Folders are ignored. Välj åtminstone två objekt. Mappar hoppas över. All items must be on the same level (share the same parent). Alla objekt måste vara på samma nivå (dela samma förälder). New &Folder Ny &mapp New &Text Ny &text &Copy &Kopiera C&ut Klipp &ut &Paste &Klistra in &Rename &Byt namn &Delete &Ta bort outlineCharacterDelegate None Ingen Main Huvudkaraktär Secondary Bikaraktär Minor Statist outlineItem {} words / {} ({}) {} ord / {} ({}) {} words {} ord pandocSettings General Allmänt Table of Content Innehållsförteckning Custom settings for {} Anpassade inställningar för {} persosProxyModel Main Huvudkaraktär Secondary Bikaraktär Minors Statist plotDelegate General Allmänt Promise Löfte Problem Problem Progress Framsteg Resolution Lösning Try / Fail Försök och misslyckas No and Nej, och Yes but Ja, men Freytag's pyramid Freytags pyramid Exposition Utläggning Rising action Stigande spänning Climax Klimax Falling action Sjunkande spänning Three acts Tre akter 1. Setup 1. Uppsättning 1. Inciting event Färden över tröskeln 1. Turning point 1. Vändpunkt 2. Choice 2. Val 2. Reversal 2. Omkastning 2. Disaster 2. Katastrof 3. Stand up 3. Stå upp 3. Climax 3. Klimax 3. Ending 3. Slut Hero's journey Hjälteresan Ordinary world En vanlig värld Call to adventure Kallelsen till äventyret Refusal of the call Kallelsen avvisas Meeting with mentor Mötet med mentorn Tests Prövningar Approach Närmande Abyss Avgrunden Reward / Revelation Belöning / Uppenbarelse Transformation Förvandling Atonement Försoning Return Återkomst plotModel New plot Ny handling Name Namn Meta Meta New step Nytt steg Main Huvudkaraktär Secondary Bikaraktär Minor Statist plotTreeView Main Huvudkaraktär Secondary Bikaraktär Minor Statist **Plot:** {} **Handling:** {} plotsProxyModel Main Huvudkaraktär Secondary Bikaraktär Minors Statist propertiesView Form Formulär POV Synvinkel Status Status Label Etikett Compile Kompilera Goal Mål Word count Antal ord references Not a reference: {}. Inte en referens: {}. Unknown reference: {}. Okänd referens: {}. Path: Sökväg: Stats: Statistik: POV: Synvinkel: Status: Status: Label: Etikett: Short summary: Kort sammanfattning: Long summary: Lång sammanfattning: Notes: Anteckningar: Basic info Grundläggande info Detailed info Detaljerad info POV of: Synvinkel: Go to {}. Gå till {}. Motivation Motivering Goal Mål Conflict Konflikt Epiphany Uppenbarelse Short summary Kort sammanfattning Longer summary Längre sammanfattning Description Beskrivning Result Resultat Characters Karaktärer Resolution steps Lösningssteg Passion Passion <b>Unknown reference:</b> {}. <b>Okänd referens:</b> {}. Folder: <b>{}</b> Mapp: <b>{}</b> Text: <b>{}</b> Text: <b>{}</b> Character: <b>{}</b> Karaktär: <b>{}</b> Plot: <b>{}</b> Handling: <b>{}</b> World: <b>{name}</b>{path} Värld: <b>{name}</b>{path} Referenced in: Refereras till i: revisions Form Formulär Options Alternativ Restore Återskapa Delete Ta bort Show modifications Visa ändringar Show ancient version Visa gammal version Show spaces Visa mellanrum Show modifications only Visa endast ändringar {} years ago {} år sedan {} months ago {} månader sedan {} days ago {} dagar sedan 1 day ago 1 dag sedan {} hours ago {} timmar sedan {} minutes ago {} minuter sedan {} seconds ago {} sekunder sedan Line {}: Rad {}: Clear all Rensa search Form Formulär Search for... Sök efter... Search in: Sök i: All Allt Title Titel Text Text Summary Sammanfattning Notes Anteckningar POV Synvinkel Status Status Label Etikett Options: Alternativ: Case sensitive Skiftlägeskänslig settingsWindow New status Ny status New label Ny etikett newtheme newtheme New theme Nytt tema (read-only) (skrivskyddad) Open Image Image files (*.jpg; *.jpeg; *.png) Error Fel Unable to load selected file Unable to add selected image: {} sldImportance Form Formulär TextLabel TextLabel Minor Statist Secondary Bikaraktär Main Huvudkaraktär splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> <p>Dela markerade objekt vid det angivna märket.</p> <p>Om ett av de markerade objekten är en mapp kommer detta att tillämpas rekursivt för <i>alla</i> dess barnobjekt.</p> <p>Delningsmärket kan innehålla följande kontrollsekvenser: <ul> <li><b><code>\n</code></b>: radbrytning</li> <li><b><code>\t</code></b>: tabb</li> </ul> </p> <p><b>Märke:</b></p> Split '{}' Dela '{}' Split items Dela objekt storylineView Form Formulär Show Plots Visa Handlingar Show Characters Visa Karaktärer tabSplitter Open selected items in that view. Öppna valda objekt i den visningen. Split horizontally Dela horisontellt Close split Stäng delning Split vertically Dela vertikalt textEditView Various Diverse textFormat Form Formulär CTRL+B CTRL+B CTRL+I CTRL+I CTRL+U CTRL+U CTRL+P CTRL+P CTRL+L CTRL+L CTRL+E CTRL+E CTRL+R CTRL+R CTRL+J CTRL+J treeView Expand {} Expandera {} Collapse {} Minimera {} Expand All Expandera Alla Collapse All Minimera Alla welcome Form Formulär 1 1 Templates Mallar Empty Tom Novel Roman Novella Längre novell Short Story Kortare novell Research paper Uppsats Demo projects Demoprojekt Add level Lägg till nivå Add word count Lägg till antal ord Next time, automatically open last project Öppna automatiskt det senaste projektet nästa gång Open... Öppna... Recent Senaste Create Skapa Open project Öppna projekt Manuskript project (*.msk);;All files (*) Manuskript-projekt (*.msk);;Alla filer (*) Save project as... Spara projekt som... Manuskript project (*.msk) Manuskript-projekt (*.msk) Manuskript Manuskript Create New Project Skapa Nytt Projekt Warning Varning Overwrite existing project {} ? Skriv över existerande projekt {} ? Empty fiction Tom skönlitteratur Chapter Kapitel Scene Scen Trilogy Trilogi Book Bok Section Avsnitt Empty non-fiction Tom facklitteratur words each. ord vardera. of av Text Text Something Någonting <b>Total:</b> {} words (~ {} pages) <b>Total:</b> {} ord (~ {} sidor) Fiction Skönlitteratur Non-fiction Facklitteratur Idea Idé Note Anteckning Research Referensinformation TODO Att Göra First draft Första utkast Second draft Andra utkast Final Slutgiltig worldModel New item Nytt Objekt Fantasy world building Utformning av fantasivärld Physical Fysiska egenskaper Climate Klimat Topography Landskap Astronomy Astronomi Wild life Djurliv Flora Flora History Historia Races Raser Diseases Sjukdomar Cultural Kulturella egenskaper Customs Seder och skick Food Mat Languages Språk Education Utbildning Dresses Kläder Science Vetenskap Calendar Kalender Bodily language Kropsspråk Ethics Etik Religion Religion Government Statsskick Politics Politik Gender roles Könsroller Music and arts Musik och konst Architecture Arkitektur Military Militär Technology Teknologi Courtship Uppvaktning Demography Demografi Transportation Transport Medicine Medicin Magic system Magisystem Rules Regler Organization Organisering Magical objects Magiska objekt Magical places Magiska platser Magical races Magiska raser Important places Viktiga platser Important objects Viktiga objekt Natural resources manuskript-0.10.0/i18n/manuskript_tr.qm000066400000000000000000000201621354442177200200170ustar00rootroot00000000000000 Mg Mg8 i :i 8 U~ J }j t ( f  Cj6 } !T;  s - . 4}n DYt DZ K . S < ⋙U eJ2)(9>FR_e]i82Aa ldrmeyen kitaplar.Books that don't kill trees.Export S1n1f:Class:Export*ePUB3 dosyas1na evirConvert to ePUB3ExportHataErrorExportXDzenli ifadeler i_lenirken hata olu_tu : {})Error processing regular expression : {}Exportmarkdown dosyas1 olarak kaydetmek iin pandoc kullan1n. Pandoc, manuskript'ten daha fazla biimlemseenei sunuyor.hExport to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter.Export"Yaz1 tipi boyutu: Font size:Export40indekiler k1sm1 ekleyin.Include a table of contents.ExportSat1r aral11: Line spacing:ExportDMicrosoft Office (.docx) dkman1."Microsoft Office (.docx) document.Export,LaTex ykl olmal1d1r.Needs LaTeX to be installed.ExportOpenDocument format1. rnein, LibreOffice taraf1ndan kullan1l1r.5OpenDocument format. Used by LibreOffice for example.ExportKa1t boyutu: Paper size:ExportDz metin Plain textExport(Doru yaz1lm1_ sonuTypographically correct outputExport.ATX-stili ba_l1k kullanUse ATX-style headersExport Tan1m DescriptionExportersManager DurumStatusExportersManager Durum:Status:ExportersManagerVersiyon:Version:ExportersManagerAnaliz etAnalyzeFrequencyAnalyzerMinimum boyut: Minimum size:FrequencyAnalyzer&Kelime say1s1: 'denNumber of words: fromFrequencyAnalyzer(Szck grubu s1kl11Phrase frequencyFrequencyAnalyzerAyarlarSettingsFrequencyAnalyzerKelime s1kl11Word frequencyFrequencyAnalyzer'etoFrequencyAnalyzer4Virglle ayr1lm1_ deerlerComma separated valuesImport Dosya a1lamad1.File open failed.Import8Bunu kullanarak ieri aktar: Import using:Import4Bu bir OPML dosyas1 deil.-This does not appear to be a valid OPML file.ImportBa_l1ks1zUntitledImportReferans ekleInsert referenceMDEditCompleter&Dzenle&Edit MainWindow &Dosya&File MainWindow&Yard1m&Help MainWindow&Etiketler... &Labels... MainWindow&A&Open MainWindow &Kapat&Quit MainWindow &Yeni&Recent MainWindow&Kaydet&Save MainWindow4&Yard1m dosyalar1n1 gster&Show help texts MainWindow&Yaz1m Kontrol &Spellcheck MainWindow&Durum... &Status... MainWindow&Aralar&Tools MainWindow<html><head/><body><p align="right">Bir paragrafl1k<br/>zet</p></body></html>O

One paragraph
summary

 MainWindow<html><head/><body><p align="right">Bir cmlelik <br/>zet</p></body></html>N

One sentence
summary

 MainWindow YazarAuthor MainWindowTemel bilgiler Basic info MainWindowKarakter(ler) Character(s) MainWindowKarakterler Characters MainWindowat1_maConflict MainWindow Ctrl+OCtrl+O MainWindow Ctrl+QCtrl+Q MainWindow Ctrl+SCtrl+S MainWindowCtrl+Shift+B Ctrl+Shift+B MainWindowCtrl+Shift+S Ctrl+Shift+S MainWindowHata ay1klamaDebug MainWindow Tan1m Description MainWindowDetayl1 bilgi Detailed info MainWindow EditrEditor MainWindowE-postaEmail MainWindowTezahrEpiphany MainWindowBir paragrafl1k zetinizin her cmlesini bir paragraf olarak geni_letinAExpand each sentence of your one paragraph summary to a paragraph MainWindowF9F9 MainWindowFiltreleFilter MainWindowTam zet Full summary MainWindow GenelGeneral MainWindowTarzGenre MainWindowAmaGoal MainWindownem Importance MainWindowEtiketlerLabels MainWindow LisansLicense MainWindowDaha fazlaMore MainWindowMotivasyon Motivation MainWindow0simName MainWindow0simlerNames MainWindow 0leriNext MainWindow NotlarNotes MainWindowBir sayfaOne page MainWindow"Bir sayfal1k zetOne page summary MainWindowBir paragraf One paragraph MainWindow(Bir paragrafl1k zetOne paragraph summary MainWindowBir cmle One sentence MainWindow"Bir cmlelik zetOne sentence summary MainWindow TaslakOutline MainWindow zlme ad1mlar1Resolution steps MainWindow SonuResult MainWindow Farkl1 Kaydet... Sa&ve as... MainWindowSeriSeries MainWindow Durum: Situation: MainWindowat1_ma kayna1Source of conflict MainWindowTutku kayna1Source of passion MainWindowAlt ba_l1kSubtitle MainWindowzetSummary MainWindow zet:Summary: MainWindow Ba_l1kTitle MainWindowCiltVolume MainWindowYa ... olursa? What if...? MainWindow EvrenWorld MainWindowmanuskript-0.10.0/i18n/manuskript_tr.ts000066400000000000000000005427551354442177200200510ustar00rootroot00000000000000 Export Basic HTML output using the Python module 'markdown'. Python module 'markdown'. Markdown source HTML Source HTML Output Default exporter, provides basic formats used by other exporters. Preview with highlighter. Plain text Düz metin A little known format modestly used. You know, web sites for example. Needs LaTeX to be installed. LaTex yüklü olmalıdır. Error Hata Standalone document (not just a fragment) Include a table of contents. İçindekiler kısmı ekleyin. Number of sections level to include in TOC: Typographically correct output Doğru yazılmış sonuç Normalize the document (cleaner) Specify the base level for headers: Use reference-style links instead of inline links Use ATX-style headers ATX-stili başlık kullan Self-contained HTML files, with no dependencies Use <q> tags for quotes in HTML LaTeX engine used to produce the PDF. Paper size: Kağıt boyutu: Font size: Yazı tipi boyutu: Class: Sınıf: Line spacing: Satır aralığı: Books that don't kill trees. Ağaç öldürmeyen kitaplar. OpenDocument format. Used by LibreOffice for example. OpenDocument formatı. Örneğin, LibreOffice tarafından kullanılır. Microsoft Office (.docx) document. Microsoft Office (.docx) dökümanı. reStructuredText is a lightweight markup language. Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. markdown dosyası olarak kaydetmek için pandoc kullanın. Pandoc, manuskript'ten daha fazla biçimlemseçeneği sunuyor. LaTeX is a word processor and document markup language used to create beautiful documents. The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. Disable YAML metadata block. Use that if you get YAML related error. Convert to ePUB3 ePUB3 dosyasına çevir Could not process regular expression: {} Düzenli ifadeler işlenirken hata oluştu : {} Choose output file… ExportersManager Manage Exporters Manuskript Description Tanım Offers export to Status Durum Status: Durum: Version: Versiyon: Path: ... {HelpText} FrequencyAnalyzer Frequency Analyzer Word frequency Kelime sıklığı Settings Ayarlar Minimum size: Minimum boyut: Exclude words (comma separated): Analyze Analiz et Phrase frequency Sözcük grubu sıklığı Number of words: from Kelime sayısı: 'den to 'e Import Markdown import <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; Folder import <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> Include only those extensions: Comma separated values Virgülle ayrılmış değerler Sort items by name Import folder then files OPML Import File open failed. Dosya açılamadı. This does not appear to be a valid OPML file. Bu bir OPML dosyası değil. Pandoc import <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; Import using: Bunu kullanarak içeri aktar: Wrap lines: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> Mind Map Import This does not appear to be a valid Mind Map file. Mind Map import Import tip as: Untitled Başlıksız MDEditCompleter Insert reference Referans ekle MainWindow General Genel Title Başlık Subtitle Alt başlık Series Seri Volume Cilt Genre Tarz License Lisans Author Yazar Name İsim Email E-posta Summary Özet Situation: Durum: Summary: Özet: One sentence Bir cümle One paragraph Bir paragraf One page Bir sayfa Full One sentence summary Bir cümlelik özet One paragraph summary Bir paragraflık özet Expand each sentence of your one paragraph summary to a paragraph Bir paragraflık özetinizin her cümlesini bir paragraf olarak genişletin One page summary Bir sayfalık özet Full summary Tam özet Next İleri What if...? Ya ... olursa? Characters Karakterler Names İsimler Filter Filtrele Basic info Temel bilgiler Importance Önem Motivation Motivasyon Goal Amaç Conflict Çatışma Epiphany Tezahür <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="right">Bir cümlelik <br/>özet</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> <html><head/><body><p align="right">Bir paragraflık<br/>özet</p></body></html> Notes Notlar Detailed info Detaylı bilgi Plots Plot Character(s) Karakter(ler) Description Tanım Result Sonuç Resolution steps Çözülme adımları World Evren Populates with empty data More Daha fazla Source of passion Tutku kaynağı Source of conflict Çatışma kaynağı Outline Taslak Editor Editör Debug Hata ayıklama FlatData Persos Labels Etiketler &File &Dosya &Recent &Yeni &Help &Yardım &Tools &Araçlar &Edit &Düzenle &View &Mode &Cheat sheet Sea&rch &Navigation &Open &Aç Ctrl+O Ctrl+O &Save &Kaydet Ctrl+S Ctrl+S Sa&ve as... Farklı Kaydet... Ctrl+Shift+S Ctrl+Shift+S &Quit &Kapat Ctrl+Q Ctrl+Q &Show help texts &Yardım dosyalarını göster Ctrl+Shift+B Ctrl+Shift+B &Spellcheck &Yazım Kontrolü F9 F9 &Labels... &Etiketler... &Status... &Durum... Tree &Simple &Fiction Index cards S&ettings F8 F8 &Close project Co&mpile F6 F6 &Frequency Analyzer Book information &About About Manuskript Manuskript Project {} saved. WARNING: Project {} not saved. Project {} loaded. Project {} loaded with some errors: * {} wasn't found in project file. Project {} loaded with some errors. (~{} pages) Words: {}{} Book summary Project tree Metadata Story line Enter information about your book, and yourself. The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Create your characters. Develop plots. Build worlds. Create hierarchy of broad categories down to specific details. Create the outline of your masterpiece. Write. Debug info. Sometimes useful. Dictionary Nothing POV Label Progress Compile Icon color Text color Background color Icon Text Background Border Corner Add plot step &Import… F7 F7 &Copy Ctrl+C C&ut Ctrl+X &Paste Ctrl+V &Split… Ctrl+Shift+K Sp&lit at cursor Ctrl+K Ctrl+M Ctrl+D Del &Move Up Ctrl+Shift+Up M&ove Down Ctrl+Shift+Down Dupl&icate &Delete &Rename F2 F2 Organi&ze M&erge &Format &Header &Level 1 (setext) Ctrl+Alt+1 Level &2 Ctrl+Alt+2 Level &1 (atx) Ctrl+1 L&evel 2 Ctrl+2 Level &3 Ctrl+3 Level &4 Ctrl+4 Level &5 Ctrl+5 Level &6 Ctrl+6 &Bold Ctrl+B &Italic Ctrl+I &Strike &Verbatim Su&perscript Ctrl++ Subsc&ript Ctrl+- Co&mment block Ctrl+Shift+C Clear &formats Ctrl+0 &Comment line(s) &Ordered list &Unordered list B&lockquote Remove selected plot step(s) The file {} does not exist. Has it been moved or deleted? Install {}{} to use spellcheck {} has no installed dictionaries {}{} is not installed Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings Settings Ayarlar General Genel Revisions Views Labels Etiketler Status Durum Fullscreen General settings Application settings Loading Automatically load last project on startup Saving Automatically save every minutes. If no changes during seconds. Save on project close <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> Save to one single file Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. Keep revisions S&mart remove Keep: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. revisions per day for the last month revisions per minute for the last 10 minutes revisions per hour for the last day revisions per 10 minutes for the last hour revisions per week till the end of time Views settings Tree Colors Icon color: Nothing POV Label Progress Compile Text color: Background color: Folders Show ite&m count Show summary &Nothing Text Outline Taslak Visible columns Goal Amaç Word count Percentage Title Başlık Index cards Item colors Border color: Corner color: Background Color: Ctrl+S Ctrl+S Image: Text editor Font Family: Size: Misspelled: Background: Paragraphs Line spacing: Satır aralığı: Single 1.5 lines Double Proportional % Tab width: px Indent 1st line Spacing: New Edit Delete Theme name: Apply Cancel Window Background Text Background Text Options Paragraph Options Type: No Image Tiled Centered Stretched Scaled Zoomed Opacity: Position: Left Center Right Width: Corner radius: Margins: Padding: Font: Style Cursor Use block insertion of Alignment: Justify Alignment Icon Size TextLabel Disable blinking Text area Max width Left/Right margins: Top/Bottom margins: S&how progress Show summar&y Show p&rogress Old st&yle Transparent Restore defaults Style: Language: Font size: Yazı tipi boyutu: Restarting Manuskript ensures all settings take effect. Show &word count &Show word count &New style Typewriter mode Focus mode None Sentence Line Paragraph <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions &Add to dictionary &Remove from custom dictionary about About Manuskript Manuskript aboutDialog Version Software Versions in Use: abstractModel Title Başlık POV Label Status Durum Compile Word count Goal Amaç basicItemView Form POV: Goal: Word count One line summary Few sentences summary: characterModel New character Name İsim Value characterTreeView Main Secondary Minor cheatSheet Form Filter (type the name of anything in your project) Minor Secondary Main Characters Karakterler Texts Plots World Evren cmbOutlineCharacterChoser None Main Secondary Minor Various cmbOutlineLabelChoser Various cmbOutlineStatusChoser Various collapsibleDockWidgets Dock Widgets Toolbar completer Form corkDelegate One line summary Full summary Tam özet editorWidget_ui Form exporter Export Export to: Manage exporters Preview Settings Ayarlar exporterDialog {} (not implemented yet) exporterSettings Form Content Decide here what will be included in the final export. Type Title Başlık Text I need more granularity Fi&lters <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> Ignore compile status (include all items) Subitems of: Labels Etiketler Status Durum Separations Between folders: Empty line Custom Between texts: Between folder and text: Between text and folder: Transformations Typographic replacements: Replace double quotes (") with: Replace single quotes (') with: Remove multiple spaces Custom replacements: Enabled Replace With RegExp If checked, uses regular expression for replacement. If unchecked, replaced as plain text. Preview Font Font: Font size: Yazı tipi boyutu: Folder {}Level {} folder {}Level {} text Replace ... with … Replace --- with — exportersManager Installed Custom Not found {} not found. Install it, or set path manually. <b>Status:</b> uninstalled. <b>Requires:</b> Set {} executable path. frequencyAnalyzer Phrases Frequency Word fullScreenEditor Theme: {} words / {} {} words Spellcheck Navigation New Text Title Başlık Title: Show Full Path Theme selector Word count Progress Progress: Auto Show/Hide Clock Clock: Show Seconds generalSettings General Genel Split scenes at: \n---\n Trim long titles (> 32 chars) Import under: Import in a top-level folder helpLabel If you don't wanna see me, you can hide me in Help menu. importer Import Format: Choose file Clear file Preview Settings Ayarlar lastAccessedDirectoryInfo Last accessed directory "{}" loaded. lineEditView Various locker Form Lock screen: Word target Time target words minutes Lock ! ~{} h. ~{} mn. {}:{} {} s. {} remaining {} words remaining mainEditor Form Text Index cards Outline Taslak F11 Go to parent item Alt+Up Root {} words / {} {} words markdownSettings Markdown metadataView Form Properties Summary Özet One line summary Full summary Tam özet Notes / References Revisions myPanel Auto-hide outlineBasics Set POV None Set Status Set Label New Main Secondary Minor Set Custom Icon Restore to default Root Open {} items in new tabs Open {} in a new tab About to remove <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> Select at least two items. Folders are ignored. All items must be on the same level (share the same parent). New &Folder New &Text &Copy C&ut &Paste &Rename &Delete outlineCharacterDelegate None Main Secondary Minor outlineItem {} words / {} ({}) {} words pandocSettings General Genel Table of Content Custom settings for {} persosProxyModel Main Secondary Minors plotDelegate General Genel Promise Problem Progress Resolution Try / Fail No and Yes but Freytag's pyramid Exposition Rising action Climax Falling action Three acts 1. Setup 1. Inciting event 1. Turning point 2. Choice 2. Reversal 2. Disaster 3. Stand up 3. Climax 3. Ending Hero's journey Ordinary world Call to adventure Refusal of the call Meeting with mentor Tests Approach Abyss Reward / Revelation Transformation Atonement Return plotModel New plot Name İsim Meta New step Main Secondary Minor plotTreeView Main Secondary Minor **Plot:** {} plotsProxyModel Main Secondary Minors propertiesView Form POV Status Durum Label Compile Goal Amaç Word count references Not a reference: {}. Unknown reference: {}. Path: Stats: POV: Status: Durum: Label: Short summary: Long summary: Notes: Basic info Temel bilgiler Detailed info Detaylı bilgi POV of: Go to {}. Description Tanım Result Sonuç Characters Karakterler Resolution steps Çözülme adımları Passion Conflict Çatışma <b>Unknown reference:</b> {}. Folder: <b>{}</b> Text: <b>{}</b> Character: <b>{}</b> Plot: <b>{}</b> World: <b>{name}</b>{path} Referenced in: Motivation Motivasyon Goal Amaç Epiphany Tezahür Short summary Longer summary revisions Form Options Restore Delete Show modifications Show ancient version Show spaces Show modifications only {} years ago {} months ago {} days ago 1 day ago {} hours ago {} minutes ago {} seconds ago Line {}: Clear all search Form Search for... Search in: All Title Başlık Text Summary Özet Notes Notlar POV Status Durum Label Options: Case sensitive settingsWindow New status New label newtheme New theme (read-only) Open Image Image files (*.jpg; *.jpeg; *.png) Error Hata Unable to load selected file Unable to add selected image: {} sldImportance Form TextLabel Minor Secondary Main splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> Split '{}' Split items storylineView Form Show Plots Show Characters tabSplitter Open selected items in that view. Split horizontally Close split Split vertically textEditView Various textFormat Form CTRL+B CTRL+I CTRL+U CTRL+P CTRL+L CTRL+E CTRL+R CTRL+J treeView Expand {} Collapse {} Expand All Collapse All welcome Form 1 Templates Empty Novel Novella Short Story Research paper Demo projects Add level Add word count Next time, automatically open last project Open... Recent Create Open project Manuskript project (*.msk);;All files (*) Save project as... Manuskript project (*.msk) Manuskript Create New Project Warning Overwrite existing project {} ? Empty fiction Chapter Scene Trilogy Book Section Empty non-fiction words each. of Text Something <b>Total:</b> {} words (~ {} pages) Fiction Non-fiction Idea Note Research TODO First draft Second draft Final worldModel New item Fantasy world building Physical Climate Topography Astronomy Wild life Flora History Races Diseases Cultural Customs Food Languages Education Dresses Science Calendar Bodily language Ethics Religion Government Politics Gender roles Music and arts Architecture Military Technology Courtship Demography Transportation Medicine Magic system Rules Organization Magical objects Magical places Magical races Important places Important objects Natural resources manuskript-0.10.0/i18n/manuskript_uk.qm000066400000000000000000000674461354442177200200310ustar00rootroot00000000000000bnQBpR ~F~S~ZF]RGFR0K$0UG0]1 27$a0BCb1~OrJ3Ђ=ϗYϗZϗ\\/°^@[% ^V]HAE MPb]d~2?~2X~2aaO:d~7 F> Mg3 MgB Mgb3 ^K ^U ^[ ^` OZ շ # 9sF 9sTX 9s] dpe@ dpeSW dpeW> dpe`j n*2 B;# : :d ,67 ,_ 8P 8^ 8d N = U~. }j! t8 H9 H_X fO PK  G9 ڔ. W CjP GZ i?M }.; !Tf   G $ $G $W $e %21 #N s" sU sY s\ 6 . 4}" 5N DYA) DZAl K .36 S ^N Ğt5 <E <S <\! <_ <_ ⋙I eCQ2)?A6e>9IHMUhEVY8^ {L S; d>JBxS/:R_>R_ard@Ht/8'i0if*h<p>030;L=89 :>=25@B5@ 4>:C<5=BV2. 8< <>6=0 :>=25@BC20B8 markdown C 157;VG V=H8E D>@<0BV2.</p> <p>!B>@V=:0: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> 

A universal document converter. Can be used to convert markdown to a wide range of other formats.

Website: http://pandoc.org/

Export0;>2V4><89 V 7@V4:0 28:>@8AB>2C20=89 D>@<0B. /:VAL B0< 251-A09B8, 25;8:5 482>.EA little known format modestly used. You know, web sites for example.Exportt28G09=89 282V4 HTML 7 C6820==O< <>4C;O Python 'markdown'.5Basic HTML output using the Python module 'markdown'.ExportF=86:8, I> 2>=8 =5 21820NBL 45@520.Books that don't kill trees.Export ;0A:Class:Export(>=25@BC20B8 C ePUB3Convert to ePUB3Export"8?>289 5:A?>@B5@, =040T 107>2V D>@<0B8, I> WE C6820NBL V=HV 5:A?>@B5@8.ADefault exporter, provides basic formats used by other exporters.Exportx8<:=CB8 1;>: <5B040=8E YAML. 15@VBL C @07V ?><8;:8 7 YAML.DDisable YAML metadata block. Use that if you get YAML related error.Export><8;:0ErrorExport:A?>@B C markdown 70 4>?><>3>N pandoc. 040T 1V;LH5 <>6;82>AB59 D>@<0BC20==O, =V6 7030;L=89 5:A?>@B5@.hExport to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter.Export >7<V@ H@8DBC: Font size:Export82V4 HTML HTML OutputExport(8EV4=89 :>4 =0 HTML HTML SourceExport:;NG8B8 7<VAB.Include a table of contents.Export!E>60 =0 728G09=89 B5:AB, 0;5 =040T 703>;>2:8 markdown. @8?CA:0T, I> B5:AB D>@<0B>20=> =0 markdown.Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown.ExportH CHV9 LaTeX 4;O AB2>@5==O D09;C PDF.%LaTeX engine used to produce the PDF.ExportLaTeX - F5 B5:AB>289 ?@>F5A>@ V <>20 @>7<VB:8 40=8E 4;O AB2>@5==O 30@=8E 4>:C<5=BV2.LaTeX is a word processor and document markup language used to create beautiful documents.Export*V6@O4:>289 V=B5@20;: Line spacing:Export08EV4=89 :>4 =0 MarkdownMarkdown sourceExportD>:C<5=B Microsoft Office (.docx)."Microsoft Office (.docx) document.Export6LaTeX <0T 1CB8 2AB0=>2;5=>.Needs LaTeX to be installed.ExportJ'8ABVH89 4>:C<5=B (28?@028B8 ?><8;:8) Normalize the document (cleaner)Exportb V25=L ?V4@>74V;V2, I> WE 1C45 4>40=> 4> 7<VABC: ,Number of sections level to include in TOC: Exportz$>@<0B OpenDocument. 0?@8:;04, =8< :>@8ABCTBLAO LibreOffice.5OpenDocument format. Used by LibreOffice for example.Export$>@<0B 0@:CH0: Paper size:Export28G09=89 B5:AB Plain textExport@>?5@54=V9 ?5@53;O4 V7 <0@:5@><.Preview with highlighter.Export2>4C;L Python 'markdown'.Python module 'markdown'.Exportn09?@>ABVH89 5:A?>@B C 728G09=89 B5:AB. >72>;OT 28:>@8ABC20B8 2;0A=V <>28 @>7<VB:8, I> WE =5 ?V4B@8<CT manuskript, =0?@8:;04 <a href='www.fountain.io'>Fountain</a>.Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example Fountain.ExportL#:06VBL ?>G0B:>289 @V25=L 703>;>2:V2: $Specify the base level for headers: ExportF:@5<89 4>:C<5=B (=5 ;8H5 D@03<5=B))Standalone document (not just a fragment)Export&59 D>@<0B ?@87=0G5=89 =0 >1<V= V=D>@<0FVTN <V6 AB@C:BC@870B>@0<8 B0 V=B5@=5B-A;C610<8, O:V <>6=0 ?5@53;O40B8 G8 :>=B@>;N20B8 70 4>?><>3>N AB@C:BC@870B>@0.The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner.Export:8?@028B8 @57C;LB0B 4;O 4@C:CTypographically correct outputExportR8:>@8ABC20B8 B53 <p> 4;O F8BC20=L C HTMLUse tags for quotes in HTMLExportL8:>@8ABC20B8 atx-703>;>2:8 (# @0B:8)Use ATX-style headersExportb8:>@8ABC20B8 28=>A:8 70<VABL 21C4>20=8E ?>A8;0=L1Use reference-style links instead of inline linksExport2AB0=>2;5=89 @>1>G89 48AB@81CB82 LaTeX. 5@52V@B5 @5:><5=40FVW pandoc =0: <a href="http://pandoc.org/installing.html">http://pandoc.org/installing.html</a>. /:I> 28 ?>B@51CTB5 ?V4B@8<:8 unicode, >15@VBL xelatex.a valid LaTeX installation. Pandoc recommendations can be found on: pandoc.org/installing.html. If you want Unicode support, you need XeLaTeX.ExportjreStructuredText T ?>;53H5=>N <>2>N @>7<VB:8 40=8E...2reStructuredText is a lightweight markup language.Export......ExportersManager?8A DescriptionExportersManager*5@C20B8 5:A?>@B5@0<8Manage ExportersExportersManager0=CA:@8?B ManuskriptExportersManager&>65 5:A?>@BC20B8 COffers export toExportersManager (;OE:Path:ExportersManager!B0=StatusExportersManager !B0=:Status:ExportersManager5@AVO:Version:ExportersManager{"5:AB>2V4:8} {HelpText}ExportersManager=0;V7C20B8AnalyzeFrequencyAnalyzerN5 2@0E>2C20B8 A;>20 (@>74V;5=V :><>N): Exclude words (comma separated):FrequencyAnalyzer '0AB>B=89 0=0;V7Frequency AnalyzerFrequencyAnalyzer&V=V<0;L=89 @>7<V@: Minimum size:FrequencyAnalyzer&V;L:VABL A;V2: 2V4Number of words: fromFrequencyAnalyzer '0AB>B0 28A;>2V2Phrase frequencyFrequencyAnalyzer0;0HBC20==OSettingsFrequencyAnalyzer'0AB>B0 A;V2Word frequencyFrequencyAnalyzer4>toFrequencyAnalyzerR<b>=D>:</b> C65 ?@>AB89 0=0;V70B>@, O:89 ?@>945 4>:C<5=B>< markdown V AB2>@8BL 5;5<5=B8 =0 :>6=89 703>;>2>:.<br/>&nbsp;Info: A very simple parser that will go through a markdown document and create items for each titles.
 Import<b>Info:</b> 0=CA:@8?B <>65 V<?>@BC20B8 7 <b>markdown</b> G8 <b>OPML</b>. Pandoc :>=25@BCT 20H 4>:C<5=B C 1C4L-O:89 7 =8E (482. ?0@0<5B@8), V V<?>@BCT @57C;LB0B C 0=CA:@8?B. 48= V7 42>E <>65 40B8 :@0I89 @57C;LB0B 70;56=> 2V4 465@5;L=>3> 4>:C<5=BC. <br/>&nbsp;}Info: Manuskript can import from markdown or OPML. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document.
 Import<p><b>=D>:</b> <?>@BCT AB@C:BC@C B5: FV;:><. "5:8 1C45 4>40=> O: B5:8, 0 2=CB@VH=V 4>:C<5=B8 728G09=>3> B5:ABC (28 >18@0TB5, O:V A0<5 70 B8?>< D09;C) O: AF5=8.</p> <p>V4B@8<C20=> ;8H5 B5:AB>2V D09;8, 0 =5 7>1@065==O, 42V9:>2V B>I>.</p>R

Info: Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.

Only text files are supported (not images, binary or others).

Import2=0G5==O, @>74V;5=V :><>NComma separated valuesImport25 240;>AO 2V4:@8B8 D09;.File open failed.Import<?>@B B5:8 Folder importImport0<?>@BC20B8 B5:C V D09;8Import folder then filesImport,<?>@BC20B8 ?>@048 O::Import tip as:Import(<?>@B 70 4>?><>3>N: Import using:ImportD:;NG8B8 ;8H5 =0ABC?=V @>7H8@5==O:Include only those extensions:Import2<?>@BC20B8 D09; markdownMarkdown importImport"<?>@B <0?8 4C<>:Mind Map ImportImport"<?>@B <0?8 4C<>:Mind Map importImport<?>@B OPML OPML ImportImport<?>@B pandoc Pandoc importImport8!>@BC20B8 5;5<5=B8 70 =072>NSort items by nameImportT&5 =5 ?@8?CAB8<89 D>@<0B D09;C <0?8 4C<>:.1This does not appear to be a valid Mind Map file.ImportL40TBLAO, F5 =5 ?@8?CAB8<89 D09; OPML.-This does not appear to be a valid OPML file.Import57 =0728UntitledImport"5@5=>A8B8 @O4:8: Wrap lines:Import$AB028B8 ?>A8;0==OInsert referenceMDEditCompleter (~{} AB>@V=>:) (~{} pages) MainWindowD * {} =5 7=0945=> C D09;V ?@>5:BC.# * {} wasn't found in project file. MainWindow&@> ?@>3@0<C&About MainWindow&(?0@30;:0 &Cheat sheet MainWindow&0:@8B8 ?@>5:B&Close project MainWindow&8;CG8B8&Delete MainWindow& 5403C20B8&Edit MainWindow&&%C4>6=O ;VB5@0BC@0&Fiction MainWindow &$09;&File MainWindow*&'0AB>B=89 0=0;V70B>@&Frequency Analyzer MainWindow&>?><>30&Help MainWindow&>7=0G:8... &Labels... MainWindow & 568<&Mode MainWindow&5@5EV4 &Navigation MainWindow&V4:@8B8&Open MainWindow &8EV4&Quit MainWindow&5I>402=V&Recent MainWindow&5@59<5=C20B8&Rename MainWindow&15@53B8&Save MainWindow4&>:07C20B8 B5:AB8 4>2V4:8&Show help texts MainWindow&@>AB89&Simple MainWindow(&5@52V@:0 ?@02>?8AC &Spellcheck MainWindow&!B0=... &Status... MainWindow&=0@O44O&Tools MainWindow&5@53;O=CB8&View MainWindow<html><head/><body><p align="right">5@5:07 >4=8<<br/>0170F><</p></body></html>O

One paragraph
summary

 MainWindow<html><head/><body><p align="right">5@5:07 >4=8<<br/>@5G5==O<</p></body></html>N

One sentence
summary

 MainWindow@> 0=CA:@8?BAbout Manuskript MainWindow 2B>@Author MainWindow";> Background MainWindow>;V@ B;0Background color MainWindow&030;L=0 V=D>@<0FVO Basic info MainWindow*=D>@<0FVO ?@> :=86:CBook information MainWindow,!B8A;89 ?5@5:07 :=86:8 Book summary MainWindow  0<:0Border MainWindow5@A>=06(-V) Character(s) MainWindow5@A>=06V Characters MainWindow:A&?>@BC20B8Co&mpile MainWindow:A?>@BCompile MainWindow>=D;V:BConflict MainWindowCBCorner MainWindow Ctrl+OCtrl+O MainWindow Ctrl+QCtrl+Q MainWindow Ctrl+SCtrl+S MainWindowCtrl+Shift+B Ctrl+Shift+B MainWindowCtrl+Shift+S Ctrl+Shift+S MainWindow0;03>48B8Debug MainWindow8;CG8B8Del MainWindow?8A Description MainWindow&>:;04=0 V=D>@<0FVO Detailed info MainWindow 540:B>@Editor MainWindow ;5:B@>==0 ?>HB0Email MainWindow@>OA=5==OEpiphany MainWindow >728=LB5 4> 0170FC :>6=5 @5G5==O 7 20H>3> ?5@5:07C >4=8< 0170F><AExpand each sentence of your one paragraph summary to a paragraph MainWindowF2F2 MainWindowF6F6 MainWindowF7F7 MainWindowF8F8 MainWindowF9F9 MainWindow$V;LB@C20B8Filter MainWindow &V;:><Full MainWindow030;L=89 >?8A Full summary MainWindow030;L=5General MainWindow0=@Genre MainWindow5B0Goal MainWindow =0G>:Icon MainWindow>;V@ ?>7=0G:8 Icon color MainWindow=0G=VABL Importance MainWindow0B0;>3 Index cards MainWindow>7=0G:0Label MainWindow>7=0G:8Labels MainWindowVF5=7VOLicense MainWindow0=CA:@8?B Manuskript MainWindow5B040=VMetadata MainWindow V;LH5More MainWindow>B820FVO Motivation MainWindow<'OName MainWindow <5=0Names MainWindow0;VNext MainWindow>B0B:8Notes MainWindow4=0 AB>@V=:0One page MainWindow05@5:07 >4=VTN AB>@V=:>NOne page summary MainWindow48= 0170F One paragraph MainWindow*5@5:07 >4=8< 0170F><One paragraph summary MainWindow4=5 @5G5==O One sentence MainWindow,5@5:07 >4=8< @5G5==O<One sentence summary MainWindow 1@8AOutline MainWindow ?>3;O4CPOV MainWindow !N65BPlot MainWindow !N65B8Plots MainWindow!B0=Progress MainWindow5@52> ?@>5:BC Project tree MainWindowV@>5:B {} 7020=B065=> 7 :V;L:><0 ?><8;:0<8.#Project {} loaded with some errors. MainWindowV@>5:B {} 7020=B065=> 7 :V;L:><0 ?><8;:0<8:#Project {} loaded with some errors: MainWindow,@>5:B {} 7020=B065=>.Project {} loaded. MainWindow(@>5:B {} 715@565=>.Project {} saved. MainWindow*@>:8 @>728B:C AN65BCResolution steps MainWindow 57C;LB0BResult MainWindow&0;0HBC20==O S&ettings MainWindow15@5&3B8 O:... Sa&ve as... MainWindow(C:0&B8Sea&rch MainWindow !5@VOSeries MainWindow!8BC0FVO: Situation: MainWindow"65@5;> :>=D;V:BCSource of conflict MainWindowV4703>;>2>:Subtitle MainWindow!B8A;89 ?5@5:07Summary MainWindow !B8A;89 ?5@5:07:Summary: MainWindow "5:ABText MainWindow>;V@ B5:ABC Text color MainWindow 0720Title MainWindow 5@52>Tree MainWindow"><Volume MainWindow<#: @>5:B {} =5 715@565=>.WARNING: Project {} not saved. MainWindow)> O:...? What if...? MainWindow!;V2: {}{} Words: {}{} MainWindow!2VBWorld MainWindow";> BackgroundSettings:A?>@BCompileSettings Ctrl+SCtrl+SSettings >7<V@ H@8DBC: Font size:Settings030;L=5GeneralSettings5B0GoalSettings0B0;>3 Index cardsSettings>7=0G:0LabelSettings>7=0G:8LabelsSettings*V6@O4:>289 V=B5@20;: Line spacing:Settings 1@8AOutlineSettings ?>3;O4CPOVSettings!B0=ProgressSettings0;0HBC20==OSettingsSettings!B0=StatusSettings "5:ABTextSettings 0720TitleSettings 5@52>TreeSettings@> 0=CA:@8?BAbout Manuskriptabout0=CA:@8?B Manuskriptabout:A?>@BCompile abstractModel5B0Goal abstractModel>7=0G:0Label abstractModel ?>3;O4CPOV abstractModel!B0=Status abstractModel 0720Title abstractModel<'ONamecharacterModel5@A>=06V Characters cheatSheet !N65B8Plots cheatSheet!2VBWorld cheatSheet030;L=89 >?8A Full summary corkDelegate&>?5@54=V9 ?5@53;O4Previewexporter0;0HBC20==OSettingsexporter#2V<:=5=>EnabledexporterSettings >7<V@ H@8DBC: Font size:exporterSettings>7=0G:8LabelsexporterSettings&>?5@54=V9 ?5@53;O4PreviewexporterSettings!B0=StatusexporterSettings "5:ABTextexporterSettings 0720TitleexporterSettings!B0=ProgressfullScreenEditor 0720TitlefullScreenEditor030;L=5GeneralgeneralSettings&>?5@54=V9 ?5@53;O4Previewimporter0;0HBC20==OSettingsimporter E28;8= minuteslocker*060=0 :V;L:VABL A;V2 Word targetlocker ~{} 3.~{} h.locker~{} E2.~{} mn.locker0B0;>3 Index cards mainEditor 1@8AOutline mainEditor "5:ABText mainEditor{} A;V2  {} words  mainEditor030;L=89 >?8A Full summary metadataView!B8A;89 ?5@5:07Summary metadataView&8;CG8B8&Delete outlineBasics&5@59<5=C20B8&Rename outlineBasics030;L=5GeneralpandocSettings030;L=5General plotDelegate!B0=Progress plotDelegate<'OName plotModel:A?>@BCompilepropertiesView5B0GoalpropertiesView>7=0G:0LabelpropertiesView ?>3;O4CPOVpropertiesView!B0=StatuspropertiesView&030;L=0 V=D>@<0FVO Basic info references5@A>=06V Characters references>=D;V:BConflict references?8A Description references&>:;04=0 V=D>@<0FVO Detailed info references@>OA=5==OEpiphany references5B0Goal references>B820FVO Motivation references (;OE:Path: references*@>:8 @>728B:C AN65BCResolution steps references 57C;LB0BResult references !B0=:Status: references>7=0G:0Labelsearch>B0B:8Notessearch ?>3;O4CPOVsearch!B0=Statussearch!B8A;89 ?5@5:07Summarysearch "5:ABTextsearch 0720Titlesearch><8;:0ErrorsettingsWindow0=CA:@8?B Manuskriptwelcome "5:ABTextwelcome ) , manuskript-0.10.0/i18n/manuskript_uk.ts000066400000000000000000005602021354442177200200260ustar00rootroot00000000000000 Export Basic HTML output using the Python module 'markdown'. Звичайний вивід HTML з уживанням модуля Python 'markdown'. Python module 'markdown'. Модуль Python 'markdown'. Markdown source Вихідний код на Markdown HTML Source Вихідний код на HTML HTML Output Вивід HTML Default exporter, provides basic formats used by other exporters. Типовий експортер, надає базові формати, що їх уживають інші експортери. Preview with highlighter. Попередній перегляд із маркером. Plain text Звичайний текст A little known format modestly used. You know, web sites for example. Маловідомий і зрідка використовуваний формат. Якісь там веб-сайти, велике диво. Needs LaTeX to be installed. LaTeX має бути встановлено. Error Помилка Standalone document (not just a fragment) Окремий документ (не лише фрагмент) Include a table of contents. Включити зміст. Number of sections level to include in TOC: Рівень підрозділів, що їх буде додано до змісту: Typographically correct output Виправити результат для друку Normalize the document (cleaner) Чистіший документ (виправити помилки) Specify the base level for headers: Укажіть початковий рівень заголовків: Use reference-style links instead of inline links Використувати виноски замість вбудованих посилань Use ATX-style headers Використувати atx-заголовки (# ґратки) Use <q> tags for quotes in HTML Використувати тег <p> для цитувань у HTML LaTeX engine used to produce the PDF. Рушій LaTeX для створення файлу PDF. Paper size: Формат аркуша: Font size: Розмір шрифту: Class: Клас: Line spacing: Міжрядковий інтервал: Books that don't kill trees. Книжки, що вони не вбивають дерева. OpenDocument format. Used by LibreOffice for example. Формат OpenDocument. Наприклад, ним користується LibreOffice. Microsoft Office (.docx) document. Документ Microsoft Office (.docx). reStructuredText is a lightweight markup language. reStructuredText є полегшеною мовою розмітки даних... Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. Схожа на звичайний текст, але надає заголовки markdown. Припускає, що текст форматовано на markdown. Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. Найпростіший експорт у звичайний текст. Дозволяє використувати власні мови розмітки, що їх не підтримує manuskript, наприклад <a href='www.fountain.io'>Fountain</a>. <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> <p>Загальний конвертер документів. Ним можна конвертувати markdown у безліч інших форматів.</p> <p>Сторінка: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. встановлений робочий дистрибутив LaTeX. Перевірте рекомендації pandoc на: <a href="http://pandoc.org/installing.html">http://pandoc.org/installing.html</a>. Якщо ви потребуєте підтримки unicode, оберіть xelatex. Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. Експорт у markdown за допомогою pandoc. Надає більше можливостей форматування, ніж загальний експортер. LaTeX is a word processor and document markup language used to create beautiful documents. LaTeX - це текстовий процесор і мова розмітки даних для створення гарних документів. The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. Цей формат призначений на обмін інформацією між структуризаторами та інтернет-службами, які можна переглядати чи контролювати за допомогою структуризатора. Disable YAML metadata block. Use that if you get YAML related error. Вимкнути блок метаданих YAML. Оберіть у разі помилки з YAML. Convert to ePUB3 Конвертувати у ePUB3 Self-contained HTML files, with no dependencies Could not process regular expression: {} Choose output file… ExportersManager Manage Exporters Керувати експортерами Manuskript Манускрипт Description Опис Offers export to Може експортувати у Status Стан Status: Стан: Version: Версія: Path: Шлях: ... ... {HelpText} {ТекстДовідки} FrequencyAnalyzer Frequency Analyzer Частотний аналіз Word frequency Частота слів Settings Налаштування Minimum size: Мінімальний розмір: Exclude words (comma separated): Не враховувати слова (розділені комою): Analyze Аналізувати Phrase frequency Частота висловів Number of words: from Кількість слів: від to до Import Markdown import Імпортувати файл markdown <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; <b>Інфо:</b> Дуже простий аналізатор, який пройде документом markdown і створить елементи на кожний заголовок.<br/>&nbsp; Folder import Імпорт теки <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> <p><b>Інфо:</b> Імпортує структуру тек цілком. Теки буде додано як теки, а внутрішні документи звичайного тексту (ви обираєте, які саме за типом файлу) як сцени.</p> <p>Підтримувано лише текстові файли, а не зображення, двійкові тощо.</p> Include only those extensions: Включити лише наступні розширення: Comma separated values Значення, розділені комою Sort items by name Сортувати елементи за назвою Import folder then files Імпортувати теку і файли OPML Import Імпорт OPML File open failed. Не вдалося відкрити файл. This does not appear to be a valid OPML file. Здається, це не припустимий файл OPML. Pandoc import Імпорт pandoc <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; <b>Info:</b> Манускрипт може імпортувати з <b>markdown</b> чи <b>OPML</b>. Pandoc конвертує ваш документ у будь-який з них (див. параметри), і імпортує результат у Манускрипт. Один із двох може дати кращий результат залежно від джерельного документу. <br/>&nbsp; Import using: Імпорт за допомогою: Wrap lines: Переносити рядки: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> Mind Map Import Імпорт мапи думок This does not appear to be a valid Mind Map file. Це не припустимий формат файлу мапи думок. Mind Map import Імпорт мапи думок Import tip as: Імпортувати поради як: Untitled Без назви MDEditCompleter Insert reference Вставити посилання MainWindow General Загальне Title Назва Subtitle Підзаголовок Series Серія Volume Том Genre Жанр License Ліцензія Author Автор Name Ім'я Email Електронна пошта Summary Стислий переказ Situation: Ситуація: Summary: Стислий переказ: One sentence Одне речення One paragraph Один абзац One page Одна сторінка Full Цілком One sentence summary Переказ одним реченням One paragraph summary Переказ одним абзацом Expand each sentence of your one paragraph summary to a paragraph Розвиньте до абзацу кожне речення з вашого переказу одним абзацом One page summary Переказ однією сторінкою Full summary Загальний опис Next Далі What if...? Що як...? Characters Персонажі Names Імена Filter Фільтрувати Basic info Загальна інформація Importance Значність Motivation Мотивація Goal Мета Conflict Конфлікт Epiphany Прояснення <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="right">Переказ одним<br/>реченням</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> <html><head/><body><p align="right">Переказ одним<br/>абзацом</p></body></html> Notes Нотатки Detailed info Докладна інформація Plots Сюжети Plot Сюжет Character(s) Персонаж(-і) Description Опис Result Результат Resolution steps Кроки розвитку сюжету World Світ Populates with empty data More Більше Source of passion Source of conflict Джерело конфлікту Outline Обрис Editor Редактор Debug Налагодити FlatData Persos Labels Позначки &File &Файл &Recent &Нещодавні &Help &Допомога &Tools &Знаряддя &Edit &Редагувати &View &Переглянути &Mode &Режим &Cheat sheet &Шпаргалка Sea&rch Шука&ти &Navigation &Перехід &Open &Відкрити Ctrl+O Ctrl+O &Save &Зберегти Ctrl+S Ctrl+S Sa&ve as... Збере&гти як... Ctrl+Shift+S Ctrl+Shift+S &Quit &Вихід Ctrl+Q Ctrl+Q &Show help texts &Показувати тексти довідки Ctrl+Shift+B Ctrl+Shift+B &Spellcheck &Перевірка правопису F9 F9 &Labels... &Позначки... &Status... &Стан... Tree Дерево &Simple &Простий &Fiction &Художня література Index cards Каталог S&ettings Н&алаштування F8 F8 &Close project &Закрити проект Co&mpile Екс&портувати F6 F6 &Frequency Analyzer &Частотний аналізатор Book information Інформація про книжку &About &Про програму About Manuskript Про Манускрипт Manuskript Манускрипт Project {} saved. Проект {} збережено. WARNING: Project {} not saved. УВАГА: Проект {} не збережено. Project {} loaded. Проект {} завантажено. Project {} loaded with some errors: Проект {} завантажено з кількома помилками: * {} wasn't found in project file. * {} не знайдено у файлі проекту. Project {} loaded with some errors. Проект {} завантажено з кількома помилками. (~{} pages) (~{} сторінок) Words: {}{} Слів: {}{} Book summary Стислий переказ книжки Project tree Дерево проекту Metadata Метадані Story line Enter information about your book, and yourself. The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Create your characters. Develop plots. Build worlds. Create hierarchy of broad categories down to specific details. Create the outline of your masterpiece. Write. Debug info. Sometimes useful. Dictionary Nothing POV З погляду Label Позначка Progress Стан Compile Експорт Icon color Колір позначки Text color Колір тексту Background color Колір тла Icon Значок Text Текст Background Тло Border Рамка Corner Кут Add plot step &Import… F7 F7 &Copy Ctrl+C C&ut Ctrl+X &Paste Ctrl+V &Split… Ctrl+Shift+K Sp&lit at cursor Ctrl+K Ctrl+M Ctrl+D Del Вилучити &Move Up Ctrl+Shift+Up M&ove Down Ctrl+Shift+Down Dupl&icate &Delete &Вилучити &Rename &Перейменувати F2 F2 Organi&ze M&erge Remove selected plot step(s) &Format &Header &Level 1 (setext) Ctrl+Alt+1 Level &2 Ctrl+Alt+2 Level &1 (atx) Ctrl+1 L&evel 2 Ctrl+2 Level &3 Ctrl+3 Level &4 Ctrl+4 Level &5 Ctrl+5 Level &6 Ctrl+6 &Bold Ctrl+B &Italic Ctrl+I &Strike &Verbatim Su&perscript Ctrl++ Subsc&ript Ctrl+- Co&mment block Ctrl+Shift+C Clear &formats Ctrl+0 &Comment line(s) &Ordered list &Unordered list B&lockquote The file {} does not exist. Has it been moved or deleted? Install {}{} to use spellcheck {} has no installed dictionaries {}{} is not installed Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings Settings Налаштування General Загальне Revisions Views Labels Позначки Status Стан Fullscreen General settings Application settings Loading Automatically load last project on startup Saving Automatically save every minutes. If no changes during seconds. Save on project close <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> Save to one single file Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. Keep revisions S&mart remove Keep: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. revisions per day for the last month revisions per minute for the last 10 minutes revisions per hour for the last day revisions per 10 minutes for the last hour revisions per week till the end of time Views settings Tree Дерево Colors Icon color: Nothing POV З погляду Label Позначка Progress Стан Compile Експорт Text color: Background color: Folders Show ite&m count Show summary &Nothing Text Текст Outline Обрис Visible columns Goal Мета Word count Percentage Title Назва Index cards Каталог Item colors Border color: Corner color: Background Тло Color: Ctrl+S Ctrl+S Image: Text editor Font Family: Size: Misspelled: Background: Paragraphs Line spacing: Міжрядковий інтервал: Single 1.5 lines Double Proportional % Tab width: px Indent 1st line Spacing: New Edit Delete Theme name: Apply Cancel Window Background Text Background Text Options Paragraph Options Type: No Image Tiled Centered Stretched Scaled Zoomed Opacity: Position: Left Center Right Width: Corner radius: Margins: Padding: Font: Style Cursor Use block insertion of Alignment: Justify Alignment Icon Size TextLabel Disable blinking Text area Max width Left/Right margins: Top/Bottom margins: S&how progress Show summar&y Show p&rogress Old st&yle Transparent Restore defaults Style: Language: Font size: Розмір шрифту: Restarting Manuskript ensures all settings take effect. Show &word count &Show word count &New style Typewriter mode Focus mode None Sentence Line Paragraph <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions &Add to dictionary &Remove from custom dictionary about About Manuskript Про Манускрипт Manuskript Манускрипт aboutDialog Version Software Versions in Use: abstractModel Title Назва POV З погляду Label Позначка Status Стан Compile Експорт Word count Goal Мета basicItemView Form POV: Goal: Word count One line summary Few sentences summary: characterModel New character Name Ім'я Value characterTreeView Main Secondary Minor cheatSheet Form Filter (type the name of anything in your project) Minor Secondary Main Characters Персонажі Texts Plots Сюжети World Світ cmbOutlineCharacterChoser None Main Secondary Minor Various cmbOutlineLabelChoser Various cmbOutlineStatusChoser Various collapsibleDockWidgets Dock Widgets Toolbar completer Form corkDelegate One line summary Full summary Загальний опис editorWidget_ui Form exporter Export Export to: Manage exporters Preview Попередній перегляд Settings Налаштування exporterDialog {} (not implemented yet) exporterSettings Form Content Decide here what will be included in the final export. Type Title Назва Text Текст I need more granularity Fi&lters <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> Ignore compile status (include all items) Subitems of: Labels Позначки Status Стан Separations Between folders: Empty line Custom Between texts: Between folder and text: Between text and folder: Transformations Typographic replacements: Replace double quotes (") with: Replace single quotes (') with: Remove multiple spaces Custom replacements: Enabled Увімкнено Replace With RegExp If checked, uses regular expression for replacement. If unchecked, replaced as plain text. Preview Попередній перегляд Font Font: Font size: Розмір шрифту: Folder {}Level {} folder {}Level {} text Replace ... with … Replace --- with — exportersManager Installed Custom Not found {} not found. Install it, or set path manually. <b>Status:</b> uninstalled. <b>Requires:</b> Set {} executable path. frequencyAnalyzer Phrases Frequency Word fullScreenEditor Theme: {} words / {} {} words Spellcheck Navigation New Text Title Назва Title: Show Full Path Theme selector Word count Progress Стан Progress: Auto Show/Hide Clock Clock: Show Seconds generalSettings General Загальне Split scenes at: \n---\n Trim long titles (> 32 chars) Import under: Import in a top-level folder helpLabel If you don't wanna see me, you can hide me in Help menu. importer Import Format: Choose file Clear file Preview Попередній перегляд Settings Налаштування lastAccessedDirectoryInfo Last accessed directory "{}" loaded. lineEditView Various locker Form Lock screen: Word target Бажана кількість слів Time target words minutes хвилин Lock ! ~{} h. ~{} г. ~{} mn. ~{} хв. {}:{} {} s. {} remaining {} words remaining mainEditor Form Text Текст Index cards Каталог Outline Обрис F11 Go to parent item Alt+Up Root {} words / {} {} words {} слів markdownSettings Markdown metadataView Form Properties Summary Стислий переказ One line summary Full summary Загальний опис Notes / References Revisions myPanel Auto-hide outlineBasics Set POV None Set Status Set Label New Main Secondary Minor Set Custom Icon Restore to default Root Open {} items in new tabs Open {} in a new tab About to remove <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> Select at least two items. Folders are ignored. All items must be on the same level (share the same parent). New &Folder New &Text &Copy C&ut &Paste &Rename &Перейменувати &Delete &Вилучити outlineCharacterDelegate None Main Secondary Minor outlineItem {} words / {} ({}) {} words pandocSettings General Загальне Table of Content Custom settings for {} persosProxyModel Main Secondary Minors plotDelegate General Загальне Promise Problem Progress Стан Resolution Try / Fail No and Yes but Freytag's pyramid Exposition Rising action Climax Falling action Three acts 1. Setup 1. Inciting event 1. Turning point 2. Choice 2. Reversal 2. Disaster 3. Stand up 3. Climax 3. Ending Hero's journey Ordinary world Call to adventure Refusal of the call Meeting with mentor Tests Approach Abyss Reward / Revelation Transformation Atonement Return plotModel New plot Name Ім'я Meta New step Main Secondary Minor plotTreeView Main Secondary Minor **Plot:** {} plotsProxyModel Main Secondary Minors propertiesView Form POV З погляду Status Стан Label Позначка Compile Експорт Goal Мета Word count references Not a reference: {}. Unknown reference: {}. Path: Шлях: Stats: POV: Status: Стан: Label: Short summary: Long summary: Notes: Basic info Загальна інформація Detailed info Докладна інформація POV of: Go to {}. Description Опис Result Результат Characters Персонажі Resolution steps Кроки розвитку сюжету Passion Conflict Конфлікт <b>Unknown reference:</b> {}. Folder: <b>{}</b> Text: <b>{}</b> Character: <b>{}</b> Plot: <b>{}</b> World: <b>{name}</b>{path} Referenced in: Motivation Мотивація Goal Мета Epiphany Прояснення Short summary Longer summary revisions Form Options Restore Delete Show modifications Show ancient version Show spaces Show modifications only {} years ago {} months ago {} days ago 1 day ago {} hours ago {} minutes ago {} seconds ago Line {}: Clear all search Form Search for... Search in: All Title Назва Text Текст Summary Стислий переказ Notes Нотатки POV З погляду Status Стан Label Позначка Options: Case sensitive settingsWindow New status New label newtheme New theme (read-only) Open Image Image files (*.jpg; *.jpeg; *.png) Error Помилка Unable to load selected file Unable to add selected image: {} sldImportance Form TextLabel Minor Secondary Main splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> Split '{}' Split items storylineView Form Show Plots Show Characters tabSplitter Open selected items in that view. Split horizontally Close split Split vertically textEditView Various textFormat Form CTRL+B CTRL+I CTRL+U CTRL+P CTRL+L CTRL+E CTRL+R CTRL+J treeView Expand {} Collapse {} Expand All Collapse All welcome Form 1 Templates Empty Novel Novella Short Story Research paper Demo projects Add level Add word count Next time, automatically open last project Open... Recent Create Open project Manuskript project (*.msk);;All files (*) Save project as... Manuskript project (*.msk) Manuskript Манускрипт Create New Project Warning Overwrite existing project {} ? Empty fiction Chapter Scene Trilogy Book Section Empty non-fiction words each. of Text Текст Something <b>Total:</b> {} words (~ {} pages) Fiction Non-fiction Idea Note Research TODO First draft Second draft Final worldModel New item Fantasy world building Physical Climate Topography Astronomy Wild life Flora History Races Diseases Cultural Customs Food Languages Education Dresses Science Calendar Bodily language Ethics Religion Government Politics Gender roles Music and arts Architecture Military Technology Courtship Demography Transportation Medicine Magic system Rules Organization Magical objects Magical places Magical races Important places Important objects Natural resources manuskript-0.10.0/i18n/manuskript_zh_CN.qm000066400000000000000000001355671354442177200204130ustar00rootroot00000000000000H5aH5L>6L4T`TVENVEdVVEVE%VPsd6dz d=XgozE&?ZepsyJFf*$*y*y|**%J*0+E+f+-++!.393JDA[~GTHw9EJ-L7.LGRLbLbjM| MezIMezkMŅ1NW`MQ:LKRx2RxLsRx_Rx|Rx3TbaTbcTbdTb>TbTbTbTbT4eUj4UjWUltV':i4VdVTW66W6cAXS1YE.YȀZV,Z%WZʳZϳc[Y[ %?[ %Z[ %_[ %p[ %s[ % [ٵ\Z\ay\\\[S^i$@^i$cn2 2^x$-xK^YQBwJrH~u4(=$AD"D]"sDNE~%P2NyiMtS-3[6ݰ"dʯKl%"En~^YS^;Btd hz~hv}} PDf3!H##fҳmP.r2M[ h#Nul~L0W>&{1v3tc]UAI\VYWM]1}(^5i@t[yWI!78k.(^/ &)UXbdJxN!S ȳvƩ&nU0J E,]F_ylwp#l.~mNmq06rwb5pynnMn~nnooBosr8zTb"#IFZFjՈ6ZG6G:&R''J'{''((?(p()L)}))**A*r**G,,,HH, bH!]i]qGt%H b.ĚGnS{vvfD:0*j: / Ls?3}K5Mvv.!&$ ''32'3L'3l+15!w?5iy@V@VHuQhDVjWjjAj4jNlqsgHo}}Z)}ZMnTlmL49z40 VTGT?Tf:A+N%VSUjW_XoX ÊsT; t{<5?ߺ[ ~AYuA^7M` Jotc\lTU%Ēei&t3/tx9$Cs9CCsCLtM+&'M+9R!|Tun#l^m?$rm\=m_m`mtmmgbn=p@rz WgzO&~~I~j,Y*Zf]@ c2<a.@@pDžQ06x0OS0y֣{֝cKރIL:YYO1wZJ 2!N#sHa/zǹ<#t\)H]1~9G4NYrByS~Ђ#*ϗgϗmϗvU@PENOSL;uk%°^ ÈvlУlX2 zlsP.ww ?'ju33 7U_BnuBL*HAEMP[5jZ+]*Fbxhfkv~2%%~2b7~2 ~OZpZMzڬ|a:(OSnq@T^BL ~'mW˙LDoRvyE . σ F> HZ_ +4 ?:Eu Mg Mg- Mgd X;; ^7[ ^P ^# g: r,| x Aw z I8 -tp : %;M  UPY UM շ D z Ch & zP D ?@p 3Zg 9s2k 9sK 9sy >c$# DY+ DY+H DY+ DZ, K bII i8:v 6D Ps . SA `z f { ^ 0E7 Ğt <1k <J <t <[ < a` ⋙51 e/ S uY!y2)$6e#95h<+H8oIoUh-WGD18e{A$XY ]0])$.jF8̺Ga(b)r9-37 S ;=QU>5B3TBxSMR_#_R_d@ fqXpPt~`t;~`"|Y"|:iM~%RttD:oZiLi<p>NN*u(vlcbVh SNb markdown lN:_YyQvNvh<_</p> <p>[Q<a href="http://www.pandoc.org">http://pandoc.org/</a></p> 

A universal document converter. Can be used to convert markdown to a wide range of other formats.

Website: http://pandoc.org/

Export8Ou(Pythonv'markdown'j!WWQHTML05Basic HTML output using the Python module 'markdown'.Export[QN: ePUB3Convert to ePUB3Export4؋v[Q]QwcONNNQvN[Q]QwOu(vWg,h<_0ADefault exporter, provides basic formats used by other exporters.ExportPQs YAML QCepcnWW0 YgO`GR0N YAML g Qsv SN\Ou([0DDisable YAML metadata block. Use that if you get YAML related error.ExportErrorExportzOu( pandoc ge[QR0 markdown QAkԞ؋v manuskript [QVhfY vh<_S y0hExport to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter.Export [WOSY'\: Font size:ExportHTML Q HTML OutputExportHTML neN HTML SourceExport Sbv_U0Include a table of contents.ExportdNmR markdown hYN~eg,N0 PGeg,f/ markdown vh<_0Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown.Export(u(Nub PDF v LaTeX _d0%LaTeX engine used to produce the PDF.Export@LaTeX f/Nye[WYtVhTehch u(NR^oNvehc0LaTeX is a word processor and document markup language used to create beautiful documents.ExportL: Line spacing:ExportMarkdown neNMarkdown sourceExport8Microsoft Office (.docx) ehc0"Microsoft Office (.docx) document.Export[ LaTeX0Needs LaTeX to be installed.ExportăSehcntVh  Normalize the document (cleaner)Export v_UN-ST+vk=~R+ep ,Number of sections level to include in TOC: ExportDOpenDocument h<_ LibreOffice {IoNOu(05OpenDocument format. Used by LibreOffice for example.Export ~_ \:[: Paper size:Export~eg, Plain textExport^&Nv0Preview with highlighter.Export&Pythonj!WW'markdown'0Python module 'markdown'.ExportST+veOV HTML ehc/Self-contained HTML files, with no dependenciesExportg{SUv[QR0~eg,0QAO`Ou( manuskript N-lg v[NIh OY<a href='www.fountain.io'>Fountain</a>.Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example Fountain.Export" b؋v Header ~R+ $Specify the base level for headers: ExportrzehcN Nf/rGk )Standalone document (not just a fragment)Export[vvhf/cONySNY'~gemObcR6vW(Y'~TQ~g RNcbO`ov e_0The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner.ExportcrHkcxnvQTypographically correct outputExport,Ou( <q> h{~geW( HTML N-hy:_u(Use tags for quotes in HTMLExportOu(_u(c N f/QTc1Use reference-style links instead of inline linksExport:reStructuredText f/NN*{~vh02reStructuredText is a lightweight markup language.Export......ExportersManagercϏ DescriptionExportersManager {t[QVhManage ExportersExportersManagerManuSkript ManuskriptExportersManager_Path:ExportersManagerr`StatusExportersManagerr`:Status:ExportersManagerrHg,Version:ExportersManager.lg b~R0 {} f/T&lg [bbKRc[_0 {HelpText}ExportersManagerRgAnalyzeFrequencyAnalyzercdSUNSR  Exclude words (comma separated):FrequencyAnalyzersRgFrequency AnalyzerFrequencyAnalyzer g\Y'\: Minimum size:FrequencyAnalyzer[WepNNumber of words: fromFrequencyAnalyzerw협sPhrase frequencyFrequencyAnalyzernSettingsFrequencyAnalyzer͘Word frequencyFrequencyAnalyzerR0toFrequencyAnalyzer SRP<Comma separated valuesImportbS_eNY1%0File open failed.Import [QeeNY9 Folder importImport[QeeNY9TeNImport folder then filesImport[Qe tip N:Import tip as:ImportOu(v[Qeel Import using:ImportSST+YN bi\U:Include only those extensions:Import[Qe MarkdownMarkdown importImport [Qe`~[VMind Map ImportImport [Qe`~[VMind Map importImport[Qe OPML eN OPML ImportImport[Qe Pandoc Pandoc importImportc T y[yvc^Sort items by nameImportN f/NN*Tlv`~[VeN01This does not appear to be a valid Mind Map file.Import N f/NN*Tlv OPML eN0-This does not appear to be a valid OPML file.ImportehUntitledImport[QeS€Insert referenceMDEditCompleter~ {} u  (~{} pages) MainWindow * {} lg W(yveNN-b~R00# * {} wasn't found in project file. MainWindow QsN&A &About MainWindow R|&B &Bold MainWindowY__U &Cheat sheet MainWindowQsyv&C &Close project MainWindowLl&C &Comment line(s) MainWindow Y R6&C &Copy MainWindow R d&D &Delete MainWindow &E &Edit MainWindowZg\&Fiction MainWindow eN&F &File MainWindow h<_&F &Format MainWindowsRg&F &Frequency Analyzer MainWindow Y4&H &Header MainWindow ^.R&H &Help MainWindow [Qe&I  &Import… MainWindow eOS&I &Italic MainWindowh{~...&L  &Labels... MainWindow j!_&M &Mode MainWindowTN yR&M &Move Up MainWindow [*&N  &Navigation MainWindow bS_&O &Open MainWindowg ^Rh&O  &Ordered list MainWindow |4&P &Paste MainWindow Q&Q &Quit MainWindowgOu(&R &Recent MainWindowT}T &R &Rename MainWindow O[X&S &Save MainWindowf>y:^.R&S &Show help texts MainWindow {SU&S &Simple MainWindowbQhg&S  &Spellcheck MainWindow RRr&S  &Split… MainWindowr`...&S  &Status... MainWindowR d~&S &Strike MainWindow ]Qw&T &Tools MainWindowe^Rh&U &Unordered list MainWindow [W&V  &Verbatim MainWindow gw &V &View MainWindowQsN ManuskriptAbout Manuskript MainWindow mR`łke Add plot step MainWindowO\Author MainWindow_u(WW&L  B&lockquote MainWindowfo Background MainWindowforBackground color MainWindowWg,O`o Basic info MainWindowNf|MO`oBook information MainWindowNf|MdX Book summary MainWindowBorder MainWindow8g^NuL0R \Bk!N0[ST+eebbv~g vQwOS~Ƃ0MBuild worlds. Create hierarchy of broad categories down to specific details. MainWindow RjR&U C&ut MainWindow҂r Character(s) MainWindow҂r Characters MainWindowndh<_&F Clear &formats MainWindowlWW&M Co&mment block MainWindow &M Co&mpile MainWindowCompile MainWindowQzConflict MainWindow҄=Corner MainWindow^zO`vO\TvY'~0'Create the outline of your masterpiece. MainWindow^zO`v҂r0Create your characters. MainWindow Ctrl++Ctrl++ MainWindow Ctrl+-Ctrl+- MainWindow Ctrl+0Ctrl+0 MainWindow Ctrl+1Ctrl+1 MainWindow Ctrl+2Ctrl+2 MainWindow Ctrl+3Ctrl+3 MainWindow Ctrl+4Ctrl+4 MainWindow Ctrl+5Ctrl+5 MainWindow Ctrl+6Ctrl+6 MainWindowCtrl+Alt+1 Ctrl+Alt+1 MainWindowCtrl+Alt+2 Ctrl+Alt+2 MainWindow Ctrl+BCtrl+B MainWindow Ctrl+CCtrl+C MainWindow Ctrl+DCtrl+D MainWindow Ctrl+ICtrl+I MainWindow Ctrl+KCtrl+K MainWindow Ctrl+MCtrl+M MainWindow Ctrl+OCtrl+O MainWindow Ctrl+QCtrl+Q MainWindow Ctrl+SCtrl+S MainWindowCtrl+Shift+B Ctrl+Shift+B MainWindowCtrl+Shift+C Ctrl+Shift+C MainWindowCtrl+Shift+DownCtrl+Shift+Down MainWindowCtrl+Shift+K Ctrl+Shift+K MainWindowCtrl+Shift+S Ctrl+Shift+S MainWindowCtrl+Shift+Up Ctrl+Shift+Up MainWindow Ctrl+VCtrl+V MainWindow Ctrl+XCtrl+X MainWindow DebugDebug MainWindow"Debug O`o0g ePf/g u(v0Debug info. Sometimes useful. MainWindowDelDel MainWindowcϏ Description MainWindow~O`o Detailed info MainWindow g `ł0Develop plots. MainWindow[WQx Dictionary MainWindow Y Q&I  Dupl&icate MainWindowVhEditor MainWindow EMailEmail MainWindowQeg QsO`vNfTO`]vO`o00Enter information about your book, and yourself. MainWindow`Epiphany MainWindow(\O`vNkdXN-vkN*S[P\U_N:NkAExpand each sentence of your one paragraph summary to a paragraph MainWindowF2F2 MainWindowF6F6 MainWindowF7F7 MainWindowF8F8 MainWindowF9F9 MainWindownFilter MainWindow[etvFull MainWindow[etdX Full summary MainWindowu(General MainWindow|{WGenre MainWindowvhGoal MainWindowVhIcon MainWindowVhr Icon color MainWindow͉`' Importance MainWindow}"_Sa Index cards MainWindowh{~Label MainWindowh{~Labels MainWindowNfLicense MainWindow T^v&E M&erge MainWindowTN yR&O  M&ove Down MainWindowManuSkript Manuskript MainWindowQCO`oMetadata MainWindowfYMore MainWindowRg: Motivation MainWindowT [WName MainWindowT [WNames MainWindowN NN*Next MainWindow{Notes MainWindoweNothing MainWindowNuOne page MainWindowNudXOne page summary MainWindowNk One paragraph MainWindow NkdXOne paragraph summary MainWindowNS One sentence MainWindow NSdXOne sentence summary MainWindow {t&Z  Organi&ze MainWindowY'~Outline MainWindowPOVPOV MainWindow`łPlot MainWindow`łPlots MainWindow ubzzepcnPopulates with empty data MainWindow^Progress MainWindowyvh Project tree MainWindow}Qeyv {} eGR00#Project {} loaded with some errors. MainWindow}Qeyv {} eQ#Project {} loaded with some errors: MainWindowyv {} ]}Qe0Project {} loaded. MainWindowyv {} ]O[X0Project {} saved. MainWindowR d bv`łkRemove selected plot step(s) MainWindowQkeResolution steps MainWindow~gResult MainWindow n&E  S&ettings MainWindowS[XN:&V  Sa&ve as... MainWindow d}"&R Sea&rch MainWindow|RSeries MainWindowW:fo Situation: MainWindowQzgenSource of conflict MainWindow`lgenSource of passion MainWindowW(QIhYRRr&L Sp&lit at cursor MainWindoweEN~ Story line MainWindow N h&P  Su&perscript MainWindow N h&R  Subsc&ript MainWindow[PhSubtitle MainWindowdXSummary MainWindowdXSummary: MainWindowjNNe`NN* 50 [W]SvNSdXgecϏO`vNf0q6T\[bi\UbNk Nu gTQbNN*[etvdX0Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. MainWindoweg,Text MainWindoweg,r Text color MainWindowlWg,`Qf/_bY'Yg...'v0OY'YgNN*gSqiv]^lbRg@k{NN*ZtQ? & &'TR)lry The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) MainWindow&eN {} N [XW(0f/T&yRbR d9The file {} does not exist. Has it been moved or deleted? MainWindowhTitle MainWindowhTree MainWindowSwVolume MainWindowfTJyv {} g*O[X0WARNING: Project {} not saved. MainWindow Yg & & What if...? MainWindow[Wep {}{} Words: {}{} MainWindowNuLWorld MainWindowQO\0Write. MainWindow P}  pxSettings%%Settingseh7_(&N) &New styleSettingsN f>y:&N &NothingSettingsf>y:[Wep&S)&Show word countSettings 1.5 L 1.5 linesSettings<html><head/><body><p>YgO`R NN* y O`vyvOO[XR0SUN*eNN-0ffNY R6NYN OFN QASOO\brHg,cR60<br/>YgN R O`vyvOO[XN:NN*ST+Y\eNveNY90</p></body></html>

If you check this option, your project will be save as one single file. Easier to copy or backup, but does not allow collaborative editing, or versionning.
If this is unchecked, your project will be save as a folder containing many small files.

Settings[P AlignmentSettings[P Alignment:Settings^u(nApplication settingsSettings^u(ApplySettingsT/RebS_gTQsvyv*Automatically load last project on startupSettings RO[XAutomatically save everySettingsfo BackgroundSettingsforBackground color:Settingsfo Background:Settings uLr Border color:SettingsSmCancelSettingsN-_CenterSettingsN-_CenteredSettingsrColor:SettingsrColorsSettingsCompileSettings ҄=r Corner color:Settings ҄=SJ_Corner radius:Settings Ctrl+SCtrl+SSettingsQIhCursorSettingsR dDeleteSettingsQspDisable blinkingSettingsN$P DoubleSettingsEditSettings[WOSFamily:SettingsNlj!_ Focus modeSettingseNY9FoldersSettings[WOSFontSettings [WOSY'\ Font size:Settings[WOSFont:SettingsQh\O FullscreenSettingsu(GeneralSettingsu(nGeneral settingsSettingsvhGoalSettingsVhY'\ Icon SizeSettings Vhr Icon color:SettingseSRIf no changes duringSettingsVPImage:SettingsL)Indent 1st lineSettings}"_Sa Index cardsSettingsgavr Item colorsSettingsh!kcJustifySettingsOuYRog,Keep revisionsSettingsOuYKeep:Settingsh{~LabelSettingsh{~LabelsSettings Language:Settings]LeftSettings ]SYLeft/Right margins:SettingsLLineSettingsL Line spacing:Settings}QeLoadingSettingsYMargins:SettingsgY'[^ Max widthSettings bQ Misspelled:Settingse^NewSettingseVPNo ImageSettingseNoneSettingsN f>y:NothingSettingseh7_&Y  Old st&yleSettingsf^Opacity:SettingsY'~OutlineSettingsPOVPOVSettingsQPadding:Settingsk= ParagraphSettingsk= yParagraph OptionsSettingsk= ParagraphsSettingsv~Rk PercentageSettingsOMn Position:Settings^ProgressSettingsbkO ProportionalSettings6O`T/ manuskript NO_nkcxnueH07Restarting Manuskript ensures all settings take effect.Settings `bY ؋P<Restore defaultsSettingsRog, RevisionsSettingsrRog,f/Ny͍ߎ*`vQ[vel0 [NkN*eg,y [O[XP`[N;eg,b@PZvNOUfe9 NO`gw T`bY NRMvrHg,0Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions.SettingsSRightSettingsf>y:^&H S&how progressSettingsfzett&M  S&mart removeSettings QeO[X Save on quitSettingsO[XR0SUN*eNSave to one single fileSettingsO[XSavingSettingsbkOScaledSettingsS[PSentenceSettingsnSettingsSettingsf>y:[Wep&W Show &word countSettingsf>y:gavep&M Show ite&m countSettingsf>y:^&R Show p&rogressSettingsf>y:i&Y  Show summar&ySettingsf>y:i Show summarySettingsSUN*SingleSettingsY'\Size:SettingsFfzettQAO`O[XN[vRog,0cP_T/NQMNubSCN Nve9RRog,0Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes.SettingsSpacing:Settingsr`StatusSettingsbO8 StretchedSettingsh7_StyleSettingsh7_Style:SettingsTab [^ Tab width:Settingseg,TextSettingseg,foText BackgroundSettingseg, y Text OptionsSettingseg,hF Text areaSettings eg,r Text color:Settings eg,Vh Text editorSettingseg,h{~ TextLabelSettingsN;T  Theme name:Settings^sTiledSettingshTitleSettings N N YTop/Bottom margins:Settingsf TransparentSettingshTreeSettings|{WType:Settings bS[Wg:j!_Typewriter modeSettings Ou(WW~cQeUse block insertion ofSettingsgw ViewsSettingsgw nViews settingsSettingsSRVisible columnsSettings[^Width:SettingszSfoWindow BackgroundSettings[Wep~ߋ Word countSettingse>Y'ZoomedSettingsR0minutes.Settingsy0seconds.SettingsRQe[WQx&A &Add to dictionary SpellActionNN*N[WQxN-R d&R &Remove from custom dictionary SpellActionbQ^Spelling Suggestions SpellActionQsN ManuskriptAbout ManuskriptaboutManuskript ManuskriptaboutOu(voNrHg,Software Versions in Use: aboutDialogrHg,Version aboutDialogCompile abstractModelvhGoal abstractModelh{~Label abstractModelPOVPOV abstractModelr`Status abstractModelhTitle abstractModel[Wep~ߋ Word count abstractModel QSdXFew sentences summary: basicItemViewForm basicItemViewvhGoal: basicItemView NSdXOne line summary basicItemViewPOVPOV: basicItemView[Wep~ߋ Word count basicItemViewT [WNamecharacterModele҂r New charactercharacterModelP<ValuecharacterModelN;MaincharacterTreeViewN ͉vMinorcharacterTreeViewk! SecondarycharacterTreeView҂r Characters cheatSheetnyvN-NaT [W 2Filter (type the name of anything in your project) cheatSheetForm cheatSheetN;Main cheatSheetN ͉vMinor cheatSheet`łPlots cheatSheetk! Secondary cheatSheeteg,Texts cheatSheetNuLWorld cheatSheetN;MaincmbOutlineCharacterChoserN ͉vMinorcmbOutlineCharacterChosereNonecmbOutlineCharacterChoserk! SecondarycmbOutlineCharacterChoserSSVariouscmbOutlineCharacterChoserSSVariouscmbOutlineLabelChoserSSVariouscmbOutlineStatusChoser Dock Widgets ]QwhDock Widgets ToolbarcollapsibleDockWidgetsForm completer[etdX Full summary corkDelegate NSdXOne line summary corkDelegateFormeditorWidget_ui[QExportexporter[QR0 Export to:exporter {t[Q]QwManage exportersexporterPreviewexporternSettingsexporter{} \g*[s {} (not implemented yet)exporterDialogW(eNY9Teg,NKBetween folder and text:exporterSettingsW(eNY9NKBetween folders:exporterSettingsW(eg,TeNY9NKBetween text and folder:exporterSettings W(eg,NKBetween texts:exporterSettingsQ[ContentexporterSettings[NICustomexporterSettings [NIfcbCustom replacements:exporterSettingsQ[TNgTO[Q06Decide here what will be included in the final export.exporterSettingszzL Empty lineexporterSettings_T/EnabledexporterSettings n&L Fi<ersexporterSettingseNY9FolderexporterSettings[WOSFontexporterSettings [WOSY'\ Font size:exporterSettings[WOSFont:exporterSettingsFormexporterSettingsbf~v|^I need more granularityexporterSettingsBYg N- ROu(kcRh_ۈLfcb0 Ygg* N- RfcbN:~eg,0ZIf checked, uses regular expression for replacement. If unchecked, replaced as plain text.exporterSettings_uer`Sbb@g gav )Ignore compile status (include all items)exporterSettingsh{~LabelsexporterSettingsPreviewexporterSettings kcRh_RegExpexporterSettingsR dY vzzh<Remove multiple spacesexporterSettingsfcbReplaceexporterSettings\ --- fcbN: Replace --- with —exporterSettings\ ... fcbN: &Replace ... with …exporterSettings\S_S" fcbN:Replace double quotes (") with:exporterSettings\SU_S' fcbN:Replace single quotes (') with:exporterSettingsR SeparationsexporterSettingsr`StatusexporterSettings[Py Subitems of:exporterSettingseg,TextexporterSettingshTitleexporterSettingslcbTransformationsexporterSettings|{WTypeexporterSettings crHfcbTypographic replacements:exporterSettings<b></b> Requires: exportersManager<b>r`</b> g*[0Status: uninstalled.exportersManager[NICustomexportersManager][ InstalledexportersManagerlg b~R0 Not foundexportersManagern {} SbgLeNv_0Set {} executable path.exportersManager.lg b~R0 {} f/T&lg [bbKRc[_0/{} not found. Install it, or set path manually.exportersManagers FrequencyfrequencyAnalyzerwPhrasesfrequencyAnalyzer[WWordfrequencyAnalyzerN;Theme:fullScreenEditorhTitlefullScreenEditor[Wep~ߋ Word countfullScreenEditor{} [W{} wordsfullScreenEditor{} [W / {} {} words / {}fullScreenEditoru(GeneralgeneralSettings[QeR0v\BeNY9Import in a top-level foldergeneralSettings[QeR0 Import under:generalSettings\n---\n\n---\ngeneralSettings beN Choose fileimporterndeN Clear fileimporterh<_Format:importer[QeImportimporterPreviewimporternSettingsimporterSSVarious lineEditView R minuteslocker [W wordslockerFormlocker[Lock !locker [\O^U Lock screen:lockerevh Time targetlocker[Wepvh Word targetlocker RiOY {} {} remaininglocker {} y0{} s.lockerRiOY {} [W{} words remaininglocker {}:{}{}:{}locker~{} \e0~{} h.locker~{} R0~{} mn.locker Alt+UpAlt+Up mainEditorF11F11 mainEditorForm mainEditorR0r6gavGo to parent item mainEditor}"_Sa Index cards mainEditorY'~Outline mainEditorh9Root mainEditoreg,Text mainEditor {} [W  {} words  mainEditor{} [W / {} {} words / {}  mainEditorMarkdownMarkdownmarkdownSettingsForm metadataView[etdX Full summary metadataView {/S€Notes / References metadataView NSdXOne line summary metadataView\^`' Properties metadataViewRog, Revisions metadataViewdXSummary metadataViewR Auto-hidemyPanel Y R6&C &Copy outlineBasics R d&D &Delete outlineBasics |4&P &Paste outlineBasicsT}T &R &Rename outlineBasicsH<p><b>O`Ss\R d {} 0</b></p><p>f/T&xn</p>D

You're about to delete {} item(s).

Are you sure?

 outlineBasicsQsNR dAbout to remove outlineBasics&b@g gavT ~Qwg vT vr6y 0g*wS€</b> {}0Unknown reference: {}. referencesWg,O`o Basic info references҂r<b>{}</b>Character: {} references҂r Characters referencesQzConflict referencescϏ Description references~O`o Detailed info references`Epiphany referenceseNY9<b>{}</b>Folder: {} references lR0 {}0 Go to {}. referencesvhGoal referencesh{~Label: referencesdX Long summary: referencesdXLonger summary referencesoR Motivation referencesN f/NN*S€ehc{}0Not a reference: {}. references{Notes: referencesPOV [aPOV of: referencesPOVPOV: referencesRg:Passion references_Path: references`ł<b>{}</b>Plot: {} references_u(NReferenced in: referencesQkeResolution steps references~gResult referenceswdX Short summary referenceswdXShort summary: references~ߋStats: referencesr`Status: referenceseg,<b>{}</b>Text: {} referencesg*wS€ehc{}0Unknown reference: {}. references,NuL<b>{name}</b>{path}World: {name}{path} referencesR dDelete revisionsh{~Labelsearch{NotessearchPOVPOVsearchr`StatussearchdXSummarysearcheg,TextsearchhTitlesearch S  (read-only)settingsWindowErrorsettingsWindoweh{~ New labelsettingsWindowe^r` New statussettingsWindowe^N; New themesettingsWindoweN;newthemesettingsWindowN;Main sldImportanceN ͉vMinor sldImportanceeg,h{~ TextLabel sldImportanceSSvVarious textEditView CTRL+BCTRL+B textFormat CTRL+ECTRL+E textFormat CTRL+ICTRL+I textFormat CTRL+JCTRL+J textFormat CTRL+LCTRL+L textFormat CTRL+PCTRL+P textFormat CTRL+RCTRL+R textFormat CTRL+UCTRL+U textFormatForm textFormatQhbS Collapse AlltreeView bS {} Collapse {}treeViewQh\U_ Expand AlltreeView \U_ {} Expand {}treeView11welcome0<b>`;</b> {} [W (~ {} u)#Total: {} words (~ {} pages)welcomeXR\B~ Add levelwelcome XR[Wep~ߋAdd word countwelcomeBookwelcomezChapterwelcomeR^Createwelcome R^eyvCreate New Projectwelcomey:Oyv Demo projectswelcomezzEmptywelcome zzZgeHg Empty fictionwelcome zz^ZgeHgEmpty non-fictionwelcomeZg\Fictionwelcome[bz?FinalwelcomeRz? First draftwelcomeFormwelcomeRaIdeawelcomeManuSkript Manuskriptwelcome*Manuskript yv (*.msk)Manuskript project (*.msk)welcome>Manuskript yv (*.msk);;b@g eN (*))Manuskript project (*.msk);;All files (*)welcomeN k!RbS_gTQsvyv*Next time, automatically open last projectwelcome ^Zg\ Non-fictionwelcome{Notewelcome{\NovelwelcomeN-{\NovellawelcomebS_yv Open projectwelcome bS_...Open...welcome v]g yvOverwrite existing project {} ?welcomegOu(RecentwelcomexzvResearchwelcomexzveResearch paperwelcomeS[XyvN:...Save project as...welcomeW:foScenewelcomeNz? Second draftwelcomeRSectionwelcomew{\ Short StorywelcomeTODOTODOwelcomej!g Templateswelcomeeg,TextwelcomeN fTrilogywelcomefTJWarningwelcome [WkϘy 0 words each.welcomemanuskript-0.10.0/i18n/manuskript_zh_CN.ts000066400000000000000000005374341354442177200204230ustar00rootroot00000000000000 Export Basic HTML output using the Python module 'markdown'. 使用Python的'markdown'模块输出HTML。 Python module 'markdown'. Python模块'markdown'。 Markdown source Markdown 源文件 HTML Source HTML 源文件 HTML Output HTML 输出 Default exporter, provides basic formats used by other exporters. 默认的导出工具提供了一些其他导出工具使用的基本格式。 Preview with highlighter. 带高亮的预览。 Plain text 纯文本 A little known format modestly used. You know, web sites for example. Needs LaTeX to be installed. 需要安装 LaTeX。 Error 错误 Standalone document (not just a fragment) 独立文档(不仅是片段) Include a table of contents. 包括目录。 Number of sections level to include in TOC: 目录中需要包含的段落级别数量: Typographically correct output 排版正确的输出 Normalize the document (cleaner) 规范化文档(清理器) Specify the base level for headers: 选择默认的 Header 级别: Use reference-style links instead of inline links 使用引用链接而不是内联链接 Use ATX-style headers Self-contained HTML files, with no dependencies 自包含的无依赖 HTML 文档 Use <q> tags for quotes in HTML 使用 <q> 标签来在 HTML 中表示引用 LaTeX engine used to produce the PDF. 用于生成 PDF 的 LaTeX 引擎。 Paper size: 纸张尺寸: Font size: 字体大小: Class: Line spacing: 行间距: Books that don't kill trees. OpenDocument format. Used by LibreOffice for example. OpenDocument 格式,LibreOffice 等软件使用。 Microsoft Office (.docx) document. Microsoft Office (.docx) 文档。 reStructuredText is a lightweight markup language. reStructuredText 是一个轻量级的标记语言。 Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. 除了添加 markdown 标题外与纯文本一致。 假设文本是 markdown 的格式。 Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. 最简单的导出到纯文本。允许你使用 manuskript 中没有的自定义标记,例如<a href='www.fountain.io'>Fountain</a>. <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> <p>一个通用的转换器,可以把 markdown 转为很多种其他的格式</p> <p>官网:<a href="http://www.pandoc.org">http://pandoc.org/</a></p> a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. 使用 pandoc 来导出到 markdown 允许比默认的 manuskript 导出器更多 的格式化选项。 LaTeX is a word processor and document markup language used to create beautiful documents. LaTeX 是一种文字处理器和文档标记语言,用于创建漂亮的文档。 The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. 它的目标是提供一种可以通过大纲来浏览或控制的在大纲和网络服务间交换信息的 方式。 Disable YAML metadata block. Use that if you get YAML related error. 关闭 YAML 元数据块。 如果你遇到了 YAML 有关的问题,可以尝试使用它。 Convert to ePUB3 导出为 ePUB3 Could not process regular expression: {} Choose output file… ExportersManager Manage Exporters 管理导出器 Manuskript ManuSkript Description 描述 Offers export to Status 状态 Status: 状态: Version: 版本: Path: 路径: ... ... {HelpText} 没有找到 {},是否没有安装?或手动指定路径。 FrequencyAnalyzer Frequency Analyzer 频率分析 Word frequency 词频 Settings 设置 Minimum size: 最小大小: Exclude words (comma separated): 排除单词(以逗号分隔): Analyze 分析 Phrase frequency 短语频率 Number of words: from 字数:从 to Import Markdown import 导入 Markdown <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; Folder import 导入文件夹 <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> Include only those extensions: 只包含如下扩展: Comma separated values 逗号分隔值 Sort items by name 按名称对项目排序 Import folder then files 导入文件夹和文件 OPML Import 导入 OPML 文件 File open failed. 打开文件失败。 This does not appear to be a valid OPML file. 不是一个合法的 OPML 文件。 Pandoc import 导入 Pandoc <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; Import using: 使用的导入方法: Wrap lines: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> Mind Map Import 导入思维导图 This does not appear to be a valid Mind Map file. 这不是一个合法的思维导图文件。 Mind Map import 导入思维导图 Import tip as: 导入 tip 为: Untitled 无标题 MDEditCompleter Insert reference 导入参考 MainWindow General 通用 Title 标题 Subtitle 子标题 Series 系列 Volume Genre 类型 License 证书 Author 作者 Name 名字 Email EMail Summary 摘要 Situation: 场景: Summary: 摘要: One sentence 一句话 One paragraph 一段 One page 一页 Full 完整的 One sentence summary 一句话摘要 One paragraph summary 一段话摘要 Expand each sentence of your one paragraph summary to a paragraph 将你的一段话摘要中的每个句子都展开为一段 One page summary 一页摘要 Full summary 完整摘要 Next 下一个 What if...? 如果……? Characters 角色 Names 名字 Filter 过滤 Basic info 基本信息 Importance 重要性 Motivation 动机 Goal 目标 Conflict 冲突 Epiphany 顿悟 <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> Notes 笔记 Detailed info 详细信息 Plots 情节 Plot 情节 Character(s) 角色 Description 描述 Result 结果 Resolution steps 解决步骤 World 世界 Populates with empty data 生成空数据 More 更多 Source of passion 想法来源 Source of conflict 冲突来源 Outline 大纲 Editor 编辑器 Debug Debug FlatData Persos Labels 标签 &File 文件(&F) &Recent 最近使用(&R) &Help 帮助(&H) &Tools 工具(&T) &Edit 编辑(&E) &View 查看&(V) &Mode 模式(&M) &Cheat sheet 备忘录 Sea&rch 搜索(&R) &Navigation 导航(&N) &Open 打开(&O) Ctrl+O Ctrl+O &Save 保存(&S) Ctrl+S Ctrl+S Sa&ve as... 另存为(&V) Ctrl+Shift+S Ctrl+Shift+S &Quit 退出(&Q) Ctrl+Q Ctrl+Q &Show help texts 显示帮助(&S) Ctrl+Shift+B Ctrl+Shift+B &Spellcheck 拼写检查(&S) F9 F9 &Labels... 标签...(&L) &Status... 状态...(&S) Tree &Simple 简单(&S) &Fiction 虚构小说 Index cards 索引卡 S&ettings 设置(&E) F8 F8 &Close project 关闭项目(&C) Co&mpile 编译(&M) F6 F6 &Frequency Analyzer 频率分析(&F) Book information 书籍信息 &About 关于(&A) About Manuskript 关于 Manuskript Manuskript ManuSkript Project {} saved. 项目 {} 已保存。 WARNING: Project {} not saved. 警告:项目 {} 未保存。 Project {} loaded. 项目 {} 已载入。 Project {} loaded with some errors: 载入项目 {} 时出错: * {} wasn't found in project file. * {} 没有在项目文件中找到。 Project {} loaded with some errors. 载入项目 {} 时遇到错误。 (~{} pages) (约 {} 页) Words: {}{} 字数: {}{} Book summary 书籍摘要 Project tree 项目树 Metadata 元信息 Story line 故事线 Enter information about your book, and yourself. 输入有关你的书和你自己的信息。 The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) 基本情况是形如'如果...?'的问题。例如:'如果一个最危险的巫师没能成功杀死一个婴儿……?'(哈利·波特) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. 花一些时间想一个 50 字左右的一句话摘要来描述你的书。然后将它扩展成一段,一页,最后写成一个完整的摘要。 Create your characters. 建立你的角色。 Develop plots. 构造情节。 Build worlds. Create hierarchy of broad categories down to specific details. 构建世界。创造层次丰富包含方方面面的结构,直至具体细节。 Create the outline of your masterpiece. 建立你的作品的大纲。 Write. 写作。 Debug info. Sometimes useful. Debug 信息。有时候是有用的。 Dictionary 字典 Nothing POV POV Label 标签 Progress 进度 Compile 编译 Icon color 图标颜色 Text color 文本颜色 Background color 背景色 Icon 图标 Text 文本 Background 背景 Border 边缘 Corner 角落 Add plot step 添加情节步骤 &Import… 导入(&I) F7 F7 &Copy 复制(&C) Ctrl+C Ctrl+C C&ut 剪切(&U) Ctrl+X Ctrl+X &Paste 粘贴(&P) Ctrl+V Ctrl+V &Split… 分割(&S) Ctrl+Shift+K Ctrl+Shift+K Sp&lit at cursor 在光标处分割(&L) Ctrl+K Ctrl+K Ctrl+M Ctrl+M Ctrl+D Ctrl+D Del Del &Move Up 向上移动(&M) Ctrl+Shift+Up Ctrl+Shift+Up M&ove Down 向下移动(&O) Ctrl+Shift+Down Ctrl+Shift+Down Dupl&icate 复写(&I) &Delete 删除(&D) &Rename 重命名(&R) F2 F2 Organi&ze 管理(&Z) M&erge 合并(&E) &Format 格式(&F) &Header 头(&H) &Level 1 (setext) Ctrl+Alt+1 Ctrl+Alt+1 Level &2 Ctrl+Alt+2 Ctrl+Alt+2 Level &1 (atx) Ctrl+1 Ctrl+1 L&evel 2 Ctrl+2 Ctrl+2 Level &3 Ctrl+3 Ctrl+3 Level &4 Ctrl+4 Ctrl+4 Level &5 Ctrl+5 Ctrl+5 Level &6 Ctrl+6 Ctrl+6 &Bold 加粗(&B) Ctrl+B Ctrl+B &Italic 斜体(&I) Ctrl+I Ctrl+I &Strike 删除线(&S) &Verbatim 逐字(&V) Su&perscript 上标(&P) Ctrl++ Ctrl++ Subsc&ript 下标(&R) Ctrl+- Ctrl+- Co&mment block 注释块(&M) Ctrl+Shift+C Ctrl+Shift+C Clear &formats 清除格式(&F) Ctrl+0 Ctrl+0 &Comment line(s) 行注释(&C) &Ordered list 有序列表(&O) &Unordered list 无序列表(&U) B&lockquote 引用块(&L) Remove selected plot step(s) 删除选择的情节段 The file {} does not exist. Has it been moved or deleted? 文件 {} 不存在。是否被移动或删除? Install {}{} to use spellcheck {} has no installed dictionaries {}{} is not installed Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings Settings 设置 General 通用 Revisions 副本 Views 查看 Labels 标签 Status 状态 Fullscreen 全屏 General settings 通用设置 Application settings 应用设置 Loading 载入 Automatically load last project on startup 启动时打开最后关闭的项目 Saving 保存 Automatically save every 自动保存间隔 minutes. 分钟。 If no changes during 无变动 seconds. 秒。 Save on project close 退出时保存 <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> <html><head/><body><p>如果你勾选了这个选项,你的项目会被保存到单个文件中。更易于复制与备份,但不允许协作编辑或者版本控制。<br/>如果不勾选,你的项目会被保存为一个包含许多小文件的文件夹。</p></body></html> Save to one single file 保存到单个文件 Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. 副本是一种跟踪您编辑的内容的方法。 对于每个文本项,它会存储您对主文本所做的任何更改,以便您查看和恢复以前的版本。 Keep revisions 保留副本 S&mart remove 智能整理(&M) Keep: 保留: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. 智能整理允许你保存一定量的副本。推荐开启以避免产生成千上万的改动副本。 revisions per day for the last month revisions per minute for the last 10 minutes revisions per hour for the last day revisions per 10 minutes for the last hour revisions per week till the end of time Views settings 查看设置 Tree Colors 颜色 Icon color: 图标颜色: Nothing 不显示 POV POV Label 标签 Progress 进度 Compile 编译 Text color: 文本颜色: Background color: 背景色: Folders 文件夹 Show ite&m count 显示条目数量(&M) Show summary 显示概要 &Nothing 不显示(&N) Text 文本 Outline 大纲 Visible columns 可见列 Goal 目标 Word count 字数统计 Percentage 百分比 Title 标题 Index cards 索引卡 Item colors 条目颜色 Border color: 边界颜色: Corner color: 角落颜色: Background 背景 Color: 颜色: Ctrl+S Ctrl+S Image: 图像: Text editor 文本编辑器 Font 字体 Family: 字体: Size: 大小: Misspelled: 拼写错误: Background: 背景: Paragraphs 段落 Line spacing: 行间距: Single 单个 1.5 lines 1.5 行 Double 两倍 Proportional 成比例 % % Tab width: Tab 宽度: px 像素 Indent 1st line 首行缩进 Spacing: 间距: New 新建 Edit 编辑 Delete 删除 Theme name: 主题名: Apply 应用 Cancel 取消 Window Background 窗口背景 Text Background 文本背景 Text Options 文本选项 Paragraph Options 段落选项 Type: 类型: No Image 无图像 Tiled 平铺 Centered 中心 Stretched 拉伸 Scaled 成比例 Zoomed 放大 Opacity: 透明度: Position: 位置: Left Center 中心 Right Width: 宽度: Corner radius: 角落半径: Margins: 外间距: Padding: 内间距: Font: 字体: Style 样式 Cursor 光标 Use block insertion of 使用块级插入 Alignment: 对齐: Justify 校正 Alignment 对齐 Icon Size 图标大小 TextLabel 文本标签 Disable blinking 关闭闪烁 Text area 文本框 Max width 最大宽度 Left/Right margins: 左右外间距: Top/Bottom margins: 上下外间距: S&how progress 显示进度(&H) Show summar&y 显示概要(&Y) Show p&rogress 显示进度(&R) Old st&yle 旧样式(&Y) Transparent 透明 Restore defaults 恢复默认值 Style: 样式: Language: 语言: Font size: 字体大小: Restarting Manuskript ensures all settings take effect. 你需要重启 manuskript 以使得设置正确生效。 Show &word count 显示字数(&W) &Show word count 显示字数(&S) &New style 新样式(&N) Typewriter mode 打字机模式 Focus mode 专注模式 None Sentence 句子 Line Paragraph 段落 <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions 拼写建议 &Add to dictionary 加入字典(&A) &Remove from custom dictionary 从个人字典中删除(&R) about About Manuskript 关于 Manuskript Manuskript Manuskript aboutDialog Version 版本 Software Versions in Use: 使用的软件版本: abstractModel Title 标题 POV POV Label 标签 Status 状态 Compile 编译 Word count 字数统计 Goal 目标 basicItemView Form POV: POV: Goal: 目标: Word count 字数统计 One line summary 一句话摘要 Few sentences summary: 几句话摘要: characterModel New character 新角色 Name 名字 Value characterTreeView Main 主要 Secondary 次要 Minor 不重要的 cheatSheet Form Filter (type the name of anything in your project) 过滤(项目中任意名字) Minor 不重要的 Secondary 次要 Main 主要 Characters 角色 Texts 文本 Plots 情节 World 世界 cmbOutlineCharacterChoser None Main 主要 Secondary 次要 Minor 不重要的 Various 可变 cmbOutlineLabelChoser Various 可变 cmbOutlineStatusChoser Various 可变 collapsibleDockWidgets Dock Widgets Toolbar Dock Widgets 工具栏 completer Form corkDelegate One line summary 一句话摘要 Full summary 完整摘要 editorWidget_ui Form exporter Export 导出 Export to: 导出到: Manage exporters 管理导出工具 Preview 预览 Settings 设置 exporterDialog {} (not implemented yet) {} (尚未实现) exporterSettings Form Content 内容 Decide here what will be included in the final export. 决定哪些最后会被导出。 Type 类型 Title 标题 Text 文本 I need more granularity 我需要更细的粒度 Fi&lters 过滤(&L) <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> Ignore compile status (include all items) 忽略编译状态(包括所有条目) Subitems of: 子项: Labels 标签 Status 状态 Separations 分隔 Between folders: 在文件夹之间: Empty line 空行 Custom 自定义 Between texts: 在文本之间: Between folder and text: 在文件夹和文本之间: Between text and folder: 在文本和文件夹之间: Transformations 转换 Typographic replacements: 排版替换: Replace double quotes (") with: 将双引号(")替换为: Replace single quotes (') with: 将单引号(')替换为: Remove multiple spaces 删除重复的空格 Custom replacements: 自定义替换: Enabled 开启 Replace 替换 With RegExp 正则表达式 If checked, uses regular expression for replacement. If unchecked, replaced as plain text. 如果选中,则使用正则表达式进行替换。 如果未选中,则替换为纯文本。 Preview 预览 Font 字体 Font: 字体: Font size: 字体大小: Folder 文件夹 {}Level {} folder {}Level {} text Replace ... with … 将 ... 替换为 … Replace --- with — 将 --- 替换为 — exportersManager Installed 已安装 Custom 自定义 Not found 没有找到 {} not found. Install it, or set path manually. 没有找到 {},是否没有安装?或手动指定路径。 <b>Status:</b> uninstalled. <b>状态:</b> 未安装。 <b>Requires:</b> <b>需要:</b> Set {} executable path. 设置 {} 可执行文件的路径。 frequencyAnalyzer Phrases 短语 Frequency 频率 Word fullScreenEditor Theme: 主题: {} words / {} {} 字 / {} {} words {} 字 Spellcheck Navigation New Text Title 标题 Title: Show Full Path Theme selector Word count 字数统计 Progress Progress: Auto Show/Hide Clock Clock: Show Seconds generalSettings General 通用 Split scenes at: \n---\n \n---\n Trim long titles (> 32 chars) Import under: 导入到: Import in a top-level folder 导入到顶层文件夹 helpLabel If you don't wanna see me, you can hide me in Help menu. importer Import 导入 Format: 格式: Choose file 选择文件 Clear file 清除文件 Preview 预览 Settings 设置 lastAccessedDirectoryInfo Last accessed directory "{}" loaded. lineEditView Various 可变 locker Form Lock screen: 锁定屏幕: Word target 字数目标 Time target 时间目标 words minutes 分钟 Lock ! 锁定! ~{} h. ~{} 小时。 ~{} mn. ~{} 分钟。 {}:{} {}:{} {} s. {} 秒。 {} remaining 剩余 {} {} words remaining 剩余 {} 字 mainEditor Form Text 文本 Index cards 索引卡 Outline 大纲 F11 F11 Go to parent item 到父条目 Alt+Up Alt+Up Root {} words / {} {} 字 / {} {} words {} 字 markdownSettings Markdown Markdown metadataView Form Properties 属性 Summary 摘要 One line summary 一句话摘要 Full summary 完整摘要 Notes / References 笔记/参考 Revisions 副本 myPanel Auto-hide 自动隐藏 outlineBasics Set POV 设置 POV None Set Status 设置状态 Set Label 设置标签 New 新建 Main 主要 Secondary 次要 Minor 不重要的 Set Custom Icon 设置自定义图标 Restore to default 恢复默认值 Root Open {} items in new tabs 在新标签页打开 {} 条目 Open {} in a new tab 在新标签页打开 {} About to remove 关于删除 <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> <p><b>你即将删除 {} 。</b></p><p>是否确认?</p> Select at least two items. Folders are ignored. 选择最后两项条目。忽略文件夹。 All items must be on the same level (share the same parent). 所有条目都需要同级(具有相同的父项)。 New &Folder 新建文件夹(&F) New &Text 新建文本(&T) &Copy 复制(&C) C&ut 剪切(&U) &Paste 粘贴(&P) &Rename 重命名(&R) &Delete 删除(&D) outlineCharacterDelegate None Main 主要 Secondary 次要 Minor 不重要的 outlineItem {} words / {} ({}) {} 字 / {} ({}) {} words {} 字 pandocSettings General 通用 Table of Content 内容表格(TOC) Custom settings for {} {} 的自定义设置 persosProxyModel Main 主要 Secondary 第二 Minors 不重要的 plotDelegate General 通用 Promise 诺言 Problem 问题 Progress 进展 Resolution 决心 Try / Fail 尝试/失败 No and 不,但 Yes but 是的,但 Freytag's pyramid 弗雷塔格的金字塔 Exposition 揭露 Rising action 指向高潮的情景 Climax 高潮 Falling action 急转直下的行动 Three acts 三幕 1. Setup 1. 建立 1. Inciting event 1. 煽动性的事件 1. Turning point 1. 转折点 2. Choice 2. 选择 2. Reversal 2. 反转 2. Disaster 2. 灾难 3. Stand up 3. 站起来 3. Climax 3. 高潮 3. Ending 3. 结束 Hero's journey 英雄的旅程 Ordinary world 平凡的世界 Call to adventure 冒险的召唤 Refusal of the call 拒绝召唤 Meeting with mentor 与导师见面 Tests 测试 Approach 接近 Abyss 深远 Reward / Revelation 奖励/启示 Transformation 转换 Atonement 赎罪 Return 返回 plotModel New plot 新情节 Name 名字 Meta 元(Meta) New step 新一步 Main 主要 Secondary 次要 Minor 不重要的 plotTreeView Main 主要 Secondary 次要 Minor 不重要的 **Plot:** {} **情节:** {} plotsProxyModel Main 主要 Secondary 次要 Minors 不重要的 propertiesView Form POV POV Status 状态 Label 标签 Compile 编译 Goal 目标 Word count 字数统计 references Not a reference: {}. 不是一个参考文档:{}。 Unknown reference: {}. 未知参考文档:{}。 Path: 路径: Stats: 统计: POV: POV: Status: 状态: Label: 标签: Short summary: 短摘要: Long summary: 长摘要: Notes: 笔记: Basic info 基本信息 Detailed info 详细信息 POV of: POV 对象: Go to {}. 转到 {}。 Description 描述 Result 结果 Characters 角色 Resolution steps 解决步骤 Passion 动机 Conflict 冲突 <b>Unknown reference:</b> {}. <b>未知参考</b> {}。 Folder: <b>{}</b> 文件夹:<b>{}</b> Text: <b>{}</b> 文本:<b>{}</b> Character: <b>{}</b> 角色:<b>{}</b> Plot: <b>{}</b> 情节:<b>{}</b> World: <b>{name}</b>{path} 世界:<b>{name}</b>{path} Referenced in: 引用于: Motivation 激励 Goal 目标 Epiphany 顿悟 Short summary 短摘要 Longer summary 长摘要 revisions Form Options Restore Delete 删除 Show modifications Show ancient version Show spaces Show modifications only {} years ago {} months ago {} days ago 1 day ago {} hours ago {} minutes ago {} seconds ago Line {}: Clear all search Form Search for... Search in: All Title 标题 Text 文本 Summary 摘要 Notes 笔记 POV POV Status 状态 Label 标签 Options: Case sensitive settingsWindow New status 新建状态 New label 新标签 newtheme 新主题 New theme 新建主题 (read-only) (只读) Open Image Image files (*.jpg; *.jpeg; *.png) Error 错误 Unable to load selected file Unable to add selected image: {} sldImportance Form TextLabel 文本标签 Minor 不重要的 Secondary Main 主要 splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> Split '{}' Split items storylineView Form Show Plots Show Characters tabSplitter Open selected items in that view. Split horizontally Close split Split vertically textEditView Various 可变的 textFormat Form CTRL+B CTRL+B CTRL+I CTRL+I CTRL+U CTRL+U CTRL+P CTRL+P CTRL+L CTRL+L CTRL+E CTRL+E CTRL+R CTRL+R CTRL+J CTRL+J treeView Expand {} 展开 {} Collapse {} 折叠 {} Expand All 全部展开 Collapse All 全部折叠 welcome Form 1 1 Templates 模板 Empty Novel 长篇小说 Novella 中篇小说 Short Story 短篇小说 Research paper 研究论文 Demo projects 示例项目 Add level 增加层级 Add word count 增加字数统计 Next time, automatically open last project 下次自动打开最后关闭的项目 Open... 打开... Recent 近期使用 Create 创建 Open project 打开项目 Manuskript project (*.msk);;All files (*) Manuskript 项目 (*.msk);;所有文件 (*) Save project as... 另存项目为... Manuskript project (*.msk) Manuskript 项目 (*.msk) Manuskript ManuSkript Create New Project 创建新项目 Warning 警告 Overwrite existing project {} ? 覆盖已有项目 Empty fiction 空虚构效果 Chapter 章节 Scene 场景 Trilogy 三部曲 Book Section 部分 Empty non-fiction 空非虚构效果 words each. 字(每项)。 of Text 文本 Something <b>Total:</b> {} words (~ {} pages) <b>总计:</b> {} 字 (约 {} 页) Fiction 虚构小说 Non-fiction 非虚构小说 Idea 创意 Note 笔记 Research 研究 TODO TODO First draft 初稿 Second draft 二稿 Final 完成稿 worldModel New item Fantasy world building Physical Climate Topography Astronomy Wild life Flora History Races Diseases Cultural Customs Food Languages Education Dresses Science Calendar Bodily language Ethics Religion Government Politics Gender roles Music and arts Architecture Military Technology Courtship Demography Transportation Medicine Magic system Rules Organization Magical objects Magical places Magical races Important places Important objects Natural resources manuskript-0.10.0/i18n/manuskript_zh_HANT.qm000066400000000000000000000034561354442177200206340ustar00rootroot00000000000000jUse tags for quotes in HTMLExport"Ou( ATX j#_ HeadersUse ATX-style headersExportOu(_u(j#_#}P N f/Qgo#}P1Use reference-style links instead of inline linksExportmanuskript-0.10.0/i18n/manuskript_zh_HANT.ts000066400000000000000000005427001354442177200206450ustar00rootroot00000000000000 Export Basic HTML output using the Python module 'markdown'. 以Python語言的markdown樣式輸出基本HTML。 Python module 'markdown'. Python語言模組“Markdown”。 Markdown source Markdown源碼 HTML Source HTML源碼 HTML Output HTML輸出 Default exporter, provides basic formats used by other exporters. Preview with highlighter. 以熒光筆模式預覽 Plain text 純文本 A little known format modestly used. You know, web sites for example. Needs LaTeX to be installed. 需要安裝 LaTeX。 Error 錯誤 Standalone document (not just a fragment) 獨立文件(不只是分段) Include a table of contents. 包含一個目錄。 Number of sections level to include in TOC: Typographically correct output 排版正確的輸出 Normalize the document (cleaner) 規範化檔案(整理) Specify the base level for headers: 選擇默認的Header級別 Use reference-style links instead of inline links 使用引用樣式連結而不是內聯連結 Use ATX-style headers 使用 ATX 樣式 Headers Self-contained HTML files, with no dependencies 獨立的 HTML 檔案,無依賴項 Use <q> tags for quotes in HTML 在 HTML 中為引號使用<q>標記 LaTeX engine used to produce the PDF. PDF使用 LaTeX 引擎生成。 Paper size: 紙張大小: Font size: 字體大小: Class: 類別: Line spacing: Books that don't kill trees. OpenDocument format. Used by LibreOffice for example. Microsoft Office (.docx) document. reStructuredText is a lightweight markup language. Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown. Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example <a href='www.fountain.io'>Fountain</a>. <p>A universal document converter. Can be used to convert Markdown to a wide range of other formats.</p> <p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p> a valid LaTeX installation. Pandoc recommendations can be found on: <a href="https://pandoc.org/installing.html">pandoc.org/installing.html</a>. If you want Unicode support, you need XeLaTeX. Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter. LaTeX is a word processor and document markup language used to create beautiful documents. The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner. Disable YAML metadata block. Use that if you get YAML related error. Convert to ePUB3 Could not process regular expression: {} Choose output file… ExportersManager Manage Exporters Manuskript Description Offers export to Status Status: Version: Path: ... {HelpText} FrequencyAnalyzer Frequency Analyzer Word frequency Settings Minimum size: Exclude words (comma separated): Analyze Phrase frequency Number of words: from to Import Markdown import <b>Info:</b> A very simple parser that will go through a markdown document and create items for each titles.<br/>&nbsp; Folder import <p><b>Info:</b> Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.</p> <p>Only text files are supported (not images, binary or others).</p> Include only those extensions: Comma separated values Sort items by name Import folder then files OPML Import File open failed. This does not appear to be a valid OPML file. Pandoc import <b>Info:</b> Manuskript can import from <b>markdown</b> or <b>OPML</b>. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document. <br/>&nbsp; Import using: Wrap lines: <p>Should pandoc create cosmetic / non-semantic line-breaks?</p><p> <b>auto</b>: wraps at 72 characters.<br> <b>none</b>: no line wrap.<br> <b>preserve</b>: tries to preserves line wrap from the original document.</p> Mind Map Import This does not appear to be a valid Mind Map file. Mind Map import Import tip as: Untitled MDEditCompleter Insert reference MainWindow General Title Subtitle Series Volume Genre License Author Name Email Summary Situation: Summary: One sentence One paragraph One page Full One sentence summary One paragraph summary Expand each sentence of your one paragraph summary to a paragraph One page summary Full summary Next What if...? Characters Names Filter Basic info Importance Motivation Goal Conflict Epiphany <html><head/><body><p align="right">One sentence<br/>summary</p></body></html> <html><head/><body><p align="right">One paragraph<br/>summary</p></body></html> Notes Detailed info Plots Plot Character(s) Description Result Resolution steps World Populates with empty data More Source of passion Source of conflict Outline Editor Debug FlatData Persos Labels &File &Recent &Help &Tools &Edit &View &Mode &Cheat sheet Sea&rch &Navigation &Open Ctrl+O &Save Ctrl+S Sa&ve as... Ctrl+Shift+S &Quit Ctrl+Q &Show help texts Ctrl+Shift+B &Spellcheck F9 &Labels... &Status... Tree &Simple &Fiction Index cards S&ettings F8 &Close project Co&mpile F6 &Frequency Analyzer Book information &About About Manuskript Manuskript Project {} saved. WARNING: Project {} not saved. Project {} loaded. Project {} loaded with some errors: * {} wasn't found in project file. Project {} loaded with some errors. (~{} pages) Words: {}{} Book summary Project tree Metadata Story line Enter information about your book, and yourself. The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter) Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Create your characters. Develop plots. Build worlds. Create hierarchy of broad categories down to specific details. Create the outline of your masterpiece. Write. Debug info. Sometimes useful. Dictionary Nothing POV Label Progress Compile Icon color Text color Background color Icon Text Background Border Corner Add plot step &Import… F7 &Copy Ctrl+C C&ut Ctrl+X &Paste Ctrl+V &Split… Ctrl+Shift+K Sp&lit at cursor Ctrl+K Ctrl+M Ctrl+D Del &Move Up Ctrl+Shift+Up M&ove Down Ctrl+Shift+Down Dupl&icate &Delete &Rename F2 Organi&ze M&erge &Format &Header &Level 1 (setext) Ctrl+Alt+1 Level &2 Ctrl+Alt+2 Level &1 (atx) Ctrl+1 L&evel 2 Ctrl+2 Level &3 Ctrl+3 Level &4 Ctrl+4 Level &5 Ctrl+5 Level &6 Ctrl+6 &Bold Ctrl+B &Italic Ctrl+I &Strike &Verbatim Su&perscript Ctrl++ Subsc&ript Ctrl+- Co&mment block Ctrl+Shift+C Clear &formats Ctrl+0 &Comment line(s) &Ordered list &Unordered list B&lockquote Remove selected plot step(s) The file {} does not exist. Has it been moved or deleted? Install {}{} to use spellcheck {} has no installed dictionaries {}{} is not installed Save project? Save changes to project "{}" before closing? Your changes will be lost if you don't save them. PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data. PyQt {} and Qt {} are in use. Proceeding might crash and lose data Settings Settings General Revisions Views Labels Status Fullscreen General settings Application settings Loading Automatically load last project on startup Saving Automatically save every minutes. If no changes during seconds. Save on project close <html><head/><body><p>If you check this option, your project will be saved as one single file. Easier to copy or backup, but does not allow collaborative editing, or versioning.<br/>If this is unchecked, your project will be saved as a folder containing many small files.</p></body></html> Save to one single file Revisions are a way to keep track of modifications. For each text item, it stores any changes you make to the main text, allowing you to see and restoring previous versions. Keep revisions S&mart remove Keep: Smart remove allows you to keep only a certain number of revisions. It is strongly recommended to use it, lest you file will becomes full of thousands of insignificant changes. revisions per day for the last month revisions per minute for the last 10 minutes revisions per hour for the last day revisions per 10 minutes for the last hour revisions per week till the end of time Views settings Tree Colors Icon color: Nothing POV Label Progress Compile Text color: Background color: Folders Show ite&m count Show summary &Nothing Text Outline Visible columns Goal Word count Percentage Title Index cards Item colors Border color: Corner color: Background Color: Ctrl+S Image: Text editor Font Family: Size: Misspelled: Background: Paragraphs Line spacing: Single 1.5 lines Double Proportional % Tab width: px Indent 1st line Spacing: New Edit Delete Theme name: Apply Cancel Window Background Text Background Text Options Paragraph Options Type: No Image Tiled Centered Stretched Scaled Zoomed Opacity: Position: Left Center Right Width: Corner radius: Margins: Padding: Font: Style Cursor Use block insertion of Alignment: Justify Alignment Icon Size TextLabel Disable blinking Text area Max width Left/Right margins: Top/Bottom margins: S&how progress Show summar&y Show p&rogress Old st&yle Transparent Restore defaults Style: Language: Font size: 字體大小: Restarting Manuskript ensures all settings take effect. Show &word count &Show word count &New style Typewriter mode Focus mode None Sentence Line Paragraph <p><b>The Revisions feature has been at the source of many reported issues. In this version of Manuskript it has been turned off by default for new projects in order to provide the best experience.</b></p><p>Why aren't these issues fixed already? <a href="https://www.theologeek.ch/manuskript/contribute/">We need your help to make Manuskript better!</a></p> SpellAction Spelling Suggestions &Add to dictionary &Remove from custom dictionary about About Manuskript Manuskript aboutDialog Version Software Versions in Use: abstractModel Title POV Label Status Compile Word count Goal basicItemView Form POV: Goal: Word count One line summary Few sentences summary: characterModel New character Name Value characterTreeView Main Secondary Minor cheatSheet Form Filter (type the name of anything in your project) Minor Secondary Main Characters Texts Plots World cmbOutlineCharacterChoser None Main Secondary Minor Various cmbOutlineLabelChoser Various cmbOutlineStatusChoser Various collapsibleDockWidgets Dock Widgets Toolbar completer Form corkDelegate One line summary Full summary editorWidget_ui Form exporter Export Export to: Manage exporters Preview Settings exporterDialog {} (not implemented yet) exporterSettings Form Content Decide here what will be included in the final export. Type Title Text I need more granularity Fi&lters <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> Ignore compile status (include all items) Subitems of: Labels Status Separations Between folders: Empty line Custom Between texts: Between folder and text: Between text and folder: Transformations Typographic replacements: Replace double quotes (") with: Replace single quotes (') with: Remove multiple spaces Custom replacements: Enabled Replace With RegExp If checked, uses regular expression for replacement. If unchecked, replaced as plain text. Preview Font Font: Font size: 字體大小: Folder {}Level {} folder {}Level {} text Replace ... with … Replace --- with — exportersManager Installed Custom Not found {} not found. Install it, or set path manually. <b>Status:</b> uninstalled. <b>Requires:</b> Set {} executable path. frequencyAnalyzer Phrases Frequency Word fullScreenEditor Theme: {} words / {} {} words Spellcheck Navigation New Text Title Title: Show Full Path Theme selector Word count Progress Progress: Auto Show/Hide Clock Clock: Show Seconds generalSettings General Split scenes at: \n---\n Trim long titles (> 32 chars) Import under: Import in a top-level folder helpLabel If you don't wanna see me, you can hide me in Help menu. importer Import Format: Choose file Clear file Preview Settings lastAccessedDirectoryInfo Last accessed directory "{}" loaded. lineEditView Various locker Form Lock screen: Word target Time target words minutes Lock ! ~{} h. ~{} mn. {}:{} {} s. {} remaining {} words remaining mainEditor Form Text Index cards Outline F11 Go to parent item Alt+Up Root {} words / {} {} words markdownSettings Markdown metadataView Form Properties Summary One line summary Full summary Notes / References Revisions myPanel Auto-hide outlineBasics Set POV None Set Status Set Label New Main Secondary Minor Set Custom Icon Restore to default Root Open {} items in new tabs Open {} in a new tab About to remove <p><b>You're about to delete {} item(s).</b></p><p>Are you sure?</p> Select at least two items. Folders are ignored. All items must be on the same level (share the same parent). New &Folder New &Text &Copy C&ut &Paste &Rename &Delete outlineCharacterDelegate None Main Secondary Minor outlineItem {} words / {} ({}) {} words pandocSettings General Table of Content Custom settings for {} persosProxyModel Main Secondary Minors plotDelegate General Promise Problem Progress Resolution Try / Fail No and Yes but Freytag's pyramid Exposition Rising action Climax Falling action Three acts 1. Setup 1. Inciting event 1. Turning point 2. Choice 2. Reversal 2. Disaster 3. Stand up 3. Climax 3. Ending Hero's journey Ordinary world Call to adventure Refusal of the call Meeting with mentor Tests Approach Abyss Reward / Revelation Transformation Atonement Return plotModel New plot Name Meta New step Main Secondary Minor plotTreeView Main Secondary Minor **Plot:** {} plotsProxyModel Main Secondary Minors propertiesView Form POV Status Label Compile Goal Word count references Not a reference: {}. Unknown reference: {}. Path: Stats: POV: Status: Label: Short summary: Long summary: Notes: Basic info Detailed info POV of: Go to {}. Description Result Characters Resolution steps Passion Conflict <b>Unknown reference:</b> {}. Folder: <b>{}</b> Text: <b>{}</b> Character: <b>{}</b> Plot: <b>{}</b> World: <b>{name}</b>{path} Referenced in: Motivation Goal Epiphany Short summary Longer summary revisions Form Options Restore Delete Show modifications Show ancient version Show spaces Show modifications only {} years ago {} months ago {} days ago 1 day ago {} hours ago {} minutes ago {} seconds ago Line {}: Clear all search Form Search for... Search in: All Title Text Summary Notes POV Status Label Options: Case sensitive settingsWindow New status New label newtheme New theme (read-only) Open Image Image files (*.jpg; *.jpeg; *.png) Error 錯誤 Unable to load selected file Unable to add selected image: {} sldImportance Form TextLabel Minor Secondary Main splitDialog <p>Split selected item(s) at the given mark.</p> <p>If one of the selected item is a folder, it will be applied recursively to <i>all</i> of it's children items.</p> <p>The split mark can contain following escape sequences: <ul> <li><b><code>\n</code></b>: line break</li> <li><b><code>\t</code></b>: tab</li> </ul> </p> <p><b>Mark:</b></p> Split '{}' Split items storylineView Form Show Plots Show Characters tabSplitter Open selected items in that view. Split horizontally Close split Split vertically textEditView Various textFormat Form CTRL+B CTRL+I CTRL+U CTRL+P CTRL+L CTRL+E CTRL+R CTRL+J treeView Expand {} Collapse {} Expand All Collapse All welcome Form 1 Templates Empty Novel Novella Short Story Research paper Demo projects Add level Add word count Next time, automatically open last project Open... Recent Create Open project Manuskript project (*.msk);;All files (*) Save project as... Manuskript project (*.msk) Manuskript Create New Project Warning Overwrite existing project {} ? Empty fiction Chapter Scene Trilogy Book Section Empty non-fiction words each. of Text Something <b>Total:</b> {} words (~ {} pages) Fiction Non-fiction Idea Note Research TODO First draft Second draft Final worldModel New item Fantasy world building Physical Climate Topography Astronomy Wild life Flora History Races Diseases Cultural Customs Food Languages Education Dresses Science Calendar Bodily language Ethics Religion Government Politics Gender roles Music and arts Architecture Military Technology Courtship Demography Transportation Medicine Magic system Rules Organization Magical objects Magical places Magical races Important places Important objects Natural resources manuskript-0.10.0/i18n/print_project.sh000077500000000000000000000005251354442177200200000ustar00rootroot00000000000000 # Adds forms for i in $(find .. -iname *.ui) do echo "FORMS += " $i; done # Adds file containing .tr( for i in $(grep -ril "\.tr(" ../manuskript) do echo "SOURCES += " $i; done # Adds file containing .translate for i in $(grep -ril "\.translate(" ../manuskript) do echo "SOURCES += " $i; done # Adds translations cat languages.txt manuskript-0.10.0/i18n/search_files.sh000077500000000000000000000001201354442177200175340ustar00rootroot00000000000000while read line; do echo $line grep -c $line manuskript.pro done < list.txt manuskript-0.10.0/icons/000077500000000000000000000000001354442177200151115ustar00rootroot00000000000000manuskript-0.10.0/icons/Custom/000077500000000000000000000000001354442177200163635ustar00rootroot00000000000000manuskript-0.10.0/icons/Custom/Tabs/000077500000000000000000000000001354442177200172545ustar00rootroot00000000000000manuskript-0.10.0/icons/Custom/Tabs/characters-128px.png000066400000000000000000000060141354442177200227620ustar00rootroot00000000000000PNG  IHDR>asBIT|d pHYs..gl{tEXtSoftwarewww.inkscape.org< IDATx{W mbq˲PP[/CI$5ME5A5 &#VJGDPKZ - ,3s9s=s9ߙ3}i0hθV$K\+u% F>; l1 `8!g5U`E z˲Uߓ끝3| ONf _)ސ yԙ<] fs[ ]tpC7f!plIf .dZOO?|(0zʙn?Loya&Ѝ{'@K4qo(Poj:r]XEdjpoXU9 N5&@ #FM"+,Gͱ L# WI0ŽkMWL-0x4!৸7IYhzGpo0rd%̆v=tP6j` 6@80P7NVHfw7Jֲt5u%۩z`- FT]\ \q11dxfa($`bpEHGN`kI6ۀS.4 Ɲ$ءx i l4%B4W7"ϳ{ OQڀ.D $ őARbQq[< %n 0 ɗӘV#"~=7_|2 q :V7#BkW&d%P,xD}}xwF}摞s9Q Mu8",\dA. x_0.샨0Ԃ"f6^ES5~͠1sA“K#p(*AȊ`k %l(v4<FC+ 6zmHD Gd "^e {L5Ty7!Oߐ RkQH_@;0$p YIށxoE}8kE tWC\*S2ف9' ?-{z+mRFzOr|eV `(b:Lz`< 0d jk7:ہȢ|x`r^FB'Tt^HI$fDw~ {Ol$1V o`)rV2𠒝]4)H HR^Gr{`N,vOKWZ.>zflu) %XDt=u#mKm#sjspYU 9SS4#1x/!JBrv3}} IB'U\='zDl|9*($gҝՒb,ɏp}F9H`$V&d[%+^$11L o"DgU5XefEV{Y몺5 =1L54U: @ub>2ef6c)S ͂0ニ@'.q0J:bt6i{jtLGc C@-*|gUE)6nڞh&e]<r=}`9JoS A: 9 Fx4"]s'rAV9 |=t_1YI`}M1~ޚFL어:R*;K-I&%֔eSM)~x *h~+$]gQ=JI&ýy`=3E@Z뒋]9ueQs%T}Q'E'Pv:D_X d>~vىZ|=#}0XS"!F|t8,@5mf̍(\gl',F}gzop7һ$ Iʩyɫ(a]@vʢn3T DSĔ+ϗ#kb2=Ga9X2n@KMRJ\>J~}4"2] %qO)F_0sT޻?a1݂^7{)e+ Wz-?q&.q9sך0~ (J@J?uqg H.=-GVDn$RB~?䧙GҸG[E&]^JYq~P"+nb@UE\>08B@!TZ#>DtIPU\ZVF~MwBMn lP,(=J[ճJo7l,񳈳HtVc?kTݍtqƷ{6t.p̴/A$>23t!m4|r1+eikFfIidO )&0 &~`'\kl\@KЃܥ9ht1R($(d'q6?$ݮ :~xYX1i~VieXBqy 'C"w!&uۜ@VrtFDpzI9MȼcȾ^HQOlYH7Pe-CuV8!\H$k1Ycϳj/(U{y `4O Yl ddܵLʏP F3%c$^/l ;KĮQsuR|BLH1VN^֘I6 W,3 + kyӞiC¹\~/{:0"mq҅>g.z | wu0 $] ^iJ#r4 W0yIB:J Iލ 2?B6Q=IENDB`manuskript-0.10.0/icons/Custom/Tabs/editor-128px.png000066400000000000000000000060301354442177200221270ustar00rootroot00000000000000PNG  IHDR>asBIT|d pHYs..gl{tEXtSoftwarewww.inkscape.org< IDATx{UUz"+H < efZ #VNeA8ԘƐ32G(rJMI)dCy("\N|眵^k7ZkEQ@J ,@]EQZ:B`%pWR(%}KάhJ 1+> ltJ*|x ҃*#4ok@%Uc, 8sWI3+=x}Wʣ lMGڲ+qinM/#'P0}J,z ku z,'OĢ8D`n_d2NnM;[~CxuvC_52z@6fQLG >Q0?OV|%.D+s@;S2+z63 _3 MM'Pbsf_'En>8.Po]L,4+q鈬ŇV#"푥` 2v'p ˪.NiI=(腘Z]^pȃ%`@4`/8c܉0FJ >CD+0=f!.|p*1 'Z dJ>[3)tmt{(Gy{ݣh$"J/g{=5 iCq 4;eraC0ъ?|sHb՗Ҩ7ٟ(ۈVd?yqL01+XV*4LLDRΊ)t:=˟O19^PýQ0sz`9p5s8!|s uyRuǵW+$`5Rit2$I |ߛd;yf9Cq%kX%Z!NC""Ir 2F7~ z6޼r>Exv"YBrK>UDqEu!V,y׮io-;X1̜wonW#a[Y$S63Ͽ&\82Ccv}to'"3X[SWHt1c6 9|YĝVMʺt4UI=W•ǘ][48!?Kk:};ݐ,R{/MX?^5x`J*G䈢jM?.Fva|*WaRYU&\q^{t7`((5K]H n y _k0˫=XD"ɻ_7a.”Wb^CrrSD]3ez?[g愓@\a_8VuE-|B>\{Ejfڈlj 1ih-/HᖸQ1Re+-\M8T9>0N;`Mό41קxߪxp8@6X_}+Y삱kI/n< _ysσHM(Бb?b9͝~$$dt5-ތ%a{\첮Cci]>/2\$l&hX̦O>,rFOcv6_+I/JxQXi$Ŧ9,wgY ߯K9z_Q༄囈P1 F*E,î#vC²MǞ0}9|8Wq$s'ɪI a3E}wa?]˗m =RM1/E­h.IHqHV\+Hİt-(!y%|č݌ې~݀n|K'79fY}{\eӏRbȒ~G@ja*j{cr\j>ҍinK |8 ^ +btRbJK)t! Q^I{|-،N^"KQRx_g`VocGtaG4B"Q&yq2plNR%AaXڏpޏsG܅ȴIT*vo-u>n{MS>nĆV% ;0H$ڤ:_q.zQsw(m:'{ACȯ.ܕVJ% xݲ$Q3RiAhN+!96Dy,Jh6m JY>se(!0<$QOWZ%|$˔ f(ؕ*w UqD @74Q*RA| RIQ"KRu$(JhP]7IENDB`manuskript-0.10.0/icons/Custom/Tabs/general-128px.png000066400000000000000000000061131354442177200222600ustar00rootroot00000000000000PNG  IHDR>asBIT|d pHYs..gl{tEXtSoftwarewww.inkscape.org< IDATx}U ~,ߠ Wa6535QPFZQ 8c31)6}C1ZbFc!a)iB& |ܻ\}=g99<}9ρ@ w@J Ӏ@sAFM0t t@ ;Z.pA-@#0xpQ3zt-zd<cȓCځ?8@3x ޓ䀿}`64;9t6f3LSy,pUawm9,[kbppr5wǸJ WGǀ ۲G@YÈ_ö*s"<=z`u3λ67repIQ|AYQ=Ȣ^`72?*26!N&5m0Y4j.ΥC'2.-|ZN͓X | t-/#_ak4p(` 6Vdj0a`5.6#Uhd=!~,0X|2]UȔIin!ˮ!#xj4 ܁'&n`z$b,T_KmmW/jLlU0i :dϡNӀW .+1Hlߐ WaR"ċW¼w#kNt+p+0(,rs+eXPv'0ŕ!4*0ănwU)K[IBw4sXQЬS EcݯQH31Q;H> 24a+|Kݦ]h-_.ƒ?FVЅ[0ynQhWdTmۨj-~.EF1Qt{pCE]4a`Td4Z&`MTLGZчѬ!j-v΅!jI9W&`q$bU!jmȍTIT&`>V*@.5J4;|HfsR"7>![YaR.<8Y}؊oY(rHD TLA:ϱL=(Eق7 u¸GsHxr-ӑ{Ӏ6F>\QU=I7TTP<`늤&ao?Gqנף.҂t;?췣Ny>Nr|_*>J*v;k$f|ʥyU[՜.Ty|j x@wB c(G6;\LEnv޿Jc"{vTn[\nWO9ӱeiDwp97k6_^N֐MG![Fvv`>VlB2;*wSOOaMȃXsfGoA;`ke56烏xxMRUE&"l7B9zKҠxtGw rU![A% ,Fwߑ u1ېiq wnX | CEI3|_\`e+^CۑЃn8~Ҧfg"1G \;:t\nFœS҂G~ڜ\Z"mp{S }7OЇ#<Źs[͛6l LeMUqȐ=e\Z8dѨKZ:C밿˜t"Àh+#;gnĤY}{;u_C;{N,ďV""+UK-@)HTsxdagH7pasBIT|d pHYs..gl{tEXtSoftwarewww.inkscape.org<IDATx[Ufj^0.BJt#*R zł ! 1 ^ QJ! "9Q!AIRcfzsg9sYs]kf}?X7.ߺ   ї R`1\} lI ~m}!:!;@+]QK!mm9w d5fH/\^eC') .P^dJa .HBb>ng?Q WVD l~U#~xs\ +" FÊ/o"}ga·lAX u7s]H7>`gpQ;Wh.J!0XQ- p`?楱<#p)CqD#uǑqD1/2.R-B|\,h&"1)G8"8qD"'~y X8vYB\fOxm"jxQGʛo"y){ނ B79|?b"F\UvkI#i 5ֈD8a{I-Z7o^֘66@N RWt_ M`e `^ME-~!P#1dͿ6Ԗl+ -R=lLir+kPK?M=Zb`i` ={]1G̽-:$ pG8"ǩbHX lC ?D`cthJsWL 'Y ÞW cFb"_0 Q"(:`i"ؙ|HX3 H:LٴEP:l"N6 MB։4l:L`gSp6v6G u39@ہ#@S?s0z0#HYB2,8Y4(qD#hRa#pș7m,:򸈻Y"pipe;4Gv'jQay{y9a3Mؓp+ &{ni#4Y76 JJmOU%[k?MMU U5Yߚ6 ,@P%WVkp+36nԥ05i?p2I&;GPͰ%, a"B/Oz}E&.RI ؋t 8qDd?A~!`=u#;Ml?8vJf}?jnK+nCm9KJ?@hF\U43|f"^zܸQ}fD `ဃ)͢EǹRq`'fjT e5>w~p{{D/'q:O_F5 f[<8[QBuI;in)J7GLrފKW$~$Dɰ h%K0Iz'kSo= .U(qCy}|ߋL =n_H짬tK7> Qx/\Ґ  %yՐgIENDB`manuskript-0.10.0/icons/Custom/Tabs/plot-128px.png000066400000000000000000000113051354442177200216200ustar00rootroot00000000000000PNG  IHDR>asBIT|d pHYs..gl{tEXtSoftwarewww.inkscape.org<BIDATx{|T՝gf"(mU eVXhѺjm(JEuE|]-ʶn--{HЀBQM!{s;NfI|9w= `0 `0 `0 =#|7},˲(a{@ϵo|*,[u;b*~ ! !.I&k1POVo{ӰˀP)m+(c5z+ !xm ~ndCN}Ůf( DP |а[uu,˺3@o OsNOnUP]]=࿝dn.03@\*7jzֱ0 pb%XrQDU4B(<ǶEef5eK|mt%0!]]UUuR7yeW@~5,Q^15[zD۶RiG !r@~@MaBΧl d[?P 2$t9,z1\[>kq…U<@-kTCFJ==q y6o޼w) drkT#FҔK):::?~ׯsg3P'TÇ?Jn?w-=;_;ck4,YCȑ#ۀxvng ~Qqu]9k֬^ 3xES>XUhinnnoo8: §Eڣ1@=@S;E{{e%3{leKc@O/\@eYL6MwU(HRm'wajP0RD"1r̙G⡄%i۶m/EJQo;( ˲~ۗs6QmmmWf%x-Q~xauwgBgb3}RN@}}}FJyY:3/7#_GX5: o+=;vgy&!Q0LY5=Fٶ*Ţ:T q ~cȧ |OsRܼHFDovD|fQ*(_^mO_RjYJ9DzJqHm@딃?θy>D!&wկ_oD`Mq7դ 4:TXtPJ[Ahf 5zU;w466Q}eYQcX\KՑ=gN& Fd<*Px<~'w.)壖e_=7nܸ5}ًA؃\^\\yhl֙%菎$w,YWUWWoDm8}+M9W}\| BYxQX*k᪕35jӈ#QǾay>;dey(OŋX,*~d2ETmڴ\x|n{ˑӧR'y^X,bEѣG8LS-\]-3f 69H)ګVJy9c1.ǎ?~SS]}G[ueYCmʕ+ÁGxJM:>@W'lܸqQΒkm{ByRޛcU}}իWx)vXrd2YW[[\WeYAmt'eMMM!S;{-=a۶,ɯ[ZZ.))kk \@\9lذl^;&RӉvLutt8\V`ԥ!JO0eʔcuu>vHGxջs0ZZZزeKMƌcYּcUڶt:Fn^֯_?HJ9/.۶,eϑ5e=(ԝUE}u݃]]~~SSRvĺSN9R˲4۶EY%}Yu{M\---c5U7TY䃗7Nu9tglohY˝SP!e:z޴_(V)nPW#إ$um?Bi;iwu@%=T: v䐏MO%: )bq{D&G(c@ڲu|,2Nmt]'F2ofk5h x^JKB[X:>8KS%}.k%(mRޡ "{H)hkk;c]Oqm8qbKGG DvqnR$2yzkkk$}ՃVRʟVUUdRɓ'oܸE]#N^ guBXɓpm۴Kf%)Kt:}kcY!:djeӏ{5d2O4"Ye<2htd2⑬Kھ~oJ~)<;4H,/&gr_6z/6~ r蘍2d2c,ZP__eF[~mKGC hr8q] e'=$o$YƢ"kFj2(`װ\U(}EqITMmXd2JB !=T%n(v2|Pڽ'6=vs݊horGT6jkkcX(<~1d2sK͒PʗShVB7\Υ~h)%#LnݱcB(%M!St9B`$jכlL7LڄGUɓ'H$! uw]wgN&rs[[[< =Tԁ p;j1#tw+{orﮒkCOGw_,{0Ȳ`I)'EnGD< ]Aci!7YhrSV)e;|mo,ˊ4}'`8ju>;P |@AYY~jN8/U Fu߉ >cP7DK )=CgnzA nGމʷ 8K-~3#JT1C_G Xtp**2L'p.*-kBy8f.Rԣ7Q_EJZ+E:v*fK@|7P-7LA ÷G(P!~qBM4|*ZR85>*cU)=1\eJضJp>؏b/)]*uzh@m+$466KJqJǯ <u`%q]wbd2Y S`0 `0 `0 `0 `0 y&[c \C9Xȗ{<*6߰Y!Sa#smK#y `0 `0 `0>?j5DIENDB`manuskript-0.10.0/icons/Custom/Tabs/summary-128px.png000066400000000000000000000045021354442177200223400ustar00rootroot00000000000000PNG  IHDR>asBIT|d pHYs..gl{tEXtSoftwarewww.inkscape.org<IDATx[%q5^BtM1A)>Āy0J> /^q_T K""b_L@7Oޘevvn>}>TwWWA1s믪4o"iV N08 ؙrdx[X6R7SO"p8| Gr>:N!j|X*XA9׶iRhW{5!,?j%)A|4a.B.H$ysZii  ?HU0nBZMבV:7CE){3M&aؖ#KA%-8gK7F3|ݿ٣3#߂"l3sQlW]i7([Uʣy<7ZxM+;&1(O:(uZD9|`<>ynl6fn|A|1e0Ft FiM"cm- `+؍xK#N>f~)dTVZCh=Ɩ#'GӞ*@K|K&G;kق6$۟CG=nvӇ SGGKܩox`F2>"A\0aqU)6qWLCz3oG{Slw[kPs7s*2/4@/jj|$5hO4cȤQ#DH1 lZ<[HDc<YD daGv>ƖCOc#^9t:9 qr a'~W-r' ](&rippWC8/Dzm0_[j|GSOq p|C5Wٲz/H.9xfw7b:ZHi> 'Ȋ܃U*ŅuiYC|B tmh`ix1 0 P?h2H+:\(&``>PM&v i]cpp*}7'ǢoD껎S=t)|Oz[ʸ5rdgĝJ Sp4gS ,zq) ![+NSc'` Sy`cͦA:@6T\F&:N4@5DS0 P *V?#!{%2g@Zkd7(|z“^Oz)IK6#/:@GVB,W&!_U<8Jп(vlxuqnf) _+K0"%h# 3'*4@yLDBXP :N x-#˪ s4Cցg ]='~W5r'W |c9DZvko. i(`p/=|5m29U~Bth:'#R: %aq pS^dJ![% q؎{,v$tV_cgd/t iڹL9§T*<,$ :w3X *@嘛w5DP0+h4U"Vя6<wO1M'|7c6@y|Oj ǧTԵ5`ct1+!Jt_F"L"ZM#Ο:"2oYR$L ;>!j.Dm6vЪ^UJQrbi| nT] ͡5 33,"|?\9]>A6uCϹ=P"U[3e~szې6oɓ)MAL?4| x6.4Ywag΅xN {IENDB`manuskript-0.10.0/icons/Custom/Tabs/tab-icons.svg000066400000000000000000001210111354442177200216500ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/Custom/Tabs/world-128px.png000066400000000000000000000104231354442177200217710ustar00rootroot00000000000000PNG  IHDR>asBIT|d pHYs..gl{tEXtSoftwarewww.inkscape.org<IDATxwU? ,e XPAQFcI4FĂ%FcWL4X`K,ǃbAFQ+ { HG]ʲ/mo斷|̝2k[ѬQ9~o fhpm& D%U~.@7*5a!0|-Od 7@0L|^^#jY p8p7? &czߌ/0 'ۋkahFhGqOjX~VDk5 4ů[ǩ 3 {lq=0lh*-qv+ \Nl1_ x;`\ZFn܎zyԱ76O@{j?v A^on~>c GZY $Od81:-pP㨳KH<C,}4F|rYuLpG=\hBOe\Nޅ[wf p%6.lr`3z9FF5r:b2-F]za>K?eoGP]>k 1^'o<՝ s[BaA%7 ^9xǥ^Xhc\e_tPBbd+!J?<T{Cr,1[F`/ D+@tntN# ;]%N _E2B|tޣ4W{, DܕHX<6| YM^LjR)w̖Y܉+/ӉjİQ~pޯP Qm*Zkc׈iGJm ?0=(-bT}.d6YCZߝQ q =A`Ā5Mw[FѕBVZxmrciUߒ#l FEl5:7:D׹3^na<= z6%7aaS^e;.[&K.ATa`by‰PGD+ӧA~e;! j)%*tCu TRLwi9! ܜ9fd7 C2̣TU UhA9\)7W"ba1k(eTL`F~*ORTHѲfWӦ؀M@_wT B-Q'Ԙ䧲j?w% tnO!v"(Ճ{ΊJᚿW:], xHDF9Q Aa0Z#>nTʟFߊxuntB;dt HP'Ę֢B[I`Ɋ P$Q'3;}Xe (n+*܎uq yE'm# (h>=3HMҔ>kHg ѻ  dL@ugo"' Ow*.x6?AN*|bԯ8tPN PFQSTNPUQpjqO|liCzw:GEe8Nt,yT+/ᤣ/}` ?q6~S: 3Nr!^vCBݝfCT ŅjP/NV+&u*ycZdQ8>E=k.Bi~tN yc͋ScwT㸞Ҍ!ۢ Dѭ,ۆ"J.#AҜKO}7@PX7\Q%UtoBͧ(^G_h~ot¤܋xQ^}9dfPYZ0PvA1u7O@R:n,9 uf*$n(UXC'q #y')5 ;G ldD)~G4pE<> 4d{3nQ- Ըi^|\S:=*@k[ o,p1&w6S'I0Bc[1U,/>Hty@OImD1~nǔ$Դj̏]$gq2i9 `rVK<]g;#KYɓ"Mر*DRDQnSKϖiQM At8{Lu`}s&rHLQ=V7vqo)fh&$JERw:` ^)Pr0v^*XV!SkЉ" ~c+~̥!0K(}]ltHNn@EBǁ#S{:@Y5bU ģ#k=Vlwdęӣ6*<^A%>T誼ߢw> +HbXꇊhyG$f?3Dsg><*eY Q02*Qb.C@^ ɻS/<(0*FF"QoIwFnA} IR`೒_V\d AII(a X8.u4 pWL4ԏuv%xۨ i7"-ľnF>,@h.Nt4?ϰh:Jāew}PQWl gchs.yseʿYJ0^sqCT$F{b~щ(\d{.x֢>p UEg|iPZT 8^,YϪkܓƓB/TEej)/(dI4. yMǫE[s4+*WN,,$:zZ:!I⨀}1k4SXq#]Te9 >Zs$Q=+Ee |ՃڡO֜Úk$'uiZG.G!]@sFm-;|Bu xڥse )ȿHpFMH7 M*<:jE)'@w!9}O%Jܓ8TntMp&1$]> HM$ܐc\oQ0v3`u;c/Ir|#gڒkk8V r *1TeݙW!Ϣ> TTkU *T9Ȫަ,wIָ'$e35}C9G" )oT0| E47#VAbTW~Ф@ Cč$hC,^qfڸ lؼԴ5ǺUZ T1[)܂H>sqdA'N'Z"Vy?Aq.imh*3oT!֕|ԍqT!cIq r2hRO*z!wbXN &9Ʀ9gRK tGR#QQm@i6~obtA#"6[}_?cdqZ1W :ġ+~7ڊ2k1IENDB`manuskript-0.10.0/icons/Manuskript/000077500000000000000000000000001354442177200172465ustar00rootroot00000000000000manuskript-0.10.0/icons/Manuskript/icon-128px.png000066400000000000000000000126261354442177200215730ustar00rootroot00000000000000PNG  IHDRi7@gAMA a cHRMz&u0`:pQ<bKGD̿ pHYsWtIMEIJ]*dIDATxwpW?Ge@ s !$Fo*{U[u5[;ֵU{u:{06X EF,gi5===ҌXv_w~KmOwD}d ;];Q<~xN\~)g.N_BlY{NtqL++Ҹ$ҟT@2 8K4@=ܢvdWo?ןA!>+ D2iLd 'h$Md Nc41=HJvMەnd$x%q~Va )Ț1XK&NnNϨU^TҮ Qd I 3rx֥4^(iz|3\A&mQ?):,wd@ /$&/ !B^L&WQ<-/)9`B6ZWR#K^ s$p4.;yҝ2˨V-`=Bc@dK4sC 9 E7s~iNݫd*M0aۄ !y=/r\ki2T/uF΀ y'hAZf p*^,}f8L&5i䐎{I WL+ـz us#/9jtuNSҥ ک$iD߾vD3O)l 0I$O&td}[c0;k9!媄_!$Tzxr .RdFQ-?;N0`=<#Eԥb1!{9 4P%M1O(gzdZv4,d: #TQ}qRqߓS.dS}uwB= Oa"E Vi,"9)#q_ͯ]82Wfǣ`M. e~ `APA1DqtP)UY Xsse1m.D~3ET&HM\e) $Z)zwy}^àU HYO9?eм%L-+nj~N}<'-xBեb9  .V`\4pCKX߳+I @NlIQ/h>R øij<|6A5:BԯD-R fȹ+8r :#VmX { |Bb#g~d `E Pgpl ΰv0!H1 ^,[n[[2"ЗBn&ߤU|ăE_jv2dru>V^AP:Nk%s- lr@`[XFU1!V[}4Oz)gIa->U~gcmָjEzLzOѥe0 `'ɬaBpPy6|R6jI.m::ηV.wgJɲj>YuaLW)Q`7Ic5Cm־(Wg'u1 #,u X`qJHaj^qLBu@ Wp/uz_*I7pndV^E4"Q5[5@/@AIK`i4~,ofh_Cw*sx)9YD?L06}Zՠ\"߾&|iz7i (bvqxTz}oRU)>{N"kuJ"@ϖۓ&檐 Hv`_fΠ%b/8X-hP294n Nh)Ѝ7Ŕȶmp4SIjϜVX q(=r/Yi}oSX``G 2,~?A+{uЯ؋*yM,5eSln3<`#8F .ozBsVa ƞ"_p/ic M끬$öΨW\h49:D h& }@FWSXa{dP[HHm-&.Idiܜr ' gϜ "CcZAWE.h%HTod+WKmTCm\+xdi}䑡NS affu:fvBn3tjꦘJ`8MBx`_d+BX0ߙ̓F]tQHn;B^S@LE v bmCjDY岽 j\=td#moe7_Ya{ְ)T UGi՝;hAL$$C*}ILKsU$@*9~ cl6JW"5zgwOqO &W* 9Xܧbgd@~Ӟ\p7\*\eL\OyfaΙp#7A3c!3mO6p 6@4k!N8>@&ӃАJ411oP8XLF` >J_b ~վQ(օ34Np gUőjKEU _[O ~/AWPq|_bR3XĠQA!6c 63Z9GmSh]d?n`aq_7 KCϠH=@ e+t 䆇y$G q U"D+T%Nrm [>t18Ⱦ;^ Q C|CO|ҏ!'ꉉ.x`󉺅Y R:/ 9Daה%Fpj{F8B!A2!\L3Ui0{uKlt <)O 7o7ҘtAŴ[i$کDݷ f=G 1\;eMhj7UC>7i~9dγB~,3xEjG foZYo?YнmKjIWJ\+K:(MXf3/"کKߠ (>NFΩ2W~.8MY .1LQfn"B` <V*(_3'8ud b$N}EܼUwX _gJaZ(!/|C7I'D%y/x.} nIŊ:%J>%pa0 "tf{H1Ay.8N`PS5̪,H\HYЦQC1gi%䲀$B_&~.)C$.H<2z0 %/&:#x= ߦCg&*_~jq<ØX u{P?Hi/8N9@B9] 38uG12 ѷ+(4Q e cDNֻx; #["DYo{XN9_"Aᥒ : DA o~LC.f.@\99b}g ̡Ch_#,nNp.|5oW3I:7Ѻ|aV1)l'7Plr8kޮ}X'Ay,c>#{ucUdUB6+vS;bp0,scH 6q縧A:.X4ӀxY_çr?3iL` $@NwsskNqs>X18+;H%JN?餓qL'4QO=ܤV=̢}0AX£I`{ٻDcvX @0cտRX e[a%bmZX `ׂVFE(>X spNsX,n݁@cpX_$2_vI G%tEXtdate:create2016-02-06T16:30:06+01:00P`%tEXtdate:modify2016-02-05T16:38:27+01:00 tEXtSoftwarewww.inkscape.org<IENDB`manuskript-0.10.0/icons/Manuskript/icon-16px.png000066400000000000000000000012341354442177200215000ustar00rootroot00000000000000PNG  IHDR7gAMA a cHRMz&u0`:pQ<bKGD̿ pHYsWtIME#jIDAT(uoq"N5]эd 77'W88 #1,u!e3Yuhp򾾒D@}J|z]%(rˆRawmW2m%s)Y>?ńW!fQۼbBհtr`$H=9$5</ OI)"K*KQ>tGd}}e-꠰5$萆M {AArdge=3WLK`d[}VxcHI Zɛ ?:LB7E eIK~pU Hzv9H X?{1gt}4悧 #Ԍf/C֚/*dl~atS%tEXtdate:create2016-02-06T16:30:06+01:00P`%tEXtdate:modify2016-02-05T16:38:27+01:00 tEXtSoftwarewww.inkscape.org<IENDB`manuskript-0.10.0/icons/Manuskript/icon-256px.png000066400000000000000000000272311354442177200215730ustar00rootroot00000000000000PNG  IHDR{`gAMA a cHRMz&u0`:pQ<bKGD̿ pHYsWtIME0-gIDATxw|uw{/`IM")*vdKȑNb;-SKʱ_Ďl%ynئ\"X`++Hy,@bwgv-~ggܙssO6 BwgЙp'hC!+lxO |ԢxO D6{Bm\3.3\”xϼ (e)n._ Agf1 Wo l>ls0cD~))I㑲߯H4`?Uq? ܀`9R(R >=`4ϳ{]rڊdA{zыtCYxsPA<7 PK >ate&/0 EЭ^tѝA gC2H'-B?ֆBq\9*ܵ,^a0O1rɒyO$g/H1zEGG=U%QuQ?D{8`p>nȝ &7H tcc$]ɲjf8\s(8,=xɧ  _CQa)4d1iLa2Ɏ3q즘<@:q ^P$be1g 㸃2͔ةd2x"5vdONX)J? WrS(6pztNS̡E,  xaC$vle#. ^,%ɖRmȭq,L)CC %f5i@EJneD|j'KW9LWF3\rQjQȀ3||tB2rH!W4XRlK7% dk(VS"3NL8`9(9 //f'm: 0<^zI=a='yUyR9?  _3|53~&* YLeM ߱BwgygWkM3a^ ҩ8ʩGLf* $qmlP٬c<]cSLo8]4<񞍍߰XĽ[d2WX(EFN.q3 T덒?!$ nSһंx'XVs)LD6aiYy"+Hb(c'44UÖ zG*ٶ;E')(gnf!+Eź|aȰ~™m (ܠv4P@7)7]яu}l ~>b#X' !Lv^Lgr䒢}.^t<*& Dif EB.(2it Gb.3D3 J˷aֱ͟$K IyX2>ZWg+cjJ󩈨doPKbܡ^JpPbyMa3%c+XJk\.w$m^*I%sQ"=L4n f.ٲWe*^9%;+ȵqCPQ%] d6q=cWSL)yfv.X#]OmxK*jI}vP"c ~p9jh\WNI%ma7ó?OVOpmRf.bL αK(\c0kt>R< h0$vU.0>F,îƑkNOo,,k**It&/\ws\?A2Kz\)7YOYb2Rpu*~.1S UlӸa-Wg<$W=PҘRgYZy`Stu߈i |A6q)Ğ?L0(9vj3 ͪj tDu`wHБM 07!(g-$ߕd5ziWk2Y'*Ya[1 h_H>LRE3 J)i22Qqk=Lz Mk2"S 5X,Kh! cd/\ae | mz/$@*|.Y ~~Iaů[tIFb<:J)TLәx{kG64z/&GuOA#*e2b|l^,1խ]*[%t4Su7n+,u$LH<&_Pv贠gpů,e#xMJ89QwQɥaXxeIr|ZW"lcW}S0DussQgv6\ 2K  o?VPi̧kFDiWԥOdƎ@3ɠ *a *Nf2 \tb$.Q.EݴFU3 `9*/}/BO8[G*0 H@N~v'x`M Jiq1 rtf10PB.yQ4FB3ߕ!XA#,{: rF&@:vj2OI_ .FEUF0,xNZiteib@J!d")v,dHpxL+C| `zbn76'(giOk*#rL/eY7*\ ʳdY~n Zt2@N/n2tirl_3"eHb>'PP%Ppu`.S :{/>,em3~Q?Yt!o,R mqIL3pg)l \`Fޥ z +v? eAEx8mTxpX44pAuNYfV%`=A ` 즐*`(OJ~w1^FQ=$߆`JL0VPVvP` ]mP4 h )8]]a!d#t3NJ6sC2m]6_L3Q804PL_Af$]Kd@ݭ9n9k9JL~P(Q)@'`w&F1@x q-\N"װOnc*ceNɹH1 BA|sP׫KWvn& f4LEbw;'vIe |WsU΢CDepV%S0feA:.1v{yTCf|m )3"*A*&>L5c`Ke`m~ 8Vnn2̀W)o01QA~>j fK<A -H6@ u:c@ 6wsW8aI'% ,&ݖmq̕o o:G.%ߪemR zzpJ %|~9,6j} lf[AtWLhR $Jmv%;1@pi,9Qxn +%}"a7 IoU6~JTe}!֝BBFHPV :fF4M!'F6C\&=jse?X's1o.'J!f: "ݑwc3`10 -6&0Av߳W004B/Gލ4)ҭ;yd c5ߩBn5 ϡ2 #)LXW(|4 w56~a u TtpI@P+G3QD6})ֶaT ^ au/fl|T~M0}'ZșPK ^?hik]E.89B 4/5l#*З3Q=.Ak}olfr%!*|*eQ@L~!LFvs9x‘i GLu} P)twщٺrC}4J&qj!1.J9q - h0JHmTj"v4(D'cO,w@3 ܌9{XeAQGT.wT[&ѕ))XqS.5w%L){:ۏ=j-g#qw39Jow;4pQtf6cbc 2e +1@ c5#gBĺg `'G5KQ 2~I)qŒ4lmJ4>g =+NeUV&S9[KL}| u\"+a{!B<c4~uY0b{#yQ:楏*涀`D@9>q 5Y!a͟<)y(5lYsn7GebfBXQt9\eh)}ñMmru@Ќ)> {X 9rVypق0E|MUhtS4_x#{BFϢ=)0 `g57pVSVc1cL{ (( 7q"`^! 즾+j$*hd1EC n#k'mu].h7Sp ),4Qkjè:vh L3) Le<%&N[!{`Qǃ2u58PhykTmpM a4/PFQ*j[w㛺26Y4?+aL3-xhw!q'_)| -^gTU8u5)"xf2OIw;*JsTr:2A}p6ao868\Ⱦz 9~Dg0 WxL9h$\ԟ|Gv/Qٍgi|gâL4>ćUo&~*H|hKXbex=Jq ;CUriUq\0'UV 0Mx`'?yPxk =~VfI ѰfQ)LHJU\Y %~p9QنZcǞAuA' Î &A㸊VюқM| Ͱ^kruA$_ '-.I # :zFi%R|^Ax>仌c\~ΩX_?/<)W :(9k:o([+9$gKz*ՎIMU\"41G|4 ):!&XV1%bϯP+t hg9͈rm(Oסm"?#)܎P:2~qӅУxqQ*Y}%v:.FGPDM܏CC({ɷK2MчB\7(gNQg6cE/Ru&v.C'Vq:J:3$>zB16:|[ $օ0J8vg8i:Fqj),}لe+S!Gd 2әTw(u[L Е)xO~PzGZ? .L?ƆW8ͦS ЋL(pM*%&䷛fF 3O-ћ̦վMx2?,ᰓ:2+@ɾ-9A3DGo-4zcvC;`xXܮz>>0#.!.o;|etdCkڳ V7E77)Ma5g;OmyMH1@O&*a c\Ɇ;11N@`//( 9ْb ,7[{`;R&UQŸ) } Љgxq1yVFiфB*6 K.wX j63BX^[#|A|I)Wv1|E.ވ cΜZvq&*7׽l$YR2&.~g'N atjR^DP1Ҧ#v?MlVѿ6Ɉ\PX| 8~Tŕy`/ hrיi1:p=6~vtZHslҿċgIZ%7z=Gc Ca &BJ Jz=!F| _ԋλZw VT6/(?I4ۣLh?d kE`+_an+ho Kp :yl𱍗hs'2~+j*=ئxW +xp?RXh:5l#/XgμRQ3 FgpꫳFg# 0&Q] ;9/ȳ|{⢞S]JiPuXeO˦< }A 蛀@ż6q8uY&' **CXbr cYlPJc$@VrA;3'ȥs 9V*E9qkyQ<XbSɣgU](f'G)'f)Lb=]?_XN A/&0 Ì.r>.JŶM5c~J*pŔc^pNP0\FЅ,hrrRrX֔M!4:/yoJ}6Q0a 'H'`z:j&8rrwpXK|`@#mc@j{(ҔL2D(M:Бt |!< r]\SnRENAxЋ-XLD#_ %Hx.\"7G ~|‡O4hIևAAanb +{d> _Xct ;m0 Tv/hC,`NJzgnPGhg4jC< %?Ú~!`V a2 v,d168 Ё>f?(m0d eԷZ1A\h'0 |dёG+u`1@_Nؓކxz9p'{`<Զ[ 0@ɴN'ކݖ҆6 '\Ã%tEXtdate:create2016-02-06T16:30:06+01:00P`%tEXtdate:modify2016-02-05T16:38:27+01:00 tEXtSoftwarewww.inkscape.org<IENDB`manuskript-0.10.0/icons/Manuskript/icon-32px.png000066400000000000000000000022511354442177200214760ustar00rootroot00000000000000PNG  IHDR sgAMA a cHRMz&u0`:pQ<bKGD̿ pHYsWtIME%";wIDATHǝKlU7LmJ4 JE *KkFLXM֘0,Ibb"!HAPAPDA"U{v>3Cb³:9|9O=r/ʔ(GN:$Wgva'PnU<-G Mn%" 1! )ѻ +2pD{fX 8L͚eE贇fD7=N8Tڡv8:]Z{ZDCr0ZF{c>Wmqb޷dd]u,%Pԅ5nқ6*ކpSZ:DQչ+#BHǛ| 4)sJg CիI7F ϥ ¡ho*EB;‹P <4zzP_M6Ay10egr&7,6#8aa`h9 L8KjgRG:hiA!7QVaR*f{[<򊈠O,7)UKxV`|z6NeV T8#,@fxS8-=gXNDzq\$~s"}͗'KWPPk~`ˣ&]9LqRR4ڧfE\LI-zMUkwV*D$F@r1KdGL6*6BLO5j9W.J96(!)JW+"xͺRR5vNZ_'v٤9{YkWKs!7LUܧ4-2W]XgJԏ+p|,2yT(GZt52[ކ BYvZdX xwspp؍8oAq\7A!uyܞkg^I#gVxA(6O~>3'M @'Y:@[4!! yh43L l6b(Lq\ y]<3N /fVx:Hkh@Dx7qxA| `} ޵] ePJΝa.} v?Ѓq:`9m!'t `4_G4m``6 Vu_AgO .bl`4 v!**W ,04's!!ڊ[o:h@t]~ Aۉm| nﲍcf @_3 )!eoc<ϻpDumq]$fF\7g5A!b-MkC,KHsr8a4c{gDo%z=;Ds>3O.}A\dDNsu !zBq y~$!.*6 3}ѫW&Vo3b_aEm.:h@TJA3KS`h+xj}X:)Q(_ټ OxCQѝ;wNC^bi[: 3z9A,V,SQ?555;I1Ma2? +WZmY0|/?x HWqiqmٲ%uLX/\W N?q/odfJ6ELTTx6CGL\g;yol*A\[K]G(ixb)qM(y{F|)06rxՅ}b| r {r b#M?D<[V+1" _;88{wu6X~߃X_k.@tB<%)8Wej[v4 zVmA~ j!zUYG<1Ҕu6 ,*u@{bxԷA,Y4  l0uBT`C Jwߠo @T^ *DR<8[#CC9:: A/]vG?!޹wT8T->жbh@$BǿyQ*?yHk '\e~KH[PgMgqpi4 <=k<_.q۾WkmIw$n lpHvEnQQQff )8nQNoU vxZP q BB\'@h@lGnhhGqܯlҞ;1>;^q%_ypCvGbȕ 9ﷰ>rǿR;S ⌃NCLj֭L&X: !v<ϛ!mȳ]j N_g#:o2˄V}駮[L&ӿ@xу>/,,[~uuuq_q?!bX 2ݠ򊨨yffpB4}.^:5A 5pK/K&S4@еhj!VSŐbNB\WWW%D ! (--qetYB\'0Ғ< 2E;|A_BH3jjjpI9sXz;~@\$C_&s4_? ģB !2khhٳgq ֪mY H;~~@m = uBd¥K qqb#9f2!tzq!DF ''GEq$GXi=$nwt /@?Bdwddd ??ukX ;].5;c+**Ǒ:5Nx1A$Z6uς|W?pf=ʂ ~HbDB?.a{|G}Գ!FŬg8~8`2kއzs&8H@,t4%4440uB'OĩSP__:N[nA|>5Piv<6: !zdYa}tI&]6lآ/ }:fϞ gWVr-[X-{ R/J T%h\ddAA"9Kuuu㴈8=K,g[/w?w~FwR`$lOh]\ddAx!DB?SQZ5x`,Y{T󨓓w7| OXG*ԏTg9| `#,M~~>:{*ooo̟?m"h4ץ~ kR9 PTBTTT 33/^٬rܹ3͛'`0tVq_ɅsBY#T Nq!v~-N>cz!CҜB>x8_;l;I^4P _: !ZvM8p@...={6f̘QDbb"ufZdɚ?\=-FX4<!h !6*,,DZZWRi_BlT__cǎٳ?|p,_ܚczUK??] .I؞?ػ>hYњ[n!-- ee-ֹsgchm!!!%%%Xv-8[e)k͆i"0't=`2,hIMM 222pfRҥݻصk=Z=z@ D[@Hܞ&@aV: !Zu+V(6gϞ7|ݚE[#$Q[ VkGA}駮 MBEE8ׯ"̟?~~~0ulG]]RRR1c ((4Qb2EqۡT'Dmi nU!mϟǑ#GTo(6{1,\siCO > [/Q[PhgwBڳ ѭb //uc[gf׷uy,!V-Q{Dmi dv ++ B}G+psscffGʼn'Kf><ߕP U !-:BTRR{sXb:JTUUa׮]E^.]Hy~y|T6,_B32 AiŊpuue] R 6 k׮sw^^^K}ݎxgޔKxuRPK>~hlBtff&L&8rrrҥK1yd5![M?~Ǐ pssCXX :Z8{s˖-MO{bT)B/=]O?c0uBԠ{ŏ?:J|||ݻ!uuuػw#a-}^a|pw`Do8~:!jp ۷q5 9s&,XQc(..F||<?~ ׯ֯_N4Ww)1c 88XM+m1@\=6I[E?5,@|I9r WJ[,H-**,Q{u6+<{ @ǁ"oACC(ԩVZ#FaM;88`ժU7ndSܽ{W  _tllTSS睑 <W;(y֯_p1)w4z,6"##QsJ~~>SQe00w\̝;TȱyWW^XUh`[2L4$v… 8pj#$$C aÚ{ޯ-:|Of1{A6|g%%%;!V"Įb޽6lu96} WZ/sn߾-erl %%%:!JǮ]PRR:J,S:X @|ޟ/18t~"ug6:!JS.]f,k_O+:}gDȒA{AZWW @Rmm-RRRU#G"((ߍ+;;vpWWW_^5mU^^ǏK,N4hA]]:!JyT;%KOSMbˆݬo*==R6yi)'4hFdd AR^T8Kk׮E߾}YGDII _zp]/h͛7#:('4h^ 9Qd7|Zcƌʕ+:$>#F`ڵpttdL>HMMCQ{BW}+ȭIIIcYF:UJl:u 0(^ԒoR7E ^(:9[^^, _?},illDjj*._8Ò%K0sL?"+KEi;m4x΂ M[uÃuITTT !!3gkAt_οK.xu Lڵo]tEEE8x"** )JJJ0uBpl۶ 4kx:$둘̗}ȑxuq`Q[둔G f}>2f׏n:d2+Hd2!==ϫQ9s`l{)^*-[ϳ5 `߾}xm;0W:L?0Lpb)UWW#&&F3BCCh"ty5x IDATyy/_ϟ|m9q]&y_>3v;bY DJ=B||<>}:Ju놰0уu43f dʺ~:=*K&Lhv½#orA;5ځyo'ѽׯcϞ=?j(릤oKY"FǶmd3/~OOϦ29/j'uA?ё'O"##jpB̙3GcDܽ{m~%%%m9iҤ:@|g "6o xp2LHKKŋYGi#:dc~!<<nnn)_}lsέ,xY}LyVPOt111=<<oF͛7U_UUhYכL6?I+e`Wx *+))A\\,ۭгgOlذ]f˙3gpСWL8+Wر=={5/[]]/"e S+v6!s=|嗪GzK7CCJ`U_YY){s΅U7~Yt+;Xhl?}m֭#ȣWv1 Y =f3Ґ:J\]]"ٳz|_{J^߿9zjo%dz&#=p>`CLLj;oooۺ;$&&uo]ufӒKvdiCTTX)g"##W `$BԠ;wDAA(2d֭[Q$a2K.={"""š-iQVVd)vaÆai`6&Q$]úŮq~ӟgϞmJ0WGr%8.Lܿqqqf .v&`Νx+=z4V^ݞiT\\4*~ &H- XL3ƜkFBgUwvvƺu0tPQ$ftgΜ%KfWCkpq>}S 舟R׎FNׯouDCZ4@9ŋHKKk[d f͚ 둕SNYӧQ8*]m[[ ȑ#8q(FDDDK'i 8~8233_yر^H^]]sٳ>o+}]وfZׯ:j?`_^?ΊǞ={pWcРA l6۸z*nܸ!񽶚7o?_h. uB؈ݻw#''uf"$$D7 ***W၈ՋA2~:Uk׮՚[yoyo x0uBZS__xܹsuf͘1YTqqq>޽;6nܨGf(**q=0Yge˖h4y dz/弈Vn7ҚjƾRc^ 8òe0}~*gHNNnvʻ_~dҨDnn.#rISȑ?8wh[nd2X %刎VQz\w)>|ٝCEXX$;Ǝ؈ʕ+Fmm-ㄯ2 Wrn oR Y^6o޼Lcc())aNNNWLv& oqgŘ1cn:ݬox`'F???j{&L%̟?/Qn<{qB^QPP۷uWaӦM0`(E|||+N ݔ1nh1|pܼyS+X̼I_~L|mРA߅;::bɒ%^ǽ:Zh~`2~|D^xUv'NDhh.544 !!5΋;|Mjݻ+zYfҢ ?y hh4GTʕ+ػw/f3(C@@.VWWW#>>yyy;6mBnNJV>ҥڎVqGXaM+؊ł 0o<1$QRR)7nF89)W.eҥ{lݘ> BsYYY-[ÇꫯZ}||SoGVZ6 ㏽Y`M3<ub.\T1^a0j*˭ƍHNNFCCC2d2%6j.T__ ނN mBZZ0Xfn:s!116lJ T̘1={:62V oAץKiшkחu8p@ +'L5k}f㏲ ڗA7npu470 sf>.%q5UvΈ@YGBƢ[;vXpa0@sh(ƍؽ{:WWWl޼Y۷_[7P1/_>}`ԩ/ϪM MAǝ;wk.u...ظq#||?veܹc-'9RdR__lY8˗/gzoxsjY6ڨg>ެCʃ}\]]i&*ǏDZcZ|7 зo_YV aZ?QDaa!+j-˝;ٌV;lڴ:9sFv=<<`Od_矫hf3'{1v؁Q^b>___$ܺu׸aӦMݛ&pmUFk/K?l0Q:ĉسgL&S0`^{5)>׷Zc|||0c UZoT?(,, @[KpY1^b9fĈ 8|pSDDDJf_;&nuEv@iHŋ8rD]U?9CPPƌ"dɄ\r׍1֭hR~~,yG(b7kδ0͛7:+1~x1ڭIIImv _&R^ջwo̜9S6UvL?/D}:1eeeƓ'OZ}ݤIrJp唚*镽{ƬYvgx6,ڇvGS__8 &`ٲecۓ'O+˒׳0 [n:T;yX9vY Q #FUViS,((_V_7ydXBV#==]v̙^zIޮV٬3MӡGD:4 <k׮{a۶mm>N_AnkۣgϞ3.H@8n х p1^kv ͛7B)S :8qB~bS/@!0"u:Kz聈899.W^m? .l _̔E F|Ǻ=P 11u=M6i{V̙3Ok׮6'2dJkhhCD&"rܹSP憍7jSNahqܬYtRRD6L}&Z#$F]]v܉ QsttDxx8w:J8qªO%K(@NN.]$yHUn]T8ٌ]vu BCCѯ_?Ql&; طoN4 TuxWk?ajh?Çq-1^rJ 6u t:uNh4aB.<[h'1|2N>:K/^'a3ٌ}YuIh/yQ+իWYvl6cA. DQWѾSN+ f2/ډ'Ry_?ުϟ}Jޮi5.hHIIIhlld幑#G" u 566b׮]VUM8qkуp!߿& @Abi444 >>嬣<7`Mk'L@ª(@W+#)Uw__lq `߾}x!(u]%~kkkmU?~xf"@700SN;4 rI\zuWWWQlRSShܿ׎;AAAt g3f ƍ?60 ]ToGX tM9ru,~v:McfQFmVL[yzzbŊwfYU5gYWW71WHOOG^^~k֬]TII mfU]^ȋ/yXj3Ah@FY ]|ϟgŋcĈcX۷oܹ36oެ Ν;QSS#yێXn-@}(H=z`岴M}>3]U@[EՉdΟ?k׮pqq ЩS'QRZZO>mF֭F^K.Ҷ涩jLW#g5 h>=z| ~V-KKK|-qHF:l{-?ݻw}w ꋬmHJJRsŋkt°cuy]v  jVfs7]X ڿ?inVU1ξUeeeطo2˖-cMÇz}nݰyfȜ4ev}j}Z̟?Ǐ:L&n+ t3W=n߾:/^b?<@||<zOnT-[iGw}'uƌU  (--EFF>|8f̘:F=zX[zlF~dNF:z"UefY7,,:iAo>S QbDGGY|w1QFFN8!u~z:Gc ?vROn… s R\]]hIYYQYYi̙3SL1iJcÆ %-3ͺ2nNJii)>:.] 1U]]Z1cƌ… eLE899!<>?c|||Gzd6*{mUj9::ꦿR@7#*{eyrRsٌ$Y1TV9m9,: &|8MEbrSFW ͱDxWWWlذ+d2!99999\/00GVZD>4 1|Aβ꿶iEo߾L3ȑ#6M'[w.c*"Ʉ$ܸqC-Y'OVZDvaU@7_PtCv3glBj* }hEzzz"44J*(..Vz}e}Q POH˾[03֮] ,Csl.LG*LjFyy"ٳ'"""D2Hb zRTTSN1Ͱ|rxyy1Дe%-#fx{{˘X#66UUU\ 7nUU /^X l[jƍS*yٌd-]Ç)yQnn.+UݹsglڴI Ttu`(6ͬc&{VL7s`v:t2&LPmFEM6>AW7'4PJ9r9իU7z)={֦߿?VX!S"+W`޽P;^{5zc?t5=*ݻw/+5kɱ'hEΝ;={POdq ;4Pf.iӭ[; 9{Ƃ ]9yyyؽ{M~=zxש?@&Ota566̮իWj_qq1mzlyѣGٌ… ]rO7XS!ݩS_xks ŋcĈ2"399YhLYw6d'!CϏj^;v,&!//Okv 7oV(J0LCHIM\ݡCP_ 7776 ߻woZJTKc媲v =ұoxg{4:=Evv6ÇmZvssChh(eJEXi_w=ݤd21]7a2~SYYY6?6  b02EBBSΟ.RsPTTXlk7޽{ؿl2-Гׯ#99Y~W \\]]skjjXǰ;dv Tl &`ڴi2"gΜCM6QO8. RSE! o~SYԂÇ+v`JS'OСC\ܹB{@R7AtE;OOO@32 |2k{zzbҥLݔdBBBm#<<d2!%%W\Qشi:wu&e@jj:=08pٙ_~ܽ{צ1 B555HHH{Q}ƍu&* `/.]65-0h &nԩSʲѿٷO"66O([r}ذajDulHm=cQz;vɵvŋ3vSnBFF7n8L:UDGee6lo meߤ`V(O{vITTT(~] '''ůTaa!l>:gϞXrLױ{n444(zݑ#Gbڵt\3i5䠪z|@`u"7R>}: /D\\e]\\Fw;u>J@܅A5z]e@y9ѣe@nݰpBů۔dBbb"lؐޝWUH0 "D9C p;Vz{{$Zo{x B 1 2)`  3AA Dd5{|??ְ>uwڴicB*gzxg?|pL>?5,j>eR)E̙3ڵkAnԨQ@Xl>ly#G u(4+c@v$ <8(w܉֭ƍgB"gz*~m)PL4vavvTl-uHOOߛ8q~bܹ*6Hii)~mKo|6<HNN_kOP0- h222.//{. sELLIɜȑ#XlGOGFFb޼yAs4~)  < v-7%%E{:,]~?;ydc}{ر}(b 5dj|ǖ-MӰb 9sg!CY<VXa>̆GIUUm;+35@veTVVZiӤOo޼EE/m׮fΜiB"g%KuWϞ=1w\鯟(x<#C%X "]z;wD~wAlڴ0wܠ80wK,>}:\.}m,TU#۴ihBQeee h9##S:>|˗/|cԨQKUv3eСC³gVཛྷpcy&MBV,Quu5,Y9oߎ|XЋ lLA,XPkٸq wiUV… ~?۶m[L6̈́TxrJY]TTz!d09X$(gl0VvPtܹr0}t({n݊bk|cҥKq 6?2ѱ*-(d[kׯ|Ո#о}{KDZqƀ:u* N Νû+e_BBJ}Df M>EV_|mG]|˖- h_~8p 쯨+WZe# sn 2 \._>Ǵi&ҥK:M6>} M4lݺȑx9TU}3 +;D8z(JJJ,399ݻw}/~.,, {? 77ZXgDDf͚$&ǹza.,#h 6XgTT&Oli۳gO@s?eeeXdI@,􊋋wtɑ !lMPn7*..{=&N(R]6g{A>TWW[w.]0|GKs}]%l{Q^o@qJ_UU%Ktall,fϞ-ub(i|;H~?YJӴegBP4Xl߾}^+sϿiX|y@EY&999*|k4M&`)rR!ǨJ(hb˖-9|p}ݖh8zh@>\PW_wW_}ey߭Zѹsg&!GB@V6]rFQQInZe+%%%z6!!Ǐ78=:t999R.ԩ|AZ7QuX%*eFYR_WTT '''~"""0g^ۄƵ$_~~dDDD|$;U~EYi9Mqq1,GR`{^,_W^ S]v ,_ǏoUU1qD 6n瞳~$!Qh';G04 7[71r0uT͛ gΜҥKQ^^ny1113gzayD ^0csܹs7b)ߢKJJ.tbcc1c KAA^u).]Op𧠡3X)$fCn#GF׮] (3gLHvZ#gСC1i$ˠ` h2@v@fSL|Ųe~?rHtP6q,Y#Zhx{o&s  ...ŋE6+Co֛6m‰'z6>>cǎ54]:tRNk߾=ϟ[7Q3,j!~+e~Y JJJuր ìY8|SRRs`u566^/df@Q=,;LV~իXlY@`1&W^Q#223f@߾՛ڊ3g% ;={"6p1>}ڒdirrrPQQ]v^?~999v}c޼yhƑRhY*; ! ,XP`:-'"<<ܲĬYx_)zKG}?6m8 kGeڙ3gչsgǒ9sFוSN]we\v51Έ̙3-H܆5fris$۷oEQ0uTKI`ٲex<=߫W/*4=zFѣK.3gZvF -B!.]Bqq%}"!!Y/^ ٘L>Dq僿;v,yj. ;,!7|q9}W#22+swހ6mZli`s,[ _|}u]3g^&22!DdлwM~Wee% -kԨQhժ%}ŋjժ߿ Çb TVVZwjj*NH&2c|xSv+ܹuuu4izZɓ N:y-Z`Μ95k e_$%%mBΝ;-kҤI _7ԩS??sLhDŋɱLu<ˤc dff`ݱx޽ےowݺu'Ob۶m?={(t^| Ä Cq'; (WMa׋;vޏ2e4 _S555XfԩfϞmD&`ѢEOADH-Gh‷cj*\|9O(SNa(//_˅ѣGcԨQPՐ,$ Bj!D5d0DFFZzmnaa!8o`ָ7ް|o߾={13?Mi||ChWOa9s~Far[.[l)jbYˑc~˅Çc̘1. % 8^ȗB>H~jX˶i+W꺇>## ^xW-;t{ ɮ4.uMT^^#Gaz?'ȨO>8𧦦yyy(((߰09F岴o"oAFIdgkǎۡC$''G2lQ00Qp:}4rrr,Yy{3g rWe&! y lmm-cz?&MdaAnn.ncԩ10Upx}:bcc-(HEqMv`c-ysK1f5&ᇸpB'$$`Ȑ!&O4??-[lٳg{r?6EQ~iZHEӷ >ܒK\9k9sN|2VZcǬ}(   &8d[&Dwn#scΝ4ʹ1|poT]]իWjcذaرA+**+bG}3fON!f@H\XSSBsQF!22>+W~>..һ t5YFBzz:E e0DfXU$;Dk.t)foŠALkua0uTH"YI&^v`f@QiN7vX՚\RWHLL4(/_իqQLHH@FF$ ۄC,@ӴW;(URRʴ۶mTo˗/|TT&Ou74 wF^^jjj,E;v, bDFQ%Sv`g9^Nvmj%%%/}XhܲCGBovv -bرC_ݭ[7נDh|M*˜1c0x`\.#eB:^6GvsHд}EMi_z˅ Sk֬SLraРA3f MȦj].1|Bz˽UU1zhSn}v;wNWiii)za۶mزe%1ydmlOd5N*U 'd ?ޔѮ];S|WoެogMlll.;t>=܃'K.ERvPž }LUU5ʔƔ)SaP"c\r֭Cqq}kƍCRRRȝ}@ !̯mqEB 4jTS qq]mtIII%ү;v͛M?'::GD<))u!B ,(?7e2EEtL 4M戊ˆ#0dȐ _̟?;6@Q-X`U}~禴ۿř6OC 1u}Bs={֭ɓ'M'""C ȑ#C\/;D(sdBB0}UZii)JKK oraȑۨDw#}_ee%>cڵ ^״~\.RSS1n8li"'du- gL=yŬo]weJuuuoKxk.lڴ զ*뇱cǚ:CD_P 5׋}nXX?c]7@пСC3΅Ɓ̘1hӦi NxIv;ptQQQVUU`=Gŵk ow5]8w>L2U便裏p1PU}Ř1cxB9XpU!֘Ѿ}4 W}^޽ѭ[7R5ŋظq#߯;iG-!C؅ BB,VWWF6 0`ZjexӧOjra„ %Jl߾~iw,($7?<o!7~ a߿_y7s\>|m6jVaÆ>5^SSm۶O?5 oF gB2!@!WiߍjӌTnv`lԃ< qFSV"q:![C 70Qo[/^4:YUUM޽[w;鈌4 э4MCqq1q%|;+RRR0zhӊ,"[%Lܩd,qiИ4ׯ)H5MÚ5ktTRx^߿[l1&H <Æ CLDd.#[bp!ĉli MӰw^#cAQӦwލ/Rw;&M2;ǃ?[n}`С@usk׮x<ؿ!N\\"<<ܔ>H 0/1 [BxGiu/SUڨCAAmۆWjv1b$%%Z^CC B~\Ӵe vBEEn( z쉴4tR{,IX4/8v(**2C3N;<>3i 5MDZ{nƭ&Q}$8poQQQ0`!m5–-[ mH-Z@>}0dtAv"2GQqݧeq2B\[xdzȰֺ@lذmF}"gReHvcCff'x'Ǐˈ0d#QPP`hzDEE!)) C " i+ne +]$-[( u놔$%%>s|QI25UU ?Ǩmjٲ% ..NZ" B\|X8#ի݌UUѣG 0<VQynRHLaDC͹Tmkx$''_~ xvon@F4ҥKC͛ kvbccѻwo">>((6d4@"L1aÆ׶n݊k׮fp$&&"99={CDwR#X.qqq^SQQ;v{ߵkWwވ0FOA pHZZߢ7n܈cNl߾=RRRLٞHDV` n,H… سg6;v4(9YBrAXf(ݫ `豿x<~?޽{o߾ҥc:-++ Ai,3Kozӧqf>::={DRR>'":)++K4$Y@`tݻ7}'"UKvj>KpF s!8q▿={"11>VQnGP,{C՝;wnaD׋֭[W^ӧ:wwDd(v?5M9gtVaa!8ռvBaNlTYY_].W !І4MCmm-~#!!>YEmA(p|!i>33ߞـ(4tԉ?YES)!k>,*7Eff5qY(ʏne!X4_8q:' 33#:&"2n&?I!@^_WgDDfUeMA8,o(/>"##0*?""}*pݹX4wf>%FH˪NBBW).u5"@.IGD%UUfeeqVҦ8 KPhdDX5|3q{ߧrW/ܪj M@DuAUYYY_QRh e "0a ^_hlo8pgK > rK45fEDNLL̏ySP`p{ 2xv |-!Hoaw$S("  R)BB_" E9\9Nݠe5%;;4M{,g[xx \8H޸ E _!BDV8pka. پŋx<**'oB36 [?dff Wv".5?53_C28n隦|kȞ<~9XG&MBBDCBͲP`m.?s !g-eg!"Cg$;6]c{<(;  g;BE6>g6#D<`8|WKCDrr'=8m[\Bd$A" nEqk'!w.,n"? A9ai<)8-; Mg^ Y,xnUeg!*~Ov7vEy_DDiZ0d?,n?>_ IYկ~ա7o "kSe^/; o?܏g~n B)~,DpMQ5MZv7`@9q" ~ 8DvXB/d!g`L/f%( !p |7&~{Ͽ]vrX`_8B^Ȑ(} 9!7@d)>*|[7e;$YBH?FEEj…We!b s?>;:"BQ'5M{@yX=S0`${Mъѷx,HqXvF,|f~v'|-7i C$`a$ 4Ow//ܪ' 3][Ad !vBt;,N{F5xű_|mmmSXyLsYYYd!j `>%RŶ~_iDvVU_feeX=>`YlO;)]FXX-ZtRv" h.7_knP'^(PN/b{ߜcm q^x_ 1Lk/|ɋz^÷Z9,' q?oHZ+EyW8X`q3>w @OnK!T+fdÊ]Ӵ7e*3l(t+BEQ4mnUX 5!z'szp͛jYn \n"bEQ s=wAv"8f|n4w ͑;cPv"\ӌ=?LBB!fX  =!6p"9 ۹?o#eŽ^pMF~pQN`ۼ^.^Cd>'*|7gġPꫯ;w.QӴ$M Ts·@Q"Ś{"9U_D4@"/ض6EQ~oiW 81TUݛy܇O4X$/R\]]]wMӺ t?ݣqqEQ=""75 ?ISAFDDmj[@;EQj*h h|c.4k&^ꆟ_hCQ ](5Mvك H(!""##cYMMM⚬LDD>mLiKp""=MKRI_iU"""X|p2-}//1$KEDDd9'Hï-,QpRp9 "" ,|WXH6'""! z(Dփ)BV"""C8vX(8ws?ķ/u.!1,.f EDDDoWD EDD$:QpBp-~DDD67NWh%5dN9 @ϛ~ZF"""N8pDDDDA37OpZF""`bM"""ؿy *))R[/(r\F@"""qTq #q?-!"" v~p|G]\b|,R_Uv""`cW DDDov,2xѷ@?O#""HMADDZtozA] ,;Q0k '""r<e!"""pGDDt[v|Zpmٵ"";cGDDtGv,((ٱ8$;Qs`/KCuTp9QzIENDB`manuskript-0.10.0/icons/Manuskript/icon-64px.png000066400000000000000000000047311354442177200215100ustar00rootroot00000000000000PNG  IHDR@@`UgAMA a cHRMz&u0`:pQ<bKGD̿ pHYsWtIME.ȉIDATh{pU97 ! HH@y򐇊g-3?V?:u2VÙNt:L_VԢ(hyZk}هoN7EAkFCϸ^[GCg9A #3d7XM8(oVA3\+O{]:܃Z6st}@s-4Y, vyۚ{$RdXV*iêN|X.,v^LZ+a椫9L4??  KU&U銺-AftngaJ§,7xǼ4:V}%.0.%.$~ @f<61Ɣ4/LOIg7|>]ۅߧ9&gOR Hte#p!= h{ רH?WeIYC,0Ƥ?CXޑžlI-I4j(-qYye3I0'xz$!&䐡(μZdTwԩҀ,V(uun%%ɘ P>5ҭ+"ۋwI|* 1>AR;syfիw.1Oi k@  0󲊉 aNKyRd_s1sTJbprxW$99#hH*'\4 󶊌sO@5ܟ+GmԆ)i]Ln]'Кd?v\hr @sIo#js8î@6z9w('fO[$u [Y:y:5(r۽a)6oyNuÓg#)}F=u8 ׮\coyٿe,T-DIGU3ium޷eXD޳ۓVqX19 ‡5XYGMq9;<&)%o\fPJ] 6 z cMWQa(ј4\%Pg'W[hFMRKNNY+'ԄUcۥJYvԙ-L{҃g5g|0x -6:Zƙ`D߲i[ܯ!ׅQ{?AFoRTl8sw9 |Dٗ-QiTi+h ͗.9}~wnFsՄ#L^k~&۶n3s Pgx81տts7{D)?3wP~VhrKgv}ߩz0JdrͶb彞yU[\2 8g&)W5.`ͪl;Mc^wq(TnlGz{H{yo #P$]6z>'-}nwzu d[+ .ߖͨΏߌWc͐%tEXtdate:create2016-02-06T16:30:06+01:00P`%tEXtdate:modify2016-02-05T16:38:27+01:00 tEXtSoftwarewww.inkscape.org<IENDB`manuskript-0.10.0/icons/Manuskript/logo-400x104.png000066400000000000000000000361201354442177200216340ustar00rootroot00000000000000PNG  IHDRh bKGD pHYsWtIME 5* IDATxy|sonBdŭ "Z-E$'`\[jmmֶ2hk_VkQ.AQAꂊ *"(Ⱦg9;܄l|^/^7̝;˙3"D!B"D!BѬ ɐ8@"!BQTAu8$!B&&0 aa "D o#N 'D22~|I\׍1/jEо+J\-oKz7Wga8Bq(iN.^@w heHہ-F`7+\׍Ww:0Sþ"D@z+rMq0 hw | |s@$}͵Ƙ "D@Bzxj'Fo lTWS/D!SNeʔ)DSˁд>K]ݓB+i 7RMesw;goS/D!ԝ<r6d<ʀ{]םam#RN\` d `ϛh?Ɏp"$4aw4DH䵯~=z(+^5D hs7D!BĀ GёSs@R>3,Xƍv+7d7tGY>[pڅp@,/oD(//?7Si< MQ["$!Bq uGo4Kb16lSO='|Biii}ڵk^dX`(dvo"D n²#\׽ksx<… yWq8묳1bX u0lttTV֍l:[U;2Ν])"đX&p xӑHb ϟݻLF}etޝx_]nvV{7fG+I.~pS-̝;T;tuVg"E8:!B!˙["Xr%/q~=zO 嗽[5kּpIS*<-C)5 :gO jbš2e SNq`|sD"… Yti)aРAdffHTYbs ZZ8ΙSL)\ta{GX$|. "|񸧝nDWҼS\;@ͤk׮?Ν;9p˖-_~n#B/{sDS-% 3k'^."sdk-JYD~j(MH=};"JJJx;ɣu 6.]$u{1x`ڴick'ߙu -}r˜5%pRj`H0XN!b_~%ӧO 4GՋ'rWf 4h4D2vm?c,Yf}4K)iF DͫDdرc:B3/n~ |]Bu~ip&,u;ьSEQ.]ٳSsg3f̘@b3|zɀ C"`ԩ,ϲ$Dh9R7nfͪb2 lJw@G>vH&0G$a߾}HJh۶-^z))qv؁Я_?N;j#OBrmӫz3@WO50i#G((((@Wƾ& ~z^8zM:-VU끳Ídffn:͛93f :uJXz5˖-cȐ!tԉ+Xty)03^5be3`]C,̙3Q@^6. ,3 9s&ǗKy N1JC@.\텎o[Ϋu9)**"333v3_zu86&Ws>~]iRj p5J)fάqxb֞n5է.?ڰa@bW_$L 9r$4[pBV^ɓ̬<|gێ=X.a1cxE?u"+k; J Ȟ )wS&C@ݡ$h D(--gAD}\r% <8#~ϟOii)EEE՚sq-ZītN;\i8醙@?P@'ٸ;|*͂Dzy]FJf$91;C@4E;Þ={1c/r>{fҤIx≔֭[6mݺuc5b;wwڕSN9#5G QJGFQHg˖-z|R1M & aB n!,7#p|uArىF޽{yO?餓(,,$33>xB?j(++㥗^R.BѨw 3-Hv!ŋZ[ xCa{3 @1 ڌUZCwh hU).6}vO< @QQYYYo:?;ZYロ )‰'hr\N$SEP0J|ޟD$Ll91d >dddD!xb͛G~~>w\fH$Ϸ-ڴkٲ%cƌ rH9tr]"RQ4o-xB4qxh`U?sH?uKr\?GeѣGsViU|7ꪫիW᡼lvH\Zl (tYN_ 5bcQ4,rWtt,OKkÑl:dro6zYٱcGv0tP  ǡgy+WrҢEj˘i ݻwծ_@;ur :b߽TLXO~mF`!VA'h:ZCAAhNl޼{7<ΨQRG4eΝ<#YI&]ȿH$§~ۓ:vF;"'U6_7"Jdh\P )t6頫>hb-zZq6ọ>ʶme :Ҕغu+ӧOɓ'Ӿ}:iV r) 0 eIf17S: ѰW |5N ZA 6߿ٳg_YS_'hkW{phZm̓mJATy> @ DA5m۶1s@tǎ),,L)1F"/_=C^(,,k.z$9r$KqGk:gJCv]yO<͛ս y#||~D|C$4|!@ FJh08gϞ*gee1qD:tp˗cѽ{w&L@6my@e^m|k_{5F; BtӱwOT̊C}yok ʩn.yDDiGnn.-o)L$מw9s&_~ef1a:@D"|'̘1N:1ydbX}"$"|IЈ#т|w&Jo1"@c?jCFC4 tN@2ʼ?{BsrrFu I5T@̛7E$ޔ&jzo͇~H,ÇO>rJMF0aA.\kUFxb1rrrԩS}a=2RйC| F3ٹEfs!y49@Ut6B)TVPШa_^Ff!"V4P]vOjsIG<#deeqEqGԵ$ ,Y’%K,'tR]~>W+2gfl٫_q&GoC磄hzi_ЮF0Tcǎ4Ç=R,tu5Q7kQ!33Gyݻر#Ǐr?{JzYc3j!_K>zhN=,wy,gc9ZA'{Ϳ1 ͘@ yF5ϵ?'"hWg8g5`YkJUA!vAFF>l`S,&MX݋ֺ)))/[np7|¾N3Ϭ+imK?aHyzZnwU/'~FB -#k||_\Q)i QJ%?PR^[$aݺuULEw999M(_|s5N8ॗ^$ {챌=:eA?a)z5-`,Rշy:,@7zSʠeH ĘC{;XH$2 <'Ce/-׀ `^p?ŋBc۱cO<;wOgȐ!MdK,a…I{%\B˖-*8J"QU`/f~E&ʎODJ,O E$$h*osM!:tvxP94;1lm^%v_ZZ?_$2339hٲewqF|I8gy&gu^xtm۶JI޽+V yxaB:f_5_sRŒ?OR֪! $??vZ(,,A3J|Cg{O\)֢Nkٳ#???Lu?%H{cyKDڭZ&JTvߘH$`zx#++'xT7*DdiѰ4VH.&\ZcŊ_sI'%(Flݺz2N[>l09眃.XK|x-9 `X?NS4ZIJQ>".c.HY=Agt#QoRjd_߂ (((p=F0@W, ???NoA9ڵ lݷA3*t1s+a? ǐ7Rȶ4d߄ej=M]`]Z("?h;}dW)ȢC)E-xPJAOo_/Z}JVRW8)"1c{lSe9Cߨb.D"Z*yPx<ٴi >:i1coV .ଳ n`,0܎iXjݤG#8hKJ 7=:?QJ-"Ly^]%D\ý MeYs% y.9ۚŭM&a/#@Z>YI "򖹶s9W>Y)D# '0h cRi4~bP>w~Ȯ]~yFХv?0G7yhS,s]k̳gއ_z~@Z5\}q3ϤsUBv}|MȠAjEh۷W!6m0vXXak3ы"rWC$lI|E yNSJ-5&ydH0^NJS5g}?s<1_\.}y{vOjRMcaI}Uiih ~͢%///K)KEC~ޏ+lSO4$ShLqm܋/Edo1,=LQJi?E)"ϋ}"2#D҄oDmZD@DϢ]!MB 26bklߞ\hu֜}I5"_~%"B"gϞ*#++?x>(c='2x,Xu]wNbcR[ : (\aˍ69؅޳&8jH񾯟1OfXTTT':kTU7&=$t :#ט'@>I;d,a@R x_4Z*&Sk~99cjy#JKKo޴6""YD);oȺjB蛔@Y۷^z3ҥK8x￟(**"mbD"<̅)5IDAT3a_F">f57kYzbGZAbΟ0 q?? ):pߜ9s>)56/1̢sUsN"ux_ ܅vSD^:sv#yBx=:Uxj#m_T/%p+iQ䳖dr'cڬI,0p UDJ|%'^Dvڶ_^5Z_|+K< x\)k*;,dGts%" "9m,MGZc60d8p˗/҄iU}x}ݢw 4(-FZ￟K&}|k:4bir.B>ӘOE:h.#3:73:Z:9ObLW9ՃhN񲾃q<TjsO3zfX,vY+"SH7jr aM(B?]J(oTJ>)SJ} U/ gi'A*|}^)"7XWJTN}>|e'iZfLN`y4PVΘ޵~L)j}hZeOlY!I4mT_:ۿ0X~>wR|8G T %fAujH堣MGZ>O㛥|ܸq [&R]RݔR'5^7 gϞ21w/DIE$U6N 4޵3 0+m ClbXȫh4ʐ!C*v#6m⩧ѣSj-Z`̘1 Xff&Æ cĉ 2x<ޜ{,TR&jVJ58pYf7|rwN+Tx:iLDV [MDZ >SiH}RRvh'>&ciPAR(< 3@5?Ү|l8%9! UVV5xcʄ y5&_YDv|g|:)nb.;h #Eޜ4@rTݼt¢]5W̷xT(} BýIDI.֟ji?Eqqq"Dr.Lk_y]Zt tMwt(䋘J 7iZ3//B]t,B/dGe*4&9tbL;$F$[wyGU2ý֭;W_h4Jݹꪫ7Av*<|nZ'|}SJe4aI߭k;>kyyy̛7o'ϔR)6 ";gMR`OD\KSI5jT*cogh D"7~?ɴ%_- Ua= )GR;g;Z̙3Tj5Ak&;(s9𪈔i^0yo:/ x?M!t7Y)e"*iXaNJGѭDIo?.dZ&_}zbk>ⓦ )|$SСCiݺuiC!/ fK|RdoSM!t}R["r}^qr 芗UDxQr?meGxb1_&+ Z>x٠`'0/-T:sE0(3LRۍ{PYnd?0 <3[A\YIH[p}mg\EՊC[nVBCL#0FD6_<w{H~/"& TudjB:_Dvk.x!H 1l_!"/S]f/xD"!ճ$Hrssζ#<fX~3imcǎ%@c<*k ~ḧ#E63S"A ɑbG.]D",_3fвeKwYgI'Ta: (t]w{=.CTk;p4Aicƌ!##nG3o2vhe;27( `=Uݸ嗠ۀl/HUEн-K!2sL[$Cwۜј>Z%wΝ}^^^Ek^Dlc"Zh$b>c.(Zͼ 9|aƣ1:nFG\jKc%wV슊ػw/Oy5)//OY:$U/v7#]` :Rnw5!77h4=h|[t@Ȣư4dL;nܸ ljF,\:N8;RVVvfZjX,&'jT}h:׋Hy=3:s.D䍦@S8-5j <T@5st3BD5ug^RjLt/(sz&AB SYDǟ7`_?J$$ bXs,5rx u-I>I?u:Rdc5>@G|p8GAG\%ǎE}d+^d}ٳwc8N"P^^~C[z<|9F5҆h*)&ġX t*&ꑇUf#A= j:IlAb9GRRJ0{$Ɍ2OhmH!BHh EщLZڇM$6a8BHxiێ>8:~!Y9GpDH!BԛK*l_=C *4aO u G:g:u[c"'r¬ [g#WFnGLjȃD"ј G!B3fCr}Hjt@g`9Վ>m$-~")4dJ7֑ÐT-ty",D"[tHDdDH 4ژIjL?1t9꟡^A{u=&((( Mc2:JtB {elȨFkcn:[K]}uݩh?yhsLSt }ugkm.Z@f:}j333?qK:]H!B40n/?Rnp%0E~0=]|CNLs]w!,T!!B4;.?lo"H .`.[o u?~n;t !`22om4'#]i!yxg`ҤIw}$UT-1\ $i60 :k'x)Y|Ӽ8 Dbu"D@ѝ=n YV!/uVhSW s/=*N:)S=DM -U*Ed\H ;GhTD"DfF йp9G5ihMS\tH!Bhki#sڥ+D!B8Rn.苮m"D!;:H麰29"Dn4U{чb0 "DC bD$єf3 !D!l]ڀ{j*퀀Ҁg:#o݀@i9ꀀ l 9hA d5|||7Ā􀀀$~~~Lڀp _瀀(Pgŀ. BBB퀀|||UUU___wwwɀ-)))|||LLL ===```xxxĀ'a bbbwww BBBfff|||'555VVV &&&MMMppp```dddlll(iii{{{+++666___zzzMMM<<>>@@@nnn///,,,iii􀀀H(ကWWW\\\uuu""" ```{{{KKKMMM{{{pxxx ###xxxddd"""vvvccc ///nnnހ$ OOOMMMKKK???ttt777XXXb3뀀uuuppp{{{111 \\\}}}OOO @@@xxxpLLL:::qqqrrrbbb***mmm$ttt aaa``` 555}}}qqq///___U ݀KKK&&&yyyKKKPPPzzzBBBOOO~~~HuuuKKK|||666fffUUU>>>zzz€ xPPPkkkttt######uuuccc111uuu倀(xxx"""000|||iii999~~~nnn)))&&&nnnMɀYYYRRR[[[ OOOwww666hhht%䀀|||,,,nnnKKKbbb|||CCCccc=󀀀ddd 222|||}}}<<<pppOOO ___V<<<QQQyyy...---yyyYYY]]]πpqqqjjjrrr"""???~~~aaa]]] "PPP+++zzzkkkNNNhhh]]]뀀/}}}{{{,,,GGGccc ]]]lll!!!aaa󀀀<ggg ___ZZZ hhhppp%%%fffGGGGrrrRRR ppprrr(((kkkLxxx&&&333|||KKK***wwwsss***!!!qqqReeeJJJ~~~EEE555{{{ttt***+++wwwQJJJ ^^^}}}??????~~~ttt)))777|||Lzzz---mmm|||<<<HHHsss'''EEEF~~~lll)))www{{{888OOOqqq### VVV󀀀<XXX:::}}}zzz666 VVVmmmeee뀀/p???KKKyyy555[[[ggg sss !Uxxx*** YYYyyy555___```444|||π=󀀀mmmeeeyyy666bbbTTT KKK% ]]] mmmzzz888dddFFF aaaɀNNN%%%ssszzz;;;eee{{{222 ttts~~~===...xxx|||???fffsss:::~~~Lwyyy000666{{{}}}CCCfffaaa VVV倀(Gttt$$$<<<|||~~~IIIeeeGGGooo ܀mmmBBB~~~OOO dddxxx%%%444}}}gggEEE~~~VVVaaa``` UUUTn```GGG~~~]]]^^^~~~333ppp߀"1ꀀ\\\HHH~~~ddd[[[bbb 999 YYYGGG~~~lll""" WWW{{{### ^^^`nXXX DDD}}}sss,,, QQQ===###www݀#'WWW???|||xxx666 JJJ~~~FFFJJJZZZ:::yyy|||AAA CCC}}}~~~///nnn󀀀FC񀀀]]]222vvvOOO<<<{{{}}}mmm>>>999 bbb***qqq\\\444wwwzzz]]]444 bbb^Rggg iiiggg +++rrrqqqGGG,,,|||ƀ nnn&&&^^^qqq+++$$$lllkkk***YYYbM򀀀ttt222 PPPxxx999 eeexxx666###yyyzzz???BBBzzz}}}III\\\zzz444RRR󀀀Q5䀀~~~OOO ///qqqYYY"""RRRvvv'''rrr {___cccggg)))GGG}}}jjjq mmm***QQQ~~~rrr444???yyyQQQ@怀xxx???888tttzzzDDD999sss|||---dtVVV!!!dddUUU666kkkeee  kkk***KKK{{{ddd999bbb###\!ƀyyyEEE ---lllpppAAAZZZ| 09ۀ``` SSS}}}yyyMMMTTT|||QN耀uuu>>> 111lll~~~\\\PPPxxx5 ]쀀^^^PPP{{{iiiRRRrrr$?euuuAAA ***eeetttXXXmmmā*Pc쀀ddd((( BBBttt{{{ZZZ:::O ,[怀zzzOOOSSS{{{}}}(%+|}I؀ppp<<< )))```~~~zzz#44eee--- 444iii  ]|||XXX )))-n gwwwOOO$/:5tttGGG' jڀppp1111v&ꀀσb {D :\:퀀րvnnn!ub=倀̀tl: 0.~̀쀀]]xP׀À}5 KM€怀􀀀ڀr85A~~~~~~ (R~ǀހ퀀􀀀瀀րmA}}}!k1EUfqw|zun_O>) J-LZ 9 kPVQ???????????????1?x?px?(   );4B `耀􀀀׀( qhhhvvv؀H;;;GGG>>>\\\ooo܀3Jkkk777MMM^^^TTTPPPvvv===JJJUUUxxx^^^===hhh退/ˁiii***]]]]]]kkk:::bbbX؀GGG555eeeeeeqqq<<ls0cD~))I㑲߯H4`?Uq? ܀`9R(R >=`4ϳ{]rڊdA{zыtCYxsPA<7 PK >ate&/0 EЭ^tѝA gC2H'-B?ֆBq\9*ܵ,^a0O1rɒyO$g/H1zEGG=U%QuQ?D{8`p>nȝ &7H tcc$]ɲjf8\s(8,=xɧ  _CQa)4d1iLa2Ɏ3q즘<@:q ^P$be1g 㸃2͔ةd2x"5vdONX)J? WrS(6pztNS̡E,  xaC$vle#. ^,%ɖRmȭq,L)CC %f5i@EJneD|j'KW9LWF3\rQjQȀ3||tB2rH!W4XRlK7% dk(VS"3NL8`9(9 //f'm: 0<^zI=a='yUyR9?  _3|53~&* YLeM ߱BwgygWkM3a^ ҩ8ʩGLf* $qmlP٬c<]cSLo8]4<񞍍߰XĽ[d2WX(EFN.q3 T덒?!$ nSһंx'XVs)LD6aiYy"+Hb(c'44UÖ zG*ٶ;E')(gnf!+Eź|aȰ~™m (ܠv4P@7)7]яu}l ~>b#X' !Lv^Lgr䒢}.^t<*& Dif EB.(2it Gb.3D3 J˷aֱ͟$K IyX2>ZWg+cjJ󩈨doPKbܡ^JpPbyMa3%c+XJk\.w$m^*I%sQ"=L4n f.ٲWe*^9%;+ȵqCPQ%] d6q=cWSL)yfv.X#]OmxK*jI}vP"c ~p9jh\WNI%ma7ó?OVOpmRf.bL αK(\c0kt>R< h0$vU.0>F,îƑkNOo,,k**It&/\ws\?A2Kz\)7YOYb2Rpu*~.1S UlӸa-Wg<$W=PҘRgYZy`Stu߈i |A6q)Ğ?L0(9vj3 ͪj tDu`wHБM 07!(g-$ߕd5ziWk2Y'*Ya[1 h_H>LRE3 J)i22Qqk=Lz Mk2"S 5X,Kh! cd/\ae | mz/$@*|.Y ~~Iaů[tIFb<:J)TLәx{kG64z/&GuOA#*e2b|l^,1խ]*[%t4Su7n+,u$LH<&_Pv贠gpů,e#xMJ89QwQɥaXxeIr|ZW"lcW}S0DussQgv6\ 2K  o?VPi̧kFDiWԥOdƎ@3ɠ *a *Nf2 \tb$.Q.EݴFU3 `9*/}/BO8[G*0 H@N~v'x`M Jiq1 rtf10PB.yQ4FB3ߕ!XA#,{: rF&@:vj2OI_ .FEUF0,xNZiteib@J!d")v,dHpxL+C| `zbn76'(giOk*#rL/eY7*\ ʳdY~n Zt2@N/n2tirl_3"eHb>'PP%Ppu`.S :{/>,em3~Q?Yt!o,R mqIL3pg)l \`Fޥ z +v? eAEx8mTxpX44pAuNYfV%`=A ` 즐*`(OJ~w1^FQ=$߆`JL0VPVvP` ]mP4 h )8]]a!d#t3NJ6sC2m]6_L3Q804PL_Af$]Kd@ݭ9n9k9JL~P(Q)@'`w&F1@x q-\N"װOnc*ceNɹH1 BA|sP׫KWvn& f4LEbw;'vIe |WsU΢CDepV%S0feA:.1v{yTCf|m )3"*A*&>L5c`Ke`m~ 8Vnn2̀W)o01QA~>j fK<A -H6@ u:c@ 6wsW8aI'% ,&ݖmq̕o o:G.%ߪemR zzpJ %|~9,6j} lf[AtWLhR $Jmv%;1@pi,9Qxn +%}"a7 IoU6~JTe}!֝BBFHPV :fF4M!'F6C\&=jse?X's1o.'J!f: "ݑwc3`10 -6&0Av߳W004B/Gލ4)ҭ;yd c5ߩBn5 ϡ2 #)LXW(|4 w56~a u TtpI@P+G3QD6})ֶaT ^ au/fl|T~M0}'ZșPK ^?hik]E.89B 4/5l#*З3Q=.Ak}olfr%!*|*eQ@L~!LFvs9x‘i GLu} P)twщٺrC}4J&qj!1.J9q - h0JHmTj"v4(D'cO,w@3 ܌9{XeAQGT.wT[&ѕ))XqS.5w%L){:ۏ=j-g#qw39Jow;4pQtf6cbc 2e +1@ c5#gBĺg `'G5KQ 2~I)qŒ4lmJ4>g =+NeUV&S9[KL}| u\"+a{!B<c4~uY0b{#yQ:楏*涀`D@9>q 5Y!a͟<)y(5lYsn7GebfBXQt9\eh)}ñMmru@Ќ)> {X 9rVypق0E|MUhtS4_x#{BFϢ=)0 `g57pVSVc1cL{ (( 7q"`^! 즾+j$*hd1EC n#k'mu].h7Sp ),4Qkjè:vh L3) Le<%&N[!{`Qǃ2u58PhykTmpM a4/PFQ*j[w㛺26Y4?+aL3-xhw!q'_)| -^gTU8u5)"xf2OIw;*JsTr:2A}p6ao868\Ⱦz 9~Dg0 WxL9h$\ԟ|Gv/Qٍgi|gâL4>ćUo&~*H|hKXbex=Jq ;CUriUq\0'UV 0Mx`'?yPxk =~VfI ѰfQ)LHJU\Y %~p9QنZcǞAuA' Î &A㸊VюқM| Ͱ^kruA$_ '-.I # :zFi%R|^Ax>仌c\~ΩX_?/<)W :(9k:o([+9$gKz*ՎIMU\"41G|4 ):!&XV1%bϯP+t hg9͈rm(Oסm"?#)܎P:2~qӅУxqQ*Y}%v:.FGPDM܏CC({ɷK2MчB\7(gNQg6cE/Ru&v.C'Vq:J:3$>zB16:|[ $օ0J8vg8i:Fqj),}لe+S!Gd 2әTw(u[L Е)xO~PzGZ? .L?ƆW8ͦS ЋL(pM*%&䷛fF 3O-ћ̦վMx2?,ᰓ:2+@ɾ-9A3DGo-4zcvC;`xXܮz>>0#.!.o;|etdCkڳ V7E77)Ma5g;OmyMH1@O&*a c\Ɇ;11N@`//( 9ْb ,7[{`;R&UQŸ) } Љgxq1yVFiфB*6 K.wX j63BX^[#|A|I)Wv1|E.ވ cΜZvq&*7׽l$YR2&.~g'N atjR^DP1Ҧ#v?MlVѿ6Ɉ\PX| 8~Tŕy`/ hrיi1:p=6~vtZHslҿċgIZ%7z=Gc Ca &BJ Jz=!F| _ԋλZw VT6/(?I4ۣLh?d kE`+_an+ho Kp :yl𱍗hs'2~+j*=ئxW +xp?RXh:5l#/XgμRQ3 FgpꫳFg# 0&Q] ;9/ȳ|{⢞S]JiPuXeO˦< }A 蛀@ż6q8uY&' **CXbr cYlPJc$@VrA;3'ȥs 9V*E9qkyQ<XbSɣgU](f'G)'f)Lb=]?_XN A/&0 Ì.r>.JŶM5c~J*pŔc^pNP0\FЅ,hrrRrX֔M!4:/yoJ}6Q0a 'H'`z:j&8rrwpXK|`@#mc@j{(ҔL2D(M:Бt |!< r]\SnRENAxЋ-XLD#_ %Hx.\"7G ~|‡O4hIևAAanb +{d> _Xct ;m0 Tv/hC,`NJzgnPGhg4jC< %?Ú~!`V a2 v,d168 Ё>f?(m0d eԷZ1A\h'0 |dёG+u`1@_Nؓކxz9p'{`<Զ[ 0@ɴN'ކݖ҆6 '\ÃIENDB`( @  )BBB &F\c[C#*x o倀 g '''pـрd b"Rvvvgggttt!...4441]]]EEEEEEccc|||111,,,oooEEEFFF888YYY{{{KZZZ aaaTTT+++yyyggg444,,,___退9 xxx)))yyy555JJJ|||PPP777qqq8KKKXXXppp***hhhjjj(((ZZZ 'vtttwww\\\333xxxyyy<<<EEE|||`LLL@@@JJJDDDNNN777yyy ƀxxx""" ```~~~AAAUUUZZZ111yyyӀ^^^sssyyy???aaaaaa444{{{ Ӏ???222}}}uuuAAAiiiccc>>> ƀwww&&&DDDrrrFFFmmm^^^QQQkkkPPPsssKKKnnnPPPhhhvaaa VVVuuuPPPnnn~~~111(((zzz_7[[[ VVVxxxWWWmmm___MMM ' \\\ OOO|||^^^lll___pppK򀀀dddBBB{{{fffkkkbbb888낂9{{{ooo+++...pppooommm~~~WWW )zzzEEE XXXxxxppp}}}||| +ƀccc%%% 444mmm}}}ttt{{{!P%zzzOOO<<ŀ( ^䀀рB_n Qm{{{}}}KKKOOOooo怀P0```UUU///VVVuuu@]]]oooF000|||***???iiì%HHH eeeccc XXXMMM///___||| jjj 555===111xxxQQQ'''[[[|||hE}}}+++ fffrrr[[[vvvFFF(((^^^~~~؀% UUU444VVV wwwkkk000111iiiOuuu ccc~~~444EEE}}}TTTDDDvvv +CCC,,,|||ppp fffnnn000 ^^^3뀀mmmYYYYYY(((zzz|||LLL ???wwwЀy::: www???GGGccc$$$gggN iiiGGGxxx''' bbbsss222UUU(怀999jjjkkkttt|||FFF CCC{{{ǀQkkk///|||ZZZ 666}}}VVV555www退+zAAARRRIII MMMccc,,,tttM~~~sssmmm}}}999___mmm###'''rrrmRRR...{{{yyy,,,lllsss+++%%%rrr |||---JJJsss###$$$uuuwww111'''ttt Ȁiii aaannn000zzzyyy444...xxx ȀLLLqqqiii;;;}}}yyy444888|||AAA |||///000{{{eeeDDDyyy222GGGoooAAAcccKKKwww+++ YYY~~~^^^ PPPbbbOOOrrr!!!kkklyKKK \\\ccc RRRiii)))yyyMP}}};;;cccfff$$$SSSXXXDDD耀+(怀yyy///hhhiii)))RRR;;; bbbƀ uuu'''jjjnnn///PPPqqq###wwwyqqq###jjjsss666MMMAAAFFFM2ꀀppp###gggxxx???JJJ}}}\\\iiiπppp%%%bbb|||IIIGGG{{{yyy;;;222~~~Nsss+++YYYUUUFFFwwwvvvMMM]]]က+ www666 LLL~~~___FFFsssuuu777&&&zzzD|||DDD<<>>vvv~~~dddccc}}}}}} _񀀀XXX!!!```nnneee{{{߇;=Lp󀀀qqq888 >>>ssswwwjjjxxx恁N>>>o\\\ TTT{{{|||XXXa ___]8\ wwwIII)))aaa~~~χ=<Ànnn;;; 4ꀀhhh,,,<Vd;񀀀胃zzz,4R! B ـ2/7'hۀ􀀀񀀀Ӏ[$u?e^8W8Df1???????????????????(? ? ?manuskript-0.10.0/icons/Manuskript/manuskript.svg000066400000000000000000000102431354442177200221640ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/000077500000000000000000000000001354442177200166645ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/128x128/000077500000000000000000000000001354442177200176215ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/128x128/actions/000077500000000000000000000000001354442177200212615ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/128x128/actions/application-exit.svg000066400000000000000000000016761354442177200252660ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/dialog-cancel.svg000066400000000000000000000014601354442177200244650ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/dialog-close.svg000066400000000000000000000053171354442177200243520ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/dialog-no.svg000066400000000000000000000014601354442177200236540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/dialog-ok.svg000066400000000000000000000004631354442177200236530ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/dialog-yes.svg000066400000000000000000000004631354442177200240420ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/document-export.svg000066400000000000000000000015461354442177200251450ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/document-new.svg000066400000000000000000000010131354442177200244020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/document-open.svg000066400000000000000000000133631354442177200245650ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/actions/document-print-preview.svg000066400000000000000000000026551354442177200264410ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/document-save-as.svg000066400000000000000000000016121354442177200251550ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/document-save.svg000066400000000000000000000015461354442177200245620ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/edit-clear.svg000066400000000000000000000010041354442177200240060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/edit-copy.svg000066400000000000000000000013751354442177200237050ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/edit-cut.svg000066400000000000000000000027751354442177200235330ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/edit-delete.svg000066400000000000000000000011471354442177200241720ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/edit-find.svg000066400000000000000000000030711354442177200236460ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/edit-paste.svg000066400000000000000000000013711354442177200240430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/edit-redo.svg000066400000000000000000000010071354442177200236540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/edit-select-all.svg000066400000000000000000000011311354442177200247460ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/edit-undo.svg000066400000000000000000000010111354442177200236630ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/folder-new.svg000066400000000000000000000151721354442177200240520ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/actions/folder_color_picker.svg000066400000000000000000000165021354442177200260140ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/actions/format-justify-center.svg000066400000000000000000000005451354442177200262470ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/format-justify-fill.svg000066400000000000000000000005431354442177200257130ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/format-justify-left.svg000066400000000000000000000005371354442177200257220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/format-justify-right.svg000066400000000000000000000005471354442177200261060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/format-text-bold.svg000066400000000000000000000013121354442177200251670ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/format-text-italic.svg000066400000000000000000000012071354442177200255170ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/format-text-strikethrough.svg000066400000000000000000000011021354442177200271460ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/format-text-underline.svg000066400000000000000000000014031354442177200262350ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/go-next.svg000066400000000000000000000017141354442177200233660ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/go-right.svg000066400000000000000000000017141354442177200235250ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/go-up.svg000066400000000000000000000017101354442177200230300ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/gohome.svg000066400000000000000000000015771354442177200232720ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/gtk-edit.svg000066400000000000000000000101311354442177200235060ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/actions/gtk-index.svg000066400000000000000000000130011354442177200236670ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/actions/list-add.svg000066400000000000000000000004161354442177200235040ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/list-remove.svg000066400000000000000000000003161354442177200242500ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/media-eject.svg000066400000000000000000000003741354442177200241550ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/media-playback-pause.svg000066400000000000000000000004061354442177200257600ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/media-playback-record.svg000066400000000000000000000006051354442177200261220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/media-playback-start.svg000066400000000000000000000003051354442177200257760ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/media-playback-stop.svg000066400000000000000000000003161354442177200256300ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/stock_home.svg000066400000000000000000000015771354442177200241470ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/stock_no.svg000066400000000000000000000014601354442177200236220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/stock_notes.svg000066400000000000000000000065701354442177200243450ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/actions/stock_people.svg000066400000000000000000000057721354442177200245040ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/actions/stock_refresh.svg000066400000000000000000000022331354442177200246430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/stock_shuffle.svg000066400000000000000000000051331354442177200246430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/stock_timezone.svg000066400000000000000000000372401354442177200250450ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/actions/stock_view-details.svg000066400000000000000000000011541354442177200256030ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/stock_yes.svg000066400000000000000000000004631354442177200240100ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/tools-check-spelling.svg000066400000000000000000000073761354442177200260450ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/view-fullscreen.svg000066400000000000000000000006461354442177200251220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/view-refresh.svg000066400000000000000000000022331354442177200244100ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/window-close.svg000066400000000000000000000053171354442177200244220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/zoom-in.svg000066400000000000000000000012351354442177200233730ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/actions/zoom-out.svg000066400000000000000000000012231354442177200235710ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/000077500000000000000000000000001354442177200217465ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/128x128/categories/application-community.svg000066400000000000000000000014131354442177200270130ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/applications-boardgames.svg000066400000000000000000000020521354442177200272560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/applications-chat.svg000066400000000000000000000026001354442177200260700ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/applications-debugging.svg000066400000000000000000000252061354442177200271130ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/applications-development.svg000066400000000000000000000007031354442177200274750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/applications-games.svg000066400000000000000000000053201354442177200262470ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/applications-geography.svg000066400000000000000000000216631354442177200271500ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/applications-internet.svg000066400000000000000000000025161354442177200270070ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/applications-libraries.svg000066400000000000000000000043731354442177200271360ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/applications-physics.svg000066400000000000000000000275131354442177200266450ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/applications-publishing.svg000066400000000000000000000145551354442177200273310ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/applications-puzzles.svg000066400000000000000000000053661354442177200267010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/applications-roleplaying.svg000066400000000000000000000050101354442177200274740ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/applications-science.svg000066400000000000000000000115541354442177200265720ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/applications-sports.svg000066400000000000000000000115701354442177200265110ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/applications-versioncontrol.svg000066400000000000000000000256001354442177200302440ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/gnome-settings.svg000066400000000000000000000032671354442177200254420ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/package_multimedia.svg000066400000000000000000000016541354442177200263020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/package_settings.svg000066400000000000000000000022751354442177200260100ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/preferences-system.svg000066400000000000000000000022751354442177200263200ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/categories/system-help.svg000066400000000000000000000023521354442177200247430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/devices/000077500000000000000000000000001354442177200212435ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/128x128/devices/media-flash.svg000066400000000000000000000302771354442177200241470ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/devices/media-floppy.svg000066400000000000000000000014161354442177200243540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/devices/media-optical.svg000066400000000000000000000021161354442177200244740ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/devices/stock_mic.svg000066400000000000000000000015331354442177200237410ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/000077500000000000000000000000001354442177200212455ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-art.svg000066400000000000000000000025341354442177200240170ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-camera.svg000066400000000000000000000035401354442177200244570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-danger.svg000066400000000000000000000021501354442177200244630ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-development.svg000066400000000000000000000032371354442177200255540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-downloads.svg000066400000000000000000000031731354442177200252230ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-dropbox-syncing.svg000066400000000000000000000022741354442177200263570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-dropbox-uptodate.svg000066400000000000000000000012711354442177200265260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-favorite.svg000066400000000000000000000024661354442177200250540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-favorites.svg000066400000000000000000000024661354442177200252370ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-generic.svg000066400000000000000000000025731354442177200246500ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-insync-des-error.svg000066400000000000000000000012711354442177200264310ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-insync-error.svg000066400000000000000000000040561354442177200256640ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-marketing.svg000066400000000000000000000013261354442177200252100ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-money.svg000066400000000000000000000035751354442177200243660ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-noread.svg000066400000000000000000000012351354442177200244760ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-people.svg000066400000000000000000000051501354442177200245120ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-personal.svg000066400000000000000000000027061354442177200250550ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-plan.svg000066400000000000000000000013721354442177200241620ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-presentation.svg000066400000000000000000000015541354442177200257450ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-sales.svg000066400000000000000000000013261354442177200243360ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-shared.svg000066400000000000000000000052721354442177200245010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-sound.svg000066400000000000000000000023031354442177200243530ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-system.svg000066400000000000000000000055231354442177200245560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-urgent.svg000066400000000000000000000025611354442177200245350ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-videos.svg000066400000000000000000000010101354442177200245060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/emblems/emblem-web.svg000066400000000000000000000156511354442177200240120ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/mimetypes/000077500000000000000000000000001354442177200216355ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/128x128/mimetypes/application-epub+zip.svg000066400000000000000000000025131354442177200264110ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/mimetypes/application-pdf.svg000066400000000000000000000052101354442177200254260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/mimetypes/application-text-template.svg000066400000000000000000000030431354442177200274540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/mimetypes/application-vnd.ms-word.svg000066400000000000000000000152241354442177200270410ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/mimetypes/application-vnd.oasis.opendocument.text.svg000066400000000000000000000127351354442177200322550ustar00rootroot00000000000000 application-vnd.openxmlformats-officedocument.wordprocessingml.document.svg000066400000000000000000000217621354442177200406610ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/128x128/mimetypes image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/mimetypes/stock_calendar.svg000066400000000000000000000060721354442177200253370ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/mimetypes/text-html.svg000066400000000000000000000050561354442177200243120ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/mimetypes/text-plain.svg000066400000000000000000000035171354442177200244510ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/mimetypes/text-x-generic.svg000066400000000000000000000035171354442177200252270ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/mimetypes/text-x-markdown.svg000066400000000000000000000037501354442177200254340ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/mimetypes/text-x-opml+xml.svg000066400000000000000000000024511354442177200253520ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/mimetypes/text-x-plain.svg000066400000000000000000000035171354442177200247160ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/mimetypes/text-x-script.svg000066400000000000000000000027151354442177200251160ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/mimetypes/text-x-tex.svg000066400000000000000000000124041354442177200244060ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/mimetypes/text-xml.svg000066400000000000000000000024511354442177200241420ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/128x128/places/000077500000000000000000000000001354442177200210705ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/128x128/places/blue-folder.svg000066400000000000000000000134651354442177200240220ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/brown-folder.svg000066400000000000000000000134651354442177200242220ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/calendar-01.svg000066400000000000000000000104511354442177200236010ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/calendar-02.svg000066400000000000000000000113501354442177200236010ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/calendar-03.svg000066400000000000000000000127341354442177200236110ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/calendar-04.svg000066400000000000000000000106201354442177200236020ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/calendar-05.svg000066400000000000000000000116451354442177200236130ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/calendar-06.svg000066400000000000000000000131011354442177200236010ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/calendar-07.svg000066400000000000000000000100061354442177200236030ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/calendar-08.svg000066400000000000000000000142511354442177200236120ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/calendar-09.svg000066400000000000000000000131211354442177200236060ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/calendar-10.svg000066400000000000000000000131131354442177200235770ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/custom-folder.svg000066400000000000000000000135031354442177200243760ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/default-folder.svg000066400000000000000000000134651354442177200245170ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/folder-copy.svg000066400000000000000000000141421354442177200240360ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/folder-home.svg000066400000000000000000000156111354442177200240160ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/folder-music.svg000066400000000000000000000175731354442177200242170ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/folder-pictures.svg000066400000000000000000000161611354442177200247250ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/folder-projects.svg000066400000000000000000000203501354442177200247130ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/folder-publicshare.svg000066400000000000000000000215211354442177200253640ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/folder-recent.svg000066400000000000000000000172271354442177200243530ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/folder-remote.svg000066400000000000000000000261201354442177200243560ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/folder-saved-search.svg000066400000000000000000000154741354442177200254420ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/folder-sound.svg000066400000000000000000000175731354442177200242270ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/folder.svg000066400000000000000000000134651354442177200230750ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/green-folder.svg000066400000000000000000000134651354442177200241730ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/grey-folder.svg000066400000000000000000000134651354442177200240410ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/orange-folder.svg000066400000000000000000000134651354442177200243460ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/pink-folder.svg000066400000000000000000000134651354442177200240340ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/purple-folder.svg000066400000000000000000000134651354442177200244020ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/red-folder.svg000066400000000000000000000134651354442177200236450ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/stock_trash_empty.svg000066400000000000000000000237471354442177200253700ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/stock_trash_full.svg000066400000000000000000000356531354442177200251730ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/places/yellow-folder.svg000066400000000000000000000134651354442177200244060ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/status/000077500000000000000000000000001354442177200211445ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/128x128/status/dialog-error.svg000066400000000000000000000035631354442177200242620ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/status/dialog-information.svg000066400000000000000000000041151354442177200254500ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/status/dialog-question.svg000066400000000000000000000041421354442177200247720ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/status/dialog-warning.svg000066400000000000000000000037621354442177200245770ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/status/info.svg000066400000000000000000000041151354442177200226210ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/status/stock_score-high.svg000066400000000000000000000032611354442177200251220ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/status/stock_score-higher.svg000066400000000000000000000032761354442177200254570ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/status/stock_score-highest.svg000066400000000000000000000034231354442177200256360ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/status/stock_score-low.svg000066400000000000000000000032741354442177200250100ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/status/stock_score-lower.svg000066400000000000000000000032751354442177200253400ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/status/stock_score-lowest.svg000066400000000000000000000032651354442177200255240ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/128x128/status/stock_score-normal.svg000066400000000000000000000032761354442177200255010ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/000077500000000000000000000000001354442177200174515ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/16x16/actions/000077500000000000000000000000001354442177200211115ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/16x16/actions/application-exit.svg000066400000000000000000000015671354442177200251150ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/application-menu.svg000066400000000000000000000032251354442177200251010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/arrow-down-double.svg000066400000000000000000000003321354442177200251770ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/arrow-down.svg000066400000000000000000000002641354442177200237330ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/arrow-left-double.svg000066400000000000000000000003321354442177200251620ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/arrow-left.svg000066400000000000000000000002631354442177200237150ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/arrow-right-double.svg000066400000000000000000000004131354442177200253450ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/arrow-right.svg000066400000000000000000000002651354442177200241020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/arrow-up-double.svg000066400000000000000000000003351354442177200246570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/arrow-up.svg000066400000000000000000000002661354442177200234120ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/dialog-cancel.svg000066400000000000000000000006541354442177200243210ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/dialog-close.svg000066400000000000000000000055741354442177200242070ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/dialog-no.svg000066400000000000000000000006541354442177200235100ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/dialog-ok.svg000066400000000000000000000004221354442177200234760ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/dialog-yes.svg000066400000000000000000000004221354442177200236650ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/document-export.svg000066400000000000000000000014561354442177200247750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/document-import.svg000066400000000000000000000012161354442177200247600ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/document-new.svg000066400000000000000000000006211354442177200242360ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/document-open.svg000066400000000000000000000071121354442177200244100ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/actions/document-print-preview.svg000066400000000000000000000021621354442177200262620ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/document-save-as.svg000066400000000000000000000012041354442177200250020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/document-save.svg000066400000000000000000000011141354442177200244010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/edit-clear.svg000066400000000000000000000006201354442177200236410ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/edit-copy.svg000066400000000000000000000012731354442177200235320ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/edit-cut.svg000066400000000000000000000014231354442177200233500ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/edit-delete.svg000066400000000000000000000007201354442177200240160ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/edit-find.svg000066400000000000000000000012751354442177200235020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/edit-paste.svg000066400000000000000000000012131354442177200236660ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/edit-redo.svg000066400000000000000000000007151354442177200235110ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/edit-rename.svg000066400000000000000000000006451354442177200240310ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/edit-select-all.svg000066400000000000000000000007411354442177200246040ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/edit-undo.svg000066400000000000000000000007121354442177200235220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/folder-new.svg000066400000000000000000000075411354442177200237030ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/actions/folder-tag.svg000066400000000000000000000007241354442177200236610ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/folder_color_picker.svg000066400000000000000000000165051354442177200256470ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/actions/format-justify-center.svg000066400000000000000000000004421354442177200260730ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/format-justify-fill.svg000066400000000000000000000004431354442177200255420ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/format-justify-left.svg000066400000000000000000000004341354442177200255460ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/format-justify-right.svg000066400000000000000000000004021354442177200257240ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/format-text-bold.svg000066400000000000000000000012571354442177200250270ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/format-text-italic.svg000066400000000000000000000012421354442177200253460ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/format-text-strikethrough.svg000066400000000000000000000010501354442177200270000ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/format-text-underline.svg000066400000000000000000000013311354442177200260650ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/go-next.svg000066400000000000000000000014021354442177200232100ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/gohome.svg000066400000000000000000000013331354442177200231100ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/gtk-edit.svg000066400000000000000000000100641354442177200233430ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/actions/gtk-index.svg000066400000000000000000000127161354442177200235330ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/actions/list-add.svg000066400000000000000000000003311354442177200233300ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/list-remove.svg000066400000000000000000000002231354442177200240750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/media-eject.svg000066400000000000000000000002711354442177200240010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/media-playback-pause.svg000066400000000000000000000002751354442177200256140ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/media-playback-record.svg000066400000000000000000000003621354442177200257520ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/media-playback-start-rtl.svg000066400000000000000000000001711354442177200264260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/media-playback-start.svg000066400000000000000000000002161354442177200256270ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/media-playback-stop.svg000066400000000000000000000002241354442177200254560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/merge.svg000066400000000000000000000010171354442177200227300ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/split.svg000066400000000000000000000015621354442177200227710ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/stock_calendar.svg000066400000000000000000000056711354442177200246170ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/stock_home.svg000066400000000000000000000013331354442177200237650ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/stock_no.svg000066400000000000000000000006541354442177200234560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/stock_notes.svg000066400000000000000000000021741354442177200241710ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/stock_people.svg000066400000000000000000000060111354442177200243170ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/actions/stock_refresh.svg000066400000000000000000000016061354442177200244760ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/stock_shuffle.svg000066400000000000000000000042541354442177200244760ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/stock_task.svg000066400000000000000000000017741354442177200240100ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/stock_timezone.svg000066400000000000000000000411261354442177200246730ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/actions/stock_view-details.svg000066400000000000000000000014121354442177200254300ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/stock_yes.svg000066400000000000000000000004221354442177200236330ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/tools-check-spelling.svg000066400000000000000000000071541354442177200256670ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/view-fullscreen.svg000066400000000000000000000007041354442177200247450ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/view-refresh.svg000066400000000000000000000016061354442177200242430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/window-close.svg000066400000000000000000000055741354442177200242570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/zoom-in.svg000066400000000000000000000007701354442177200232260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/actions/zoom-out.svg000066400000000000000000000007441354442177200234300ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/000077500000000000000000000000001354442177200215765ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/16x16/categories/application-community.svg000066400000000000000000000007341354442177200266500ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/applications-boardgames.svg000066400000000000000000000022161354442177200271100ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/applications-chat.svg000066400000000000000000000015431354442177200257250ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/applications-debugging.svg000066400000000000000000000232301354442177200267360ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/applications-development.svg000066400000000000000000000011151354442177200273230ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/applications-education.svg000066400000000000000000000015211354442177200267550ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/applications-games.svg000066400000000000000000000026111354442177200260770ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/applications-geography.svg000066400000000000000000000121151354442177200267700ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/applications-internet.svg000066400000000000000000000024411354442177200266340ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/applications-libraries.svg000066400000000000000000000024231354442177200267600ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/applications-physics.svg000066400000000000000000000025511354442177200264700ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/applications-publishing.svg000066400000000000000000000036601354442177200271540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/applications-puzzles.svg000066400000000000000000000053511354442177200265230ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/applications-roleplaying.svg000066400000000000000000000034201354442177200273270ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/applications-science.svg000066400000000000000000000075171354442177200264260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/applications-sports.svg000066400000000000000000000055121354442177200263400ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/applications-versioncontrol.svg000066400000000000000000000236051354442177200300770ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/gnome-settings.svg000066400000000000000000000031121354442177200252570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/package_multimedia.svg000066400000000000000000000015651354442177200261330ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/package_settings.svg000066400000000000000000000022021354442177200256260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/preferences-system.svg000066400000000000000000000022021354442177200261360ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/categories/system-help.svg000066400000000000000000000021771354442177200246000ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/devices/000077500000000000000000000000001354442177200210735ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/16x16/devices/media-flash.svg000066400000000000000000000026131354442177200237700ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/devices/media-floppy.svg000066400000000000000000000011101354442177200241730ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/devices/media-optical.svg000066400000000000000000000041351354442177200243270ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/devices/stock_mic.svg000066400000000000000000000053741354442177200236000ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/000077500000000000000000000000001354442177200210755ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-added.svg000066400000000000000000000006701354442177200241210ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-art.svg000066400000000000000000000024241354442177200236450ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-camera.svg000066400000000000000000000016071354442177200243110ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-checked.svg000066400000000000000000000012011354442177200244350ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-danger.svg000066400000000000000000000012601354442177200243140ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-development.svg000066400000000000000000000030641354442177200254020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-downloads.svg000066400000000000000000000031001354442177200250410ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-dropbox-app.svg000066400000000000000000000077171354442177200253240ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-dropbox-selsync.svg000066400000000000000000000006411354442177200262110ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-dropbox-syncing.svg000066400000000000000000000022671354442177200262110ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-dropbox-uptodate.svg000066400000000000000000000012061354442177200263540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-error.svg000066400000000000000000000010631354442177200242060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-favorite.svg000066400000000000000000000023551354442177200247010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-favorites.svg000066400000000000000000000023551354442177200250640ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-generic.svg000066400000000000000000000024711354442177200244750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-insync-des-error.svg000066400000000000000000000012061354442177200262570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-insync-error.svg000066400000000000000000000010631354442177200255070ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-marketing.svg000066400000000000000000000007511354442177200250410ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-money.svg000066400000000000000000000033521354442177200242070ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-music.svg000066400000000000000000000021761354442177200242030ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-noread.svg000066400000000000000000000012141354442177200243230ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-people.svg000066400000000000000000000046671354442177200243560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-personal.svg000066400000000000000000000025341354442177200247040ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-plan.svg000066400000000000000000000013451354442177200240120ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-presentation.svg000066400000000000000000000015161354442177200255730ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-sales.svg000066400000000000000000000007511354442177200241670ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-shared.svg000066400000000000000000000044361354442177200243320ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-sound.svg000066400000000000000000000021531354442177200242060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-system.svg000066400000000000000000000055131354442177200244050ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-urgent.svg000066400000000000000000000024751354442177200243710ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-videos.svg000066400000000000000000000010031354442177200243400ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emblems/emblem-web.svg000066400000000000000000000144371354442177200236430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emotes/000077500000000000000000000000001354442177200207455ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/16x16/emotes/face-angel.svg000066400000000000000000000032521354442177200234520ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emotes/face-angry.svg000066400000000000000000000020101354442177200234730ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emotes/face-clown.svg000066400000000000000000000027111354442177200235050ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emotes/face-confused.svg000066400000000000000000000031401354442177200241660ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emotes/face-cool.svg000066400000000000000000000032551354442177200233230ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emotes/face-devilish.svg000066400000000000000000000023201354442177200241660ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emotes/face-glasses.svg000066400000000000000000000042701354442177200240260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emotes/face-in-love.svg000066400000000000000000000035051354442177200237360ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emotes/face-monkey.svg000066400000000000000000000115401354442177200236650ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emotes/face-ninja.svg000066400000000000000000000027011354442177200234610ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emotes/face-pirate.svg000066400000000000000000000031661354442177200236540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emotes/face-sick.svg000066400000000000000000000026651354442177200233240ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emotes/face-sleeping.svg000066400000000000000000000036601354442177200241750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/emotes/face-uncertain.svg000066400000000000000000000024261354442177200243560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/mimetypes/000077500000000000000000000000001354442177200214655ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/16x16/mimetypes/application-epub+zip.svg000066400000000000000000000055671354442177200262550ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/mimetypes/application-pdf.svg000066400000000000000000000100471354442177200252620ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/mimetypes/application-text-template.svg000066400000000000000000000045301354442177200273060ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/mimetypes/application-vnd.ms-word.svg000066400000000000000000000057261354442177200266770ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/mimetypes/application-vnd.oasis.opendocument.text.svg000066400000000000000000000057261354442177200321070ustar00rootroot00000000000000 image/svg+xml application-vnd.openxmlformats-officedocument.wordprocessingml.document.svg000066400000000000000000000057261354442177200405130ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/16x16/mimetypes image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/mimetypes/stock_calendar.svg000066400000000000000000000031471354442177200251670ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/mimetypes/text-html.svg000066400000000000000000000101171354442177200241340ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/mimetypes/text-plain.svg000066400000000000000000000055171354442177200243030ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/mimetypes/text-x-generic.svg000066400000000000000000000055171354442177200250610ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/mimetypes/text-x-markdown.svg000066400000000000000000000057501354442177200252660ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/mimetypes/text-x-opml+xml.svg000066400000000000000000000054661354442177200252130ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/mimetypes/text-x-plain.svg000066400000000000000000000055171354442177200245500ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/mimetypes/text-x-script.svg000066400000000000000000000057101354442177200247440ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/mimetypes/text-x-tex.svg000066400000000000000000000123761354442177200242460ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/mimetypes/text-xml.svg000066400000000000000000000054661354442177200240030ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/places/000077500000000000000000000000001354442177200207205ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/16x16/places/blue-folder.svg000066400000000000000000000016721354442177200236470ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/places/brown-folder.svg000066400000000000000000000016721354442177200240470ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/places/calendar-01.svg000066400000000000000000000105411354442177200234310ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/places/calendar-02.svg000066400000000000000000000115021354442177200234300ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/places/calendar-03.svg000066400000000000000000000131011354442177200234260ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/places/calendar-04.svg000066400000000000000000000107341354442177200234400ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/places/calendar-05.svg000066400000000000000000000117731354442177200234450ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/places/calendar-06.svg000066400000000000000000000132541354442177200234420ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/places/calendar-07.svg000066400000000000000000000100751354442177200234410ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/places/calendar-08.svg000066400000000000000000000144201354442177200234400ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/places/calendar-09.svg000066400000000000000000000133021354442177200234370ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/places/calendar-10.svg000066400000000000000000000132701354442177200234330ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/places/custom-folder.svg000066400000000000000000000017101354442177200242230ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/places/default-folder.svg000066400000000000000000000016721354442177200243440ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/places/folder-copy.svg000066400000000000000000000072161354442177200236720ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/places/folder-home.svg000066400000000000000000000010341354442177200236400ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/places/folder-music.svg000066400000000000000000000017251354442177200240370ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/places/folder-pictures.svg000066400000000000000000000022031354442177200245450ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/places/folder-projects.svg000066400000000000000000000035201354442177200245430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/places/folder-publicshare.svg000066400000000000000000000045101354442177200252130ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/places/folder-recent.svg000066400000000000000000000062771354442177200242060ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/places/folder-remote.svg000066400000000000000000000100031354442177200241770ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/places/folder-saved-search-alt.svg000066400000000000000000000012521354442177200260350ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/places/folder-saved-search.svg000066400000000000000000000012521354442177200252570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/places/folder-sound.svg000066400000000000000000000017251354442177200240470ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/places/folder.svg000066400000000000000000000071561354442177200227250ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/places/green-folder.svg000066400000000000000000000016721354442177200240200ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/places/grey-folder.svg000066400000000000000000000016721354442177200236660ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/places/orange-folder.svg000066400000000000000000000016721354442177200241730ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/places/pink-folder.svg000066400000000000000000000016721354442177200236610ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/places/purple-folder.svg000066400000000000000000000016721354442177200242270ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/places/red-folder.svg000066400000000000000000000016721354442177200234720ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/places/stock_trash_empty.svg000066400000000000000000000077431354442177200252160ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/places/stock_trash_full.svg000066400000000000000000000077671354442177200250300ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/places/yellow-folder.svg000066400000000000000000000016721354442177200242330ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/status/000077500000000000000000000000001354442177200207745ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/16x16/status/dialog-error.svg000066400000000000000000000034171354442177200241100ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/status/dialog-information.svg000066400000000000000000000037501354442177200253040ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/status/dialog-question.svg000066400000000000000000000037251354442177200246300ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/status/dialog-warning.svg000066400000000000000000000037311354442177200244230ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/status/feed-non-starred.svg000066400000000000000000000010251354442177200246500ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/status/feed-starred.svg000066400000000000000000000010251354442177200240600ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/status/info.svg000066400000000000000000000037501354442177200224550ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/16x16/status/stock_score-high.svg000066400000000000000000000002611354442177200247470ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/status/stock_score-higher.svg000066400000000000000000000002551354442177200253010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/status/stock_score-highest.svg000066400000000000000000000002551354442177200254660ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/status/stock_score-low.svg000066400000000000000000000002551354442177200246340ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/status/stock_score-lower.svg000066400000000000000000000002551354442177200251630ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/status/stock_score-lowest.svg000066400000000000000000000002611354442177200253450ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/16x16/status/stock_score-normal.svg000066400000000000000000000002611354442177200253200ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/000077500000000000000000000000001354442177200174435ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/22x22/actions/000077500000000000000000000000001354442177200211035ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/22x22/actions/application-exit.svg000066400000000000000000000015631354442177200251030ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/configure.svg000066400000000000000000000033301354442177200236040ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/dialog-cancel.svg000066400000000000000000000010231354442177200243020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/dialog-close.svg000066400000000000000000000017251354442177200241730ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/dialog-no.svg000066400000000000000000000010231354442177200234710ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/dialog-ok.svg000066400000000000000000000003541354442177200234740ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/dialog-yes.svg000066400000000000000000000003541354442177200236630ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/document-export.svg000066400000000000000000000012531354442177200247620ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/document-import.svg000066400000000000000000000010401354442177200247450ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/document-new.svg000066400000000000000000000005041354442177200242300ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/document-open.svg000066400000000000000000000106321354442177200244030ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/actions/document-print-preview.svg000066400000000000000000000017671354442177200262660ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/document-save-as.svg000066400000000000000000000011611354442177200247760ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/document-save.svg000066400000000000000000000010671354442177200244020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/edit-clear.svg000066400000000000000000000005301354442177200236330ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/edit-copy.svg000066400000000000000000000011121354442177200235140ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/edit-cut.svg000066400000000000000000000013751354442177200233500ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/edit-delete.svg000066400000000000000000000010241354442177200240060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/edit-find.svg000066400000000000000000000012721354442177200234710ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/edit-paste.svg000066400000000000000000000007701354442177200236670ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/edit-redo.svg000066400000000000000000000005431354442177200235020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/edit-rename.svg000066400000000000000000000006661354442177200240260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/edit-select-all.svg000066400000000000000000000007621354442177200246010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/edit-undo.svg000066400000000000000000000005031354442177200235120ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/folder-new.svg000066400000000000000000000107041354442177200236700ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/actions/folder_color_picker.svg000066400000000000000000000064071354442177200256410ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/format-justify-center.svg000066400000000000000000000004421354442177200260650ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/format-justify-fill.svg000066400000000000000000000004431354442177200255340ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/format-justify-left.svg000066400000000000000000000004341354442177200255400ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/format-justify-right.svg000066400000000000000000000004421354442177200257220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/format-text-bold.svg000066400000000000000000000013431354442177200250150ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/format-text-italic.svg000066400000000000000000000013361354442177200253440ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/format-text-strikethrough.svg000066400000000000000000000011201354442177200267700ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/format-text-underline.svg000066400000000000000000000012021354442177200260540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/go-next.svg000066400000000000000000000014311354442177200232040ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/go-right.svg000066400000000000000000000014311354442177200233430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/go-up.svg000066400000000000000000000015041354442177200226530ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/gohome.svg000066400000000000000000000013661354442177200231100ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/gtk-edit.svg000066400000000000000000000077061354442177200233460ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/actions/gtk-index.svg000066400000000000000000000127071354442177200235250ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/actions/history-view.svg000066400000000000000000000014561354442177200243030ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/list-add.svg000066400000000000000000000002651354442177200233300ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/list-remove.svg000066400000000000000000000002231354442177200240670ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/media-eject.svg000066400000000000000000000002771354442177200240010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/media-playback-pause.svg000066400000000000000000000002761354442177200256070ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/media-playback-record.svg000066400000000000000000000004241354442177200257430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/media-playback-start.svg000066400000000000000000000002171354442177200256220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/media-playback-stop.svg000066400000000000000000000002241354442177200254500ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/merge.svg000066400000000000000000000010051354442177200227170ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/split.svg000066400000000000000000000017101354442177200227560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/stock_home.svg000066400000000000000000000013661354442177200237650ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/stock_no.svg000066400000000000000000000010231354442177200234370ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/stock_notes.svg000066400000000000000000000065011354442177200241610ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/actions/stock_people.svg000066400000000000000000000060501354442177200243140ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/actions/stock_refresh.svg000066400000000000000000000021121354442177200244610ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/stock_shuffle.svg000066400000000000000000000041701354442177200244650ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/stock_timezone.svg000066400000000000000000000374131354442177200246710ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/actions/stock_view-details.svg000066400000000000000000000011271354442177200254250ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/stock_yes.svg000066400000000000000000000003541354442177200236310ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/tools-check-spelling.svg000066400000000000000000000062131354442177200256540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/view-fullscreen.svg000066400000000000000000000005301354442177200247340ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/view-refresh.svg000066400000000000000000000021121354442177200242260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/window-close.svg000066400000000000000000000017251354442177200242430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/zoom-in.svg000066400000000000000000000006641354442177200232220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/actions/zoom-out.svg000066400000000000000000000010201354442177200234060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/000077500000000000000000000000001354442177200215705ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/22x22/categories/application-community.svg000066400000000000000000000013701354442177200266370ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/applications-boardgames.svg000066400000000000000000000020351354442177200271010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/applications-chat.svg000066400000000000000000000024621354442177200257200ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/applications-debugging.svg000066400000000000000000000237751354442177200267460ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/applications-development.svg000066400000000000000000000006461354442177200273250ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/applications-games.svg000066400000000000000000000050771354442177200261020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/applications-geography.svg000066400000000000000000000207641354442177200267730ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/applications-internet.svg000066400000000000000000000024551354442177200266330ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/applications-libraries.svg000066400000000000000000000042211354442177200267500ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/applications-physics.svg000066400000000000000000000261031354442177200264610ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/applications-publishing.svg000066400000000000000000000143001354442177200271370ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/applications-puzzles.svg000066400000000000000000000053601354442177200265150ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/applications-roleplaying.svg000066400000000000000000000050231354442177200273220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/applications-science.svg000066400000000000000000000112501354442177200264050ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/applications-sports.svg000066400000000000000000000116031354442177200263300ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/applications-versioncontrol.svg000066400000000000000000000237771354442177200301030ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/gnome-settings.svg000066400000000000000000000031461354442177200252600ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/package_multimedia.svg000066400000000000000000000016031354442177200261160ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/package_settings.svg000066400000000000000000000022751354442177200256320ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/preferences-desktop-theme.svg000066400000000000000000000036771354442177200273760ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/preferences-system-time.svg000066400000000000000000000050161354442177200270720ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/preferences-system.svg000066400000000000000000000022751354442177200261420ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/categories/system-help.svg000066400000000000000000000022571354442177200245710ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/devices/000077500000000000000000000000001354442177200210655ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/22x22/devices/media-flash.svg000066400000000000000000000276721354442177200237760ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/devices/media-floppy.svg000066400000000000000000000047741354442177200242100ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/devices/media-optical.svg000066400000000000000000000116711354442177200243240ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/devices/stock_mic.svg000066400000000000000000000015631354442177200235660ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/000077500000000000000000000000001354442177200210675ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-art.svg000066400000000000000000000024531354442177200236410ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-camera.svg000066400000000000000000000034501354442177200243010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-danger.svg000066400000000000000000000022051354442177200243060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-development.svg000066400000000000000000000031471354442177200253760ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-downloads.svg000066400000000000000000000031571354442177200250470ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-dropbox-syncing.svg000066400000000000000000000022731354442177200262000ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-dropbox-uptodate.svg000066400000000000000000000012401354442177200263440ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-favorite.svg000066400000000000000000000024141354442177200246670ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-favorites.svg000066400000000000000000000024141354442177200250520ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-generic.svg000066400000000000000000000025331354442177200244660ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-insync-des-error.svg000066400000000000000000000012401354442177200262470ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-insync-error.svg000066400000000000000000000040541354442177200255040ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-marketing.svg000066400000000000000000000013571354442177200250360ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-money.svg000066400000000000000000000035441354442177200242040ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-noread.svg000066400000000000000000000012421354442177200243160ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-people.svg000066400000000000000000000050621354442177200243360ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-personal.svg000066400000000000000000000026131354442177200246740ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-plan.svg000066400000000000000000000013301354442177200237760ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-presentation.svg000066400000000000000000000015301354442177200255610ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-sales.svg000066400000000000000000000013571354442177200241640ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-shared.svg000066400000000000000000000050771354442177200243260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-sound.svg000066400000000000000000000022401354442177200241750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-system.svg000066400000000000000000000055321354442177200244000ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-urgent.svg000066400000000000000000000026371354442177200243630ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-videos.svg000066400000000000000000000010201354442177200243310ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/emblems/emblem-web.svg000066400000000000000000000145761354442177200236410ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/22x22/mimetypes/000077500000000000000000000000001354442177200214575ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/22x22/mimetypes/application-epub+zip.svg000066400000000000000000000052611354442177200262360ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/mimetypes/application-pdf.svg000066400000000000000000000100271354442177200252520ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/mimetypes/application-text-template.svg000066400000000000000000000052301354442177200272760ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/mimetypes/application-vnd.ms-word.svg000066400000000000000000000060271354442177200266640ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/mimetypes/application-vnd.oasis.opendocument.text.svg000066400000000000000000000060271354442177200320740ustar00rootroot00000000000000 image/svg+xml application-vnd.openxmlformats-officedocument.wordprocessingml.document.svg000066400000000000000000000060271354442177200405000ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/22x22/mimetypes image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/mimetypes/stock_calendar.svg000066400000000000000000000075421354442177200251640ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/mimetypes/text-html.svg000066400000000000000000000101711354442177200241260ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/mimetypes/text-plain.svg000066400000000000000000000055211354442177200242700ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/mimetypes/text-x-generic.svg000066400000000000000000000055211354442177200250460ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/mimetypes/text-x-markdown.svg000066400000000000000000000060431354442177200252540ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/mimetypes/text-x-opml+xml.svg000066400000000000000000000054251354442177200252000ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/mimetypes/text-x-plain.svg000066400000000000000000000055211354442177200245350ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/mimetypes/text-x-script.svg000066400000000000000000000064041354442177200247370ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/mimetypes/text-x-tex.svg000066400000000000000000000123701354442177200242320ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/mimetypes/text-xml.svg000066400000000000000000000054251354442177200237700ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/000077500000000000000000000000001354442177200207125ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/22x22/places/blue-folder.svg000066400000000000000000000111401354442177200236300ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/brown-folder.svg000066400000000000000000000111401354442177200240300ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/calendar-01.svg000066400000000000000000000105321354442177200234230ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/calendar-02.svg000066400000000000000000000115021354442177200234220ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/calendar-03.svg000066400000000000000000000131221354442177200234230ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/calendar-04.svg000066400000000000000000000107231354442177200234300ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/calendar-05.svg000066400000000000000000000120041354442177200234230ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/calendar-06.svg000066400000000000000000000132631354442177200234340ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/calendar-07.svg000066400000000000000000000100651354442177200234320ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/calendar-08.svg000066400000000000000000000144601354442177200234360ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/calendar-09.svg000066400000000000000000000133071354442177200234360ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/calendar-10.svg000066400000000000000000000132611354442177200234250ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/custom-folder.svg000066400000000000000000000111561354442177200242220ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/default-folder.svg000066400000000000000000000111401354442177200243250ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/folder-copy.svg000066400000000000000000000142001354442177200236530ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/folder-home.svg000066400000000000000000000136151354442177200236420ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/folder-music.svg000066400000000000000000000154131354442177200240300ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/folder-pictures.svg000066400000000000000000000132511354442177200245440ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/folder-projects.svg000066400000000000000000000161341354442177200245420ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/folder-publicshare.svg000066400000000000000000000173631354442177200252170ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/folder-recent.svg000066400000000000000000000132611354442177200241670ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/folder-remote.svg000066400000000000000000000243711354442177200242060ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/folder-saved-search.svg000066400000000000000000000131201354442177200252460ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/folder-sound.svg000066400000000000000000000154131354442177200240400ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/folder.svg000066400000000000000000000111401354442177200227030ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/green-folder.svg000066400000000000000000000111401354442177200240010ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/grey-folder.svg000066400000000000000000000111401354442177200236470ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/orange-folder.svg000066400000000000000000000111401354442177200241540ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/pink-folder.svg000066400000000000000000000111401354442177200236420ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/purple-folder.svg000066400000000000000000000111401354442177200242100ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/red-folder.svg000066400000000000000000000111401354442177200234530ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/stock_trash_empty.svg000066400000000000000000000230001354442177200251700ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/stock_trash_full.svg000066400000000000000000000222601354442177200250030ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/places/yellow-folder.svg000066400000000000000000000111401354442177200242140ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/status/000077500000000000000000000000001354442177200207665ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/22x22/status/dialog-error.svg000066400000000000000000000034531354442177200241020ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/status/dialog-information.svg000066400000000000000000000037231354442177200252760ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/status/dialog-question.svg000066400000000000000000000040361354442177200246160ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/status/dialog-warning.svg000066400000000000000000000036641354442177200244220ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/status/info.svg000066400000000000000000000037231354442177200224470ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/status/stock_score-high.svg000066400000000000000000000032151354442177200247430ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/status/stock_score-higher.svg000066400000000000000000000032171354442177200252740ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/status/stock_score-highest.svg000066400000000000000000000032201354442177200254530ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/status/stock_score-low.svg000066400000000000000000000032141354442177200246240ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/status/stock_score-lower.svg000066400000000000000000000032161354442177200251550ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/status/stock_score-lowest.svg000066400000000000000000000032171354442177200253430ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/22x22/status/stock_score-normal.svg000066400000000000000000000032171354442177200253160ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/000077500000000000000000000000001354442177200174475ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/24x24/actions/000077500000000000000000000000001354442177200211075ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/24x24/actions/application-exit.svg000066400000000000000000000015631354442177200251070ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/configure.svg000066400000000000000000000033601354442177200236130ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/dialog-cancel.svg000066400000000000000000000010231354442177200243060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/dialog-close.svg000066400000000000000000000017321354442177200241750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/dialog-no.svg000066400000000000000000000010231354442177200234750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/dialog-ok.svg000066400000000000000000000003631354442177200235000ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/dialog-yes.svg000066400000000000000000000003631354442177200236670ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/document-export.svg000066400000000000000000000013061354442177200247650ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/document-import.svg000066400000000000000000000010401354442177200247510ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/document-new.svg000066400000000000000000000005041354442177200242340ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/document-open.svg000066400000000000000000000106201354442177200244040ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/actions/document-print-preview.svg000066400000000000000000000016531354442177200262640ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/document-save-as.svg000066400000000000000000000014031354442177200250010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/document-save.svg000066400000000000000000000010001354442177200243710ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/edit-clear.svg000066400000000000000000000004621354442177200236430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/edit-copy.svg000066400000000000000000000010551354442177200235260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/edit-cut.svg000066400000000000000000000013241354442177200233460ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/edit-delete.svg000066400000000000000000000006531354442177200240210ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/edit-find.svg000066400000000000000000000013661354442177200235010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/edit-paste.svg000066400000000000000000000006651354442177200236760ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/edit-redo.svg000066400000000000000000000004471354442177200235110ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/edit-rename.svg000066400000000000000000000006361354442177200240270ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/edit-select-all.svg000066400000000000000000000007011354442177200245760ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/edit-undo.svg000066400000000000000000000004361354442177200235230ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/folder-new.svg000066400000000000000000000107041354442177200236740ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/actions/folder_color_picker.svg000066400000000000000000000064101354442177200256370ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/format-justify-center.svg000066400000000000000000000004051354442177200260700ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/format-justify-fill.svg000066400000000000000000000004061354442177200255370ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/format-justify-left.svg000066400000000000000000000003771354442177200255520ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/format-justify-right.svg000066400000000000000000000004051354442177200257250ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/format-text-bold.svg000066400000000000000000000012271354442177200250220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/format-text-italic.svg000066400000000000000000000013361354442177200253500ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/format-text-strikethrough.svg000066400000000000000000000010631354442177200270020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/format-text-underline.svg000066400000000000000000000011461354442177200260670ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/go-next.svg000066400000000000000000000014751354442177200232200ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/go-right.svg000066400000000000000000000014751354442177200233570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/go-up.svg000066400000000000000000000015041354442177200226570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/gohome.svg000066400000000000000000000013201354442177200231020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/gtk-edit.svg000066400000000000000000000076741354442177200233560ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/actions/gtk-index.svg000066400000000000000000000127051354442177200235270ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/actions/history-view.svg000066400000000000000000000013751354442177200243070ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/list-add.svg000066400000000000000000000002651354442177200233340ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/list-remove.svg000066400000000000000000000002231354442177200240730ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/media-eject.svg000066400000000000000000000003361354442177200240010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/media-playback-pause.svg000066400000000000000000000003311354442177200256030ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/media-playback-record.svg000066400000000000000000000004241354442177200257470ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/media-playback-start.svg000066400000000000000000000002171354442177200256260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/media-playback-stop.svg000066400000000000000000000002241354442177200254540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/merge.svg000066400000000000000000000010071354442177200227250ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/split.svg000066400000000000000000000016721354442177200227710ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/stock_home.svg000066400000000000000000000013201354442177200237570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/stock_no.svg000066400000000000000000000010231354442177200234430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/stock_notes.svg000066400000000000000000000065031354442177200241670ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/actions/stock_people.svg000066400000000000000000000060431354442177200243220ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/actions/stock_refresh.svg000066400000000000000000000021261354442177200244720ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/stock_shuffle.svg000066400000000000000000000042521354442177200244720ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/stock_timezone.svg000066400000000000000000000374401354442177200246750ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/actions/stock_view-details.svg000066400000000000000000000010411354442177200254240ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/stock_yes.svg000066400000000000000000000003631354442177200236350ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/tools-check-spelling.svg000066400000000000000000000063121354442177200256600ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/view-fullscreen.svg000066400000000000000000000005121354442177200247400ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/view-refresh.svg000066400000000000000000000021261354442177200242370ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/window-close.svg000066400000000000000000000017321354442177200242450ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/zoom-in.svg000066400000000000000000000007301354442177200232200ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/actions/zoom-out.svg000066400000000000000000000010641354442177200234220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/000077500000000000000000000000001354442177200215745ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/24x24/categories/application-community.svg000066400000000000000000000012131354442177200266370ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/applications-boardgames.svg000066400000000000000000000020311354442177200271010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/applications-chat.svg000066400000000000000000000024551354442177200257260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/applications-debugging.svg000066400000000000000000000242171354442177200267420ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/applications-development.svg000066400000000000000000000006451354442177200273300ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/applications-games.svg000066400000000000000000000051371354442177200261030ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/applications-geography.svg000066400000000000000000000207441354442177200267750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/applications-internet.svg000066400000000000000000000024621354442177200266350ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/applications-libraries.svg000066400000000000000000000041161354442177200267570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/applications-physics.svg000066400000000000000000000262361354442177200264740ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/applications-publishing.svg000066400000000000000000000143371354442177200271550ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/applications-puzzles.svg000066400000000000000000000053561354442177200265260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/applications-roleplaying.svg000066400000000000000000000050301354442177200273240ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/applications-science.svg000066400000000000000000000112231354442177200264110ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/applications-sports.svg000066400000000000000000000115711354442177200263400ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/applications-versioncontrol.svg000066400000000000000000000237361354442177200301020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/gnome-settings.svg000066400000000000000000000030231354442177200252560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/package_multimedia.svg000066400000000000000000000015511354442177200261240ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/package_settings.svg000066400000000000000000000016721354442177200256360ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/preferences-desktop-theme.svg000066400000000000000000000037051354442177200273720ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/preferences-system-time.svg000066400000000000000000000050001354442177200270670ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/preferences-system.svg000066400000000000000000000016721354442177200261460ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/categories/system-help.svg000066400000000000000000000022541354442177200245720ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/devices/000077500000000000000000000000001354442177200210715ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/24x24/devices/media-flash.svg000066400000000000000000000267721354442177200240020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/devices/media-floppy.svg000066400000000000000000000057521354442177200242110ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/devices/media-optical.svg000066400000000000000000000116161354442177200243270ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/devices/stock_mic.svg000066400000000000000000000015011354442177200235620ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/000077500000000000000000000000001354442177200210735ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-art.svg000066400000000000000000000024541354442177200236460ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-camera.svg000066400000000000000000000033501354442177200243040ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-danger.svg000066400000000000000000000017061354442177200243170ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-development.svg000066400000000000000000000031211354442177200253720ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-downloads.svg000066400000000000000000000031341354442177200250460ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-dropbox-syncing.svg000066400000000000000000000022271354442177200262030ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-dropbox-uptodate.svg000066400000000000000000000012151354442177200263520ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-favorite.svg000066400000000000000000000024011354442177200246670ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-favorites.svg000066400000000000000000000024011354442177200250520ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-generic.svg000066400000000000000000000025231354442177200244710ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-insync-des-error.svg000066400000000000000000000012151354442177200262550ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-insync-error.svg000066400000000000000000000040411354442177200255040ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-marketing.svg000066400000000000000000000011751354442177200250400ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-money.svg000066400000000000000000000035101354442177200242010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-noread.svg000066400000000000000000000012161354442177200243230ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-people.svg000066400000000000000000000050771354442177200243500ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-personal.svg000066400000000000000000000026261354442177200247040ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-plan.svg000066400000000000000000000013101354442177200240000ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-presentation.svg000066400000000000000000000015231354442177200255670ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-sales.svg000066400000000000000000000011751354442177200241660ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-shared.svg000066400000000000000000000045641354442177200243320ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-sound.svg000066400000000000000000000022311354442177200242010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-system.svg000066400000000000000000000051301354442177200243760ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-urgent.svg000066400000000000000000000024251354442177200243620ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-videos.svg000066400000000000000000000007771354442177200243570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/emblems/emblem-web.svg000066400000000000000000000146201354442177200236330ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/24x24/mimetypes/000077500000000000000000000000001354442177200214635ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/24x24/mimetypes/application-epub+zip.svg000066400000000000000000000054451354442177200262460ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/mimetypes/application-pdf.svg000066400000000000000000000100131354442177200252510ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/mimetypes/application-text-template.svg000066400000000000000000000052161354442177200273060ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/mimetypes/application-vnd.ms-word.svg000066400000000000000000000060101354442177200266600ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/mimetypes/application-vnd.oasis.opendocument.text.svg000066400000000000000000000060101354442177200320700ustar00rootroot00000000000000 image/svg+xml application-vnd.openxmlformats-officedocument.wordprocessingml.document.svg000066400000000000000000000060101354442177200404740ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/24x24/mimetypes image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/mimetypes/stock_calendar.svg000066400000000000000000000075441354442177200251720ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/mimetypes/text-html.svg000066400000000000000000000102031354442177200241260ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/mimetypes/text-plain.svg000066400000000000000000000055221354442177200242750ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/mimetypes/text-x-generic.svg000066400000000000000000000055221354442177200250530ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/mimetypes/text-x-markdown.svg000066400000000000000000000062131354442177200252570ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/mimetypes/text-x-opml+xml.svg000066400000000000000000000054231354442177200252020ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/mimetypes/text-x-plain.svg000066400000000000000000000055221354442177200245420ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/mimetypes/text-x-script.svg000066400000000000000000000064131354442177200247430ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/mimetypes/text-x-tex.svg000066400000000000000000000123231354442177200242340ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/mimetypes/text-xml.svg000066400000000000000000000054231354442177200237720ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/000077500000000000000000000000001354442177200207165ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/24x24/places/blue-folder.svg000066400000000000000000000111371354442177200236420ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/brown-folder.svg000066400000000000000000000111371354442177200240420ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/calendar-01.svg000066400000000000000000000104641354442177200234330ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/calendar-02.svg000066400000000000000000000114371354442177200234350ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/calendar-03.svg000066400000000000000000000130561354442177200234350ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/calendar-04.svg000066400000000000000000000106541354442177200234370ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/calendar-05.svg000066400000000000000000000117411354442177200234360ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/calendar-06.svg000066400000000000000000000132161354442177200234360ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/calendar-07.svg000066400000000000000000000100161354442177200234320ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/calendar-08.svg000066400000000000000000000144041354442177200234400ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/calendar-09.svg000066400000000000000000000132501354442177200234370ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/calendar-10.svg000066400000000000000000000132171354442177200234320ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/custom-folder.svg000066400000000000000000000111551354442177200242250ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/default-folder.svg000066400000000000000000000111371354442177200243370ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/folder-copy.svg000066400000000000000000000141771354442177200236740ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/folder-home.svg000066400000000000000000000134701354442177200236450ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/folder-music.svg000066400000000000000000000154071354442177200240370ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/folder-pictures.svg000066400000000000000000000132371354442177200245540ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/folder-projects.svg000066400000000000000000000161241354442177200245450ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/folder-publicshare.svg000066400000000000000000000172361354442177200252220ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/folder-recent.svg000066400000000000000000000131251354442177200241720ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/folder-remote.svg000066400000000000000000000241541354442177200242110ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/folder-saved-search.svg000066400000000000000000000131121354442177200252530ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/folder-sound.svg000066400000000000000000000154071354442177200240470ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/folder.svg000066400000000000000000000111371354442177200227150ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/green-folder.svg000066400000000000000000000111371354442177200240130ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/grey-folder.svg000066400000000000000000000111371354442177200236610ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/orange-folder.svg000066400000000000000000000111371354442177200241660ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/pink-folder.svg000066400000000000000000000111371354442177200236540ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/purple-folder.svg000066400000000000000000000111371354442177200242220ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/red-folder.svg000066400000000000000000000111371354442177200234650ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/stock_trash_empty.svg000066400000000000000000000227741354442177200252150ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/stock_trash_full.svg000066400000000000000000000222621354442177200250110ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/places/yellow-folder.svg000066400000000000000000000111371354442177200242260ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/status/000077500000000000000000000000001354442177200207725ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/24x24/status/dialog-error.svg000066400000000000000000000034261354442177200241060ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/status/dialog-information.svg000066400000000000000000000037501354442177200253020ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/status/dialog-question.svg000066400000000000000000000040431354442177200246200ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/status/dialog-warning.svg000066400000000000000000000037111354442177200244170ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/status/info.svg000066400000000000000000000037501354442177200224530ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/status/stock_score-high.svg000066400000000000000000000032411354442177200247460ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/status/stock_score-higher.svg000066400000000000000000000032521354442177200252770ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/status/stock_score-highest.svg000066400000000000000000000034011354442177200254600ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/status/stock_score-low.svg000066400000000000000000000032501354442177200246300ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/status/stock_score-lower.svg000066400000000000000000000032421354442177200251600ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/status/stock_score-lowest.svg000066400000000000000000000032421354442177200253450ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/24x24/status/stock_score-normal.svg000066400000000000000000000032531354442177200253220ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/000077500000000000000000000000001354442177200176255ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/256x256/actions/000077500000000000000000000000001354442177200212655ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/256x256/actions/application-exit.svg000066400000000000000000000017321354442177200252630ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/dialog-cancel.svg000066400000000000000000000015011354442177200244650ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/dialog-close.svg000066400000000000000000000054161354442177200243560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/dialog-no.svg000066400000000000000000000015011354442177200236540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/dialog-ok.svg000066400000000000000000000004661354442177200236620ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/dialog-yes.svg000066400000000000000000000004661354442177200240510ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/document-export.svg000066400000000000000000000016151354442177200251460ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/document-new.svg000066400000000000000000000010311354442177200244060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/document-open.svg000066400000000000000000000217361354442177200245740ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/actions/document-print-preview.svg000066400000000000000000000030101354442177200264270ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/document-save-as.svg000066400000000000000000000016461354442177200251700ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/document-save.svg000066400000000000000000000016021354442177200245570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/edit-clear.svg000066400000000000000000000010321354442177200240130ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/edit-copy.svg000066400000000000000000000014401354442177200237020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/edit-cut.svg000066400000000000000000000030421354442177200235230ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/edit-delete.svg000066400000000000000000000011671354442177200242000ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/edit-find.svg000066400000000000000000000031361354442177200236540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/edit-paste.svg000066400000000000000000000014231354442177200240450ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/edit-redo.svg000066400000000000000000000010231354442177200236560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/edit-select-all.svg000066400000000000000000000011731354442177200247600ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/edit-undo.svg000066400000000000000000000010341354442177200236740ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/folder-new.svg000066400000000000000000000272071354442177200240600ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/actions/folder_color_picker.svg000066400000000000000000000165201354442177200260200ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/actions/format-justify-center.svg000066400000000000000000000005631354442177200262530ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/format-justify-fill.svg000066400000000000000000000005631354442177200257210ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/format-justify-left.svg000066400000000000000000000005631354442177200257250ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/format-justify-right.svg000066400000000000000000000005651354442177200261120ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/format-text-bold.svg000066400000000000000000000013521354442177200251770ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/format-text-italic.svg000066400000000000000000000014361354442177200255270ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/format-text-strikethrough.svg000066400000000000000000000013551354442177200271640ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/format-text-underline.svg000066400000000000000000000017261354442177200262510ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/go-next.svg000066400000000000000000000017441354442177200233750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/go-right.svg000066400000000000000000000017441354442177200235340ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/go-up.svg000066400000000000000000000017411354442177200230400ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/gohome.svg000066400000000000000000000016601354442177200232670ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/gtk-edit.svg000066400000000000000000000101301354442177200235110ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/actions/gtk-index.svg000066400000000000000000000131101354442177200236740ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/actions/list-add.svg000066400000000000000000000004321354442177200235060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/list-remove.svg000066400000000000000000000003221354442177200242510ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/media-eject.svg000066400000000000000000000004051354442177200241540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/media-playback-pause.svg000066400000000000000000000004201354442177200257600ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/media-playback-record.svg000066400000000000000000000006121354442177200261240ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/media-playback-start.svg000066400000000000000000000003101354442177200257760ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/media-playback-stop.svg000066400000000000000000000003221354442177200256310ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/set-target.svg000066400000000000000000000015451354442177200240720ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/split-close.svg000066400000000000000000000030701354442177200242440ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/actions/split-horizontal.svg000066400000000000000000000033231354442177200253310ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/actions/split-vertical.svg000066400000000000000000000004201354442177200247440ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/stock_home.svg000066400000000000000000000016601354442177200241440ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/stock_no.svg000066400000000000000000000015011354442177200236220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/stock_notes.svg000066400000000000000000000065661354442177200243560ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/actions/stock_people.svg000066400000000000000000000057211354442177200245020ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/actions/stock_refresh.svg000066400000000000000000000023401354442177200246460ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/stock_shuffle.svg000066400000000000000000000052421354442177200246500ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/stock_timezone.svg000066400000000000000000000372351354442177200250550ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/actions/stock_view-details.svg000066400000000000000000000012141354442177200256040ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/stock_yes.svg000066400000000000000000000004661354442177200240170ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/tools-check-spelling.svg000066400000000000000000000076771354442177200260550ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/view-cards.svg000066400000000000000000000036671354442177200240660ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/actions/view-fullscreen.svg000066400000000000000000000006721354442177200251250ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/view-outline.svg000066400000000000000000000051771354442177200244470ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/actions/view-refresh.svg000066400000000000000000000023401354442177200244130ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/view-text.svg000066400000000000000000000031551354442177200237460ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/actions/window-close.svg000066400000000000000000000054161354442177200244260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/zoom-in.svg000066400000000000000000000013771354442177200234060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/actions/zoom-out.svg000066400000000000000000000013601354442177200235770ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/000077500000000000000000000000001354442177200217525ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/256x256/categories/application-community.svg000066400000000000000000000014511354442177200270210ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/applications-boardgames.svg000066400000000000000000000020441354442177200272630ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/applications-chat.svg000066400000000000000000000026551354442177200261060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/applications-debugging.svg000066400000000000000000000262231354442177200271170ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/applications-development.svg000066400000000000000000000007141354442177200275030ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/applications-games.svg000066400000000000000000000055161354442177200262620ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/applications-geography.svg000066400000000000000000000223461354442177200271530ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/applications-internet.svg000066400000000000000000000025221354442177200270100ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/applications-libraries.svg000066400000000000000000000044651354442177200271440ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/applications-physics.svg000066400000000000000000000304701354442177200266450ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/applications-publishing.svg000066400000000000000000000151611354442177200273270ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/applications-puzzles.svg000066400000000000000000000053431354442177200267000ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/applications-roleplaying.svg000066400000000000000000000050171354442177200275070ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/applications-science.svg000066400000000000000000000117521354442177200265760ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/applications-sports.svg000066400000000000000000000116031354442177200265120ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/applications-versioncontrol.svg000066400000000000000000000302241354442177200302460ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/gnome-settings.svg000066400000000000000000000033461354442177200254440ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/package_multimedia.svg000066400000000000000000000017331354442177200263040ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/package_settings.svg000066400000000000000000000023451354442177200260120ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/preferences-system.svg000066400000000000000000000023451354442177200263220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/categories/system-help.svg000066400000000000000000000024171354442177200247510ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/devices/000077500000000000000000000000001354442177200212475ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/256x256/devices/media-flash.svg000066400000000000000000000316561354442177200241550ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/devices/media-floppy.svg000066400000000000000000000014501354442177200243560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/devices/media-optical.svg000066400000000000000000000022551354442177200245040ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/devices/stock_mic.svg000066400000000000000000000016011354442177200237410ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/000077500000000000000000000000001354442177200212515ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-art.svg000066400000000000000000000026101354442177200240160ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-camera.svg000066400000000000000000000037111354442177200244630ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-danger.svg000066400000000000000000000022321354442177200244700ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-development.svg000066400000000000000000000033611354442177200255560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-downloads.svg000066400000000000000000000033001354442177200252170ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-dropbox-syncing.svg000066400000000000000000000023521354442177200263600ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-dropbox-uptodate.svg000066400000000000000000000012611354442177200265310ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-favorite.svg000066400000000000000000000025441354442177200250550ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-favorites.svg000066400000000000000000000025441354442177200252400ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-generic.svg000066400000000000000000000027021354442177200246460ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-insync-des-error.svg000066400000000000000000000040331354442177200264340ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-insync-error.svg000066400000000000000000000040731354442177200256670ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-marketing.svg000066400000000000000000000013521354442177200252130ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-money.svg000066400000000000000000000037441354442177200243700ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-noread.svg000066400000000000000000000012571354442177200245060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-people.svg000066400000000000000000000053761354442177200245300ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-personal.svg000066400000000000000000000030341354442177200250540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-plan.svg000066400000000000000000000014131354442177200241620ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-presentation.svg000066400000000000000000000016221354442177200257450ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-sales.svg000066400000000000000000000013521354442177200243410ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-shared.svg000066400000000000000000000054701354442177200245050ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-sound.svg000066400000000000000000000024101354442177200243560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-system.svg000066400000000000000000000055241354442177200245630ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-urgent.svg000066400000000000000000000026501354442177200245400ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-videos.svg000066400000000000000000000010171354442177200245210ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/emblems/emblem-web.svg000066400000000000000000000163551354442177200240200ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/mimetypes/000077500000000000000000000000001354442177200216415ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/256x256/mimetypes/application-epub+zip.svg000066400000000000000000000025301354442177200264140ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/mimetypes/application-pdf.svg000066400000000000000000000051331354442177200254360ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/mimetypes/application-text-template.svg000066400000000000000000000030761354442177200274660ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/mimetypes/application-vnd.ms-word.svg000066400000000000000000000151461354442177200270500ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/mimetypes/application-vnd.oasis.opendocument.text.svg000066400000000000000000000126741354442177200322630ustar00rootroot00000000000000 application-vnd.openxmlformats-officedocument.wordprocessingml.document.svg000066400000000000000000000217641354442177200406670ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/256x256/mimetypes image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/mimetypes/stock_calendar.svg000066400000000000000000000060221354442177200253360ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/mimetypes/text-html.svg000066400000000000000000000050661354442177200243170ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/mimetypes/text-plain.svg000066400000000000000000000035711354442177200244550ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/mimetypes/text-x-generic.svg000066400000000000000000000035711354442177200252330ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/mimetypes/text-x-markdown.svg000066400000000000000000000040371354442177200254370ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/mimetypes/text-x-opml+xml.svg000066400000000000000000000025111354442177200253530ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/mimetypes/text-x-plain.svg000066400000000000000000000035711354442177200247220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/mimetypes/text-x-script.svg000066400000000000000000000030271354442177200251170ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/mimetypes/text-x-tex.svg000066400000000000000000000123251354442177200244140ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/mimetypes/text-xml.svg000066400000000000000000000025111354442177200241430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/256x256/places/000077500000000000000000000000001354442177200210745ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/256x256/places/blue-folder.svg000066400000000000000000000147061354442177200240250ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/brown-folder.svg000066400000000000000000000147061354442177200242250ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/calendar-01.svg000066400000000000000000000104171354442177200236070ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/calendar-02.svg000066400000000000000000000113221354442177200236040ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/calendar-03.svg000066400000000000000000000127131354442177200236120ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/calendar-04.svg000066400000000000000000000105651354442177200236160ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/calendar-05.svg000066400000000000000000000116271354442177200236170ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/calendar-06.svg000066400000000000000000000130601354442177200236110ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/calendar-07.svg000066400000000000000000000077551354442177200236300ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/calendar-08.svg000066400000000000000000000142221354442177200236140ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/calendar-09.svg000066400000000000000000000130761354442177200236230ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/calendar-10.svg000066400000000000000000000130551354442177200236100ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/custom-folder.svg000066400000000000000000000147241354442177200244100ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/default-folder.svg000066400000000000000000000147061354442177200245220ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/folder-copy.svg000066400000000000000000000146501354442177200240460ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/folder-home.svg000066400000000000000000000732311354442177200240240ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/folder-music.svg000066400000000000000000000362731354442177200242210ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/folder-pictures.svg000066400000000000000000000373311354442177200247330ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/folder-projects.svg000066400000000000000000000215331354442177200247230ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/folder-publicshare.svg000066400000000000000000000452441354442177200254000ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/folder-recent.svg000066400000000000000000000455071354442177200243610ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/folder-remote.svg000066400000000000000000000757431354442177200244010ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/folder-saved-search.svg000066400000000000000000000464241354442177200254450ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/folder-sound.svg000066400000000000000000000362731354442177200242310ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/folder.svg000066400000000000000000000147061354442177200231000ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/green-folder.svg000066400000000000000000000147061354442177200241760ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/grey-folder.svg000066400000000000000000000147061354442177200240440ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/orange-folder.svg000066400000000000000000000147061354442177200243510ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/pink-folder.svg000066400000000000000000000147061354442177200240370ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/purple-folder.svg000066400000000000000000000147061354442177200244050ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/red-folder.svg000066400000000000000000000147061354442177200236500ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/stock_trash_empty.svg000066400000000000000000000240541354442177200253640ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/stock_trash_full.svg000066400000000000000000000521631354442177200251720ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/places/yellow-folder.svg000066400000000000000000000147061354442177200244110ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/status/000077500000000000000000000000001354442177200211505ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/256x256/status/dialog-error.svg000066400000000000000000000035501354442177200242620ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/status/dialog-information.svg000066400000000000000000000041001354442177200254460ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/status/dialog-question.svg000066400000000000000000000041301354442177200247730ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/status/dialog-warning.svg000066400000000000000000000037521354442177200246020ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/status/info.svg000066400000000000000000000041001354442177200226170ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/status/stock_score-high.svg000066400000000000000000000033051354442177200251250ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/status/stock_score-higher.svg000066400000000000000000000033101354442177200254500ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/status/stock_score-highest.svg000066400000000000000000000034361354442177200256460ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/status/stock_score-low.svg000066400000000000000000000033071354442177200250110ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/status/stock_score-lower.svg000066400000000000000000000032771354442177200253460ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/status/stock_score-lowest.svg000066400000000000000000000033001354442177200255160ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/256x256/status/stock_score-normal.svg000066400000000000000000000033101354442177200254720ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/000077500000000000000000000000001354442177200174455ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/32x32/actions/000077500000000000000000000000001354442177200211055ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/32x32/actions/application-exit.svg000066400000000000000000000015361354442177200251050ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/configure.svg000066400000000000000000000033611354442177200236120ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/dialog-cancel.svg000066400000000000000000000014121354442177200243060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/dialog-close.svg000066400000000000000000000054641354442177200242010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/dialog-no.svg000066400000000000000000000014121354442177200234750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/dialog-ok.svg000066400000000000000000000004441354442177200234760ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/dialog-yes.svg000066400000000000000000000004441354442177200236650ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/document-export.svg000066400000000000000000000014461354442177200247700ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/document-import.svg000066400000000000000000000012561354442177200247600ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/document-new.svg000066400000000000000000000007421354442177200242360ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/document-open.svg000066400000000000000000000134151354442177200244070ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/actions/document-print-preview.svg000066400000000000000000000025221354442177200262560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/document-save-as.svg000066400000000000000000000015301354442177200250000ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/document-save.svg000066400000000000000000000014701354442177200244020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/edit-clear.svg000066400000000000000000000007621354442177200236440ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/edit-copy.svg000066400000000000000000000012601354442177200235220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/edit-cut.svg000066400000000000000000000026641354442177200233540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/edit-delete.svg000066400000000000000000000010751354442177200240160ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/edit-find.svg000066400000000000000000000026601354442177200234750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/edit-paste.svg000066400000000000000000000013231354442177200236640ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/edit-redo.svg000066400000000000000000000007531354442177200235070ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/edit-rename.svg000066400000000000000000000006231354442177200240210ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/edit-select-all.svg000066400000000000000000000010711354442177200245750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/edit-undo.svg000066400000000000000000000007601354442177200235210ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/folder-new.svg000066400000000000000000000121531354442177200236720ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/actions/folder_color_picker.svg000066400000000000000000000063601354442177200256410ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/format-justify-center.svg000066400000000000000000000005211354442177200260650ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/format-justify-fill.svg000066400000000000000000000005211354442177200255330ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/format-justify-left.svg000066400000000000000000000005211354442177200255370ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/format-justify-right.svg000066400000000000000000000005251354442177200257260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/format-text-bold.svg000066400000000000000000000012701354442177200250160ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/format-text-italic.svg000066400000000000000000000012261354442177200253440ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/format-text-strikethrough.svg000066400000000000000000000010551354442177200270010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/format-text-underline.svg000066400000000000000000000013531354442177200260650ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/go-next.svg000066400000000000000000000016161354442177200232130ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/go-right.svg000066400000000000000000000016161354442177200233520ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/go-up.svg000066400000000000000000000016141354442177200226570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/gohome.svg000066400000000000000000000014661354442177200231130ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/gtk-edit.svg000066400000000000000000000100511354442177200233330ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/actions/gtk-index.svg000066400000000000000000000127631354442177200235310ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/actions/history-view.svg000066400000000000000000000016211354442177200242770ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/list-add.svg000066400000000000000000000004061354442177200233270ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/list-remove.svg000066400000000000000000000003101354442177200240660ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/media-eject.svg000066400000000000000000000003631354442177200237770ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/media-playback-pause.svg000066400000000000000000000003741354442177200256100ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/media-playback-record.svg000066400000000000000000000005271354442177200257510ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/media-playback-start.svg000066400000000000000000000002771354442177200256320ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/media-playback-stop.svg000066400000000000000000000003061354442177200254530ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/merge.svg000066400000000000000000000007761354442177200227370ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/split.svg000066400000000000000000000015731354442177200227670ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/stock_home.svg000066400000000000000000000014661354442177200237700ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/stock_no.svg000066400000000000000000000014121354442177200234430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/stock_notes.svg000066400000000000000000000066051354442177200241700ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/actions/stock_people.svg000066400000000000000000000060341354442177200243200ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/actions/stock_refresh.svg000066400000000000000000000021151354442177200244660ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/stock_shuffle.svg000066400000000000000000000050001354442177200244600ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/stock_timezone.svg000066400000000000000000000372241354442177200246730ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/actions/stock_view-details.svg000066400000000000000000000011301354442177200254210ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/stock_yes.svg000066400000000000000000000004441354442177200236330ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/tools-check-spelling.svg000066400000000000000000000071651354442177200256650ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/view-fullscreen.svg000066400000000000000000000006341354442177200247430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/view-refresh.svg000066400000000000000000000021151354442177200242330ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/window-close.svg000066400000000000000000000054641354442177200242510ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/zoom-in.svg000066400000000000000000000011641354442177200232200ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/actions/zoom-out.svg000066400000000000000000000011511354442177200234150ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/000077500000000000000000000000001354442177200215725ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/32x32/categories/application-community.svg000066400000000000000000000013671354442177200266470ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/applications-boardgames.svg000066400000000000000000000020361354442177200271040ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/applications-chat.svg000066400000000000000000000024721354442177200257230ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/applications-debugging.svg000066400000000000000000000244261354442177200267420ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/applications-development.svg000066400000000000000000000006601354442177200273230ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/applications-games.svg000066400000000000000000000052521354442177200260770ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/applications-geography.svg000066400000000000000000000213011354442177200267610ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/applications-internet.svg000066400000000000000000000024551354442177200266350ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/applications-libraries.svg000066400000000000000000000042211354442177200267520ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/applications-physics.svg000066400000000000000000000267401354442177200264720ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/applications-publishing.svg000066400000000000000000000145251354442177200271520ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/applications-puzzles.svg000066400000000000000000000053401354442177200265150ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/applications-roleplaying.svg000066400000000000000000000050241354442177200273250ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/applications-science.svg000066400000000000000000000114001354442177200264040ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/applications-sports.svg000066400000000000000000000115751354442177200263420ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/applications-versioncontrol.svg000066400000000000000000000240431354442177200300700ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/gnome-settings.svg000066400000000000000000000032121354442177200252540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/package_multimedia.svg000066400000000000000000000016411354442177200261220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/package_settings.svg000066400000000000000000000022561354442177200256330ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/preferences-desktop-theme.svg000066400000000000000000000035001354442177200273610ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/preferences-system-time.svg000066400000000000000000000047531354442177200271030ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/preferences-system.svg000066400000000000000000000022561354442177200261430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/categories/system-help.svg000066400000000000000000000023101354442177200245610ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/devices/000077500000000000000000000000001354442177200210675ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/32x32/devices/media-flash.svg000066400000000000000000000301511354442177200237620ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/devices/media-floppy.svg000066400000000000000000000061111354442177200241750ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/devices/media-optical.svg000066400000000000000000000116361354442177200243270ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/devices/stock_mic.svg000066400000000000000000000015461354442177200235710ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/000077500000000000000000000000001354442177200210715ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-art.svg000066400000000000000000000024731354442177200236450ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-camera.svg000066400000000000000000000035151354442177200243050ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-danger.svg000066400000000000000000000021061354442177200243100ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-development.svg000066400000000000000000000032161354442177200253750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-downloads.svg000066400000000000000000000031651354442177200250500ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-dropbox-syncing.svg000066400000000000000000000023171354442177200262010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-dropbox-uptodate.svg000066400000000000000000000012361354442177200263530ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-favorite.svg000066400000000000000000000024331354442177200246720ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-favorites.svg000066400000000000000000000024331354442177200250550ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-generic.svg000066400000000000000000000025461354442177200244740ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-insync-des-error.svg000066400000000000000000000012361354442177200262560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-insync-error.svg000066400000000000000000000040461354442177200255070ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-marketing.svg000066400000000000000000000013211354442177200250270ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-money.svg000066400000000000000000000035161354442177200242050ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-noread.svg000066400000000000000000000012301354442177200243150ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-people.svg000066400000000000000000000051251354442177200243400ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-personal.svg000066400000000000000000000026561354442177200247050ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-plan.svg000066400000000000000000000013321354442177200240020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-presentation.svg000066400000000000000000000015301354442177200255630ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-sales.svg000066400000000000000000000013211354442177200241550ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-shared.svg000066400000000000000000000050341354442177200243210ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-sound.svg000066400000000000000000000022301354442177200241760ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-system.svg000066400000000000000000000055271354442177200244060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-urgent.svg000066400000000000000000000025541354442177200243630ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-videos.svg000066400000000000000000000010061354442177200243370ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/emblems/emblem-web.svg000066400000000000000000000152201354442177200236260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/mimetypes/000077500000000000000000000000001354442177200214615ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/32x32/mimetypes/application-epub+zip.svg000066400000000000000000000054601354442177200262410ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/mimetypes/application-pdf.svg000066400000000000000000000076631354442177200252700ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/mimetypes/application-text-template.svg000066400000000000000000000060051354442177200273010ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/mimetypes/application-vnd.ms-word.svg000066400000000000000000000172231354442177200266660ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/mimetypes/application-vnd.oasis.opendocument.text.svg000066400000000000000000000152351354442177200320770ustar00rootroot00000000000000 image/svg+xml application-vnd.openxmlformats-officedocument.wordprocessingml.document.svg000066400000000000000000000205361354442177200405030ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/32x32/mimetypes image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/mimetypes/stock_calendar.svg000066400000000000000000000054771354442177200251730ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/32x32/mimetypes/text-html.svg000066400000000000000000000076661354442177200241470ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/mimetypes/text-plain.svg000066400000000000000000000065621354442177200243000ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/mimetypes/text-x-generic.svg000066400000000000000000000065621354442177200250560ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/mimetypes/text-x-markdown.svg000066400000000000000000000070201354442177200252520ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/mimetypes/text-x-opml+xml.svg000066400000000000000000000056561354442177200252100ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/mimetypes/text-x-plain.svg000066400000000000000000000065621354442177200245450ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/mimetypes/text-x-script.svg000066400000000000000000000056141354442177200247430ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/mimetypes/text-x-tex.svg000066400000000000000000000122601354442177200242320ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/mimetypes/text-xml.svg000066400000000000000000000056561354442177200240000ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/000077500000000000000000000000001354442177200207145ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/32x32/places/blue-folder.svg000066400000000000000000000130641354442177200236410ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/brown-folder.svg000066400000000000000000000130641354442177200240410ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/calendar-01.svg000066400000000000000000000105421354442177200234260ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/calendar-02.svg000066400000000000000000000115171354442177200234320ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/calendar-03.svg000066400000000000000000000131611354442177200234300ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/calendar-04.svg000066400000000000000000000107261354442177200234350ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/calendar-05.svg000066400000000000000000000120321354442177200234260ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/calendar-06.svg000066400000000000000000000133021354442177200234300ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/calendar-07.svg000066400000000000000000000100671354442177200234360ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/calendar-08.svg000066400000000000000000000145011354442177200234340ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/calendar-09.svg000066400000000000000000000133361354442177200234420ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/calendar-10.svg000066400000000000000000000132771354442177200234360ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/custom-folder.svg000066400000000000000000000131021354442177200242150ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/default-folder.svg000066400000000000000000000130641354442177200243360ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/folder-copy.svg000066400000000000000000000132351354442177200236640ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/folder-home.svg000066400000000000000000000165651354442177200236530ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/folder-music.svg000066400000000000000000000204161354442177200240310ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/folder-pictures.svg000066400000000000000000000166011354442177200245500ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/folder-projects.svg000066400000000000000000000176241354442177200245510ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/folder-publicshare.svg000066400000000000000000000223601354442177200252120ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/folder-recent.svg000066400000000000000000000224571354442177200242000ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/folder-remote.svg000066400000000000000000000256461354442177200242160ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/folder-saved-search.svg000066400000000000000000000207531354442177200252620ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/folder-sound.svg000066400000000000000000000204161354442177200240410ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/folder.svg000066400000000000000000000130641354442177200227140ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/green-folder.svg000066400000000000000000000130641354442177200240120ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/grey-folder.svg000066400000000000000000000130641354442177200236600ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/orange-folder.svg000066400000000000000000000130641354442177200241650ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/pink-folder.svg000066400000000000000000000130641354442177200236530ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/purple-folder.svg000066400000000000000000000130641354442177200242210ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/red-folder.svg000066400000000000000000000130641354442177200234640ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/stock_trash_empty.svg000066400000000000000000000230611354442177200252010ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/stock_trash_full.svg000066400000000000000000000343021354442177200250050ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/places/yellow-folder.svg000066400000000000000000000130641354442177200242250ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/status/000077500000000000000000000000001354442177200207705ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/32x32/status/dialog-error.svg000066400000000000000000000034641354442177200241060ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/status/dialog-information.svg000066400000000000000000000037021354442177200252750ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/status/dialog-question.svg000066400000000000000000000037511354442177200246230ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/status/dialog-warning.svg000066400000000000000000000036371354442177200244240ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/status/info.svg000066400000000000000000000037021354442177200224460ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/status/stock_score-high.svg000066400000000000000000000032241354442177200247450ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/status/stock_score-higher.svg000066400000000000000000000032261354442177200252760ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/status/stock_score-highest.svg000066400000000000000000000032271354442177200254640ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/status/stock_score-low.svg000066400000000000000000000032231354442177200246260ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/status/stock_score-lower.svg000066400000000000000000000032241354442177200251560ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/status/stock_score-lowest.svg000066400000000000000000000032261354442177200253450ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/32x32/status/stock_score-normal.svg000066400000000000000000000032261354442177200253200ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/000077500000000000000000000000001354442177200174635ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/48x48/actions/000077500000000000000000000000001354442177200211235ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/48x48/actions/application-exit.svg000066400000000000000000000014701354442177200251200ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/configure.svg000066400000000000000000000035701354442177200236320ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/dialog-cancel.svg000066400000000000000000000015071354442177200243310ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/dialog-close.svg000066400000000000000000000021211354442177200242020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/dialog-no.svg000066400000000000000000000015071354442177200235200ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/dialog-ok.svg000066400000000000000000000003301354442177200235060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/dialog-yes.svg000066400000000000000000000003301354442177200236750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/document-export.svg000066400000000000000000000014611354442177200250030ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/document-import.svg000066400000000000000000000011241354442177200247700ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/document-new.svg000066400000000000000000000006461354442177200242570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/document-open.svg000066400000000000000000000224671354442177200244340ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/actions/document-print-preview.svg000066400000000000000000000021511354442177200262720ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/document-save-as.svg000066400000000000000000000013451354442177200250220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/document-save.svg000066400000000000000000000012351354442177200244170ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/edit-clear.svg000066400000000000000000000006141354442177200236560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/edit-copy.svg000066400000000000000000000013261354442177200235430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/edit-cut.svg000066400000000000000000000020501354442177200233570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/edit-delete.svg000066400000000000000000000010361354442177200240310ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/edit-find.svg000066400000000000000000000024561354442177200235160ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/edit-paste.svg000066400000000000000000000010451354442177200237030ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/edit-redo.svg000066400000000000000000000007221354442177200235210ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/edit-rename.svg000066400000000000000000000006411354442177200240370ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/edit-select-all.svg000066400000000000000000000011051354442177200246110ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/edit-undo.svg000066400000000000000000000006611354442177200235370ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/folder-new.svg000066400000000000000000000216471354442177200237200ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/actions/folder_color_picker.svg000066400000000000000000000062551354442177200256620ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/format-justify-center.svg000066400000000000000000000005351354442177200261100ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/format-justify-fill.svg000066400000000000000000000005351354442177200255560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/format-justify-left.svg000066400000000000000000000005351354442177200255620ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/format-justify-right.svg000066400000000000000000000005351354442177200257450ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/format-text-bold.svg000066400000000000000000000013161354442177200250350ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/format-text-italic.svg000066400000000000000000000013401354442177200253570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/format-text-strikethrough.svg000066400000000000000000000011621354442177200270160ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/format-text-underline.svg000066400000000000000000000007611354442177200261050ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/go-next.svg000066400000000000000000000016051354442177200232270ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/go-right.svg000066400000000000000000000016051354442177200233660ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/go-up.svg000066400000000000000000000016041354442177200226740ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/gohome.svg000066400000000000000000000014671354442177200231320ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/gtk-edit.svg000066400000000000000000000075471354442177200233710ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/actions/gtk-index.svg000066400000000000000000000127041354442177200235420ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/actions/history-view.svg000066400000000000000000000015441354442177200243210ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/list-add.svg000066400000000000000000000004061354442177200233450ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/list-remove.svg000066400000000000000000000003101354442177200241040ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/media-eject.svg000066400000000000000000000004171354442177200240150ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/media-playback-pause.svg000066400000000000000000000003741354442177200256260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/media-playback-record.svg000066400000000000000000000005061354442177200257640ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/media-playback-start.svg000066400000000000000000000002771354442177200256500ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/media-playback-stop.svg000066400000000000000000000003061354442177200254710ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/merge.svg000066400000000000000000000010161354442177200227410ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/split.svg000066400000000000000000000017031354442177200230000ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/stock_home.svg000066400000000000000000000014671354442177200240070ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/stock_no.svg000066400000000000000000000015071354442177200234660ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/stock_notes.svg000066400000000000000000000062531354442177200242050ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/actions/stock_people.svg000066400000000000000000000060341354442177200243360ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/actions/stock_refresh.svg000066400000000000000000000020641354442177200245070ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/stock_shuffle.svg000066400000000000000000000041501354442177200245030ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/stock_timezone.svg000066400000000000000000000372621354442177200247130ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/actions/stock_view-details.svg000066400000000000000000000011411354442177200254410ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/stock_yes.svg000066400000000000000000000003301354442177200236430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/tools-check-spelling.svg000066400000000000000000000067541354442177200257060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/view-fullscreen.svg000066400000000000000000000005121354442177200247540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/view-refresh.svg000066400000000000000000000020641354442177200242540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/window-close.svg000066400000000000000000000021211354442177200242520ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/zoom-in.svg000066400000000000000000000011021354442177200232260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/actions/zoom-out.svg000066400000000000000000000010711354442177200234340ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/000077500000000000000000000000001354442177200216105ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/48x48/categories/application-community.svg000066400000000000000000000010431354442177200266540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/applications-boardgames.svg000066400000000000000000000020401354442177200271150ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/applications-chat.svg000066400000000000000000000025211354442177200257340ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/applications-debugging.svg000066400000000000000000000246571354442177200267660ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/applications-development.svg000066400000000000000000000006621354442177200273430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/applications-games.svg000066400000000000000000000052321354442177200261130ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/applications-geography.svg000066400000000000000000000211141354442177200270010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/applications-internet.svg000066400000000000000000000024761354442177200266560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/applications-libraries.svg000066400000000000000000000042571354442177200270010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/applications-physics.svg000066400000000000000000000270121354442177200265010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/applications-publishing.svg000066400000000000000000000144531354442177200271700ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/applications-puzzles.svg000066400000000000000000000053671354442177200265440ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/applications-roleplaying.svg000066400000000000000000000050151354442177200273430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/applications-science.svg000066400000000000000000000114541354442177200264330ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/applications-sports.svg000066400000000000000000000115711354442177200263540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/applications-versioncontrol.svg000066400000000000000000000214421354442177200301060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/gnome-settings.svg000066400000000000000000000031701354442177200252750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/package_multimedia.svg000066400000000000000000000014341354442177200261400ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/package_settings.svg000066400000000000000000000011301354442177200256370ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/preferences-system-time.svg000066400000000000000000000051171354442177200271140ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/preferences-system.svg000066400000000000000000000011301354442177200261470ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/categories/system-help.svg000066400000000000000000000023061354442177200246040ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/devices/000077500000000000000000000000001354442177200211055ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/48x48/devices/media-flash.svg000066400000000000000000000113201354442177200237750ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/devices/media-floppy.svg000066400000000000000000000056251354442177200242240ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/devices/media-optical.svg000066400000000000000000000134451354442177200243450ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/devices/stock_mic.svg000066400000000000000000000026531354442177200236070ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/000077500000000000000000000000001354442177200211075ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-art.svg000066400000000000000000000023051354442177200236550ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-camera.svg000066400000000000000000000031551354442177200243230ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-danger.svg000066400000000000000000000016531354442177200243340ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-development.svg000066400000000000000000000025031354442177200254110ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-downloads.svg000066400000000000000000000032761354442177200250710ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-dropbox-syncing.svg000066400000000000000000000017001354442177200262120ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-dropbox-uptodate.svg000066400000000000000000000007221354442177200263700ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-favorite.svg000066400000000000000000000022331354442177200247060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-favorites.svg000066400000000000000000000022331354442177200250710ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-generic.svg000066400000000000000000000020731354442177200245050ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-insync-des-error.svg000066400000000000000000000007221354442177200262730ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-insync-error.svg000066400000000000000000000036311354442177200255240ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-marketing.svg000066400000000000000000000007071354442177200250540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-money.svg000066400000000000000000000031171354442177200242200ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-noread.svg000066400000000000000000000007501354442177200243410ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-people.svg000066400000000000000000000043451354442177200243610ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-personal.svg000066400000000000000000000023051354442177200247120ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-plan.svg000066400000000000000000000010241354442177200240160ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-presentation.svg000066400000000000000000000013501354442177200256010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-sales.svg000066400000000000000000000007071354442177200242020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-shared.svg000066400000000000000000000043351354442177200243420ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-sound.svg000066400000000000000000000017601354442177200242230ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-system.svg000066400000000000000000000046471354442177200244260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-urgent.svg000066400000000000000000000020731354442177200243750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-videos.svg000066400000000000000000000004671354442177200243670ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/emblems/emblem-web.svg000066400000000000000000000154741354442177200236570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/mimetypes/000077500000000000000000000000001354442177200214775ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/48x48/mimetypes/application-epub+zip.svg000066400000000000000000000016741354442177200262620ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/mimetypes/application-pdf.svg000066400000000000000000000040001354442177200252640ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/mimetypes/application-text-template.svg000066400000000000000000000012711354442177200273170ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/mimetypes/application-vnd.ms-word.svg000066400000000000000000000176001354442177200267030ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/mimetypes/application-vnd.oasis.opendocument.text.svg000066400000000000000000000145341354442177200321160ustar00rootroot00000000000000 image/svg+xml application-vnd.openxmlformats-officedocument.wordprocessingml.document.svg000066400000000000000000000220271354442177200405160ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/48x48/mimetypes image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/mimetypes/stock_calendar.svg000066400000000000000000000045451354442177200252040ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/mimetypes/text-html.svg000066400000000000000000000024631354442177200241530ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/mimetypes/text-plain.svg000066400000000000000000000014601354442177200243060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/mimetypes/text-x-generic.svg000066400000000000000000000014601354442177200250640ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/mimetypes/text-x-markdown.svg000066400000000000000000000071641354442177200253010ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/mimetypes/text-x-opml+xml.svg000066400000000000000000000045021354442177200252130ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/mimetypes/text-x-plain.svg000066400000000000000000000014601354442177200245530ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/mimetypes/text-x-script.svg000066400000000000000000000014471354442177200247610ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/48x48/mimetypes/text-x-tex.svg000066400000000000000000000116231354442177200242520ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/mimetypes/text-xml.svg000066400000000000000000000045021354442177200240030ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/000077500000000000000000000000001354442177200207325ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/48x48/places/blue-folder.svg000066400000000000000000000224061354442177200236570ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/brown-folder.svg000066400000000000000000000224061354442177200240570ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/calendar-01.svg000066400000000000000000000122661354442177200234510ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/calendar-02.svg000066400000000000000000000132271354442177200234500ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/calendar-03.svg000066400000000000000000000146261354442177200234550ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/calendar-04.svg000066400000000000000000000124611354442177200234510ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/calendar-05.svg000066400000000000000000000135201354442177200234470ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/calendar-06.svg000066400000000000000000000150011354442177200234440ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/calendar-07.svg000066400000000000000000000116221354442177200234520ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/calendar-08.svg000066400000000000000000000161451354442177200234600ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/calendar-09.svg000066400000000000000000000150271354442177200234570ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/calendar-10.svg000066400000000000000000000150251354442177200234450ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/custom-folder.svg000066400000000000000000000224241354442177200242420ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/default-folder.svg000066400000000000000000000224061354442177200243540ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/folder-copy.svg000066400000000000000000000246551354442177200237120ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/folder-home.svg000066400000000000000000000242511354442177200236600ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/folder-music.svg000066400000000000000000000262221354442177200240500ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/folder-pictures.svg000066400000000000000000000264341354442177200245730ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/folder-projects.svg000066400000000000000000000361001354442177200245550ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/folder-publicshare.svg000066400000000000000000000300431354442177200252250ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/folder-recent.svg000066400000000000000000000247521354442177200242160ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/folder-remote.svg000066400000000000000000000345731354442177200242330ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/folder-saved-search.svg000066400000000000000000000240721354442177200252760ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/folder-sound.svg000066400000000000000000000262221354442177200240600ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/folder.svg000066400000000000000000000224061354442177200227320ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/green-folder.svg000066400000000000000000000224061354442177200240300ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/grey-folder.svg000066400000000000000000000224061354442177200236760ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/orange-folder.svg000066400000000000000000000224061354442177200242030ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/pink-folder.svg000066400000000000000000000224061354442177200236710ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/purple-folder.svg000066400000000000000000000224061354442177200242370ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/red-folder.svg000066400000000000000000000224061354442177200235020ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/stock_trash_empty.svg000066400000000000000000000224061354442177200252210ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/stock_trash_full.svg000066400000000000000000000224141354442177200250240ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/places/yellow-folder.svg000066400000000000000000000224061354442177200242430ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/status/000077500000000000000000000000001354442177200210065ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/48x48/status/dialog-error.svg000066400000000000000000000034771354442177200241300ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/status/dialog-information.svg000066400000000000000000000040041354442177200253070ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/status/dialog-question.svg000066400000000000000000000040161354442177200246340ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/status/dialog-warning.svg000066400000000000000000000037271354442177200244420ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/status/info.svg000066400000000000000000000040041354442177200224600ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/status/stock_score-high.svg000066400000000000000000000032711354442177200247650ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/status/stock_score-higher.svg000066400000000000000000000033021354442177200253070ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/status/stock_score-highest.svg000066400000000000000000000034311354442177200254770ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/status/stock_score-low.svg000066400000000000000000000033001354442177200246400ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/status/stock_score-lower.svg000066400000000000000000000033011354442177200251700ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/status/stock_score-lowest.svg000066400000000000000000000032721354442177200253640ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/48x48/status/stock_score-normal.svg000066400000000000000000000033031354442177200253320ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/000077500000000000000000000000001354442177200174575ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/64x64/actions/000077500000000000000000000000001354442177200211175ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/64x64/actions/application-exit.svg000066400000000000000000000016261354442177200251170ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/configure.svg000066400000000000000000000033211354442177200236200ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/dialog-cancel.svg000066400000000000000000000014441354442177200243250ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/dialog-close.svg000066400000000000000000000054561354442177200242140ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/dialog-no.svg000066400000000000000000000014441354442177200235140ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/dialog-ok.svg000066400000000000000000000004511354442177200235060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/dialog-yes.svg000066400000000000000000000004511354442177200236750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/document-export.svg000066400000000000000000000014071354442177200247770ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/document-import.svg000066400000000000000000000012701354442177200247660ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/document-new.svg000066400000000000000000000007451354442177200242530ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/document-open.svg000066400000000000000000000115211354442177200244150ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/actions/document-print-preview.svg000066400000000000000000000025401354442177200262700ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/document-save-as.svg000066400000000000000000000015471354442177200250220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/document-save.svg000066400000000000000000000015031354442177200244110ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/edit-clear.svg000066400000000000000000000007621354442177200236560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/edit-copy.svg000066400000000000000000000013421354442177200235350ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/edit-cut.svg000066400000000000000000000026721354442177200233650ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/edit-delete.svg000066400000000000000000000011021354442177200240170ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/edit-find.svg000066400000000000000000000030601354442177200235020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/edit-paste.svg000066400000000000000000000013401354442177200236750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/edit-redo.svg000066400000000000000000000007501354442177200235160ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/edit-rename.svg000066400000000000000000000006351354442177200240360ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/edit-select-all.svg000066400000000000000000000010731354442177200246110ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/edit-undo.svg000066400000000000000000000007511354442177200235330ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/folder-new.svg000066400000000000000000000121501354442177200237010ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/actions/folder_color_picker.svg000066400000000000000000000063641354442177200256570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/format-justify-center.svg000066400000000000000000000005311354442177200261000ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/format-justify-fill.svg000066400000000000000000000005231354442177200255470ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/format-justify-left.svg000066400000000000000000000005231354442177200255530ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/format-justify-right.svg000066400000000000000000000005271354442177200257420ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/format-text-bold.svg000066400000000000000000000012651354442177200250340ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/format-text-italic.svg000066400000000000000000000012121354442177200253510ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/format-text-strikethrough.svg000066400000000000000000000010561354442177200270140ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/format-text-underline.svg000066400000000000000000000013551354442177200261010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/go-next.svg000066400000000000000000000017001354442177200232170ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/go-right.svg000066400000000000000000000017001354442177200233560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/go-up.svg000066400000000000000000000016771354442177200227020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/gohome.svg000066400000000000000000000015411354442177200231170ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/gtk-edit.svg000066400000000000000000000101041354442177200233440ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/actions/gtk-index.svg000066400000000000000000000127521354442177200235410ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/actions/history-view.svg000066400000000000000000000016631354442177200243170ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/list-add.svg000066400000000000000000000004061354442177200233410ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/list-remove.svg000066400000000000000000000003101354442177200241000ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/media-eject.svg000066400000000000000000000003631354442177200240110ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/media-playback-pause.svg000066400000000000000000000003741354442177200256220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/media-playback-record.svg000066400000000000000000000005741354442177200257650ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/media-playback-start.svg000066400000000000000000000002771354442177200256440ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/media-playback-stop.svg000066400000000000000000000003061354442177200254650ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/merge.svg000066400000000000000000000010011354442177200227270ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/split.svg000066400000000000000000000016161354442177200227770ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/stock_home.svg000066400000000000000000000015411354442177200237740ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/stock_no.svg000066400000000000000000000014441354442177200234620ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/stock_notes.svg000066400000000000000000000065741354442177200242070ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/actions/stock_people.svg000066400000000000000000000060161354442177200243320ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/actions/stock_refresh.svg000066400000000000000000000022071354442177200245020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/stock_shuffle.svg000066400000000000000000000050461354442177200245040ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/stock_timezone.svg000066400000000000000000000372271354442177200247100ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/actions/stock_view-details.svg000066400000000000000000000011411354442177200254350ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/stock_yes.svg000066400000000000000000000004511354442177200236430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/tools-check-spelling.svg000066400000000000000000000072461354442177200256770ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/view-fullscreen.svg000066400000000000000000000006321354442177200247530ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/view-list-tree.svg000066400000000000000000000017241354442177200245240ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/view-refresh.svg000066400000000000000000000022071354442177200242470ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/window-close.svg000066400000000000000000000054561354442177200242640ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/zoom-in.svg000066400000000000000000000012011354442177200232220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/actions/zoom-out.svg000066400000000000000000000011701354442177200234300ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/000077500000000000000000000000001354442177200216045ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/64x64/categories/application-community.svg000066400000000000000000000014001354442177200266450ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/applications-boardgames.svg000066400000000000000000000020441354442177200271150ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/applications-chat.svg000066400000000000000000000025061354442177200257330ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/applications-debugging.svg000066400000000000000000000247721354442177200267600ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/applications-development.svg000066400000000000000000000006671354442177200273440ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/applications-games.svg000066400000000000000000000052711354442177200261120ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/applications-geography.svg000066400000000000000000000214461354442177200270050ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/applications-internet.svg000066400000000000000000000024641354442177200266470ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/applications-libraries.svg000066400000000000000000000043001354442177200267620ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/applications-physics.svg000066400000000000000000000271201354442177200264750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/applications-publishing.svg000066400000000000000000000146001354442177200271560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/applications-puzzles.svg000066400000000000000000000053541354442177200265340ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/applications-roleplaying.svg000066400000000000000000000050071354442177200273400ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/applications-science.svg000066400000000000000000000114651354442177200264310ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/applications-sports.svg000066400000000000000000000116071354442177200263500ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/applications-versioncontrol.svg000066400000000000000000000245731354442177200301120ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/gnome-settings.svg000066400000000000000000000032171354442177200252730ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/package_multimedia.svg000066400000000000000000000016151354442177200261350ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/package_settings.svg000066400000000000000000000022671354442177200256470ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/preferences-system-time.svg000066400000000000000000000050211354442177200271020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/preferences-system.svg000066400000000000000000000022671354442177200261570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/categories/system-help.svg000066400000000000000000000023341354442177200246010ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/devices/000077500000000000000000000000001354442177200211015ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/64x64/devices/media-flash.svg000066400000000000000000000301411354442177200237730ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/devices/media-floppy.svg000066400000000000000000000014001354442177200242030ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/devices/media-optical.svg000066400000000000000000000021241354442177200243310ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/devices/stock_mic.svg000066400000000000000000000015451354442177200236020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/000077500000000000000000000000001354442177200211035ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-art.svg000066400000000000000000000025071354442177200236550ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-camera.svg000066400000000000000000000035431354442177200243200ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-danger.svg000066400000000000000000000021241354442177200243220ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-development.svg000066400000000000000000000032371354442177200254120ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-downloads.svg000066400000000000000000000031761354442177200250640ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-dropbox-syncing.svg000066400000000000000000000023161354442177200262120ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-dropbox-uptodate.svg000066400000000000000000000012411354442177200263610ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-favorite.svg000066400000000000000000000024611354442177200247050ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-favorites.svg000066400000000000000000000024611354442177200250700ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-generic.svg000066400000000000000000000025671354442177200245110ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-insync-des-error.svg000066400000000000000000000012411354442177200262640ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-insync-error.svg000066400000000000000000000040551354442177200255210ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-marketing.svg000066400000000000000000000013261354442177200250460ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-money.svg000066400000000000000000000035241354442177200242160ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-noread.svg000066400000000000000000000012351354442177200243340ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-people.svg000066400000000000000000000051471354442177200243560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-personal.svg000066400000000000000000000027101354442177200247060ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-plan.svg000066400000000000000000000013361354442177200240200ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-presentation.svg000066400000000000000000000015361354442177200256030ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-sales.svg000066400000000000000000000013261354442177200241740ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-shared.svg000066400000000000000000000052171354442177200243360ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-sound.svg000066400000000000000000000022701354442177200242140ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-system.svg000066400000000000000000000055301354442177200244120ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-urgent.svg000066400000000000000000000025511354442177200243720ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-videos.svg000066400000000000000000000010101354442177200243440ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/emblems/emblem-web.svg000066400000000000000000000154751354442177200236540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/mimetypes/000077500000000000000000000000001354442177200214735ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/64x64/mimetypes/application-epub+zip.svg000066400000000000000000000025101354442177200262440ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/mimetypes/application-pdf.svg000066400000000000000000000053121354442177200252670ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/mimetypes/application-text-template.svg000066400000000000000000000030251354442177200273120ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/mimetypes/application-vnd.ms-word.svg000066400000000000000000000150521354442177200266760ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/mimetypes/application-vnd.oasis.opendocument.text.svg000066400000000000000000000126041354442177200321060ustar00rootroot00000000000000 application-vnd.openxmlformats-officedocument.wordprocessingml.document.svg000066400000000000000000000217121354442177200405120ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/64x64/mimetypes image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/mimetypes/stock_calendar.svg000066400000000000000000000061731354442177200251770ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/mimetypes/text-html.svg000066400000000000000000000050361354442177200241460ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/mimetypes/text-plain.svg000066400000000000000000000034751354442177200243120ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/mimetypes/text-x-generic.svg000066400000000000000000000034751354442177200250700ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/mimetypes/text-x-markdown.svg000066400000000000000000000037261354442177200252750ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/mimetypes/text-x-opml+xml.svg000066400000000000000000000024271354442177200252130ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/mimetypes/text-x-plain.svg000066400000000000000000000034751354442177200245570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/mimetypes/text-x-script.svg000066400000000000000000000026731354442177200247570ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/mimetypes/text-x-tex.svg000066400000000000000000000123731354442177200242510ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/mimetypes/text-xml.svg000066400000000000000000000024271354442177200240030ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/64x64/places/000077500000000000000000000000001354442177200207265ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/64x64/places/blue-folder.svg000066400000000000000000000123501354442177200236500ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/brown-folder.svg000066400000000000000000000123501354442177200240500ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/calendar-01.svg000066400000000000000000000103561354442177200234430ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/calendar-02.svg000066400000000000000000000113231354442177200234370ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/calendar-03.svg000066400000000000000000000127361354442177200234510ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/calendar-04.svg000066400000000000000000000105361354442177200234460ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/calendar-05.svg000066400000000000000000000116221354442177200234440ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/calendar-06.svg000066400000000000000000000131041354442177200234420ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/calendar-07.svg000066400000000000000000000077051354442177200234550ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/calendar-08.svg000066400000000000000000000142711354442177200234520ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/calendar-09.svg000066400000000000000000000131221354442177200234450ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/calendar-10.svg000066400000000000000000000130361354442177200234410ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/custom-folder.svg000066400000000000000000000123661354442177200242420ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/default-folder.svg000066400000000000000000000123501354442177200243450ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/folder-copy.svg000066400000000000000000000157131354442177200237010ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/folder-home.svg000066400000000000000000000133021354442177200236470ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/folder-music.svg000066400000000000000000000152441354442177200240460ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/folder-pictures.svg000066400000000000000000000136431354442177200245650ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/folder-projects.svg000066400000000000000000000164101354442177200245530ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/folder-publicshare.svg000066400000000000000000000174001354442177200252230ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/folder-recent.svg000066400000000000000000000147651354442177200242150ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/folder-remote.svg000066400000000000000000000240061354442177200242150ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/folder-saved-search.svg000066400000000000000000000132621354442177200252710ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/folder-sound.svg000066400000000000000000000152441354442177200240560ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/folder.svg000066400000000000000000000123501354442177200227230ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/green-folder.svg000066400000000000000000000123501354442177200240210ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/grey-folder.svg000066400000000000000000000123501354442177200236670ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/orange-folder.svg000066400000000000000000000123501354442177200241740ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/pink-folder.svg000066400000000000000000000123501354442177200236620ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/purple-folder.svg000066400000000000000000000123501354442177200242300ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/red-folder.svg000066400000000000000000000123501354442177200234730ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/stock_trash_empty.svg000066400000000000000000000222171354442177200252150ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/stock_trash_full.svg000066400000000000000000000222171354442177200250210ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/places/yellow-folder.svg000066400000000000000000000123501354442177200242340ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/status/000077500000000000000000000000001354442177200210025ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/64x64/status/dialog-error.svg000066400000000000000000000034651354442177200241210ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/status/dialog-information.svg000066400000000000000000000040711354442177200253070ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/status/dialog-question.svg000066400000000000000000000041151354442177200246300ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/status/dialog-warning.svg000066400000000000000000000037451354442177200244360ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/status/info.svg000066400000000000000000000040711354442177200224600ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/status/stock_score-high.svg000066400000000000000000000033041354442177200247560ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/status/stock_score-higher.svg000066400000000000000000000033041354442177200253050ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/status/stock_score-highest.svg000066400000000000000000000034331354442177200254750ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/status/stock_score-low.svg000066400000000000000000000033021354442177200246360ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/status/stock_score-lower.svg000066400000000000000000000032761354442177200251770ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/status/stock_score-lowest.svg000066400000000000000000000032751354442177200253630ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/64x64/status/stock_score-normal.svg000066400000000000000000000033061354442177200253310ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/000077500000000000000000000000001354442177200174715ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/96x96/actions/000077500000000000000000000000001354442177200211315ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/96x96/actions/document-open.svg000066400000000000000000000353301354442177200244330ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/actions/folder-new.svg000066400000000000000000000213751354442177200237240ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/000077500000000000000000000000001354442177200207405ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/96x96/places/blue-folder.svg000066400000000000000000000221001354442177200236540ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/brown-folder.svg000066400000000000000000000221001354442177200240540ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/calendar-01.svg000066400000000000000000000123611354442177200234530ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/calendar-02.svg000066400000000000000000000133221354442177200234520ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/calendar-03.svg000066400000000000000000000147211354442177200234570ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/calendar-04.svg000066400000000000000000000125541354442177200234620ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/calendar-05.svg000066400000000000000000000136131354442177200234600ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/calendar-06.svg000066400000000000000000000150741354442177200234640ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/calendar-07.svg000066400000000000000000000117151354442177200234630ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/calendar-08.svg000066400000000000000000000162401354442177200234620ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/calendar-09.svg000066400000000000000000000151221354442177200234610ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/calendar-10.svg000066400000000000000000000151201354442177200234470ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/custom-folder.svg000066400000000000000000000221161354442177200242460ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/default-folder.svg000066400000000000000000000221001354442177200243510ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/folder-copy.svg000066400000000000000000000245441354442177200237150ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/folder-home.svg000066400000000000000000001676251354442177200237030ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/folder-music.svg000066400000000000000000000766101354442177200240640ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/folder-pictures.svg000066400000000000000000001106621354442177200245760ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/folder-projects.svg000066400000000000000000000370521354442177200245720ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/folder-publicshare.svg000066400000000000000000001243561354442177200252460ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/folder-recent.svg000066400000000000000000000375351354442177200242270ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/folder-remote.svg000066400000000000000000001543121354442177200242330ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/folder-saved-search.svg000066400000000000000000000505301354442177200253020ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/folder-sound.svg000066400000000000000000000766101354442177200240740ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/folder.svg000066400000000000000000000221001354442177200227270ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/green-folder.svg000066400000000000000000000221001354442177200240250ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/grey-folder.svg000066400000000000000000000221001354442177200236730ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/orange-folder.svg000066400000000000000000000221001354442177200242000ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/pink-folder.svg000066400000000000000000000221001354442177200236660ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/purple-folder.svg000066400000000000000000000221001354442177200242340ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/red-folder.svg000066400000000000000000000221001354442177200234770ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/stock_trash_empty.svg000066400000000000000000000222451354442177200252300ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/stock_trash_full.svg000066400000000000000000000341171354442177200250350ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/96x96/places/yellow-folder.svg000066400000000000000000000221001354442177200242400ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/index.theme000066400000000000000000000142271354442177200210250ustar00rootroot00000000000000[Icon Theme] Name=NumixMsk Comment=Custom Numix Theme for Manuskript Example=folder Directories=16x16/actions,16x16/animations,16x16/apps,16x16/categories,16x16/devices,16x16/emblems,16x16/mimetypes,16x16/panel,16x16/places,16x16/status,22x22/actions,22x22/animations,22x22/apps,22x22/categories,22x22/devices,22x22/emblems,22x22/mimetypes,22x22/panel,22x22/places,22x22/status,24x24/actions,24x24/animations,24x24/apps,24x24/categories,24x24/devices,24x24/emblems,24x24/mimetypes,24x24/panel,24x24/places,24x24/status,32x32/actions,32x32/animations,32x32/apps,32x32/categories,32x32/devices,32x32/emblems,32x32/mimetypes,32x32/places,32x32/status,48x48/actions,48x48/animations,48x48/apps,48x48/categories,48x48/devices,48x48/emblems,48x48/mimetypes,48x48/notifications,48x48/places,48x48/status,64x64/actions,64x64/animations,64x64/categories,64x64/devices,64x64/emblems,64x64/mimetypes,64x64/places,64x64/status,96x96/places,128x128/actions,128x128/animations,128x128/categories,128x128/devices,128x128/emblems,128x128/mimetypes,128x128/places,128x128/status,256x256/actions,256x256/animations,256x256/categories,256x256/devices,256x256/emblems,256x256/mimetypes,256x256/places,256x256/status,scalable/actions,scalable/apps,scalable/categories,scalable/devices,scalable/emblems,scalable/emotes,scalable/mimetypes,scalable/places,scalable/status [16x16/actions] Size=16 Context=Actions Type=Fixed [16x16/animations] Size=16 Context=Animations Type=Fixed [16x16/apps] Size=16 Context=Applications Type=Fixed [16x16/categories] Size=16 Context=Categories Type=Fixed [16x16/devices] Size=16 Context=Devices Type=Fixed [16x16/emblems] Size=16 Context=Emblems Type=Fixed [16x16/mimetypes] Size=16 Context=MimeTypes Type=Fixed [16x16/panel] Size=16 Context=Panel Type=Fixed [16x16/places] Size=16 Context=Places Type=Fixed [16x16/status] Size=16 Context=Status Type=Fixed [22x22/actions] Size=22 Context=Actions Type=Fixed [22x22/animations] Size=22 Context=Animations Type=Fixed [22x22/apps] Size=22 Context=Applications Type=Fixed [22x22/categories] Size=22 Context=Categories Type=Fixed [22x22/devices] Size=22 Context=Devices Type=Fixed [22x22/emblems] Size=22 Context=Emblems Type=Fixed [22x22/mimetypes] Size=22 Context=MimeTypes Type=Fixed [22x22/panel] Size=22 Context=Panel Type=Fixed [22x22/places] Size=22 Context=Places Type=Fixed [22x22/status] Size=22 Context=Status Type=Fixed [24x24/actions] Size=24 Context=Actions Type=Fixed [24x24/animations] Size=24 Context=Animations Type=Fixed [24x24/apps] Size=24 Context=Applications Type=Fixed [24x24/categories] Size=24 Context=Categories Type=Fixed [24x24/devices] Size=24 Context=Devices Type=Fixed [24x24/emblems] Size=24 Context=Emblems Type=Fixed [24x24/mimetypes] Size=24 Context=MimeTypes Type=Fixed [24x24/panel] Size=24 Context=Panel Type=Fixed [24x24/places] Size=24 Context=Places Type=Fixed [24x24/status] Size=24 Context=Status Type=Fixed [32x32/actions] Size=32 Context=Actions Type=Fixed [32x32/animations] Size=32 Context=Animations Type=Fixed [32x32/apps] Size=32 Context=Applications Type=Fixed [32x32/categories] Size=32 Context=Categories Type=Fixed [32x32/devices] Size=32 Context=Devices Type=Fixed [32x32/emblems] Size=32 Context=Emblems Type=Fixed [32x32/mimetypes] Size=32 Context=MimeTypes Type=Fixed [32x32/places] Size=32 Context=Places Type=Fixed [32x32/status] Size=32 Context=Status Type=Fixed [48x48/actions] Size=48 Context=Actions Type=Fixed [48x48/animations] Size=48 Context=Animations Type=Fixed [48x48/apps] Size=48 Context=Applications Type=Fixed [48x48/categories] Size=48 Context=Categories Type=Fixed [48x48/devices] Size=48 Context=Devices Type=Fixed [48x48/emblems] Size=48 Context=Emblems Type=Fixed [48x48/mimetypes] Size=48 Context=MimeTypes Type=Fixed [48x48/notifications] Size=48 Context=Notifications Type=Fixed [48x48/places] Size=48 Context=Places Type=Fixed [48x48/status] Size=48 Context=Status Type=Fixed [64x64/actions] Size=64 Context=Actions Type=Fixed [64x64/animations] Size=64 Context=Animations Type=Fixed [64x64/categories] Size=64 Context=Categories Type=Fixed [64x64/devices] Size=64 Context=Devices Type=Fixed [64x64/emblems] Size=64 Context=Emblems Type=Fixed [64x64/mimetypes] Size=64 Context=MimeTypes Type=Fixed [64x64/places] Size=64 Context=Places Type=Fixed [64x64/status] Size=64 Context=Status Type=Fixed [96x96/places] Size=96 Context=Places Type=Fixed [128x128/actions] Size=128 Context=Actions Type=Fixed [128x128/animations] Size=128 Context=Animations Type=Fixed [128x128/categories] Size=128 Context=Categories Type=Fixed [128x128/devices] Size=128 Context=Devices Type=Fixed [128x128/emblems] Size=128 Context=Emblems Type=Fixed [128x128/mimetypes] Size=128 Context=MimeTypes Type=Fixed [128x128/places] Size=128 Context=Places Type=Fixed [128x128/status] Size=128 Context=Status Type=Fixed [256x256/actions] Size=256 MinSize=56 MaxSize=512 Context=Actions Type=Scalable [256x256/animations] Size=256 MinSize=56 MaxSize=512 Context=Animations Type=Scalable [256x256/categories] Size=256 MinSize=56 MaxSize=512 Context=Categories Type=Scalable [256x256/devices] Size=256 MinSize=56 MaxSize=512 Context=Devices Type=Scalable [256x256/emblems] Size=256 MinSize=56 MaxSize=512 Context=Emblems Type=Scalable [256x256/mimetypes] Size=256 MinSize=56 MaxSize=512 Context=MimeTypes Type=Scalable [256x256/places] Size=256 MinSize=56 MaxSize=512 Context=Places Type=Scalable [256x256/status] Size=256 MinSize=56 MaxSize=512 Context=Status Type=Scalable [scalable/actions] Size=16 MinSize=16 MaxSize=256 Context=Actions Type=Scalable [scalable/apps] Size=16 MinSize=16 MaxSize=256 Context=Applications Type=Scalable [scalable/categories] Size=16 MinSize=16 MaxSize=256 Context=Categories Type=Scalable [scalable/devices] Size=16 MinSize=16 MaxSize=256 Context=Devices Type=Scalable [scalable/emblems] Size=16 MinSize=16 MaxSize=256 Context=Emblems Type=Scalable [scalable/emotes] Size=16 MinSize=16 MaxSize=256 Context=Emblems Type=Scalable [scalable/mimetypes] Size=16 MinSize=16 MaxSize=256 Context=MimeTypes Type=Scalable [scalable/places] Size=16 MinSize=16 MaxSize=256 Context=Places Type=Scalable [scalable/status] Size=16 MinSize=16 MaxSize=256 Context=Status Type=Scalable manuskript-0.10.0/icons/NumixMsk/scalable/000077500000000000000000000000001354442177200204325ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/scalable/actions/000077500000000000000000000000001354442177200220725ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/scalable/actions/application-menu.svg000066400000000000000000000032251354442177200260620ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/actions/arrow-down-double.svg000066400000000000000000000003321354442177200261600ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/actions/arrow-down.svg000066400000000000000000000002641354442177200247140ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/actions/arrow-left-double.svg000066400000000000000000000003321354442177200261430ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/actions/arrow-left.svg000066400000000000000000000002631354442177200246760ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/actions/arrow-right-double.svg000066400000000000000000000004131354442177200263260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/actions/arrow-right.svg000066400000000000000000000002651354442177200250630ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/actions/arrow-up-double.svg000066400000000000000000000003351354442177200256400ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/actions/arrow-up.svg000066400000000000000000000002661354442177200243730ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/actions/folder-tag.svg000066400000000000000000000007241354442177200246420ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/actions/media-playback-start-rtl.svg000066400000000000000000000001711354442177200274070ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/actions/stock_task.svg000066400000000000000000000017741354442177200247710ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/categories/000077500000000000000000000000001354442177200225575ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/scalable/categories/applications-education.svg000066400000000000000000000015211354442177200277360ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/categories/preferences-system-symbolic.svg000066400000000000000000000053201354442177200307420ustar00rootroot00000000000000 image/svg+xml manuskript-0.10.0/icons/NumixMsk/scalable/emblems/000077500000000000000000000000001354442177200220565ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/scalable/emblems/emblem-added.svg000066400000000000000000000006701354442177200251020ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/emblems/emblem-checked.svg000066400000000000000000000012011354442177200254160ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/emblems/emblem-dropbox-app.svg000066400000000000000000000077171354442177200263050ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/emblems/emblem-dropbox-selsync.svg000066400000000000000000000006411354442177200271720ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/emblems/emblem-error.svg000066400000000000000000000010631354442177200251670ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/emblems/emblem-music.svg000066400000000000000000000021761354442177200251640ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/emotes/000077500000000000000000000000001354442177200217265ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/scalable/emotes/face-angel.svg000066400000000000000000000032521354442177200244330ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/emotes/face-angry.svg000066400000000000000000000020101354442177200244540ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/emotes/face-clown.svg000066400000000000000000000027111354442177200244660ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/emotes/face-confused.svg000066400000000000000000000031401354442177200251470ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/emotes/face-cool.svg000066400000000000000000000032551354442177200243040ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/emotes/face-devilish.svg000066400000000000000000000023201354442177200251470ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/emotes/face-glasses.svg000066400000000000000000000042701354442177200250070ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/emotes/face-in-love.svg000066400000000000000000000035051354442177200247170ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/emotes/face-monkey.svg000066400000000000000000000115401354442177200246460ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/emotes/face-ninja.svg000066400000000000000000000027011354442177200244420ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/emotes/face-pirate.svg000066400000000000000000000031661354442177200246350ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/emotes/face-sick.svg000066400000000000000000000026651354442177200243050ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/emotes/face-sleeping.svg000066400000000000000000000036601354442177200251560ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/emotes/face-uncertain.svg000066400000000000000000000024261354442177200253370ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/places/000077500000000000000000000000001354442177200217015ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/scalable/places/folder-saved-search-alt.svg000066400000000000000000000012521354442177200270160ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/status/000077500000000000000000000000001354442177200217555ustar00rootroot00000000000000manuskript-0.10.0/icons/NumixMsk/scalable/status/feed-marked-symbolic.svg000066400000000000000000000006471354442177200264700ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/status/feed-non-starred.svg000066400000000000000000000010251354442177200256310ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/status/feed-starred.svg000066400000000000000000000010251354442177200250410ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/status/feed-unmarked-symbolic.svg000066400000000000000000000006511354442177200270260ustar00rootroot00000000000000 manuskript-0.10.0/icons/NumixMsk/scalable/status/notification-new-symbolic.svg000066400000000000000000000004731354442177200275760ustar00rootroot00000000000000 manuskript-0.10.0/icons/cleanIcons.py000077500000000000000000000036201354442177200175450ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ The idea was to find icons duplicates in size, but there aren't many. """ import os dir_path = os.path.dirname(os.path.realpath(__file__)) numix = os.path.join(dir_path, "NumixMsk") scalable = os.path.join(numix, "scalable") dupes = {} for path, dirs, files in os.walk(numix): if path == numix or not files: continue foldername = os.path.basename(path) # mimetype, places, actions, etc. size = os.path.basename(os.path.split(path)[0]) # 32x32 64x64 print(size, foldername) for f in files: fullname = os.path.join(path, f) if not f in dupes: dupes[f] = [foldername] dupes[f].append(size) #scalable_path = os.path.join(scalable, foldername, f) ##print(" * ", scalable_path) #if os.path.exists(scalable_path): #s1 = os.path.getsize(fullname) #s2 = os.path.getsize(scalable_path) #if s1 == s2: #if not f in dupes: #dupes[f] = [foldername] #else: #dupes[f].append(foldername) #print(dupes) print("ICONS IN ONLY ONE SIZE") for d in dupes: foldername = dupes[d][0] sizes = dupes[d][1:] sizes = sorted(sizes, key=lambda s: int(s.split("x")[0]) if "x" in s else 1000) if len(sizes) == 1: print(os.path.join(sizes[0], foldername, d)) #print("mkdir -p NumixMsk/{}".format(os.path.join("scalable", foldername))) #print("cp NumixMsk/{} NumixMsk/{}".format( #os.path.join(sizes[0], foldername, d), #os.path.join("scalable", foldername)) #) if len(sizes) < 2: continue #print(d, "({})".format(foldername)) #print("-" * len(d)) #for s in sizes: #f = os.path.join(numix, s, foldername, d) #size = os.path.getsize(f) #print(" * {} ({})".format(s, size)) #print() manuskript-0.10.0/icons/copyicon.sh000077500000000000000000000017361354442177200173020ustar00rootroot00000000000000#!/bin/bash - # echo "AVR-GCC" # elf="main.elf" # c="main.c" # gcc="avr-gcc" # options=( "-mmcu=atmega128" "-Wall" -"Os" ) # command=( "$gcc" "${options[@]}" -o "$elf" "$c" ) # # execute it: # "${command[@]}" dirSrc=/usr/share/icons/Numix/ dirDest=$(pwd) name=$1 echo $name # cd $(dirname "$0") cd $dirSrc pwd for i in $(find -name $name.svg); \ do echo $i; \ cp --parents $i $dirDest/NumixMsk; \ done cd $dirDest # Clean strange folders echo "Cleaning strange folders" echo "------------------------" for i in 16 22 24 32 48 64; do if [ -d "NumixMsk/$i/" ]; then echo "NumixMsk/$i/" cp -r "NumixMsk/$i/*" "NumixMsk/$(echo $i)x$(echo $i)/" rm -R "NumixMsk/$i/" fi done # echo $dirDest # # Move 256 to scalable # if [ -d "NumixMsk/256x256/" ]; then # # echo "Move 256x256 to scalable" # echo "------------------------" # cp -r NumixMsk/256x256/* "NumixMsk/scalable/" # rm -R "NumixMsk/256x256/" # fi manuskript-0.10.0/libs/000077500000000000000000000000001354442177200147275ustar00rootroot00000000000000manuskript-0.10.0/libs/gh-release-stats.py000066400000000000000000000037121354442177200204540ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import argparse import json url = "https://api.github.com/repos/{user}/{repo}/releases" parser = argparse.ArgumentParser(description='Get download count for github releases.') parser.add_argument('user', type=str, help='The github user.') parser.add_argument('repo', type=str, help='The repo of given user.') parser.add_argument("-d", "--details", action="store_true") args = parser.parse_args() url = url.format(user=args.user, repo=args.repo) def getJSON(URL): import urllib.request with urllib.request.urlopen(URL) as url: data = json.loads(url.read().decode()) return data def humanReadable(n): s = ["", "K", "M", "B", "T"] f = 1000. hrs = n i = 0 while hrs > 500: hrs = hrs / f i += 1 hrs = round(hrs, 1) return "{}{}".format(hrs, s[i]) def humanReadableSize(size): s = ["B", "KB", "MB", "GB", "TB"] f = 1024. hrs = size i = 0 while hrs > 500: hrs = hrs / f i += 1 hrs = round(hrs, 1) return "{} {}".format(hrs, s[i]) releases = getJSON(url) total = 0 for r in releases: name = r["name"] tag = r["tag_name"] author = r["author"]["login"] time = r["created_at"] name = "{} ({})".format(name, tag) if name else tag tot = 0 details = [] for a in r["assets"]: nameA = a["name"] size = a["size"] download_count = a["download_count"] tot += download_count details.append(" * {} ({}): {} hits".format( nameA, humanReadableSize(size), humanReadable(download_count)) ) txt = "{}: {} hits".format(name, humanReadable(tot)) print(txt) if args.details: print("-" * len(txt)) [print(d) for d in details] print("") total += tot txt = "Total downloads: {} hits".format(humanReadable(total)) print("=" * len(txt)) print(txt) print("=" * len(txt))manuskript-0.10.0/libs/pdf.js/000077500000000000000000000000001354442177200161135ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/LICENSE000066400000000000000000000236751354442177200171350ustar00rootroot00000000000000 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 CONDITIONSmanuskript-0.10.0/libs/pdf.js/build/000077500000000000000000000000001354442177200172125ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/build/pdf.js000066400000000000000000012643421354442177200203350ustar00rootroot00000000000000/* Copyright 2012 Mozilla Foundation * * 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. */ /* jshint globalstrict: false */ /* umdutils ignore */ (function (root, factory) { 'use strict'; if (typeof define === 'function' && define.amd) { define('pdfjs-dist/build/pdf', ['exports'], factory); } else if (typeof exports !== 'undefined') { factory(exports); } else { factory((root.pdfjsDistBuildPdf = {})); } }(this, function (exports) { // Use strict in our context only - users might not want it 'use strict'; var pdfjsVersion = '1.4.237'; var pdfjsBuild = 'e9dbb23'; var pdfjsFilePath = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : null; var pdfjsLibs = {}; (function pdfjsWrapper() { (function (root, factory) { { factory((root.pdfjsSharedUtil = {})); } }(this, function (exports) { var globalScope = (typeof window !== 'undefined') ? window : (typeof global !== 'undefined') ? global : (typeof self !== 'undefined') ? self : this; var FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; var TextRenderingMode = { FILL: 0, STROKE: 1, FILL_STROKE: 2, INVISIBLE: 3, FILL_ADD_TO_PATH: 4, STROKE_ADD_TO_PATH: 5, FILL_STROKE_ADD_TO_PATH: 6, ADD_TO_PATH: 7, FILL_STROKE_MASK: 3, ADD_TO_PATH_FLAG: 4 }; var ImageKind = { GRAYSCALE_1BPP: 1, RGB_24BPP: 2, RGBA_32BPP: 3 }; var AnnotationType = { TEXT: 1, LINK: 2, FREETEXT: 3, LINE: 4, SQUARE: 5, CIRCLE: 6, POLYGON: 7, POLYLINE: 8, HIGHLIGHT: 9, UNDERLINE: 10, SQUIGGLY: 11, STRIKEOUT: 12, STAMP: 13, CARET: 14, INK: 15, POPUP: 16, FILEATTACHMENT: 17, SOUND: 18, MOVIE: 19, WIDGET: 20, SCREEN: 21, PRINTERMARK: 22, TRAPNET: 23, WATERMARK: 24, THREED: 25, REDACT: 26 }; var AnnotationFlag = { INVISIBLE: 0x01, HIDDEN: 0x02, PRINT: 0x04, NOZOOM: 0x08, NOROTATE: 0x10, NOVIEW: 0x20, READONLY: 0x40, LOCKED: 0x80, TOGGLENOVIEW: 0x100, LOCKEDCONTENTS: 0x200 }; var AnnotationBorderStyleType = { SOLID: 1, DASHED: 2, BEVELED: 3, INSET: 4, UNDERLINE: 5 }; var StreamType = { UNKNOWN: 0, FLATE: 1, LZW: 2, DCT: 3, JPX: 4, JBIG: 5, A85: 6, AHX: 7, CCF: 8, RL: 9 }; var FontType = { UNKNOWN: 0, TYPE1: 1, TYPE1C: 2, CIDFONTTYPE0: 3, CIDFONTTYPE0C: 4, TRUETYPE: 5, CIDFONTTYPE2: 6, TYPE3: 7, OPENTYPE: 8, TYPE0: 9, MMTYPE1: 10 }; var VERBOSITY_LEVELS = { errors: 0, warnings: 1, infos: 5 }; // All the possible operations for an operator list. var OPS = { // Intentionally start from 1 so it is easy to spot bad operators that will be // 0's. dependency: 1, setLineWidth: 2, setLineCap: 3, setLineJoin: 4, setMiterLimit: 5, setDash: 6, setRenderingIntent: 7, setFlatness: 8, setGState: 9, save: 10, restore: 11, transform: 12, moveTo: 13, lineTo: 14, curveTo: 15, curveTo2: 16, curveTo3: 17, closePath: 18, rectangle: 19, stroke: 20, closeStroke: 21, fill: 22, eoFill: 23, fillStroke: 24, eoFillStroke: 25, closeFillStroke: 26, closeEOFillStroke: 27, endPath: 28, clip: 29, eoClip: 30, beginText: 31, endText: 32, setCharSpacing: 33, setWordSpacing: 34, setHScale: 35, setLeading: 36, setFont: 37, setTextRenderingMode: 38, setTextRise: 39, moveText: 40, setLeadingMoveText: 41, setTextMatrix: 42, nextLine: 43, showText: 44, showSpacedText: 45, nextLineShowText: 46, nextLineSetSpacingShowText: 47, setCharWidth: 48, setCharWidthAndBounds: 49, setStrokeColorSpace: 50, setFillColorSpace: 51, setStrokeColor: 52, setStrokeColorN: 53, setFillColor: 54, setFillColorN: 55, setStrokeGray: 56, setFillGray: 57, setStrokeRGBColor: 58, setFillRGBColor: 59, setStrokeCMYKColor: 60, setFillCMYKColor: 61, shadingFill: 62, beginInlineImage: 63, beginImageData: 64, endInlineImage: 65, paintXObject: 66, markPoint: 67, markPointProps: 68, beginMarkedContent: 69, beginMarkedContentProps: 70, endMarkedContent: 71, beginCompat: 72, endCompat: 73, paintFormXObjectBegin: 74, paintFormXObjectEnd: 75, beginGroup: 76, endGroup: 77, beginAnnotations: 78, endAnnotations: 79, beginAnnotation: 80, endAnnotation: 81, paintJpegXObject: 82, paintImageMaskXObject: 83, paintImageMaskXObjectGroup: 84, paintImageXObject: 85, paintInlineImageXObject: 86, paintInlineImageXObjectGroup: 87, paintImageXObjectRepeat: 88, paintImageMaskXObjectRepeat: 89, paintSolidColorImageMask: 90, constructPath: 91 }; var verbosity = VERBOSITY_LEVELS.warnings; function setVerbosityLevel(level) { verbosity = level; } function getVerbosityLevel() { return verbosity; } // A notice for devs. These are good for things that are helpful to devs, such // as warning that Workers were disabled, which is important to devs but not // end users. function info(msg) { if (verbosity >= VERBOSITY_LEVELS.infos) { console.log('Info: ' + msg); } } // Non-fatal warnings. function warn(msg) { if (verbosity >= VERBOSITY_LEVELS.warnings) { console.log('Warning: ' + msg); } } // Deprecated API function -- display regardless of the PDFJS.verbosity setting. function deprecated(details) { console.log('Deprecated API usage: ' + details); } // Fatal errors that should trigger the fallback UI and halt execution by // throwing an exception. function error(msg) { if (verbosity >= VERBOSITY_LEVELS.errors) { console.log('Error: ' + msg); console.log(backtrace()); } throw new Error(msg); } function backtrace() { try { throw new Error(); } catch (e) { return e.stack ? e.stack.split('\n').slice(2).join('\n') : ''; } } function assert(cond, msg) { if (!cond) { error(msg); } } var UNSUPPORTED_FEATURES = { unknown: 'unknown', forms: 'forms', javaScript: 'javaScript', smask: 'smask', shadingPattern: 'shadingPattern', font: 'font' }; // Combines two URLs. The baseUrl shall be absolute URL. If the url is an // absolute URL, it will be returned as is. function combineUrl(baseUrl, url) { if (!url) { return baseUrl; } return new URL(url, baseUrl).href; } // Checks if URLs have the same origin. For non-HTTP based URLs, returns false. function isSameOrigin(baseUrl, otherUrl) { try { var base = new URL(baseUrl); if (!base.origin || base.origin === 'null') { return false; // non-HTTP url } } catch (e) { return false; } var other = new URL(otherUrl, base); return base.origin === other.origin; } // Validates if URL is safe and allowed, e.g. to avoid XSS. function isValidUrl(url, allowRelative) { if (!url) { return false; } // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1) // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) var protocol = /^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url); if (!protocol) { return allowRelative; } protocol = protocol[0].toLowerCase(); switch (protocol) { case 'http': case 'https': case 'ftp': case 'mailto': case 'tel': return true; default: return false; } } function shadow(obj, prop, value) { Object.defineProperty(obj, prop, { value: value, enumerable: true, configurable: true, writable: false }); return value; } function getLookupTableFactory(initializer) { var lookup; return function () { if (initializer) { lookup = Object.create(null); initializer(lookup); initializer = null; } return lookup; }; } var PasswordResponses = { NEED_PASSWORD: 1, INCORRECT_PASSWORD: 2 }; var PasswordException = (function PasswordExceptionClosure() { function PasswordException(msg, code) { this.name = 'PasswordException'; this.message = msg; this.code = code; } PasswordException.prototype = new Error(); PasswordException.constructor = PasswordException; return PasswordException; })(); var UnknownErrorException = (function UnknownErrorExceptionClosure() { function UnknownErrorException(msg, details) { this.name = 'UnknownErrorException'; this.message = msg; this.details = details; } UnknownErrorException.prototype = new Error(); UnknownErrorException.constructor = UnknownErrorException; return UnknownErrorException; })(); var InvalidPDFException = (function InvalidPDFExceptionClosure() { function InvalidPDFException(msg) { this.name = 'InvalidPDFException'; this.message = msg; } InvalidPDFException.prototype = new Error(); InvalidPDFException.constructor = InvalidPDFException; return InvalidPDFException; })(); var MissingPDFException = (function MissingPDFExceptionClosure() { function MissingPDFException(msg) { this.name = 'MissingPDFException'; this.message = msg; } MissingPDFException.prototype = new Error(); MissingPDFException.constructor = MissingPDFException; return MissingPDFException; })(); var UnexpectedResponseException = (function UnexpectedResponseExceptionClosure() { function UnexpectedResponseException(msg, status) { this.name = 'UnexpectedResponseException'; this.message = msg; this.status = status; } UnexpectedResponseException.prototype = new Error(); UnexpectedResponseException.constructor = UnexpectedResponseException; return UnexpectedResponseException; })(); var NotImplementedException = (function NotImplementedExceptionClosure() { function NotImplementedException(msg) { this.message = msg; } NotImplementedException.prototype = new Error(); NotImplementedException.prototype.name = 'NotImplementedException'; NotImplementedException.constructor = NotImplementedException; return NotImplementedException; })(); var MissingDataException = (function MissingDataExceptionClosure() { function MissingDataException(begin, end) { this.begin = begin; this.end = end; this.message = 'Missing data [' + begin + ', ' + end + ')'; } MissingDataException.prototype = new Error(); MissingDataException.prototype.name = 'MissingDataException'; MissingDataException.constructor = MissingDataException; return MissingDataException; })(); var XRefParseException = (function XRefParseExceptionClosure() { function XRefParseException(msg) { this.message = msg; } XRefParseException.prototype = new Error(); XRefParseException.prototype.name = 'XRefParseException'; XRefParseException.constructor = XRefParseException; return XRefParseException; })(); var NullCharactersRegExp = /\x00/g; function removeNullCharacters(str) { if (typeof str !== 'string') { warn('The argument for removeNullCharacters must be a string.'); return str; } return str.replace(NullCharactersRegExp, ''); } function bytesToString(bytes) { assert(bytes !== null && typeof bytes === 'object' && bytes.length !== undefined, 'Invalid argument for bytesToString'); var length = bytes.length; var MAX_ARGUMENT_COUNT = 8192; if (length < MAX_ARGUMENT_COUNT) { return String.fromCharCode.apply(null, bytes); } var strBuf = []; for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) { var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); var chunk = bytes.subarray(i, chunkEnd); strBuf.push(String.fromCharCode.apply(null, chunk)); } return strBuf.join(''); } function stringToBytes(str) { assert(typeof str === 'string', 'Invalid argument for stringToBytes'); var length = str.length; var bytes = new Uint8Array(length); for (var i = 0; i < length; ++i) { bytes[i] = str.charCodeAt(i) & 0xFF; } return bytes; } /** * Gets length of the array (Array, Uint8Array, or string) in bytes. * @param {Array|Uint8Array|string} arr * @returns {number} */ function arrayByteLength(arr) { if (arr.length !== undefined) { return arr.length; } assert(arr.byteLength !== undefined); return arr.byteLength; } /** * Combines array items (arrays) into single Uint8Array object. * @param {Array} arr - the array of the arrays (Array, Uint8Array, or string). * @returns {Uint8Array} */ function arraysToBytes(arr) { // Shortcut: if first and only item is Uint8Array, return it. if (arr.length === 1 && (arr[0] instanceof Uint8Array)) { return arr[0]; } var resultLength = 0; var i, ii = arr.length; var item, itemLength ; for (i = 0; i < ii; i++) { item = arr[i]; itemLength = arrayByteLength(item); resultLength += itemLength; } var pos = 0; var data = new Uint8Array(resultLength); for (i = 0; i < ii; i++) { item = arr[i]; if (!(item instanceof Uint8Array)) { if (typeof item === 'string') { item = stringToBytes(item); } else { item = new Uint8Array(item); } } itemLength = item.byteLength; data.set(item, pos); pos += itemLength; } return data; } function string32(value) { return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff); } function log2(x) { var n = 1, i = 0; while (x > n) { n <<= 1; i++; } return i; } function readInt8(data, start) { return (data[start] << 24) >> 24; } function readUint16(data, offset) { return (data[offset] << 8) | data[offset + 1]; } function readUint32(data, offset) { return ((data[offset] << 24) | (data[offset + 1] << 16) | (data[offset + 2] << 8) | data[offset + 3]) >>> 0; } // Lazy test the endianness of the platform // NOTE: This will be 'true' for simulated TypedArrays function isLittleEndian() { var buffer8 = new Uint8Array(2); buffer8[0] = 1; var buffer16 = new Uint16Array(buffer8.buffer); return (buffer16[0] === 1); } // Checks if it's possible to eval JS expressions. function isEvalSupported() { try { /* jshint evil: true */ new Function(''); return true; } catch (e) { return false; } } var Uint32ArrayView = (function Uint32ArrayViewClosure() { function Uint32ArrayView(buffer, length) { this.buffer = buffer; this.byteLength = buffer.length; this.length = length === undefined ? (this.byteLength >> 2) : length; ensureUint32ArrayViewProps(this.length); } Uint32ArrayView.prototype = Object.create(null); var uint32ArrayViewSetters = 0; function createUint32ArrayProp(index) { return { get: function () { var buffer = this.buffer, offset = index << 2; return (buffer[offset] | (buffer[offset + 1] << 8) | (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)) >>> 0; }, set: function (value) { var buffer = this.buffer, offset = index << 2; buffer[offset] = value & 255; buffer[offset + 1] = (value >> 8) & 255; buffer[offset + 2] = (value >> 16) & 255; buffer[offset + 3] = (value >>> 24) & 255; } }; } function ensureUint32ArrayViewProps(length) { while (uint32ArrayViewSetters < length) { Object.defineProperty(Uint32ArrayView.prototype, uint32ArrayViewSetters, createUint32ArrayProp(uint32ArrayViewSetters)); uint32ArrayViewSetters++; } } return Uint32ArrayView; })(); exports.Uint32ArrayView = Uint32ArrayView; var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; var Util = (function UtilClosure() { function Util() {} var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')']; // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids // creating many intermediate strings. Util.makeCssRgb = function Util_makeCssRgb(r, g, b) { rgbBuf[1] = r; rgbBuf[3] = g; rgbBuf[5] = b; return rgbBuf.join(''); }; // Concatenates two transformation matrices together and returns the result. Util.transform = function Util_transform(m1, m2) { return [ m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5] ]; }; // For 2d affine transforms Util.applyTransform = function Util_applyTransform(p, m) { var xt = p[0] * m[0] + p[1] * m[2] + m[4]; var yt = p[0] * m[1] + p[1] * m[3] + m[5]; return [xt, yt]; }; Util.applyInverseTransform = function Util_applyInverseTransform(p, m) { var d = m[0] * m[3] - m[1] * m[2]; var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; return [xt, yt]; }; // Applies the transform to the rectangle and finds the minimum axially // aligned bounding box. Util.getAxialAlignedBoundingBox = function Util_getAxialAlignedBoundingBox(r, m) { var p1 = Util.applyTransform(r, m); var p2 = Util.applyTransform(r.slice(2, 4), m); var p3 = Util.applyTransform([r[0], r[3]], m); var p4 = Util.applyTransform([r[2], r[1]], m); return [ Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1]) ]; }; Util.inverseTransform = function Util_inverseTransform(m) { var d = m[0] * m[3] - m[1] * m[2]; return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; }; // Apply a generic 3d matrix M on a 3-vector v: // | a b c | | X | // | d e f | x | Y | // | g h i | | Z | // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i], // with v as [X,Y,Z] Util.apply3dTransform = function Util_apply3dTransform(m, v) { return [ m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2] ]; }; // This calculation uses Singular Value Decomposition. // The SVD can be represented with formula A = USV. We are interested in the // matrix S here because it represents the scale values. Util.singularValueDecompose2dScale = function Util_singularValueDecompose2dScale(m) { var transpose = [m[0], m[2], m[1], m[3]]; // Multiply matrix m with its transpose. var a = m[0] * transpose[0] + m[1] * transpose[2]; var b = m[0] * transpose[1] + m[1] * transpose[3]; var c = m[2] * transpose[0] + m[3] * transpose[2]; var d = m[2] * transpose[1] + m[3] * transpose[3]; // Solve the second degree polynomial to get roots. var first = (a + d) / 2; var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2; var sx = first + second || 1; var sy = first - second || 1; // Scale values are the square roots of the eigenvalues. return [Math.sqrt(sx), Math.sqrt(sy)]; }; // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2) // For coordinate systems whose origin lies in the bottom-left, this // means normalization to (BL,TR) ordering. For systems with origin in the // top-left, this means (TL,BR) ordering. Util.normalizeRect = function Util_normalizeRect(rect) { var r = rect.slice(0); // clone rect if (rect[0] > rect[2]) { r[0] = rect[2]; r[2] = rect[0]; } if (rect[1] > rect[3]) { r[1] = rect[3]; r[3] = rect[1]; } return r; }; // Returns a rectangle [x1, y1, x2, y2] corresponding to the // intersection of rect1 and rect2. If no intersection, returns 'false' // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2] Util.intersect = function Util_intersect(rect1, rect2) { function compare(a, b) { return a - b; } // Order points along the axes var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare), orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare), result = []; rect1 = Util.normalizeRect(rect1); rect2 = Util.normalizeRect(rect2); // X: first and second points belong to different rectangles? if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) || (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) { // Intersection must be between second and third points result[0] = orderedX[1]; result[2] = orderedX[2]; } else { return false; } // Y: first and second points belong to different rectangles? if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) || (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) { // Intersection must be between second and third points result[1] = orderedY[1]; result[3] = orderedY[2]; } else { return false; } return result; }; Util.sign = function Util_sign(num) { return num < 0 ? -1 : 1; }; var ROMAN_NUMBER_MAP = [ '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX' ]; /** * Converts positive integers to (upper case) Roman numerals. * @param {integer} number - The number that should be converted. * @param {boolean} lowerCase - Indicates if the result should be converted * to lower case letters. The default is false. * @return {string} The resulting Roman number. */ Util.toRoman = function Util_toRoman(number, lowerCase) { assert(isInt(number) && number > 0, 'The number should be a positive integer.'); var pos, romanBuf = []; // Thousands while (number >= 1000) { number -= 1000; romanBuf.push('M'); } // Hundreds pos = (number / 100) | 0; number %= 100; romanBuf.push(ROMAN_NUMBER_MAP[pos]); // Tens pos = (number / 10) | 0; number %= 10; romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]); // Ones romanBuf.push(ROMAN_NUMBER_MAP[20 + number]); var romanStr = romanBuf.join(''); return (lowerCase ? romanStr.toLowerCase() : romanStr); }; Util.appendToArray = function Util_appendToArray(arr1, arr2) { Array.prototype.push.apply(arr1, arr2); }; Util.prependToArray = function Util_prependToArray(arr1, arr2) { Array.prototype.unshift.apply(arr1, arr2); }; Util.extendObj = function extendObj(obj1, obj2) { for (var key in obj2) { obj1[key] = obj2[key]; } }; Util.getInheritableProperty = function Util_getInheritableProperty(dict, name) { while (dict && !dict.has(name)) { dict = dict.get('Parent'); } if (!dict) { return null; } return dict.get(name); }; Util.inherit = function Util_inherit(sub, base, prototype) { sub.prototype = Object.create(base.prototype); sub.prototype.constructor = sub; for (var prop in prototype) { sub.prototype[prop] = prototype[prop]; } }; Util.loadScript = function Util_loadScript(src, callback) { var script = document.createElement('script'); var loaded = false; script.setAttribute('src', src); if (callback) { script.onload = function() { if (!loaded) { callback(); } loaded = true; }; } document.getElementsByTagName('head')[0].appendChild(script); }; return Util; })(); /** * PDF page viewport created based on scale, rotation and offset. * @class * @alias PageViewport */ var PageViewport = (function PageViewportClosure() { /** * @constructor * @private * @param viewBox {Array} xMin, yMin, xMax and yMax coordinates. * @param scale {number} scale of the viewport. * @param rotation {number} rotations of the viewport in degrees. * @param offsetX {number} offset X * @param offsetY {number} offset Y * @param dontFlip {boolean} if true, axis Y will not be flipped. */ function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) { this.viewBox = viewBox; this.scale = scale; this.rotation = rotation; this.offsetX = offsetX; this.offsetY = offsetY; // creating transform to convert pdf coordinate system to the normal // canvas like coordinates taking in account scale and rotation var centerX = (viewBox[2] + viewBox[0]) / 2; var centerY = (viewBox[3] + viewBox[1]) / 2; var rotateA, rotateB, rotateC, rotateD; rotation = rotation % 360; rotation = rotation < 0 ? rotation + 360 : rotation; switch (rotation) { case 180: rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1; break; case 90: rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0; break; case 270: rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0; break; //case 0: default: rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1; break; } if (dontFlip) { rotateC = -rotateC; rotateD = -rotateD; } var offsetCanvasX, offsetCanvasY; var width, height; if (rotateA === 0) { offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; width = Math.abs(viewBox[3] - viewBox[1]) * scale; height = Math.abs(viewBox[2] - viewBox[0]) * scale; } else { offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; width = Math.abs(viewBox[2] - viewBox[0]) * scale; height = Math.abs(viewBox[3] - viewBox[1]) * scale; } // creating transform for the following operations: // translate(-centerX, -centerY), rotate and flip vertically, // scale, and translate(offsetCanvasX, offsetCanvasY) this.transform = [ rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY ]; this.width = width; this.height = height; this.fontScale = scale; } PageViewport.prototype = /** @lends PageViewport.prototype */ { /** * Clones viewport with additional properties. * @param args {Object} (optional) If specified, may contain the 'scale' or * 'rotation' properties to override the corresponding properties in * the cloned viewport. * @returns {PageViewport} Cloned viewport. */ clone: function PageViewPort_clone(args) { args = args || {}; var scale = 'scale' in args ? args.scale : this.scale; var rotation = 'rotation' in args ? args.rotation : this.rotation; return new PageViewport(this.viewBox.slice(), scale, rotation, this.offsetX, this.offsetY, args.dontFlip); }, /** * Converts PDF point to the viewport coordinates. For examples, useful for * converting PDF location into canvas pixel coordinates. * @param x {number} X coordinate. * @param y {number} Y coordinate. * @returns {Object} Object that contains 'x' and 'y' properties of the * point in the viewport coordinate space. * @see {@link convertToPdfPoint} * @see {@link convertToViewportRectangle} */ convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) { return Util.applyTransform([x, y], this.transform); }, /** * Converts PDF rectangle to the viewport coordinates. * @param rect {Array} xMin, yMin, xMax and yMax coordinates. * @returns {Array} Contains corresponding coordinates of the rectangle * in the viewport coordinate space. * @see {@link convertToViewportPoint} */ convertToViewportRectangle: function PageViewport_convertToViewportRectangle(rect) { var tl = Util.applyTransform([rect[0], rect[1]], this.transform); var br = Util.applyTransform([rect[2], rect[3]], this.transform); return [tl[0], tl[1], br[0], br[1]]; }, /** * Converts viewport coordinates to the PDF location. For examples, useful * for converting canvas pixel location into PDF one. * @param x {number} X coordinate. * @param y {number} Y coordinate. * @returns {Object} Object that contains 'x' and 'y' properties of the * point in the PDF coordinate space. * @see {@link convertToViewportPoint} */ convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) { return Util.applyInverseTransform([x, y], this.transform); } }; return PageViewport; })(); var PDFStringTranslateTable = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC ]; function stringToPDFString(str) { var i, n = str.length, strBuf = []; if (str[0] === '\xFE' && str[1] === '\xFF') { // UTF16BE BOM for (i = 2; i < n; i += 2) { strBuf.push(String.fromCharCode( (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1))); } } else { for (i = 0; i < n; ++i) { var code = PDFStringTranslateTable[str.charCodeAt(i)]; strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); } } return strBuf.join(''); } function stringToUTF8String(str) { return decodeURIComponent(escape(str)); } function utf8StringToString(str) { return unescape(encodeURIComponent(str)); } function isEmptyObj(obj) { for (var key in obj) { return false; } return true; } function isBool(v) { return typeof v === 'boolean'; } function isInt(v) { return typeof v === 'number' && ((v | 0) === v); } function isNum(v) { return typeof v === 'number'; } function isString(v) { return typeof v === 'string'; } function isArray(v) { return v instanceof Array; } function isArrayBuffer(v) { return typeof v === 'object' && v !== null && v.byteLength !== undefined; } /** * Promise Capability object. * * @typedef {Object} PromiseCapability * @property {Promise} promise - A promise object. * @property {function} resolve - Fullfills the promise. * @property {function} reject - Rejects the promise. */ /** * Creates a promise capability object. * @alias createPromiseCapability * * @return {PromiseCapability} A capability object contains: * - a Promise, resolve and reject methods. */ function createPromiseCapability() { var capability = {}; capability.promise = new Promise(function (resolve, reject) { capability.resolve = resolve; capability.reject = reject; }); return capability; } /** * Polyfill for Promises: * The following promise implementation tries to generally implement the * Promise/A+ spec. Some notable differences from other promise libaries are: * - There currently isn't a seperate deferred and promise object. * - Unhandled rejections eventually show an error if they aren't handled. * * Based off of the work in: * https://bugzilla.mozilla.org/show_bug.cgi?id=810490 */ (function PromiseClosure() { if (globalScope.Promise) { // Promises existing in the DOM/Worker, checking presence of all/resolve if (typeof globalScope.Promise.all !== 'function') { globalScope.Promise.all = function (iterable) { var count = 0, results = [], resolve, reject; var promise = new globalScope.Promise(function (resolve_, reject_) { resolve = resolve_; reject = reject_; }); iterable.forEach(function (p, i) { count++; p.then(function (result) { results[i] = result; count--; if (count === 0) { resolve(results); } }, reject); }); if (count === 0) { resolve(results); } return promise; }; } if (typeof globalScope.Promise.resolve !== 'function') { globalScope.Promise.resolve = function (value) { return new globalScope.Promise(function (resolve) { resolve(value); }); }; } if (typeof globalScope.Promise.reject !== 'function') { globalScope.Promise.reject = function (reason) { return new globalScope.Promise(function (resolve, reject) { reject(reason); }); }; } if (typeof globalScope.Promise.prototype.catch !== 'function') { globalScope.Promise.prototype.catch = function (onReject) { return globalScope.Promise.prototype.then(undefined, onReject); }; } return; } var STATUS_PENDING = 0; var STATUS_RESOLVED = 1; var STATUS_REJECTED = 2; // In an attempt to avoid silent exceptions, unhandled rejections are // tracked and if they aren't handled in a certain amount of time an // error is logged. var REJECTION_TIMEOUT = 500; var HandlerManager = { handlers: [], running: false, unhandledRejections: [], pendingRejectionCheck: false, scheduleHandlers: function scheduleHandlers(promise) { if (promise._status === STATUS_PENDING) { return; } this.handlers = this.handlers.concat(promise._handlers); promise._handlers = []; if (this.running) { return; } this.running = true; setTimeout(this.runHandlers.bind(this), 0); }, runHandlers: function runHandlers() { var RUN_TIMEOUT = 1; // ms var timeoutAt = Date.now() + RUN_TIMEOUT; while (this.handlers.length > 0) { var handler = this.handlers.shift(); var nextStatus = handler.thisPromise._status; var nextValue = handler.thisPromise._value; try { if (nextStatus === STATUS_RESOLVED) { if (typeof handler.onResolve === 'function') { nextValue = handler.onResolve(nextValue); } } else if (typeof handler.onReject === 'function') { nextValue = handler.onReject(nextValue); nextStatus = STATUS_RESOLVED; if (handler.thisPromise._unhandledRejection) { this.removeUnhandeledRejection(handler.thisPromise); } } } catch (ex) { nextStatus = STATUS_REJECTED; nextValue = ex; } handler.nextPromise._updateStatus(nextStatus, nextValue); if (Date.now() >= timeoutAt) { break; } } if (this.handlers.length > 0) { setTimeout(this.runHandlers.bind(this), 0); return; } this.running = false; }, addUnhandledRejection: function addUnhandledRejection(promise) { this.unhandledRejections.push({ promise: promise, time: Date.now() }); this.scheduleRejectionCheck(); }, removeUnhandeledRejection: function removeUnhandeledRejection(promise) { promise._unhandledRejection = false; for (var i = 0; i < this.unhandledRejections.length; i++) { if (this.unhandledRejections[i].promise === promise) { this.unhandledRejections.splice(i); i--; } } }, scheduleRejectionCheck: function scheduleRejectionCheck() { if (this.pendingRejectionCheck) { return; } this.pendingRejectionCheck = true; setTimeout(function rejectionCheck() { this.pendingRejectionCheck = false; var now = Date.now(); for (var i = 0; i < this.unhandledRejections.length; i++) { if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) { var unhandled = this.unhandledRejections[i].promise._value; var msg = 'Unhandled rejection: ' + unhandled; if (unhandled.stack) { msg += '\n' + unhandled.stack; } warn(msg); this.unhandledRejections.splice(i); i--; } } if (this.unhandledRejections.length) { this.scheduleRejectionCheck(); } }.bind(this), REJECTION_TIMEOUT); } }; function Promise(resolver) { this._status = STATUS_PENDING; this._handlers = []; try { resolver.call(this, this._resolve.bind(this), this._reject.bind(this)); } catch (e) { this._reject(e); } } /** * Builds a promise that is resolved when all the passed in promises are * resolved. * @param {array} array of data and/or promises to wait for. * @return {Promise} New dependant promise. */ Promise.all = function Promise_all(promises) { var resolveAll, rejectAll; var deferred = new Promise(function (resolve, reject) { resolveAll = resolve; rejectAll = reject; }); var unresolved = promises.length; var results = []; if (unresolved === 0) { resolveAll(results); return deferred; } function reject(reason) { if (deferred._status === STATUS_REJECTED) { return; } results = []; rejectAll(reason); } for (var i = 0, ii = promises.length; i < ii; ++i) { var promise = promises[i]; var resolve = (function(i) { return function(value) { if (deferred._status === STATUS_REJECTED) { return; } results[i] = value; unresolved--; if (unresolved === 0) { resolveAll(results); } }; })(i); if (Promise.isPromise(promise)) { promise.then(resolve, reject); } else { resolve(promise); } } return deferred; }; /** * Checks if the value is likely a promise (has a 'then' function). * @return {boolean} true if value is thenable */ Promise.isPromise = function Promise_isPromise(value) { return value && typeof value.then === 'function'; }; /** * Creates resolved promise * @param value resolve value * @returns {Promise} */ Promise.resolve = function Promise_resolve(value) { return new Promise(function (resolve) { resolve(value); }); }; /** * Creates rejected promise * @param reason rejection value * @returns {Promise} */ Promise.reject = function Promise_reject(reason) { return new Promise(function (resolve, reject) { reject(reason); }); }; Promise.prototype = { _status: null, _value: null, _handlers: null, _unhandledRejection: null, _updateStatus: function Promise__updateStatus(status, value) { if (this._status === STATUS_RESOLVED || this._status === STATUS_REJECTED) { return; } if (status === STATUS_RESOLVED && Promise.isPromise(value)) { value.then(this._updateStatus.bind(this, STATUS_RESOLVED), this._updateStatus.bind(this, STATUS_REJECTED)); return; } this._status = status; this._value = value; if (status === STATUS_REJECTED && this._handlers.length === 0) { this._unhandledRejection = true; HandlerManager.addUnhandledRejection(this); } HandlerManager.scheduleHandlers(this); }, _resolve: function Promise_resolve(value) { this._updateStatus(STATUS_RESOLVED, value); }, _reject: function Promise_reject(reason) { this._updateStatus(STATUS_REJECTED, reason); }, then: function Promise_then(onResolve, onReject) { var nextPromise = new Promise(function (resolve, reject) { this.resolve = resolve; this.reject = reject; }); this._handlers.push({ thisPromise: this, onResolve: onResolve, onReject: onReject, nextPromise: nextPromise }); HandlerManager.scheduleHandlers(this); return nextPromise; }, catch: function Promise_catch(onReject) { return this.then(undefined, onReject); } }; globalScope.Promise = Promise; })(); var StatTimer = (function StatTimerClosure() { function rpad(str, pad, length) { while (str.length < length) { str += pad; } return str; } function StatTimer() { this.started = Object.create(null); this.times = []; this.enabled = true; } StatTimer.prototype = { time: function StatTimer_time(name) { if (!this.enabled) { return; } if (name in this.started) { warn('Timer is already running for ' + name); } this.started[name] = Date.now(); }, timeEnd: function StatTimer_timeEnd(name) { if (!this.enabled) { return; } if (!(name in this.started)) { warn('Timer has not been started for ' + name); } this.times.push({ 'name': name, 'start': this.started[name], 'end': Date.now() }); // Remove timer from started so it can be called again. delete this.started[name]; }, toString: function StatTimer_toString() { var i, ii; var times = this.times; var out = ''; // Find the longest name for padding purposes. var longest = 0; for (i = 0, ii = times.length; i < ii; ++i) { var name = times[i]['name']; if (name.length > longest) { longest = name.length; } } for (i = 0, ii = times.length; i < ii; ++i) { var span = times[i]; var duration = span.end - span.start; out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n'; } return out; } }; return StatTimer; })(); var createBlob = function createBlob(data, contentType) { if (typeof Blob !== 'undefined') { return new Blob([data], { type: contentType }); } // Blob builder is deprecated in FF14 and removed in FF18. var bb = new MozBlobBuilder(); bb.append(data); return bb.getBlob(contentType); }; var createObjectURL = (function createObjectURLClosure() { // Blob/createObjectURL is not available, falling back to data schema. var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; return function createObjectURL(data, contentType, forceDataSchema) { if (!forceDataSchema && typeof URL !== 'undefined' && URL.createObjectURL) { var blob = createBlob(data, contentType); return URL.createObjectURL(blob); } var buffer = 'data:' + contentType + ';base64,'; for (var i = 0, ii = data.length; i < ii; i += 3) { var b1 = data[i] & 0xFF; var b2 = data[i + 1] & 0xFF; var b3 = data[i + 2] & 0xFF; var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; var d4 = i + 2 < ii ? (b3 & 0x3F) : 64; buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4]; } return buffer; }; })(); function MessageHandler(sourceName, targetName, comObj) { this.sourceName = sourceName; this.targetName = targetName; this.comObj = comObj; this.callbackIndex = 1; this.postMessageTransfers = true; var callbacksCapabilities = this.callbacksCapabilities = Object.create(null); var ah = this.actionHandler = Object.create(null); this._onComObjOnMessage = function messageHandlerComObjOnMessage(event) { var data = event.data; if (data.targetName !== this.sourceName) { return; } if (data.isReply) { var callbackId = data.callbackId; if (data.callbackId in callbacksCapabilities) { var callback = callbacksCapabilities[callbackId]; delete callbacksCapabilities[callbackId]; if ('error' in data) { callback.reject(data.error); } else { callback.resolve(data.data); } } else { error('Cannot resolve callback ' + callbackId); } } else if (data.action in ah) { var action = ah[data.action]; if (data.callbackId) { var sourceName = this.sourceName; var targetName = data.sourceName; Promise.resolve().then(function () { return action[0].call(action[1], data.data); }).then(function (result) { comObj.postMessage({ sourceName: sourceName, targetName: targetName, isReply: true, callbackId: data.callbackId, data: result }); }, function (reason) { if (reason instanceof Error) { // Serialize error to avoid "DataCloneError" reason = reason + ''; } comObj.postMessage({ sourceName: sourceName, targetName: targetName, isReply: true, callbackId: data.callbackId, error: reason }); }); } else { action[0].call(action[1], data.data); } } else { error('Unknown action from worker: ' + data.action); } }.bind(this); comObj.addEventListener('message', this._onComObjOnMessage); } MessageHandler.prototype = { on: function messageHandlerOn(actionName, handler, scope) { var ah = this.actionHandler; if (ah[actionName]) { error('There is already an actionName called "' + actionName + '"'); } ah[actionName] = [handler, scope]; }, /** * Sends a message to the comObj to invoke the action with the supplied data. * @param {String} actionName Action to call. * @param {JSON} data JSON data to send. * @param {Array} [transfers] Optional list of transfers/ArrayBuffers */ send: function messageHandlerSend(actionName, data, transfers) { var message = { sourceName: this.sourceName, targetName: this.targetName, action: actionName, data: data }; this.postMessage(message, transfers); }, /** * Sends a message to the comObj to invoke the action with the supplied data. * Expects that other side will callback with the response. * @param {String} actionName Action to call. * @param {JSON} data JSON data to send. * @param {Array} [transfers] Optional list of transfers/ArrayBuffers. * @returns {Promise} Promise to be resolved with response data. */ sendWithPromise: function messageHandlerSendWithPromise(actionName, data, transfers) { var callbackId = this.callbackIndex++; var message = { sourceName: this.sourceName, targetName: this.targetName, action: actionName, data: data, callbackId: callbackId }; var capability = createPromiseCapability(); this.callbacksCapabilities[callbackId] = capability; try { this.postMessage(message, transfers); } catch (e) { capability.reject(e); } return capability.promise; }, /** * Sends raw message to the comObj. * @private * @param message {Object} Raw message. * @param transfers List of transfers/ArrayBuffers, or undefined. */ postMessage: function (message, transfers) { if (transfers && this.postMessageTransfers) { this.comObj.postMessage(message, transfers); } else { this.comObj.postMessage(message); } }, destroy: function () { this.comObj.removeEventListener('message', this._onComObjOnMessage); } }; function loadJpegStream(id, imageUrl, objs) { var img = new Image(); img.onload = (function loadJpegStream_onloadClosure() { objs.resolve(id, img); }); img.onerror = (function loadJpegStream_onerrorClosure() { objs.resolve(id, null); warn('Error during JPEG image loading'); }); img.src = imageUrl; } // Polyfill from https://github.com/Polymer/URL /* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ (function checkURLConstructor(scope) { /* jshint ignore:start */ // feature detect for URL constructor var hasWorkingUrl = false; try { if (typeof URL === 'function' && typeof URL.prototype === 'object' && ('origin' in URL.prototype)) { var u = new URL('b', 'http://a'); u.pathname = 'c%20d'; hasWorkingUrl = u.href === 'http://a/c%20d'; } } catch(e) { } if (hasWorkingUrl) return; var relative = Object.create(null); relative['ftp'] = 21; relative['file'] = 0; relative['gopher'] = 70; relative['http'] = 80; relative['https'] = 443; relative['ws'] = 80; relative['wss'] = 443; var relativePathDotMapping = Object.create(null); relativePathDotMapping['%2e'] = '.'; relativePathDotMapping['.%2e'] = '..'; relativePathDotMapping['%2e.'] = '..'; relativePathDotMapping['%2e%2e'] = '..'; function isRelativeScheme(scheme) { return relative[scheme] !== undefined; } function invalid() { clear.call(this); this._isInvalid = true; } function IDNAToASCII(h) { if ('' == h) { invalid.call(this) } // XXX return h.toLowerCase() } function percentEscape(c) { var unicode = c.charCodeAt(0); if (unicode > 0x20 && unicode < 0x7F && // " # < > ? ` [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1 ) { return c; } return encodeURIComponent(c); } function percentEscapeQuery(c) { // XXX This actually needs to encode c using encoding and then // convert the bytes one-by-one. var unicode = c.charCodeAt(0); if (unicode > 0x20 && unicode < 0x7F && // " # < > ` (do not escape '?') [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1 ) { return c; } return encodeURIComponent(c); } var EOF = undefined, ALPHA = /[a-zA-Z]/, ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/; function parse(input, stateOverride, base) { function err(message) { errors.push(message) } var state = stateOverride || 'scheme start', cursor = 0, buffer = '', seenAt = false, seenBracket = false, errors = []; loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) { var c = input[cursor]; switch (state) { case 'scheme start': if (c && ALPHA.test(c)) { buffer += c.toLowerCase(); // ASCII-safe state = 'scheme'; } else if (!stateOverride) { buffer = ''; state = 'no scheme'; continue; } else { err('Invalid scheme.'); break loop; } break; case 'scheme': if (c && ALPHANUMERIC.test(c)) { buffer += c.toLowerCase(); // ASCII-safe } else if (':' == c) { this._scheme = buffer; buffer = ''; if (stateOverride) { break loop; } if (isRelativeScheme(this._scheme)) { this._isRelative = true; } if ('file' == this._scheme) { state = 'relative'; } else if (this._isRelative && base && base._scheme == this._scheme) { state = 'relative or authority'; } else if (this._isRelative) { state = 'authority first slash'; } else { state = 'scheme data'; } } else if (!stateOverride) { buffer = ''; cursor = 0; state = 'no scheme'; continue; } else if (EOF == c) { break loop; } else { err('Code point not allowed in scheme: ' + c) break loop; } break; case 'scheme data': if ('?' == c) { this._query = '?'; state = 'query'; } else if ('#' == c) { this._fragment = '#'; state = 'fragment'; } else { // XXX error handling if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { this._schemeData += percentEscape(c); } } break; case 'no scheme': if (!base || !(isRelativeScheme(base._scheme))) { err('Missing scheme.'); invalid.call(this); } else { state = 'relative'; continue; } break; case 'relative or authority': if ('/' == c && '/' == input[cursor+1]) { state = 'authority ignore slashes'; } else { err('Expected /, got: ' + c); state = 'relative'; continue } break; case 'relative': this._isRelative = true; if ('file' != this._scheme) this._scheme = base._scheme; if (EOF == c) { this._host = base._host; this._port = base._port; this._path = base._path.slice(); this._query = base._query; this._username = base._username; this._password = base._password; break loop; } else if ('/' == c || '\\' == c) { if ('\\' == c) err('\\ is an invalid code point.'); state = 'relative slash'; } else if ('?' == c) { this._host = base._host; this._port = base._port; this._path = base._path.slice(); this._query = '?'; this._username = base._username; this._password = base._password; state = 'query'; } else if ('#' == c) { this._host = base._host; this._port = base._port; this._path = base._path.slice(); this._query = base._query; this._fragment = '#'; this._username = base._username; this._password = base._password; state = 'fragment'; } else { var nextC = input[cursor+1] var nextNextC = input[cursor+2] if ( 'file' != this._scheme || !ALPHA.test(c) || (nextC != ':' && nextC != '|') || (EOF != nextNextC && '/' != nextNextC && '\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) { this._host = base._host; this._port = base._port; this._username = base._username; this._password = base._password; this._path = base._path.slice(); this._path.pop(); } state = 'relative path'; continue; } break; case 'relative slash': if ('/' == c || '\\' == c) { if ('\\' == c) { err('\\ is an invalid code point.'); } if ('file' == this._scheme) { state = 'file host'; } else { state = 'authority ignore slashes'; } } else { if ('file' != this._scheme) { this._host = base._host; this._port = base._port; this._username = base._username; this._password = base._password; } state = 'relative path'; continue; } break; case 'authority first slash': if ('/' == c) { state = 'authority second slash'; } else { err("Expected '/', got: " + c); state = 'authority ignore slashes'; continue; } break; case 'authority second slash': state = 'authority ignore slashes'; if ('/' != c) { err("Expected '/', got: " + c); continue; } break; case 'authority ignore slashes': if ('/' != c && '\\' != c) { state = 'authority'; continue; } else { err('Expected authority, got: ' + c); } break; case 'authority': if ('@' == c) { if (seenAt) { err('@ already seen.'); buffer += '%40'; } seenAt = true; for (var i = 0; i < buffer.length; i++) { var cp = buffer[i]; if ('\t' == cp || '\n' == cp || '\r' == cp) { err('Invalid whitespace in authority.'); continue; } // XXX check URL code points if (':' == cp && null === this._password) { this._password = ''; continue; } var tempC = percentEscape(cp); (null !== this._password) ? this._password += tempC : this._username += tempC; } buffer = ''; } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { cursor -= buffer.length; buffer = ''; state = 'host'; continue; } else { buffer += c; } break; case 'file host': if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) { state = 'relative path'; } else if (buffer.length == 0) { state = 'relative path start'; } else { this._host = IDNAToASCII.call(this, buffer); buffer = ''; state = 'relative path start'; } continue; } else if ('\t' == c || '\n' == c || '\r' == c) { err('Invalid whitespace in file host.'); } else { buffer += c; } break; case 'host': case 'hostname': if (':' == c && !seenBracket) { // XXX host parsing this._host = IDNAToASCII.call(this, buffer); buffer = ''; state = 'port'; if ('hostname' == stateOverride) { break loop; } } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { this._host = IDNAToASCII.call(this, buffer); buffer = ''; state = 'relative path start'; if (stateOverride) { break loop; } continue; } else if ('\t' != c && '\n' != c && '\r' != c) { if ('[' == c) { seenBracket = true; } else if (']' == c) { seenBracket = false; } buffer += c; } else { err('Invalid code point in host/hostname: ' + c); } break; case 'port': if (/[0-9]/.test(c)) { buffer += c; } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c || stateOverride) { if ('' != buffer) { var temp = parseInt(buffer, 10); if (temp != relative[this._scheme]) { this._port = temp + ''; } buffer = ''; } if (stateOverride) { break loop; } state = 'relative path start'; continue; } else if ('\t' == c || '\n' == c || '\r' == c) { err('Invalid code point in port: ' + c); } else { invalid.call(this); } break; case 'relative path start': if ('\\' == c) err("'\\' not allowed in path."); state = 'relative path'; if ('/' != c && '\\' != c) { continue; } break; case 'relative path': if (EOF == c || '/' == c || '\\' == c || (!stateOverride && ('?' == c || '#' == c))) { if ('\\' == c) { err('\\ not allowed in relative path.'); } var tmp; if (tmp = relativePathDotMapping[buffer.toLowerCase()]) { buffer = tmp; } if ('..' == buffer) { this._path.pop(); if ('/' != c && '\\' != c) { this._path.push(''); } } else if ('.' == buffer && '/' != c && '\\' != c) { this._path.push(''); } else if ('.' != buffer) { if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') { buffer = buffer[0] + ':'; } this._path.push(buffer); } buffer = ''; if ('?' == c) { this._query = '?'; state = 'query'; } else if ('#' == c) { this._fragment = '#'; state = 'fragment'; } } else if ('\t' != c && '\n' != c && '\r' != c) { buffer += percentEscape(c); } break; case 'query': if (!stateOverride && '#' == c) { this._fragment = '#'; state = 'fragment'; } else if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { this._query += percentEscapeQuery(c); } break; case 'fragment': if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { this._fragment += c; } break; } cursor++; } } function clear() { this._scheme = ''; this._schemeData = ''; this._username = ''; this._password = null; this._host = ''; this._port = ''; this._path = []; this._query = ''; this._fragment = ''; this._isInvalid = false; this._isRelative = false; } // Does not process domain names or IP addresses. // Does not handle encoding for the query parameter. function jURL(url, base /* , encoding */) { if (base !== undefined && !(base instanceof jURL)) base = new jURL(String(base)); this._url = url; clear.call(this); var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, ''); // encoding = encoding || 'utf-8' parse.call(this, input, null, base); } jURL.prototype = { toString: function() { return this.href; }, get href() { if (this._isInvalid) return this._url; var authority = ''; if ('' != this._username || null != this._password) { authority = this._username + (null != this._password ? ':' + this._password : '') + '@'; } return this.protocol + (this._isRelative ? '//' + authority + this.host : '') + this.pathname + this._query + this._fragment; }, set href(href) { clear.call(this); parse.call(this, href); }, get protocol() { return this._scheme + ':'; }, set protocol(protocol) { if (this._isInvalid) return; parse.call(this, protocol + ':', 'scheme start'); }, get host() { return this._isInvalid ? '' : this._port ? this._host + ':' + this._port : this._host; }, set host(host) { if (this._isInvalid || !this._isRelative) return; parse.call(this, host, 'host'); }, get hostname() { return this._host; }, set hostname(hostname) { if (this._isInvalid || !this._isRelative) return; parse.call(this, hostname, 'hostname'); }, get port() { return this._port; }, set port(port) { if (this._isInvalid || !this._isRelative) return; parse.call(this, port, 'port'); }, get pathname() { return this._isInvalid ? '' : this._isRelative ? '/' + this._path.join('/') : this._schemeData; }, set pathname(pathname) { if (this._isInvalid || !this._isRelative) return; this._path = []; parse.call(this, pathname, 'relative path start'); }, get search() { return this._isInvalid || !this._query || '?' == this._query ? '' : this._query; }, set search(search) { if (this._isInvalid || !this._isRelative) return; this._query = '?'; if ('?' == search[0]) search = search.slice(1); parse.call(this, search, 'query'); }, get hash() { return this._isInvalid || !this._fragment || '#' == this._fragment ? '' : this._fragment; }, set hash(hash) { if (this._isInvalid) return; this._fragment = '#'; if ('#' == hash[0]) hash = hash.slice(1); parse.call(this, hash, 'fragment'); }, get origin() { var host; if (this._isInvalid || !this._scheme) { return ''; } // javascript: Gecko returns String(""), WebKit/Blink String("null") // Gecko throws error for "data://" // data: Gecko returns "", Blink returns "data://", WebKit returns "null" // Gecko returns String("") for file: mailto: // WebKit/Blink returns String("SCHEME://") for file: mailto: switch (this._scheme) { case 'data': case 'file': case 'javascript': case 'mailto': return 'null'; } host = this.host; if (!host) { return ''; } return this._scheme + '://' + host; } }; // Copy over the static methods var OriginalURL = scope.URL; if (OriginalURL) { jURL.createObjectURL = function(blob) { // IE extension allows a second optional options argument. // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx return OriginalURL.createObjectURL.apply(OriginalURL, arguments); }; jURL.revokeObjectURL = function(url) { OriginalURL.revokeObjectURL(url); }; } scope.URL = jURL; /* jshint ignore:end */ })(globalScope); exports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX; exports.IDENTITY_MATRIX = IDENTITY_MATRIX; exports.OPS = OPS; exports.VERBOSITY_LEVELS = VERBOSITY_LEVELS; exports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES; exports.AnnotationBorderStyleType = AnnotationBorderStyleType; exports.AnnotationFlag = AnnotationFlag; exports.AnnotationType = AnnotationType; exports.FontType = FontType; exports.ImageKind = ImageKind; exports.InvalidPDFException = InvalidPDFException; exports.MessageHandler = MessageHandler; exports.MissingDataException = MissingDataException; exports.MissingPDFException = MissingPDFException; exports.NotImplementedException = NotImplementedException; exports.PageViewport = PageViewport; exports.PasswordException = PasswordException; exports.PasswordResponses = PasswordResponses; exports.StatTimer = StatTimer; exports.StreamType = StreamType; exports.TextRenderingMode = TextRenderingMode; exports.UnexpectedResponseException = UnexpectedResponseException; exports.UnknownErrorException = UnknownErrorException; exports.Util = Util; exports.XRefParseException = XRefParseException; exports.arrayByteLength = arrayByteLength; exports.arraysToBytes = arraysToBytes; exports.assert = assert; exports.bytesToString = bytesToString; exports.combineUrl = combineUrl; exports.createBlob = createBlob; exports.createPromiseCapability = createPromiseCapability; exports.createObjectURL = createObjectURL; exports.deprecated = deprecated; exports.error = error; exports.getLookupTableFactory = getLookupTableFactory; exports.getVerbosityLevel = getVerbosityLevel; exports.globalScope = globalScope; exports.info = info; exports.isArray = isArray; exports.isArrayBuffer = isArrayBuffer; exports.isBool = isBool; exports.isEmptyObj = isEmptyObj; exports.isInt = isInt; exports.isNum = isNum; exports.isString = isString; exports.isSameOrigin = isSameOrigin; exports.isValidUrl = isValidUrl; exports.isLittleEndian = isLittleEndian; exports.isEvalSupported = isEvalSupported; exports.loadJpegStream = loadJpegStream; exports.log2 = log2; exports.readInt8 = readInt8; exports.readUint16 = readUint16; exports.readUint32 = readUint32; exports.removeNullCharacters = removeNullCharacters; exports.setVerbosityLevel = setVerbosityLevel; exports.shadow = shadow; exports.string32 = string32; exports.stringToBytes = stringToBytes; exports.stringToPDFString = stringToPDFString; exports.stringToUTF8String = stringToUTF8String; exports.utf8StringToString = utf8StringToString; exports.warn = warn; })); (function (root, factory) { { factory((root.pdfjsDisplayDOMUtils = {}), root.pdfjsSharedUtil); } }(this, function (exports, sharedUtil) { var removeNullCharacters = sharedUtil.removeNullCharacters; var warn = sharedUtil.warn; /** * Optimised CSS custom property getter/setter. * @class */ var CustomStyle = (function CustomStyleClosure() { // As noted on: http://www.zachstronaut.com/posts/2009/02/17/ // animate-css-transforms-firefox-webkit.html // in some versions of IE9 it is critical that ms appear in this list // before Moz var prefixes = ['ms', 'Moz', 'Webkit', 'O']; var _cache = Object.create(null); function CustomStyle() {} CustomStyle.getProp = function get(propName, element) { // check cache only when no element is given if (arguments.length === 1 && typeof _cache[propName] === 'string') { return _cache[propName]; } element = element || document.documentElement; var style = element.style, prefixed, uPropName; // test standard property first if (typeof style[propName] === 'string') { return (_cache[propName] = propName); } // capitalize uPropName = propName.charAt(0).toUpperCase() + propName.slice(1); // test vendor specific properties for (var i = 0, l = prefixes.length; i < l; i++) { prefixed = prefixes[i] + uPropName; if (typeof style[prefixed] === 'string') { return (_cache[propName] = prefixed); } } //if all fails then set to undefined return (_cache[propName] = 'undefined'); }; CustomStyle.setProp = function set(propName, element, str) { var prop = this.getProp(propName); if (prop !== 'undefined') { element.style[prop] = str; } }; return CustomStyle; })(); function hasCanvasTypedArrays() { var canvas = document.createElement('canvas'); canvas.width = canvas.height = 1; var ctx = canvas.getContext('2d'); var imageData = ctx.createImageData(1, 1); return (typeof imageData.data.buffer !== 'undefined'); } var LinkTarget = { NONE: 0, // Default value. SELF: 1, BLANK: 2, PARENT: 3, TOP: 4, }; var LinkTargetStringMap = [ '', '_self', '_blank', '_parent', '_top' ]; /** * @typedef ExternalLinkParameters * @typedef {Object} ExternalLinkParameters * @property {string} url * @property {LinkTarget} target * @property {string} rel */ /** * Adds various attributes (href, title, target, rel) to hyperlinks. * @param {HTMLLinkElement} link - The link element. * @param {ExternalLinkParameters} params - An object with the properties. */ function addLinkAttributes(link, params) { var url = params && params.url; link.href = link.title = (url ? removeNullCharacters(url) : ''); if (url) { var target = params.target; if (typeof target === 'undefined') { target = getDefaultSetting('externalLinkTarget'); } link.target = LinkTargetStringMap[target]; // Strip referrer from the URL. var rel = params.rel; if (typeof rel === 'undefined') { rel = getDefaultSetting('externalLinkRel'); } link.rel = rel; } } // Gets the file name from a given URL. function getFilenameFromUrl(url) { var anchor = url.indexOf('#'); var query = url.indexOf('?'); var end = Math.min( anchor > 0 ? anchor : url.length, query > 0 ? query : url.length); return url.substring(url.lastIndexOf('/', end) + 1, end); } function getDefaultSetting(id) { // The list of the settings and their default is maintained for backward // compatibility and shall not be extended or modified. See also global.js. var globalSettings = sharedUtil.globalScope.PDFJS; switch (id) { case 'pdfBug': return globalSettings ? globalSettings.pdfBug : false; case 'disableAutoFetch': return globalSettings ? globalSettings.disableAutoFetch : false; case 'disableStream': return globalSettings ? globalSettings.disableStream : false; case 'disableRange': return globalSettings ? globalSettings.disableRange : false; case 'disableFontFace': return globalSettings ? globalSettings.disableFontFace : false; case 'disableCreateObjectURL': return globalSettings ? globalSettings.disableCreateObjectURL : false; case 'disableWebGL': return globalSettings ? globalSettings.disableWebGL : true; case 'cMapUrl': return globalSettings ? globalSettings.cMapUrl : null; case 'cMapPacked': return globalSettings ? globalSettings.cMapPacked : false; case 'postMessageTransfers': return globalSettings ? globalSettings.postMessageTransfers : true; case 'workerSrc': return globalSettings ? globalSettings.workerSrc : null; case 'disableWorker': return globalSettings ? globalSettings.disableWorker : false; case 'maxImageSize': return globalSettings ? globalSettings.maxImageSize : -1; case 'imageResourcesPath': return globalSettings ? globalSettings.imageResourcesPath : ''; case 'isEvalSupported': return globalSettings ? globalSettings.isEvalSupported : true; case 'externalLinkTarget': if (!globalSettings) { return LinkTarget.NONE; } switch (globalSettings.externalLinkTarget) { case LinkTarget.NONE: case LinkTarget.SELF: case LinkTarget.BLANK: case LinkTarget.PARENT: case LinkTarget.TOP: return globalSettings.externalLinkTarget; } warn('PDFJS.externalLinkTarget is invalid: ' + globalSettings.externalLinkTarget); // Reset the external link target, to suppress further warnings. globalSettings.externalLinkTarget = LinkTarget.NONE; return LinkTarget.NONE; case 'externalLinkRel': return globalSettings ? globalSettings.externalLinkRel : 'noreferrer'; case 'enableStats': return !!(globalSettings && globalSettings.enableStats); default: throw new Error('Unknown default setting: ' + id); } } function isExternalLinkTargetSet() { var externalLinkTarget = getDefaultSetting('externalLinkTarget'); switch (externalLinkTarget) { case LinkTarget.NONE: return false; case LinkTarget.SELF: case LinkTarget.BLANK: case LinkTarget.PARENT: case LinkTarget.TOP: return true; } } exports.CustomStyle = CustomStyle; exports.addLinkAttributes = addLinkAttributes; exports.isExternalLinkTargetSet = isExternalLinkTargetSet; exports.getFilenameFromUrl = getFilenameFromUrl; exports.LinkTarget = LinkTarget; exports.hasCanvasTypedArrays = hasCanvasTypedArrays; exports.getDefaultSetting = getDefaultSetting; })); (function (root, factory) { { factory((root.pdfjsDisplayFontLoader = {}), root.pdfjsSharedUtil); } }(this, function (exports, sharedUtil) { var assert = sharedUtil.assert; var bytesToString = sharedUtil.bytesToString; var string32 = sharedUtil.string32; var shadow = sharedUtil.shadow; var warn = sharedUtil.warn; function FontLoader(docId) { this.docId = docId; this.styleElement = null; this.nativeFontFaces = []; this.loadTestFontId = 0; this.loadingContext = { requests: [], nextRequestId: 0 }; } FontLoader.prototype = { insertRule: function fontLoaderInsertRule(rule) { var styleElement = this.styleElement; if (!styleElement) { styleElement = this.styleElement = document.createElement('style'); styleElement.id = 'PDFJS_FONT_STYLE_TAG_' + this.docId; document.documentElement.getElementsByTagName('head')[0].appendChild( styleElement); } var styleSheet = styleElement.sheet; styleSheet.insertRule(rule, styleSheet.cssRules.length); }, clear: function fontLoaderClear() { var styleElement = this.styleElement; if (styleElement) { styleElement.parentNode.removeChild(styleElement); styleElement = this.styleElement = null; } this.nativeFontFaces.forEach(function(nativeFontFace) { document.fonts.delete(nativeFontFace); }); this.nativeFontFaces.length = 0; }, get loadTestFont() { // This is a CFF font with 1 glyph for '.' that fills its entire width and // height. return shadow(this, 'loadTestFont', atob( 'T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQ' + 'AABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwA' + 'AAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbm' + 'FtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAA' + 'AADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6A' + 'ABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAA' + 'MQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAA' + 'AAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAA' + 'AAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQ' + 'AAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMA' + 'AQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAA' + 'EAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAA' + 'AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAA' + 'AAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgc' + 'A/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF' + 'hYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQA' + 'AAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAg' + 'ABAAAAAAAAAAAD6AAAAAAAAA==' )); }, addNativeFontFace: function fontLoader_addNativeFontFace(nativeFontFace) { this.nativeFontFaces.push(nativeFontFace); document.fonts.add(nativeFontFace); }, bind: function fontLoaderBind(fonts, callback) { var rules = []; var fontsToLoad = []; var fontLoadPromises = []; var getNativeFontPromise = function(nativeFontFace) { // Return a promise that is always fulfilled, even when the font fails to // load. return nativeFontFace.loaded.catch(function(e) { warn('Failed to load font "' + nativeFontFace.family + '": ' + e); }); }; for (var i = 0, ii = fonts.length; i < ii; i++) { var font = fonts[i]; // Add the font to the DOM only once or skip if the font // is already loaded. if (font.attached || font.loading === false) { continue; } font.attached = true; if (FontLoader.isFontLoadingAPISupported) { var nativeFontFace = font.createNativeFontFace(); if (nativeFontFace) { this.addNativeFontFace(nativeFontFace); fontLoadPromises.push(getNativeFontPromise(nativeFontFace)); } } else { var rule = font.createFontFaceRule(); if (rule) { this.insertRule(rule); rules.push(rule); fontsToLoad.push(font); } } } var request = this.queueLoadingCallback(callback); if (FontLoader.isFontLoadingAPISupported) { Promise.all(fontLoadPromises).then(function() { request.complete(); }); } else if (rules.length > 0 && !FontLoader.isSyncFontLoadingSupported) { this.prepareFontLoadEvent(rules, fontsToLoad, request); } else { request.complete(); } }, queueLoadingCallback: function FontLoader_queueLoadingCallback(callback) { function LoadLoader_completeRequest() { assert(!request.end, 'completeRequest() cannot be called twice'); request.end = Date.now(); // sending all completed requests in order how they were queued while (context.requests.length > 0 && context.requests[0].end) { var otherRequest = context.requests.shift(); setTimeout(otherRequest.callback, 0); } } var context = this.loadingContext; var requestId = 'pdfjs-font-loading-' + (context.nextRequestId++); var request = { id: requestId, complete: LoadLoader_completeRequest, callback: callback, started: Date.now() }; context.requests.push(request); return request; }, prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules, fonts, request) { /** Hack begin */ // There's currently no event when a font has finished downloading so the // following code is a dirty hack to 'guess' when a font is // ready. It's assumed fonts are loaded in order, so add a known test // font after the desired fonts and then test for the loading of that // test font. function int32(data, offset) { return (data.charCodeAt(offset) << 24) | (data.charCodeAt(offset + 1) << 16) | (data.charCodeAt(offset + 2) << 8) | (data.charCodeAt(offset + 3) & 0xff); } function spliceString(s, offset, remove, insert) { var chunk1 = s.substr(0, offset); var chunk2 = s.substr(offset + remove); return chunk1 + insert + chunk2; } var i, ii; var canvas = document.createElement('canvas'); canvas.width = 1; canvas.height = 1; var ctx = canvas.getContext('2d'); var called = 0; function isFontReady(name, callback) { called++; // With setTimeout clamping this gives the font ~100ms to load. if(called > 30) { warn('Load test font never loaded.'); callback(); return; } ctx.font = '30px ' + name; ctx.fillText('.', 0, 20); var imageData = ctx.getImageData(0, 0, 1, 1); if (imageData.data[3] > 0) { callback(); return; } setTimeout(isFontReady.bind(null, name, callback)); } var loadTestFontId = 'lt' + Date.now() + this.loadTestFontId++; // Chromium seems to cache fonts based on a hash of the actual font data, // so the font must be modified for each load test else it will appear to // be loaded already. // TODO: This could maybe be made faster by avoiding the btoa of the full // font by splitting it in chunks before hand and padding the font id. var data = this.loadTestFont; var COMMENT_OFFSET = 976; // has to be on 4 byte boundary (for checksum) data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId); // CFF checksum is important for IE, adjusting it var CFF_CHECKSUM_OFFSET = 16; var XXXX_VALUE = 0x58585858; // the "comment" filled with 'X' var checksum = int32(data, CFF_CHECKSUM_OFFSET); for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) { checksum = (checksum - XXXX_VALUE + int32(loadTestFontId, i)) | 0; } if (i < loadTestFontId.length) { // align to 4 bytes boundary checksum = (checksum - XXXX_VALUE + int32(loadTestFontId + 'XXX', i)) | 0; } data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum)); var url = 'url(data:font/opentype;base64,' + btoa(data) + ');'; var rule = '@font-face { font-family:"' + loadTestFontId + '";src:' + url + '}'; this.insertRule(rule); var names = []; for (i = 0, ii = fonts.length; i < ii; i++) { names.push(fonts[i].loadedName); } names.push(loadTestFontId); var div = document.createElement('div'); div.setAttribute('style', 'visibility: hidden;' + 'width: 10px; height: 10px;' + 'position: absolute; top: 0px; left: 0px;'); for (i = 0, ii = names.length; i < ii; ++i) { var span = document.createElement('span'); span.textContent = 'Hi'; span.style.fontFamily = names[i]; div.appendChild(span); } document.body.appendChild(div); isFontReady(loadTestFontId, function() { document.body.removeChild(div); request.complete(); }); /** Hack end */ } }; FontLoader.isFontLoadingAPISupported = typeof document !== 'undefined' && !!document.fonts; Object.defineProperty(FontLoader, 'isSyncFontLoadingSupported', { get: function () { if (typeof navigator === 'undefined') { // node.js - we can pretend sync font loading is supported. return shadow(FontLoader, 'isSyncFontLoadingSupported', true); } var supported = false; // User agent string sniffing is bad, but there is no reliable way to tell // if font is fully loaded and ready to be used with canvas. var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(navigator.userAgent); if (m && m[1] >= 14) { supported = true; } // TODO other browsers return shadow(FontLoader, 'isSyncFontLoadingSupported', supported); }, enumerable: true, configurable: true }); var IsEvalSupportedCached = { get value() { return shadow(this, 'value', sharedUtil.isEvalSupported()); } }; var FontFaceObject = (function FontFaceObjectClosure() { function FontFaceObject(translatedData, options) { this.compiledGlyphs = Object.create(null); // importing translated data for (var i in translatedData) { this[i] = translatedData[i]; } this.options = options; } FontFaceObject.prototype = { createNativeFontFace: function FontFaceObject_createNativeFontFace() { if (!this.data) { return null; } if (this.options.disableFontFace) { this.disableFontFace = true; return null; } var nativeFontFace = new FontFace(this.loadedName, this.data, {}); if (this.options.fontRegistry) { this.options.fontRegistry.registerFont(this); } return nativeFontFace; }, createFontFaceRule: function FontFaceObject_createFontFaceRule() { if (!this.data) { return null; } if (this.options.disableFontFace) { this.disableFontFace = true; return null; } var data = bytesToString(new Uint8Array(this.data)); var fontName = this.loadedName; // Add the font-face rule to the document var url = ('url(data:' + this.mimetype + ';base64,' + btoa(data) + ');'); var rule = '@font-face { font-family:"' + fontName + '";src:' + url + '}'; if (this.options.fontRegistry) { this.options.fontRegistry.registerFont(this, url); } return rule; }, getPathGenerator: function FontFaceObject_getPathGenerator(objs, character) { if (!(character in this.compiledGlyphs)) { var cmds = objs.get(this.loadedName + '_path_' + character); var current, i, len; // If we can, compile cmds into JS for MAXIMUM SPEED if (this.options.isEvalSupported && IsEvalSupportedCached.value) { var args, js = ''; for (i = 0, len = cmds.length; i < len; i++) { current = cmds[i]; if (current.args !== undefined) { args = current.args.join(','); } else { args = ''; } js += 'c.' + current.cmd + '(' + args + ');\n'; } /* jshint -W054 */ this.compiledGlyphs[character] = new Function('c', 'size', js); } else { // But fall back on using Function.prototype.apply() if we're // blocked from using eval() for whatever reason (like CSP policies) this.compiledGlyphs[character] = function(c, size) { for (i = 0, len = cmds.length; i < len; i++) { current = cmds[i]; if (current.cmd === 'scale') { current.args = [size, -size]; } c[current.cmd].apply(c, current.args); } }; } } return this.compiledGlyphs[character]; } }; return FontFaceObject; })(); exports.FontFaceObject = FontFaceObject; exports.FontLoader = FontLoader; })); (function (root, factory) { { factory((root.pdfjsDisplayMetadata = {}), root.pdfjsSharedUtil); } }(this, function (exports, sharedUtil) { var error = sharedUtil.error; function fixMetadata(meta) { return meta.replace(/>\\376\\377([^<]+)/g, function(all, codes) { var bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g, function(code, d1, d2, d3) { return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1); }); var chars = ''; for (var i = 0; i < bytes.length; i += 2) { var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1); chars += code >= 32 && code < 127 && code !== 60 && code !== 62 && code !== 38 && false ? String.fromCharCode(code) : '&#x' + (0x10000 + code).toString(16).substring(1) + ';'; } return '>' + chars; }); } function Metadata(meta) { if (typeof meta === 'string') { // Ghostscript produces invalid metadata meta = fixMetadata(meta); var parser = new DOMParser(); meta = parser.parseFromString(meta, 'application/xml'); } else if (!(meta instanceof Document)) { error('Metadata: Invalid metadata object'); } this.metaDocument = meta; this.metadata = Object.create(null); this.parse(); } Metadata.prototype = { parse: function Metadata_parse() { var doc = this.metaDocument; var rdf = doc.documentElement; if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') { // Wrapped in rdf = rdf.firstChild; while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf') { rdf = rdf.nextSibling; } } var nodeName = (rdf) ? rdf.nodeName.toLowerCase() : null; if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes()) { return; } var children = rdf.childNodes, desc, entry, name, i, ii, length, iLength; for (i = 0, length = children.length; i < length; i++) { desc = children[i]; if (desc.nodeName.toLowerCase() !== 'rdf:description') { continue; } for (ii = 0, iLength = desc.childNodes.length; ii < iLength; ii++) { if (desc.childNodes[ii].nodeName.toLowerCase() !== '#text') { entry = desc.childNodes[ii]; name = entry.nodeName.toLowerCase(); this.metadata[name] = entry.textContent.trim(); } } } }, get: function Metadata_get(name) { return this.metadata[name] || null; }, has: function Metadata_has(name) { return typeof this.metadata[name] !== 'undefined'; } }; exports.Metadata = Metadata; })); (function (root, factory) { { factory((root.pdfjsDisplaySVG = {}), root.pdfjsSharedUtil); } }(this, function (exports, sharedUtil) { var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX; var IDENTITY_MATRIX = sharedUtil.IDENTITY_MATRIX; var ImageKind = sharedUtil.ImageKind; var OPS = sharedUtil.OPS; var Util = sharedUtil.Util; var isNum = sharedUtil.isNum; var isArray = sharedUtil.isArray; var warn = sharedUtil.warn; var createObjectURL = sharedUtil.createObjectURL; var SVG_DEFAULTS = { fontStyle: 'normal', fontWeight: 'normal', fillColor: '#000000' }; var convertImgDataToPng = (function convertImgDataToPngClosure() { var PNG_HEADER = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]); var CHUNK_WRAPPER_SIZE = 12; var crcTable = new Int32Array(256); for (var i = 0; i < 256; i++) { var c = i; for (var h = 0; h < 8; h++) { if (c & 1) { c = 0xedB88320 ^ ((c >> 1) & 0x7fffffff); } else { c = (c >> 1) & 0x7fffffff; } } crcTable[i] = c; } function crc32(data, start, end) { var crc = -1; for (var i = start; i < end; i++) { var a = (crc ^ data[i]) & 0xff; var b = crcTable[a]; crc = (crc >>> 8) ^ b; } return crc ^ -1; } function writePngChunk(type, body, data, offset) { var p = offset; var len = body.length; data[p] = len >> 24 & 0xff; data[p + 1] = len >> 16 & 0xff; data[p + 2] = len >> 8 & 0xff; data[p + 3] = len & 0xff; p += 4; data[p] = type.charCodeAt(0) & 0xff; data[p + 1] = type.charCodeAt(1) & 0xff; data[p + 2] = type.charCodeAt(2) & 0xff; data[p + 3] = type.charCodeAt(3) & 0xff; p += 4; data.set(body, p); p += body.length; var crc = crc32(data, offset + 4, p); data[p] = crc >> 24 & 0xff; data[p + 1] = crc >> 16 & 0xff; data[p + 2] = crc >> 8 & 0xff; data[p + 3] = crc & 0xff; } function adler32(data, start, end) { var a = 1; var b = 0; for (var i = start; i < end; ++i) { a = (a + (data[i] & 0xff)) % 65521; b = (b + a) % 65521; } return (b << 16) | a; } function encode(imgData, kind, forceDataSchema) { var width = imgData.width; var height = imgData.height; var bitDepth, colorType, lineSize; var bytes = imgData.data; switch (kind) { case ImageKind.GRAYSCALE_1BPP: colorType = 0; bitDepth = 1; lineSize = (width + 7) >> 3; break; case ImageKind.RGB_24BPP: colorType = 2; bitDepth = 8; lineSize = width * 3; break; case ImageKind.RGBA_32BPP: colorType = 6; bitDepth = 8; lineSize = width * 4; break; default: throw new Error('invalid format'); } // prefix every row with predictor 0 var literals = new Uint8Array((1 + lineSize) * height); var offsetLiterals = 0, offsetBytes = 0; var y, i; for (y = 0; y < height; ++y) { literals[offsetLiterals++] = 0; // no prediction literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize), offsetLiterals); offsetBytes += lineSize; offsetLiterals += lineSize; } if (kind === ImageKind.GRAYSCALE_1BPP) { // inverting for B/W offsetLiterals = 0; for (y = 0; y < height; y++) { offsetLiterals++; // skipping predictor for (i = 0; i < lineSize; i++) { literals[offsetLiterals++] ^= 0xFF; } } } var ihdr = new Uint8Array([ width >> 24 & 0xff, width >> 16 & 0xff, width >> 8 & 0xff, width & 0xff, height >> 24 & 0xff, height >> 16 & 0xff, height >> 8 & 0xff, height & 0xff, bitDepth, // bit depth colorType, // color type 0x00, // compression method 0x00, // filter method 0x00 // interlace method ]); var len = literals.length; var maxBlockLength = 0xFFFF; var deflateBlocks = Math.ceil(len / maxBlockLength); var idat = new Uint8Array(2 + len + deflateBlocks * 5 + 4); var pi = 0; idat[pi++] = 0x78; // compression method and flags idat[pi++] = 0x9c; // flags var pos = 0; while (len > maxBlockLength) { // writing non-final DEFLATE blocks type 0 and length of 65535 idat[pi++] = 0x00; idat[pi++] = 0xff; idat[pi++] = 0xff; idat[pi++] = 0x00; idat[pi++] = 0x00; idat.set(literals.subarray(pos, pos + maxBlockLength), pi); pi += maxBlockLength; pos += maxBlockLength; len -= maxBlockLength; } // writing non-final DEFLATE blocks type 0 idat[pi++] = 0x01; idat[pi++] = len & 0xff; idat[pi++] = len >> 8 & 0xff; idat[pi++] = (~len & 0xffff) & 0xff; idat[pi++] = (~len & 0xffff) >> 8 & 0xff; idat.set(literals.subarray(pos), pi); pi += literals.length - pos; var adler = adler32(literals, 0, literals.length); // checksum idat[pi++] = adler >> 24 & 0xff; idat[pi++] = adler >> 16 & 0xff; idat[pi++] = adler >> 8 & 0xff; idat[pi++] = adler & 0xff; // PNG will consists: header, IHDR+data, IDAT+data, and IEND. var pngLength = PNG_HEADER.length + (CHUNK_WRAPPER_SIZE * 3) + ihdr.length + idat.length; var data = new Uint8Array(pngLength); var offset = 0; data.set(PNG_HEADER, offset); offset += PNG_HEADER.length; writePngChunk('IHDR', ihdr, data, offset); offset += CHUNK_WRAPPER_SIZE + ihdr.length; writePngChunk('IDATA', idat, data, offset); offset += CHUNK_WRAPPER_SIZE + idat.length; writePngChunk('IEND', new Uint8Array(0), data, offset); return createObjectURL(data, 'image/png', forceDataSchema); } return function convertImgDataToPng(imgData, forceDataSchema) { var kind = (imgData.kind === undefined ? ImageKind.GRAYSCALE_1BPP : imgData.kind); return encode(imgData, kind, forceDataSchema); }; })(); var SVGExtraState = (function SVGExtraStateClosure() { function SVGExtraState() { this.fontSizeScale = 1; this.fontWeight = SVG_DEFAULTS.fontWeight; this.fontSize = 0; this.textMatrix = IDENTITY_MATRIX; this.fontMatrix = FONT_IDENTITY_MATRIX; this.leading = 0; // Current point (in user coordinates) this.x = 0; this.y = 0; // Start of text line (in text coordinates) this.lineX = 0; this.lineY = 0; // Character and word spacing this.charSpacing = 0; this.wordSpacing = 0; this.textHScale = 1; this.textRise = 0; // Default foreground and background colors this.fillColor = SVG_DEFAULTS.fillColor; this.strokeColor = '#000000'; this.fillAlpha = 1; this.strokeAlpha = 1; this.lineWidth = 1; this.lineJoin = ''; this.lineCap = ''; this.miterLimit = 0; this.dashArray = []; this.dashPhase = 0; this.dependencies = []; // Clipping this.clipId = ''; this.pendingClip = false; this.maskId = ''; } SVGExtraState.prototype = { clone: function SVGExtraState_clone() { return Object.create(this); }, setCurrentPoint: function SVGExtraState_setCurrentPoint(x, y) { this.x = x; this.y = y; } }; return SVGExtraState; })(); var SVGGraphics = (function SVGGraphicsClosure() { function createScratchSVG(width, height) { var NS = 'http://www.w3.org/2000/svg'; var svg = document.createElementNS(NS, 'svg:svg'); svg.setAttributeNS(null, 'version', '1.1'); svg.setAttributeNS(null, 'width', width + 'px'); svg.setAttributeNS(null, 'height', height + 'px'); svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height); return svg; } function opListToTree(opList) { var opTree = []; var tmp = []; var opListLen = opList.length; for (var x = 0; x < opListLen; x++) { if (opList[x].fn === 'save') { opTree.push({'fnId': 92, 'fn': 'group', 'items': []}); tmp.push(opTree); opTree = opTree[opTree.length - 1].items; continue; } if(opList[x].fn === 'restore') { opTree = tmp.pop(); } else { opTree.push(opList[x]); } } return opTree; } /** * Formats float number. * @param value {number} number to format. * @returns {string} */ function pf(value) { if (value === (value | 0)) { // integer number return value.toString(); } var s = value.toFixed(10); var i = s.length - 1; if (s[i] !== '0') { return s; } // removing trailing zeros do { i--; } while (s[i] === '0'); return s.substr(0, s[i] === '.' ? i : i + 1); } /** * Formats transform matrix. The standard rotation, scale and translate * matrices are replaced by their shorter forms, and for identity matrix * returns empty string to save the memory. * @param m {Array} matrix to format. * @returns {string} */ function pm(m) { if (m[4] === 0 && m[5] === 0) { if (m[1] === 0 && m[2] === 0) { if (m[0] === 1 && m[3] === 1) { return ''; } return 'scale(' + pf(m[0]) + ' ' + pf(m[3]) + ')'; } if (m[0] === m[3] && m[1] === -m[2]) { var a = Math.acos(m[0]) * 180 / Math.PI; return 'rotate(' + pf(a) + ')'; } } else { if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) { return 'translate(' + pf(m[4]) + ' ' + pf(m[5]) + ')'; } } return 'matrix(' + pf(m[0]) + ' ' + pf(m[1]) + ' ' + pf(m[2]) + ' ' + pf(m[3]) + ' ' + pf(m[4]) + ' ' + pf(m[5]) + ')'; } function SVGGraphics(commonObjs, objs, forceDataSchema) { this.current = new SVGExtraState(); this.transformMatrix = IDENTITY_MATRIX; // Graphics state matrix this.transformStack = []; this.extraStack = []; this.commonObjs = commonObjs; this.objs = objs; this.pendingEOFill = false; this.embedFonts = false; this.embeddedFonts = Object.create(null); this.cssStyle = null; this.forceDataSchema = !!forceDataSchema; } var NS = 'http://www.w3.org/2000/svg'; var XML_NS = 'http://www.w3.org/XML/1998/namespace'; var XLINK_NS = 'http://www.w3.org/1999/xlink'; var LINE_CAP_STYLES = ['butt', 'round', 'square']; var LINE_JOIN_STYLES = ['miter', 'round', 'bevel']; var clipCount = 0; var maskCount = 0; SVGGraphics.prototype = { save: function SVGGraphics_save() { this.transformStack.push(this.transformMatrix); var old = this.current; this.extraStack.push(old); this.current = old.clone(); }, restore: function SVGGraphics_restore() { this.transformMatrix = this.transformStack.pop(); this.current = this.extraStack.pop(); this.tgrp = document.createElementNS(NS, 'svg:g'); this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); this.pgrp.appendChild(this.tgrp); }, group: function SVGGraphics_group(items) { this.save(); this.executeOpTree(items); this.restore(); }, loadDependencies: function SVGGraphics_loadDependencies(operatorList) { var fnArray = operatorList.fnArray; var fnArrayLen = fnArray.length; var argsArray = operatorList.argsArray; var self = this; for (var i = 0; i < fnArrayLen; i++) { if (OPS.dependency === fnArray[i]) { var deps = argsArray[i]; for (var n = 0, nn = deps.length; n < nn; n++) { var obj = deps[n]; var common = obj.substring(0, 2) === 'g_'; var promise; if (common) { promise = new Promise(function(resolve) { self.commonObjs.get(obj, resolve); }); } else { promise = new Promise(function(resolve) { self.objs.get(obj, resolve); }); } this.current.dependencies.push(promise); } } } return Promise.all(this.current.dependencies); }, transform: function SVGGraphics_transform(a, b, c, d, e, f) { var transformMatrix = [a, b, c, d, e, f]; this.transformMatrix = Util.transform(this.transformMatrix, transformMatrix); this.tgrp = document.createElementNS(NS, 'svg:g'); this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); }, getSVG: function SVGGraphics_getSVG(operatorList, viewport) { this.svg = createScratchSVG(viewport.width, viewport.height); this.viewport = viewport; return this.loadDependencies(operatorList).then(function () { this.transformMatrix = IDENTITY_MATRIX; this.pgrp = document.createElementNS(NS, 'svg:g'); // Parent group this.pgrp.setAttributeNS(null, 'transform', pm(viewport.transform)); this.tgrp = document.createElementNS(NS, 'svg:g'); // Transform group this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); this.defs = document.createElementNS(NS, 'svg:defs'); this.pgrp.appendChild(this.defs); this.pgrp.appendChild(this.tgrp); this.svg.appendChild(this.pgrp); var opTree = this.convertOpList(operatorList); this.executeOpTree(opTree); return this.svg; }.bind(this)); }, convertOpList: function SVGGraphics_convertOpList(operatorList) { var argsArray = operatorList.argsArray; var fnArray = operatorList.fnArray; var fnArrayLen = fnArray.length; var REVOPS = []; var opList = []; for (var op in OPS) { REVOPS[OPS[op]] = op; } for (var x = 0; x < fnArrayLen; x++) { var fnId = fnArray[x]; opList.push({'fnId' : fnId, 'fn': REVOPS[fnId], 'args': argsArray[x]}); } return opListToTree(opList); }, executeOpTree: function SVGGraphics_executeOpTree(opTree) { var opTreeLen = opTree.length; for(var x = 0; x < opTreeLen; x++) { var fn = opTree[x].fn; var fnId = opTree[x].fnId; var args = opTree[x].args; switch (fnId | 0) { case OPS.beginText: this.beginText(); break; case OPS.setLeading: this.setLeading(args); break; case OPS.setLeadingMoveText: this.setLeadingMoveText(args[0], args[1]); break; case OPS.setFont: this.setFont(args); break; case OPS.showText: this.showText(args[0]); break; case OPS.showSpacedText: this.showText(args[0]); break; case OPS.endText: this.endText(); break; case OPS.moveText: this.moveText(args[0], args[1]); break; case OPS.setCharSpacing: this.setCharSpacing(args[0]); break; case OPS.setWordSpacing: this.setWordSpacing(args[0]); break; case OPS.setHScale: this.setHScale(args[0]); break; case OPS.setTextMatrix: this.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]); break; case OPS.setLineWidth: this.setLineWidth(args[0]); break; case OPS.setLineJoin: this.setLineJoin(args[0]); break; case OPS.setLineCap: this.setLineCap(args[0]); break; case OPS.setMiterLimit: this.setMiterLimit(args[0]); break; case OPS.setFillRGBColor: this.setFillRGBColor(args[0], args[1], args[2]); break; case OPS.setStrokeRGBColor: this.setStrokeRGBColor(args[0], args[1], args[2]); break; case OPS.setDash: this.setDash(args[0], args[1]); break; case OPS.setGState: this.setGState(args[0]); break; case OPS.fill: this.fill(); break; case OPS.eoFill: this.eoFill(); break; case OPS.stroke: this.stroke(); break; case OPS.fillStroke: this.fillStroke(); break; case OPS.eoFillStroke: this.eoFillStroke(); break; case OPS.clip: this.clip('nonzero'); break; case OPS.eoClip: this.clip('evenodd'); break; case OPS.paintSolidColorImageMask: this.paintSolidColorImageMask(); break; case OPS.paintJpegXObject: this.paintJpegXObject(args[0], args[1], args[2]); break; case OPS.paintImageXObject: this.paintImageXObject(args[0]); break; case OPS.paintInlineImageXObject: this.paintInlineImageXObject(args[0]); break; case OPS.paintImageMaskXObject: this.paintImageMaskXObject(args[0]); break; case OPS.paintFormXObjectBegin: this.paintFormXObjectBegin(args[0], args[1]); break; case OPS.paintFormXObjectEnd: this.paintFormXObjectEnd(); break; case OPS.closePath: this.closePath(); break; case OPS.closeStroke: this.closeStroke(); break; case OPS.closeFillStroke: this.closeFillStroke(); break; case OPS.nextLine: this.nextLine(); break; case OPS.transform: this.transform(args[0], args[1], args[2], args[3], args[4], args[5]); break; case OPS.constructPath: this.constructPath(args[0], args[1]); break; case OPS.endPath: this.endPath(); break; case 92: this.group(opTree[x].items); break; default: warn('Unimplemented method '+ fn); break; } } }, setWordSpacing: function SVGGraphics_setWordSpacing(wordSpacing) { this.current.wordSpacing = wordSpacing; }, setCharSpacing: function SVGGraphics_setCharSpacing(charSpacing) { this.current.charSpacing = charSpacing; }, nextLine: function SVGGraphics_nextLine() { this.moveText(0, this.current.leading); }, setTextMatrix: function SVGGraphics_setTextMatrix(a, b, c, d, e, f) { var current = this.current; this.current.textMatrix = this.current.lineMatrix = [a, b, c, d, e, f]; this.current.x = this.current.lineX = 0; this.current.y = this.current.lineY = 0; current.xcoords = []; current.tspan = document.createElementNS(NS, 'svg:tspan'); current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); current.tspan.setAttributeNS(null, 'font-size', pf(current.fontSize) + 'px'); current.tspan.setAttributeNS(null, 'y', pf(-current.y)); current.txtElement = document.createElementNS(NS, 'svg:text'); current.txtElement.appendChild(current.tspan); }, beginText: function SVGGraphics_beginText() { this.current.x = this.current.lineX = 0; this.current.y = this.current.lineY = 0; this.current.textMatrix = IDENTITY_MATRIX; this.current.lineMatrix = IDENTITY_MATRIX; this.current.tspan = document.createElementNS(NS, 'svg:tspan'); this.current.txtElement = document.createElementNS(NS, 'svg:text'); this.current.txtgrp = document.createElementNS(NS, 'svg:g'); this.current.xcoords = []; }, moveText: function SVGGraphics_moveText(x, y) { var current = this.current; this.current.x = this.current.lineX += x; this.current.y = this.current.lineY += y; current.xcoords = []; current.tspan = document.createElementNS(NS, 'svg:tspan'); current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); current.tspan.setAttributeNS(null, 'font-size', pf(current.fontSize) + 'px'); current.tspan.setAttributeNS(null, 'y', pf(-current.y)); }, showText: function SVGGraphics_showText(glyphs) { var current = this.current; var font = current.font; var fontSize = current.fontSize; if (fontSize === 0) { return; } var charSpacing = current.charSpacing; var wordSpacing = current.wordSpacing; var fontDirection = current.fontDirection; var textHScale = current.textHScale * fontDirection; var glyphsLength = glyphs.length; var vertical = font.vertical; var widthAdvanceScale = fontSize * current.fontMatrix[0]; var x = 0, i; for (i = 0; i < glyphsLength; ++i) { var glyph = glyphs[i]; if (glyph === null) { // word break x += fontDirection * wordSpacing; continue; } else if (isNum(glyph)) { x += -glyph * fontSize * 0.001; continue; } current.xcoords.push(current.x + x * textHScale); var width = glyph.width; var character = glyph.fontChar; var charWidth = width * widthAdvanceScale + charSpacing * fontDirection; x += charWidth; current.tspan.textContent += character; } if (vertical) { current.y -= x * textHScale; } else { current.x += x * textHScale; } current.tspan.setAttributeNS(null, 'x', current.xcoords.map(pf).join(' ')); current.tspan.setAttributeNS(null, 'y', pf(-current.y)); current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); current.tspan.setAttributeNS(null, 'font-size', pf(current.fontSize) + 'px'); if (current.fontStyle !== SVG_DEFAULTS.fontStyle) { current.tspan.setAttributeNS(null, 'font-style', current.fontStyle); } if (current.fontWeight !== SVG_DEFAULTS.fontWeight) { current.tspan.setAttributeNS(null, 'font-weight', current.fontWeight); } if (current.fillColor !== SVG_DEFAULTS.fillColor) { current.tspan.setAttributeNS(null, 'fill', current.fillColor); } current.txtElement.setAttributeNS(null, 'transform', pm(current.textMatrix) + ' scale(1, -1)' ); current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve'); current.txtElement.appendChild(current.tspan); current.txtgrp.appendChild(current.txtElement); this.tgrp.appendChild(current.txtElement); }, setLeadingMoveText: function SVGGraphics_setLeadingMoveText(x, y) { this.setLeading(-y); this.moveText(x, y); }, addFontStyle: function SVGGraphics_addFontStyle(fontObj) { if (!this.cssStyle) { this.cssStyle = document.createElementNS(NS, 'svg:style'); this.cssStyle.setAttributeNS(null, 'type', 'text/css'); this.defs.appendChild(this.cssStyle); } var url = createObjectURL(fontObj.data, fontObj.mimetype, this.forceDataSchema); this.cssStyle.textContent += '@font-face { font-family: "' + fontObj.loadedName + '";' + ' src: url(' + url + '); }\n'; }, setFont: function SVGGraphics_setFont(details) { var current = this.current; var fontObj = this.commonObjs.get(details[0]); var size = details[1]; this.current.font = fontObj; if (this.embedFonts && fontObj.data && !this.embeddedFonts[fontObj.loadedName]) { this.addFontStyle(fontObj); this.embeddedFonts[fontObj.loadedName] = fontObj; } current.fontMatrix = (fontObj.fontMatrix ? fontObj.fontMatrix : FONT_IDENTITY_MATRIX); var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') : (fontObj.bold ? 'bold' : 'normal'); var italic = fontObj.italic ? 'italic' : 'normal'; if (size < 0) { size = -size; current.fontDirection = -1; } else { current.fontDirection = 1; } current.fontSize = size; current.fontFamily = fontObj.loadedName; current.fontWeight = bold; current.fontStyle = italic; current.tspan = document.createElementNS(NS, 'svg:tspan'); current.tspan.setAttributeNS(null, 'y', pf(-current.y)); current.xcoords = []; }, endText: function SVGGraphics_endText() { if (this.current.pendingClip) { this.cgrp.appendChild(this.tgrp); this.pgrp.appendChild(this.cgrp); } else { this.pgrp.appendChild(this.tgrp); } this.tgrp = document.createElementNS(NS, 'svg:g'); this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); }, // Path properties setLineWidth: function SVGGraphics_setLineWidth(width) { this.current.lineWidth = width; }, setLineCap: function SVGGraphics_setLineCap(style) { this.current.lineCap = LINE_CAP_STYLES[style]; }, setLineJoin: function SVGGraphics_setLineJoin(style) { this.current.lineJoin = LINE_JOIN_STYLES[style]; }, setMiterLimit: function SVGGraphics_setMiterLimit(limit) { this.current.miterLimit = limit; }, setStrokeRGBColor: function SVGGraphics_setStrokeRGBColor(r, g, b) { var color = Util.makeCssRgb(r, g, b); this.current.strokeColor = color; }, setFillRGBColor: function SVGGraphics_setFillRGBColor(r, g, b) { var color = Util.makeCssRgb(r, g, b); this.current.fillColor = color; this.current.tspan = document.createElementNS(NS, 'svg:tspan'); this.current.xcoords = []; }, setDash: function SVGGraphics_setDash(dashArray, dashPhase) { this.current.dashArray = dashArray; this.current.dashPhase = dashPhase; }, constructPath: function SVGGraphics_constructPath(ops, args) { var current = this.current; var x = current.x, y = current.y; current.path = document.createElementNS(NS, 'svg:path'); var d = []; var opLength = ops.length; for (var i = 0, j = 0; i < opLength; i++) { switch (ops[i] | 0) { case OPS.rectangle: x = args[j++]; y = args[j++]; var width = args[j++]; var height = args[j++]; var xw = x + width; var yh = y + height; d.push('M', pf(x), pf(y), 'L', pf(xw) , pf(y), 'L', pf(xw), pf(yh), 'L', pf(x), pf(yh), 'Z'); break; case OPS.moveTo: x = args[j++]; y = args[j++]; d.push('M', pf(x), pf(y)); break; case OPS.lineTo: x = args[j++]; y = args[j++]; d.push('L', pf(x) , pf(y)); break; case OPS.curveTo: x = args[j + 4]; y = args[j + 5]; d.push('C', pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), pf(args[j + 3]), pf(x), pf(y)); j += 6; break; case OPS.curveTo2: x = args[j + 2]; y = args[j + 3]; d.push('C', pf(x), pf(y), pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), pf(args[j + 3])); j += 4; break; case OPS.curveTo3: x = args[j + 2]; y = args[j + 3]; d.push('C', pf(args[j]), pf(args[j + 1]), pf(x), pf(y), pf(x), pf(y)); j += 4; break; case OPS.closePath: d.push('Z'); break; } } current.path.setAttributeNS(null, 'd', d.join(' ')); current.path.setAttributeNS(null, 'stroke-miterlimit', pf(current.miterLimit)); current.path.setAttributeNS(null, 'stroke-linecap', current.lineCap); current.path.setAttributeNS(null, 'stroke-linejoin', current.lineJoin); current.path.setAttributeNS(null, 'stroke-width', pf(current.lineWidth) + 'px'); current.path.setAttributeNS(null, 'stroke-dasharray', current.dashArray.map(pf).join(' ')); current.path.setAttributeNS(null, 'stroke-dashoffset', pf(current.dashPhase) + 'px'); current.path.setAttributeNS(null, 'fill', 'none'); this.tgrp.appendChild(current.path); if (current.pendingClip) { this.cgrp.appendChild(this.tgrp); this.pgrp.appendChild(this.cgrp); } else { this.pgrp.appendChild(this.tgrp); } // Saving a reference in current.element so that it can be addressed // in 'fill' and 'stroke' current.element = current.path; current.setCurrentPoint(x, y); }, endPath: function SVGGraphics_endPath() { var current = this.current; if (current.pendingClip) { this.cgrp.appendChild(this.tgrp); this.pgrp.appendChild(this.cgrp); } else { this.pgrp.appendChild(this.tgrp); } this.tgrp = document.createElementNS(NS, 'svg:g'); this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); }, clip: function SVGGraphics_clip(type) { var current = this.current; // Add current path to clipping path current.clipId = 'clippath' + clipCount; clipCount++; this.clippath = document.createElementNS(NS, 'svg:clipPath'); this.clippath.setAttributeNS(null, 'id', current.clipId); var clipElement = current.element.cloneNode(); if (type === 'evenodd') { clipElement.setAttributeNS(null, 'clip-rule', 'evenodd'); } else { clipElement.setAttributeNS(null, 'clip-rule', 'nonzero'); } this.clippath.setAttributeNS(null, 'transform', pm(this.transformMatrix)); this.clippath.appendChild(clipElement); this.defs.appendChild(this.clippath); // Create a new group with that attribute current.pendingClip = true; this.cgrp = document.createElementNS(NS, 'svg:g'); this.cgrp.setAttributeNS(null, 'clip-path', 'url(#' + current.clipId + ')'); this.pgrp.appendChild(this.cgrp); }, closePath: function SVGGraphics_closePath() { var current = this.current; var d = current.path.getAttributeNS(null, 'd'); d += 'Z'; current.path.setAttributeNS(null, 'd', d); }, setLeading: function SVGGraphics_setLeading(leading) { this.current.leading = -leading; }, setTextRise: function SVGGraphics_setTextRise(textRise) { this.current.textRise = textRise; }, setHScale: function SVGGraphics_setHScale(scale) { this.current.textHScale = scale / 100; }, setGState: function SVGGraphics_setGState(states) { for (var i = 0, ii = states.length; i < ii; i++) { var state = states[i]; var key = state[0]; var value = state[1]; switch (key) { case 'LW': this.setLineWidth(value); break; case 'LC': this.setLineCap(value); break; case 'LJ': this.setLineJoin(value); break; case 'ML': this.setMiterLimit(value); break; case 'D': this.setDash(value[0], value[1]); break; case 'RI': break; case 'FL': break; case 'Font': this.setFont(value); break; case 'CA': break; case 'ca': break; case 'BM': break; case 'SMask': break; } } }, fill: function SVGGraphics_fill() { var current = this.current; current.element.setAttributeNS(null, 'fill', current.fillColor); }, stroke: function SVGGraphics_stroke() { var current = this.current; current.element.setAttributeNS(null, 'stroke', current.strokeColor); current.element.setAttributeNS(null, 'fill', 'none'); }, eoFill: function SVGGraphics_eoFill() { var current = this.current; current.element.setAttributeNS(null, 'fill', current.fillColor); current.element.setAttributeNS(null, 'fill-rule', 'evenodd'); }, fillStroke: function SVGGraphics_fillStroke() { // Order is important since stroke wants fill to be none. // First stroke, then if fill needed, it will be overwritten. this.stroke(); this.fill(); }, eoFillStroke: function SVGGraphics_eoFillStroke() { this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd'); this.fillStroke(); }, closeStroke: function SVGGraphics_closeStroke() { this.closePath(); this.stroke(); }, closeFillStroke: function SVGGraphics_closeFillStroke() { this.closePath(); this.fillStroke(); }, paintSolidColorImageMask: function SVGGraphics_paintSolidColorImageMask() { var current = this.current; var rect = document.createElementNS(NS, 'svg:rect'); rect.setAttributeNS(null, 'x', '0'); rect.setAttributeNS(null, 'y', '0'); rect.setAttributeNS(null, 'width', '1px'); rect.setAttributeNS(null, 'height', '1px'); rect.setAttributeNS(null, 'fill', current.fillColor); this.tgrp.appendChild(rect); }, paintJpegXObject: function SVGGraphics_paintJpegXObject(objId, w, h) { var current = this.current; var imgObj = this.objs.get(objId); var imgEl = document.createElementNS(NS, 'svg:image'); imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgObj.src); imgEl.setAttributeNS(null, 'width', imgObj.width + 'px'); imgEl.setAttributeNS(null, 'height', imgObj.height + 'px'); imgEl.setAttributeNS(null, 'x', '0'); imgEl.setAttributeNS(null, 'y', pf(-h)); imgEl.setAttributeNS(null, 'transform', 'scale(' + pf(1 / w) + ' ' + pf(-1 / h) + ')'); this.tgrp.appendChild(imgEl); if (current.pendingClip) { this.cgrp.appendChild(this.tgrp); this.pgrp.appendChild(this.cgrp); } else { this.pgrp.appendChild(this.tgrp); } }, paintImageXObject: function SVGGraphics_paintImageXObject(objId) { var imgData = this.objs.get(objId); if (!imgData) { warn('Dependent image isn\'t ready yet'); return; } this.paintInlineImageXObject(imgData); }, paintInlineImageXObject: function SVGGraphics_paintInlineImageXObject(imgData, mask) { var current = this.current; var width = imgData.width; var height = imgData.height; var imgSrc = convertImgDataToPng(imgData, this.forceDataSchema); var cliprect = document.createElementNS(NS, 'svg:rect'); cliprect.setAttributeNS(null, 'x', '0'); cliprect.setAttributeNS(null, 'y', '0'); cliprect.setAttributeNS(null, 'width', pf(width)); cliprect.setAttributeNS(null, 'height', pf(height)); current.element = cliprect; this.clip('nonzero'); var imgEl = document.createElementNS(NS, 'svg:image'); imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgSrc); imgEl.setAttributeNS(null, 'x', '0'); imgEl.setAttributeNS(null, 'y', pf(-height)); imgEl.setAttributeNS(null, 'width', pf(width) + 'px'); imgEl.setAttributeNS(null, 'height', pf(height) + 'px'); imgEl.setAttributeNS(null, 'transform', 'scale(' + pf(1 / width) + ' ' + pf(-1 / height) + ')'); if (mask) { mask.appendChild(imgEl); } else { this.tgrp.appendChild(imgEl); } if (current.pendingClip) { this.cgrp.appendChild(this.tgrp); this.pgrp.appendChild(this.cgrp); } else { this.pgrp.appendChild(this.tgrp); } }, paintImageMaskXObject: function SVGGraphics_paintImageMaskXObject(imgData) { var current = this.current; var width = imgData.width; var height = imgData.height; var fillColor = current.fillColor; current.maskId = 'mask' + maskCount++; var mask = document.createElementNS(NS, 'svg:mask'); mask.setAttributeNS(null, 'id', current.maskId); var rect = document.createElementNS(NS, 'svg:rect'); rect.setAttributeNS(null, 'x', '0'); rect.setAttributeNS(null, 'y', '0'); rect.setAttributeNS(null, 'width', pf(width)); rect.setAttributeNS(null, 'height', pf(height)); rect.setAttributeNS(null, 'fill', fillColor); rect.setAttributeNS(null, 'mask', 'url(#' + current.maskId +')'); this.defs.appendChild(mask); this.tgrp.appendChild(rect); this.paintInlineImageXObject(imgData, mask); }, paintFormXObjectBegin: function SVGGraphics_paintFormXObjectBegin(matrix, bbox) { this.save(); if (isArray(matrix) && matrix.length === 6) { this.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]); } if (isArray(bbox) && bbox.length === 4) { var width = bbox[2] - bbox[0]; var height = bbox[3] - bbox[1]; var cliprect = document.createElementNS(NS, 'svg:rect'); cliprect.setAttributeNS(null, 'x', bbox[0]); cliprect.setAttributeNS(null, 'y', bbox[1]); cliprect.setAttributeNS(null, 'width', pf(width)); cliprect.setAttributeNS(null, 'height', pf(height)); this.current.element = cliprect; this.clip('nonzero'); this.endPath(); } }, paintFormXObjectEnd: function SVGGraphics_paintFormXObjectEnd() { this.restore(); } }; return SVGGraphics; })(); exports.SVGGraphics = SVGGraphics; })); (function (root, factory) { { factory((root.pdfjsDisplayAnnotationLayer = {}), root.pdfjsSharedUtil, root.pdfjsDisplayDOMUtils); } }(this, function (exports, sharedUtil, displayDOMUtils) { var AnnotationBorderStyleType = sharedUtil.AnnotationBorderStyleType; var AnnotationType = sharedUtil.AnnotationType; var Util = sharedUtil.Util; var addLinkAttributes = displayDOMUtils.addLinkAttributes; var getFilenameFromUrl = displayDOMUtils.getFilenameFromUrl; var warn = sharedUtil.warn; var CustomStyle = displayDOMUtils.CustomStyle; var getDefaultSetting = displayDOMUtils.getDefaultSetting; /** * @typedef {Object} AnnotationElementParameters * @property {Object} data * @property {HTMLDivElement} layer * @property {PDFPage} page * @property {PageViewport} viewport * @property {IPDFLinkService} linkService * @property {DownloadManager} downloadManager */ /** * @class * @alias AnnotationElementFactory */ function AnnotationElementFactory() {} AnnotationElementFactory.prototype = /** @lends AnnotationElementFactory.prototype */ { /** * @param {AnnotationElementParameters} parameters * @returns {AnnotationElement} */ create: function AnnotationElementFactory_create(parameters) { var subtype = parameters.data.annotationType; switch (subtype) { case AnnotationType.LINK: return new LinkAnnotationElement(parameters); case AnnotationType.TEXT: return new TextAnnotationElement(parameters); case AnnotationType.WIDGET: return new WidgetAnnotationElement(parameters); case AnnotationType.POPUP: return new PopupAnnotationElement(parameters); case AnnotationType.HIGHLIGHT: return new HighlightAnnotationElement(parameters); case AnnotationType.UNDERLINE: return new UnderlineAnnotationElement(parameters); case AnnotationType.SQUIGGLY: return new SquigglyAnnotationElement(parameters); case AnnotationType.STRIKEOUT: return new StrikeOutAnnotationElement(parameters); case AnnotationType.FILEATTACHMENT: return new FileAttachmentAnnotationElement(parameters); default: return new AnnotationElement(parameters); } } }; /** * @class * @alias AnnotationElement */ var AnnotationElement = (function AnnotationElementClosure() { function AnnotationElement(parameters, isRenderable) { this.isRenderable = isRenderable || false; this.data = parameters.data; this.layer = parameters.layer; this.page = parameters.page; this.viewport = parameters.viewport; this.linkService = parameters.linkService; this.downloadManager = parameters.downloadManager; this.imageResourcesPath = parameters.imageResourcesPath; if (isRenderable) { this.container = this._createContainer(); } } AnnotationElement.prototype = /** @lends AnnotationElement.prototype */ { /** * Create an empty container for the annotation's HTML element. * * @private * @memberof AnnotationElement * @returns {HTMLSectionElement} */ _createContainer: function AnnotationElement_createContainer() { var data = this.data, page = this.page, viewport = this.viewport; var container = document.createElement('section'); var width = data.rect[2] - data.rect[0]; var height = data.rect[3] - data.rect[1]; container.setAttribute('data-annotation-id', data.id); // Do *not* modify `data.rect`, since that will corrupt the annotation // position on subsequent calls to `_createContainer` (see issue 6804). var rect = Util.normalizeRect([ data.rect[0], page.view[3] - data.rect[1] + page.view[1], data.rect[2], page.view[3] - data.rect[3] + page.view[1] ]); CustomStyle.setProp('transform', container, 'matrix(' + viewport.transform.join(',') + ')'); CustomStyle.setProp('transformOrigin', container, -rect[0] + 'px ' + -rect[1] + 'px'); if (data.borderStyle.width > 0) { container.style.borderWidth = data.borderStyle.width + 'px'; if (data.borderStyle.style !== AnnotationBorderStyleType.UNDERLINE) { // Underline styles only have a bottom border, so we do not need // to adjust for all borders. This yields a similar result as // Adobe Acrobat/Reader. width = width - 2 * data.borderStyle.width; height = height - 2 * data.borderStyle.width; } var horizontalRadius = data.borderStyle.horizontalCornerRadius; var verticalRadius = data.borderStyle.verticalCornerRadius; if (horizontalRadius > 0 || verticalRadius > 0) { var radius = horizontalRadius + 'px / ' + verticalRadius + 'px'; CustomStyle.setProp('borderRadius', container, radius); } switch (data.borderStyle.style) { case AnnotationBorderStyleType.SOLID: container.style.borderStyle = 'solid'; break; case AnnotationBorderStyleType.DASHED: container.style.borderStyle = 'dashed'; break; case AnnotationBorderStyleType.BEVELED: warn('Unimplemented border style: beveled'); break; case AnnotationBorderStyleType.INSET: warn('Unimplemented border style: inset'); break; case AnnotationBorderStyleType.UNDERLINE: container.style.borderBottomStyle = 'solid'; break; default: break; } if (data.color) { container.style.borderColor = Util.makeCssRgb(data.color[0] | 0, data.color[1] | 0, data.color[2] | 0); } else { // Transparent (invisible) border, so do not draw it at all. container.style.borderWidth = 0; } } container.style.left = rect[0] + 'px'; container.style.top = rect[1] + 'px'; container.style.width = width + 'px'; container.style.height = height + 'px'; return container; }, /** * Create a popup for the annotation's HTML element. This is used for * annotations that do not have a Popup entry in the dictionary, but * are of a type that works with popups (such as Highlight annotations). * * @private * @param {HTMLSectionElement} container * @param {HTMLDivElement|HTMLImageElement|null} trigger * @param {Object} data * @memberof AnnotationElement */ _createPopup: function AnnotationElement_createPopup(container, trigger, data) { // If no trigger element is specified, create it. if (!trigger) { trigger = document.createElement('div'); trigger.style.height = container.style.height; trigger.style.width = container.style.width; container.appendChild(trigger); } var popupElement = new PopupElement({ container: container, trigger: trigger, color: data.color, title: data.title, contents: data.contents, hideWrapper: true }); var popup = popupElement.render(); // Position the popup next to the annotation's container. popup.style.left = container.style.width; container.appendChild(popup); }, /** * Render the annotation's HTML element in the empty container. * * @public * @memberof AnnotationElement */ render: function AnnotationElement_render() { throw new Error('Abstract method AnnotationElement.render called'); } }; return AnnotationElement; })(); /** * @class * @alias LinkAnnotationElement */ var LinkAnnotationElement = (function LinkAnnotationElementClosure() { function LinkAnnotationElement(parameters) { AnnotationElement.call(this, parameters, true); } Util.inherit(LinkAnnotationElement, AnnotationElement, { /** * Render the link annotation's HTML element in the empty container. * * @public * @memberof LinkAnnotationElement * @returns {HTMLSectionElement} */ render: function LinkAnnotationElement_render() { this.container.className = 'linkAnnotation'; var link = document.createElement('a'); addLinkAttributes(link, { url: this.data.url }); if (!this.data.url) { if (this.data.action) { this._bindNamedAction(link, this.data.action); } else { this._bindLink(link, ('dest' in this.data) ? this.data.dest : null); } } this.container.appendChild(link); return this.container; }, /** * Bind internal links to the link element. * * @private * @param {Object} link * @param {Object} destination * @memberof LinkAnnotationElement */ _bindLink: function LinkAnnotationElement_bindLink(link, destination) { var self = this; link.href = this.linkService.getDestinationHash(destination); link.onclick = function() { if (destination) { self.linkService.navigateTo(destination); } return false; }; if (destination) { link.className = 'internalLink'; } }, /** * Bind named actions to the link element. * * @private * @param {Object} link * @param {Object} action * @memberof LinkAnnotationElement */ _bindNamedAction: function LinkAnnotationElement_bindNamedAction(link, action) { var self = this; link.href = this.linkService.getAnchorUrl(''); link.onclick = function() { self.linkService.executeNamedAction(action); return false; }; link.className = 'internalLink'; } }); return LinkAnnotationElement; })(); /** * @class * @alias TextAnnotationElement */ var TextAnnotationElement = (function TextAnnotationElementClosure() { function TextAnnotationElement(parameters) { var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); AnnotationElement.call(this, parameters, isRenderable); } Util.inherit(TextAnnotationElement, AnnotationElement, { /** * Render the text annotation's HTML element in the empty container. * * @public * @memberof TextAnnotationElement * @returns {HTMLSectionElement} */ render: function TextAnnotationElement_render() { this.container.className = 'textAnnotation'; var image = document.createElement('img'); image.style.height = this.container.style.height; image.style.width = this.container.style.width; image.src = this.imageResourcesPath + 'annotation-' + this.data.name.toLowerCase() + '.svg'; image.alt = '[{{type}} Annotation]'; image.dataset.l10nId = 'text_annotation_type'; image.dataset.l10nArgs = JSON.stringify({type: this.data.name}); if (!this.data.hasPopup) { this._createPopup(this.container, image, this.data); } this.container.appendChild(image); return this.container; } }); return TextAnnotationElement; })(); /** * @class * @alias WidgetAnnotationElement */ var WidgetAnnotationElement = (function WidgetAnnotationElementClosure() { function WidgetAnnotationElement(parameters) { var isRenderable = !parameters.data.hasAppearance && !!parameters.data.fieldValue; AnnotationElement.call(this, parameters, isRenderable); } Util.inherit(WidgetAnnotationElement, AnnotationElement, { /** * Render the widget annotation's HTML element in the empty container. * * @public * @memberof WidgetAnnotationElement * @returns {HTMLSectionElement} */ render: function WidgetAnnotationElement_render() { var content = document.createElement('div'); content.textContent = this.data.fieldValue; var textAlignment = this.data.textAlignment; content.style.textAlign = ['left', 'center', 'right'][textAlignment]; content.style.verticalAlign = 'middle'; content.style.display = 'table-cell'; var font = (this.data.fontRefName ? this.page.commonObjs.getData(this.data.fontRefName) : null); this._setTextStyle(content, font); this.container.appendChild(content); return this.container; }, /** * Apply text styles to the text in the element. * * @private * @param {HTMLDivElement} element * @param {Object} font * @memberof WidgetAnnotationElement */ _setTextStyle: function WidgetAnnotationElement_setTextStyle(element, font) { // TODO: This duplicates some of the logic in CanvasGraphics.setFont(). var style = element.style; style.fontSize = this.data.fontSize + 'px'; style.direction = (this.data.fontDirection < 0 ? 'rtl': 'ltr'); if (!font) { return; } style.fontWeight = (font.black ? (font.bold ? '900' : 'bold') : (font.bold ? 'bold' : 'normal')); style.fontStyle = (font.italic ? 'italic' : 'normal'); // Use a reasonable default font if the font doesn't specify a fallback. var fontFamily = font.loadedName ? '"' + font.loadedName + '", ' : ''; var fallbackName = font.fallbackName || 'Helvetica, sans-serif'; style.fontFamily = fontFamily + fallbackName; } }); return WidgetAnnotationElement; })(); /** * @class * @alias PopupAnnotationElement */ var PopupAnnotationElement = (function PopupAnnotationElementClosure() { function PopupAnnotationElement(parameters) { var isRenderable = !!(parameters.data.title || parameters.data.contents); AnnotationElement.call(this, parameters, isRenderable); } Util.inherit(PopupAnnotationElement, AnnotationElement, { /** * Render the popup annotation's HTML element in the empty container. * * @public * @memberof PopupAnnotationElement * @returns {HTMLSectionElement} */ render: function PopupAnnotationElement_render() { this.container.className = 'popupAnnotation'; var selector = '[data-annotation-id="' + this.data.parentId + '"]'; var parentElement = this.layer.querySelector(selector); if (!parentElement) { return this.container; } var popup = new PopupElement({ container: this.container, trigger: parentElement, color: this.data.color, title: this.data.title, contents: this.data.contents }); // Position the popup next to the parent annotation's container. // PDF viewers ignore a popup annotation's rectangle. var parentLeft = parseFloat(parentElement.style.left); var parentWidth = parseFloat(parentElement.style.width); CustomStyle.setProp('transformOrigin', this.container, -(parentLeft + parentWidth) + 'px -' + parentElement.style.top); this.container.style.left = (parentLeft + parentWidth) + 'px'; this.container.appendChild(popup.render()); return this.container; } }); return PopupAnnotationElement; })(); /** * @class * @alias PopupElement */ var PopupElement = (function PopupElementClosure() { var BACKGROUND_ENLIGHT = 0.7; function PopupElement(parameters) { this.container = parameters.container; this.trigger = parameters.trigger; this.color = parameters.color; this.title = parameters.title; this.contents = parameters.contents; this.hideWrapper = parameters.hideWrapper || false; this.pinned = false; } PopupElement.prototype = /** @lends PopupElement.prototype */ { /** * Render the popup's HTML element. * * @public * @memberof PopupElement * @returns {HTMLSectionElement} */ render: function PopupElement_render() { var wrapper = document.createElement('div'); wrapper.className = 'popupWrapper'; // For Popup annotations we hide the entire section because it contains // only the popup. However, for Text annotations without a separate Popup // annotation, we cannot hide the entire container as the image would // disappear too. In that special case, hiding the wrapper suffices. this.hideElement = (this.hideWrapper ? wrapper : this.container); this.hideElement.setAttribute('hidden', true); var popup = document.createElement('div'); popup.className = 'popup'; var color = this.color; if (color) { // Enlighten the color. var r = BACKGROUND_ENLIGHT * (255 - color[0]) + color[0]; var g = BACKGROUND_ENLIGHT * (255 - color[1]) + color[1]; var b = BACKGROUND_ENLIGHT * (255 - color[2]) + color[2]; popup.style.backgroundColor = Util.makeCssRgb(r | 0, g | 0, b | 0); } var contents = this._formatContents(this.contents); var title = document.createElement('h1'); title.textContent = this.title; // Attach the event listeners to the trigger element. this.trigger.addEventListener('click', this._toggle.bind(this)); this.trigger.addEventListener('mouseover', this._show.bind(this, false)); this.trigger.addEventListener('mouseout', this._hide.bind(this, false)); popup.addEventListener('click', this._hide.bind(this, true)); popup.appendChild(title); popup.appendChild(contents); wrapper.appendChild(popup); return wrapper; }, /** * Format the contents of the popup by adding newlines where necessary. * * @private * @param {string} contents * @memberof PopupElement * @returns {HTMLParagraphElement} */ _formatContents: function PopupElement_formatContents(contents) { var p = document.createElement('p'); var lines = contents.split(/(?:\r\n?|\n)/); for (var i = 0, ii = lines.length; i < ii; ++i) { var line = lines[i]; p.appendChild(document.createTextNode(line)); if (i < (ii - 1)) { p.appendChild(document.createElement('br')); } } return p; }, /** * Toggle the visibility of the popup. * * @private * @memberof PopupElement */ _toggle: function PopupElement_toggle() { if (this.pinned) { this._hide(true); } else { this._show(true); } }, /** * Show the popup. * * @private * @param {boolean} pin * @memberof PopupElement */ _show: function PopupElement_show(pin) { if (pin) { this.pinned = true; } if (this.hideElement.hasAttribute('hidden')) { this.hideElement.removeAttribute('hidden'); this.container.style.zIndex += 1; } }, /** * Hide the popup. * * @private * @param {boolean} unpin * @memberof PopupElement */ _hide: function PopupElement_hide(unpin) { if (unpin) { this.pinned = false; } if (!this.hideElement.hasAttribute('hidden') && !this.pinned) { this.hideElement.setAttribute('hidden', true); this.container.style.zIndex -= 1; } } }; return PopupElement; })(); /** * @class * @alias HighlightAnnotationElement */ var HighlightAnnotationElement = ( function HighlightAnnotationElementClosure() { function HighlightAnnotationElement(parameters) { var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); AnnotationElement.call(this, parameters, isRenderable); } Util.inherit(HighlightAnnotationElement, AnnotationElement, { /** * Render the highlight annotation's HTML element in the empty container. * * @public * @memberof HighlightAnnotationElement * @returns {HTMLSectionElement} */ render: function HighlightAnnotationElement_render() { this.container.className = 'highlightAnnotation'; if (!this.data.hasPopup) { this._createPopup(this.container, null, this.data); } return this.container; } }); return HighlightAnnotationElement; })(); /** * @class * @alias UnderlineAnnotationElement */ var UnderlineAnnotationElement = ( function UnderlineAnnotationElementClosure() { function UnderlineAnnotationElement(parameters) { var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); AnnotationElement.call(this, parameters, isRenderable); } Util.inherit(UnderlineAnnotationElement, AnnotationElement, { /** * Render the underline annotation's HTML element in the empty container. * * @public * @memberof UnderlineAnnotationElement * @returns {HTMLSectionElement} */ render: function UnderlineAnnotationElement_render() { this.container.className = 'underlineAnnotation'; if (!this.data.hasPopup) { this._createPopup(this.container, null, this.data); } return this.container; } }); return UnderlineAnnotationElement; })(); /** * @class * @alias SquigglyAnnotationElement */ var SquigglyAnnotationElement = (function SquigglyAnnotationElementClosure() { function SquigglyAnnotationElement(parameters) { var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); AnnotationElement.call(this, parameters, isRenderable); } Util.inherit(SquigglyAnnotationElement, AnnotationElement, { /** * Render the squiggly annotation's HTML element in the empty container. * * @public * @memberof SquigglyAnnotationElement * @returns {HTMLSectionElement} */ render: function SquigglyAnnotationElement_render() { this.container.className = 'squigglyAnnotation'; if (!this.data.hasPopup) { this._createPopup(this.container, null, this.data); } return this.container; } }); return SquigglyAnnotationElement; })(); /** * @class * @alias StrikeOutAnnotationElement */ var StrikeOutAnnotationElement = ( function StrikeOutAnnotationElementClosure() { function StrikeOutAnnotationElement(parameters) { var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); AnnotationElement.call(this, parameters, isRenderable); } Util.inherit(StrikeOutAnnotationElement, AnnotationElement, { /** * Render the strikeout annotation's HTML element in the empty container. * * @public * @memberof StrikeOutAnnotationElement * @returns {HTMLSectionElement} */ render: function StrikeOutAnnotationElement_render() { this.container.className = 'strikeoutAnnotation'; if (!this.data.hasPopup) { this._createPopup(this.container, null, this.data); } return this.container; } }); return StrikeOutAnnotationElement; })(); /** * @class * @alias FileAttachmentAnnotationElement */ var FileAttachmentAnnotationElement = ( function FileAttachmentAnnotationElementClosure() { function FileAttachmentAnnotationElement(parameters) { AnnotationElement.call(this, parameters, true); this.filename = getFilenameFromUrl(parameters.data.file.filename); this.content = parameters.data.file.content; } Util.inherit(FileAttachmentAnnotationElement, AnnotationElement, { /** * Render the file attachment annotation's HTML element in the empty * container. * * @public * @memberof FileAttachmentAnnotationElement * @returns {HTMLSectionElement} */ render: function FileAttachmentAnnotationElement_render() { this.container.className = 'fileAttachmentAnnotation'; var trigger = document.createElement('div'); trigger.style.height = this.container.style.height; trigger.style.width = this.container.style.width; trigger.addEventListener('dblclick', this._download.bind(this)); if (!this.data.hasPopup && (this.data.title || this.data.contents)) { this._createPopup(this.container, trigger, this.data); } this.container.appendChild(trigger); return this.container; }, /** * Download the file attachment associated with this annotation. * * @private * @memberof FileAttachmentAnnotationElement */ _download: function FileAttachmentAnnotationElement_download() { if (!this.downloadManager) { warn('Download cannot be started due to unavailable download manager'); return; } this.downloadManager.downloadData(this.content, this.filename, ''); } }); return FileAttachmentAnnotationElement; })(); /** * @typedef {Object} AnnotationLayerParameters * @property {PageViewport} viewport * @property {HTMLDivElement} div * @property {Array} annotations * @property {PDFPage} page * @property {IPDFLinkService} linkService * @property {string} imageResourcesPath */ /** * @class * @alias AnnotationLayer */ var AnnotationLayer = (function AnnotationLayerClosure() { return { /** * Render a new annotation layer with all annotation elements. * * @public * @param {AnnotationLayerParameters} parameters * @memberof AnnotationLayer */ render: function AnnotationLayer_render(parameters) { var annotationElementFactory = new AnnotationElementFactory(); for (var i = 0, ii = parameters.annotations.length; i < ii; i++) { var data = parameters.annotations[i]; if (!data) { continue; } var properties = { data: data, layer: parameters.div, page: parameters.page, viewport: parameters.viewport, linkService: parameters.linkService, downloadManager: parameters.downloadManager, imageResourcesPath: parameters.imageResourcesPath || getDefaultSetting('imageResourcesPath') }; var element = annotationElementFactory.create(properties); if (element.isRenderable) { parameters.div.appendChild(element.render()); } } }, /** * Update the annotation elements on existing annotation layer. * * @public * @param {AnnotationLayerParameters} parameters * @memberof AnnotationLayer */ update: function AnnotationLayer_update(parameters) { for (var i = 0, ii = parameters.annotations.length; i < ii; i++) { var data = parameters.annotations[i]; var element = parameters.div.querySelector( '[data-annotation-id="' + data.id + '"]'); if (element) { CustomStyle.setProp('transform', element, 'matrix(' + parameters.viewport.transform.join(',') + ')'); } } parameters.div.removeAttribute('hidden'); } }; })(); exports.AnnotationLayer = AnnotationLayer; })); (function (root, factory) { { factory((root.pdfjsDisplayTextLayer = {}), root.pdfjsSharedUtil, root.pdfjsDisplayDOMUtils); } }(this, function (exports, sharedUtil, displayDOMUtils) { var Util = sharedUtil.Util; var createPromiseCapability = sharedUtil.createPromiseCapability; var CustomStyle = displayDOMUtils.CustomStyle; var getDefaultSetting = displayDOMUtils.getDefaultSetting; var PageViewport = sharedUtil.PageViewport; /** * Text layer render parameters. * * @typedef {Object} TextLayerRenderParameters * @property {TextContent} textContent - Text content to render (the object is * returned by the page's getTextContent() method). * @property {HTMLElement} container - HTML element that will contain text runs. * @property {PageViewport} viewport - The target viewport to properly * layout the text runs. * @property {Array} textDivs - (optional) HTML elements that are correspond * the text items of the textContent input. This is output and shall be * initially be set to empty array. * @property {number} timeout - (optional) Delay in milliseconds before * rendering of the text runs occurs. */ var renderTextLayer = (function renderTextLayerClosure() { var MAX_TEXT_DIVS_TO_RENDER = 100000; var NonWhitespaceRegexp = /\S/; function isAllWhitespace(str) { return !NonWhitespaceRegexp.test(str); } function appendText(textDivs, viewport, geom, styles) { var style = styles[geom.fontName]; var textDiv = document.createElement('div'); textDivs.push(textDiv); if (isAllWhitespace(geom.str)) { textDiv.dataset.isWhitespace = true; return; } var tx = Util.transform(viewport.transform, geom.transform); var angle = Math.atan2(tx[1], tx[0]); if (style.vertical) { angle += Math.PI / 2; } var fontHeight = Math.sqrt((tx[2] * tx[2]) + (tx[3] * tx[3])); var fontAscent = fontHeight; if (style.ascent) { fontAscent = style.ascent * fontAscent; } else if (style.descent) { fontAscent = (1 + style.descent) * fontAscent; } var left; var top; if (angle === 0) { left = tx[4]; top = tx[5] - fontAscent; } else { left = tx[4] + (fontAscent * Math.sin(angle)); top = tx[5] - (fontAscent * Math.cos(angle)); } textDiv.style.left = left + 'px'; textDiv.style.top = top + 'px'; textDiv.style.fontSize = fontHeight + 'px'; textDiv.style.fontFamily = style.fontFamily; textDiv.textContent = geom.str; // |fontName| is only used by the Font Inspector. This test will succeed // when e.g. the Font Inspector is off but the Stepper is on, but it's // not worth the effort to do a more accurate test. if (getDefaultSetting('pdfBug')) { textDiv.dataset.fontName = geom.fontName; } // Storing into dataset will convert number into string. if (angle !== 0) { textDiv.dataset.angle = angle * (180 / Math.PI); } // We don't bother scaling single-char text divs, because it has very // little effect on text highlighting. This makes scrolling on docs with // lots of such divs a lot faster. if (geom.str.length > 1) { if (style.vertical) { textDiv.dataset.canvasWidth = geom.height * viewport.scale; } else { textDiv.dataset.canvasWidth = geom.width * viewport.scale; } } } function render(task) { if (task._canceled) { return; } var textLayerFrag = task._container; var textDivs = task._textDivs; var capability = task._capability; var textDivsLength = textDivs.length; // No point in rendering many divs as it would make the browser // unusable even after the divs are rendered. if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) { capability.resolve(); return; } var canvas = document.createElement('canvas'); canvas.mozOpaque = true; var ctx = canvas.getContext('2d', {alpha: false}); var lastFontSize; var lastFontFamily; for (var i = 0; i < textDivsLength; i++) { var textDiv = textDivs[i]; if (textDiv.dataset.isWhitespace !== undefined) { continue; } var fontSize = textDiv.style.fontSize; var fontFamily = textDiv.style.fontFamily; // Only build font string and set to context if different from last. if (fontSize !== lastFontSize || fontFamily !== lastFontFamily) { ctx.font = fontSize + ' ' + fontFamily; lastFontSize = fontSize; lastFontFamily = fontFamily; } var width = ctx.measureText(textDiv.textContent).width; if (width > 0) { textLayerFrag.appendChild(textDiv); var transform; if (textDiv.dataset.canvasWidth !== undefined) { // Dataset values come of type string. var textScale = textDiv.dataset.canvasWidth / width; transform = 'scaleX(' + textScale + ')'; } else { transform = ''; } var rotation = textDiv.dataset.angle; if (rotation) { transform = 'rotate(' + rotation + 'deg) ' + transform; } if (transform) { CustomStyle.setProp('transform' , textDiv, transform); } } } capability.resolve(); } /** * Text layer rendering task. * * @param {TextContent} textContent * @param {HTMLElement} container * @param {PageViewport} viewport * @param {Array} textDivs * @private */ function TextLayerRenderTask(textContent, container, viewport, textDivs) { this._textContent = textContent; this._container = container; this._viewport = viewport; textDivs = textDivs || []; this._textDivs = textDivs; this._canceled = false; this._capability = createPromiseCapability(); this._renderTimer = null; } TextLayerRenderTask.prototype = { get promise() { return this._capability.promise; }, cancel: function TextLayer_cancel() { this._canceled = true; if (this._renderTimer !== null) { clearTimeout(this._renderTimer); this._renderTimer = null; } this._capability.reject('canceled'); }, _render: function TextLayer_render(timeout) { var textItems = this._textContent.items; var styles = this._textContent.styles; var textDivs = this._textDivs; var viewport = this._viewport; for (var i = 0, len = textItems.length; i < len; i++) { appendText(textDivs, viewport, textItems[i], styles); } if (!timeout) { // Render right away render(this); } else { // Schedule var self = this; this._renderTimer = setTimeout(function() { render(self); self._renderTimer = null; }, timeout); } } }; /** * Starts rendering of the text layer. * * @param {TextLayerRenderParameters} renderParameters * @returns {TextLayerRenderTask} */ function renderTextLayer(renderParameters) { var task = new TextLayerRenderTask(renderParameters.textContent, renderParameters.container, renderParameters.viewport, renderParameters.textDivs); task._render(renderParameters.timeout); return task; } return renderTextLayer; })(); exports.renderTextLayer = renderTextLayer; })); (function (root, factory) { { factory((root.pdfjsDisplayWebGL = {}), root.pdfjsSharedUtil, root.pdfjsDisplayDOMUtils); } }(this, function (exports, sharedUtil, displayDOMUtils) { var shadow = sharedUtil.shadow; var getDefaultSetting = displayDOMUtils.getDefaultSetting; var WebGLUtils = (function WebGLUtilsClosure() { function loadShader(gl, code, shaderType) { var shader = gl.createShader(shaderType); gl.shaderSource(shader, code); gl.compileShader(shader); var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS); if (!compiled) { var errorMsg = gl.getShaderInfoLog(shader); throw new Error('Error during shader compilation: ' + errorMsg); } return shader; } function createVertexShader(gl, code) { return loadShader(gl, code, gl.VERTEX_SHADER); } function createFragmentShader(gl, code) { return loadShader(gl, code, gl.FRAGMENT_SHADER); } function createProgram(gl, shaders) { var program = gl.createProgram(); for (var i = 0, ii = shaders.length; i < ii; ++i) { gl.attachShader(program, shaders[i]); } gl.linkProgram(program); var linked = gl.getProgramParameter(program, gl.LINK_STATUS); if (!linked) { var errorMsg = gl.getProgramInfoLog(program); throw new Error('Error during program linking: ' + errorMsg); } return program; } function createTexture(gl, image, textureId) { gl.activeTexture(textureId); var texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, texture); // Set the parameters so we can render any size image. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); // Upload the image into the texture. gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); return texture; } var currentGL, currentCanvas; function generateGL() { if (currentGL) { return; } currentCanvas = document.createElement('canvas'); currentGL = currentCanvas.getContext('webgl', { premultipliedalpha: false }); } var smaskVertexShaderCode = '\ attribute vec2 a_position; \ attribute vec2 a_texCoord; \ \ uniform vec2 u_resolution; \ \ varying vec2 v_texCoord; \ \ void main() { \ vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0; \ gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); \ \ v_texCoord = a_texCoord; \ } '; var smaskFragmentShaderCode = '\ precision mediump float; \ \ uniform vec4 u_backdrop; \ uniform int u_subtype; \ uniform sampler2D u_image; \ uniform sampler2D u_mask; \ \ varying vec2 v_texCoord; \ \ void main() { \ vec4 imageColor = texture2D(u_image, v_texCoord); \ vec4 maskColor = texture2D(u_mask, v_texCoord); \ if (u_backdrop.a > 0.0) { \ maskColor.rgb = maskColor.rgb * maskColor.a + \ u_backdrop.rgb * (1.0 - maskColor.a); \ } \ float lum; \ if (u_subtype == 0) { \ lum = maskColor.a; \ } else { \ lum = maskColor.r * 0.3 + maskColor.g * 0.59 + \ maskColor.b * 0.11; \ } \ imageColor.a *= lum; \ imageColor.rgb *= imageColor.a; \ gl_FragColor = imageColor; \ } '; var smaskCache = null; function initSmaskGL() { var canvas, gl; generateGL(); canvas = currentCanvas; currentCanvas = null; gl = currentGL; currentGL = null; // setup a GLSL program var vertexShader = createVertexShader(gl, smaskVertexShaderCode); var fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode); var program = createProgram(gl, [vertexShader, fragmentShader]); gl.useProgram(program); var cache = {}; cache.gl = gl; cache.canvas = canvas; cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution'); cache.positionLocation = gl.getAttribLocation(program, 'a_position'); cache.backdropLocation = gl.getUniformLocation(program, 'u_backdrop'); cache.subtypeLocation = gl.getUniformLocation(program, 'u_subtype'); var texCoordLocation = gl.getAttribLocation(program, 'a_texCoord'); var texLayerLocation = gl.getUniformLocation(program, 'u_image'); var texMaskLocation = gl.getUniformLocation(program, 'u_mask'); // provide texture coordinates for the rectangle. var texCoordBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer); gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0]), gl.STATIC_DRAW); gl.enableVertexAttribArray(texCoordLocation); gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0); gl.uniform1i(texLayerLocation, 0); gl.uniform1i(texMaskLocation, 1); smaskCache = cache; } function composeSMask(layer, mask, properties) { var width = layer.width, height = layer.height; if (!smaskCache) { initSmaskGL(); } var cache = smaskCache,canvas = cache.canvas, gl = cache.gl; canvas.width = width; canvas.height = height; gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); gl.uniform2f(cache.resolutionLocation, width, height); if (properties.backdrop) { gl.uniform4f(cache.resolutionLocation, properties.backdrop[0], properties.backdrop[1], properties.backdrop[2], 1); } else { gl.uniform4f(cache.resolutionLocation, 0, 0, 0, 0); } gl.uniform1i(cache.subtypeLocation, properties.subtype === 'Luminosity' ? 1 : 0); // Create a textures var texture = createTexture(gl, layer, gl.TEXTURE0); var maskTexture = createTexture(gl, mask, gl.TEXTURE1); // Create a buffer and put a single clipspace rectangle in // it (2 triangles) var buffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, buffer); gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 0, 0, width, 0, 0, height, 0, height, width, 0, width, height]), gl.STATIC_DRAW); gl.enableVertexAttribArray(cache.positionLocation); gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0); // draw gl.clearColor(0, 0, 0, 0); gl.enable(gl.BLEND); gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); gl.clear(gl.COLOR_BUFFER_BIT); gl.drawArrays(gl.TRIANGLES, 0, 6); gl.flush(); gl.deleteTexture(texture); gl.deleteTexture(maskTexture); gl.deleteBuffer(buffer); return canvas; } var figuresVertexShaderCode = '\ attribute vec2 a_position; \ attribute vec3 a_color; \ \ uniform vec2 u_resolution; \ uniform vec2 u_scale; \ uniform vec2 u_offset; \ \ varying vec4 v_color; \ \ void main() { \ vec2 position = (a_position + u_offset) * u_scale; \ vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0; \ gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); \ \ v_color = vec4(a_color / 255.0, 1.0); \ } '; var figuresFragmentShaderCode = '\ precision mediump float; \ \ varying vec4 v_color; \ \ void main() { \ gl_FragColor = v_color; \ } '; var figuresCache = null; function initFiguresGL() { var canvas, gl; generateGL(); canvas = currentCanvas; currentCanvas = null; gl = currentGL; currentGL = null; // setup a GLSL program var vertexShader = createVertexShader(gl, figuresVertexShaderCode); var fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode); var program = createProgram(gl, [vertexShader, fragmentShader]); gl.useProgram(program); var cache = {}; cache.gl = gl; cache.canvas = canvas; cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution'); cache.scaleLocation = gl.getUniformLocation(program, 'u_scale'); cache.offsetLocation = gl.getUniformLocation(program, 'u_offset'); cache.positionLocation = gl.getAttribLocation(program, 'a_position'); cache.colorLocation = gl.getAttribLocation(program, 'a_color'); figuresCache = cache; } function drawFigures(width, height, backgroundColor, figures, context) { if (!figuresCache) { initFiguresGL(); } var cache = figuresCache, canvas = cache.canvas, gl = cache.gl; canvas.width = width; canvas.height = height; gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); gl.uniform2f(cache.resolutionLocation, width, height); // count triangle points var count = 0; var i, ii, rows; for (i = 0, ii = figures.length; i < ii; i++) { switch (figures[i].type) { case 'lattice': rows = (figures[i].coords.length / figures[i].verticesPerRow) | 0; count += (rows - 1) * (figures[i].verticesPerRow - 1) * 6; break; case 'triangles': count += figures[i].coords.length; break; } } // transfer data var coords = new Float32Array(count * 2); var colors = new Uint8Array(count * 3); var coordsMap = context.coords, colorsMap = context.colors; var pIndex = 0, cIndex = 0; for (i = 0, ii = figures.length; i < ii; i++) { var figure = figures[i], ps = figure.coords, cs = figure.colors; switch (figure.type) { case 'lattice': var cols = figure.verticesPerRow; rows = (ps.length / cols) | 0; for (var row = 1; row < rows; row++) { var offset = row * cols + 1; for (var col = 1; col < cols; col++, offset++) { coords[pIndex] = coordsMap[ps[offset - cols - 1]]; coords[pIndex + 1] = coordsMap[ps[offset - cols - 1] + 1]; coords[pIndex + 2] = coordsMap[ps[offset - cols]]; coords[pIndex + 3] = coordsMap[ps[offset - cols] + 1]; coords[pIndex + 4] = coordsMap[ps[offset - 1]]; coords[pIndex + 5] = coordsMap[ps[offset - 1] + 1]; colors[cIndex] = colorsMap[cs[offset - cols - 1]]; colors[cIndex + 1] = colorsMap[cs[offset - cols - 1] + 1]; colors[cIndex + 2] = colorsMap[cs[offset - cols - 1] + 2]; colors[cIndex + 3] = colorsMap[cs[offset - cols]]; colors[cIndex + 4] = colorsMap[cs[offset - cols] + 1]; colors[cIndex + 5] = colorsMap[cs[offset - cols] + 2]; colors[cIndex + 6] = colorsMap[cs[offset - 1]]; colors[cIndex + 7] = colorsMap[cs[offset - 1] + 1]; colors[cIndex + 8] = colorsMap[cs[offset - 1] + 2]; coords[pIndex + 6] = coords[pIndex + 2]; coords[pIndex + 7] = coords[pIndex + 3]; coords[pIndex + 8] = coords[pIndex + 4]; coords[pIndex + 9] = coords[pIndex + 5]; coords[pIndex + 10] = coordsMap[ps[offset]]; coords[pIndex + 11] = coordsMap[ps[offset] + 1]; colors[cIndex + 9] = colors[cIndex + 3]; colors[cIndex + 10] = colors[cIndex + 4]; colors[cIndex + 11] = colors[cIndex + 5]; colors[cIndex + 12] = colors[cIndex + 6]; colors[cIndex + 13] = colors[cIndex + 7]; colors[cIndex + 14] = colors[cIndex + 8]; colors[cIndex + 15] = colorsMap[cs[offset]]; colors[cIndex + 16] = colorsMap[cs[offset] + 1]; colors[cIndex + 17] = colorsMap[cs[offset] + 2]; pIndex += 12; cIndex += 18; } } break; case 'triangles': for (var j = 0, jj = ps.length; j < jj; j++) { coords[pIndex] = coordsMap[ps[j]]; coords[pIndex + 1] = coordsMap[ps[j] + 1]; colors[cIndex] = colorsMap[cs[j]]; colors[cIndex + 1] = colorsMap[cs[j] + 1]; colors[cIndex + 2] = colorsMap[cs[j] + 2]; pIndex += 2; cIndex += 3; } break; } } // draw if (backgroundColor) { gl.clearColor(backgroundColor[0] / 255, backgroundColor[1] / 255, backgroundColor[2] / 255, 1.0); } else { gl.clearColor(0, 0, 0, 0); } gl.clear(gl.COLOR_BUFFER_BIT); var coordsBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, coordsBuffer); gl.bufferData(gl.ARRAY_BUFFER, coords, gl.STATIC_DRAW); gl.enableVertexAttribArray(cache.positionLocation); gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0); var colorsBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, colorsBuffer); gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW); gl.enableVertexAttribArray(cache.colorLocation); gl.vertexAttribPointer(cache.colorLocation, 3, gl.UNSIGNED_BYTE, false, 0, 0); gl.uniform2f(cache.scaleLocation, context.scaleX, context.scaleY); gl.uniform2f(cache.offsetLocation, context.offsetX, context.offsetY); gl.drawArrays(gl.TRIANGLES, 0, count); gl.flush(); gl.deleteBuffer(coordsBuffer); gl.deleteBuffer(colorsBuffer); return canvas; } function cleanup() { if (smaskCache && smaskCache.canvas) { smaskCache.canvas.width = 0; smaskCache.canvas.height = 0; } if (figuresCache && figuresCache.canvas) { figuresCache.canvas.width = 0; figuresCache.canvas.height = 0; } smaskCache = null; figuresCache = null; } return { get isEnabled() { if (getDefaultSetting('disableWebGL')) { return false; } var enabled = false; try { generateGL(); enabled = !!currentGL; } catch (e) { } return shadow(this, 'isEnabled', enabled); }, composeSMask: composeSMask, drawFigures: drawFigures, clear: cleanup }; })(); exports.WebGLUtils = WebGLUtils; })); (function (root, factory) { { factory((root.pdfjsDisplayPatternHelper = {}), root.pdfjsSharedUtil, root.pdfjsDisplayWebGL); } }(this, function (exports, sharedUtil, displayWebGL) { var Util = sharedUtil.Util; var info = sharedUtil.info; var isArray = sharedUtil.isArray; var error = sharedUtil.error; var WebGLUtils = displayWebGL.WebGLUtils; var ShadingIRs = {}; ShadingIRs.RadialAxial = { fromIR: function RadialAxial_fromIR(raw) { var type = raw[1]; var colorStops = raw[2]; var p0 = raw[3]; var p1 = raw[4]; var r0 = raw[5]; var r1 = raw[6]; return { type: 'Pattern', getPattern: function RadialAxial_getPattern(ctx) { var grad; if (type === 'axial') { grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]); } else if (type === 'radial') { grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1); } for (var i = 0, ii = colorStops.length; i < ii; ++i) { var c = colorStops[i]; grad.addColorStop(c[0], c[1]); } return grad; } }; } }; var createMeshCanvas = (function createMeshCanvasClosure() { function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) { // Very basic Gouraud-shaded triangle rasterization algorithm. var coords = context.coords, colors = context.colors; var bytes = data.data, rowSize = data.width * 4; var tmp; if (coords[p1 + 1] > coords[p2 + 1]) { tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp; } if (coords[p2 + 1] > coords[p3 + 1]) { tmp = p2; p2 = p3; p3 = tmp; tmp = c2; c2 = c3; c3 = tmp; } if (coords[p1 + 1] > coords[p2 + 1]) { tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp; } var x1 = (coords[p1] + context.offsetX) * context.scaleX; var y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY; var x2 = (coords[p2] + context.offsetX) * context.scaleX; var y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY; var x3 = (coords[p3] + context.offsetX) * context.scaleX; var y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY; if (y1 >= y3) { return; } var c1r = colors[c1], c1g = colors[c1 + 1], c1b = colors[c1 + 2]; var c2r = colors[c2], c2g = colors[c2 + 1], c2b = colors[c2 + 2]; var c3r = colors[c3], c3g = colors[c3 + 1], c3b = colors[c3 + 2]; var minY = Math.round(y1), maxY = Math.round(y3); var xa, car, cag, cab; var xb, cbr, cbg, cbb; var k; for (var y = minY; y <= maxY; y++) { if (y < y2) { k = y < y1 ? 0 : y1 === y2 ? 1 : (y1 - y) / (y1 - y2); xa = x1 - (x1 - x2) * k; car = c1r - (c1r - c2r) * k; cag = c1g - (c1g - c2g) * k; cab = c1b - (c1b - c2b) * k; } else { k = y > y3 ? 1 : y2 === y3 ? 0 : (y2 - y) / (y2 - y3); xa = x2 - (x2 - x3) * k; car = c2r - (c2r - c3r) * k; cag = c2g - (c2g - c3g) * k; cab = c2b - (c2b - c3b) * k; } k = y < y1 ? 0 : y > y3 ? 1 : (y1 - y) / (y1 - y3); xb = x1 - (x1 - x3) * k; cbr = c1r - (c1r - c3r) * k; cbg = c1g - (c1g - c3g) * k; cbb = c1b - (c1b - c3b) * k; var x1_ = Math.round(Math.min(xa, xb)); var x2_ = Math.round(Math.max(xa, xb)); var j = rowSize * y + x1_ * 4; for (var x = x1_; x <= x2_; x++) { k = (xa - x) / (xa - xb); k = k < 0 ? 0 : k > 1 ? 1 : k; bytes[j++] = (car - (car - cbr) * k) | 0; bytes[j++] = (cag - (cag - cbg) * k) | 0; bytes[j++] = (cab - (cab - cbb) * k) | 0; bytes[j++] = 255; } } } function drawFigure(data, figure, context) { var ps = figure.coords; var cs = figure.colors; var i, ii; switch (figure.type) { case 'lattice': var verticesPerRow = figure.verticesPerRow; var rows = Math.floor(ps.length / verticesPerRow) - 1; var cols = verticesPerRow - 1; for (i = 0; i < rows; i++) { var q = i * verticesPerRow; for (var j = 0; j < cols; j++, q++) { drawTriangle(data, context, ps[q], ps[q + 1], ps[q + verticesPerRow], cs[q], cs[q + 1], cs[q + verticesPerRow]); drawTriangle(data, context, ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]); } } break; case 'triangles': for (i = 0, ii = ps.length; i < ii; i += 3) { drawTriangle(data, context, ps[i], ps[i + 1], ps[i + 2], cs[i], cs[i + 1], cs[i + 2]); } break; default: error('illigal figure'); break; } } function createMeshCanvas(bounds, combinesScale, coords, colors, figures, backgroundColor, cachedCanvases) { // we will increase scale on some weird factor to let antialiasing take // care of "rough" edges var EXPECTED_SCALE = 1.1; // MAX_PATTERN_SIZE is used to avoid OOM situation. var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough // We need to keep transparent border around our pattern for fill(): // createPattern with 'no-repeat' will bleed edges accross entire area. var BORDER_SIZE = 2; var offsetX = Math.floor(bounds[0]); var offsetY = Math.floor(bounds[1]); var boundsWidth = Math.ceil(bounds[2]) - offsetX; var boundsHeight = Math.ceil(bounds[3]) - offsetY; var width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); var height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); var scaleX = boundsWidth / width; var scaleY = boundsHeight / height; var context = { coords: coords, colors: colors, offsetX: -offsetX, offsetY: -offsetY, scaleX: 1 / scaleX, scaleY: 1 / scaleY }; var paddedWidth = width + BORDER_SIZE * 2; var paddedHeight = height + BORDER_SIZE * 2; var canvas, tmpCanvas, i, ii; if (WebGLUtils.isEnabled) { canvas = WebGLUtils.drawFigures(width, height, backgroundColor, figures, context); // https://bugzilla.mozilla.org/show_bug.cgi?id=972126 tmpCanvas = cachedCanvases.getCanvas('mesh', paddedWidth, paddedHeight, false); tmpCanvas.context.drawImage(canvas, BORDER_SIZE, BORDER_SIZE); canvas = tmpCanvas.canvas; } else { tmpCanvas = cachedCanvases.getCanvas('mesh', paddedWidth, paddedHeight, false); var tmpCtx = tmpCanvas.context; var data = tmpCtx.createImageData(width, height); if (backgroundColor) { var bytes = data.data; for (i = 0, ii = bytes.length; i < ii; i += 4) { bytes[i] = backgroundColor[0]; bytes[i + 1] = backgroundColor[1]; bytes[i + 2] = backgroundColor[2]; bytes[i + 3] = 255; } } for (i = 0; i < figures.length; i++) { drawFigure(data, figures[i], context); } tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE); canvas = tmpCanvas.canvas; } return {canvas: canvas, offsetX: offsetX - BORDER_SIZE * scaleX, offsetY: offsetY - BORDER_SIZE * scaleY, scaleX: scaleX, scaleY: scaleY}; } return createMeshCanvas; })(); ShadingIRs.Mesh = { fromIR: function Mesh_fromIR(raw) { //var type = raw[1]; var coords = raw[2]; var colors = raw[3]; var figures = raw[4]; var bounds = raw[5]; var matrix = raw[6]; //var bbox = raw[7]; var background = raw[8]; return { type: 'Pattern', getPattern: function Mesh_getPattern(ctx, owner, shadingFill) { var scale; if (shadingFill) { scale = Util.singularValueDecompose2dScale(ctx.mozCurrentTransform); } else { // Obtain scale from matrix and current transformation matrix. scale = Util.singularValueDecompose2dScale(owner.baseTransform); if (matrix) { var matrixScale = Util.singularValueDecompose2dScale(matrix); scale = [scale[0] * matrixScale[0], scale[1] * matrixScale[1]]; } } // Rasterizing on the main thread since sending/queue large canvases // might cause OOM. var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords, colors, figures, shadingFill ? null : background, owner.cachedCanvases); if (!shadingFill) { ctx.setTransform.apply(ctx, owner.baseTransform); if (matrix) { ctx.transform.apply(ctx, matrix); } } ctx.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY); ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY); return ctx.createPattern(temporaryPatternCanvas.canvas, 'no-repeat'); } }; } }; ShadingIRs.Dummy = { fromIR: function Dummy_fromIR() { return { type: 'Pattern', getPattern: function Dummy_fromIR_getPattern() { return 'hotpink'; } }; } }; function getShadingPatternFromIR(raw) { var shadingIR = ShadingIRs[raw[0]]; if (!shadingIR) { error('Unknown IR type: ' + raw[0]); } return shadingIR.fromIR(raw); } var TilingPattern = (function TilingPatternClosure() { var PaintType = { COLORED: 1, UNCOLORED: 2 }; var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough function TilingPattern(IR, color, ctx, canvasGraphicsFactory, baseTransform) { this.operatorList = IR[2]; this.matrix = IR[3] || [1, 0, 0, 1, 0, 0]; this.bbox = IR[4]; this.xstep = IR[5]; this.ystep = IR[6]; this.paintType = IR[7]; this.tilingType = IR[8]; this.color = color; this.canvasGraphicsFactory = canvasGraphicsFactory; this.baseTransform = baseTransform; this.type = 'Pattern'; this.ctx = ctx; } TilingPattern.prototype = { createPatternCanvas: function TilinPattern_createPatternCanvas(owner) { var operatorList = this.operatorList; var bbox = this.bbox; var xstep = this.xstep; var ystep = this.ystep; var paintType = this.paintType; var tilingType = this.tilingType; var color = this.color; var canvasGraphicsFactory = this.canvasGraphicsFactory; info('TilingType: ' + tilingType); var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3]; var topLeft = [x0, y0]; // we want the canvas to be as large as the step size var botRight = [x0 + xstep, y0 + ystep]; var width = botRight[0] - topLeft[0]; var height = botRight[1] - topLeft[1]; // Obtain scale from matrix and current transformation matrix. var matrixScale = Util.singularValueDecompose2dScale(this.matrix); var curMatrixScale = Util.singularValueDecompose2dScale( this.baseTransform); var combinedScale = [matrixScale[0] * curMatrixScale[0], matrixScale[1] * curMatrixScale[1]]; // MAX_PATTERN_SIZE is used to avoid OOM situation. // Use width and height values that are as close as possible to the end // result when the pattern is used. Too low value makes the pattern look // blurry. Too large value makes it look too crispy. width = Math.min(Math.ceil(Math.abs(width * combinedScale[0])), MAX_PATTERN_SIZE); height = Math.min(Math.ceil(Math.abs(height * combinedScale[1])), MAX_PATTERN_SIZE); var tmpCanvas = owner.cachedCanvases.getCanvas('pattern', width, height, true); var tmpCtx = tmpCanvas.context; var graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx); graphics.groupLevel = owner.groupLevel; this.setFillAndStrokeStyleToContext(tmpCtx, paintType, color); this.setScale(width, height, xstep, ystep); this.transformToScale(graphics); // transform coordinates to pattern space var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]]; graphics.transform.apply(graphics, tmpTranslate); this.clipBbox(graphics, bbox, x0, y0, x1, y1); graphics.executeOperatorList(operatorList); return tmpCanvas.canvas; }, setScale: function TilingPattern_setScale(width, height, xstep, ystep) { this.scale = [width / xstep, height / ystep]; }, transformToScale: function TilingPattern_transformToScale(graphics) { var scale = this.scale; var tmpScale = [scale[0], 0, 0, scale[1], 0, 0]; graphics.transform.apply(graphics, tmpScale); }, scaleToContext: function TilingPattern_scaleToContext() { var scale = this.scale; this.ctx.scale(1 / scale[0], 1 / scale[1]); }, clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) { if (bbox && isArray(bbox) && bbox.length === 4) { var bboxWidth = x1 - x0; var bboxHeight = y1 - y0; graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight); graphics.clip(); graphics.endPath(); } }, setFillAndStrokeStyleToContext: function setFillAndStrokeStyleToContext(context, paintType, color) { switch (paintType) { case PaintType.COLORED: var ctx = this.ctx; context.fillStyle = ctx.fillStyle; context.strokeStyle = ctx.strokeStyle; break; case PaintType.UNCOLORED: var cssColor = Util.makeCssRgb(color[0], color[1], color[2]); context.fillStyle = cssColor; context.strokeStyle = cssColor; break; default: error('Unsupported paint type: ' + paintType); } }, getPattern: function TilingPattern_getPattern(ctx, owner) { var temporaryPatternCanvas = this.createPatternCanvas(owner); ctx = this.ctx; ctx.setTransform.apply(ctx, this.baseTransform); ctx.transform.apply(ctx, this.matrix); this.scaleToContext(); return ctx.createPattern(temporaryPatternCanvas, 'repeat'); } }; return TilingPattern; })(); exports.getShadingPatternFromIR = getShadingPatternFromIR; exports.TilingPattern = TilingPattern; })); (function (root, factory) { { factory((root.pdfjsDisplayCanvas = {}), root.pdfjsSharedUtil, root.pdfjsDisplayDOMUtils, root.pdfjsDisplayPatternHelper, root.pdfjsDisplayWebGL); } }(this, function (exports, sharedUtil, displayDOMUtils, displayPatternHelper, displayWebGL) { var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX; var IDENTITY_MATRIX = sharedUtil.IDENTITY_MATRIX; var ImageKind = sharedUtil.ImageKind; var OPS = sharedUtil.OPS; var TextRenderingMode = sharedUtil.TextRenderingMode; var Uint32ArrayView = sharedUtil.Uint32ArrayView; var Util = sharedUtil.Util; var assert = sharedUtil.assert; var info = sharedUtil.info; var isNum = sharedUtil.isNum; var isArray = sharedUtil.isArray; var isLittleEndian = sharedUtil.isLittleEndian; var error = sharedUtil.error; var shadow = sharedUtil.shadow; var warn = sharedUtil.warn; var TilingPattern = displayPatternHelper.TilingPattern; var getShadingPatternFromIR = displayPatternHelper.getShadingPatternFromIR; var WebGLUtils = displayWebGL.WebGLUtils; var hasCanvasTypedArrays = displayDOMUtils.hasCanvasTypedArrays; // contexts store most of the state we need natively. // However, PDF needs a bit more state, which we store here. // Minimal font size that would be used during canvas fillText operations. var MIN_FONT_SIZE = 16; // Maximum font size that would be used during canvas fillText operations. var MAX_FONT_SIZE = 100; var MAX_GROUP_SIZE = 4096; // Heuristic value used when enforcing minimum line widths. var MIN_WIDTH_FACTOR = 0.65; var COMPILE_TYPE3_GLYPHS = true; var MAX_SIZE_TO_COMPILE = 1000; var FULL_CHUNK_HEIGHT = 16; var HasCanvasTypedArraysCached = { get value() { return shadow(HasCanvasTypedArraysCached, 'value', hasCanvasTypedArrays()); } }; var IsLittleEndianCached = { get value() { return shadow(IsLittleEndianCached, 'value', isLittleEndian()); } }; function createScratchCanvas(width, height) { var canvas = document.createElement('canvas'); canvas.width = width; canvas.height = height; return canvas; } function addContextCurrentTransform(ctx) { // If the context doesn't expose a `mozCurrentTransform`, add a JS based one. if (!ctx.mozCurrentTransform) { ctx._originalSave = ctx.save; ctx._originalRestore = ctx.restore; ctx._originalRotate = ctx.rotate; ctx._originalScale = ctx.scale; ctx._originalTranslate = ctx.translate; ctx._originalTransform = ctx.transform; ctx._originalSetTransform = ctx.setTransform; ctx._transformMatrix = ctx._transformMatrix || [1, 0, 0, 1, 0, 0]; ctx._transformStack = []; Object.defineProperty(ctx, 'mozCurrentTransform', { get: function getCurrentTransform() { return this._transformMatrix; } }); Object.defineProperty(ctx, 'mozCurrentTransformInverse', { get: function getCurrentTransformInverse() { // Calculation done using WolframAlpha: // http://www.wolframalpha.com/input/? // i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}} var m = this._transformMatrix; var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5]; var ad_bc = a * d - b * c; var bc_ad = b * c - a * d; return [ d / ad_bc, b / bc_ad, c / bc_ad, a / ad_bc, (d * e - c * f) / bc_ad, (b * e - a * f) / ad_bc ]; } }); ctx.save = function ctxSave() { var old = this._transformMatrix; this._transformStack.push(old); this._transformMatrix = old.slice(0, 6); this._originalSave(); }; ctx.restore = function ctxRestore() { var prev = this._transformStack.pop(); if (prev) { this._transformMatrix = prev; this._originalRestore(); } }; ctx.translate = function ctxTranslate(x, y) { var m = this._transformMatrix; m[4] = m[0] * x + m[2] * y + m[4]; m[5] = m[1] * x + m[3] * y + m[5]; this._originalTranslate(x, y); }; ctx.scale = function ctxScale(x, y) { var m = this._transformMatrix; m[0] = m[0] * x; m[1] = m[1] * x; m[2] = m[2] * y; m[3] = m[3] * y; this._originalScale(x, y); }; ctx.transform = function ctxTransform(a, b, c, d, e, f) { var m = this._transformMatrix; this._transformMatrix = [ m[0] * a + m[2] * b, m[1] * a + m[3] * b, m[0] * c + m[2] * d, m[1] * c + m[3] * d, m[0] * e + m[2] * f + m[4], m[1] * e + m[3] * f + m[5] ]; ctx._originalTransform(a, b, c, d, e, f); }; ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) { this._transformMatrix = [a, b, c, d, e, f]; ctx._originalSetTransform(a, b, c, d, e, f); }; ctx.rotate = function ctxRotate(angle) { var cosValue = Math.cos(angle); var sinValue = Math.sin(angle); var m = this._transformMatrix; this._transformMatrix = [ m[0] * cosValue + m[2] * sinValue, m[1] * cosValue + m[3] * sinValue, m[0] * (-sinValue) + m[2] * cosValue, m[1] * (-sinValue) + m[3] * cosValue, m[4], m[5] ]; this._originalRotate(angle); }; } } var CachedCanvases = (function CachedCanvasesClosure() { function CachedCanvases() { this.cache = Object.create(null); } CachedCanvases.prototype = { getCanvas: function CachedCanvases_getCanvas(id, width, height, trackTransform) { var canvasEntry; if (this.cache[id] !== undefined) { canvasEntry = this.cache[id]; canvasEntry.canvas.width = width; canvasEntry.canvas.height = height; // reset canvas transform for emulated mozCurrentTransform, if needed canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0); } else { var canvas = createScratchCanvas(width, height); var ctx = canvas.getContext('2d'); if (trackTransform) { addContextCurrentTransform(ctx); } this.cache[id] = canvasEntry = {canvas: canvas, context: ctx}; } return canvasEntry; }, clear: function () { for (var id in this.cache) { var canvasEntry = this.cache[id]; // Zeroing the width and height causes Firefox to release graphics // resources immediately, which can greatly reduce memory consumption. canvasEntry.canvas.width = 0; canvasEntry.canvas.height = 0; delete this.cache[id]; } } }; return CachedCanvases; })(); function compileType3Glyph(imgData) { var POINT_TO_PROCESS_LIMIT = 1000; var width = imgData.width, height = imgData.height; var i, j, j0, width1 = width + 1; var points = new Uint8Array(width1 * (height + 1)); var POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]); // decodes bit-packed mask data var lineSize = (width + 7) & ~7, data0 = imgData.data; var data = new Uint8Array(lineSize * height), pos = 0, ii; for (i = 0, ii = data0.length; i < ii; i++) { var mask = 128, elem = data0[i]; while (mask > 0) { data[pos++] = (elem & mask) ? 0 : 255; mask >>= 1; } } // finding iteresting points: every point is located between mask pixels, // so there will be points of the (width + 1)x(height + 1) grid. Every point // will have flags assigned based on neighboring mask pixels: // 4 | 8 // --P-- // 2 | 1 // We are interested only in points with the flags: // - outside corners: 1, 2, 4, 8; // - inside corners: 7, 11, 13, 14; // - and, intersections: 5, 10. var count = 0; pos = 0; if (data[pos] !== 0) { points[0] = 1; ++count; } for (j = 1; j < width; j++) { if (data[pos] !== data[pos + 1]) { points[j] = data[pos] ? 2 : 1; ++count; } pos++; } if (data[pos] !== 0) { points[j] = 2; ++count; } for (i = 1; i < height; i++) { pos = i * lineSize; j0 = i * width1; if (data[pos - lineSize] !== data[pos]) { points[j0] = data[pos] ? 1 : 8; ++count; } // 'sum' is the position of the current pixel configuration in the 'TYPES' // array (in order 8-1-2-4, so we can use '>>2' to shift the column). var sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0); for (j = 1; j < width; j++) { sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) + (data[pos - lineSize + 1] ? 8 : 0); if (POINT_TYPES[sum]) { points[j0 + j] = POINT_TYPES[sum]; ++count; } pos++; } if (data[pos - lineSize] !== data[pos]) { points[j0 + j] = data[pos] ? 2 : 4; ++count; } if (count > POINT_TO_PROCESS_LIMIT) { return null; } } pos = lineSize * (height - 1); j0 = i * width1; if (data[pos] !== 0) { points[j0] = 8; ++count; } for (j = 1; j < width; j++) { if (data[pos] !== data[pos + 1]) { points[j0 + j] = data[pos] ? 4 : 8; ++count; } pos++; } if (data[pos] !== 0) { points[j0 + j] = 4; ++count; } if (count > POINT_TO_PROCESS_LIMIT) { return null; } // building outlines var steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]); var outlines = []; for (i = 0; count && i <= height; i++) { var p = i * width1; var end = p + width; while (p < end && !points[p]) { p++; } if (p === end) { continue; } var coords = [p % width1, i]; var type = points[p], p0 = p, pp; do { var step = steps[type]; do { p += step; } while (!points[p]); pp = points[p]; if (pp !== 5 && pp !== 10) { // set new direction type = pp; // delete mark points[p] = 0; } else { // type is 5 or 10, ie, a crossing // set new direction type = pp & ((0x33 * type) >> 4); // set new type for "future hit" points[p] &= (type >> 2 | type << 2); } coords.push(p % width1); coords.push((p / width1) | 0); --count; } while (p0 !== p); outlines.push(coords); --i; } var drawOutline = function(c) { c.save(); // the path shall be painted in [0..1]x[0..1] space c.scale(1 / width, -1 / height); c.translate(0, -height); c.beginPath(); for (var i = 0, ii = outlines.length; i < ii; i++) { var o = outlines[i]; c.moveTo(o[0], o[1]); for (var j = 2, jj = o.length; j < jj; j += 2) { c.lineTo(o[j], o[j+1]); } } c.fill(); c.beginPath(); c.restore(); }; return drawOutline; } var CanvasExtraState = (function CanvasExtraStateClosure() { function CanvasExtraState(old) { // Are soft masks and alpha values shapes or opacities? this.alphaIsShape = false; this.fontSize = 0; this.fontSizeScale = 1; this.textMatrix = IDENTITY_MATRIX; this.textMatrixScale = 1; this.fontMatrix = FONT_IDENTITY_MATRIX; this.leading = 0; // Current point (in user coordinates) this.x = 0; this.y = 0; // Start of text line (in text coordinates) this.lineX = 0; this.lineY = 0; // Character and word spacing this.charSpacing = 0; this.wordSpacing = 0; this.textHScale = 1; this.textRenderingMode = TextRenderingMode.FILL; this.textRise = 0; // Default fore and background colors this.fillColor = '#000000'; this.strokeColor = '#000000'; this.patternFill = false; // Note: fill alpha applies to all non-stroking operations this.fillAlpha = 1; this.strokeAlpha = 1; this.lineWidth = 1; this.activeSMask = null; this.resumeSMaskCtx = null; // nonclonable field (see the save method below) this.old = old; } CanvasExtraState.prototype = { clone: function CanvasExtraState_clone() { return Object.create(this); }, setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) { this.x = x; this.y = y; } }; return CanvasExtraState; })(); var CanvasGraphics = (function CanvasGraphicsClosure() { // Defines the time the executeOperatorList is going to be executing // before it stops and shedules a continue of execution. var EXECUTION_TIME = 15; // Defines the number of steps before checking the execution time var EXECUTION_STEPS = 10; function CanvasGraphics(canvasCtx, commonObjs, objs, imageLayer) { this.ctx = canvasCtx; this.current = new CanvasExtraState(); this.stateStack = []; this.pendingClip = null; this.pendingEOFill = false; this.res = null; this.xobjs = null; this.commonObjs = commonObjs; this.objs = objs; this.imageLayer = imageLayer; this.groupStack = []; this.processingType3 = null; // Patterns are painted relative to the initial page/form transform, see pdf // spec 8.7.2 NOTE 1. this.baseTransform = null; this.baseTransformStack = []; this.groupLevel = 0; this.smaskStack = []; this.smaskCounter = 0; this.tempSMask = null; this.cachedCanvases = new CachedCanvases(); if (canvasCtx) { // NOTE: if mozCurrentTransform is polyfilled, then the current state of // the transformation must already be set in canvasCtx._transformMatrix. addContextCurrentTransform(canvasCtx); } this.cachedGetSinglePixelWidth = null; } function putBinaryImageData(ctx, imgData) { if (typeof ImageData !== 'undefined' && imgData instanceof ImageData) { ctx.putImageData(imgData, 0, 0); return; } // Put the image data to the canvas in chunks, rather than putting the // whole image at once. This saves JS memory, because the ImageData object // is smaller. It also possibly saves C++ memory within the implementation // of putImageData(). (E.g. in Firefox we make two short-lived copies of // the data passed to putImageData()). |n| shouldn't be too small, however, // because too many putImageData() calls will slow things down. // // Note: as written, if the last chunk is partial, the putImageData() call // will (conceptually) put pixels past the bounds of the canvas. But // that's ok; any such pixels are ignored. var height = imgData.height, width = imgData.width; var partialChunkHeight = height % FULL_CHUNK_HEIGHT; var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); var srcPos = 0, destPos; var src = imgData.data; var dest = chunkImgData.data; var i, j, thisChunkHeight, elemsInThisChunk; // There are multiple forms in which the pixel data can be passed, and // imgData.kind tells us which one this is. if (imgData.kind === ImageKind.GRAYSCALE_1BPP) { // Grayscale, 1 bit per pixel (i.e. black-and-white). var srcLength = src.byteLength; var dest32 = HasCanvasTypedArraysCached.value ? new Uint32Array(dest.buffer) : new Uint32ArrayView(dest); var dest32DataLength = dest32.length; var fullSrcDiff = (width + 7) >> 3; var white = 0xFFFFFFFF; var black = (IsLittleEndianCached.value || !HasCanvasTypedArraysCached.value) ? 0xFF000000 : 0x000000FF; for (i = 0; i < totalChunks; i++) { thisChunkHeight = (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight; destPos = 0; for (j = 0; j < thisChunkHeight; j++) { var srcDiff = srcLength - srcPos; var k = 0; var kEnd = (srcDiff > fullSrcDiff) ? width : srcDiff * 8 - 7; var kEndUnrolled = kEnd & ~7; var mask = 0; var srcByte = 0; for (; k < kEndUnrolled; k += 8) { srcByte = src[srcPos++]; dest32[destPos++] = (srcByte & 128) ? white : black; dest32[destPos++] = (srcByte & 64) ? white : black; dest32[destPos++] = (srcByte & 32) ? white : black; dest32[destPos++] = (srcByte & 16) ? white : black; dest32[destPos++] = (srcByte & 8) ? white : black; dest32[destPos++] = (srcByte & 4) ? white : black; dest32[destPos++] = (srcByte & 2) ? white : black; dest32[destPos++] = (srcByte & 1) ? white : black; } for (; k < kEnd; k++) { if (mask === 0) { srcByte = src[srcPos++]; mask = 128; } dest32[destPos++] = (srcByte & mask) ? white : black; mask >>= 1; } } // We ran out of input. Make all remaining pixels transparent. while (destPos < dest32DataLength) { dest32[destPos++] = 0; } ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); } } else if (imgData.kind === ImageKind.RGBA_32BPP) { // RGBA, 32-bits per pixel. j = 0; elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4; for (i = 0; i < fullChunks; i++) { dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); srcPos += elemsInThisChunk; ctx.putImageData(chunkImgData, 0, j); j += FULL_CHUNK_HEIGHT; } if (i < totalChunks) { elemsInThisChunk = width * partialChunkHeight * 4; dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); ctx.putImageData(chunkImgData, 0, j); } } else if (imgData.kind === ImageKind.RGB_24BPP) { // RGB, 24-bits per pixel. thisChunkHeight = FULL_CHUNK_HEIGHT; elemsInThisChunk = width * thisChunkHeight; for (i = 0; i < totalChunks; i++) { if (i >= fullChunks) { thisChunkHeight = partialChunkHeight; elemsInThisChunk = width * thisChunkHeight; } destPos = 0; for (j = elemsInThisChunk; j--;) { dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++]; dest[destPos++] = 255; } ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); } } else { error('bad image kind: ' + imgData.kind); } } function putBinaryImageMask(ctx, imgData) { var height = imgData.height, width = imgData.width; var partialChunkHeight = height % FULL_CHUNK_HEIGHT; var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); var srcPos = 0; var src = imgData.data; var dest = chunkImgData.data; for (var i = 0; i < totalChunks; i++) { var thisChunkHeight = (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight; // Expand the mask so it can be used by the canvas. Any required // inversion has already been handled. var destPos = 3; // alpha component offset for (var j = 0; j < thisChunkHeight; j++) { var mask = 0; for (var k = 0; k < width; k++) { if (!mask) { var elem = src[srcPos++]; mask = 128; } dest[destPos] = (elem & mask) ? 0 : 255; destPos += 4; mask >>= 1; } } ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); } } function copyCtxState(sourceCtx, destCtx) { var properties = ['strokeStyle', 'fillStyle', 'fillRule', 'globalAlpha', 'lineWidth', 'lineCap', 'lineJoin', 'miterLimit', 'globalCompositeOperation', 'font']; for (var i = 0, ii = properties.length; i < ii; i++) { var property = properties[i]; if (sourceCtx[property] !== undefined) { destCtx[property] = sourceCtx[property]; } } if (sourceCtx.setLineDash !== undefined) { destCtx.setLineDash(sourceCtx.getLineDash()); destCtx.lineDashOffset = sourceCtx.lineDashOffset; } else if (sourceCtx.mozDashOffset !== undefined) { destCtx.mozDash = sourceCtx.mozDash; destCtx.mozDashOffset = sourceCtx.mozDashOffset; } } function composeSMaskBackdrop(bytes, r0, g0, b0) { var length = bytes.length; for (var i = 3; i < length; i += 4) { var alpha = bytes[i]; if (alpha === 0) { bytes[i - 3] = r0; bytes[i - 2] = g0; bytes[i - 1] = b0; } else if (alpha < 255) { var alpha_ = 255 - alpha; bytes[i - 3] = (bytes[i - 3] * alpha + r0 * alpha_) >> 8; bytes[i - 2] = (bytes[i - 2] * alpha + g0 * alpha_) >> 8; bytes[i - 1] = (bytes[i - 1] * alpha + b0 * alpha_) >> 8; } } } function composeSMaskAlpha(maskData, layerData, transferMap) { var length = maskData.length; var scale = 1 / 255; for (var i = 3; i < length; i += 4) { var alpha = transferMap ? transferMap[maskData[i]] : maskData[i]; layerData[i] = (layerData[i] * alpha * scale) | 0; } } function composeSMaskLuminosity(maskData, layerData, transferMap) { var length = maskData.length; for (var i = 3; i < length; i += 4) { var y = (maskData[i - 3] * 77) + // * 0.3 / 255 * 0x10000 (maskData[i - 2] * 152) + // * 0.59 .... (maskData[i - 1] * 28); // * 0.11 .... layerData[i] = transferMap ? (layerData[i] * transferMap[y >> 8]) >> 8 : (layerData[i] * y) >> 16; } } function genericComposeSMask(maskCtx, layerCtx, width, height, subtype, backdrop, transferMap) { var hasBackdrop = !!backdrop; var r0 = hasBackdrop ? backdrop[0] : 0; var g0 = hasBackdrop ? backdrop[1] : 0; var b0 = hasBackdrop ? backdrop[2] : 0; var composeFn; if (subtype === 'Luminosity') { composeFn = composeSMaskLuminosity; } else { composeFn = composeSMaskAlpha; } // processing image in chunks to save memory var PIXELS_TO_PROCESS = 1048576; var chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width)); for (var row = 0; row < height; row += chunkSize) { var chunkHeight = Math.min(chunkSize, height - row); var maskData = maskCtx.getImageData(0, row, width, chunkHeight); var layerData = layerCtx.getImageData(0, row, width, chunkHeight); if (hasBackdrop) { composeSMaskBackdrop(maskData.data, r0, g0, b0); } composeFn(maskData.data, layerData.data, transferMap); maskCtx.putImageData(layerData, 0, row); } } function composeSMask(ctx, smask, layerCtx) { var mask = smask.canvas; var maskCtx = smask.context; ctx.setTransform(smask.scaleX, 0, 0, smask.scaleY, smask.offsetX, smask.offsetY); var backdrop = smask.backdrop || null; if (!smask.transferMap && WebGLUtils.isEnabled) { var composed = WebGLUtils.composeSMask(layerCtx.canvas, mask, {subtype: smask.subtype, backdrop: backdrop}); ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.drawImage(composed, smask.offsetX, smask.offsetY); return; } genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height, smask.subtype, backdrop, smask.transferMap); ctx.drawImage(mask, 0, 0); } var LINE_CAP_STYLES = ['butt', 'round', 'square']; var LINE_JOIN_STYLES = ['miter', 'round', 'bevel']; var NORMAL_CLIP = {}; var EO_CLIP = {}; CanvasGraphics.prototype = { beginDrawing: function CanvasGraphics_beginDrawing(transform, viewport, transparency) { // For pdfs that use blend modes we have to clear the canvas else certain // blend modes can look wrong since we'd be blending with a white // backdrop. The problem with a transparent backdrop though is we then // don't get sub pixel anti aliasing on text, creating temporary // transparent canvas when we have blend modes. var width = this.ctx.canvas.width; var height = this.ctx.canvas.height; this.ctx.save(); this.ctx.fillStyle = 'rgb(255, 255, 255)'; this.ctx.fillRect(0, 0, width, height); this.ctx.restore(); if (transparency) { var transparentCanvas = this.cachedCanvases.getCanvas( 'transparent', width, height, true); this.compositeCtx = this.ctx; this.transparentCanvas = transparentCanvas.canvas; this.ctx = transparentCanvas.context; this.ctx.save(); // The transform can be applied before rendering, transferring it to // the new canvas. this.ctx.transform.apply(this.ctx, this.compositeCtx.mozCurrentTransform); } this.ctx.save(); if (transform) { this.ctx.transform.apply(this.ctx, transform); } this.ctx.transform.apply(this.ctx, viewport.transform); this.baseTransform = this.ctx.mozCurrentTransform.slice(); if (this.imageLayer) { this.imageLayer.beginLayout(); } }, executeOperatorList: function CanvasGraphics_executeOperatorList( operatorList, executionStartIdx, continueCallback, stepper) { var argsArray = operatorList.argsArray; var fnArray = operatorList.fnArray; var i = executionStartIdx || 0; var argsArrayLen = argsArray.length; // Sometimes the OperatorList to execute is empty. if (argsArrayLen === i) { return i; } var chunkOperations = (argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === 'function'); var endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0; var steps = 0; var commonObjs = this.commonObjs; var objs = this.objs; var fnId; while (true) { if (stepper !== undefined && i === stepper.nextBreakPoint) { stepper.breakIt(i, continueCallback); return i; } fnId = fnArray[i]; if (fnId !== OPS.dependency) { this[fnId].apply(this, argsArray[i]); } else { var deps = argsArray[i]; for (var n = 0, nn = deps.length; n < nn; n++) { var depObjId = deps[n]; var common = depObjId[0] === 'g' && depObjId[1] === '_'; var objsPool = common ? commonObjs : objs; // If the promise isn't resolved yet, add the continueCallback // to the promise and bail out. if (!objsPool.isResolved(depObjId)) { objsPool.get(depObjId, continueCallback); return i; } } } i++; // If the entire operatorList was executed, stop as were done. if (i === argsArrayLen) { return i; } // If the execution took longer then a certain amount of time and // `continueCallback` is specified, interrupt the execution. if (chunkOperations && ++steps > EXECUTION_STEPS) { if (Date.now() > endTime) { continueCallback(); return i; } steps = 0; } // If the operatorList isn't executed completely yet OR the execution // time was short enough, do another execution round. } }, endDrawing: function CanvasGraphics_endDrawing() { // Finishing all opened operations such as SMask group painting. if (this.current.activeSMask !== null) { this.endSMaskGroup(); } this.ctx.restore(); if (this.transparentCanvas) { this.ctx = this.compositeCtx; this.ctx.save(); this.ctx.setTransform(1, 0, 0, 1, 0, 0); // Avoid apply transform twice this.ctx.drawImage(this.transparentCanvas, 0, 0); this.ctx.restore(); this.transparentCanvas = null; } this.cachedCanvases.clear(); WebGLUtils.clear(); if (this.imageLayer) { this.imageLayer.endLayout(); } }, // Graphics state setLineWidth: function CanvasGraphics_setLineWidth(width) { this.current.lineWidth = width; this.ctx.lineWidth = width; }, setLineCap: function CanvasGraphics_setLineCap(style) { this.ctx.lineCap = LINE_CAP_STYLES[style]; }, setLineJoin: function CanvasGraphics_setLineJoin(style) { this.ctx.lineJoin = LINE_JOIN_STYLES[style]; }, setMiterLimit: function CanvasGraphics_setMiterLimit(limit) { this.ctx.miterLimit = limit; }, setDash: function CanvasGraphics_setDash(dashArray, dashPhase) { var ctx = this.ctx; if (ctx.setLineDash !== undefined) { ctx.setLineDash(dashArray); ctx.lineDashOffset = dashPhase; } else { ctx.mozDash = dashArray; ctx.mozDashOffset = dashPhase; } }, setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) { // Maybe if we one day fully support color spaces this will be important // for now we can ignore. // TODO set rendering intent? }, setFlatness: function CanvasGraphics_setFlatness(flatness) { // There's no way to control this with canvas, but we can safely ignore. // TODO set flatness? }, setGState: function CanvasGraphics_setGState(states) { for (var i = 0, ii = states.length; i < ii; i++) { var state = states[i]; var key = state[0]; var value = state[1]; switch (key) { case 'LW': this.setLineWidth(value); break; case 'LC': this.setLineCap(value); break; case 'LJ': this.setLineJoin(value); break; case 'ML': this.setMiterLimit(value); break; case 'D': this.setDash(value[0], value[1]); break; case 'RI': this.setRenderingIntent(value); break; case 'FL': this.setFlatness(value); break; case 'Font': this.setFont(value[0], value[1]); break; case 'CA': this.current.strokeAlpha = state[1]; break; case 'ca': this.current.fillAlpha = state[1]; this.ctx.globalAlpha = state[1]; break; case 'BM': if (value && value.name && (value.name !== 'Normal')) { var mode = value.name.replace(/([A-Z])/g, function(c) { return '-' + c.toLowerCase(); } ).substring(1); this.ctx.globalCompositeOperation = mode; if (this.ctx.globalCompositeOperation !== mode) { warn('globalCompositeOperation "' + mode + '" is not supported'); } } else { this.ctx.globalCompositeOperation = 'source-over'; } break; case 'SMask': if (this.current.activeSMask) { // If SMask is currrenly used, it needs to be suspended or // finished. Suspend only makes sense when at least one save() // was performed and state needs to be reverted on restore(). if (this.stateStack.length > 0 && (this.stateStack[this.stateStack.length - 1].activeSMask === this.current.activeSMask)) { this.suspendSMaskGroup(); } else { this.endSMaskGroup(); } } this.current.activeSMask = value ? this.tempSMask : null; if (this.current.activeSMask) { this.beginSMaskGroup(); } this.tempSMask = null; break; } } }, beginSMaskGroup: function CanvasGraphics_beginSMaskGroup() { var activeSMask = this.current.activeSMask; var drawnWidth = activeSMask.canvas.width; var drawnHeight = activeSMask.canvas.height; var cacheId = 'smaskGroupAt' + this.groupLevel; var scratchCanvas = this.cachedCanvases.getCanvas( cacheId, drawnWidth, drawnHeight, true); var currentCtx = this.ctx; var currentTransform = currentCtx.mozCurrentTransform; this.ctx.save(); var groupCtx = scratchCanvas.context; groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY); groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY); groupCtx.transform.apply(groupCtx, currentTransform); activeSMask.startTransformInverse = groupCtx.mozCurrentTransformInverse; copyCtxState(currentCtx, groupCtx); this.ctx = groupCtx; this.setGState([ ['BM', 'Normal'], ['ca', 1], ['CA', 1] ]); this.groupStack.push(currentCtx); this.groupLevel++; }, suspendSMaskGroup: function CanvasGraphics_endSMaskGroup() { // Similar to endSMaskGroup, the intermediate canvas has to be composed // and future ctx state restored. var groupCtx = this.ctx; this.groupLevel--; this.ctx = this.groupStack.pop(); composeSMask(this.ctx, this.current.activeSMask, groupCtx); this.ctx.restore(); this.ctx.save(); // save is needed since SMask will be resumed. copyCtxState(groupCtx, this.ctx); // Saving state for resuming. this.current.resumeSMaskCtx = groupCtx; // Transform was changed in the SMask canvas, reflecting this change on // this.ctx. var deltaTransform = Util.transform( this.current.activeSMask.startTransformInverse, groupCtx.mozCurrentTransform); this.ctx.transform.apply(this.ctx, deltaTransform); // SMask was composed, the results at the groupCtx can be cleared. groupCtx.save(); groupCtx.setTransform(1, 0, 0, 1, 0, 0); groupCtx.clearRect(0, 0, groupCtx.canvas.width, groupCtx.canvas.height); groupCtx.restore(); }, resumeSMaskGroup: function CanvasGraphics_endSMaskGroup() { // Resuming state saved by suspendSMaskGroup. We don't need to restore // any groupCtx state since restore() command (the only caller) will do // that for us. See also beginSMaskGroup. var groupCtx = this.current.resumeSMaskCtx; var currentCtx = this.ctx; this.ctx = groupCtx; this.groupStack.push(currentCtx); this.groupLevel++; }, endSMaskGroup: function CanvasGraphics_endSMaskGroup() { var groupCtx = this.ctx; this.groupLevel--; this.ctx = this.groupStack.pop(); composeSMask(this.ctx, this.current.activeSMask, groupCtx); this.ctx.restore(); copyCtxState(groupCtx, this.ctx); // Transform was changed in the SMask canvas, reflecting this change on // this.ctx. var deltaTransform = Util.transform( this.current.activeSMask.startTransformInverse, groupCtx.mozCurrentTransform); this.ctx.transform.apply(this.ctx, deltaTransform); }, save: function CanvasGraphics_save() { this.ctx.save(); var old = this.current; this.stateStack.push(old); this.current = old.clone(); this.current.resumeSMaskCtx = null; }, restore: function CanvasGraphics_restore() { // SMask was suspended, we just need to resume it. if (this.current.resumeSMaskCtx) { this.resumeSMaskGroup(); } // SMask has to be finished once there is no states that are using the // same SMask. if (this.current.activeSMask !== null && (this.stateStack.length === 0 || this.stateStack[this.stateStack.length - 1].activeSMask !== this.current.activeSMask)) { this.endSMaskGroup(); } if (this.stateStack.length !== 0) { this.current = this.stateStack.pop(); this.ctx.restore(); // Ensure that the clipping path is reset (fixes issue6413.pdf). this.pendingClip = null; this.cachedGetSinglePixelWidth = null; } }, transform: function CanvasGraphics_transform(a, b, c, d, e, f) { this.ctx.transform(a, b, c, d, e, f); this.cachedGetSinglePixelWidth = null; }, // Path constructPath: function CanvasGraphics_constructPath(ops, args) { var ctx = this.ctx; var current = this.current; var x = current.x, y = current.y; for (var i = 0, j = 0, ii = ops.length; i < ii; i++) { switch (ops[i] | 0) { case OPS.rectangle: x = args[j++]; y = args[j++]; var width = args[j++]; var height = args[j++]; if (width === 0) { width = this.getSinglePixelWidth(); } if (height === 0) { height = this.getSinglePixelWidth(); } var xw = x + width; var yh = y + height; this.ctx.moveTo(x, y); this.ctx.lineTo(xw, y); this.ctx.lineTo(xw, yh); this.ctx.lineTo(x, yh); this.ctx.lineTo(x, y); this.ctx.closePath(); break; case OPS.moveTo: x = args[j++]; y = args[j++]; ctx.moveTo(x, y); break; case OPS.lineTo: x = args[j++]; y = args[j++]; ctx.lineTo(x, y); break; case OPS.curveTo: x = args[j + 4]; y = args[j + 5]; ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], x, y); j += 6; break; case OPS.curveTo2: ctx.bezierCurveTo(x, y, args[j], args[j + 1], args[j + 2], args[j + 3]); x = args[j + 2]; y = args[j + 3]; j += 4; break; case OPS.curveTo3: x = args[j + 2]; y = args[j + 3]; ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y); j += 4; break; case OPS.closePath: ctx.closePath(); break; } } current.setCurrentPoint(x, y); }, closePath: function CanvasGraphics_closePath() { this.ctx.closePath(); }, stroke: function CanvasGraphics_stroke(consumePath) { consumePath = typeof consumePath !== 'undefined' ? consumePath : true; var ctx = this.ctx; var strokeColor = this.current.strokeColor; // Prevent drawing too thin lines by enforcing a minimum line width. ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR, this.current.lineWidth); // For stroke we want to temporarily change the global alpha to the // stroking alpha. ctx.globalAlpha = this.current.strokeAlpha; if (strokeColor && strokeColor.hasOwnProperty('type') && strokeColor.type === 'Pattern') { // for patterns, we transform to pattern space, calculate // the pattern, call stroke, and restore to user space ctx.save(); ctx.strokeStyle = strokeColor.getPattern(ctx, this); ctx.stroke(); ctx.restore(); } else { ctx.stroke(); } if (consumePath) { this.consumePath(); } // Restore the global alpha to the fill alpha ctx.globalAlpha = this.current.fillAlpha; }, closeStroke: function CanvasGraphics_closeStroke() { this.closePath(); this.stroke(); }, fill: function CanvasGraphics_fill(consumePath) { consumePath = typeof consumePath !== 'undefined' ? consumePath : true; var ctx = this.ctx; var fillColor = this.current.fillColor; var isPatternFill = this.current.patternFill; var needRestore = false; if (isPatternFill) { ctx.save(); if (this.baseTransform) { ctx.setTransform.apply(ctx, this.baseTransform); } ctx.fillStyle = fillColor.getPattern(ctx, this); needRestore = true; } if (this.pendingEOFill) { if (ctx.mozFillRule !== undefined) { ctx.mozFillRule = 'evenodd'; ctx.fill(); ctx.mozFillRule = 'nonzero'; } else { ctx.fill('evenodd'); } this.pendingEOFill = false; } else { ctx.fill(); } if (needRestore) { ctx.restore(); } if (consumePath) { this.consumePath(); } }, eoFill: function CanvasGraphics_eoFill() { this.pendingEOFill = true; this.fill(); }, fillStroke: function CanvasGraphics_fillStroke() { this.fill(false); this.stroke(false); this.consumePath(); }, eoFillStroke: function CanvasGraphics_eoFillStroke() { this.pendingEOFill = true; this.fillStroke(); }, closeFillStroke: function CanvasGraphics_closeFillStroke() { this.closePath(); this.fillStroke(); }, closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() { this.pendingEOFill = true; this.closePath(); this.fillStroke(); }, endPath: function CanvasGraphics_endPath() { this.consumePath(); }, // Clipping clip: function CanvasGraphics_clip() { this.pendingClip = NORMAL_CLIP; }, eoClip: function CanvasGraphics_eoClip() { this.pendingClip = EO_CLIP; }, // Text beginText: function CanvasGraphics_beginText() { this.current.textMatrix = IDENTITY_MATRIX; this.current.textMatrixScale = 1; this.current.x = this.current.lineX = 0; this.current.y = this.current.lineY = 0; }, endText: function CanvasGraphics_endText() { var paths = this.pendingTextPaths; var ctx = this.ctx; if (paths === undefined) { ctx.beginPath(); return; } ctx.save(); ctx.beginPath(); for (var i = 0; i < paths.length; i++) { var path = paths[i]; ctx.setTransform.apply(ctx, path.transform); ctx.translate(path.x, path.y); path.addToPath(ctx, path.fontSize); } ctx.restore(); ctx.clip(); ctx.beginPath(); delete this.pendingTextPaths; }, setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) { this.current.charSpacing = spacing; }, setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) { this.current.wordSpacing = spacing; }, setHScale: function CanvasGraphics_setHScale(scale) { this.current.textHScale = scale / 100; }, setLeading: function CanvasGraphics_setLeading(leading) { this.current.leading = -leading; }, setFont: function CanvasGraphics_setFont(fontRefName, size) { var fontObj = this.commonObjs.get(fontRefName); var current = this.current; if (!fontObj) { error('Can\'t find font for ' + fontRefName); } current.fontMatrix = (fontObj.fontMatrix ? fontObj.fontMatrix : FONT_IDENTITY_MATRIX); // A valid matrix needs all main diagonal elements to be non-zero // This also ensures we bypass FF bugzilla bug #719844. if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) { warn('Invalid font matrix for font ' + fontRefName); } // The spec for Tf (setFont) says that 'size' specifies the font 'scale', // and in some docs this can be negative (inverted x-y axes). if (size < 0) { size = -size; current.fontDirection = -1; } else { current.fontDirection = 1; } this.current.font = fontObj; this.current.fontSize = size; if (fontObj.isType3Font) { return; // we don't need ctx.font for Type3 fonts } var name = fontObj.loadedName || 'sans-serif'; var bold = fontObj.black ? (fontObj.bold ? '900' : 'bold') : (fontObj.bold ? 'bold' : 'normal'); var italic = fontObj.italic ? 'italic' : 'normal'; var typeface = '"' + name + '", ' + fontObj.fallbackName; // Some font backends cannot handle fonts below certain size. // Keeping the font at minimal size and using the fontSizeScale to change // the current transformation matrix before the fillText/strokeText. // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227 var browserFontSize = size < MIN_FONT_SIZE ? MIN_FONT_SIZE : size > MAX_FONT_SIZE ? MAX_FONT_SIZE : size; this.current.fontSizeScale = size / browserFontSize; var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface; this.ctx.font = rule; }, setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) { this.current.textRenderingMode = mode; }, setTextRise: function CanvasGraphics_setTextRise(rise) { this.current.textRise = rise; }, moveText: function CanvasGraphics_moveText(x, y) { this.current.x = this.current.lineX += x; this.current.y = this.current.lineY += y; }, setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) { this.setLeading(-y); this.moveText(x, y); }, setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) { this.current.textMatrix = [a, b, c, d, e, f]; this.current.textMatrixScale = Math.sqrt(a * a + b * b); this.current.x = this.current.lineX = 0; this.current.y = this.current.lineY = 0; }, nextLine: function CanvasGraphics_nextLine() { this.moveText(0, this.current.leading); }, paintChar: function CanvasGraphics_paintChar(character, x, y) { var ctx = this.ctx; var current = this.current; var font = current.font; var textRenderingMode = current.textRenderingMode; var fontSize = current.fontSize / current.fontSizeScale; var fillStrokeMode = textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; var isAddToPathSet = !!(textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG); var addToPath; if (font.disableFontFace || isAddToPathSet) { addToPath = font.getPathGenerator(this.commonObjs, character); } if (font.disableFontFace) { ctx.save(); ctx.translate(x, y); ctx.beginPath(); addToPath(ctx, fontSize); if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) { ctx.fill(); } if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { ctx.stroke(); } ctx.restore(); } else { if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) { ctx.fillText(character, x, y); } if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { ctx.strokeText(character, x, y); } } if (isAddToPathSet) { var paths = this.pendingTextPaths || (this.pendingTextPaths = []); paths.push({ transform: ctx.mozCurrentTransform, x: x, y: y, fontSize: fontSize, addToPath: addToPath }); } }, get isFontSubpixelAAEnabled() { // Checks if anti-aliasing is enabled when scaled text is painted. // On Windows GDI scaled fonts looks bad. var ctx = document.createElement('canvas').getContext('2d'); ctx.scale(1.5, 1); ctx.fillText('I', 0, 10); var data = ctx.getImageData(0, 0, 10, 10).data; var enabled = false; for (var i = 3; i < data.length; i += 4) { if (data[i] > 0 && data[i] < 255) { enabled = true; break; } } return shadow(this, 'isFontSubpixelAAEnabled', enabled); }, showText: function CanvasGraphics_showText(glyphs) { var current = this.current; var font = current.font; if (font.isType3Font) { return this.showType3Text(glyphs); } var fontSize = current.fontSize; if (fontSize === 0) { return; } var ctx = this.ctx; var fontSizeScale = current.fontSizeScale; var charSpacing = current.charSpacing; var wordSpacing = current.wordSpacing; var fontDirection = current.fontDirection; var textHScale = current.textHScale * fontDirection; var glyphsLength = glyphs.length; var vertical = font.vertical; var spacingDir = vertical ? 1 : -1; var defaultVMetrics = font.defaultVMetrics; var widthAdvanceScale = fontSize * current.fontMatrix[0]; var simpleFillText = current.textRenderingMode === TextRenderingMode.FILL && !font.disableFontFace; ctx.save(); ctx.transform.apply(ctx, current.textMatrix); ctx.translate(current.x, current.y + current.textRise); if (current.patternFill) { // TODO: Some shading patterns are not applied correctly to text, // e.g. issues 3988 and 5432, and ShowText-ShadingPattern.pdf. ctx.fillStyle = current.fillColor.getPattern(ctx, this); } if (fontDirection > 0) { ctx.scale(textHScale, -1); } else { ctx.scale(textHScale, 1); } var lineWidth = current.lineWidth; var scale = current.textMatrixScale; if (scale === 0 || lineWidth === 0) { var fillStrokeMode = current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { this.cachedGetSinglePixelWidth = null; lineWidth = this.getSinglePixelWidth() * MIN_WIDTH_FACTOR; } } else { lineWidth /= scale; } if (fontSizeScale !== 1.0) { ctx.scale(fontSizeScale, fontSizeScale); lineWidth /= fontSizeScale; } ctx.lineWidth = lineWidth; var x = 0, i; for (i = 0; i < glyphsLength; ++i) { var glyph = glyphs[i]; if (isNum(glyph)) { x += spacingDir * glyph * fontSize / 1000; continue; } var restoreNeeded = false; var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; var character = glyph.fontChar; var accent = glyph.accent; var scaledX, scaledY, scaledAccentX, scaledAccentY; var width = glyph.width; if (vertical) { var vmetric, vx, vy; vmetric = glyph.vmetric || defaultVMetrics; vx = glyph.vmetric ? vmetric[1] : width * 0.5; vx = -vx * widthAdvanceScale; vy = vmetric[2] * widthAdvanceScale; width = vmetric ? -vmetric[0] : width; scaledX = vx / fontSizeScale; scaledY = (x + vy) / fontSizeScale; } else { scaledX = x / fontSizeScale; scaledY = 0; } if (font.remeasure && width > 0) { // Some standard fonts may not have the exact width: rescale per // character if measured width is greater than expected glyph width // and subpixel-aa is enabled, otherwise just center the glyph. var measuredWidth = ctx.measureText(character).width * 1000 / fontSize * fontSizeScale; if (width < measuredWidth && this.isFontSubpixelAAEnabled) { var characterScaleX = width / measuredWidth; restoreNeeded = true; ctx.save(); ctx.scale(characterScaleX, 1); scaledX /= characterScaleX; } else if (width !== measuredWidth) { scaledX += (width - measuredWidth) / 2000 * fontSize / fontSizeScale; } } // Only attempt to draw the glyph if it is actually in the embedded font // file or if there isn't a font file so the fallback font is shown. if (glyph.isInFont || font.missingFile) { if (simpleFillText && !accent) { // common case ctx.fillText(character, scaledX, scaledY); } else { this.paintChar(character, scaledX, scaledY); if (accent) { scaledAccentX = scaledX + accent.offset.x / fontSizeScale; scaledAccentY = scaledY - accent.offset.y / fontSizeScale; this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY); } } } var charWidth = width * widthAdvanceScale + spacing * fontDirection; x += charWidth; if (restoreNeeded) { ctx.restore(); } } if (vertical) { current.y -= x * textHScale; } else { current.x += x * textHScale; } ctx.restore(); }, showType3Text: function CanvasGraphics_showType3Text(glyphs) { // Type3 fonts - each glyph is a "mini-PDF" var ctx = this.ctx; var current = this.current; var font = current.font; var fontSize = current.fontSize; var fontDirection = current.fontDirection; var spacingDir = font.vertical ? 1 : -1; var charSpacing = current.charSpacing; var wordSpacing = current.wordSpacing; var textHScale = current.textHScale * fontDirection; var fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX; var glyphsLength = glyphs.length; var isTextInvisible = current.textRenderingMode === TextRenderingMode.INVISIBLE; var i, glyph, width, spacingLength; if (isTextInvisible || fontSize === 0) { return; } this.cachedGetSinglePixelWidth = null; ctx.save(); ctx.transform.apply(ctx, current.textMatrix); ctx.translate(current.x, current.y); ctx.scale(textHScale, fontDirection); for (i = 0; i < glyphsLength; ++i) { glyph = glyphs[i]; if (isNum(glyph)) { spacingLength = spacingDir * glyph * fontSize / 1000; this.ctx.translate(spacingLength, 0); current.x += spacingLength * textHScale; continue; } var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; var operatorList = font.charProcOperatorList[glyph.operatorListId]; if (!operatorList) { warn('Type3 character \"' + glyph.operatorListId + '\" is not available'); continue; } this.processingType3 = glyph; this.save(); ctx.scale(fontSize, fontSize); ctx.transform.apply(ctx, fontMatrix); this.executeOperatorList(operatorList); this.restore(); var transformed = Util.applyTransform([glyph.width, 0], fontMatrix); width = transformed[0] * fontSize + spacing; ctx.translate(width, 0); current.x += width * textHScale; } ctx.restore(); this.processingType3 = null; }, // Type3 fonts setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) { // We can safely ignore this since the width should be the same // as the width in the Widths array. }, setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) { // TODO According to the spec we're also suppose to ignore any operators // that set color or include images while processing this type3 font. this.ctx.rect(llx, lly, urx - llx, ury - lly); this.clip(); this.endPath(); }, // Color getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) { var pattern; if (IR[0] === 'TilingPattern') { var color = IR[1]; var baseTransform = this.baseTransform || this.ctx.mozCurrentTransform.slice(); var self = this; var canvasGraphicsFactory = { createCanvasGraphics: function (ctx) { return new CanvasGraphics(ctx, self.commonObjs, self.objs); } }; pattern = new TilingPattern(IR, color, this.ctx, canvasGraphicsFactory, baseTransform); } else { pattern = getShadingPatternFromIR(IR); } return pattern; }, setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) { this.current.strokeColor = this.getColorN_Pattern(arguments); }, setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) { this.current.fillColor = this.getColorN_Pattern(arguments); this.current.patternFill = true; }, setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) { var color = Util.makeCssRgb(r, g, b); this.ctx.strokeStyle = color; this.current.strokeColor = color; }, setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) { var color = Util.makeCssRgb(r, g, b); this.ctx.fillStyle = color; this.current.fillColor = color; this.current.patternFill = false; }, shadingFill: function CanvasGraphics_shadingFill(patternIR) { var ctx = this.ctx; this.save(); var pattern = getShadingPatternFromIR(patternIR); ctx.fillStyle = pattern.getPattern(ctx, this, true); var inv = ctx.mozCurrentTransformInverse; if (inv) { var canvas = ctx.canvas; var width = canvas.width; var height = canvas.height; var bl = Util.applyTransform([0, 0], inv); var br = Util.applyTransform([0, height], inv); var ul = Util.applyTransform([width, 0], inv); var ur = Util.applyTransform([width, height], inv); var x0 = Math.min(bl[0], br[0], ul[0], ur[0]); var y0 = Math.min(bl[1], br[1], ul[1], ur[1]); var x1 = Math.max(bl[0], br[0], ul[0], ur[0]); var y1 = Math.max(bl[1], br[1], ul[1], ur[1]); this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0); } else { // HACK to draw the gradient onto an infinite rectangle. // PDF gradients are drawn across the entire image while // Canvas only allows gradients to be drawn in a rectangle // The following bug should allow us to remove this. // https://bugzilla.mozilla.org/show_bug.cgi?id=664884 this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10); } this.restore(); }, // Images beginInlineImage: function CanvasGraphics_beginInlineImage() { error('Should not call beginInlineImage'); }, beginImageData: function CanvasGraphics_beginImageData() { error('Should not call beginImageData'); }, paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix, bbox) { this.save(); this.baseTransformStack.push(this.baseTransform); if (isArray(matrix) && 6 === matrix.length) { this.transform.apply(this, matrix); } this.baseTransform = this.ctx.mozCurrentTransform; if (isArray(bbox) && 4 === bbox.length) { var width = bbox[2] - bbox[0]; var height = bbox[3] - bbox[1]; this.ctx.rect(bbox[0], bbox[1], width, height); this.clip(); this.endPath(); } }, paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() { this.restore(); this.baseTransform = this.baseTransformStack.pop(); }, beginGroup: function CanvasGraphics_beginGroup(group) { this.save(); var currentCtx = this.ctx; // TODO non-isolated groups - according to Rik at adobe non-isolated // group results aren't usually that different and they even have tools // that ignore this setting. Notes from Rik on implmenting: // - When you encounter an transparency group, create a new canvas with // the dimensions of the bbox // - copy the content from the previous canvas to the new canvas // - draw as usual // - remove the backdrop alpha: // alphaNew = 1 - (1 - alpha)/(1 - alphaBackdrop) with 'alpha' the alpha // value of your transparency group and 'alphaBackdrop' the alpha of the // backdrop // - remove background color: // colorNew = color - alphaNew *colorBackdrop /(1 - alphaNew) if (!group.isolated) { info('TODO: Support non-isolated groups.'); } // TODO knockout - supposedly possible with the clever use of compositing // modes. if (group.knockout) { warn('Knockout groups not supported.'); } var currentTransform = currentCtx.mozCurrentTransform; if (group.matrix) { currentCtx.transform.apply(currentCtx, group.matrix); } assert(group.bbox, 'Bounding box is required.'); // Based on the current transform figure out how big the bounding box // will actually be. var bounds = Util.getAxialAlignedBoundingBox( group.bbox, currentCtx.mozCurrentTransform); // Clip the bounding box to the current canvas. var canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height]; bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0]; // Use ceil in case we're between sizes so we don't create canvas that is // too small and make the canvas at least 1x1 pixels. var offsetX = Math.floor(bounds[0]); var offsetY = Math.floor(bounds[1]); var drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1); var drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1); var scaleX = 1, scaleY = 1; if (drawnWidth > MAX_GROUP_SIZE) { scaleX = drawnWidth / MAX_GROUP_SIZE; drawnWidth = MAX_GROUP_SIZE; } if (drawnHeight > MAX_GROUP_SIZE) { scaleY = drawnHeight / MAX_GROUP_SIZE; drawnHeight = MAX_GROUP_SIZE; } var cacheId = 'groupAt' + this.groupLevel; if (group.smask) { // Using two cache entries is case if masks are used one after another. cacheId += '_smask_' + ((this.smaskCounter++) % 2); } var scratchCanvas = this.cachedCanvases.getCanvas( cacheId, drawnWidth, drawnHeight, true); var groupCtx = scratchCanvas.context; // Since we created a new canvas that is just the size of the bounding box // we have to translate the group ctx. groupCtx.scale(1 / scaleX, 1 / scaleY); groupCtx.translate(-offsetX, -offsetY); groupCtx.transform.apply(groupCtx, currentTransform); if (group.smask) { // Saving state and cached mask to be used in setGState. this.smaskStack.push({ canvas: scratchCanvas.canvas, context: groupCtx, offsetX: offsetX, offsetY: offsetY, scaleX: scaleX, scaleY: scaleY, subtype: group.smask.subtype, backdrop: group.smask.backdrop, transferMap: group.smask.transferMap || null, startTransformInverse: null, // used during suspend operation }); } else { // Setup the current ctx so when the group is popped we draw it at the // right location. currentCtx.setTransform(1, 0, 0, 1, 0, 0); currentCtx.translate(offsetX, offsetY); currentCtx.scale(scaleX, scaleY); } // The transparency group inherits all off the current graphics state // except the blend mode, soft mask, and alpha constants. copyCtxState(currentCtx, groupCtx); this.ctx = groupCtx; this.setGState([ ['BM', 'Normal'], ['ca', 1], ['CA', 1] ]); this.groupStack.push(currentCtx); this.groupLevel++; // Reseting mask state, masks will be applied on restore of the group. this.current.activeSMask = null; }, endGroup: function CanvasGraphics_endGroup(group) { this.groupLevel--; var groupCtx = this.ctx; this.ctx = this.groupStack.pop(); // Turn off image smoothing to avoid sub pixel interpolation which can // look kind of blurry for some pdfs. if (this.ctx.imageSmoothingEnabled !== undefined) { this.ctx.imageSmoothingEnabled = false; } else { this.ctx.mozImageSmoothingEnabled = false; } if (group.smask) { this.tempSMask = this.smaskStack.pop(); } else { this.ctx.drawImage(groupCtx.canvas, 0, 0); } this.restore(); }, beginAnnotations: function CanvasGraphics_beginAnnotations() { this.save(); this.current = new CanvasExtraState(); if (this.baseTransform) { this.ctx.setTransform.apply(this.ctx, this.baseTransform); } }, endAnnotations: function CanvasGraphics_endAnnotations() { this.restore(); }, beginAnnotation: function CanvasGraphics_beginAnnotation(rect, transform, matrix) { this.save(); if (isArray(rect) && 4 === rect.length) { var width = rect[2] - rect[0]; var height = rect[3] - rect[1]; this.ctx.rect(rect[0], rect[1], width, height); this.clip(); this.endPath(); } this.transform.apply(this, transform); this.transform.apply(this, matrix); }, endAnnotation: function CanvasGraphics_endAnnotation() { this.restore(); }, paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) { var domImage = this.objs.get(objId); if (!domImage) { warn('Dependent image isn\'t ready yet'); return; } this.save(); var ctx = this.ctx; // scale the image to the unit square ctx.scale(1 / w, -1 / h); ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height, 0, -h, w, h); if (this.imageLayer) { var currentTransform = ctx.mozCurrentTransformInverse; var position = this.getCanvasPosition(0, 0); this.imageLayer.appendImage({ objId: objId, left: position[0], top: position[1], width: w / currentTransform[0], height: h / currentTransform[3] }); } this.restore(); }, paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(img) { var ctx = this.ctx; var width = img.width, height = img.height; var fillColor = this.current.fillColor; var isPatternFill = this.current.patternFill; var glyph = this.processingType3; if (COMPILE_TYPE3_GLYPHS && glyph && glyph.compiled === undefined) { if (width <= MAX_SIZE_TO_COMPILE && height <= MAX_SIZE_TO_COMPILE) { glyph.compiled = compileType3Glyph({data: img.data, width: width, height: height}); } else { glyph.compiled = null; } } if (glyph && glyph.compiled) { glyph.compiled(ctx); return; } var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', width, height); var maskCtx = maskCanvas.context; maskCtx.save(); putBinaryImageMask(maskCtx, img); maskCtx.globalCompositeOperation = 'source-in'; maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor; maskCtx.fillRect(0, 0, width, height); maskCtx.restore(); this.paintInlineImageXObject(maskCanvas.canvas); }, paintImageMaskXObjectRepeat: function CanvasGraphics_paintImageMaskXObjectRepeat(imgData, scaleX, scaleY, positions) { var width = imgData.width; var height = imgData.height; var fillColor = this.current.fillColor; var isPatternFill = this.current.patternFill; var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', width, height); var maskCtx = maskCanvas.context; maskCtx.save(); putBinaryImageMask(maskCtx, imgData); maskCtx.globalCompositeOperation = 'source-in'; maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor; maskCtx.fillRect(0, 0, width, height); maskCtx.restore(); var ctx = this.ctx; for (var i = 0, ii = positions.length; i < ii; i += 2) { ctx.save(); ctx.transform(scaleX, 0, 0, scaleY, positions[i], positions[i + 1]); ctx.scale(1, -1); ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1); ctx.restore(); } }, paintImageMaskXObjectGroup: function CanvasGraphics_paintImageMaskXObjectGroup(images) { var ctx = this.ctx; var fillColor = this.current.fillColor; var isPatternFill = this.current.patternFill; for (var i = 0, ii = images.length; i < ii; i++) { var image = images[i]; var width = image.width, height = image.height; var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', width, height); var maskCtx = maskCanvas.context; maskCtx.save(); putBinaryImageMask(maskCtx, image); maskCtx.globalCompositeOperation = 'source-in'; maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor; maskCtx.fillRect(0, 0, width, height); maskCtx.restore(); ctx.save(); ctx.transform.apply(ctx, image.transform); ctx.scale(1, -1); ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1); ctx.restore(); } }, paintImageXObject: function CanvasGraphics_paintImageXObject(objId) { var imgData = this.objs.get(objId); if (!imgData) { warn('Dependent image isn\'t ready yet'); return; } this.paintInlineImageXObject(imgData); }, paintImageXObjectRepeat: function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY, positions) { var imgData = this.objs.get(objId); if (!imgData) { warn('Dependent image isn\'t ready yet'); return; } var width = imgData.width; var height = imgData.height; var map = []; for (var i = 0, ii = positions.length; i < ii; i += 2) { map.push({transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]], x: 0, y: 0, w: width, h: height}); } this.paintInlineImageXObjectGroup(imgData, map); }, paintInlineImageXObject: function CanvasGraphics_paintInlineImageXObject(imgData) { var width = imgData.width; var height = imgData.height; var ctx = this.ctx; this.save(); // scale the image to the unit square ctx.scale(1 / width, -1 / height); var currentTransform = ctx.mozCurrentTransformInverse; var a = currentTransform[0], b = currentTransform[1]; var widthScale = Math.max(Math.sqrt(a * a + b * b), 1); var c = currentTransform[2], d = currentTransform[3]; var heightScale = Math.max(Math.sqrt(c * c + d * d), 1); var imgToPaint, tmpCanvas; // instanceof HTMLElement does not work in jsdom node.js module if (imgData instanceof HTMLElement || !imgData.data) { imgToPaint = imgData; } else { tmpCanvas = this.cachedCanvases.getCanvas('inlineImage', width, height); var tmpCtx = tmpCanvas.context; putBinaryImageData(tmpCtx, imgData); imgToPaint = tmpCanvas.canvas; } var paintWidth = width, paintHeight = height; var tmpCanvasId = 'prescale1'; // Vertial or horizontal scaling shall not be more than 2 to not loose the // pixels during drawImage operation, painting on the temporary canvas(es) // that are twice smaller in size while ((widthScale > 2 && paintWidth > 1) || (heightScale > 2 && paintHeight > 1)) { var newWidth = paintWidth, newHeight = paintHeight; if (widthScale > 2 && paintWidth > 1) { newWidth = Math.ceil(paintWidth / 2); widthScale /= paintWidth / newWidth; } if (heightScale > 2 && paintHeight > 1) { newHeight = Math.ceil(paintHeight / 2); heightScale /= paintHeight / newHeight; } tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight); tmpCtx = tmpCanvas.context; tmpCtx.clearRect(0, 0, newWidth, newHeight); tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight); imgToPaint = tmpCanvas.canvas; paintWidth = newWidth; paintHeight = newHeight; tmpCanvasId = tmpCanvasId === 'prescale1' ? 'prescale2' : 'prescale1'; } ctx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight, 0, -height, width, height); if (this.imageLayer) { var position = this.getCanvasPosition(0, -height); this.imageLayer.appendImage({ imgData: imgData, left: position[0], top: position[1], width: width / currentTransform[0], height: height / currentTransform[3] }); } this.restore(); }, paintInlineImageXObjectGroup: function CanvasGraphics_paintInlineImageXObjectGroup(imgData, map) { var ctx = this.ctx; var w = imgData.width; var h = imgData.height; var tmpCanvas = this.cachedCanvases.getCanvas('inlineImage', w, h); var tmpCtx = tmpCanvas.context; putBinaryImageData(tmpCtx, imgData); for (var i = 0, ii = map.length; i < ii; i++) { var entry = map[i]; ctx.save(); ctx.transform.apply(ctx, entry.transform); ctx.scale(1, -1); ctx.drawImage(tmpCanvas.canvas, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1); if (this.imageLayer) { var position = this.getCanvasPosition(entry.x, entry.y); this.imageLayer.appendImage({ imgData: imgData, left: position[0], top: position[1], width: w, height: h }); } ctx.restore(); } }, paintSolidColorImageMask: function CanvasGraphics_paintSolidColorImageMask() { this.ctx.fillRect(0, 0, 1, 1); }, paintXObject: function CanvasGraphics_paintXObject() { warn('Unsupported \'paintXObject\' command.'); }, // Marked content markPoint: function CanvasGraphics_markPoint(tag) { // TODO Marked content. }, markPointProps: function CanvasGraphics_markPointProps(tag, properties) { // TODO Marked content. }, beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) { // TODO Marked content. }, beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps( tag, properties) { // TODO Marked content. }, endMarkedContent: function CanvasGraphics_endMarkedContent() { // TODO Marked content. }, // Compatibility beginCompat: function CanvasGraphics_beginCompat() { // TODO ignore undefined operators (should we do that anyway?) }, endCompat: function CanvasGraphics_endCompat() { // TODO stop ignoring undefined operators }, // Helper functions consumePath: function CanvasGraphics_consumePath() { var ctx = this.ctx; if (this.pendingClip) { if (this.pendingClip === EO_CLIP) { if (ctx.mozFillRule !== undefined) { ctx.mozFillRule = 'evenodd'; ctx.clip(); ctx.mozFillRule = 'nonzero'; } else { ctx.clip('evenodd'); } } else { ctx.clip(); } this.pendingClip = null; } ctx.beginPath(); }, getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) { if (this.cachedGetSinglePixelWidth === null) { var inverse = this.ctx.mozCurrentTransformInverse; // max of the current horizontal and vertical scale this.cachedGetSinglePixelWidth = Math.sqrt(Math.max( (inverse[0] * inverse[0] + inverse[1] * inverse[1]), (inverse[2] * inverse[2] + inverse[3] * inverse[3]))); } return this.cachedGetSinglePixelWidth; }, getCanvasPosition: function CanvasGraphics_getCanvasPosition(x, y) { var transform = this.ctx.mozCurrentTransform; return [ transform[0] * x + transform[2] * y + transform[4], transform[1] * x + transform[3] * y + transform[5] ]; } }; for (var op in OPS) { CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op]; } return CanvasGraphics; })(); exports.CanvasGraphics = CanvasGraphics; exports.createScratchCanvas = createScratchCanvas; })); (function (root, factory) { { factory((root.pdfjsDisplayAPI = {}), root.pdfjsSharedUtil, root.pdfjsDisplayFontLoader, root.pdfjsDisplayCanvas, root.pdfjsDisplayMetadata, root.pdfjsDisplayDOMUtils); } }(this, function (exports, sharedUtil, displayFontLoader, displayCanvas, displayMetadata, displayDOMUtils, amdRequire) { var InvalidPDFException = sharedUtil.InvalidPDFException; var MessageHandler = sharedUtil.MessageHandler; var MissingPDFException = sharedUtil.MissingPDFException; var PageViewport = sharedUtil.PageViewport; var PasswordResponses = sharedUtil.PasswordResponses; var PasswordException = sharedUtil.PasswordException; var StatTimer = sharedUtil.StatTimer; var UnexpectedResponseException = sharedUtil.UnexpectedResponseException; var UnknownErrorException = sharedUtil.UnknownErrorException; var Util = sharedUtil.Util; var createPromiseCapability = sharedUtil.createPromiseCapability; var combineUrl = sharedUtil.combineUrl; var error = sharedUtil.error; var deprecated = sharedUtil.deprecated; var getVerbosityLevel = sharedUtil.getVerbosityLevel; var info = sharedUtil.info; var isArrayBuffer = sharedUtil.isArrayBuffer; var isSameOrigin = sharedUtil.isSameOrigin; var loadJpegStream = sharedUtil.loadJpegStream; var stringToBytes = sharedUtil.stringToBytes; var globalScope = sharedUtil.globalScope; var warn = sharedUtil.warn; var FontFaceObject = displayFontLoader.FontFaceObject; var FontLoader = displayFontLoader.FontLoader; var CanvasGraphics = displayCanvas.CanvasGraphics; var createScratchCanvas = displayCanvas.createScratchCanvas; var Metadata = displayMetadata.Metadata; var getDefaultSetting = displayDOMUtils.getDefaultSetting; var DEFAULT_RANGE_CHUNK_SIZE = 65536; // 2^16 = 65536 var isWorkerDisabled = false; var workerSrc; var isPostMessageTransfersDisabled = false; var useRequireEnsure = false; if (typeof window === 'undefined') { // node.js - disable worker and set require.ensure. isWorkerDisabled = true; if (typeof require.ensure === 'undefined') { require.ensure = require('node-ensure'); } useRequireEnsure = true; } if (typeof __webpack_require__ !== 'undefined') { useRequireEnsure = true; } if (typeof requirejs !== 'undefined' && requirejs.toUrl) { workerSrc = requirejs.toUrl('pdfjs-dist/build/pdf.worker.js'); } var dynamicLoaderSupported = typeof requirejs !== 'undefined' && requirejs.load; var fakeWorkerFilesLoader = useRequireEnsure ? (function (callback) { require.ensure([], function () { var worker = require('./pdf.worker.js'); callback(worker.WorkerMessageHandler); }); }) : dynamicLoaderSupported ? (function (callback) { requirejs(['pdfjs-dist/build/pdf.worker'], function (worker) { callback(worker.WorkerMessageHandler); }); }) : null; /** * Document initialization / loading parameters object. * * @typedef {Object} DocumentInitParameters * @property {string} url - The URL of the PDF. * @property {TypedArray|Array|string} data - Binary PDF data. Use typed arrays * (Uint8Array) to improve the memory usage. If PDF data is BASE64-encoded, * use atob() to convert it to a binary string first. * @property {Object} httpHeaders - Basic authentication headers. * @property {boolean} withCredentials - Indicates whether or not cross-site * Access-Control requests should be made using credentials such as cookies * or authorization headers. The default is false. * @property {string} password - For decrypting password-protected PDFs. * @property {TypedArray} initialData - A typed array with the first portion or * all of the pdf data. Used by the extension since some data is already * loaded before the switch to range requests. * @property {number} length - The PDF file length. It's used for progress * reports and range requests operations. * @property {PDFDataRangeTransport} range * @property {number} rangeChunkSize - Optional parameter to specify * maximum number of bytes fetched per range request. The default value is * 2^16 = 65536. * @property {PDFWorker} worker - The worker that will be used for the loading * and parsing of the PDF data. */ /** * @typedef {Object} PDFDocumentStats * @property {Array} streamTypes - Used stream types in the document (an item * is set to true if specific stream ID was used in the document). * @property {Array} fontTypes - Used font type in the document (an item is set * to true if specific font ID was used in the document). */ /** * This is the main entry point for loading a PDF and interacting with it. * NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR) * is used, which means it must follow the same origin rules that any XHR does * e.g. No cross domain requests without CORS. * * @param {string|TypedArray|DocumentInitParameters|PDFDataRangeTransport} src * Can be a url to where a PDF is located, a typed array (Uint8Array) * already populated with data or parameter object. * * @param {PDFDataRangeTransport} pdfDataRangeTransport (deprecated) It is used * if you want to manually serve range requests for data in the PDF. * * @param {function} passwordCallback (deprecated) It is used to request a * password if wrong or no password was provided. The callback receives two * parameters: function that needs to be called with new password and reason * (see {PasswordResponses}). * * @param {function} progressCallback (deprecated) It is used to be able to * monitor the loading progress of the PDF file (necessary to implement e.g. * a loading bar). The callback receives an {Object} with the properties: * {number} loaded and {number} total. * * @return {PDFDocumentLoadingTask} */ function getDocument(src, pdfDataRangeTransport, passwordCallback, progressCallback) { var task = new PDFDocumentLoadingTask(); // Support of the obsolete arguments (for compatibility with API v1.0) if (arguments.length > 1) { deprecated('getDocument is called with pdfDataRangeTransport, ' + 'passwordCallback or progressCallback argument'); } if (pdfDataRangeTransport) { if (!(pdfDataRangeTransport instanceof PDFDataRangeTransport)) { // Not a PDFDataRangeTransport instance, trying to add missing properties. pdfDataRangeTransport = Object.create(pdfDataRangeTransport); pdfDataRangeTransport.length = src.length; pdfDataRangeTransport.initialData = src.initialData; if (!pdfDataRangeTransport.abort) { pdfDataRangeTransport.abort = function () {}; } } src = Object.create(src); src.range = pdfDataRangeTransport; } task.onPassword = passwordCallback || null; task.onProgress = progressCallback || null; var source; if (typeof src === 'string') { source = { url: src }; } else if (isArrayBuffer(src)) { source = { data: src }; } else if (src instanceof PDFDataRangeTransport) { source = { range: src }; } else { if (typeof src !== 'object') { error('Invalid parameter in getDocument, need either Uint8Array, ' + 'string or a parameter object'); } if (!src.url && !src.data && !src.range) { error('Invalid parameter object: need either .data, .range or .url'); } source = src; } var params = {}; var rangeTransport = null; var worker = null; for (var key in source) { if (key === 'url' && typeof window !== 'undefined') { // The full path is required in the 'url' field. params[key] = combineUrl(window.location.href, source[key]); continue; } else if (key === 'range') { rangeTransport = source[key]; continue; } else if (key === 'worker') { worker = source[key]; continue; } else if (key === 'data' && !(source[key] instanceof Uint8Array)) { // Converting string or array-like data to Uint8Array. var pdfBytes = source[key]; if (typeof pdfBytes === 'string') { params[key] = stringToBytes(pdfBytes); } else if (typeof pdfBytes === 'object' && pdfBytes !== null && !isNaN(pdfBytes.length)) { params[key] = new Uint8Array(pdfBytes); } else if (isArrayBuffer(pdfBytes)) { params[key] = new Uint8Array(pdfBytes); } else { error('Invalid PDF binary data: either typed array, string or ' + 'array-like object is expected in the data property.'); } continue; } params[key] = source[key]; } params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE; if (!worker) { // Worker was not provided -- creating and owning our own. worker = new PDFWorker(); task._worker = worker; } var docId = task.docId; worker.promise.then(function () { if (task.destroyed) { throw new Error('Loading aborted'); } return _fetchDocument(worker, params, rangeTransport, docId).then( function (workerId) { if (task.destroyed) { throw new Error('Loading aborted'); } var messageHandler = new MessageHandler(docId, workerId, worker.port); var transport = new WorkerTransport(messageHandler, task, rangeTransport); task._transport = transport; messageHandler.send('Ready', null); }); }).catch(task._capability.reject); return task; } /** * Starts fetching of specified PDF document/data. * @param {PDFWorker} worker * @param {Object} source * @param {PDFDataRangeTransport} pdfDataRangeTransport * @param {string} docId Unique document id, used as MessageHandler id. * @returns {Promise} The promise, which is resolved when worker id of * MessageHandler is known. * @private */ function _fetchDocument(worker, source, pdfDataRangeTransport, docId) { if (worker.destroyed) { return Promise.reject(new Error('Worker was destroyed')); } source.disableAutoFetch = getDefaultSetting('disableAutoFetch'); source.disableStream = getDefaultSetting('disableStream'); source.chunkedViewerLoading = !!pdfDataRangeTransport; if (pdfDataRangeTransport) { source.length = pdfDataRangeTransport.length; source.initialData = pdfDataRangeTransport.initialData; } return worker.messageHandler.sendWithPromise('GetDocRequest', { docId: docId, source: source, disableRange: getDefaultSetting('disableRange'), maxImageSize: getDefaultSetting('maxImageSize'), cMapUrl: getDefaultSetting('cMapUrl'), cMapPacked: getDefaultSetting('cMapPacked'), disableFontFace: getDefaultSetting('disableFontFace'), disableCreateObjectURL: getDefaultSetting('disableCreateObjectURL'), postMessageTransfers: getDefaultSetting('postMessageTransfers') && !isPostMessageTransfersDisabled, }).then(function (workerId) { if (worker.destroyed) { throw new Error('Worker was destroyed'); } return workerId; }); } /** * PDF document loading operation. * @class * @alias PDFDocumentLoadingTask */ var PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() { var nextDocumentId = 0; /** @constructs PDFDocumentLoadingTask */ function PDFDocumentLoadingTask() { this._capability = createPromiseCapability(); this._transport = null; this._worker = null; /** * Unique document loading task id -- used in MessageHandlers. * @type {string} */ this.docId = 'd' + (nextDocumentId++); /** * Shows if loading task is destroyed. * @type {boolean} */ this.destroyed = false; /** * Callback to request a password if wrong or no password was provided. * The callback receives two parameters: function that needs to be called * with new password and reason (see {PasswordResponses}). */ this.onPassword = null; /** * Callback to be able to monitor the loading progress of the PDF file * (necessary to implement e.g. a loading bar). The callback receives * an {Object} with the properties: {number} loaded and {number} total. */ this.onProgress = null; /** * Callback to when unsupported feature is used. The callback receives * an {UNSUPPORTED_FEATURES} argument. */ this.onUnsupportedFeature = null; } PDFDocumentLoadingTask.prototype = /** @lends PDFDocumentLoadingTask.prototype */ { /** * @return {Promise} */ get promise() { return this._capability.promise; }, /** * Aborts all network requests and destroys worker. * @return {Promise} A promise that is resolved after destruction activity * is completed. */ destroy: function () { this.destroyed = true; var transportDestroyed = !this._transport ? Promise.resolve() : this._transport.destroy(); return transportDestroyed.then(function () { this._transport = null; if (this._worker) { this._worker.destroy(); this._worker = null; } }.bind(this)); }, /** * Registers callbacks to indicate the document loading completion. * * @param {function} onFulfilled The callback for the loading completion. * @param {function} onRejected The callback for the loading failure. * @return {Promise} A promise that is resolved after the onFulfilled or * onRejected callback. */ then: function PDFDocumentLoadingTask_then(onFulfilled, onRejected) { return this.promise.then.apply(this.promise, arguments); } }; return PDFDocumentLoadingTask; })(); /** * Abstract class to support range requests file loading. * @class * @alias PDFDataRangeTransport * @param {number} length * @param {Uint8Array} initialData */ var PDFDataRangeTransport = (function pdfDataRangeTransportClosure() { function PDFDataRangeTransport(length, initialData) { this.length = length; this.initialData = initialData; this._rangeListeners = []; this._progressListeners = []; this._progressiveReadListeners = []; this._readyCapability = createPromiseCapability(); } PDFDataRangeTransport.prototype = /** @lends PDFDataRangeTransport.prototype */ { addRangeListener: function PDFDataRangeTransport_addRangeListener(listener) { this._rangeListeners.push(listener); }, addProgressListener: function PDFDataRangeTransport_addProgressListener(listener) { this._progressListeners.push(listener); }, addProgressiveReadListener: function PDFDataRangeTransport_addProgressiveReadListener(listener) { this._progressiveReadListeners.push(listener); }, onDataRange: function PDFDataRangeTransport_onDataRange(begin, chunk) { var listeners = this._rangeListeners; for (var i = 0, n = listeners.length; i < n; ++i) { listeners[i](begin, chunk); } }, onDataProgress: function PDFDataRangeTransport_onDataProgress(loaded) { this._readyCapability.promise.then(function () { var listeners = this._progressListeners; for (var i = 0, n = listeners.length; i < n; ++i) { listeners[i](loaded); } }.bind(this)); }, onDataProgressiveRead: function PDFDataRangeTransport_onDataProgress(chunk) { this._readyCapability.promise.then(function () { var listeners = this._progressiveReadListeners; for (var i = 0, n = listeners.length; i < n; ++i) { listeners[i](chunk); } }.bind(this)); }, transportReady: function PDFDataRangeTransport_transportReady() { this._readyCapability.resolve(); }, requestDataRange: function PDFDataRangeTransport_requestDataRange(begin, end) { throw new Error('Abstract method PDFDataRangeTransport.requestDataRange'); }, abort: function PDFDataRangeTransport_abort() { } }; return PDFDataRangeTransport; })(); /** * Proxy to a PDFDocument in the worker thread. Also, contains commonly used * properties that can be read synchronously. * @class * @alias PDFDocumentProxy */ var PDFDocumentProxy = (function PDFDocumentProxyClosure() { function PDFDocumentProxy(pdfInfo, transport, loadingTask) { this.pdfInfo = pdfInfo; this.transport = transport; this.loadingTask = loadingTask; } PDFDocumentProxy.prototype = /** @lends PDFDocumentProxy.prototype */ { /** * @return {number} Total number of pages the PDF contains. */ get numPages() { return this.pdfInfo.numPages; }, /** * @return {string} A unique ID to identify a PDF. Not guaranteed to be * unique. */ get fingerprint() { return this.pdfInfo.fingerprint; }, /** * @param {number} pageNumber The page number to get. The first page is 1. * @return {Promise} A promise that is resolved with a {@link PDFPageProxy} * object. */ getPage: function PDFDocumentProxy_getPage(pageNumber) { return this.transport.getPage(pageNumber); }, /** * @param {{num: number, gen: number}} ref The page reference. Must have * the 'num' and 'gen' properties. * @return {Promise} A promise that is resolved with the page index that is * associated with the reference. */ getPageIndex: function PDFDocumentProxy_getPageIndex(ref) { return this.transport.getPageIndex(ref); }, /** * @return {Promise} A promise that is resolved with a lookup table for * mapping named destinations to reference numbers. * * This can be slow for large documents: use getDestination instead */ getDestinations: function PDFDocumentProxy_getDestinations() { return this.transport.getDestinations(); }, /** * @param {string} id The named destination to get. * @return {Promise} A promise that is resolved with all information * of the given named destination. */ getDestination: function PDFDocumentProxy_getDestination(id) { return this.transport.getDestination(id); }, /** * @return {Promise} A promise that is resolved with: * an Array containing the pageLabels that correspond to the pageIndexes, * or `null` when no pageLabels are present in the PDF file. */ getPageLabels: function PDFDocumentProxy_getPageLabels() { return this.transport.getPageLabels(); }, /** * @return {Promise} A promise that is resolved with a lookup table for * mapping named attachments to their content. */ getAttachments: function PDFDocumentProxy_getAttachments() { return this.transport.getAttachments(); }, /** * @return {Promise} A promise that is resolved with an array of all the * JavaScript strings in the name tree. */ getJavaScript: function PDFDocumentProxy_getJavaScript() { return this.transport.getJavaScript(); }, /** * @return {Promise} A promise that is resolved with an {Array} that is a * tree outline (if it has one) of the PDF. The tree is in the format of: * [ * { * title: string, * bold: boolean, * italic: boolean, * color: rgb Uint8Array, * dest: dest obj, * url: string, * items: array of more items like this * }, * ... * ]. */ getOutline: function PDFDocumentProxy_getOutline() { return this.transport.getOutline(); }, /** * @return {Promise} A promise that is resolved with an {Object} that has * info and metadata properties. Info is an {Object} filled with anything * available in the information dictionary and similarly metadata is a * {Metadata} object with information from the metadata section of the PDF. */ getMetadata: function PDFDocumentProxy_getMetadata() { return this.transport.getMetadata(); }, /** * @return {Promise} A promise that is resolved with a TypedArray that has * the raw data from the PDF. */ getData: function PDFDocumentProxy_getData() { return this.transport.getData(); }, /** * @return {Promise} A promise that is resolved when the document's data * is loaded. It is resolved with an {Object} that contains the length * property that indicates size of the PDF data in bytes. */ getDownloadInfo: function PDFDocumentProxy_getDownloadInfo() { return this.transport.downloadInfoCapability.promise; }, /** * @return {Promise} A promise this is resolved with current stats about * document structures (see {@link PDFDocumentStats}). */ getStats: function PDFDocumentProxy_getStats() { return this.transport.getStats(); }, /** * Cleans up resources allocated by the document, e.g. created @font-face. */ cleanup: function PDFDocumentProxy_cleanup() { this.transport.startCleanup(); }, /** * Destroys current document instance and terminates worker. */ destroy: function PDFDocumentProxy_destroy() { return this.loadingTask.destroy(); } }; return PDFDocumentProxy; })(); /** * Page getTextContent parameters. * * @typedef {Object} getTextContentParameters * @param {boolean} normalizeWhitespace - replaces all occurrences of * whitespace with standard spaces (0x20). The default value is `false`. */ /** * Page text content. * * @typedef {Object} TextContent * @property {array} items - array of {@link TextItem} * @property {Object} styles - {@link TextStyles} objects, indexed by font * name. */ /** * Page text content part. * * @typedef {Object} TextItem * @property {string} str - text content. * @property {string} dir - text direction: 'ttb', 'ltr' or 'rtl'. * @property {array} transform - transformation matrix. * @property {number} width - width in device space. * @property {number} height - height in device space. * @property {string} fontName - font name used by pdf.js for converted font. */ /** * Text style. * * @typedef {Object} TextStyle * @property {number} ascent - font ascent. * @property {number} descent - font descent. * @property {boolean} vertical - text is in vertical mode. * @property {string} fontFamily - possible font family */ /** * Page annotation parameters. * * @typedef {Object} GetAnnotationsParameters * @param {string} intent - Determines the annotations that will be fetched, * can be either 'display' (viewable annotations) or 'print' * (printable annotations). * If the parameter is omitted, all annotations are fetched. */ /** * Page render parameters. * * @typedef {Object} RenderParameters * @property {Object} canvasContext - A 2D context of a DOM Canvas object. * @property {PageViewport} viewport - Rendering viewport obtained by * calling of PDFPage.getViewport method. * @property {string} intent - Rendering intent, can be 'display' or 'print' * (default value is 'display'). * @property {Array} transform - (optional) Additional transform, applied * just before viewport transform. * @property {Object} imageLayer - (optional) An object that has beginLayout, * endLayout and appendImage functions. * @property {function} continueCallback - (deprecated) A function that will be * called each time the rendering is paused. To continue * rendering call the function that is the first argument * to the callback. */ /** * PDF page operator list. * * @typedef {Object} PDFOperatorList * @property {Array} fnArray - Array containing the operator functions. * @property {Array} argsArray - Array containing the arguments of the * functions. */ /** * Proxy to a PDFPage in the worker thread. * @class * @alias PDFPageProxy */ var PDFPageProxy = (function PDFPageProxyClosure() { function PDFPageProxy(pageIndex, pageInfo, transport) { this.pageIndex = pageIndex; this.pageInfo = pageInfo; this.transport = transport; this.stats = new StatTimer(); this.stats.enabled = getDefaultSetting('enableStats'); this.commonObjs = transport.commonObjs; this.objs = new PDFObjects(); this.cleanupAfterRender = false; this.pendingCleanup = false; this.intentStates = Object.create(null); this.destroyed = false; } PDFPageProxy.prototype = /** @lends PDFPageProxy.prototype */ { /** * @return {number} Page number of the page. First page is 1. */ get pageNumber() { return this.pageIndex + 1; }, /** * @return {number} The number of degrees the page is rotated clockwise. */ get rotate() { return this.pageInfo.rotate; }, /** * @return {Object} The reference that points to this page. It has 'num' and * 'gen' properties. */ get ref() { return this.pageInfo.ref; }, /** * @return {Array} An array of the visible portion of the PDF page in the * user space units - [x1, y1, x2, y2]. */ get view() { return this.pageInfo.view; }, /** * @param {number} scale The desired scale of the viewport. * @param {number} rotate Degrees to rotate the viewport. If omitted this * defaults to the page rotation. * @return {PageViewport} Contains 'width' and 'height' properties * along with transforms required for rendering. */ getViewport: function PDFPageProxy_getViewport(scale, rotate) { if (arguments.length < 2) { rotate = this.rotate; } return new PageViewport(this.view, scale, rotate, 0, 0); }, /** * @param {GetAnnotationsParameters} params - Annotation parameters. * @return {Promise} A promise that is resolved with an {Array} of the * annotation objects. */ getAnnotations: function PDFPageProxy_getAnnotations(params) { var intent = (params && params.intent) || null; if (!this.annotationsPromise || this.annotationsIntent !== intent) { this.annotationsPromise = this.transport.getAnnotations(this.pageIndex, intent); this.annotationsIntent = intent; } return this.annotationsPromise; }, /** * Begins the process of rendering a page to the desired context. * @param {RenderParameters} params Page render parameters. * @return {RenderTask} An object that contains the promise, which * is resolved when the page finishes rendering. */ render: function PDFPageProxy_render(params) { var stats = this.stats; stats.time('Overall'); // If there was a pending destroy cancel it so no cleanup happens during // this call to render. this.pendingCleanup = false; var renderingIntent = (params.intent === 'print' ? 'print' : 'display'); if (!this.intentStates[renderingIntent]) { this.intentStates[renderingIntent] = Object.create(null); } var intentState = this.intentStates[renderingIntent]; // If there's no displayReadyCapability yet, then the operatorList // was never requested before. Make the request and create the promise. if (!intentState.displayReadyCapability) { intentState.receivingOperatorList = true; intentState.displayReadyCapability = createPromiseCapability(); intentState.operatorList = { fnArray: [], argsArray: [], lastChunk: false }; this.stats.time('Page Request'); this.transport.messageHandler.send('RenderPageRequest', { pageIndex: this.pageNumber - 1, intent: renderingIntent }); } var internalRenderTask = new InternalRenderTask(complete, params, this.objs, this.commonObjs, intentState.operatorList, this.pageNumber); internalRenderTask.useRequestAnimationFrame = renderingIntent !== 'print'; if (!intentState.renderTasks) { intentState.renderTasks = []; } intentState.renderTasks.push(internalRenderTask); var renderTask = internalRenderTask.task; // Obsolete parameter support if (params.continueCallback) { deprecated('render is used with continueCallback parameter'); renderTask.onContinue = params.continueCallback; } var self = this; intentState.displayReadyCapability.promise.then( function pageDisplayReadyPromise(transparency) { if (self.pendingCleanup) { complete(); return; } stats.time('Rendering'); internalRenderTask.initalizeGraphics(transparency); internalRenderTask.operatorListChanged(); }, function pageDisplayReadPromiseError(reason) { complete(reason); } ); function complete(error) { var i = intentState.renderTasks.indexOf(internalRenderTask); if (i >= 0) { intentState.renderTasks.splice(i, 1); } if (self.cleanupAfterRender) { self.pendingCleanup = true; } self._tryCleanup(); if (error) { internalRenderTask.capability.reject(error); } else { internalRenderTask.capability.resolve(); } stats.timeEnd('Rendering'); stats.timeEnd('Overall'); } return renderTask; }, /** * @return {Promise} A promise resolved with an {@link PDFOperatorList} * object that represents page's operator list. */ getOperatorList: function PDFPageProxy_getOperatorList() { function operatorListChanged() { if (intentState.operatorList.lastChunk) { intentState.opListReadCapability.resolve(intentState.operatorList); var i = intentState.renderTasks.indexOf(opListTask); if (i >= 0) { intentState.renderTasks.splice(i, 1); } } } var renderingIntent = 'oplist'; if (!this.intentStates[renderingIntent]) { this.intentStates[renderingIntent] = Object.create(null); } var intentState = this.intentStates[renderingIntent]; var opListTask; if (!intentState.opListReadCapability) { opListTask = {}; opListTask.operatorListChanged = operatorListChanged; intentState.receivingOperatorList = true; intentState.opListReadCapability = createPromiseCapability(); intentState.renderTasks = []; intentState.renderTasks.push(opListTask); intentState.operatorList = { fnArray: [], argsArray: [], lastChunk: false }; this.transport.messageHandler.send('RenderPageRequest', { pageIndex: this.pageIndex, intent: renderingIntent }); } return intentState.opListReadCapability.promise; }, /** * @param {getTextContentParameters} params - getTextContent parameters. * @return {Promise} That is resolved a {@link TextContent} * object that represent the page text content. */ getTextContent: function PDFPageProxy_getTextContent(params) { var normalizeWhitespace = (params && params.normalizeWhitespace) || false; return this.transport.messageHandler.sendWithPromise('GetTextContent', { pageIndex: this.pageNumber - 1, normalizeWhitespace: normalizeWhitespace, }); }, /** * Destroys page object. */ _destroy: function PDFPageProxy_destroy() { this.destroyed = true; this.transport.pageCache[this.pageIndex] = null; var waitOn = []; Object.keys(this.intentStates).forEach(function(intent) { if (intent === 'oplist') { // Avoid errors below, since the renderTasks are just stubs. return; } var intentState = this.intentStates[intent]; intentState.renderTasks.forEach(function(renderTask) { var renderCompleted = renderTask.capability.promise. catch(function () {}); // ignoring failures waitOn.push(renderCompleted); renderTask.cancel(); }); }, this); this.objs.clear(); this.annotationsPromise = null; this.pendingCleanup = false; return Promise.all(waitOn); }, /** * Cleans up resources allocated by the page. (deprecated) */ destroy: function() { deprecated('page destroy method, use cleanup() instead'); this.cleanup(); }, /** * Cleans up resources allocated by the page. */ cleanup: function PDFPageProxy_cleanup() { this.pendingCleanup = true; this._tryCleanup(); }, /** * For internal use only. Attempts to clean up if rendering is in a state * where that's possible. * @ignore */ _tryCleanup: function PDFPageProxy_tryCleanup() { if (!this.pendingCleanup || Object.keys(this.intentStates).some(function(intent) { var intentState = this.intentStates[intent]; return (intentState.renderTasks.length !== 0 || intentState.receivingOperatorList); }, this)) { return; } Object.keys(this.intentStates).forEach(function(intent) { delete this.intentStates[intent]; }, this); this.objs.clear(); this.annotationsPromise = null; this.pendingCleanup = false; }, /** * For internal use only. * @ignore */ _startRenderPage: function PDFPageProxy_startRenderPage(transparency, intent) { var intentState = this.intentStates[intent]; // TODO Refactor RenderPageRequest to separate rendering // and operator list logic if (intentState.displayReadyCapability) { intentState.displayReadyCapability.resolve(transparency); } }, /** * For internal use only. * @ignore */ _renderPageChunk: function PDFPageProxy_renderPageChunk(operatorListChunk, intent) { var intentState = this.intentStates[intent]; var i, ii; // Add the new chunk to the current operator list. for (i = 0, ii = operatorListChunk.length; i < ii; i++) { intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]); intentState.operatorList.argsArray.push( operatorListChunk.argsArray[i]); } intentState.operatorList.lastChunk = operatorListChunk.lastChunk; // Notify all the rendering tasks there are more operators to be consumed. for (i = 0; i < intentState.renderTasks.length; i++) { intentState.renderTasks[i].operatorListChanged(); } if (operatorListChunk.lastChunk) { intentState.receivingOperatorList = false; this._tryCleanup(); } } }; return PDFPageProxy; })(); /** * PDF.js web worker abstraction, it controls instantiation of PDF documents and * WorkerTransport for them. If creation of a web worker is not possible, * a "fake" worker will be used instead. * @class */ var PDFWorker = (function PDFWorkerClosure() { var nextFakeWorkerId = 0; function getWorkerSrc() { if (typeof workerSrc !== 'undefined') { return workerSrc; } if (getDefaultSetting('workerSrc')) { return getDefaultSetting('workerSrc'); } if (pdfjsFilePath) { return pdfjsFilePath.replace(/\.js$/i, '.worker.js'); } error('No PDFJS.workerSrc specified'); } var fakeWorkerFilesLoadedCapability; // Loads worker code into main thread. function setupFakeWorkerGlobal() { var WorkerMessageHandler; if (!fakeWorkerFilesLoadedCapability) { fakeWorkerFilesLoadedCapability = createPromiseCapability(); // In the developer build load worker_loader which in turn loads all the // other files and resolves the promise. In production only the // pdf.worker.js file is needed. var loader = fakeWorkerFilesLoader || function (callback) { Util.loadScript(getWorkerSrc(), function () { callback(window.pdfjsDistBuildPdfWorker.WorkerMessageHandler); }); }; loader(fakeWorkerFilesLoadedCapability.resolve); } return fakeWorkerFilesLoadedCapability.promise; } function createCDNWrapper(url) { // We will rely on blob URL's property to specify origin. // We want this function to fail in case if createObjectURL or Blob do not // exist or fail for some reason -- our Worker creation will fail anyway. var wrapper = 'importScripts(\'' + url + '\');'; return URL.createObjectURL(new Blob([wrapper])); } function PDFWorker(name) { this.name = name; this.destroyed = false; this._readyCapability = createPromiseCapability(); this._port = null; this._webWorker = null; this._messageHandler = null; this._initialize(); } PDFWorker.prototype = /** @lends PDFWorker.prototype */ { get promise() { return this._readyCapability.promise; }, get port() { return this._port; }, get messageHandler() { return this._messageHandler; }, _initialize: function PDFWorker_initialize() { // If worker support isn't disabled explicit and the browser has worker // support, create a new web worker and test if it/the browser fulfills // all requirements to run parts of pdf.js in a web worker. // Right now, the requirement is, that an Uint8Array is still an // Uint8Array as it arrives on the worker. (Chrome added this with v.15.) if (!isWorkerDisabled && !getDefaultSetting('disableWorker') && typeof Worker !== 'undefined') { var workerSrc = getWorkerSrc(); try { // Wraps workerSrc path into blob URL, if the former does not belong // to the same origin. if (!isSameOrigin(window.location.href, workerSrc)) { workerSrc = createCDNWrapper( combineUrl(window.location.href, workerSrc)); } // Some versions of FF can't create a worker on localhost, see: // https://bugzilla.mozilla.org/show_bug.cgi?id=683280 var worker = new Worker(workerSrc); var messageHandler = new MessageHandler('main', 'worker', worker); var terminateEarly = function() { worker.removeEventListener('error', onWorkerError); messageHandler.destroy(); worker.terminate(); if (this.destroyed) { this._readyCapability.reject(new Error('Worker was destroyed')); } else { // Fall back to fake worker if the termination is caused by an // error (e.g. NetworkError / SecurityError). this._setupFakeWorker(); } }.bind(this); var onWorkerError = function(event) { if (!this._webWorker) { // Worker failed to initialize due to an error. Clean up and fall // back to the fake worker. terminateEarly(); } }.bind(this); worker.addEventListener('error', onWorkerError); messageHandler.on('test', function PDFWorker_test(data) { worker.removeEventListener('error', onWorkerError); if (this.destroyed) { terminateEarly(); return; // worker was destroyed } var supportTypedArray = data && data.supportTypedArray; if (supportTypedArray) { this._messageHandler = messageHandler; this._port = worker; this._webWorker = worker; if (!data.supportTransfers) { isPostMessageTransfersDisabled = true; } this._readyCapability.resolve(); // Send global setting, e.g. verbosity level. messageHandler.send('configure', { verbosity: getVerbosityLevel() }); } else { this._setupFakeWorker(); messageHandler.destroy(); worker.terminate(); } }.bind(this)); messageHandler.on('console_log', function (data) { console.log.apply(console, data); }); messageHandler.on('console_error', function (data) { console.error.apply(console, data); }); messageHandler.on('ready', function (data) { worker.removeEventListener('error', onWorkerError); if (this.destroyed) { terminateEarly(); return; // worker was destroyed } try { sendTest(); } catch (e) { // We need fallback to a faked worker. this._setupFakeWorker(); } }.bind(this)); var sendTest = function () { var postMessageTransfers = getDefaultSetting('postMessageTransfers') && !isPostMessageTransfersDisabled; var testObj = new Uint8Array([postMessageTransfers ? 255 : 0]); // Some versions of Opera throw a DATA_CLONE_ERR on serializing the // typed array. Also, checking if we can use transfers. try { messageHandler.send('test', testObj, [testObj.buffer]); } catch (ex) { info('Cannot use postMessage transfers'); testObj[0] = 0; messageHandler.send('test', testObj); } }; // It might take time for worker to initialize (especially when AMD // loader is used). We will try to send test immediately, and then // when 'ready' message will arrive. The worker shall process only // first received 'test'. sendTest(); return; } catch (e) { info('The worker has been disabled.'); } } // Either workers are disabled, not supported or have thrown an exception. // Thus, we fallback to a faked worker. this._setupFakeWorker(); }, _setupFakeWorker: function PDFWorker_setupFakeWorker() { if (!isWorkerDisabled && !getDefaultSetting('disableWorker')) { warn('Setting up fake worker.'); isWorkerDisabled = true; } setupFakeWorkerGlobal().then(function (WorkerMessageHandler) { if (this.destroyed) { this._readyCapability.reject(new Error('Worker was destroyed')); return; } // If we don't use a worker, just post/sendMessage to the main thread. var port = { _listeners: [], postMessage: function (obj) { var e = {data: obj}; this._listeners.forEach(function (listener) { listener.call(this, e); }, this); }, addEventListener: function (name, listener) { this._listeners.push(listener); }, removeEventListener: function (name, listener) { var i = this._listeners.indexOf(listener); this._listeners.splice(i, 1); }, terminate: function () {} }; this._port = port; // All fake workers use the same port, making id unique. var id = 'fake' + (nextFakeWorkerId++); // If the main thread is our worker, setup the handling for the // messages -- the main thread sends to it self. var workerHandler = new MessageHandler(id + '_worker', id, port); WorkerMessageHandler.setup(workerHandler, port); var messageHandler = new MessageHandler(id, id + '_worker', port); this._messageHandler = messageHandler; this._readyCapability.resolve(); }.bind(this)); }, /** * Destroys the worker instance. */ destroy: function PDFWorker_destroy() { this.destroyed = true; if (this._webWorker) { // We need to terminate only web worker created resource. this._webWorker.terminate(); this._webWorker = null; } this._port = null; if (this._messageHandler) { this._messageHandler.destroy(); this._messageHandler = null; } } }; return PDFWorker; })(); /** * For internal use only. * @ignore */ var WorkerTransport = (function WorkerTransportClosure() { function WorkerTransport(messageHandler, loadingTask, pdfDataRangeTransport) { this.messageHandler = messageHandler; this.loadingTask = loadingTask; this.pdfDataRangeTransport = pdfDataRangeTransport; this.commonObjs = new PDFObjects(); this.fontLoader = new FontLoader(loadingTask.docId); this.destroyed = false; this.destroyCapability = null; this.pageCache = []; this.pagePromises = []; this.downloadInfoCapability = createPromiseCapability(); this.setupMessageHandler(); } WorkerTransport.prototype = { destroy: function WorkerTransport_destroy() { if (this.destroyCapability) { return this.destroyCapability.promise; } this.destroyed = true; this.destroyCapability = createPromiseCapability(); var waitOn = []; // We need to wait for all renderings to be completed, e.g. // timeout/rAF can take a long time. this.pageCache.forEach(function (page) { if (page) { waitOn.push(page._destroy()); } }); this.pageCache = []; this.pagePromises = []; var self = this; // We also need to wait for the worker to finish its long running tasks. var terminated = this.messageHandler.sendWithPromise('Terminate', null); waitOn.push(terminated); Promise.all(waitOn).then(function () { self.fontLoader.clear(); if (self.pdfDataRangeTransport) { self.pdfDataRangeTransport.abort(); self.pdfDataRangeTransport = null; } if (self.messageHandler) { self.messageHandler.destroy(); self.messageHandler = null; } self.destroyCapability.resolve(); }, this.destroyCapability.reject); return this.destroyCapability.promise; }, setupMessageHandler: function WorkerTransport_setupMessageHandler() { var messageHandler = this.messageHandler; function updatePassword(password) { messageHandler.send('UpdatePassword', password); } var pdfDataRangeTransport = this.pdfDataRangeTransport; if (pdfDataRangeTransport) { pdfDataRangeTransport.addRangeListener(function(begin, chunk) { messageHandler.send('OnDataRange', { begin: begin, chunk: chunk }); }); pdfDataRangeTransport.addProgressListener(function(loaded) { messageHandler.send('OnDataProgress', { loaded: loaded }); }); pdfDataRangeTransport.addProgressiveReadListener(function(chunk) { messageHandler.send('OnDataRange', { chunk: chunk }); }); messageHandler.on('RequestDataRange', function transportDataRange(data) { pdfDataRangeTransport.requestDataRange(data.begin, data.end); }, this); } messageHandler.on('GetDoc', function transportDoc(data) { var pdfInfo = data.pdfInfo; this.numPages = data.pdfInfo.numPages; var loadingTask = this.loadingTask; var pdfDocument = new PDFDocumentProxy(pdfInfo, this, loadingTask); this.pdfDocument = pdfDocument; loadingTask._capability.resolve(pdfDocument); }, this); messageHandler.on('NeedPassword', function transportNeedPassword(exception) { var loadingTask = this.loadingTask; if (loadingTask.onPassword) { return loadingTask.onPassword(updatePassword, PasswordResponses.NEED_PASSWORD); } loadingTask._capability.reject( new PasswordException(exception.message, exception.code)); }, this); messageHandler.on('IncorrectPassword', function transportIncorrectPassword(exception) { var loadingTask = this.loadingTask; if (loadingTask.onPassword) { return loadingTask.onPassword(updatePassword, PasswordResponses.INCORRECT_PASSWORD); } loadingTask._capability.reject( new PasswordException(exception.message, exception.code)); }, this); messageHandler.on('InvalidPDF', function transportInvalidPDF(exception) { this.loadingTask._capability.reject( new InvalidPDFException(exception.message)); }, this); messageHandler.on('MissingPDF', function transportMissingPDF(exception) { this.loadingTask._capability.reject( new MissingPDFException(exception.message)); }, this); messageHandler.on('UnexpectedResponse', function transportUnexpectedResponse(exception) { this.loadingTask._capability.reject( new UnexpectedResponseException(exception.message, exception.status)); }, this); messageHandler.on('UnknownError', function transportUnknownError(exception) { this.loadingTask._capability.reject( new UnknownErrorException(exception.message, exception.details)); }, this); messageHandler.on('DataLoaded', function transportPage(data) { this.downloadInfoCapability.resolve(data); }, this); messageHandler.on('PDFManagerReady', function transportPage(data) { if (this.pdfDataRangeTransport) { this.pdfDataRangeTransport.transportReady(); } }, this); messageHandler.on('StartRenderPage', function transportRender(data) { if (this.destroyed) { return; // Ignore any pending requests if the worker was terminated. } var page = this.pageCache[data.pageIndex]; page.stats.timeEnd('Page Request'); page._startRenderPage(data.transparency, data.intent); }, this); messageHandler.on('RenderPageChunk', function transportRender(data) { if (this.destroyed) { return; // Ignore any pending requests if the worker was terminated. } var page = this.pageCache[data.pageIndex]; page._renderPageChunk(data.operatorList, data.intent); }, this); messageHandler.on('commonobj', function transportObj(data) { if (this.destroyed) { return; // Ignore any pending requests if the worker was terminated. } var id = data[0]; var type = data[1]; if (this.commonObjs.hasData(id)) { return; } switch (type) { case 'Font': var exportedData = data[2]; var font; if ('error' in exportedData) { var error = exportedData.error; warn('Error during font loading: ' + error); this.commonObjs.resolve(id, error); break; } else { var fontRegistry = null; if (getDefaultSetting('pdfBug') && globalScope.FontInspector && globalScope['FontInspector'].enabled) { fontRegistry = { registerFont: function (font, url) { globalScope['FontInspector'].fontAdded(font, url); } }; } font = new FontFaceObject(exportedData, { isEvalSuported: getDefaultSetting('isEvalSupported'), disableFontFace: getDefaultSetting('disableFontFace'), fontRegistry: fontRegistry }); } this.fontLoader.bind( [font], function fontReady(fontObjs) { this.commonObjs.resolve(id, font); }.bind(this) ); break; case 'FontPath': this.commonObjs.resolve(id, data[2]); break; default: error('Got unknown common object type ' + type); } }, this); messageHandler.on('obj', function transportObj(data) { if (this.destroyed) { return; // Ignore any pending requests if the worker was terminated. } var id = data[0]; var pageIndex = data[1]; var type = data[2]; var pageProxy = this.pageCache[pageIndex]; var imageData; if (pageProxy.objs.hasData(id)) { return; } switch (type) { case 'JpegStream': imageData = data[3]; loadJpegStream(id, imageData, pageProxy.objs); break; case 'Image': imageData = data[3]; pageProxy.objs.resolve(id, imageData); // heuristics that will allow not to store large data var MAX_IMAGE_SIZE_TO_STORE = 8000000; if (imageData && 'data' in imageData && imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) { pageProxy.cleanupAfterRender = true; } break; default: error('Got unknown object type ' + type); } }, this); messageHandler.on('DocProgress', function transportDocProgress(data) { if (this.destroyed) { return; // Ignore any pending requests if the worker was terminated. } var loadingTask = this.loadingTask; if (loadingTask.onProgress) { loadingTask.onProgress({ loaded: data.loaded, total: data.total }); } }, this); messageHandler.on('PageError', function transportError(data) { if (this.destroyed) { return; // Ignore any pending requests if the worker was terminated. } var page = this.pageCache[data.pageNum - 1]; var intentState = page.intentStates[data.intent]; if (intentState.displayReadyCapability) { intentState.displayReadyCapability.reject(data.error); } else { error(data.error); } if (intentState.operatorList) { // Mark operator list as complete. intentState.operatorList.lastChunk = true; for (var i = 0; i < intentState.renderTasks.length; i++) { intentState.renderTasks[i].operatorListChanged(); } } }, this); messageHandler.on('UnsupportedFeature', function transportUnsupportedFeature(data) { if (this.destroyed) { return; // Ignore any pending requests if the worker was terminated. } var featureId = data.featureId; var loadingTask = this.loadingTask; if (loadingTask.onUnsupportedFeature) { loadingTask.onUnsupportedFeature(featureId); } _UnsupportedManager.notify(featureId); }, this); messageHandler.on('JpegDecode', function(data) { if (this.destroyed) { return Promise.reject('Worker was terminated'); } var imageUrl = data[0]; var components = data[1]; if (components !== 3 && components !== 1) { return Promise.reject( new Error('Only 3 components or 1 component can be returned')); } return new Promise(function (resolve, reject) { var img = new Image(); img.onload = function () { var width = img.width; var height = img.height; var size = width * height; var rgbaLength = size * 4; var buf = new Uint8Array(size * components); var tmpCanvas = createScratchCanvas(width, height); var tmpCtx = tmpCanvas.getContext('2d'); tmpCtx.drawImage(img, 0, 0); var data = tmpCtx.getImageData(0, 0, width, height).data; var i, j; if (components === 3) { for (i = 0, j = 0; i < rgbaLength; i += 4, j += 3) { buf[j] = data[i]; buf[j + 1] = data[i + 1]; buf[j + 2] = data[i + 2]; } } else if (components === 1) { for (i = 0, j = 0; i < rgbaLength; i += 4, j++) { buf[j] = data[i]; } } resolve({ data: buf, width: width, height: height}); }; img.onerror = function () { reject(new Error('JpegDecode failed to load image')); }; img.src = imageUrl; }); }, this); }, getData: function WorkerTransport_getData() { return this.messageHandler.sendWithPromise('GetData', null); }, getPage: function WorkerTransport_getPage(pageNumber, capability) { if (pageNumber <= 0 || pageNumber > this.numPages || (pageNumber|0) !== pageNumber) { return Promise.reject(new Error('Invalid page request')); } var pageIndex = pageNumber - 1; if (pageIndex in this.pagePromises) { return this.pagePromises[pageIndex]; } var promise = this.messageHandler.sendWithPromise('GetPage', { pageIndex: pageIndex }).then(function (pageInfo) { if (this.destroyed) { throw new Error('Transport destroyed'); } var page = new PDFPageProxy(pageIndex, pageInfo, this); this.pageCache[pageIndex] = page; return page; }.bind(this)); this.pagePromises[pageIndex] = promise; return promise; }, getPageIndex: function WorkerTransport_getPageIndexByRef(ref) { return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref }); }, getAnnotations: function WorkerTransport_getAnnotations(pageIndex, intent) { return this.messageHandler.sendWithPromise('GetAnnotations', { pageIndex: pageIndex, intent: intent, }); }, getDestinations: function WorkerTransport_getDestinations() { return this.messageHandler.sendWithPromise('GetDestinations', null); }, getDestination: function WorkerTransport_getDestination(id) { return this.messageHandler.sendWithPromise('GetDestination', { id: id }); }, getPageLabels: function WorkerTransport_getPageLabels() { return this.messageHandler.sendWithPromise('GetPageLabels', null); }, getAttachments: function WorkerTransport_getAttachments() { return this.messageHandler.sendWithPromise('GetAttachments', null); }, getJavaScript: function WorkerTransport_getJavaScript() { return this.messageHandler.sendWithPromise('GetJavaScript', null); }, getOutline: function WorkerTransport_getOutline() { return this.messageHandler.sendWithPromise('GetOutline', null); }, getMetadata: function WorkerTransport_getMetadata() { return this.messageHandler.sendWithPromise('GetMetadata', null). then(function transportMetadata(results) { return { info: results[0], metadata: (results[1] ? new Metadata(results[1]) : null) }; }); }, getStats: function WorkerTransport_getStats() { return this.messageHandler.sendWithPromise('GetStats', null); }, startCleanup: function WorkerTransport_startCleanup() { this.messageHandler.sendWithPromise('Cleanup', null). then(function endCleanup() { for (var i = 0, ii = this.pageCache.length; i < ii; i++) { var page = this.pageCache[i]; if (page) { page.cleanup(); } } this.commonObjs.clear(); this.fontLoader.clear(); }.bind(this)); } }; return WorkerTransport; })(); /** * A PDF document and page is built of many objects. E.g. there are objects * for fonts, images, rendering code and such. These objects might get processed * inside of a worker. The `PDFObjects` implements some basic functions to * manage these objects. * @ignore */ var PDFObjects = (function PDFObjectsClosure() { function PDFObjects() { this.objs = Object.create(null); } PDFObjects.prototype = { /** * Internal function. * Ensures there is an object defined for `objId`. */ ensureObj: function PDFObjects_ensureObj(objId) { if (this.objs[objId]) { return this.objs[objId]; } var obj = { capability: createPromiseCapability(), data: null, resolved: false }; this.objs[objId] = obj; return obj; }, /** * If called *without* callback, this returns the data of `objId` but the * object needs to be resolved. If it isn't, this function throws. * * If called *with* a callback, the callback is called with the data of the * object once the object is resolved. That means, if you call this * function and the object is already resolved, the callback gets called * right away. */ get: function PDFObjects_get(objId, callback) { // If there is a callback, then the get can be async and the object is // not required to be resolved right now if (callback) { this.ensureObj(objId).capability.promise.then(callback); return null; } // If there isn't a callback, the user expects to get the resolved data // directly. var obj = this.objs[objId]; // If there isn't an object yet or the object isn't resolved, then the // data isn't ready yet! if (!obj || !obj.resolved) { error('Requesting object that isn\'t resolved yet ' + objId); } return obj.data; }, /** * Resolves the object `objId` with optional `data`. */ resolve: function PDFObjects_resolve(objId, data) { var obj = this.ensureObj(objId); obj.resolved = true; obj.data = data; obj.capability.resolve(data); }, isResolved: function PDFObjects_isResolved(objId) { var objs = this.objs; if (!objs[objId]) { return false; } else { return objs[objId].resolved; } }, hasData: function PDFObjects_hasData(objId) { return this.isResolved(objId); }, /** * Returns the data of `objId` if object exists, null otherwise. */ getData: function PDFObjects_getData(objId) { var objs = this.objs; if (!objs[objId] || !objs[objId].resolved) { return null; } else { return objs[objId].data; } }, clear: function PDFObjects_clear() { this.objs = Object.create(null); } }; return PDFObjects; })(); /** * Allows controlling of the rendering tasks. * @class * @alias RenderTask */ var RenderTask = (function RenderTaskClosure() { function RenderTask(internalRenderTask) { this._internalRenderTask = internalRenderTask; /** * Callback for incremental rendering -- a function that will be called * each time the rendering is paused. To continue rendering call the * function that is the first argument to the callback. * @type {function} */ this.onContinue = null; } RenderTask.prototype = /** @lends RenderTask.prototype */ { /** * Promise for rendering task completion. * @return {Promise} */ get promise() { return this._internalRenderTask.capability.promise; }, /** * Cancels the rendering task. If the task is currently rendering it will * not be cancelled until graphics pauses with a timeout. The promise that * this object extends will resolved when cancelled. */ cancel: function RenderTask_cancel() { this._internalRenderTask.cancel(); }, /** * Registers callbacks to indicate the rendering task completion. * * @param {function} onFulfilled The callback for the rendering completion. * @param {function} onRejected The callback for the rendering failure. * @return {Promise} A promise that is resolved after the onFulfilled or * onRejected callback. */ then: function RenderTask_then(onFulfilled, onRejected) { return this.promise.then.apply(this.promise, arguments); } }; return RenderTask; })(); /** * For internal use only. * @ignore */ var InternalRenderTask = (function InternalRenderTaskClosure() { function InternalRenderTask(callback, params, objs, commonObjs, operatorList, pageNumber) { this.callback = callback; this.params = params; this.objs = objs; this.commonObjs = commonObjs; this.operatorListIdx = null; this.operatorList = operatorList; this.pageNumber = pageNumber; this.running = false; this.graphicsReadyCallback = null; this.graphicsReady = false; this.useRequestAnimationFrame = false; this.cancelled = false; this.capability = createPromiseCapability(); this.task = new RenderTask(this); // caching this-bound methods this._continueBound = this._continue.bind(this); this._scheduleNextBound = this._scheduleNext.bind(this); this._nextBound = this._next.bind(this); } InternalRenderTask.prototype = { initalizeGraphics: function InternalRenderTask_initalizeGraphics(transparency) { if (this.cancelled) { return; } if (getDefaultSetting('pdfBug') && globalScope.StepperManager && globalScope.StepperManager.enabled) { this.stepper = globalScope.StepperManager.create(this.pageNumber - 1); this.stepper.init(this.operatorList); this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint(); } var params = this.params; this.gfx = new CanvasGraphics(params.canvasContext, this.commonObjs, this.objs, params.imageLayer); this.gfx.beginDrawing(params.transform, params.viewport, transparency); this.operatorListIdx = 0; this.graphicsReady = true; if (this.graphicsReadyCallback) { this.graphicsReadyCallback(); } }, cancel: function InternalRenderTask_cancel() { this.running = false; this.cancelled = true; this.callback('cancelled'); }, operatorListChanged: function InternalRenderTask_operatorListChanged() { if (!this.graphicsReady) { if (!this.graphicsReadyCallback) { this.graphicsReadyCallback = this._continueBound; } return; } if (this.stepper) { this.stepper.updateOperatorList(this.operatorList); } if (this.running) { return; } this._continue(); }, _continue: function InternalRenderTask__continue() { this.running = true; if (this.cancelled) { return; } if (this.task.onContinue) { this.task.onContinue.call(this.task, this._scheduleNextBound); } else { this._scheduleNext(); } }, _scheduleNext: function InternalRenderTask__scheduleNext() { if (this.useRequestAnimationFrame && typeof window !== 'undefined') { window.requestAnimationFrame(this._nextBound); } else { Promise.resolve(undefined).then(this._nextBound); } }, _next: function InternalRenderTask__next() { if (this.cancelled) { return; } this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper); if (this.operatorListIdx === this.operatorList.argsArray.length) { this.running = false; if (this.operatorList.lastChunk) { this.gfx.endDrawing(); this.callback(); } } } }; return InternalRenderTask; })(); /** * (Deprecated) Global observer of unsupported feature usages. Use * onUnsupportedFeature callback of the {PDFDocumentLoadingTask} instance. */ var _UnsupportedManager = (function UnsupportedManagerClosure() { var listeners = []; return { listen: function (cb) { deprecated('Global UnsupportedManager.listen is used: ' + ' use PDFDocumentLoadingTask.onUnsupportedFeature instead'); listeners.push(cb); }, notify: function (featureId) { for (var i = 0, ii = listeners.length; i < ii; i++) { listeners[i](featureId); } } }; })(); if (typeof pdfjsVersion !== 'undefined') { exports.version = pdfjsVersion; } if (typeof pdfjsBuild !== 'undefined') { exports.build = pdfjsBuild; } exports.getDocument = getDocument; exports.PDFDataRangeTransport = PDFDataRangeTransport; exports.PDFWorker = PDFWorker; exports.PDFDocumentProxy = PDFDocumentProxy; exports.PDFPageProxy = PDFPageProxy; exports._UnsupportedManager = _UnsupportedManager; })); (function (root, factory) { { factory((root.pdfjsDisplayGlobal = {}), root.pdfjsSharedUtil, root.pdfjsDisplayDOMUtils, root.pdfjsDisplayAPI, root.pdfjsDisplayAnnotationLayer, root.pdfjsDisplayTextLayer, root.pdfjsDisplayMetadata, root.pdfjsDisplaySVG); } }(this, function (exports, sharedUtil, displayDOMUtils, displayAPI, displayAnnotationLayer, displayTextLayer, displayMetadata, displaySVG) { var globalScope = sharedUtil.globalScope; var deprecated = sharedUtil.deprecated; var warn = sharedUtil.warn; var LinkTarget = displayDOMUtils.LinkTarget; var isWorker = (typeof window === 'undefined'); // The global PDFJS object is now deprecated and will not be supported in // the future. The members below are maintained for backward compatibility // and shall not be extended or modified. If the global.js is included as // a module, we will create a global PDFJS object instance or use existing. if (!globalScope.PDFJS) { globalScope.PDFJS = {}; } var PDFJS = globalScope.PDFJS; if (typeof pdfjsVersion !== 'undefined') { PDFJS.version = pdfjsVersion; } if (typeof pdfjsBuild !== 'undefined') { PDFJS.build = pdfjsBuild; } PDFJS.pdfBug = false; if (PDFJS.verbosity !== undefined) { sharedUtil.setVerbosityLevel(PDFJS.verbosity); } delete PDFJS.verbosity; Object.defineProperty(PDFJS, 'verbosity', { get: function () { return sharedUtil.getVerbosityLevel(); }, set: function (level) { sharedUtil.setVerbosityLevel(level); }, enumerable: true, configurable: true }); PDFJS.VERBOSITY_LEVELS = sharedUtil.VERBOSITY_LEVELS; PDFJS.OPS = sharedUtil.OPS; PDFJS.UNSUPPORTED_FEATURES = sharedUtil.UNSUPPORTED_FEATURES; PDFJS.isValidUrl = sharedUtil.isValidUrl; PDFJS.shadow = sharedUtil.shadow; PDFJS.createBlob = sharedUtil.createBlob; PDFJS.createObjectURL = function PDFJS_createObjectURL(data, contentType) { return sharedUtil.createObjectURL(data, contentType, PDFJS.disableCreateObjectURL); }; Object.defineProperty(PDFJS, 'isLittleEndian', { configurable: true, get: function PDFJS_isLittleEndian() { var value = sharedUtil.isLittleEndian(); return sharedUtil.shadow(PDFJS, 'isLittleEndian', value); } }); PDFJS.removeNullCharacters = sharedUtil.removeNullCharacters; PDFJS.PasswordResponses = sharedUtil.PasswordResponses; PDFJS.PasswordException = sharedUtil.PasswordException; PDFJS.UnknownErrorException = sharedUtil.UnknownErrorException; PDFJS.InvalidPDFException = sharedUtil.InvalidPDFException; PDFJS.MissingPDFException = sharedUtil.MissingPDFException; PDFJS.UnexpectedResponseException = sharedUtil.UnexpectedResponseException; PDFJS.Util = sharedUtil.Util; PDFJS.PageViewport = sharedUtil.PageViewport; PDFJS.createPromiseCapability = sharedUtil.createPromiseCapability; /** * The maximum allowed image size in total pixels e.g. width * height. Images * above this value will not be drawn. Use -1 for no limit. * @var {number} */ PDFJS.maxImageSize = (PDFJS.maxImageSize === undefined ? -1 : PDFJS.maxImageSize); /** * The url of where the predefined Adobe CMaps are located. Include trailing * slash. * @var {string} */ PDFJS.cMapUrl = (PDFJS.cMapUrl === undefined ? null : PDFJS.cMapUrl); /** * Specifies if CMaps are binary packed. * @var {boolean} */ PDFJS.cMapPacked = PDFJS.cMapPacked === undefined ? false : PDFJS.cMapPacked; /** * By default fonts are converted to OpenType fonts and loaded via font face * rules. If disabled, the font will be rendered using a built in font * renderer that constructs the glyphs with primitive path commands. * @var {boolean} */ PDFJS.disableFontFace = (PDFJS.disableFontFace === undefined ? false : PDFJS.disableFontFace); /** * Path for image resources, mainly for annotation icons. Include trailing * slash. * @var {string} */ PDFJS.imageResourcesPath = (PDFJS.imageResourcesPath === undefined ? '' : PDFJS.imageResourcesPath); /** * Disable the web worker and run all code on the main thread. This will * happen automatically if the browser doesn't support workers or sending * typed arrays to workers. * @var {boolean} */ PDFJS.disableWorker = (PDFJS.disableWorker === undefined ? false : PDFJS.disableWorker); /** * Path and filename of the worker file. Required when the worker is enabled * in development mode. If unspecified in the production build, the worker * will be loaded based on the location of the pdf.js file. It is recommended * that the workerSrc is set in a custom application to prevent issues caused * by third-party frameworks and libraries. * @var {string} */ PDFJS.workerSrc = (PDFJS.workerSrc === undefined ? null : PDFJS.workerSrc); /** * Disable range request loading of PDF files. When enabled and if the server * supports partial content requests then the PDF will be fetched in chunks. * Enabled (false) by default. * @var {boolean} */ PDFJS.disableRange = (PDFJS.disableRange === undefined ? false : PDFJS.disableRange); /** * Disable streaming of PDF file data. By default PDF.js attempts to load PDF * in chunks. This default behavior can be disabled. * @var {boolean} */ PDFJS.disableStream = (PDFJS.disableStream === undefined ? false : PDFJS.disableStream); /** * Disable pre-fetching of PDF file data. When range requests are enabled * PDF.js will automatically keep fetching more data even if it isn't needed * to display the current page. This default behavior can be disabled. * * NOTE: It is also necessary to disable streaming, see above, * in order for disabling of pre-fetching to work correctly. * @var {boolean} */ PDFJS.disableAutoFetch = (PDFJS.disableAutoFetch === undefined ? false : PDFJS.disableAutoFetch); /** * Enables special hooks for debugging PDF.js. * @var {boolean} */ PDFJS.pdfBug = (PDFJS.pdfBug === undefined ? false : PDFJS.pdfBug); /** * Enables transfer usage in postMessage for ArrayBuffers. * @var {boolean} */ PDFJS.postMessageTransfers = (PDFJS.postMessageTransfers === undefined ? true : PDFJS.postMessageTransfers); /** * Disables URL.createObjectURL usage. * @var {boolean} */ PDFJS.disableCreateObjectURL = (PDFJS.disableCreateObjectURL === undefined ? false : PDFJS.disableCreateObjectURL); /** * Disables WebGL usage. * @var {boolean} */ PDFJS.disableWebGL = (PDFJS.disableWebGL === undefined ? true : PDFJS.disableWebGL); /** * Specifies the |target| attribute for external links. * The constants from PDFJS.LinkTarget should be used: * - NONE [default] * - SELF * - BLANK * - PARENT * - TOP * @var {number} */ PDFJS.externalLinkTarget = (PDFJS.externalLinkTarget === undefined ? LinkTarget.NONE : PDFJS.externalLinkTarget); /** * Specifies the |rel| attribute for external links. Defaults to stripping * the referrer. * @var {string} */ PDFJS.externalLinkRel = (PDFJS.externalLinkRel === undefined ? 'noreferrer' : PDFJS.externalLinkRel); /** * Determines if we can eval strings as JS. Primarily used to improve * performance for font rendering. * @var {boolean} */ PDFJS.isEvalSupported = (PDFJS.isEvalSupported === undefined ? true : PDFJS.isEvalSupported); var savedOpenExternalLinksInNewWindow = PDFJS.openExternalLinksInNewWindow; delete PDFJS.openExternalLinksInNewWindow; Object.defineProperty(PDFJS, 'openExternalLinksInNewWindow', { get: function () { return PDFJS.externalLinkTarget === LinkTarget.BLANK; }, set: function (value) { if (value) { deprecated('PDFJS.openExternalLinksInNewWindow, please use ' + '"PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK" instead.'); } if (PDFJS.externalLinkTarget !== LinkTarget.NONE) { warn('PDFJS.externalLinkTarget is already initialized'); return; } PDFJS.externalLinkTarget = value ? LinkTarget.BLANK : LinkTarget.NONE; }, enumerable: true, configurable: true }); if (savedOpenExternalLinksInNewWindow) { /** * (Deprecated) Opens external links in a new window if enabled. * The default behavior opens external links in the PDF.js window. * * NOTE: This property has been deprecated, please use * `PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK` instead. * @var {boolean} */ PDFJS.openExternalLinksInNewWindow = savedOpenExternalLinksInNewWindow; } PDFJS.getDocument = displayAPI.getDocument; PDFJS.PDFDataRangeTransport = displayAPI.PDFDataRangeTransport; PDFJS.PDFWorker = displayAPI.PDFWorker; Object.defineProperty(PDFJS, 'hasCanvasTypedArrays', { configurable: true, get: function PDFJS_hasCanvasTypedArrays() { var value = displayDOMUtils.hasCanvasTypedArrays(); return sharedUtil.shadow(PDFJS, 'hasCanvasTypedArrays', value); } }); PDFJS.CustomStyle = displayDOMUtils.CustomStyle; PDFJS.LinkTarget = LinkTarget; PDFJS.addLinkAttributes = displayDOMUtils.addLinkAttributes; PDFJS.getFilenameFromUrl = displayDOMUtils.getFilenameFromUrl; PDFJS.isExternalLinkTargetSet = displayDOMUtils.isExternalLinkTargetSet; PDFJS.AnnotationLayer = displayAnnotationLayer.AnnotationLayer; PDFJS.renderTextLayer = displayTextLayer.renderTextLayer; PDFJS.Metadata = displayMetadata.Metadata; PDFJS.SVGGraphics = displaySVG.SVGGraphics; PDFJS.UnsupportedManager = displayAPI._UnsupportedManager; exports.globalScope = globalScope; exports.isWorker = isWorker; exports.PDFJS = globalScope.PDFJS; })); }).call(pdfjsLibs); exports.PDFJS = pdfjsLibs.pdfjsDisplayGlobal.PDFJS; exports.build = pdfjsLibs.pdfjsDisplayAPI.build; exports.version = pdfjsLibs.pdfjsDisplayAPI.version; exports.getDocument = pdfjsLibs.pdfjsDisplayAPI.getDocument; exports.PDFDataRangeTransport = pdfjsLibs.pdfjsDisplayAPI.PDFDataRangeTransport; exports.PDFWorker = pdfjsLibs.pdfjsDisplayAPI.PDFWorker; exports.renderTextLayer = pdfjsLibs.pdfjsDisplayTextLayer.renderTextLayer; exports.AnnotationLayer = pdfjsLibs.pdfjsDisplayAnnotationLayer.AnnotationLayer; exports.CustomStyle = pdfjsLibs.pdfjsDisplayDOMUtils.CustomStyle; exports.PasswordResponses = pdfjsLibs.pdfjsSharedUtil.PasswordResponses; exports.InvalidPDFException = pdfjsLibs.pdfjsSharedUtil.InvalidPDFException; exports.MissingPDFException = pdfjsLibs.pdfjsSharedUtil.MissingPDFException; exports.SVGGraphics = pdfjsLibs.pdfjsDisplaySVG.SVGGraphics; exports.UnexpectedResponseException = pdfjsLibs.pdfjsSharedUtil.UnexpectedResponseException; exports.OPS = pdfjsLibs.pdfjsSharedUtil.OPS; exports.UNSUPPORTED_FEATURES = pdfjsLibs.pdfjsSharedUtil.UNSUPPORTED_FEATURES; exports.isValidUrl = pdfjsLibs.pdfjsSharedUtil.isValidUrl; exports.createObjectURL = pdfjsLibs.pdfjsSharedUtil.createObjectURL; exports.removeNullCharacters = pdfjsLibs.pdfjsSharedUtil.removeNullCharacters; exports.shadow = pdfjsLibs.pdfjsSharedUtil.shadow; exports.createBlob = pdfjsLibs.pdfjsSharedUtil.createBlob; exports.getFilenameFromUrl = pdfjsLibs.pdfjsDisplayDOMUtils.getFilenameFromUrl; exports.addLinkAttributes = pdfjsLibs.pdfjsDisplayDOMUtils.addLinkAttributes; })); manuskript-0.10.0/libs/pdf.js/build/pdf.worker.js000066400000000000000000053307331354442177200216470ustar00rootroot00000000000000/* Copyright 2012 Mozilla Foundation * * 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. */ /* jshint globalstrict: false */ /* umdutils ignore */ (function (root, factory) { 'use strict'; if (typeof define === 'function' && define.amd) { define('pdfjs-dist/build/pdf.worker', ['exports'], factory); } else if (typeof exports !== 'undefined') { factory(exports); } else { factory((root.pdfjsDistBuildPdfWorker = {})); } }(this, function (exports) { // Use strict in our context only - users might not want it 'use strict'; var pdfjsVersion = '1.4.237'; var pdfjsBuild = 'e9dbb23'; var pdfjsFilePath = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : null; var pdfjsLibs = {}; (function pdfjsWrapper() { (function (root, factory) { { factory((root.pdfjsCoreArithmeticDecoder = {})); } }(this, function (exports) { /* This class implements the QM Coder decoding as defined in * JPEG 2000 Part I Final Committee Draft Version 1.0 * Annex C.3 Arithmetic decoding procedure * available at http://www.jpeg.org/public/fcd15444-1.pdf * * The arithmetic decoder is used in conjunction with context models to decode * JPEG2000 and JBIG2 streams. */ var ArithmeticDecoder = (function ArithmeticDecoderClosure() { // Table C-2 var QeTable = [ {qe: 0x5601, nmps: 1, nlps: 1, switchFlag: 1}, {qe: 0x3401, nmps: 2, nlps: 6, switchFlag: 0}, {qe: 0x1801, nmps: 3, nlps: 9, switchFlag: 0}, {qe: 0x0AC1, nmps: 4, nlps: 12, switchFlag: 0}, {qe: 0x0521, nmps: 5, nlps: 29, switchFlag: 0}, {qe: 0x0221, nmps: 38, nlps: 33, switchFlag: 0}, {qe: 0x5601, nmps: 7, nlps: 6, switchFlag: 1}, {qe: 0x5401, nmps: 8, nlps: 14, switchFlag: 0}, {qe: 0x4801, nmps: 9, nlps: 14, switchFlag: 0}, {qe: 0x3801, nmps: 10, nlps: 14, switchFlag: 0}, {qe: 0x3001, nmps: 11, nlps: 17, switchFlag: 0}, {qe: 0x2401, nmps: 12, nlps: 18, switchFlag: 0}, {qe: 0x1C01, nmps: 13, nlps: 20, switchFlag: 0}, {qe: 0x1601, nmps: 29, nlps: 21, switchFlag: 0}, {qe: 0x5601, nmps: 15, nlps: 14, switchFlag: 1}, {qe: 0x5401, nmps: 16, nlps: 14, switchFlag: 0}, {qe: 0x5101, nmps: 17, nlps: 15, switchFlag: 0}, {qe: 0x4801, nmps: 18, nlps: 16, switchFlag: 0}, {qe: 0x3801, nmps: 19, nlps: 17, switchFlag: 0}, {qe: 0x3401, nmps: 20, nlps: 18, switchFlag: 0}, {qe: 0x3001, nmps: 21, nlps: 19, switchFlag: 0}, {qe: 0x2801, nmps: 22, nlps: 19, switchFlag: 0}, {qe: 0x2401, nmps: 23, nlps: 20, switchFlag: 0}, {qe: 0x2201, nmps: 24, nlps: 21, switchFlag: 0}, {qe: 0x1C01, nmps: 25, nlps: 22, switchFlag: 0}, {qe: 0x1801, nmps: 26, nlps: 23, switchFlag: 0}, {qe: 0x1601, nmps: 27, nlps: 24, switchFlag: 0}, {qe: 0x1401, nmps: 28, nlps: 25, switchFlag: 0}, {qe: 0x1201, nmps: 29, nlps: 26, switchFlag: 0}, {qe: 0x1101, nmps: 30, nlps: 27, switchFlag: 0}, {qe: 0x0AC1, nmps: 31, nlps: 28, switchFlag: 0}, {qe: 0x09C1, nmps: 32, nlps: 29, switchFlag: 0}, {qe: 0x08A1, nmps: 33, nlps: 30, switchFlag: 0}, {qe: 0x0521, nmps: 34, nlps: 31, switchFlag: 0}, {qe: 0x0441, nmps: 35, nlps: 32, switchFlag: 0}, {qe: 0x02A1, nmps: 36, nlps: 33, switchFlag: 0}, {qe: 0x0221, nmps: 37, nlps: 34, switchFlag: 0}, {qe: 0x0141, nmps: 38, nlps: 35, switchFlag: 0}, {qe: 0x0111, nmps: 39, nlps: 36, switchFlag: 0}, {qe: 0x0085, nmps: 40, nlps: 37, switchFlag: 0}, {qe: 0x0049, nmps: 41, nlps: 38, switchFlag: 0}, {qe: 0x0025, nmps: 42, nlps: 39, switchFlag: 0}, {qe: 0x0015, nmps: 43, nlps: 40, switchFlag: 0}, {qe: 0x0009, nmps: 44, nlps: 41, switchFlag: 0}, {qe: 0x0005, nmps: 45, nlps: 42, switchFlag: 0}, {qe: 0x0001, nmps: 45, nlps: 43, switchFlag: 0}, {qe: 0x5601, nmps: 46, nlps: 46, switchFlag: 0} ]; // C.3.5 Initialisation of the decoder (INITDEC) function ArithmeticDecoder(data, start, end) { this.data = data; this.bp = start; this.dataEnd = end; this.chigh = data[start]; this.clow = 0; this.byteIn(); this.chigh = ((this.chigh << 7) & 0xFFFF) | ((this.clow >> 9) & 0x7F); this.clow = (this.clow << 7) & 0xFFFF; this.ct -= 7; this.a = 0x8000; } ArithmeticDecoder.prototype = { // C.3.4 Compressed data input (BYTEIN) byteIn: function ArithmeticDecoder_byteIn() { var data = this.data; var bp = this.bp; if (data[bp] === 0xFF) { var b1 = data[bp + 1]; if (b1 > 0x8F) { this.clow += 0xFF00; this.ct = 8; } else { bp++; this.clow += (data[bp] << 9); this.ct = 7; this.bp = bp; } } else { bp++; this.clow += bp < this.dataEnd ? (data[bp] << 8) : 0xFF00; this.ct = 8; this.bp = bp; } if (this.clow > 0xFFFF) { this.chigh += (this.clow >> 16); this.clow &= 0xFFFF; } }, // C.3.2 Decoding a decision (DECODE) readBit: function ArithmeticDecoder_readBit(contexts, pos) { // contexts are packed into 1 byte: // highest 7 bits carry cx.index, lowest bit carries cx.mps var cx_index = contexts[pos] >> 1, cx_mps = contexts[pos] & 1; var qeTableIcx = QeTable[cx_index]; var qeIcx = qeTableIcx.qe; var d; var a = this.a - qeIcx; if (this.chigh < qeIcx) { // exchangeLps if (a < qeIcx) { a = qeIcx; d = cx_mps; cx_index = qeTableIcx.nmps; } else { a = qeIcx; d = 1 ^ cx_mps; if (qeTableIcx.switchFlag === 1) { cx_mps = d; } cx_index = qeTableIcx.nlps; } } else { this.chigh -= qeIcx; if ((a & 0x8000) !== 0) { this.a = a; return cx_mps; } // exchangeMps if (a < qeIcx) { d = 1 ^ cx_mps; if (qeTableIcx.switchFlag === 1) { cx_mps = d; } cx_index = qeTableIcx.nlps; } else { d = cx_mps; cx_index = qeTableIcx.nmps; } } // C.3.3 renormD; do { if (this.ct === 0) { this.byteIn(); } a <<= 1; this.chigh = ((this.chigh << 1) & 0xFFFF) | ((this.clow >> 15) & 1); this.clow = (this.clow << 1) & 0xFFFF; this.ct--; } while ((a & 0x8000) === 0); this.a = a; contexts[pos] = cx_index << 1 | cx_mps; return d; } }; return ArithmeticDecoder; })(); exports.ArithmeticDecoder = ArithmeticDecoder; })); (function (root, factory) { { factory((root.pdfjsCoreBidi = {})); } }(this, function (exports) { // Character types for symbols from 0000 to 00FF. var baseTypes = [ 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS', 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'CS', 'ON', 'CS', 'ON', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON', 'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L' ]; // Character types for symbols from 0600 to 06FF var arabicTypes = [ 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL' ]; function isOdd(i) { return (i & 1) !== 0; } function isEven(i) { return (i & 1) === 0; } function findUnequal(arr, start, value) { for (var j = start, jj = arr.length; j < jj; ++j) { if (arr[j] !== value) { return j; } } return j; } function setValues(arr, start, end, value) { for (var j = start; j < end; ++j) { arr[j] = value; } } function reverseValues(arr, start, end) { for (var i = start, j = end - 1; i < j; ++i, --j) { var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } function createBidiText(str, isLTR, vertical) { return { str: str, dir: (vertical ? 'ttb' : (isLTR ? 'ltr' : 'rtl')) }; } // These are used in bidi(), which is called frequently. We re-use them on // each call to avoid unnecessary allocations. var chars = []; var types = []; function bidi(str, startLevel, vertical) { var isLTR = true; var strLength = str.length; if (strLength === 0 || vertical) { return createBidiText(str, isLTR, vertical); } // Get types and fill arrays chars.length = strLength; types.length = strLength; var numBidi = 0; var i, ii; for (i = 0; i < strLength; ++i) { chars[i] = str.charAt(i); var charCode = str.charCodeAt(i); var charType = 'L'; if (charCode <= 0x00ff) { charType = baseTypes[charCode]; } else if (0x0590 <= charCode && charCode <= 0x05f4) { charType = 'R'; } else if (0x0600 <= charCode && charCode <= 0x06ff) { charType = arabicTypes[charCode & 0xff]; } else if (0x0700 <= charCode && charCode <= 0x08AC) { charType = 'AL'; } if (charType === 'R' || charType === 'AL' || charType === 'AN') { numBidi++; } types[i] = charType; } // Detect the bidi method // - If there are no rtl characters then no bidi needed // - If less than 30% chars are rtl then string is primarily ltr // - If more than 30% chars are rtl then string is primarily rtl if (numBidi === 0) { isLTR = true; return createBidiText(str, isLTR); } if (startLevel === -1) { if ((strLength / numBidi) < 0.3) { isLTR = true; startLevel = 0; } else { isLTR = false; startLevel = 1; } } var levels = []; for (i = 0; i < strLength; ++i) { levels[i] = startLevel; } /* X1-X10: skip most of this, since we are NOT doing the embeddings. */ var e = (isOdd(startLevel) ? 'R' : 'L'); var sor = e; var eor = sor; /* W1. Examine each non-spacing mark (NSM) in the level run, and change the type of the NSM to the type of the previous character. If the NSM is at the start of the level run, it will get the type of sor. */ var lastType = sor; for (i = 0; i < strLength; ++i) { if (types[i] === 'NSM') { types[i] = lastType; } else { lastType = types[i]; } } /* W2. Search backwards from each instance of a European number until the first strong type (R, L, AL, or sor) is found. If an AL is found, change the type of the European number to Arabic number. */ lastType = sor; var t; for (i = 0; i < strLength; ++i) { t = types[i]; if (t === 'EN') { types[i] = (lastType === 'AL') ? 'AN' : 'EN'; } else if (t === 'R' || t === 'L' || t === 'AL') { lastType = t; } } /* W3. Change all ALs to R. */ for (i = 0; i < strLength; ++i) { t = types[i]; if (t === 'AL') { types[i] = 'R'; } } /* W4. A single European separator between two European numbers changes to a European number. A single common separator between two numbers of the same type changes to that type: */ for (i = 1; i < strLength - 1; ++i) { if (types[i] === 'ES' && types[i - 1] === 'EN' && types[i + 1] === 'EN') { types[i] = 'EN'; } if (types[i] === 'CS' && (types[i - 1] === 'EN' || types[i - 1] === 'AN') && types[i + 1] === types[i - 1]) { types[i] = types[i - 1]; } } /* W5. A sequence of European terminators adjacent to European numbers changes to all European numbers: */ for (i = 0; i < strLength; ++i) { if (types[i] === 'EN') { // do before var j; for (j = i - 1; j >= 0; --j) { if (types[j] !== 'ET') { break; } types[j] = 'EN'; } // do after for (j = i + 1; j < strLength; --j) { if (types[j] !== 'ET') { break; } types[j] = 'EN'; } } } /* W6. Otherwise, separators and terminators change to Other Neutral: */ for (i = 0; i < strLength; ++i) { t = types[i]; if (t === 'WS' || t === 'ES' || t === 'ET' || t === 'CS') { types[i] = 'ON'; } } /* W7. Search backwards from each instance of a European number until the first strong type (R, L, or sor) is found. If an L is found, then change the type of the European number to L. */ lastType = sor; for (i = 0; i < strLength; ++i) { t = types[i]; if (t === 'EN') { types[i] = ((lastType === 'L') ? 'L' : 'EN'); } else if (t === 'R' || t === 'L') { lastType = t; } } /* N1. A sequence of neutrals takes the direction of the surrounding strong text if the text on both sides has the same direction. European and Arabic numbers are treated as though they were R. Start-of-level-run (sor) and end-of-level-run (eor) are used at level run boundaries. */ for (i = 0; i < strLength; ++i) { if (types[i] === 'ON') { var end = findUnequal(types, i + 1, 'ON'); var before = sor; if (i > 0) { before = types[i - 1]; } var after = eor; if (end + 1 < strLength) { after = types[end + 1]; } if (before !== 'L') { before = 'R'; } if (after !== 'L') { after = 'R'; } if (before === after) { setValues(types, i, end, before); } i = end - 1; // reset to end (-1 so next iteration is ok) } } /* N2. Any remaining neutrals take the embedding direction. */ for (i = 0; i < strLength; ++i) { if (types[i] === 'ON') { types[i] = e; } } /* I1. For all characters with an even (left-to-right) embedding direction, those of type R go up one level and those of type AN or EN go up two levels. I2. For all characters with an odd (right-to-left) embedding direction, those of type L, EN or AN go up one level. */ for (i = 0; i < strLength; ++i) { t = types[i]; if (isEven(levels[i])) { if (t === 'R') { levels[i] += 1; } else if (t === 'AN' || t === 'EN') { levels[i] += 2; } } else { // isOdd if (t === 'L' || t === 'AN' || t === 'EN') { levels[i] += 1; } } } /* L1. On each line, reset the embedding level of the following characters to the paragraph embedding level: segment separators, paragraph separators, any sequence of whitespace characters preceding a segment separator or paragraph separator, and any sequence of white space characters at the end of the line. */ // don't bother as text is only single line /* L2. From the highest level found in the text to the lowest odd level on each line, reverse any contiguous sequence of characters that are at that level or higher. */ // find highest level & lowest odd level var highestLevel = -1; var lowestOddLevel = 99; var level; for (i = 0, ii = levels.length; i < ii; ++i) { level = levels[i]; if (highestLevel < level) { highestLevel = level; } if (lowestOddLevel > level && isOdd(level)) { lowestOddLevel = level; } } // now reverse between those limits for (level = highestLevel; level >= lowestOddLevel; --level) { // find segments to reverse var start = -1; for (i = 0, ii = levels.length; i < ii; ++i) { if (levels[i] < level) { if (start >= 0) { reverseValues(chars, start, i); start = -1; } } else if (start < 0) { start = i; } } if (start >= 0) { reverseValues(chars, start, levels.length); } } /* L3. Combining marks applied to a right-to-left base character will at this point precede their base character. If the rendering engine expects them to follow the base characters in the final display process, then the ordering of the marks and the base character must be reversed. */ // don't bother for now /* L4. A character that possesses the mirrored property as specified by Section 4.7, Mirrored, must be depicted by a mirrored glyph if the resolved directionality of that character is R. */ // don't mirror as characters are already mirrored in the pdf // Finally, return string for (i = 0, ii = chars.length; i < ii; ++i) { var ch = chars[i]; if (ch === '<' || ch === '>') { chars[i] = ''; } } return createBidiText(chars.join(''), isLTR); } exports.bidi = bidi; })); (function (root, factory) { { factory((root.pdfjsCoreCharsets = {})); } }(this, function (exports) { var ISOAdobeCharset = [ '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron' ]; var ExpertCharset = [ '.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'onequarter', 'onehalf', 'threequarters', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall' ]; var ExpertSubsetCharset = [ '.notdef', 'space', 'dollaroldstyle', 'dollarsuperior', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted', 'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter', 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior' ]; exports.ISOAdobeCharset = ISOAdobeCharset; exports.ExpertCharset = ExpertCharset; exports.ExpertSubsetCharset = ExpertSubsetCharset; })); (function (root, factory) { { factory((root.pdfjsCoreEncodings = {})); } }(this, function (exports) { var ExpertEncoding = [ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior', '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '', 'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall']; var MacExpertEncoding = [ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '', 'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter', 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior', 'Circumflexsmall', 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', '', '', 'asuperior', 'centsuperior', '', '', '', '', 'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall', 'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall', 'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall', 'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '', 'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior', 'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior', 'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior', 'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '', 'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior', 'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall', 'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '', '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '', 'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior', 'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior', '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall', 'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior', 'periodsuperior', 'Dotaccentsmall', 'Ringsmall']; var MacRomanEncoding = [ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis', 'space', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron']; var StandardEncoding = [ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl', 'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla', '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '', '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae', '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls']; var WinAnsiEncoding = [ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron', 'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft', 'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash', 'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet', 'zcaron', 'Ydieresis', 'space', 'exclamdown', 'cent', 'sterling', 'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright', 'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered', 'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute', 'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior', 'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters', 'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis', 'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve', 'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash', 'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn', 'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis', 'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis', 'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve', 'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash', 'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn', 'ydieresis']; var SymbolSetEncoding = [ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent', 'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus', 'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi', 'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa', 'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau', 'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft', 'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex', 'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota', 'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho', 'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta', 'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal', 'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade', 'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree', 'plusminus', 'second', 'greaterequal', 'multiply', 'proportional', 'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence', 'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn', 'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply', 'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset', 'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element', 'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif', 'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot', 'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup', 'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans', 'copyrightsans', 'trademarksans', 'summation', 'parenlefttp', 'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex', 'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex', '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt', 'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp', 'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid', 'bracerightbt']; var ZapfDingbatsEncoding = [ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117', 'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19', 'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7', 'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36', 'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46', 'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56', 'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66', 'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75', 'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97', 'a98', 'a99', 'a100', '', 'a89', 'a90', 'a93', 'a94', 'a91', 'a92', 'a205', 'a85', 'a206', 'a86', 'a87', 'a88', 'a95', 'a96', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'a101', 'a102', 'a103', 'a104', 'a106', 'a107', 'a108', 'a112', 'a111', 'a110', 'a109', 'a120', 'a121', 'a122', 'a123', 'a124', 'a125', 'a126', 'a127', 'a128', 'a129', 'a130', 'a131', 'a132', 'a133', 'a134', 'a135', 'a136', 'a137', 'a138', 'a139', 'a140', 'a141', 'a142', 'a143', 'a144', 'a145', 'a146', 'a147', 'a148', 'a149', 'a150', 'a151', 'a152', 'a153', 'a154', 'a155', 'a156', 'a157', 'a158', 'a159', 'a160', 'a161', 'a163', 'a164', 'a196', 'a165', 'a192', 'a166', 'a167', 'a168', 'a169', 'a170', 'a171', 'a172', 'a173', 'a162', 'a174', 'a175', 'a176', 'a177', 'a178', 'a179', 'a193', 'a180', 'a199', 'a181', 'a200', 'a182', '', 'a201', 'a183', 'a184', 'a197', 'a185', 'a194', 'a198', 'a186', 'a195', 'a187', 'a188', 'a189', 'a190', 'a191']; function getEncoding(encodingName) { switch (encodingName) { case 'WinAnsiEncoding': return WinAnsiEncoding; case 'StandardEncoding': return StandardEncoding; case 'MacRomanEncoding': return MacRomanEncoding; case 'SymbolSetEncoding': return SymbolSetEncoding; case 'ZapfDingbatsEncoding': return ZapfDingbatsEncoding; case 'ExpertEncoding': return ExpertEncoding; case 'MacExpertEncoding': return MacExpertEncoding; default: return null; } } exports.WinAnsiEncoding = WinAnsiEncoding; exports.StandardEncoding = StandardEncoding; exports.MacRomanEncoding = MacRomanEncoding; exports.SymbolSetEncoding = SymbolSetEncoding; exports.ZapfDingbatsEncoding = ZapfDingbatsEncoding; exports.ExpertEncoding = ExpertEncoding; exports.getEncoding = getEncoding; })); (function (root, factory) { { factory((root.pdfjsCoreJpg = {})); } }(this, function (exports) { /* This code was forked from https://github.com/notmasteryet/jpgjs. The original version was created by github user notmasteryet - The JPEG specification can be found in the ITU CCITT Recommendation T.81 (www.w3.org/Graphics/JPEG/itu-t81.pdf) - The JFIF specification can be found in the JPEG File Interchange Format (www.w3.org/Graphics/JPEG/jfif3.pdf) - The Adobe Application-Specific JPEG markers in the Supporting the DCT Filters in PostScript Level 2, Technical Note #5116 (partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf) */ var JpegImage = (function jpegImage() { var dctZigZag = new Uint8Array([ 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63 ]); var dctCos1 = 4017; // cos(pi/16) var dctSin1 = 799; // sin(pi/16) var dctCos3 = 3406; // cos(3*pi/16) var dctSin3 = 2276; // sin(3*pi/16) var dctCos6 = 1567; // cos(6*pi/16) var dctSin6 = 3784; // sin(6*pi/16) var dctSqrt2 = 5793; // sqrt(2) var dctSqrt1d2 = 2896; // sqrt(2) / 2 function constructor() { } function buildHuffmanTable(codeLengths, values) { var k = 0, code = [], i, j, length = 16; while (length > 0 && !codeLengths[length - 1]) { length--; } code.push({children: [], index: 0}); var p = code[0], q; for (i = 0; i < length; i++) { for (j = 0; j < codeLengths[i]; j++) { p = code.pop(); p.children[p.index] = values[k]; while (p.index > 0) { p = code.pop(); } p.index++; code.push(p); while (code.length <= i) { code.push(q = {children: [], index: 0}); p.children[p.index] = q.children; p = q; } k++; } if (i + 1 < length) { // p here points to last code code.push(q = {children: [], index: 0}); p.children[p.index] = q.children; p = q; } } return code[0].children; } function getBlockBufferOffset(component, row, col) { return 64 * ((component.blocksPerLine + 1) * row + col); } function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive) { var mcusPerLine = frame.mcusPerLine; var progressive = frame.progressive; var startOffset = offset, bitsData = 0, bitsCount = 0; function readBit() { if (bitsCount > 0) { bitsCount--; return (bitsData >> bitsCount) & 1; } bitsData = data[offset++]; if (bitsData === 0xFF) { var nextByte = data[offset++]; if (nextByte) { throw 'unexpected marker: ' + ((bitsData << 8) | nextByte).toString(16); } // unstuff 0 } bitsCount = 7; return bitsData >>> 7; } function decodeHuffman(tree) { var node = tree; while (true) { node = node[readBit()]; if (typeof node === 'number') { return node; } if (typeof node !== 'object') { throw 'invalid huffman sequence'; } } } function receive(length) { var n = 0; while (length > 0) { n = (n << 1) | readBit(); length--; } return n; } function receiveAndExtend(length) { if (length === 1) { return readBit() === 1 ? 1 : -1; } var n = receive(length); if (n >= 1 << (length - 1)) { return n; } return n + (-1 << length) + 1; } function decodeBaseline(component, offset) { var t = decodeHuffman(component.huffmanTableDC); var diff = t === 0 ? 0 : receiveAndExtend(t); component.blockData[offset] = (component.pred += diff); var k = 1; while (k < 64) { var rs = decodeHuffman(component.huffmanTableAC); var s = rs & 15, r = rs >> 4; if (s === 0) { if (r < 15) { break; } k += 16; continue; } k += r; var z = dctZigZag[k]; component.blockData[offset + z] = receiveAndExtend(s); k++; } } function decodeDCFirst(component, offset) { var t = decodeHuffman(component.huffmanTableDC); var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive); component.blockData[offset] = (component.pred += diff); } function decodeDCSuccessive(component, offset) { component.blockData[offset] |= readBit() << successive; } var eobrun = 0; function decodeACFirst(component, offset) { if (eobrun > 0) { eobrun--; return; } var k = spectralStart, e = spectralEnd; while (k <= e) { var rs = decodeHuffman(component.huffmanTableAC); var s = rs & 15, r = rs >> 4; if (s === 0) { if (r < 15) { eobrun = receive(r) + (1 << r) - 1; break; } k += 16; continue; } k += r; var z = dctZigZag[k]; component.blockData[offset + z] = receiveAndExtend(s) * (1 << successive); k++; } } var successiveACState = 0, successiveACNextValue; function decodeACSuccessive(component, offset) { var k = spectralStart; var e = spectralEnd; var r = 0; var s; var rs; while (k <= e) { var z = dctZigZag[k]; switch (successiveACState) { case 0: // initial state rs = decodeHuffman(component.huffmanTableAC); s = rs & 15; r = rs >> 4; if (s === 0) { if (r < 15) { eobrun = receive(r) + (1 << r); successiveACState = 4; } else { r = 16; successiveACState = 1; } } else { if (s !== 1) { throw 'invalid ACn encoding'; } successiveACNextValue = receiveAndExtend(s); successiveACState = r ? 2 : 3; } continue; case 1: // skipping r zero items case 2: if (component.blockData[offset + z]) { component.blockData[offset + z] += (readBit() << successive); } else { r--; if (r === 0) { successiveACState = successiveACState === 2 ? 3 : 0; } } break; case 3: // set value for a zero item if (component.blockData[offset + z]) { component.blockData[offset + z] += (readBit() << successive); } else { component.blockData[offset + z] = successiveACNextValue << successive; successiveACState = 0; } break; case 4: // eob if (component.blockData[offset + z]) { component.blockData[offset + z] += (readBit() << successive); } break; } k++; } if (successiveACState === 4) { eobrun--; if (eobrun === 0) { successiveACState = 0; } } } function decodeMcu(component, decode, mcu, row, col) { var mcuRow = (mcu / mcusPerLine) | 0; var mcuCol = mcu % mcusPerLine; var blockRow = mcuRow * component.v + row; var blockCol = mcuCol * component.h + col; var offset = getBlockBufferOffset(component, blockRow, blockCol); decode(component, offset); } function decodeBlock(component, decode, mcu) { var blockRow = (mcu / component.blocksPerLine) | 0; var blockCol = mcu % component.blocksPerLine; var offset = getBlockBufferOffset(component, blockRow, blockCol); decode(component, offset); } var componentsLength = components.length; var component, i, j, k, n; var decodeFn; if (progressive) { if (spectralStart === 0) { decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; } else { decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; } } else { decodeFn = decodeBaseline; } var mcu = 0, marker; var mcuExpected; if (componentsLength === 1) { mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn; } else { mcuExpected = mcusPerLine * frame.mcusPerColumn; } if (!resetInterval) { resetInterval = mcuExpected; } var h, v; while (mcu < mcuExpected) { // reset interval stuff for (i = 0; i < componentsLength; i++) { components[i].pred = 0; } eobrun = 0; if (componentsLength === 1) { component = components[0]; for (n = 0; n < resetInterval; n++) { decodeBlock(component, decodeFn, mcu); mcu++; } } else { for (n = 0; n < resetInterval; n++) { for (i = 0; i < componentsLength; i++) { component = components[i]; h = component.h; v = component.v; for (j = 0; j < v; j++) { for (k = 0; k < h; k++) { decodeMcu(component, decodeFn, mcu, j, k); } } } mcu++; } } // find marker bitsCount = 0; marker = (data[offset] << 8) | data[offset + 1]; if (marker <= 0xFF00) { throw 'marker was not found'; } if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx offset += 2; } else { break; } } return offset - startOffset; } // A port of poppler's IDCT method which in turn is taken from: // Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz, // 'Practical Fast 1-D DCT Algorithms with 11 Multiplications', // IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989, // 988-991. function quantizeAndInverse(component, blockBufferOffset, p) { var qt = component.quantizationTable, blockData = component.blockData; var v0, v1, v2, v3, v4, v5, v6, v7; var p0, p1, p2, p3, p4, p5, p6, p7; var t; // inverse DCT on rows for (var row = 0; row < 64; row += 8) { // gather block data p0 = blockData[blockBufferOffset + row]; p1 = blockData[blockBufferOffset + row + 1]; p2 = blockData[blockBufferOffset + row + 2]; p3 = blockData[blockBufferOffset + row + 3]; p4 = blockData[blockBufferOffset + row + 4]; p5 = blockData[blockBufferOffset + row + 5]; p6 = blockData[blockBufferOffset + row + 6]; p7 = blockData[blockBufferOffset + row + 7]; // dequant p0 p0 *= qt[row]; // check for all-zero AC coefficients if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { t = (dctSqrt2 * p0 + 512) >> 10; p[row] = t; p[row + 1] = t; p[row + 2] = t; p[row + 3] = t; p[row + 4] = t; p[row + 5] = t; p[row + 6] = t; p[row + 7] = t; continue; } // dequant p1 ... p7 p1 *= qt[row + 1]; p2 *= qt[row + 2]; p3 *= qt[row + 3]; p4 *= qt[row + 4]; p5 *= qt[row + 5]; p6 *= qt[row + 6]; p7 *= qt[row + 7]; // stage 4 v0 = (dctSqrt2 * p0 + 128) >> 8; v1 = (dctSqrt2 * p4 + 128) >> 8; v2 = p2; v3 = p6; v4 = (dctSqrt1d2 * (p1 - p7) + 128) >> 8; v7 = (dctSqrt1d2 * (p1 + p7) + 128) >> 8; v5 = p3 << 4; v6 = p5 << 4; // stage 3 v0 = (v0 + v1 + 1) >> 1; v1 = v0 - v1; t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8; v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8; v3 = t; v4 = (v4 + v6 + 1) >> 1; v6 = v4 - v6; v7 = (v7 + v5 + 1) >> 1; v5 = v7 - v5; // stage 2 v0 = (v0 + v3 + 1) >> 1; v3 = v0 - v3; v1 = (v1 + v2 + 1) >> 1; v2 = v1 - v2; t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; v7 = t; t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; v6 = t; // stage 1 p[row] = v0 + v7; p[row + 7] = v0 - v7; p[row + 1] = v1 + v6; p[row + 6] = v1 - v6; p[row + 2] = v2 + v5; p[row + 5] = v2 - v5; p[row + 3] = v3 + v4; p[row + 4] = v3 - v4; } // inverse DCT on columns for (var col = 0; col < 8; ++col) { p0 = p[col]; p1 = p[col + 8]; p2 = p[col + 16]; p3 = p[col + 24]; p4 = p[col + 32]; p5 = p[col + 40]; p6 = p[col + 48]; p7 = p[col + 56]; // check for all-zero AC coefficients if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { t = (dctSqrt2 * p0 + 8192) >> 14; // convert to 8 bit t = (t < -2040) ? 0 : (t >= 2024) ? 255 : (t + 2056) >> 4; blockData[blockBufferOffset + col] = t; blockData[blockBufferOffset + col + 8] = t; blockData[blockBufferOffset + col + 16] = t; blockData[blockBufferOffset + col + 24] = t; blockData[blockBufferOffset + col + 32] = t; blockData[blockBufferOffset + col + 40] = t; blockData[blockBufferOffset + col + 48] = t; blockData[blockBufferOffset + col + 56] = t; continue; } // stage 4 v0 = (dctSqrt2 * p0 + 2048) >> 12; v1 = (dctSqrt2 * p4 + 2048) >> 12; v2 = p2; v3 = p6; v4 = (dctSqrt1d2 * (p1 - p7) + 2048) >> 12; v7 = (dctSqrt1d2 * (p1 + p7) + 2048) >> 12; v5 = p3; v6 = p5; // stage 3 // Shift v0 by 128.5 << 5 here, so we don't need to shift p0...p7 when // converting to UInt8 range later. v0 = ((v0 + v1 + 1) >> 1) + 4112; v1 = v0 - v1; t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12; v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12; v3 = t; v4 = (v4 + v6 + 1) >> 1; v6 = v4 - v6; v7 = (v7 + v5 + 1) >> 1; v5 = v7 - v5; // stage 2 v0 = (v0 + v3 + 1) >> 1; v3 = v0 - v3; v1 = (v1 + v2 + 1) >> 1; v2 = v1 - v2; t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; v7 = t; t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; v6 = t; // stage 1 p0 = v0 + v7; p7 = v0 - v7; p1 = v1 + v6; p6 = v1 - v6; p2 = v2 + v5; p5 = v2 - v5; p3 = v3 + v4; p4 = v3 - v4; // convert to 8-bit integers p0 = (p0 < 16) ? 0 : (p0 >= 4080) ? 255 : p0 >> 4; p1 = (p1 < 16) ? 0 : (p1 >= 4080) ? 255 : p1 >> 4; p2 = (p2 < 16) ? 0 : (p2 >= 4080) ? 255 : p2 >> 4; p3 = (p3 < 16) ? 0 : (p3 >= 4080) ? 255 : p3 >> 4; p4 = (p4 < 16) ? 0 : (p4 >= 4080) ? 255 : p4 >> 4; p5 = (p5 < 16) ? 0 : (p5 >= 4080) ? 255 : p5 >> 4; p6 = (p6 < 16) ? 0 : (p6 >= 4080) ? 255 : p6 >> 4; p7 = (p7 < 16) ? 0 : (p7 >= 4080) ? 255 : p7 >> 4; // store block data blockData[blockBufferOffset + col] = p0; blockData[blockBufferOffset + col + 8] = p1; blockData[blockBufferOffset + col + 16] = p2; blockData[blockBufferOffset + col + 24] = p3; blockData[blockBufferOffset + col + 32] = p4; blockData[blockBufferOffset + col + 40] = p5; blockData[blockBufferOffset + col + 48] = p6; blockData[blockBufferOffset + col + 56] = p7; } } function buildComponentData(frame, component) { var blocksPerLine = component.blocksPerLine; var blocksPerColumn = component.blocksPerColumn; var computationBuffer = new Int16Array(64); for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) { for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) { var offset = getBlockBufferOffset(component, blockRow, blockCol); quantizeAndInverse(component, offset, computationBuffer); } } return component.blockData; } function clamp0to255(a) { return a <= 0 ? 0 : a >= 255 ? 255 : a; } constructor.prototype = { parse: function parse(data) { function readUint16() { var value = (data[offset] << 8) | data[offset + 1]; offset += 2; return value; } function readDataBlock() { var length = readUint16(); var array = data.subarray(offset, offset + length - 2); offset += array.length; return array; } function prepareComponents(frame) { var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH); var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV); for (var i = 0; i < frame.components.length; i++) { component = frame.components[i]; var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH); var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / frame.maxV); var blocksPerLineForMcu = mcusPerLine * component.h; var blocksPerColumnForMcu = mcusPerColumn * component.v; var blocksBufferSize = 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1); component.blockData = new Int16Array(blocksBufferSize); component.blocksPerLine = blocksPerLine; component.blocksPerColumn = blocksPerColumn; } frame.mcusPerLine = mcusPerLine; frame.mcusPerColumn = mcusPerColumn; } var offset = 0; var jfif = null; var adobe = null; var frame, resetInterval; var quantizationTables = []; var huffmanTablesAC = [], huffmanTablesDC = []; var fileMarker = readUint16(); if (fileMarker !== 0xFFD8) { // SOI (Start of Image) throw 'SOI not found'; } fileMarker = readUint16(); while (fileMarker !== 0xFFD9) { // EOI (End of image) var i, j, l; switch(fileMarker) { case 0xFFE0: // APP0 (Application Specific) case 0xFFE1: // APP1 case 0xFFE2: // APP2 case 0xFFE3: // APP3 case 0xFFE4: // APP4 case 0xFFE5: // APP5 case 0xFFE6: // APP6 case 0xFFE7: // APP7 case 0xFFE8: // APP8 case 0xFFE9: // APP9 case 0xFFEA: // APP10 case 0xFFEB: // APP11 case 0xFFEC: // APP12 case 0xFFED: // APP13 case 0xFFEE: // APP14 case 0xFFEF: // APP15 case 0xFFFE: // COM (Comment) var appData = readDataBlock(); if (fileMarker === 0xFFE0) { if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) { // 'JFIF\x00' jfif = { version: { major: appData[5], minor: appData[6] }, densityUnits: appData[7], xDensity: (appData[8] << 8) | appData[9], yDensity: (appData[10] << 8) | appData[11], thumbWidth: appData[12], thumbHeight: appData[13], thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13]) }; } } // TODO APP1 - Exif if (fileMarker === 0xFFEE) { if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F && appData[3] === 0x62 && appData[4] === 0x65) { // 'Adobe' adobe = { version: (appData[5] << 8) | appData[6], flags0: (appData[7] << 8) | appData[8], flags1: (appData[9] << 8) | appData[10], transformCode: appData[11] }; } } break; case 0xFFDB: // DQT (Define Quantization Tables) var quantizationTablesLength = readUint16(); var quantizationTablesEnd = quantizationTablesLength + offset - 2; var z; while (offset < quantizationTablesEnd) { var quantizationTableSpec = data[offset++]; var tableData = new Uint16Array(64); if ((quantizationTableSpec >> 4) === 0) { // 8 bit values for (j = 0; j < 64; j++) { z = dctZigZag[j]; tableData[z] = data[offset++]; } } else if ((quantizationTableSpec >> 4) === 1) { //16 bit for (j = 0; j < 64; j++) { z = dctZigZag[j]; tableData[z] = readUint16(); } } else { throw 'DQT: invalid table spec'; } quantizationTables[quantizationTableSpec & 15] = tableData; } break; case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT) case 0xFFC1: // SOF1 (Start of Frame, Extended DCT) case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT) if (frame) { throw 'Only single frame JPEGs supported'; } readUint16(); // skip data length frame = {}; frame.extended = (fileMarker === 0xFFC1); frame.progressive = (fileMarker === 0xFFC2); frame.precision = data[offset++]; frame.scanLines = readUint16(); frame.samplesPerLine = readUint16(); frame.components = []; frame.componentIds = {}; var componentsCount = data[offset++], componentId; var maxH = 0, maxV = 0; for (i = 0; i < componentsCount; i++) { componentId = data[offset]; var h = data[offset + 1] >> 4; var v = data[offset + 1] & 15; if (maxH < h) { maxH = h; } if (maxV < v) { maxV = v; } var qId = data[offset + 2]; l = frame.components.push({ h: h, v: v, quantizationTable: quantizationTables[qId] }); frame.componentIds[componentId] = l - 1; offset += 3; } frame.maxH = maxH; frame.maxV = maxV; prepareComponents(frame); break; case 0xFFC4: // DHT (Define Huffman Tables) var huffmanLength = readUint16(); for (i = 2; i < huffmanLength;) { var huffmanTableSpec = data[offset++]; var codeLengths = new Uint8Array(16); var codeLengthSum = 0; for (j = 0; j < 16; j++, offset++) { codeLengthSum += (codeLengths[j] = data[offset]); } var huffmanValues = new Uint8Array(codeLengthSum); for (j = 0; j < codeLengthSum; j++, offset++) { huffmanValues[j] = data[offset]; } i += 17 + codeLengthSum; ((huffmanTableSpec >> 4) === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues); } break; case 0xFFDD: // DRI (Define Restart Interval) readUint16(); // skip data length resetInterval = readUint16(); break; case 0xFFDA: // SOS (Start of Scan) var scanLength = readUint16(); var selectorsCount = data[offset++]; var components = [], component; for (i = 0; i < selectorsCount; i++) { var componentIndex = frame.componentIds[data[offset++]]; component = frame.components[componentIndex]; var tableSpec = data[offset++]; component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; components.push(component); } var spectralStart = data[offset++]; var spectralEnd = data[offset++]; var successiveApproximation = data[offset++]; var processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15); offset += processed; break; case 0xFFFF: // Fill bytes if (data[offset] !== 0xFF) { // Avoid skipping a valid marker. offset--; } break; default: if (data[offset - 3] === 0xFF && data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) { // could be incorrect encoding -- last 0xFF byte of the previous // block was eaten by the encoder offset -= 3; break; } throw 'unknown JPEG marker ' + fileMarker.toString(16); } fileMarker = readUint16(); } this.width = frame.samplesPerLine; this.height = frame.scanLines; this.jfif = jfif; this.adobe = adobe; this.components = []; for (i = 0; i < frame.components.length; i++) { component = frame.components[i]; this.components.push({ output: buildComponentData(frame, component), scaleX: component.h / frame.maxH, scaleY: component.v / frame.maxV, blocksPerLine: component.blocksPerLine, blocksPerColumn: component.blocksPerColumn }); } this.numComponents = this.components.length; }, _getLinearizedBlockData: function getLinearizedBlockData(width, height) { var scaleX = this.width / width, scaleY = this.height / height; var component, componentScaleX, componentScaleY, blocksPerScanline; var x, y, i, j, k; var index; var offset = 0; var output; var numComponents = this.components.length; var dataLength = width * height * numComponents; var data = new Uint8Array(dataLength); var xScaleBlockOffset = new Uint32Array(width); var mask3LSB = 0xfffffff8; // used to clear the 3 LSBs for (i = 0; i < numComponents; i++) { component = this.components[i]; componentScaleX = component.scaleX * scaleX; componentScaleY = component.scaleY * scaleY; offset = i; output = component.output; blocksPerScanline = (component.blocksPerLine + 1) << 3; // precalculate the xScaleBlockOffset for (x = 0; x < width; x++) { j = 0 | (x * componentScaleX); xScaleBlockOffset[x] = ((j & mask3LSB) << 3) | (j & 7); } // linearize the blocks of the component for (y = 0; y < height; y++) { j = 0 | (y * componentScaleY); index = blocksPerScanline * (j & mask3LSB) | ((j & 7) << 3); for (x = 0; x < width; x++) { data[offset] = output[index + xScaleBlockOffset[x]]; offset += numComponents; } } } // decodeTransform contains pairs of multiplier (-256..256) and additive var transform = this.decodeTransform; if (transform) { for (i = 0; i < dataLength;) { for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) { data[i] = ((data[i] * transform[k]) >> 8) + transform[k + 1]; } } } return data; }, _isColorConversionNeeded: function isColorConversionNeeded() { if (this.adobe && this.adobe.transformCode) { // The adobe transform marker overrides any previous setting return true; } else if (this.numComponents === 3) { return true; } else { return false; } }, _convertYccToRgb: function convertYccToRgb(data) { var Y, Cb, Cr; for (var i = 0, length = data.length; i < length; i += 3) { Y = data[i ]; Cb = data[i + 1]; Cr = data[i + 2]; data[i ] = clamp0to255(Y - 179.456 + 1.402 * Cr); data[i + 1] = clamp0to255(Y + 135.459 - 0.344 * Cb - 0.714 * Cr); data[i + 2] = clamp0to255(Y - 226.816 + 1.772 * Cb); } return data; }, _convertYcckToRgb: function convertYcckToRgb(data) { var Y, Cb, Cr, k; var offset = 0; for (var i = 0, length = data.length; i < length; i += 4) { Y = data[i]; Cb = data[i + 1]; Cr = data[i + 2]; k = data[i + 3]; var r = -122.67195406894 + Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - 0.154362151871126) + Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - 0.00477271405408747 * k + 1.53380253221734) + Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + 0.48357088451265) + k * (-0.000336197177618394 * k + 0.484791561490776); var g = 107.268039397724 + Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + 0.000659397001245577 * Y + 0.000426105652938837 * k - 0.176491792462875) + Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + 0.000770482631801132 * k - 0.151051492775562) + Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + 0.25802910206845) + k * (-0.000318913117588328 * k - 0.213742400323665); var b = -20.810012546947 + Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + 0.0020741088115012 * Y - 0.00288260236853442 * k + 0.814272968359295) + Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + 0.000560833691242812 * k - 0.195152027534049) + Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407); data[offset++] = clamp0to255(r); data[offset++] = clamp0to255(g); data[offset++] = clamp0to255(b); } return data; }, _convertYcckToCmyk: function convertYcckToCmyk(data) { var Y, Cb, Cr; for (var i = 0, length = data.length; i < length; i += 4) { Y = data[i]; Cb = data[i + 1]; Cr = data[i + 2]; data[i ] = clamp0to255(434.456 - Y - 1.402 * Cr); data[i + 1] = clamp0to255(119.541 - Y + 0.344 * Cb + 0.714 * Cr); data[i + 2] = clamp0to255(481.816 - Y - 1.772 * Cb); // K in data[i + 3] is unchanged } return data; }, _convertCmykToRgb: function convertCmykToRgb(data) { var c, m, y, k; var offset = 0; var min = -255 * 255 * 255; var scale = 1 / 255 / 255; for (var i = 0, length = data.length; i < length; i += 4) { c = data[i]; m = data[i + 1]; y = data[i + 2]; k = data[i + 3]; var r = c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k - 72734.4411664936) + m * (1.7149763477362134 * m - 5.6096736904047315 * y - 17.873870861415444 * k - 1401.7366389350734) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 4465.541406466231) - k * (21.86122147463605 * k + 48317.86113160301); var g = c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k - 20220.756542821975) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 48691.05921601825) + y * (4.444339102852739 * y + 9.8632861493405 * k - 6341.191035517494) - k * (20.737325471181034 * k + 47890.15695978492); var b = c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k - 3616.812083916688) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 28620.90484698408) + y * (0.03296041114873217 * y + 115.60384449646641 * k - 49363.43385999684) - k * (22.33816807309886 * k + 45932.16563550634); data[offset++] = r >= 0 ? 255 : r <= min ? 0 : 255 + r * scale | 0; data[offset++] = g >= 0 ? 255 : g <= min ? 0 : 255 + g * scale | 0; data[offset++] = b >= 0 ? 255 : b <= min ? 0 : 255 + b * scale | 0; } return data; }, getData: function getData(width, height, forceRGBoutput) { if (this.numComponents > 4) { throw 'Unsupported color mode'; } // type of data: Uint8Array(width * height * numComponents) var data = this._getLinearizedBlockData(width, height); if (this.numComponents === 1 && forceRGBoutput) { var dataLength = data.length; var rgbData = new Uint8Array(dataLength * 3); var offset = 0; for (var i = 0; i < dataLength; i++) { var grayColor = data[i]; rgbData[offset++] = grayColor; rgbData[offset++] = grayColor; rgbData[offset++] = grayColor; } return rgbData; } else if (this.numComponents === 3) { return this._convertYccToRgb(data); } else if (this.numComponents === 4) { if (this._isColorConversionNeeded()) { if (forceRGBoutput) { return this._convertYcckToRgb(data); } else { return this._convertYcckToCmyk(data); } } else if (forceRGBoutput) { return this._convertCmykToRgb(data); } } return data; } }; return constructor; })(); exports.JpegImage = JpegImage; })); (function (root, factory) { { factory((root.pdfjsSharedUtil = {})); } }(this, function (exports) { var globalScope = (typeof window !== 'undefined') ? window : (typeof global !== 'undefined') ? global : (typeof self !== 'undefined') ? self : this; var FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; var TextRenderingMode = { FILL: 0, STROKE: 1, FILL_STROKE: 2, INVISIBLE: 3, FILL_ADD_TO_PATH: 4, STROKE_ADD_TO_PATH: 5, FILL_STROKE_ADD_TO_PATH: 6, ADD_TO_PATH: 7, FILL_STROKE_MASK: 3, ADD_TO_PATH_FLAG: 4 }; var ImageKind = { GRAYSCALE_1BPP: 1, RGB_24BPP: 2, RGBA_32BPP: 3 }; var AnnotationType = { TEXT: 1, LINK: 2, FREETEXT: 3, LINE: 4, SQUARE: 5, CIRCLE: 6, POLYGON: 7, POLYLINE: 8, HIGHLIGHT: 9, UNDERLINE: 10, SQUIGGLY: 11, STRIKEOUT: 12, STAMP: 13, CARET: 14, INK: 15, POPUP: 16, FILEATTACHMENT: 17, SOUND: 18, MOVIE: 19, WIDGET: 20, SCREEN: 21, PRINTERMARK: 22, TRAPNET: 23, WATERMARK: 24, THREED: 25, REDACT: 26 }; var AnnotationFlag = { INVISIBLE: 0x01, HIDDEN: 0x02, PRINT: 0x04, NOZOOM: 0x08, NOROTATE: 0x10, NOVIEW: 0x20, READONLY: 0x40, LOCKED: 0x80, TOGGLENOVIEW: 0x100, LOCKEDCONTENTS: 0x200 }; var AnnotationBorderStyleType = { SOLID: 1, DASHED: 2, BEVELED: 3, INSET: 4, UNDERLINE: 5 }; var StreamType = { UNKNOWN: 0, FLATE: 1, LZW: 2, DCT: 3, JPX: 4, JBIG: 5, A85: 6, AHX: 7, CCF: 8, RL: 9 }; var FontType = { UNKNOWN: 0, TYPE1: 1, TYPE1C: 2, CIDFONTTYPE0: 3, CIDFONTTYPE0C: 4, TRUETYPE: 5, CIDFONTTYPE2: 6, TYPE3: 7, OPENTYPE: 8, TYPE0: 9, MMTYPE1: 10 }; var VERBOSITY_LEVELS = { errors: 0, warnings: 1, infos: 5 }; // All the possible operations for an operator list. var OPS = { // Intentionally start from 1 so it is easy to spot bad operators that will be // 0's. dependency: 1, setLineWidth: 2, setLineCap: 3, setLineJoin: 4, setMiterLimit: 5, setDash: 6, setRenderingIntent: 7, setFlatness: 8, setGState: 9, save: 10, restore: 11, transform: 12, moveTo: 13, lineTo: 14, curveTo: 15, curveTo2: 16, curveTo3: 17, closePath: 18, rectangle: 19, stroke: 20, closeStroke: 21, fill: 22, eoFill: 23, fillStroke: 24, eoFillStroke: 25, closeFillStroke: 26, closeEOFillStroke: 27, endPath: 28, clip: 29, eoClip: 30, beginText: 31, endText: 32, setCharSpacing: 33, setWordSpacing: 34, setHScale: 35, setLeading: 36, setFont: 37, setTextRenderingMode: 38, setTextRise: 39, moveText: 40, setLeadingMoveText: 41, setTextMatrix: 42, nextLine: 43, showText: 44, showSpacedText: 45, nextLineShowText: 46, nextLineSetSpacingShowText: 47, setCharWidth: 48, setCharWidthAndBounds: 49, setStrokeColorSpace: 50, setFillColorSpace: 51, setStrokeColor: 52, setStrokeColorN: 53, setFillColor: 54, setFillColorN: 55, setStrokeGray: 56, setFillGray: 57, setStrokeRGBColor: 58, setFillRGBColor: 59, setStrokeCMYKColor: 60, setFillCMYKColor: 61, shadingFill: 62, beginInlineImage: 63, beginImageData: 64, endInlineImage: 65, paintXObject: 66, markPoint: 67, markPointProps: 68, beginMarkedContent: 69, beginMarkedContentProps: 70, endMarkedContent: 71, beginCompat: 72, endCompat: 73, paintFormXObjectBegin: 74, paintFormXObjectEnd: 75, beginGroup: 76, endGroup: 77, beginAnnotations: 78, endAnnotations: 79, beginAnnotation: 80, endAnnotation: 81, paintJpegXObject: 82, paintImageMaskXObject: 83, paintImageMaskXObjectGroup: 84, paintImageXObject: 85, paintInlineImageXObject: 86, paintInlineImageXObjectGroup: 87, paintImageXObjectRepeat: 88, paintImageMaskXObjectRepeat: 89, paintSolidColorImageMask: 90, constructPath: 91 }; var verbosity = VERBOSITY_LEVELS.warnings; function setVerbosityLevel(level) { verbosity = level; } function getVerbosityLevel() { return verbosity; } // A notice for devs. These are good for things that are helpful to devs, such // as warning that Workers were disabled, which is important to devs but not // end users. function info(msg) { if (verbosity >= VERBOSITY_LEVELS.infos) { console.log('Info: ' + msg); } } // Non-fatal warnings. function warn(msg) { if (verbosity >= VERBOSITY_LEVELS.warnings) { console.log('Warning: ' + msg); } } // Deprecated API function -- display regardless of the PDFJS.verbosity setting. function deprecated(details) { console.log('Deprecated API usage: ' + details); } // Fatal errors that should trigger the fallback UI and halt execution by // throwing an exception. function error(msg) { if (verbosity >= VERBOSITY_LEVELS.errors) { console.log('Error: ' + msg); console.log(backtrace()); } throw new Error(msg); } function backtrace() { try { throw new Error(); } catch (e) { return e.stack ? e.stack.split('\n').slice(2).join('\n') : ''; } } function assert(cond, msg) { if (!cond) { error(msg); } } var UNSUPPORTED_FEATURES = { unknown: 'unknown', forms: 'forms', javaScript: 'javaScript', smask: 'smask', shadingPattern: 'shadingPattern', font: 'font' }; // Combines two URLs. The baseUrl shall be absolute URL. If the url is an // absolute URL, it will be returned as is. function combineUrl(baseUrl, url) { if (!url) { return baseUrl; } return new URL(url, baseUrl).href; } // Checks if URLs have the same origin. For non-HTTP based URLs, returns false. function isSameOrigin(baseUrl, otherUrl) { try { var base = new URL(baseUrl); if (!base.origin || base.origin === 'null') { return false; // non-HTTP url } } catch (e) { return false; } var other = new URL(otherUrl, base); return base.origin === other.origin; } // Validates if URL is safe and allowed, e.g. to avoid XSS. function isValidUrl(url, allowRelative) { if (!url) { return false; } // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1) // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) var protocol = /^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url); if (!protocol) { return allowRelative; } protocol = protocol[0].toLowerCase(); switch (protocol) { case 'http': case 'https': case 'ftp': case 'mailto': case 'tel': return true; default: return false; } } function shadow(obj, prop, value) { Object.defineProperty(obj, prop, { value: value, enumerable: true, configurable: true, writable: false }); return value; } function getLookupTableFactory(initializer) { var lookup; return function () { if (initializer) { lookup = Object.create(null); initializer(lookup); initializer = null; } return lookup; }; } var PasswordResponses = { NEED_PASSWORD: 1, INCORRECT_PASSWORD: 2 }; var PasswordException = (function PasswordExceptionClosure() { function PasswordException(msg, code) { this.name = 'PasswordException'; this.message = msg; this.code = code; } PasswordException.prototype = new Error(); PasswordException.constructor = PasswordException; return PasswordException; })(); var UnknownErrorException = (function UnknownErrorExceptionClosure() { function UnknownErrorException(msg, details) { this.name = 'UnknownErrorException'; this.message = msg; this.details = details; } UnknownErrorException.prototype = new Error(); UnknownErrorException.constructor = UnknownErrorException; return UnknownErrorException; })(); var InvalidPDFException = (function InvalidPDFExceptionClosure() { function InvalidPDFException(msg) { this.name = 'InvalidPDFException'; this.message = msg; } InvalidPDFException.prototype = new Error(); InvalidPDFException.constructor = InvalidPDFException; return InvalidPDFException; })(); var MissingPDFException = (function MissingPDFExceptionClosure() { function MissingPDFException(msg) { this.name = 'MissingPDFException'; this.message = msg; } MissingPDFException.prototype = new Error(); MissingPDFException.constructor = MissingPDFException; return MissingPDFException; })(); var UnexpectedResponseException = (function UnexpectedResponseExceptionClosure() { function UnexpectedResponseException(msg, status) { this.name = 'UnexpectedResponseException'; this.message = msg; this.status = status; } UnexpectedResponseException.prototype = new Error(); UnexpectedResponseException.constructor = UnexpectedResponseException; return UnexpectedResponseException; })(); var NotImplementedException = (function NotImplementedExceptionClosure() { function NotImplementedException(msg) { this.message = msg; } NotImplementedException.prototype = new Error(); NotImplementedException.prototype.name = 'NotImplementedException'; NotImplementedException.constructor = NotImplementedException; return NotImplementedException; })(); var MissingDataException = (function MissingDataExceptionClosure() { function MissingDataException(begin, end) { this.begin = begin; this.end = end; this.message = 'Missing data [' + begin + ', ' + end + ')'; } MissingDataException.prototype = new Error(); MissingDataException.prototype.name = 'MissingDataException'; MissingDataException.constructor = MissingDataException; return MissingDataException; })(); var XRefParseException = (function XRefParseExceptionClosure() { function XRefParseException(msg) { this.message = msg; } XRefParseException.prototype = new Error(); XRefParseException.prototype.name = 'XRefParseException'; XRefParseException.constructor = XRefParseException; return XRefParseException; })(); var NullCharactersRegExp = /\x00/g; function removeNullCharacters(str) { if (typeof str !== 'string') { warn('The argument for removeNullCharacters must be a string.'); return str; } return str.replace(NullCharactersRegExp, ''); } function bytesToString(bytes) { assert(bytes !== null && typeof bytes === 'object' && bytes.length !== undefined, 'Invalid argument for bytesToString'); var length = bytes.length; var MAX_ARGUMENT_COUNT = 8192; if (length < MAX_ARGUMENT_COUNT) { return String.fromCharCode.apply(null, bytes); } var strBuf = []; for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) { var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); var chunk = bytes.subarray(i, chunkEnd); strBuf.push(String.fromCharCode.apply(null, chunk)); } return strBuf.join(''); } function stringToBytes(str) { assert(typeof str === 'string', 'Invalid argument for stringToBytes'); var length = str.length; var bytes = new Uint8Array(length); for (var i = 0; i < length; ++i) { bytes[i] = str.charCodeAt(i) & 0xFF; } return bytes; } /** * Gets length of the array (Array, Uint8Array, or string) in bytes. * @param {Array|Uint8Array|string} arr * @returns {number} */ function arrayByteLength(arr) { if (arr.length !== undefined) { return arr.length; } assert(arr.byteLength !== undefined); return arr.byteLength; } /** * Combines array items (arrays) into single Uint8Array object. * @param {Array} arr - the array of the arrays (Array, Uint8Array, or string). * @returns {Uint8Array} */ function arraysToBytes(arr) { // Shortcut: if first and only item is Uint8Array, return it. if (arr.length === 1 && (arr[0] instanceof Uint8Array)) { return arr[0]; } var resultLength = 0; var i, ii = arr.length; var item, itemLength ; for (i = 0; i < ii; i++) { item = arr[i]; itemLength = arrayByteLength(item); resultLength += itemLength; } var pos = 0; var data = new Uint8Array(resultLength); for (i = 0; i < ii; i++) { item = arr[i]; if (!(item instanceof Uint8Array)) { if (typeof item === 'string') { item = stringToBytes(item); } else { item = new Uint8Array(item); } } itemLength = item.byteLength; data.set(item, pos); pos += itemLength; } return data; } function string32(value) { return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff); } function log2(x) { var n = 1, i = 0; while (x > n) { n <<= 1; i++; } return i; } function readInt8(data, start) { return (data[start] << 24) >> 24; } function readUint16(data, offset) { return (data[offset] << 8) | data[offset + 1]; } function readUint32(data, offset) { return ((data[offset] << 24) | (data[offset + 1] << 16) | (data[offset + 2] << 8) | data[offset + 3]) >>> 0; } // Lazy test the endianness of the platform // NOTE: This will be 'true' for simulated TypedArrays function isLittleEndian() { var buffer8 = new Uint8Array(2); buffer8[0] = 1; var buffer16 = new Uint16Array(buffer8.buffer); return (buffer16[0] === 1); } // Checks if it's possible to eval JS expressions. function isEvalSupported() { try { /* jshint evil: true */ new Function(''); return true; } catch (e) { return false; } } var Uint32ArrayView = (function Uint32ArrayViewClosure() { function Uint32ArrayView(buffer, length) { this.buffer = buffer; this.byteLength = buffer.length; this.length = length === undefined ? (this.byteLength >> 2) : length; ensureUint32ArrayViewProps(this.length); } Uint32ArrayView.prototype = Object.create(null); var uint32ArrayViewSetters = 0; function createUint32ArrayProp(index) { return { get: function () { var buffer = this.buffer, offset = index << 2; return (buffer[offset] | (buffer[offset + 1] << 8) | (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)) >>> 0; }, set: function (value) { var buffer = this.buffer, offset = index << 2; buffer[offset] = value & 255; buffer[offset + 1] = (value >> 8) & 255; buffer[offset + 2] = (value >> 16) & 255; buffer[offset + 3] = (value >>> 24) & 255; } }; } function ensureUint32ArrayViewProps(length) { while (uint32ArrayViewSetters < length) { Object.defineProperty(Uint32ArrayView.prototype, uint32ArrayViewSetters, createUint32ArrayProp(uint32ArrayViewSetters)); uint32ArrayViewSetters++; } } return Uint32ArrayView; })(); exports.Uint32ArrayView = Uint32ArrayView; var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; var Util = (function UtilClosure() { function Util() {} var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')']; // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids // creating many intermediate strings. Util.makeCssRgb = function Util_makeCssRgb(r, g, b) { rgbBuf[1] = r; rgbBuf[3] = g; rgbBuf[5] = b; return rgbBuf.join(''); }; // Concatenates two transformation matrices together and returns the result. Util.transform = function Util_transform(m1, m2) { return [ m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5] ]; }; // For 2d affine transforms Util.applyTransform = function Util_applyTransform(p, m) { var xt = p[0] * m[0] + p[1] * m[2] + m[4]; var yt = p[0] * m[1] + p[1] * m[3] + m[5]; return [xt, yt]; }; Util.applyInverseTransform = function Util_applyInverseTransform(p, m) { var d = m[0] * m[3] - m[1] * m[2]; var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; return [xt, yt]; }; // Applies the transform to the rectangle and finds the minimum axially // aligned bounding box. Util.getAxialAlignedBoundingBox = function Util_getAxialAlignedBoundingBox(r, m) { var p1 = Util.applyTransform(r, m); var p2 = Util.applyTransform(r.slice(2, 4), m); var p3 = Util.applyTransform([r[0], r[3]], m); var p4 = Util.applyTransform([r[2], r[1]], m); return [ Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1]) ]; }; Util.inverseTransform = function Util_inverseTransform(m) { var d = m[0] * m[3] - m[1] * m[2]; return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; }; // Apply a generic 3d matrix M on a 3-vector v: // | a b c | | X | // | d e f | x | Y | // | g h i | | Z | // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i], // with v as [X,Y,Z] Util.apply3dTransform = function Util_apply3dTransform(m, v) { return [ m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2] ]; }; // This calculation uses Singular Value Decomposition. // The SVD can be represented with formula A = USV. We are interested in the // matrix S here because it represents the scale values. Util.singularValueDecompose2dScale = function Util_singularValueDecompose2dScale(m) { var transpose = [m[0], m[2], m[1], m[3]]; // Multiply matrix m with its transpose. var a = m[0] * transpose[0] + m[1] * transpose[2]; var b = m[0] * transpose[1] + m[1] * transpose[3]; var c = m[2] * transpose[0] + m[3] * transpose[2]; var d = m[2] * transpose[1] + m[3] * transpose[3]; // Solve the second degree polynomial to get roots. var first = (a + d) / 2; var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2; var sx = first + second || 1; var sy = first - second || 1; // Scale values are the square roots of the eigenvalues. return [Math.sqrt(sx), Math.sqrt(sy)]; }; // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2) // For coordinate systems whose origin lies in the bottom-left, this // means normalization to (BL,TR) ordering. For systems with origin in the // top-left, this means (TL,BR) ordering. Util.normalizeRect = function Util_normalizeRect(rect) { var r = rect.slice(0); // clone rect if (rect[0] > rect[2]) { r[0] = rect[2]; r[2] = rect[0]; } if (rect[1] > rect[3]) { r[1] = rect[3]; r[3] = rect[1]; } return r; }; // Returns a rectangle [x1, y1, x2, y2] corresponding to the // intersection of rect1 and rect2. If no intersection, returns 'false' // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2] Util.intersect = function Util_intersect(rect1, rect2) { function compare(a, b) { return a - b; } // Order points along the axes var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare), orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare), result = []; rect1 = Util.normalizeRect(rect1); rect2 = Util.normalizeRect(rect2); // X: first and second points belong to different rectangles? if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) || (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) { // Intersection must be between second and third points result[0] = orderedX[1]; result[2] = orderedX[2]; } else { return false; } // Y: first and second points belong to different rectangles? if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) || (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) { // Intersection must be between second and third points result[1] = orderedY[1]; result[3] = orderedY[2]; } else { return false; } return result; }; Util.sign = function Util_sign(num) { return num < 0 ? -1 : 1; }; var ROMAN_NUMBER_MAP = [ '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX' ]; /** * Converts positive integers to (upper case) Roman numerals. * @param {integer} number - The number that should be converted. * @param {boolean} lowerCase - Indicates if the result should be converted * to lower case letters. The default is false. * @return {string} The resulting Roman number. */ Util.toRoman = function Util_toRoman(number, lowerCase) { assert(isInt(number) && number > 0, 'The number should be a positive integer.'); var pos, romanBuf = []; // Thousands while (number >= 1000) { number -= 1000; romanBuf.push('M'); } // Hundreds pos = (number / 100) | 0; number %= 100; romanBuf.push(ROMAN_NUMBER_MAP[pos]); // Tens pos = (number / 10) | 0; number %= 10; romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]); // Ones romanBuf.push(ROMAN_NUMBER_MAP[20 + number]); var romanStr = romanBuf.join(''); return (lowerCase ? romanStr.toLowerCase() : romanStr); }; Util.appendToArray = function Util_appendToArray(arr1, arr2) { Array.prototype.push.apply(arr1, arr2); }; Util.prependToArray = function Util_prependToArray(arr1, arr2) { Array.prototype.unshift.apply(arr1, arr2); }; Util.extendObj = function extendObj(obj1, obj2) { for (var key in obj2) { obj1[key] = obj2[key]; } }; Util.getInheritableProperty = function Util_getInheritableProperty(dict, name) { while (dict && !dict.has(name)) { dict = dict.get('Parent'); } if (!dict) { return null; } return dict.get(name); }; Util.inherit = function Util_inherit(sub, base, prototype) { sub.prototype = Object.create(base.prototype); sub.prototype.constructor = sub; for (var prop in prototype) { sub.prototype[prop] = prototype[prop]; } }; Util.loadScript = function Util_loadScript(src, callback) { var script = document.createElement('script'); var loaded = false; script.setAttribute('src', src); if (callback) { script.onload = function() { if (!loaded) { callback(); } loaded = true; }; } document.getElementsByTagName('head')[0].appendChild(script); }; return Util; })(); /** * PDF page viewport created based on scale, rotation and offset. * @class * @alias PageViewport */ var PageViewport = (function PageViewportClosure() { /** * @constructor * @private * @param viewBox {Array} xMin, yMin, xMax and yMax coordinates. * @param scale {number} scale of the viewport. * @param rotation {number} rotations of the viewport in degrees. * @param offsetX {number} offset X * @param offsetY {number} offset Y * @param dontFlip {boolean} if true, axis Y will not be flipped. */ function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) { this.viewBox = viewBox; this.scale = scale; this.rotation = rotation; this.offsetX = offsetX; this.offsetY = offsetY; // creating transform to convert pdf coordinate system to the normal // canvas like coordinates taking in account scale and rotation var centerX = (viewBox[2] + viewBox[0]) / 2; var centerY = (viewBox[3] + viewBox[1]) / 2; var rotateA, rotateB, rotateC, rotateD; rotation = rotation % 360; rotation = rotation < 0 ? rotation + 360 : rotation; switch (rotation) { case 180: rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1; break; case 90: rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0; break; case 270: rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0; break; //case 0: default: rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1; break; } if (dontFlip) { rotateC = -rotateC; rotateD = -rotateD; } var offsetCanvasX, offsetCanvasY; var width, height; if (rotateA === 0) { offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; width = Math.abs(viewBox[3] - viewBox[1]) * scale; height = Math.abs(viewBox[2] - viewBox[0]) * scale; } else { offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; width = Math.abs(viewBox[2] - viewBox[0]) * scale; height = Math.abs(viewBox[3] - viewBox[1]) * scale; } // creating transform for the following operations: // translate(-centerX, -centerY), rotate and flip vertically, // scale, and translate(offsetCanvasX, offsetCanvasY) this.transform = [ rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY ]; this.width = width; this.height = height; this.fontScale = scale; } PageViewport.prototype = /** @lends PageViewport.prototype */ { /** * Clones viewport with additional properties. * @param args {Object} (optional) If specified, may contain the 'scale' or * 'rotation' properties to override the corresponding properties in * the cloned viewport. * @returns {PageViewport} Cloned viewport. */ clone: function PageViewPort_clone(args) { args = args || {}; var scale = 'scale' in args ? args.scale : this.scale; var rotation = 'rotation' in args ? args.rotation : this.rotation; return new PageViewport(this.viewBox.slice(), scale, rotation, this.offsetX, this.offsetY, args.dontFlip); }, /** * Converts PDF point to the viewport coordinates. For examples, useful for * converting PDF location into canvas pixel coordinates. * @param x {number} X coordinate. * @param y {number} Y coordinate. * @returns {Object} Object that contains 'x' and 'y' properties of the * point in the viewport coordinate space. * @see {@link convertToPdfPoint} * @see {@link convertToViewportRectangle} */ convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) { return Util.applyTransform([x, y], this.transform); }, /** * Converts PDF rectangle to the viewport coordinates. * @param rect {Array} xMin, yMin, xMax and yMax coordinates. * @returns {Array} Contains corresponding coordinates of the rectangle * in the viewport coordinate space. * @see {@link convertToViewportPoint} */ convertToViewportRectangle: function PageViewport_convertToViewportRectangle(rect) { var tl = Util.applyTransform([rect[0], rect[1]], this.transform); var br = Util.applyTransform([rect[2], rect[3]], this.transform); return [tl[0], tl[1], br[0], br[1]]; }, /** * Converts viewport coordinates to the PDF location. For examples, useful * for converting canvas pixel location into PDF one. * @param x {number} X coordinate. * @param y {number} Y coordinate. * @returns {Object} Object that contains 'x' and 'y' properties of the * point in the PDF coordinate space. * @see {@link convertToViewportPoint} */ convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) { return Util.applyInverseTransform([x, y], this.transform); } }; return PageViewport; })(); var PDFStringTranslateTable = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC ]; function stringToPDFString(str) { var i, n = str.length, strBuf = []; if (str[0] === '\xFE' && str[1] === '\xFF') { // UTF16BE BOM for (i = 2; i < n; i += 2) { strBuf.push(String.fromCharCode( (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1))); } } else { for (i = 0; i < n; ++i) { var code = PDFStringTranslateTable[str.charCodeAt(i)]; strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); } } return strBuf.join(''); } function stringToUTF8String(str) { return decodeURIComponent(escape(str)); } function utf8StringToString(str) { return unescape(encodeURIComponent(str)); } function isEmptyObj(obj) { for (var key in obj) { return false; } return true; } function isBool(v) { return typeof v === 'boolean'; } function isInt(v) { return typeof v === 'number' && ((v | 0) === v); } function isNum(v) { return typeof v === 'number'; } function isString(v) { return typeof v === 'string'; } function isArray(v) { return v instanceof Array; } function isArrayBuffer(v) { return typeof v === 'object' && v !== null && v.byteLength !== undefined; } /** * Promise Capability object. * * @typedef {Object} PromiseCapability * @property {Promise} promise - A promise object. * @property {function} resolve - Fullfills the promise. * @property {function} reject - Rejects the promise. */ /** * Creates a promise capability object. * @alias createPromiseCapability * * @return {PromiseCapability} A capability object contains: * - a Promise, resolve and reject methods. */ function createPromiseCapability() { var capability = {}; capability.promise = new Promise(function (resolve, reject) { capability.resolve = resolve; capability.reject = reject; }); return capability; } /** * Polyfill for Promises: * The following promise implementation tries to generally implement the * Promise/A+ spec. Some notable differences from other promise libaries are: * - There currently isn't a seperate deferred and promise object. * - Unhandled rejections eventually show an error if they aren't handled. * * Based off of the work in: * https://bugzilla.mozilla.org/show_bug.cgi?id=810490 */ (function PromiseClosure() { if (globalScope.Promise) { // Promises existing in the DOM/Worker, checking presence of all/resolve if (typeof globalScope.Promise.all !== 'function') { globalScope.Promise.all = function (iterable) { var count = 0, results = [], resolve, reject; var promise = new globalScope.Promise(function (resolve_, reject_) { resolve = resolve_; reject = reject_; }); iterable.forEach(function (p, i) { count++; p.then(function (result) { results[i] = result; count--; if (count === 0) { resolve(results); } }, reject); }); if (count === 0) { resolve(results); } return promise; }; } if (typeof globalScope.Promise.resolve !== 'function') { globalScope.Promise.resolve = function (value) { return new globalScope.Promise(function (resolve) { resolve(value); }); }; } if (typeof globalScope.Promise.reject !== 'function') { globalScope.Promise.reject = function (reason) { return new globalScope.Promise(function (resolve, reject) { reject(reason); }); }; } if (typeof globalScope.Promise.prototype.catch !== 'function') { globalScope.Promise.prototype.catch = function (onReject) { return globalScope.Promise.prototype.then(undefined, onReject); }; } return; } var STATUS_PENDING = 0; var STATUS_RESOLVED = 1; var STATUS_REJECTED = 2; // In an attempt to avoid silent exceptions, unhandled rejections are // tracked and if they aren't handled in a certain amount of time an // error is logged. var REJECTION_TIMEOUT = 500; var HandlerManager = { handlers: [], running: false, unhandledRejections: [], pendingRejectionCheck: false, scheduleHandlers: function scheduleHandlers(promise) { if (promise._status === STATUS_PENDING) { return; } this.handlers = this.handlers.concat(promise._handlers); promise._handlers = []; if (this.running) { return; } this.running = true; setTimeout(this.runHandlers.bind(this), 0); }, runHandlers: function runHandlers() { var RUN_TIMEOUT = 1; // ms var timeoutAt = Date.now() + RUN_TIMEOUT; while (this.handlers.length > 0) { var handler = this.handlers.shift(); var nextStatus = handler.thisPromise._status; var nextValue = handler.thisPromise._value; try { if (nextStatus === STATUS_RESOLVED) { if (typeof handler.onResolve === 'function') { nextValue = handler.onResolve(nextValue); } } else if (typeof handler.onReject === 'function') { nextValue = handler.onReject(nextValue); nextStatus = STATUS_RESOLVED; if (handler.thisPromise._unhandledRejection) { this.removeUnhandeledRejection(handler.thisPromise); } } } catch (ex) { nextStatus = STATUS_REJECTED; nextValue = ex; } handler.nextPromise._updateStatus(nextStatus, nextValue); if (Date.now() >= timeoutAt) { break; } } if (this.handlers.length > 0) { setTimeout(this.runHandlers.bind(this), 0); return; } this.running = false; }, addUnhandledRejection: function addUnhandledRejection(promise) { this.unhandledRejections.push({ promise: promise, time: Date.now() }); this.scheduleRejectionCheck(); }, removeUnhandeledRejection: function removeUnhandeledRejection(promise) { promise._unhandledRejection = false; for (var i = 0; i < this.unhandledRejections.length; i++) { if (this.unhandledRejections[i].promise === promise) { this.unhandledRejections.splice(i); i--; } } }, scheduleRejectionCheck: function scheduleRejectionCheck() { if (this.pendingRejectionCheck) { return; } this.pendingRejectionCheck = true; setTimeout(function rejectionCheck() { this.pendingRejectionCheck = false; var now = Date.now(); for (var i = 0; i < this.unhandledRejections.length; i++) { if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) { var unhandled = this.unhandledRejections[i].promise._value; var msg = 'Unhandled rejection: ' + unhandled; if (unhandled.stack) { msg += '\n' + unhandled.stack; } warn(msg); this.unhandledRejections.splice(i); i--; } } if (this.unhandledRejections.length) { this.scheduleRejectionCheck(); } }.bind(this), REJECTION_TIMEOUT); } }; function Promise(resolver) { this._status = STATUS_PENDING; this._handlers = []; try { resolver.call(this, this._resolve.bind(this), this._reject.bind(this)); } catch (e) { this._reject(e); } } /** * Builds a promise that is resolved when all the passed in promises are * resolved. * @param {array} array of data and/or promises to wait for. * @return {Promise} New dependant promise. */ Promise.all = function Promise_all(promises) { var resolveAll, rejectAll; var deferred = new Promise(function (resolve, reject) { resolveAll = resolve; rejectAll = reject; }); var unresolved = promises.length; var results = []; if (unresolved === 0) { resolveAll(results); return deferred; } function reject(reason) { if (deferred._status === STATUS_REJECTED) { return; } results = []; rejectAll(reason); } for (var i = 0, ii = promises.length; i < ii; ++i) { var promise = promises[i]; var resolve = (function(i) { return function(value) { if (deferred._status === STATUS_REJECTED) { return; } results[i] = value; unresolved--; if (unresolved === 0) { resolveAll(results); } }; })(i); if (Promise.isPromise(promise)) { promise.then(resolve, reject); } else { resolve(promise); } } return deferred; }; /** * Checks if the value is likely a promise (has a 'then' function). * @return {boolean} true if value is thenable */ Promise.isPromise = function Promise_isPromise(value) { return value && typeof value.then === 'function'; }; /** * Creates resolved promise * @param value resolve value * @returns {Promise} */ Promise.resolve = function Promise_resolve(value) { return new Promise(function (resolve) { resolve(value); }); }; /** * Creates rejected promise * @param reason rejection value * @returns {Promise} */ Promise.reject = function Promise_reject(reason) { return new Promise(function (resolve, reject) { reject(reason); }); }; Promise.prototype = { _status: null, _value: null, _handlers: null, _unhandledRejection: null, _updateStatus: function Promise__updateStatus(status, value) { if (this._status === STATUS_RESOLVED || this._status === STATUS_REJECTED) { return; } if (status === STATUS_RESOLVED && Promise.isPromise(value)) { value.then(this._updateStatus.bind(this, STATUS_RESOLVED), this._updateStatus.bind(this, STATUS_REJECTED)); return; } this._status = status; this._value = value; if (status === STATUS_REJECTED && this._handlers.length === 0) { this._unhandledRejection = true; HandlerManager.addUnhandledRejection(this); } HandlerManager.scheduleHandlers(this); }, _resolve: function Promise_resolve(value) { this._updateStatus(STATUS_RESOLVED, value); }, _reject: function Promise_reject(reason) { this._updateStatus(STATUS_REJECTED, reason); }, then: function Promise_then(onResolve, onReject) { var nextPromise = new Promise(function (resolve, reject) { this.resolve = resolve; this.reject = reject; }); this._handlers.push({ thisPromise: this, onResolve: onResolve, onReject: onReject, nextPromise: nextPromise }); HandlerManager.scheduleHandlers(this); return nextPromise; }, catch: function Promise_catch(onReject) { return this.then(undefined, onReject); } }; globalScope.Promise = Promise; })(); var StatTimer = (function StatTimerClosure() { function rpad(str, pad, length) { while (str.length < length) { str += pad; } return str; } function StatTimer() { this.started = Object.create(null); this.times = []; this.enabled = true; } StatTimer.prototype = { time: function StatTimer_time(name) { if (!this.enabled) { return; } if (name in this.started) { warn('Timer is already running for ' + name); } this.started[name] = Date.now(); }, timeEnd: function StatTimer_timeEnd(name) { if (!this.enabled) { return; } if (!(name in this.started)) { warn('Timer has not been started for ' + name); } this.times.push({ 'name': name, 'start': this.started[name], 'end': Date.now() }); // Remove timer from started so it can be called again. delete this.started[name]; }, toString: function StatTimer_toString() { var i, ii; var times = this.times; var out = ''; // Find the longest name for padding purposes. var longest = 0; for (i = 0, ii = times.length; i < ii; ++i) { var name = times[i]['name']; if (name.length > longest) { longest = name.length; } } for (i = 0, ii = times.length; i < ii; ++i) { var span = times[i]; var duration = span.end - span.start; out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n'; } return out; } }; return StatTimer; })(); var createBlob = function createBlob(data, contentType) { if (typeof Blob !== 'undefined') { return new Blob([data], { type: contentType }); } // Blob builder is deprecated in FF14 and removed in FF18. var bb = new MozBlobBuilder(); bb.append(data); return bb.getBlob(contentType); }; var createObjectURL = (function createObjectURLClosure() { // Blob/createObjectURL is not available, falling back to data schema. var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; return function createObjectURL(data, contentType, forceDataSchema) { if (!forceDataSchema && typeof URL !== 'undefined' && URL.createObjectURL) { var blob = createBlob(data, contentType); return URL.createObjectURL(blob); } var buffer = 'data:' + contentType + ';base64,'; for (var i = 0, ii = data.length; i < ii; i += 3) { var b1 = data[i] & 0xFF; var b2 = data[i + 1] & 0xFF; var b3 = data[i + 2] & 0xFF; var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; var d4 = i + 2 < ii ? (b3 & 0x3F) : 64; buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4]; } return buffer; }; })(); function MessageHandler(sourceName, targetName, comObj) { this.sourceName = sourceName; this.targetName = targetName; this.comObj = comObj; this.callbackIndex = 1; this.postMessageTransfers = true; var callbacksCapabilities = this.callbacksCapabilities = Object.create(null); var ah = this.actionHandler = Object.create(null); this._onComObjOnMessage = function messageHandlerComObjOnMessage(event) { var data = event.data; if (data.targetName !== this.sourceName) { return; } if (data.isReply) { var callbackId = data.callbackId; if (data.callbackId in callbacksCapabilities) { var callback = callbacksCapabilities[callbackId]; delete callbacksCapabilities[callbackId]; if ('error' in data) { callback.reject(data.error); } else { callback.resolve(data.data); } } else { error('Cannot resolve callback ' + callbackId); } } else if (data.action in ah) { var action = ah[data.action]; if (data.callbackId) { var sourceName = this.sourceName; var targetName = data.sourceName; Promise.resolve().then(function () { return action[0].call(action[1], data.data); }).then(function (result) { comObj.postMessage({ sourceName: sourceName, targetName: targetName, isReply: true, callbackId: data.callbackId, data: result }); }, function (reason) { if (reason instanceof Error) { // Serialize error to avoid "DataCloneError" reason = reason + ''; } comObj.postMessage({ sourceName: sourceName, targetName: targetName, isReply: true, callbackId: data.callbackId, error: reason }); }); } else { action[0].call(action[1], data.data); } } else { error('Unknown action from worker: ' + data.action); } }.bind(this); comObj.addEventListener('message', this._onComObjOnMessage); } MessageHandler.prototype = { on: function messageHandlerOn(actionName, handler, scope) { var ah = this.actionHandler; if (ah[actionName]) { error('There is already an actionName called "' + actionName + '"'); } ah[actionName] = [handler, scope]; }, /** * Sends a message to the comObj to invoke the action with the supplied data. * @param {String} actionName Action to call. * @param {JSON} data JSON data to send. * @param {Array} [transfers] Optional list of transfers/ArrayBuffers */ send: function messageHandlerSend(actionName, data, transfers) { var message = { sourceName: this.sourceName, targetName: this.targetName, action: actionName, data: data }; this.postMessage(message, transfers); }, /** * Sends a message to the comObj to invoke the action with the supplied data. * Expects that other side will callback with the response. * @param {String} actionName Action to call. * @param {JSON} data JSON data to send. * @param {Array} [transfers] Optional list of transfers/ArrayBuffers. * @returns {Promise} Promise to be resolved with response data. */ sendWithPromise: function messageHandlerSendWithPromise(actionName, data, transfers) { var callbackId = this.callbackIndex++; var message = { sourceName: this.sourceName, targetName: this.targetName, action: actionName, data: data, callbackId: callbackId }; var capability = createPromiseCapability(); this.callbacksCapabilities[callbackId] = capability; try { this.postMessage(message, transfers); } catch (e) { capability.reject(e); } return capability.promise; }, /** * Sends raw message to the comObj. * @private * @param message {Object} Raw message. * @param transfers List of transfers/ArrayBuffers, or undefined. */ postMessage: function (message, transfers) { if (transfers && this.postMessageTransfers) { this.comObj.postMessage(message, transfers); } else { this.comObj.postMessage(message); } }, destroy: function () { this.comObj.removeEventListener('message', this._onComObjOnMessage); } }; function loadJpegStream(id, imageUrl, objs) { var img = new Image(); img.onload = (function loadJpegStream_onloadClosure() { objs.resolve(id, img); }); img.onerror = (function loadJpegStream_onerrorClosure() { objs.resolve(id, null); warn('Error during JPEG image loading'); }); img.src = imageUrl; } // Polyfill from https://github.com/Polymer/URL /* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ (function checkURLConstructor(scope) { /* jshint ignore:start */ // feature detect for URL constructor var hasWorkingUrl = false; try { if (typeof URL === 'function' && typeof URL.prototype === 'object' && ('origin' in URL.prototype)) { var u = new URL('b', 'http://a'); u.pathname = 'c%20d'; hasWorkingUrl = u.href === 'http://a/c%20d'; } } catch(e) { } if (hasWorkingUrl) return; var relative = Object.create(null); relative['ftp'] = 21; relative['file'] = 0; relative['gopher'] = 70; relative['http'] = 80; relative['https'] = 443; relative['ws'] = 80; relative['wss'] = 443; var relativePathDotMapping = Object.create(null); relativePathDotMapping['%2e'] = '.'; relativePathDotMapping['.%2e'] = '..'; relativePathDotMapping['%2e.'] = '..'; relativePathDotMapping['%2e%2e'] = '..'; function isRelativeScheme(scheme) { return relative[scheme] !== undefined; } function invalid() { clear.call(this); this._isInvalid = true; } function IDNAToASCII(h) { if ('' == h) { invalid.call(this) } // XXX return h.toLowerCase() } function percentEscape(c) { var unicode = c.charCodeAt(0); if (unicode > 0x20 && unicode < 0x7F && // " # < > ? ` [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1 ) { return c; } return encodeURIComponent(c); } function percentEscapeQuery(c) { // XXX This actually needs to encode c using encoding and then // convert the bytes one-by-one. var unicode = c.charCodeAt(0); if (unicode > 0x20 && unicode < 0x7F && // " # < > ` (do not escape '?') [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1 ) { return c; } return encodeURIComponent(c); } var EOF = undefined, ALPHA = /[a-zA-Z]/, ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/; function parse(input, stateOverride, base) { function err(message) { errors.push(message) } var state = stateOverride || 'scheme start', cursor = 0, buffer = '', seenAt = false, seenBracket = false, errors = []; loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) { var c = input[cursor]; switch (state) { case 'scheme start': if (c && ALPHA.test(c)) { buffer += c.toLowerCase(); // ASCII-safe state = 'scheme'; } else if (!stateOverride) { buffer = ''; state = 'no scheme'; continue; } else { err('Invalid scheme.'); break loop; } break; case 'scheme': if (c && ALPHANUMERIC.test(c)) { buffer += c.toLowerCase(); // ASCII-safe } else if (':' == c) { this._scheme = buffer; buffer = ''; if (stateOverride) { break loop; } if (isRelativeScheme(this._scheme)) { this._isRelative = true; } if ('file' == this._scheme) { state = 'relative'; } else if (this._isRelative && base && base._scheme == this._scheme) { state = 'relative or authority'; } else if (this._isRelative) { state = 'authority first slash'; } else { state = 'scheme data'; } } else if (!stateOverride) { buffer = ''; cursor = 0; state = 'no scheme'; continue; } else if (EOF == c) { break loop; } else { err('Code point not allowed in scheme: ' + c) break loop; } break; case 'scheme data': if ('?' == c) { this._query = '?'; state = 'query'; } else if ('#' == c) { this._fragment = '#'; state = 'fragment'; } else { // XXX error handling if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { this._schemeData += percentEscape(c); } } break; case 'no scheme': if (!base || !(isRelativeScheme(base._scheme))) { err('Missing scheme.'); invalid.call(this); } else { state = 'relative'; continue; } break; case 'relative or authority': if ('/' == c && '/' == input[cursor+1]) { state = 'authority ignore slashes'; } else { err('Expected /, got: ' + c); state = 'relative'; continue } break; case 'relative': this._isRelative = true; if ('file' != this._scheme) this._scheme = base._scheme; if (EOF == c) { this._host = base._host; this._port = base._port; this._path = base._path.slice(); this._query = base._query; this._username = base._username; this._password = base._password; break loop; } else if ('/' == c || '\\' == c) { if ('\\' == c) err('\\ is an invalid code point.'); state = 'relative slash'; } else if ('?' == c) { this._host = base._host; this._port = base._port; this._path = base._path.slice(); this._query = '?'; this._username = base._username; this._password = base._password; state = 'query'; } else if ('#' == c) { this._host = base._host; this._port = base._port; this._path = base._path.slice(); this._query = base._query; this._fragment = '#'; this._username = base._username; this._password = base._password; state = 'fragment'; } else { var nextC = input[cursor+1] var nextNextC = input[cursor+2] if ( 'file' != this._scheme || !ALPHA.test(c) || (nextC != ':' && nextC != '|') || (EOF != nextNextC && '/' != nextNextC && '\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) { this._host = base._host; this._port = base._port; this._username = base._username; this._password = base._password; this._path = base._path.slice(); this._path.pop(); } state = 'relative path'; continue; } break; case 'relative slash': if ('/' == c || '\\' == c) { if ('\\' == c) { err('\\ is an invalid code point.'); } if ('file' == this._scheme) { state = 'file host'; } else { state = 'authority ignore slashes'; } } else { if ('file' != this._scheme) { this._host = base._host; this._port = base._port; this._username = base._username; this._password = base._password; } state = 'relative path'; continue; } break; case 'authority first slash': if ('/' == c) { state = 'authority second slash'; } else { err("Expected '/', got: " + c); state = 'authority ignore slashes'; continue; } break; case 'authority second slash': state = 'authority ignore slashes'; if ('/' != c) { err("Expected '/', got: " + c); continue; } break; case 'authority ignore slashes': if ('/' != c && '\\' != c) { state = 'authority'; continue; } else { err('Expected authority, got: ' + c); } break; case 'authority': if ('@' == c) { if (seenAt) { err('@ already seen.'); buffer += '%40'; } seenAt = true; for (var i = 0; i < buffer.length; i++) { var cp = buffer[i]; if ('\t' == cp || '\n' == cp || '\r' == cp) { err('Invalid whitespace in authority.'); continue; } // XXX check URL code points if (':' == cp && null === this._password) { this._password = ''; continue; } var tempC = percentEscape(cp); (null !== this._password) ? this._password += tempC : this._username += tempC; } buffer = ''; } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { cursor -= buffer.length; buffer = ''; state = 'host'; continue; } else { buffer += c; } break; case 'file host': if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) { state = 'relative path'; } else if (buffer.length == 0) { state = 'relative path start'; } else { this._host = IDNAToASCII.call(this, buffer); buffer = ''; state = 'relative path start'; } continue; } else if ('\t' == c || '\n' == c || '\r' == c) { err('Invalid whitespace in file host.'); } else { buffer += c; } break; case 'host': case 'hostname': if (':' == c && !seenBracket) { // XXX host parsing this._host = IDNAToASCII.call(this, buffer); buffer = ''; state = 'port'; if ('hostname' == stateOverride) { break loop; } } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { this._host = IDNAToASCII.call(this, buffer); buffer = ''; state = 'relative path start'; if (stateOverride) { break loop; } continue; } else if ('\t' != c && '\n' != c && '\r' != c) { if ('[' == c) { seenBracket = true; } else if (']' == c) { seenBracket = false; } buffer += c; } else { err('Invalid code point in host/hostname: ' + c); } break; case 'port': if (/[0-9]/.test(c)) { buffer += c; } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c || stateOverride) { if ('' != buffer) { var temp = parseInt(buffer, 10); if (temp != relative[this._scheme]) { this._port = temp + ''; } buffer = ''; } if (stateOverride) { break loop; } state = 'relative path start'; continue; } else if ('\t' == c || '\n' == c || '\r' == c) { err('Invalid code point in port: ' + c); } else { invalid.call(this); } break; case 'relative path start': if ('\\' == c) err("'\\' not allowed in path."); state = 'relative path'; if ('/' != c && '\\' != c) { continue; } break; case 'relative path': if (EOF == c || '/' == c || '\\' == c || (!stateOverride && ('?' == c || '#' == c))) { if ('\\' == c) { err('\\ not allowed in relative path.'); } var tmp; if (tmp = relativePathDotMapping[buffer.toLowerCase()]) { buffer = tmp; } if ('..' == buffer) { this._path.pop(); if ('/' != c && '\\' != c) { this._path.push(''); } } else if ('.' == buffer && '/' != c && '\\' != c) { this._path.push(''); } else if ('.' != buffer) { if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') { buffer = buffer[0] + ':'; } this._path.push(buffer); } buffer = ''; if ('?' == c) { this._query = '?'; state = 'query'; } else if ('#' == c) { this._fragment = '#'; state = 'fragment'; } } else if ('\t' != c && '\n' != c && '\r' != c) { buffer += percentEscape(c); } break; case 'query': if (!stateOverride && '#' == c) { this._fragment = '#'; state = 'fragment'; } else if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { this._query += percentEscapeQuery(c); } break; case 'fragment': if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { this._fragment += c; } break; } cursor++; } } function clear() { this._scheme = ''; this._schemeData = ''; this._username = ''; this._password = null; this._host = ''; this._port = ''; this._path = []; this._query = ''; this._fragment = ''; this._isInvalid = false; this._isRelative = false; } // Does not process domain names or IP addresses. // Does not handle encoding for the query parameter. function jURL(url, base /* , encoding */) { if (base !== undefined && !(base instanceof jURL)) base = new jURL(String(base)); this._url = url; clear.call(this); var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, ''); // encoding = encoding || 'utf-8' parse.call(this, input, null, base); } jURL.prototype = { toString: function() { return this.href; }, get href() { if (this._isInvalid) return this._url; var authority = ''; if ('' != this._username || null != this._password) { authority = this._username + (null != this._password ? ':' + this._password : '') + '@'; } return this.protocol + (this._isRelative ? '//' + authority + this.host : '') + this.pathname + this._query + this._fragment; }, set href(href) { clear.call(this); parse.call(this, href); }, get protocol() { return this._scheme + ':'; }, set protocol(protocol) { if (this._isInvalid) return; parse.call(this, protocol + ':', 'scheme start'); }, get host() { return this._isInvalid ? '' : this._port ? this._host + ':' + this._port : this._host; }, set host(host) { if (this._isInvalid || !this._isRelative) return; parse.call(this, host, 'host'); }, get hostname() { return this._host; }, set hostname(hostname) { if (this._isInvalid || !this._isRelative) return; parse.call(this, hostname, 'hostname'); }, get port() { return this._port; }, set port(port) { if (this._isInvalid || !this._isRelative) return; parse.call(this, port, 'port'); }, get pathname() { return this._isInvalid ? '' : this._isRelative ? '/' + this._path.join('/') : this._schemeData; }, set pathname(pathname) { if (this._isInvalid || !this._isRelative) return; this._path = []; parse.call(this, pathname, 'relative path start'); }, get search() { return this._isInvalid || !this._query || '?' == this._query ? '' : this._query; }, set search(search) { if (this._isInvalid || !this._isRelative) return; this._query = '?'; if ('?' == search[0]) search = search.slice(1); parse.call(this, search, 'query'); }, get hash() { return this._isInvalid || !this._fragment || '#' == this._fragment ? '' : this._fragment; }, set hash(hash) { if (this._isInvalid) return; this._fragment = '#'; if ('#' == hash[0]) hash = hash.slice(1); parse.call(this, hash, 'fragment'); }, get origin() { var host; if (this._isInvalid || !this._scheme) { return ''; } // javascript: Gecko returns String(""), WebKit/Blink String("null") // Gecko throws error for "data://" // data: Gecko returns "", Blink returns "data://", WebKit returns "null" // Gecko returns String("") for file: mailto: // WebKit/Blink returns String("SCHEME://") for file: mailto: switch (this._scheme) { case 'data': case 'file': case 'javascript': case 'mailto': return 'null'; } host = this.host; if (!host) { return ''; } return this._scheme + '://' + host; } }; // Copy over the static methods var OriginalURL = scope.URL; if (OriginalURL) { jURL.createObjectURL = function(blob) { // IE extension allows a second optional options argument. // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx return OriginalURL.createObjectURL.apply(OriginalURL, arguments); }; jURL.revokeObjectURL = function(url) { OriginalURL.revokeObjectURL(url); }; } scope.URL = jURL; /* jshint ignore:end */ })(globalScope); exports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX; exports.IDENTITY_MATRIX = IDENTITY_MATRIX; exports.OPS = OPS; exports.VERBOSITY_LEVELS = VERBOSITY_LEVELS; exports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES; exports.AnnotationBorderStyleType = AnnotationBorderStyleType; exports.AnnotationFlag = AnnotationFlag; exports.AnnotationType = AnnotationType; exports.FontType = FontType; exports.ImageKind = ImageKind; exports.InvalidPDFException = InvalidPDFException; exports.MessageHandler = MessageHandler; exports.MissingDataException = MissingDataException; exports.MissingPDFException = MissingPDFException; exports.NotImplementedException = NotImplementedException; exports.PageViewport = PageViewport; exports.PasswordException = PasswordException; exports.PasswordResponses = PasswordResponses; exports.StatTimer = StatTimer; exports.StreamType = StreamType; exports.TextRenderingMode = TextRenderingMode; exports.UnexpectedResponseException = UnexpectedResponseException; exports.UnknownErrorException = UnknownErrorException; exports.Util = Util; exports.XRefParseException = XRefParseException; exports.arrayByteLength = arrayByteLength; exports.arraysToBytes = arraysToBytes; exports.assert = assert; exports.bytesToString = bytesToString; exports.combineUrl = combineUrl; exports.createBlob = createBlob; exports.createPromiseCapability = createPromiseCapability; exports.createObjectURL = createObjectURL; exports.deprecated = deprecated; exports.error = error; exports.getLookupTableFactory = getLookupTableFactory; exports.getVerbosityLevel = getVerbosityLevel; exports.globalScope = globalScope; exports.info = info; exports.isArray = isArray; exports.isArrayBuffer = isArrayBuffer; exports.isBool = isBool; exports.isEmptyObj = isEmptyObj; exports.isInt = isInt; exports.isNum = isNum; exports.isString = isString; exports.isSameOrigin = isSameOrigin; exports.isValidUrl = isValidUrl; exports.isLittleEndian = isLittleEndian; exports.isEvalSupported = isEvalSupported; exports.loadJpegStream = loadJpegStream; exports.log2 = log2; exports.readInt8 = readInt8; exports.readUint16 = readUint16; exports.readUint32 = readUint32; exports.removeNullCharacters = removeNullCharacters; exports.setVerbosityLevel = setVerbosityLevel; exports.shadow = shadow; exports.string32 = string32; exports.stringToBytes = stringToBytes; exports.stringToPDFString = stringToPDFString; exports.stringToUTF8String = stringToUTF8String; exports.utf8StringToString = utf8StringToString; exports.warn = warn; })); (function (root, factory) { { factory((root.pdfjsCoreCFFParser = {}), root.pdfjsSharedUtil, root.pdfjsCoreCharsets, root.pdfjsCoreEncodings); } }(this, function (exports, sharedUtil, coreCharsets, coreEncodings) { var error = sharedUtil.error; var info = sharedUtil.info; var bytesToString = sharedUtil.bytesToString; var warn = sharedUtil.warn; var isArray = sharedUtil.isArray; var Util = sharedUtil.Util; var stringToBytes = sharedUtil.stringToBytes; var assert = sharedUtil.assert; var ISOAdobeCharset = coreCharsets.ISOAdobeCharset; var ExpertCharset = coreCharsets.ExpertCharset; var ExpertSubsetCharset = coreCharsets.ExpertSubsetCharset; var StandardEncoding = coreEncodings.StandardEncoding; var ExpertEncoding = coreEncodings.ExpertEncoding; // Maximum subroutine call depth of type 2 chartrings. Matches OTS. var MAX_SUBR_NESTING = 10; /** * The CFF class takes a Type1 file and wrap it into a * 'Compact Font Format' which itself embed Type2 charstrings. */ var CFFStandardStrings = [ '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003', 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold' ]; var CFFParser = (function CFFParserClosure() { var CharstringValidationData = [ null, { id: 'hstem', min: 2, stackClearing: true, stem: true }, null, { id: 'vstem', min: 2, stackClearing: true, stem: true }, { id: 'vmoveto', min: 1, stackClearing: true }, { id: 'rlineto', min: 2, resetStack: true }, { id: 'hlineto', min: 1, resetStack: true }, { id: 'vlineto', min: 1, resetStack: true }, { id: 'rrcurveto', min: 6, resetStack: true }, null, { id: 'callsubr', min: 1, undefStack: true }, { id: 'return', min: 0, undefStack: true }, null, // 12 null, { id: 'endchar', min: 0, stackClearing: true }, null, null, null, { id: 'hstemhm', min: 2, stackClearing: true, stem: true }, { id: 'hintmask', min: 0, stackClearing: true }, { id: 'cntrmask', min: 0, stackClearing: true }, { id: 'rmoveto', min: 2, stackClearing: true }, { id: 'hmoveto', min: 1, stackClearing: true }, { id: 'vstemhm', min: 2, stackClearing: true, stem: true }, { id: 'rcurveline', min: 8, resetStack: true }, { id: 'rlinecurve', min: 8, resetStack: true }, { id: 'vvcurveto', min: 4, resetStack: true }, { id: 'hhcurveto', min: 4, resetStack: true }, null, // shortint { id: 'callgsubr', min: 1, undefStack: true }, { id: 'vhcurveto', min: 4, resetStack: true }, { id: 'hvcurveto', min: 4, resetStack: true } ]; var CharstringValidationData12 = [ null, null, null, { id: 'and', min: 2, stackDelta: -1 }, { id: 'or', min: 2, stackDelta: -1 }, { id: 'not', min: 1, stackDelta: 0 }, null, null, null, { id: 'abs', min: 1, stackDelta: 0 }, { id: 'add', min: 2, stackDelta: -1, stackFn: function stack_div(stack, index) { stack[index - 2] = stack[index - 2] + stack[index - 1]; } }, { id: 'sub', min: 2, stackDelta: -1, stackFn: function stack_div(stack, index) { stack[index - 2] = stack[index - 2] - stack[index - 1]; } }, { id: 'div', min: 2, stackDelta: -1, stackFn: function stack_div(stack, index) { stack[index - 2] = stack[index - 2] / stack[index - 1]; } }, null, { id: 'neg', min: 1, stackDelta: 0, stackFn: function stack_div(stack, index) { stack[index - 1] = -stack[index - 1]; } }, { id: 'eq', min: 2, stackDelta: -1 }, null, null, { id: 'drop', min: 1, stackDelta: -1 }, null, { id: 'put', min: 2, stackDelta: -2 }, { id: 'get', min: 1, stackDelta: 0 }, { id: 'ifelse', min: 4, stackDelta: -3 }, { id: 'random', min: 0, stackDelta: 1 }, { id: 'mul', min: 2, stackDelta: -1, stackFn: function stack_div(stack, index) { stack[index - 2] = stack[index - 2] * stack[index - 1]; } }, null, { id: 'sqrt', min: 1, stackDelta: 0 }, { id: 'dup', min: 1, stackDelta: 1 }, { id: 'exch', min: 2, stackDelta: 0 }, { id: 'index', min: 2, stackDelta: 0 }, { id: 'roll', min: 3, stackDelta: -2 }, null, null, null, { id: 'hflex', min: 7, resetStack: true }, { id: 'flex', min: 13, resetStack: true }, { id: 'hflex1', min: 9, resetStack: true }, { id: 'flex1', min: 11, resetStack: true } ]; function CFFParser(file, properties, seacAnalysisEnabled) { this.bytes = file.getBytes(); this.properties = properties; this.seacAnalysisEnabled = !!seacAnalysisEnabled; } CFFParser.prototype = { parse: function CFFParser_parse() { var properties = this.properties; var cff = new CFF(); this.cff = cff; // The first five sections must be in order, all the others are reached // via offsets contained in one of the below. var header = this.parseHeader(); var nameIndex = this.parseIndex(header.endPos); var topDictIndex = this.parseIndex(nameIndex.endPos); var stringIndex = this.parseIndex(topDictIndex.endPos); var globalSubrIndex = this.parseIndex(stringIndex.endPos); var topDictParsed = this.parseDict(topDictIndex.obj.get(0)); var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings); cff.header = header.obj; cff.names = this.parseNameIndex(nameIndex.obj); cff.strings = this.parseStringIndex(stringIndex.obj); cff.topDict = topDict; cff.globalSubrIndex = globalSubrIndex.obj; this.parsePrivateDict(cff.topDict); cff.isCIDFont = topDict.hasName('ROS'); var charStringOffset = topDict.getByName('CharStrings'); var charStringIndex = this.parseIndex(charStringOffset).obj; var fontMatrix = topDict.getByName('FontMatrix'); if (fontMatrix) { properties.fontMatrix = fontMatrix; } var fontBBox = topDict.getByName('FontBBox'); if (fontBBox) { // adjusting ascent/descent properties.ascent = fontBBox[3]; properties.descent = fontBBox[1]; properties.ascentScaled = true; } var charset, encoding; if (cff.isCIDFont) { var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj; for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) { var dictRaw = fdArrayIndex.get(i); var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), cff.strings); this.parsePrivateDict(fontDict); cff.fdArray.push(fontDict); } // cid fonts don't have an encoding encoding = null; charset = this.parseCharsets(topDict.getByName('charset'), charStringIndex.count, cff.strings, true); cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'), charStringIndex.count); } else { charset = this.parseCharsets(topDict.getByName('charset'), charStringIndex.count, cff.strings, false); encoding = this.parseEncoding(topDict.getByName('Encoding'), properties, cff.strings, charset.charset); } cff.charset = charset; cff.encoding = encoding; var charStringsAndSeacs = this.parseCharStrings( charStringIndex, topDict.privateDict.subrsIndex, globalSubrIndex.obj, cff.fdSelect, cff.fdArray); cff.charStrings = charStringsAndSeacs.charStrings; cff.seacs = charStringsAndSeacs.seacs; cff.widths = charStringsAndSeacs.widths; return cff; }, parseHeader: function CFFParser_parseHeader() { var bytes = this.bytes; var bytesLength = bytes.length; var offset = 0; // Prevent an infinite loop, by checking that the offset is within the // bounds of the bytes array. Necessary in empty, or invalid, font files. while (offset < bytesLength && bytes[offset] !== 1) { ++offset; } if (offset >= bytesLength) { error('Invalid CFF header'); } else if (offset !== 0) { info('cff data is shifted'); bytes = bytes.subarray(offset); this.bytes = bytes; } var major = bytes[0]; var minor = bytes[1]; var hdrSize = bytes[2]; var offSize = bytes[3]; var header = new CFFHeader(major, minor, hdrSize, offSize); return { obj: header, endPos: hdrSize }; }, parseDict: function CFFParser_parseDict(dict) { var pos = 0; function parseOperand() { var value = dict[pos++]; if (value === 30) { return parseFloatOperand(pos); } else if (value === 28) { value = dict[pos++]; value = ((value << 24) | (dict[pos++] << 16)) >> 16; return value; } else if (value === 29) { value = dict[pos++]; value = (value << 8) | dict[pos++]; value = (value << 8) | dict[pos++]; value = (value << 8) | dict[pos++]; return value; } else if (value >= 32 && value <= 246) { return value - 139; } else if (value >= 247 && value <= 250) { return ((value - 247) * 256) + dict[pos++] + 108; } else if (value >= 251 && value <= 254) { return -((value - 251) * 256) - dict[pos++] - 108; } else { error('255 is not a valid DICT command'); } return -1; } function parseFloatOperand() { var str = ''; var eof = 15; var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', 'E', 'E-', null, '-']; var length = dict.length; while (pos < length) { var b = dict[pos++]; var b1 = b >> 4; var b2 = b & 15; if (b1 === eof) { break; } str += lookup[b1]; if (b2 === eof) { break; } str += lookup[b2]; } return parseFloat(str); } var operands = []; var entries = []; pos = 0; var end = dict.length; while (pos < end) { var b = dict[pos]; if (b <= 21) { if (b === 12) { b = (b << 8) | dict[++pos]; } entries.push([b, operands]); operands = []; ++pos; } else { operands.push(parseOperand()); } } return entries; }, parseIndex: function CFFParser_parseIndex(pos) { var cffIndex = new CFFIndex(); var bytes = this.bytes; var count = (bytes[pos++] << 8) | bytes[pos++]; var offsets = []; var end = pos; var i, ii; if (count !== 0) { var offsetSize = bytes[pos++]; // add 1 for offset to determine size of last object var startPos = pos + ((count + 1) * offsetSize) - 1; for (i = 0, ii = count + 1; i < ii; ++i) { var offset = 0; for (var j = 0; j < offsetSize; ++j) { offset <<= 8; offset += bytes[pos++]; } offsets.push(startPos + offset); } end = offsets[count]; } for (i = 0, ii = offsets.length - 1; i < ii; ++i) { var offsetStart = offsets[i]; var offsetEnd = offsets[i + 1]; cffIndex.add(bytes.subarray(offsetStart, offsetEnd)); } return {obj: cffIndex, endPos: end}; }, parseNameIndex: function CFFParser_parseNameIndex(index) { var names = []; for (var i = 0, ii = index.count; i < ii; ++i) { var name = index.get(i); // OTS doesn't allow names to be over 127 characters. var length = Math.min(name.length, 127); var data = []; // OTS also only permits certain characters in the name. for (var j = 0; j < length; ++j) { var c = name[j]; if (j === 0 && c === 0) { data[j] = c; continue; } if ((c < 33 || c > 126) || c === 91 /* [ */ || c === 93 /* ] */ || c === 40 /* ( */ || c === 41 /* ) */ || c === 123 /* { */ || c === 125 /* } */ || c === 60 /* < */ || c === 62 /* > */ || c === 47 /* / */ || c === 37 /* % */ || c === 35 /* # */) { data[j] = 95; continue; } data[j] = c; } names.push(bytesToString(data)); } return names; }, parseStringIndex: function CFFParser_parseStringIndex(index) { var strings = new CFFStrings(); for (var i = 0, ii = index.count; i < ii; ++i) { var data = index.get(i); strings.add(bytesToString(data)); } return strings; }, createDict: function CFFParser_createDict(Type, dict, strings) { var cffDict = new Type(strings); for (var i = 0, ii = dict.length; i < ii; ++i) { var pair = dict[i]; var key = pair[0]; var value = pair[1]; cffDict.setByKey(key, value); } return cffDict; }, parseCharString: function CFFParser_parseCharString(state, data, localSubrIndex, globalSubrIndex) { if (state.callDepth > MAX_SUBR_NESTING) { return false; } var stackSize = state.stackSize; var stack = state.stack; var length = data.length; for (var j = 0; j < length;) { var value = data[j++]; var validationCommand = null; if (value === 12) { var q = data[j++]; if (q === 0) { // The CFF specification state that the 'dotsection' command // (12, 0) is deprecated and treated as a no-op, but all Type2 // charstrings processors should support them. Unfortunately // the font sanitizer don't. As a workaround the sequence (12, 0) // is replaced by a useless (0, hmoveto). data[j - 2] = 139; data[j - 1] = 22; stackSize = 0; } else { validationCommand = CharstringValidationData12[q]; } } else if (value === 28) { // number (16 bit) stack[stackSize] = ((data[j] << 24) | (data[j + 1] << 16)) >> 16; j += 2; stackSize++; } else if (value === 14) { if (stackSize >= 4) { stackSize -= 4; if (this.seacAnalysisEnabled) { state.seac = stack.slice(stackSize, stackSize + 4); return false; } } validationCommand = CharstringValidationData[value]; } else if (value >= 32 && value <= 246) { // number stack[stackSize] = value - 139; stackSize++; } else if (value >= 247 && value <= 254) { // number (+1 bytes) stack[stackSize] = (value < 251 ? ((value - 247) << 8) + data[j] + 108 : -((value - 251) << 8) - data[j] - 108); j++; stackSize++; } else if (value === 255) { // number (32 bit) stack[stackSize] = ((data[j] << 24) | (data[j + 1] << 16) | (data[j + 2] << 8) | data[j + 3]) / 65536; j += 4; stackSize++; } else if (value === 19 || value === 20) { state.hints += stackSize >> 1; // skipping right amount of hints flag data j += (state.hints + 7) >> 3; stackSize %= 2; validationCommand = CharstringValidationData[value]; } else if (value === 10 || value === 29) { var subrsIndex; if (value === 10) { subrsIndex = localSubrIndex; } else { subrsIndex = globalSubrIndex; } if (!subrsIndex) { validationCommand = CharstringValidationData[value]; warn('Missing subrsIndex for ' + validationCommand.id); return false; } var bias = 32768; if (subrsIndex.count < 1240) { bias = 107; } else if (subrsIndex.count < 33900) { bias = 1131; } var subrNumber = stack[--stackSize] + bias; if (subrNumber < 0 || subrNumber >= subrsIndex.count) { validationCommand = CharstringValidationData[value]; warn('Out of bounds subrIndex for ' + validationCommand.id); return false; } state.stackSize = stackSize; state.callDepth++; var valid = this.parseCharString(state, subrsIndex.get(subrNumber), localSubrIndex, globalSubrIndex); if (!valid) { return false; } state.callDepth--; stackSize = state.stackSize; continue; } else if (value === 11) { state.stackSize = stackSize; return true; } else { validationCommand = CharstringValidationData[value]; } if (validationCommand) { if (validationCommand.stem) { state.hints += stackSize >> 1; } if ('min' in validationCommand) { if (!state.undefStack && stackSize < validationCommand.min) { warn('Not enough parameters for ' + validationCommand.id + '; actual: ' + stackSize + ', expected: ' + validationCommand.min); return false; } } if (state.firstStackClearing && validationCommand.stackClearing) { state.firstStackClearing = false; // the optional character width can be found before the first // stack-clearing command arguments stackSize -= validationCommand.min; if (stackSize >= 2 && validationCommand.stem) { // there are even amount of arguments for stem commands stackSize %= 2; } else if (stackSize > 1) { warn('Found too many parameters for stack-clearing command'); } if (stackSize > 0 && stack[stackSize - 1] >= 0) { state.width = stack[stackSize - 1]; } } if ('stackDelta' in validationCommand) { if ('stackFn' in validationCommand) { validationCommand.stackFn(stack, stackSize); } stackSize += validationCommand.stackDelta; } else if (validationCommand.stackClearing) { stackSize = 0; } else if (validationCommand.resetStack) { stackSize = 0; state.undefStack = false; } else if (validationCommand.undefStack) { stackSize = 0; state.undefStack = true; state.firstStackClearing = false; } } } state.stackSize = stackSize; return true; }, parseCharStrings: function CFFParser_parseCharStrings(charStrings, localSubrIndex, globalSubrIndex, fdSelect, fdArray) { var seacs = []; var widths = []; var count = charStrings.count; for (var i = 0; i < count; i++) { var charstring = charStrings.get(i); var state = { callDepth: 0, stackSize: 0, stack: [], undefStack: true, hints: 0, firstStackClearing: true, seac: null, width: null }; var valid = true; var localSubrToUse = null; if (fdSelect && fdArray.length) { var fdIndex = fdSelect.getFDIndex(i); if (fdIndex === -1) { warn('Glyph index is not in fd select.'); valid = false; } if (fdIndex >= fdArray.length) { warn('Invalid fd index for glyph index.'); valid = false; } if (valid) { localSubrToUse = fdArray[fdIndex].privateDict.subrsIndex; } } else if (localSubrIndex) { localSubrToUse = localSubrIndex; } if (valid) { valid = this.parseCharString(state, charstring, localSubrToUse, globalSubrIndex); } if (state.width !== null) { widths[i] = state.width; } if (state.seac !== null) { seacs[i] = state.seac; } if (!valid) { // resetting invalid charstring to single 'endchar' charStrings.set(i, new Uint8Array([14])); } } return { charStrings: charStrings, seacs: seacs, widths: widths }; }, emptyPrivateDictionary: function CFFParser_emptyPrivateDictionary(parentDict) { var privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings); parentDict.setByKey(18, [0, 0]); parentDict.privateDict = privateDict; }, parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) { // no private dict, do nothing if (!parentDict.hasName('Private')) { this.emptyPrivateDictionary(parentDict); return; } var privateOffset = parentDict.getByName('Private'); // make sure the params are formatted correctly if (!isArray(privateOffset) || privateOffset.length !== 2) { parentDict.removeByName('Private'); return; } var size = privateOffset[0]; var offset = privateOffset[1]; // remove empty dicts or ones that refer to invalid location if (size === 0 || offset >= this.bytes.length) { this.emptyPrivateDictionary(parentDict); return; } var privateDictEnd = offset + size; var dictData = this.bytes.subarray(offset, privateDictEnd); var dict = this.parseDict(dictData); var privateDict = this.createDict(CFFPrivateDict, dict, parentDict.strings); parentDict.privateDict = privateDict; // Parse the Subrs index also since it's relative to the private dict. if (!privateDict.getByName('Subrs')) { return; } var subrsOffset = privateDict.getByName('Subrs'); var relativeOffset = offset + subrsOffset; // Validate the offset. if (subrsOffset === 0 || relativeOffset >= this.bytes.length) { this.emptyPrivateDictionary(parentDict); return; } var subrsIndex = this.parseIndex(relativeOffset); privateDict.subrsIndex = subrsIndex.obj; }, parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) { if (pos === 0) { return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, ISOAdobeCharset); } else if (pos === 1) { return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, ExpertCharset); } else if (pos === 2) { return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, ExpertSubsetCharset); } var bytes = this.bytes; var start = pos; var format = bytes[pos++]; var charset = ['.notdef']; var id, count, i; // subtract 1 for the .notdef glyph length -= 1; switch (format) { case 0: for (i = 0; i < length; i++) { id = (bytes[pos++] << 8) | bytes[pos++]; charset.push(cid ? id : strings.get(id)); } break; case 1: while (charset.length <= length) { id = (bytes[pos++] << 8) | bytes[pos++]; count = bytes[pos++]; for (i = 0; i <= count; i++) { charset.push(cid ? id++ : strings.get(id++)); } } break; case 2: while (charset.length <= length) { id = (bytes[pos++] << 8) | bytes[pos++]; count = (bytes[pos++] << 8) | bytes[pos++]; for (i = 0; i <= count; i++) { charset.push(cid ? id++ : strings.get(id++)); } } break; default: error('Unknown charset format'); } // Raw won't be needed if we actually compile the charset. var end = pos; var raw = bytes.subarray(start, end); return new CFFCharset(false, format, charset, raw); }, parseEncoding: function CFFParser_parseEncoding(pos, properties, strings, charset) { var encoding = Object.create(null); var bytes = this.bytes; var predefined = false; var hasSupplement = false; var format, i, ii; var raw = null; function readSupplement() { var supplementsCount = bytes[pos++]; for (i = 0; i < supplementsCount; i++) { var code = bytes[pos++]; var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff); encoding[code] = charset.indexOf(strings.get(sid)); } } if (pos === 0 || pos === 1) { predefined = true; format = pos; var baseEncoding = pos ? ExpertEncoding : StandardEncoding; for (i = 0, ii = charset.length; i < ii; i++) { var index = baseEncoding.indexOf(charset[i]); if (index !== -1) { encoding[index] = i; } } } else { var dataStart = pos; format = bytes[pos++]; switch (format & 0x7f) { case 0: var glyphsCount = bytes[pos++]; for (i = 1; i <= glyphsCount; i++) { encoding[bytes[pos++]] = i; } break; case 1: var rangesCount = bytes[pos++]; var gid = 1; for (i = 0; i < rangesCount; i++) { var start = bytes[pos++]; var left = bytes[pos++]; for (var j = start; j <= start + left; j++) { encoding[j] = gid++; } } break; default: error('Unknow encoding format: ' + format + ' in CFF'); break; } var dataEnd = pos; if (format & 0x80) { // The font sanitizer does not support CFF encoding with a // supplement, since the encoding is not really used to map // between gid to glyph, let's overwrite what is declared in // the top dictionary to let the sanitizer think the font use // StandardEncoding, that's a lie but that's ok. bytes[dataStart] &= 0x7f; readSupplement(); hasSupplement = true; } raw = bytes.subarray(dataStart, dataEnd); } format = format & 0x7f; return new CFFEncoding(predefined, format, encoding, raw); }, parseFDSelect: function CFFParser_parseFDSelect(pos, length) { var start = pos; var bytes = this.bytes; var format = bytes[pos++]; var fdSelect = []; var i; switch (format) { case 0: for (i = 0; i < length; ++i) { var id = bytes[pos++]; fdSelect.push(id); } break; case 3: var rangesCount = (bytes[pos++] << 8) | bytes[pos++]; for (i = 0; i < rangesCount; ++i) { var first = (bytes[pos++] << 8) | bytes[pos++]; var fdIndex = bytes[pos++]; var next = (bytes[pos] << 8) | bytes[pos + 1]; for (var j = first; j < next; ++j) { fdSelect.push(fdIndex); } } // Advance past the sentinel(next). pos += 2; break; default: error('Unknown fdselect format ' + format); break; } var end = pos; return new CFFFDSelect(fdSelect, bytes.subarray(start, end)); } }; return CFFParser; })(); // Compact Font Format var CFF = (function CFFClosure() { function CFF() { this.header = null; this.names = []; this.topDict = null; this.strings = new CFFStrings(); this.globalSubrIndex = null; // The following could really be per font, but since we only have one font // store them here. this.encoding = null; this.charset = null; this.charStrings = null; this.fdArray = []; this.fdSelect = null; this.isCIDFont = false; } return CFF; })(); var CFFHeader = (function CFFHeaderClosure() { function CFFHeader(major, minor, hdrSize, offSize) { this.major = major; this.minor = minor; this.hdrSize = hdrSize; this.offSize = offSize; } return CFFHeader; })(); var CFFStrings = (function CFFStringsClosure() { function CFFStrings() { this.strings = []; } CFFStrings.prototype = { get: function CFFStrings_get(index) { if (index >= 0 && index <= 390) { return CFFStandardStrings[index]; } if (index - 391 <= this.strings.length) { return this.strings[index - 391]; } return CFFStandardStrings[0]; }, add: function CFFStrings_add(value) { this.strings.push(value); }, get count() { return this.strings.length; } }; return CFFStrings; })(); var CFFIndex = (function CFFIndexClosure() { function CFFIndex() { this.objects = []; this.length = 0; } CFFIndex.prototype = { add: function CFFIndex_add(data) { this.length += data.length; this.objects.push(data); }, set: function CFFIndex_set(index, data) { this.length += data.length - this.objects[index].length; this.objects[index] = data; }, get: function CFFIndex_get(index) { return this.objects[index]; }, get count() { return this.objects.length; } }; return CFFIndex; })(); var CFFDict = (function CFFDictClosure() { function CFFDict(tables, strings) { this.keyToNameMap = tables.keyToNameMap; this.nameToKeyMap = tables.nameToKeyMap; this.defaults = tables.defaults; this.types = tables.types; this.opcodes = tables.opcodes; this.order = tables.order; this.strings = strings; this.values = Object.create(null); } CFFDict.prototype = { // value should always be an array setByKey: function CFFDict_setByKey(key, value) { if (!(key in this.keyToNameMap)) { return false; } // ignore empty values if (value.length === 0) { return true; } var type = this.types[key]; // remove the array wrapping these types of values if (type === 'num' || type === 'sid' || type === 'offset') { value = value[0]; } this.values[key] = value; return true; }, setByName: function CFFDict_setByName(name, value) { if (!(name in this.nameToKeyMap)) { error('Invalid dictionary name "' + name + '"'); } this.values[this.nameToKeyMap[name]] = value; }, hasName: function CFFDict_hasName(name) { return this.nameToKeyMap[name] in this.values; }, getByName: function CFFDict_getByName(name) { if (!(name in this.nameToKeyMap)) { error('Invalid dictionary name "' + name + '"'); } var key = this.nameToKeyMap[name]; if (!(key in this.values)) { return this.defaults[key]; } return this.values[key]; }, removeByName: function CFFDict_removeByName(name) { delete this.values[this.nameToKeyMap[name]]; } }; CFFDict.createTables = function CFFDict_createTables(layout) { var tables = { keyToNameMap: {}, nameToKeyMap: {}, defaults: {}, types: {}, opcodes: {}, order: [] }; for (var i = 0, ii = layout.length; i < ii; ++i) { var entry = layout[i]; var key = isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0]; tables.keyToNameMap[key] = entry[1]; tables.nameToKeyMap[entry[1]] = key; tables.types[key] = entry[2]; tables.defaults[key] = entry[3]; tables.opcodes[key] = isArray(entry[0]) ? entry[0] : [entry[0]]; tables.order.push(key); } return tables; }; return CFFDict; })(); var CFFTopDict = (function CFFTopDictClosure() { var layout = [ [[12, 30], 'ROS', ['sid', 'sid', 'num'], null], [[12, 20], 'SyntheticBase', 'num', null], [0, 'version', 'sid', null], [1, 'Notice', 'sid', null], [[12, 0], 'Copyright', 'sid', null], [2, 'FullName', 'sid', null], [3, 'FamilyName', 'sid', null], [4, 'Weight', 'sid', null], [[12, 1], 'isFixedPitch', 'num', 0], [[12, 2], 'ItalicAngle', 'num', 0], [[12, 3], 'UnderlinePosition', 'num', -100], [[12, 4], 'UnderlineThickness', 'num', 50], [[12, 5], 'PaintType', 'num', 0], [[12, 6], 'CharstringType', 'num', 2], [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'], [0.001, 0, 0, 0.001, 0, 0]], [13, 'UniqueID', 'num', null], [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]], [[12, 8], 'StrokeWidth', 'num', 0], [14, 'XUID', 'array', null], [15, 'charset', 'offset', 0], [16, 'Encoding', 'offset', 0], [17, 'CharStrings', 'offset', 0], [18, 'Private', ['offset', 'offset'], null], [[12, 21], 'PostScript', 'sid', null], [[12, 22], 'BaseFontName', 'sid', null], [[12, 23], 'BaseFontBlend', 'delta', null], [[12, 31], 'CIDFontVersion', 'num', 0], [[12, 32], 'CIDFontRevision', 'num', 0], [[12, 33], 'CIDFontType', 'num', 0], [[12, 34], 'CIDCount', 'num', 8720], [[12, 35], 'UIDBase', 'num', null], // XXX: CID Fonts on DirectWrite 6.1 only seem to work if FDSelect comes // before FDArray. [[12, 37], 'FDSelect', 'offset', null], [[12, 36], 'FDArray', 'offset', null], [[12, 38], 'FontName', 'sid', null] ]; var tables = null; function CFFTopDict(strings) { if (tables === null) { tables = CFFDict.createTables(layout); } CFFDict.call(this, tables, strings); this.privateDict = null; } CFFTopDict.prototype = Object.create(CFFDict.prototype); return CFFTopDict; })(); var CFFPrivateDict = (function CFFPrivateDictClosure() { var layout = [ [6, 'BlueValues', 'delta', null], [7, 'OtherBlues', 'delta', null], [8, 'FamilyBlues', 'delta', null], [9, 'FamilyOtherBlues', 'delta', null], [[12, 9], 'BlueScale', 'num', 0.039625], [[12, 10], 'BlueShift', 'num', 7], [[12, 11], 'BlueFuzz', 'num', 1], [10, 'StdHW', 'num', null], [11, 'StdVW', 'num', null], [[12, 12], 'StemSnapH', 'delta', null], [[12, 13], 'StemSnapV', 'delta', null], [[12, 14], 'ForceBold', 'num', 0], [[12, 17], 'LanguageGroup', 'num', 0], [[12, 18], 'ExpansionFactor', 'num', 0.06], [[12, 19], 'initialRandomSeed', 'num', 0], [20, 'defaultWidthX', 'num', 0], [21, 'nominalWidthX', 'num', 0], [19, 'Subrs', 'offset', null] ]; var tables = null; function CFFPrivateDict(strings) { if (tables === null) { tables = CFFDict.createTables(layout); } CFFDict.call(this, tables, strings); this.subrsIndex = null; } CFFPrivateDict.prototype = Object.create(CFFDict.prototype); return CFFPrivateDict; })(); var CFFCharsetPredefinedTypes = { ISO_ADOBE: 0, EXPERT: 1, EXPERT_SUBSET: 2 }; var CFFCharset = (function CFFCharsetClosure() { function CFFCharset(predefined, format, charset, raw) { this.predefined = predefined; this.format = format; this.charset = charset; this.raw = raw; } return CFFCharset; })(); var CFFEncoding = (function CFFEncodingClosure() { function CFFEncoding(predefined, format, encoding, raw) { this.predefined = predefined; this.format = format; this.encoding = encoding; this.raw = raw; } return CFFEncoding; })(); var CFFFDSelect = (function CFFFDSelectClosure() { function CFFFDSelect(fdSelect, raw) { this.fdSelect = fdSelect; this.raw = raw; } CFFFDSelect.prototype = { getFDIndex: function CFFFDSelect_get(glyphIndex) { if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) { return -1; } return this.fdSelect[glyphIndex]; } }; return CFFFDSelect; })(); // Helper class to keep track of where an offset is within the data and helps // filling in that offset once it's known. var CFFOffsetTracker = (function CFFOffsetTrackerClosure() { function CFFOffsetTracker() { this.offsets = Object.create(null); } CFFOffsetTracker.prototype = { isTracking: function CFFOffsetTracker_isTracking(key) { return key in this.offsets; }, track: function CFFOffsetTracker_track(key, location) { if (key in this.offsets) { error('Already tracking location of ' + key); } this.offsets[key] = location; }, offset: function CFFOffsetTracker_offset(value) { for (var key in this.offsets) { this.offsets[key] += value; } }, setEntryLocation: function CFFOffsetTracker_setEntryLocation(key, values, output) { if (!(key in this.offsets)) { error('Not tracking location of ' + key); } var data = output.data; var dataOffset = this.offsets[key]; var size = 5; for (var i = 0, ii = values.length; i < ii; ++i) { var offset0 = i * size + dataOffset; var offset1 = offset0 + 1; var offset2 = offset0 + 2; var offset3 = offset0 + 3; var offset4 = offset0 + 4; // It's easy to screw up offsets so perform this sanity check. if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) { error('writing to an offset that is not empty'); } var value = values[i]; data[offset0] = 0x1d; data[offset1] = (value >> 24) & 0xFF; data[offset2] = (value >> 16) & 0xFF; data[offset3] = (value >> 8) & 0xFF; data[offset4] = value & 0xFF; } } }; return CFFOffsetTracker; })(); // Takes a CFF and converts it to the binary representation. var CFFCompiler = (function CFFCompilerClosure() { function CFFCompiler(cff) { this.cff = cff; } CFFCompiler.prototype = { compile: function CFFCompiler_compile() { var cff = this.cff; var output = { data: [], length: 0, add: function CFFCompiler_add(data) { this.data = this.data.concat(data); this.length = this.data.length; } }; // Compile the five entries that must be in order. var header = this.compileHeader(cff.header); output.add(header); var nameIndex = this.compileNameIndex(cff.names); output.add(nameIndex); if (cff.isCIDFont) { // The spec is unclear on how font matrices should relate to each other // when there is one in the main top dict and the sub top dicts. // Windows handles this differently than linux and osx so we have to // normalize to work on all. // Rules based off of some mailing list discussions: // - If main font has a matrix and subfont doesn't, use the main matrix. // - If no main font matrix and there is a subfont matrix, use the // subfont matrix. // - If both have matrices, concat together. // - If neither have matrices, use default. // To make this work on all platforms we move the top matrix into each // sub top dict and concat if necessary. if (cff.topDict.hasName('FontMatrix')) { var base = cff.topDict.getByName('FontMatrix'); cff.topDict.removeByName('FontMatrix'); for (var i = 0, ii = cff.fdArray.length; i < ii; i++) { var subDict = cff.fdArray[i]; var matrix = base.slice(0); if (subDict.hasName('FontMatrix')) { matrix = Util.transform(matrix, subDict.getByName('FontMatrix')); } subDict.setByName('FontMatrix', matrix); } } } var compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont); output.add(compiled.output); var topDictTracker = compiled.trackers[0]; var stringIndex = this.compileStringIndex(cff.strings.strings); output.add(stringIndex); var globalSubrIndex = this.compileIndex(cff.globalSubrIndex); output.add(globalSubrIndex); // Now start on the other entries that have no specfic order. if (cff.encoding && cff.topDict.hasName('Encoding')) { if (cff.encoding.predefined) { topDictTracker.setEntryLocation('Encoding', [cff.encoding.format], output); } else { var encoding = this.compileEncoding(cff.encoding); topDictTracker.setEntryLocation('Encoding', [output.length], output); output.add(encoding); } } if (cff.charset && cff.topDict.hasName('charset')) { if (cff.charset.predefined) { topDictTracker.setEntryLocation('charset', [cff.charset.format], output); } else { var charset = this.compileCharset(cff.charset); topDictTracker.setEntryLocation('charset', [output.length], output); output.add(charset); } } var charStrings = this.compileCharStrings(cff.charStrings); topDictTracker.setEntryLocation('CharStrings', [output.length], output); output.add(charStrings); if (cff.isCIDFont) { // For some reason FDSelect must be in front of FDArray on windows. OSX // and linux don't seem to care. topDictTracker.setEntryLocation('FDSelect', [output.length], output); var fdSelect = this.compileFDSelect(cff.fdSelect.raw); output.add(fdSelect); // It is unclear if the sub font dictionary can have CID related // dictionary keys, but the sanitizer doesn't like them so remove them. compiled = this.compileTopDicts(cff.fdArray, output.length, true); topDictTracker.setEntryLocation('FDArray', [output.length], output); output.add(compiled.output); var fontDictTrackers = compiled.trackers; this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output); } this.compilePrivateDicts([cff.topDict], [topDictTracker], output); // If the font data ends with INDEX whose object data is zero-length, // the sanitizer will bail out. Add a dummy byte to avoid that. output.add([0]); return output.data; }, encodeNumber: function CFFCompiler_encodeNumber(value) { if (parseFloat(value) === parseInt(value, 10) && !isNaN(value)) { // isInt return this.encodeInteger(value); } else { return this.encodeFloat(value); } }, encodeFloat: function CFFCompiler_encodeFloat(num) { var value = num.toString(); // rounding inaccurate doubles var m = /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(value); if (m) { var epsilon = parseFloat('1e' + ((m[2] ? +m[2] : 0) + m[1].length)); value = (Math.round(num * epsilon) / epsilon).toString(); } var nibbles = ''; var i, ii; for (i = 0, ii = value.length; i < ii; ++i) { var a = value[i]; if (a === 'e') { nibbles += value[++i] === '-' ? 'c' : 'b'; } else if (a === '.') { nibbles += 'a'; } else if (a === '-') { nibbles += 'e'; } else { nibbles += a; } } nibbles += (nibbles.length & 1) ? 'f' : 'ff'; var out = [30]; for (i = 0, ii = nibbles.length; i < ii; i += 2) { out.push(parseInt(nibbles.substr(i, 2), 16)); } return out; }, encodeInteger: function CFFCompiler_encodeInteger(value) { var code; if (value >= -107 && value <= 107) { code = [value + 139]; } else if (value >= 108 && value <= 1131) { value = [value - 108]; code = [(value >> 8) + 247, value & 0xFF]; } else if (value >= -1131 && value <= -108) { value = -value - 108; code = [(value >> 8) + 251, value & 0xFF]; } else if (value >= -32768 && value <= 32767) { code = [0x1c, (value >> 8) & 0xFF, value & 0xFF]; } else { code = [0x1d, (value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF]; } return code; }, compileHeader: function CFFCompiler_compileHeader(header) { return [ header.major, header.minor, header.hdrSize, header.offSize ]; }, compileNameIndex: function CFFCompiler_compileNameIndex(names) { var nameIndex = new CFFIndex(); for (var i = 0, ii = names.length; i < ii; ++i) { nameIndex.add(stringToBytes(names[i])); } return this.compileIndex(nameIndex); }, compileTopDicts: function CFFCompiler_compileTopDicts(dicts, length, removeCidKeys) { var fontDictTrackers = []; var fdArrayIndex = new CFFIndex(); for (var i = 0, ii = dicts.length; i < ii; ++i) { var fontDict = dicts[i]; if (removeCidKeys) { fontDict.removeByName('CIDFontVersion'); fontDict.removeByName('CIDFontRevision'); fontDict.removeByName('CIDFontType'); fontDict.removeByName('CIDCount'); fontDict.removeByName('UIDBase'); } var fontDictTracker = new CFFOffsetTracker(); var fontDictData = this.compileDict(fontDict, fontDictTracker); fontDictTrackers.push(fontDictTracker); fdArrayIndex.add(fontDictData); fontDictTracker.offset(length); } fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers); return { trackers: fontDictTrackers, output: fdArrayIndex }; }, compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts, trackers, output) { for (var i = 0, ii = dicts.length; i < ii; ++i) { var fontDict = dicts[i]; assert(fontDict.privateDict && fontDict.hasName('Private'), 'There must be an private dictionary.'); var privateDict = fontDict.privateDict; var privateDictTracker = new CFFOffsetTracker(); var privateDictData = this.compileDict(privateDict, privateDictTracker); var outputLength = output.length; privateDictTracker.offset(outputLength); if (!privateDictData.length) { // The private dictionary was empty, set the output length to zero to // ensure the offset length isn't out of bounds in the eyes of the // sanitizer. outputLength = 0; } trackers[i].setEntryLocation('Private', [privateDictData.length, outputLength], output); output.add(privateDictData); if (privateDict.subrsIndex && privateDict.hasName('Subrs')) { var subrs = this.compileIndex(privateDict.subrsIndex); privateDictTracker.setEntryLocation('Subrs', [privateDictData.length], output); output.add(subrs); } } }, compileDict: function CFFCompiler_compileDict(dict, offsetTracker) { var out = []; // The dictionary keys must be in a certain order. var order = dict.order; for (var i = 0; i < order.length; ++i) { var key = order[i]; if (!(key in dict.values)) { continue; } var values = dict.values[key]; var types = dict.types[key]; if (!isArray(types)) { types = [types]; } if (!isArray(values)) { values = [values]; } // Remove any empty dict values. if (values.length === 0) { continue; } for (var j = 0, jj = types.length; j < jj; ++j) { var type = types[j]; var value = values[j]; switch (type) { case 'num': case 'sid': out = out.concat(this.encodeNumber(value)); break; case 'offset': // For offsets we just insert a 32bit integer so we don't have to // deal with figuring out the length of the offset when it gets // replaced later on by the compiler. var name = dict.keyToNameMap[key]; // Some offsets have the offset and the length, so just record the // position of the first one. if (!offsetTracker.isTracking(name)) { offsetTracker.track(name, out.length); } out = out.concat([0x1d, 0, 0, 0, 0]); break; case 'array': case 'delta': out = out.concat(this.encodeNumber(value)); for (var k = 1, kk = values.length; k < kk; ++k) { out = out.concat(this.encodeNumber(values[k])); } break; default: error('Unknown data type of ' + type); break; } } out = out.concat(dict.opcodes[key]); } return out; }, compileStringIndex: function CFFCompiler_compileStringIndex(strings) { var stringIndex = new CFFIndex(); for (var i = 0, ii = strings.length; i < ii; ++i) { stringIndex.add(stringToBytes(strings[i])); } return this.compileIndex(stringIndex); }, compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() { var globalSubrIndex = this.cff.globalSubrIndex; this.out.writeByteArray(this.compileIndex(globalSubrIndex)); }, compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) { return this.compileIndex(charStrings); }, compileCharset: function CFFCompiler_compileCharset(charset) { return this.compileTypedArray(charset.raw); }, compileEncoding: function CFFCompiler_compileEncoding(encoding) { return this.compileTypedArray(encoding.raw); }, compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) { return this.compileTypedArray(fdSelect); }, compileTypedArray: function CFFCompiler_compileTypedArray(data) { var out = []; for (var i = 0, ii = data.length; i < ii; ++i) { out[i] = data[i]; } return out; }, compileIndex: function CFFCompiler_compileIndex(index, trackers) { trackers = trackers || []; var objects = index.objects; // First 2 bytes contains the number of objects contained into this index var count = objects.length; // If there is no object, just create an index. This technically // should just be [0, 0] but OTS has an issue with that. if (count === 0) { return [0, 0, 0]; } var data = [(count >> 8) & 0xFF, count & 0xff]; var lastOffset = 1, i; for (i = 0; i < count; ++i) { lastOffset += objects[i].length; } var offsetSize; if (lastOffset < 0x100) { offsetSize = 1; } else if (lastOffset < 0x10000) { offsetSize = 2; } else if (lastOffset < 0x1000000) { offsetSize = 3; } else { offsetSize = 4; } // Next byte contains the offset size use to reference object in the file data.push(offsetSize); // Add another offset after this one because we need a new offset var relativeOffset = 1; for (i = 0; i < count + 1; i++) { if (offsetSize === 1) { data.push(relativeOffset & 0xFF); } else if (offsetSize === 2) { data.push((relativeOffset >> 8) & 0xFF, relativeOffset & 0xFF); } else if (offsetSize === 3) { data.push((relativeOffset >> 16) & 0xFF, (relativeOffset >> 8) & 0xFF, relativeOffset & 0xFF); } else { data.push((relativeOffset >>> 24) & 0xFF, (relativeOffset >> 16) & 0xFF, (relativeOffset >> 8) & 0xFF, relativeOffset & 0xFF); } if (objects[i]) { relativeOffset += objects[i].length; } } for (i = 0; i < count; i++) { // Notify the tracker where the object will be offset in the data. if (trackers[i]) { trackers[i].offset(data.length); } for (var j = 0, jj = objects[i].length; j < jj; j++) { data.push(objects[i][j]); } } return data; } }; return CFFCompiler; })(); exports.CFFStandardStrings = CFFStandardStrings; exports.CFFParser = CFFParser; exports.CFF = CFF; exports.CFFHeader = CFFHeader; exports.CFFStrings = CFFStrings; exports.CFFIndex = CFFIndex; exports.CFFCharset = CFFCharset; exports.CFFTopDict = CFFTopDict; exports.CFFPrivateDict = CFFPrivateDict; exports.CFFCompiler = CFFCompiler; })); (function (root, factory) { { factory((root.pdfjsCoreChunkedStream = {}), root.pdfjsSharedUtil); } }(this, function (exports, sharedUtil) { var MissingDataException = sharedUtil.MissingDataException; var arrayByteLength = sharedUtil.arrayByteLength; var arraysToBytes = sharedUtil.arraysToBytes; var assert = sharedUtil.assert; var createPromiseCapability = sharedUtil.createPromiseCapability; var isInt = sharedUtil.isInt; var isEmptyObj = sharedUtil.isEmptyObj; var ChunkedStream = (function ChunkedStreamClosure() { function ChunkedStream(length, chunkSize, manager) { this.bytes = new Uint8Array(length); this.start = 0; this.pos = 0; this.end = length; this.chunkSize = chunkSize; this.loadedChunks = []; this.numChunksLoaded = 0; this.numChunks = Math.ceil(length / chunkSize); this.manager = manager; this.progressiveDataLength = 0; this.lastSuccessfulEnsureByteChunk = -1; // a single-entry cache } // required methods for a stream. if a particular stream does not // implement these, an error should be thrown ChunkedStream.prototype = { getMissingChunks: function ChunkedStream_getMissingChunks() { var chunks = []; for (var chunk = 0, n = this.numChunks; chunk < n; ++chunk) { if (!this.loadedChunks[chunk]) { chunks.push(chunk); } } return chunks; }, getBaseStreams: function ChunkedStream_getBaseStreams() { return [this]; }, allChunksLoaded: function ChunkedStream_allChunksLoaded() { return this.numChunksLoaded === this.numChunks; }, onReceiveData: function ChunkedStream_onReceiveData(begin, chunk) { var end = begin + chunk.byteLength; assert(begin % this.chunkSize === 0, 'Bad begin offset: ' + begin); // Using this.length is inaccurate here since this.start can be moved // See ChunkedStream.moveStart() var length = this.bytes.length; assert(end % this.chunkSize === 0 || end === length, 'Bad end offset: ' + end); this.bytes.set(new Uint8Array(chunk), begin); var chunkSize = this.chunkSize; var beginChunk = Math.floor(begin / chunkSize); var endChunk = Math.floor((end - 1) / chunkSize) + 1; var curChunk; for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) { if (!this.loadedChunks[curChunk]) { this.loadedChunks[curChunk] = true; ++this.numChunksLoaded; } } }, onReceiveProgressiveData: function ChunkedStream_onReceiveProgressiveData(data) { var position = this.progressiveDataLength; var beginChunk = Math.floor(position / this.chunkSize); this.bytes.set(new Uint8Array(data), position); position += data.byteLength; this.progressiveDataLength = position; var endChunk = position >= this.end ? this.numChunks : Math.floor(position / this.chunkSize); var curChunk; for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) { if (!this.loadedChunks[curChunk]) { this.loadedChunks[curChunk] = true; ++this.numChunksLoaded; } } }, ensureByte: function ChunkedStream_ensureByte(pos) { var chunk = Math.floor(pos / this.chunkSize); if (chunk === this.lastSuccessfulEnsureByteChunk) { return; } if (!this.loadedChunks[chunk]) { throw new MissingDataException(pos, pos + 1); } this.lastSuccessfulEnsureByteChunk = chunk; }, ensureRange: function ChunkedStream_ensureRange(begin, end) { if (begin >= end) { return; } if (end <= this.progressiveDataLength) { return; } var chunkSize = this.chunkSize; var beginChunk = Math.floor(begin / chunkSize); var endChunk = Math.floor((end - 1) / chunkSize) + 1; for (var chunk = beginChunk; chunk < endChunk; ++chunk) { if (!this.loadedChunks[chunk]) { throw new MissingDataException(begin, end); } } }, nextEmptyChunk: function ChunkedStream_nextEmptyChunk(beginChunk) { var chunk, numChunks = this.numChunks; for (var i = 0; i < numChunks; ++i) { chunk = (beginChunk + i) % numChunks; // Wrap around to beginning if (!this.loadedChunks[chunk]) { return chunk; } } return null; }, hasChunk: function ChunkedStream_hasChunk(chunk) { return !!this.loadedChunks[chunk]; }, get length() { return this.end - this.start; }, get isEmpty() { return this.length === 0; }, getByte: function ChunkedStream_getByte() { var pos = this.pos; if (pos >= this.end) { return -1; } this.ensureByte(pos); return this.bytes[this.pos++]; }, getUint16: function ChunkedStream_getUint16() { var b0 = this.getByte(); var b1 = this.getByte(); if (b0 === -1 || b1 === -1) { return -1; } return (b0 << 8) + b1; }, getInt32: function ChunkedStream_getInt32() { var b0 = this.getByte(); var b1 = this.getByte(); var b2 = this.getByte(); var b3 = this.getByte(); return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; }, // returns subarray of original buffer // should only be read getBytes: function ChunkedStream_getBytes(length) { var bytes = this.bytes; var pos = this.pos; var strEnd = this.end; if (!length) { this.ensureRange(pos, strEnd); return bytes.subarray(pos, strEnd); } var end = pos + length; if (end > strEnd) { end = strEnd; } this.ensureRange(pos, end); this.pos = end; return bytes.subarray(pos, end); }, peekByte: function ChunkedStream_peekByte() { var peekedByte = this.getByte(); this.pos--; return peekedByte; }, peekBytes: function ChunkedStream_peekBytes(length) { var bytes = this.getBytes(length); this.pos -= bytes.length; return bytes; }, getByteRange: function ChunkedStream_getBytes(begin, end) { this.ensureRange(begin, end); return this.bytes.subarray(begin, end); }, skip: function ChunkedStream_skip(n) { if (!n) { n = 1; } this.pos += n; }, reset: function ChunkedStream_reset() { this.pos = this.start; }, moveStart: function ChunkedStream_moveStart() { this.start = this.pos; }, makeSubStream: function ChunkedStream_makeSubStream(start, length, dict) { this.ensureRange(start, start + length); function ChunkedStreamSubstream() {} ChunkedStreamSubstream.prototype = Object.create(this); ChunkedStreamSubstream.prototype.getMissingChunks = function() { var chunkSize = this.chunkSize; var beginChunk = Math.floor(this.start / chunkSize); var endChunk = Math.floor((this.end - 1) / chunkSize) + 1; var missingChunks = []; for (var chunk = beginChunk; chunk < endChunk; ++chunk) { if (!this.loadedChunks[chunk]) { missingChunks.push(chunk); } } return missingChunks; }; var subStream = new ChunkedStreamSubstream(); subStream.pos = subStream.start = start; subStream.end = start + length || this.end; subStream.dict = dict; return subStream; }, isStream: true }; return ChunkedStream; })(); var ChunkedStreamManager = (function ChunkedStreamManagerClosure() { function ChunkedStreamManager(pdfNetworkStream, args) { var chunkSize = args.rangeChunkSize; var length = args.length; this.stream = new ChunkedStream(length, chunkSize, this); this.length = length; this.chunkSize = chunkSize; this.pdfNetworkStream = pdfNetworkStream; this.url = args.url; this.disableAutoFetch = args.disableAutoFetch; this.msgHandler = args.msgHandler; this.currRequestId = 0; this.chunksNeededByRequest = Object.create(null); this.requestsByChunk = Object.create(null); this.promisesByRequest = Object.create(null); this.progressiveDataLength = 0; this.aborted = false; this._loadedStreamCapability = createPromiseCapability(); } ChunkedStreamManager.prototype = { onLoadedStream: function ChunkedStreamManager_getLoadedStream() { return this._loadedStreamCapability.promise; }, sendRequest: function ChunkedStreamManager_sendRequest(begin, end) { var rangeReader = this.pdfNetworkStream.getRangeReader(begin, end); if (!rangeReader.isStreamingSupported) { rangeReader.onProgress = this.onProgress.bind(this); } var chunks = [], loaded = 0; var manager = this; var promise = new Promise(function (resolve, reject) { var readChunk = function (chunk) { try { if (!chunk.done) { var data = chunk.value; chunks.push(data); loaded += arrayByteLength(data); if (rangeReader.isStreamingSupported) { manager.onProgress({loaded: loaded}); } rangeReader.read().then(readChunk, reject); return; } var chunkData = arraysToBytes(chunks); chunks = null; resolve(chunkData); } catch (e) { reject(e); } }; rangeReader.read().then(readChunk, reject); }); promise.then(function (data) { if (this.aborted) { return; // ignoring any data after abort } this.onReceiveData({chunk: data, begin: begin}); }.bind(this)); // TODO check errors }, // Get all the chunks that are not yet loaded and groups them into // contiguous ranges to load in as few requests as possible requestAllChunks: function ChunkedStreamManager_requestAllChunks() { var missingChunks = this.stream.getMissingChunks(); this._requestChunks(missingChunks); return this._loadedStreamCapability.promise; }, _requestChunks: function ChunkedStreamManager_requestChunks(chunks) { var requestId = this.currRequestId++; var i, ii; var chunksNeeded = Object.create(null); this.chunksNeededByRequest[requestId] = chunksNeeded; for (i = 0, ii = chunks.length; i < ii; i++) { if (!this.stream.hasChunk(chunks[i])) { chunksNeeded[chunks[i]] = true; } } if (isEmptyObj(chunksNeeded)) { return Promise.resolve(); } var capability = createPromiseCapability(); this.promisesByRequest[requestId] = capability; var chunksToRequest = []; for (var chunk in chunksNeeded) { chunk = chunk | 0; if (!(chunk in this.requestsByChunk)) { this.requestsByChunk[chunk] = []; chunksToRequest.push(chunk); } this.requestsByChunk[chunk].push(requestId); } if (!chunksToRequest.length) { return capability.promise; } var groupedChunksToRequest = this.groupChunks(chunksToRequest); for (i = 0; i < groupedChunksToRequest.length; ++i) { var groupedChunk = groupedChunksToRequest[i]; var begin = groupedChunk.beginChunk * this.chunkSize; var end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length); this.sendRequest(begin, end); } return capability.promise; }, getStream: function ChunkedStreamManager_getStream() { return this.stream; }, // Loads any chunks in the requested range that are not yet loaded requestRange: function ChunkedStreamManager_requestRange(begin, end) { end = Math.min(end, this.length); var beginChunk = this.getBeginChunk(begin); var endChunk = this.getEndChunk(end); var chunks = []; for (var chunk = beginChunk; chunk < endChunk; ++chunk) { chunks.push(chunk); } return this._requestChunks(chunks); }, requestRanges: function ChunkedStreamManager_requestRanges(ranges) { ranges = ranges || []; var chunksToRequest = []; for (var i = 0; i < ranges.length; i++) { var beginChunk = this.getBeginChunk(ranges[i].begin); var endChunk = this.getEndChunk(ranges[i].end); for (var chunk = beginChunk; chunk < endChunk; ++chunk) { if (chunksToRequest.indexOf(chunk) < 0) { chunksToRequest.push(chunk); } } } chunksToRequest.sort(function(a, b) { return a - b; }); return this._requestChunks(chunksToRequest); }, // Groups a sorted array of chunks into as few contiguous larger // chunks as possible groupChunks: function ChunkedStreamManager_groupChunks(chunks) { var groupedChunks = []; var beginChunk = -1; var prevChunk = -1; for (var i = 0; i < chunks.length; ++i) { var chunk = chunks[i]; if (beginChunk < 0) { beginChunk = chunk; } if (prevChunk >= 0 && prevChunk + 1 !== chunk) { groupedChunks.push({ beginChunk: beginChunk, endChunk: prevChunk + 1 }); beginChunk = chunk; } if (i + 1 === chunks.length) { groupedChunks.push({ beginChunk: beginChunk, endChunk: chunk + 1 }); } prevChunk = chunk; } return groupedChunks; }, onProgress: function ChunkedStreamManager_onProgress(args) { var bytesLoaded = (this.stream.numChunksLoaded * this.chunkSize + args.loaded); this.msgHandler.send('DocProgress', { loaded: bytesLoaded, total: this.length }); }, onReceiveData: function ChunkedStreamManager_onReceiveData(args) { var chunk = args.chunk; var isProgressive = args.begin === undefined; var begin = isProgressive ? this.progressiveDataLength : args.begin; var end = begin + chunk.byteLength; var beginChunk = Math.floor(begin / this.chunkSize); var endChunk = end < this.length ? Math.floor(end / this.chunkSize) : Math.ceil(end / this.chunkSize); if (isProgressive) { this.stream.onReceiveProgressiveData(chunk); this.progressiveDataLength = end; } else { this.stream.onReceiveData(begin, chunk); } if (this.stream.allChunksLoaded()) { this._loadedStreamCapability.resolve(this.stream); } var loadedRequests = []; var i, requestId; for (chunk = beginChunk; chunk < endChunk; ++chunk) { // The server might return more chunks than requested var requestIds = this.requestsByChunk[chunk] || []; delete this.requestsByChunk[chunk]; for (i = 0; i < requestIds.length; ++i) { requestId = requestIds[i]; var chunksNeeded = this.chunksNeededByRequest[requestId]; if (chunk in chunksNeeded) { delete chunksNeeded[chunk]; } if (!isEmptyObj(chunksNeeded)) { continue; } loadedRequests.push(requestId); } } // If there are no pending requests, automatically fetch the next // unfetched chunk of the PDF if (!this.disableAutoFetch && isEmptyObj(this.requestsByChunk)) { var nextEmptyChunk; if (this.stream.numChunksLoaded === 1) { // This is a special optimization so that after fetching the first // chunk, rather than fetching the second chunk, we fetch the last // chunk. var lastChunk = this.stream.numChunks - 1; if (!this.stream.hasChunk(lastChunk)) { nextEmptyChunk = lastChunk; } } else { nextEmptyChunk = this.stream.nextEmptyChunk(endChunk); } if (isInt(nextEmptyChunk)) { this._requestChunks([nextEmptyChunk]); } } for (i = 0; i < loadedRequests.length; ++i) { requestId = loadedRequests[i]; var capability = this.promisesByRequest[requestId]; delete this.promisesByRequest[requestId]; capability.resolve(); } this.msgHandler.send('DocProgress', { loaded: this.stream.numChunksLoaded * this.chunkSize, total: this.length }); }, onError: function ChunkedStreamManager_onError(err) { this._loadedStreamCapability.reject(err); }, getBeginChunk: function ChunkedStreamManager_getBeginChunk(begin) { var chunk = Math.floor(begin / this.chunkSize); return chunk; }, getEndChunk: function ChunkedStreamManager_getEndChunk(end) { var chunk = Math.floor((end - 1) / this.chunkSize) + 1; return chunk; }, abort: function ChunkedStreamManager_abort() { this.aborted = true; if (this.pdfNetworkStream) { this.pdfNetworkStream.cancelAllRequests('abort'); } for(var requestId in this.promisesByRequest) { var capability = this.promisesByRequest[requestId]; capability.reject(new Error('Request was aborted')); } } }; return ChunkedStreamManager; })(); exports.ChunkedStream = ChunkedStream; exports.ChunkedStreamManager = ChunkedStreamManager; })); (function (root, factory) { { factory((root.pdfjsCoreGlyphList = {}), root.pdfjsSharedUtil); } }(this, function (exports, sharedUtil) { var getLookupTableFactory = sharedUtil.getLookupTableFactory; var getGlyphsUnicode = getLookupTableFactory(function (t) { t['A'] = 0x0041; t['AE'] = 0x00C6; t['AEacute'] = 0x01FC; t['AEmacron'] = 0x01E2; t['AEsmall'] = 0xF7E6; t['Aacute'] = 0x00C1; t['Aacutesmall'] = 0xF7E1; t['Abreve'] = 0x0102; t['Abreveacute'] = 0x1EAE; t['Abrevecyrillic'] = 0x04D0; t['Abrevedotbelow'] = 0x1EB6; t['Abrevegrave'] = 0x1EB0; t['Abrevehookabove'] = 0x1EB2; t['Abrevetilde'] = 0x1EB4; t['Acaron'] = 0x01CD; t['Acircle'] = 0x24B6; t['Acircumflex'] = 0x00C2; t['Acircumflexacute'] = 0x1EA4; t['Acircumflexdotbelow'] = 0x1EAC; t['Acircumflexgrave'] = 0x1EA6; t['Acircumflexhookabove'] = 0x1EA8; t['Acircumflexsmall'] = 0xF7E2; t['Acircumflextilde'] = 0x1EAA; t['Acute'] = 0xF6C9; t['Acutesmall'] = 0xF7B4; t['Acyrillic'] = 0x0410; t['Adblgrave'] = 0x0200; t['Adieresis'] = 0x00C4; t['Adieresiscyrillic'] = 0x04D2; t['Adieresismacron'] = 0x01DE; t['Adieresissmall'] = 0xF7E4; t['Adotbelow'] = 0x1EA0; t['Adotmacron'] = 0x01E0; t['Agrave'] = 0x00C0; t['Agravesmall'] = 0xF7E0; t['Ahookabove'] = 0x1EA2; t['Aiecyrillic'] = 0x04D4; t['Ainvertedbreve'] = 0x0202; t['Alpha'] = 0x0391; t['Alphatonos'] = 0x0386; t['Amacron'] = 0x0100; t['Amonospace'] = 0xFF21; t['Aogonek'] = 0x0104; t['Aring'] = 0x00C5; t['Aringacute'] = 0x01FA; t['Aringbelow'] = 0x1E00; t['Aringsmall'] = 0xF7E5; t['Asmall'] = 0xF761; t['Atilde'] = 0x00C3; t['Atildesmall'] = 0xF7E3; t['Aybarmenian'] = 0x0531; t['B'] = 0x0042; t['Bcircle'] = 0x24B7; t['Bdotaccent'] = 0x1E02; t['Bdotbelow'] = 0x1E04; t['Becyrillic'] = 0x0411; t['Benarmenian'] = 0x0532; t['Beta'] = 0x0392; t['Bhook'] = 0x0181; t['Blinebelow'] = 0x1E06; t['Bmonospace'] = 0xFF22; t['Brevesmall'] = 0xF6F4; t['Bsmall'] = 0xF762; t['Btopbar'] = 0x0182; t['C'] = 0x0043; t['Caarmenian'] = 0x053E; t['Cacute'] = 0x0106; t['Caron'] = 0xF6CA; t['Caronsmall'] = 0xF6F5; t['Ccaron'] = 0x010C; t['Ccedilla'] = 0x00C7; t['Ccedillaacute'] = 0x1E08; t['Ccedillasmall'] = 0xF7E7; t['Ccircle'] = 0x24B8; t['Ccircumflex'] = 0x0108; t['Cdot'] = 0x010A; t['Cdotaccent'] = 0x010A; t['Cedillasmall'] = 0xF7B8; t['Chaarmenian'] = 0x0549; t['Cheabkhasiancyrillic'] = 0x04BC; t['Checyrillic'] = 0x0427; t['Chedescenderabkhasiancyrillic'] = 0x04BE; t['Chedescendercyrillic'] = 0x04B6; t['Chedieresiscyrillic'] = 0x04F4; t['Cheharmenian'] = 0x0543; t['Chekhakassiancyrillic'] = 0x04CB; t['Cheverticalstrokecyrillic'] = 0x04B8; t['Chi'] = 0x03A7; t['Chook'] = 0x0187; t['Circumflexsmall'] = 0xF6F6; t['Cmonospace'] = 0xFF23; t['Coarmenian'] = 0x0551; t['Csmall'] = 0xF763; t['D'] = 0x0044; t['DZ'] = 0x01F1; t['DZcaron'] = 0x01C4; t['Daarmenian'] = 0x0534; t['Dafrican'] = 0x0189; t['Dcaron'] = 0x010E; t['Dcedilla'] = 0x1E10; t['Dcircle'] = 0x24B9; t['Dcircumflexbelow'] = 0x1E12; t['Dcroat'] = 0x0110; t['Ddotaccent'] = 0x1E0A; t['Ddotbelow'] = 0x1E0C; t['Decyrillic'] = 0x0414; t['Deicoptic'] = 0x03EE; t['Delta'] = 0x2206; t['Deltagreek'] = 0x0394; t['Dhook'] = 0x018A; t['Dieresis'] = 0xF6CB; t['DieresisAcute'] = 0xF6CC; t['DieresisGrave'] = 0xF6CD; t['Dieresissmall'] = 0xF7A8; t['Digammagreek'] = 0x03DC; t['Djecyrillic'] = 0x0402; t['Dlinebelow'] = 0x1E0E; t['Dmonospace'] = 0xFF24; t['Dotaccentsmall'] = 0xF6F7; t['Dslash'] = 0x0110; t['Dsmall'] = 0xF764; t['Dtopbar'] = 0x018B; t['Dz'] = 0x01F2; t['Dzcaron'] = 0x01C5; t['Dzeabkhasiancyrillic'] = 0x04E0; t['Dzecyrillic'] = 0x0405; t['Dzhecyrillic'] = 0x040F; t['E'] = 0x0045; t['Eacute'] = 0x00C9; t['Eacutesmall'] = 0xF7E9; t['Ebreve'] = 0x0114; t['Ecaron'] = 0x011A; t['Ecedillabreve'] = 0x1E1C; t['Echarmenian'] = 0x0535; t['Ecircle'] = 0x24BA; t['Ecircumflex'] = 0x00CA; t['Ecircumflexacute'] = 0x1EBE; t['Ecircumflexbelow'] = 0x1E18; t['Ecircumflexdotbelow'] = 0x1EC6; t['Ecircumflexgrave'] = 0x1EC0; t['Ecircumflexhookabove'] = 0x1EC2; t['Ecircumflexsmall'] = 0xF7EA; t['Ecircumflextilde'] = 0x1EC4; t['Ecyrillic'] = 0x0404; t['Edblgrave'] = 0x0204; t['Edieresis'] = 0x00CB; t['Edieresissmall'] = 0xF7EB; t['Edot'] = 0x0116; t['Edotaccent'] = 0x0116; t['Edotbelow'] = 0x1EB8; t['Efcyrillic'] = 0x0424; t['Egrave'] = 0x00C8; t['Egravesmall'] = 0xF7E8; t['Eharmenian'] = 0x0537; t['Ehookabove'] = 0x1EBA; t['Eightroman'] = 0x2167; t['Einvertedbreve'] = 0x0206; t['Eiotifiedcyrillic'] = 0x0464; t['Elcyrillic'] = 0x041B; t['Elevenroman'] = 0x216A; t['Emacron'] = 0x0112; t['Emacronacute'] = 0x1E16; t['Emacrongrave'] = 0x1E14; t['Emcyrillic'] = 0x041C; t['Emonospace'] = 0xFF25; t['Encyrillic'] = 0x041D; t['Endescendercyrillic'] = 0x04A2; t['Eng'] = 0x014A; t['Enghecyrillic'] = 0x04A4; t['Enhookcyrillic'] = 0x04C7; t['Eogonek'] = 0x0118; t['Eopen'] = 0x0190; t['Epsilon'] = 0x0395; t['Epsilontonos'] = 0x0388; t['Ercyrillic'] = 0x0420; t['Ereversed'] = 0x018E; t['Ereversedcyrillic'] = 0x042D; t['Escyrillic'] = 0x0421; t['Esdescendercyrillic'] = 0x04AA; t['Esh'] = 0x01A9; t['Esmall'] = 0xF765; t['Eta'] = 0x0397; t['Etarmenian'] = 0x0538; t['Etatonos'] = 0x0389; t['Eth'] = 0x00D0; t['Ethsmall'] = 0xF7F0; t['Etilde'] = 0x1EBC; t['Etildebelow'] = 0x1E1A; t['Euro'] = 0x20AC; t['Ezh'] = 0x01B7; t['Ezhcaron'] = 0x01EE; t['Ezhreversed'] = 0x01B8; t['F'] = 0x0046; t['Fcircle'] = 0x24BB; t['Fdotaccent'] = 0x1E1E; t['Feharmenian'] = 0x0556; t['Feicoptic'] = 0x03E4; t['Fhook'] = 0x0191; t['Fitacyrillic'] = 0x0472; t['Fiveroman'] = 0x2164; t['Fmonospace'] = 0xFF26; t['Fourroman'] = 0x2163; t['Fsmall'] = 0xF766; t['G'] = 0x0047; t['GBsquare'] = 0x3387; t['Gacute'] = 0x01F4; t['Gamma'] = 0x0393; t['Gammaafrican'] = 0x0194; t['Gangiacoptic'] = 0x03EA; t['Gbreve'] = 0x011E; t['Gcaron'] = 0x01E6; t['Gcedilla'] = 0x0122; t['Gcircle'] = 0x24BC; t['Gcircumflex'] = 0x011C; t['Gcommaaccent'] = 0x0122; t['Gdot'] = 0x0120; t['Gdotaccent'] = 0x0120; t['Gecyrillic'] = 0x0413; t['Ghadarmenian'] = 0x0542; t['Ghemiddlehookcyrillic'] = 0x0494; t['Ghestrokecyrillic'] = 0x0492; t['Gheupturncyrillic'] = 0x0490; t['Ghook'] = 0x0193; t['Gimarmenian'] = 0x0533; t['Gjecyrillic'] = 0x0403; t['Gmacron'] = 0x1E20; t['Gmonospace'] = 0xFF27; t['Grave'] = 0xF6CE; t['Gravesmall'] = 0xF760; t['Gsmall'] = 0xF767; t['Gsmallhook'] = 0x029B; t['Gstroke'] = 0x01E4; t['H'] = 0x0048; t['H18533'] = 0x25CF; t['H18543'] = 0x25AA; t['H18551'] = 0x25AB; t['H22073'] = 0x25A1; t['HPsquare'] = 0x33CB; t['Haabkhasiancyrillic'] = 0x04A8; t['Hadescendercyrillic'] = 0x04B2; t['Hardsigncyrillic'] = 0x042A; t['Hbar'] = 0x0126; t['Hbrevebelow'] = 0x1E2A; t['Hcedilla'] = 0x1E28; t['Hcircle'] = 0x24BD; t['Hcircumflex'] = 0x0124; t['Hdieresis'] = 0x1E26; t['Hdotaccent'] = 0x1E22; t['Hdotbelow'] = 0x1E24; t['Hmonospace'] = 0xFF28; t['Hoarmenian'] = 0x0540; t['Horicoptic'] = 0x03E8; t['Hsmall'] = 0xF768; t['Hungarumlaut'] = 0xF6CF; t['Hungarumlautsmall'] = 0xF6F8; t['Hzsquare'] = 0x3390; t['I'] = 0x0049; t['IAcyrillic'] = 0x042F; t['IJ'] = 0x0132; t['IUcyrillic'] = 0x042E; t['Iacute'] = 0x00CD; t['Iacutesmall'] = 0xF7ED; t['Ibreve'] = 0x012C; t['Icaron'] = 0x01CF; t['Icircle'] = 0x24BE; t['Icircumflex'] = 0x00CE; t['Icircumflexsmall'] = 0xF7EE; t['Icyrillic'] = 0x0406; t['Idblgrave'] = 0x0208; t['Idieresis'] = 0x00CF; t['Idieresisacute'] = 0x1E2E; t['Idieresiscyrillic'] = 0x04E4; t['Idieresissmall'] = 0xF7EF; t['Idot'] = 0x0130; t['Idotaccent'] = 0x0130; t['Idotbelow'] = 0x1ECA; t['Iebrevecyrillic'] = 0x04D6; t['Iecyrillic'] = 0x0415; t['Ifraktur'] = 0x2111; t['Igrave'] = 0x00CC; t['Igravesmall'] = 0xF7EC; t['Ihookabove'] = 0x1EC8; t['Iicyrillic'] = 0x0418; t['Iinvertedbreve'] = 0x020A; t['Iishortcyrillic'] = 0x0419; t['Imacron'] = 0x012A; t['Imacroncyrillic'] = 0x04E2; t['Imonospace'] = 0xFF29; t['Iniarmenian'] = 0x053B; t['Iocyrillic'] = 0x0401; t['Iogonek'] = 0x012E; t['Iota'] = 0x0399; t['Iotaafrican'] = 0x0196; t['Iotadieresis'] = 0x03AA; t['Iotatonos'] = 0x038A; t['Ismall'] = 0xF769; t['Istroke'] = 0x0197; t['Itilde'] = 0x0128; t['Itildebelow'] = 0x1E2C; t['Izhitsacyrillic'] = 0x0474; t['Izhitsadblgravecyrillic'] = 0x0476; t['J'] = 0x004A; t['Jaarmenian'] = 0x0541; t['Jcircle'] = 0x24BF; t['Jcircumflex'] = 0x0134; t['Jecyrillic'] = 0x0408; t['Jheharmenian'] = 0x054B; t['Jmonospace'] = 0xFF2A; t['Jsmall'] = 0xF76A; t['K'] = 0x004B; t['KBsquare'] = 0x3385; t['KKsquare'] = 0x33CD; t['Kabashkircyrillic'] = 0x04A0; t['Kacute'] = 0x1E30; t['Kacyrillic'] = 0x041A; t['Kadescendercyrillic'] = 0x049A; t['Kahookcyrillic'] = 0x04C3; t['Kappa'] = 0x039A; t['Kastrokecyrillic'] = 0x049E; t['Kaverticalstrokecyrillic'] = 0x049C; t['Kcaron'] = 0x01E8; t['Kcedilla'] = 0x0136; t['Kcircle'] = 0x24C0; t['Kcommaaccent'] = 0x0136; t['Kdotbelow'] = 0x1E32; t['Keharmenian'] = 0x0554; t['Kenarmenian'] = 0x053F; t['Khacyrillic'] = 0x0425; t['Kheicoptic'] = 0x03E6; t['Khook'] = 0x0198; t['Kjecyrillic'] = 0x040C; t['Klinebelow'] = 0x1E34; t['Kmonospace'] = 0xFF2B; t['Koppacyrillic'] = 0x0480; t['Koppagreek'] = 0x03DE; t['Ksicyrillic'] = 0x046E; t['Ksmall'] = 0xF76B; t['L'] = 0x004C; t['LJ'] = 0x01C7; t['LL'] = 0xF6BF; t['Lacute'] = 0x0139; t['Lambda'] = 0x039B; t['Lcaron'] = 0x013D; t['Lcedilla'] = 0x013B; t['Lcircle'] = 0x24C1; t['Lcircumflexbelow'] = 0x1E3C; t['Lcommaaccent'] = 0x013B; t['Ldot'] = 0x013F; t['Ldotaccent'] = 0x013F; t['Ldotbelow'] = 0x1E36; t['Ldotbelowmacron'] = 0x1E38; t['Liwnarmenian'] = 0x053C; t['Lj'] = 0x01C8; t['Ljecyrillic'] = 0x0409; t['Llinebelow'] = 0x1E3A; t['Lmonospace'] = 0xFF2C; t['Lslash'] = 0x0141; t['Lslashsmall'] = 0xF6F9; t['Lsmall'] = 0xF76C; t['M'] = 0x004D; t['MBsquare'] = 0x3386; t['Macron'] = 0xF6D0; t['Macronsmall'] = 0xF7AF; t['Macute'] = 0x1E3E; t['Mcircle'] = 0x24C2; t['Mdotaccent'] = 0x1E40; t['Mdotbelow'] = 0x1E42; t['Menarmenian'] = 0x0544; t['Mmonospace'] = 0xFF2D; t['Msmall'] = 0xF76D; t['Mturned'] = 0x019C; t['Mu'] = 0x039C; t['N'] = 0x004E; t['NJ'] = 0x01CA; t['Nacute'] = 0x0143; t['Ncaron'] = 0x0147; t['Ncedilla'] = 0x0145; t['Ncircle'] = 0x24C3; t['Ncircumflexbelow'] = 0x1E4A; t['Ncommaaccent'] = 0x0145; t['Ndotaccent'] = 0x1E44; t['Ndotbelow'] = 0x1E46; t['Nhookleft'] = 0x019D; t['Nineroman'] = 0x2168; t['Nj'] = 0x01CB; t['Njecyrillic'] = 0x040A; t['Nlinebelow'] = 0x1E48; t['Nmonospace'] = 0xFF2E; t['Nowarmenian'] = 0x0546; t['Nsmall'] = 0xF76E; t['Ntilde'] = 0x00D1; t['Ntildesmall'] = 0xF7F1; t['Nu'] = 0x039D; t['O'] = 0x004F; t['OE'] = 0x0152; t['OEsmall'] = 0xF6FA; t['Oacute'] = 0x00D3; t['Oacutesmall'] = 0xF7F3; t['Obarredcyrillic'] = 0x04E8; t['Obarreddieresiscyrillic'] = 0x04EA; t['Obreve'] = 0x014E; t['Ocaron'] = 0x01D1; t['Ocenteredtilde'] = 0x019F; t['Ocircle'] = 0x24C4; t['Ocircumflex'] = 0x00D4; t['Ocircumflexacute'] = 0x1ED0; t['Ocircumflexdotbelow'] = 0x1ED8; t['Ocircumflexgrave'] = 0x1ED2; t['Ocircumflexhookabove'] = 0x1ED4; t['Ocircumflexsmall'] = 0xF7F4; t['Ocircumflextilde'] = 0x1ED6; t['Ocyrillic'] = 0x041E; t['Odblacute'] = 0x0150; t['Odblgrave'] = 0x020C; t['Odieresis'] = 0x00D6; t['Odieresiscyrillic'] = 0x04E6; t['Odieresissmall'] = 0xF7F6; t['Odotbelow'] = 0x1ECC; t['Ogoneksmall'] = 0xF6FB; t['Ograve'] = 0x00D2; t['Ogravesmall'] = 0xF7F2; t['Oharmenian'] = 0x0555; t['Ohm'] = 0x2126; t['Ohookabove'] = 0x1ECE; t['Ohorn'] = 0x01A0; t['Ohornacute'] = 0x1EDA; t['Ohorndotbelow'] = 0x1EE2; t['Ohorngrave'] = 0x1EDC; t['Ohornhookabove'] = 0x1EDE; t['Ohorntilde'] = 0x1EE0; t['Ohungarumlaut'] = 0x0150; t['Oi'] = 0x01A2; t['Oinvertedbreve'] = 0x020E; t['Omacron'] = 0x014C; t['Omacronacute'] = 0x1E52; t['Omacrongrave'] = 0x1E50; t['Omega'] = 0x2126; t['Omegacyrillic'] = 0x0460; t['Omegagreek'] = 0x03A9; t['Omegaroundcyrillic'] = 0x047A; t['Omegatitlocyrillic'] = 0x047C; t['Omegatonos'] = 0x038F; t['Omicron'] = 0x039F; t['Omicrontonos'] = 0x038C; t['Omonospace'] = 0xFF2F; t['Oneroman'] = 0x2160; t['Oogonek'] = 0x01EA; t['Oogonekmacron'] = 0x01EC; t['Oopen'] = 0x0186; t['Oslash'] = 0x00D8; t['Oslashacute'] = 0x01FE; t['Oslashsmall'] = 0xF7F8; t['Osmall'] = 0xF76F; t['Ostrokeacute'] = 0x01FE; t['Otcyrillic'] = 0x047E; t['Otilde'] = 0x00D5; t['Otildeacute'] = 0x1E4C; t['Otildedieresis'] = 0x1E4E; t['Otildesmall'] = 0xF7F5; t['P'] = 0x0050; t['Pacute'] = 0x1E54; t['Pcircle'] = 0x24C5; t['Pdotaccent'] = 0x1E56; t['Pecyrillic'] = 0x041F; t['Peharmenian'] = 0x054A; t['Pemiddlehookcyrillic'] = 0x04A6; t['Phi'] = 0x03A6; t['Phook'] = 0x01A4; t['Pi'] = 0x03A0; t['Piwrarmenian'] = 0x0553; t['Pmonospace'] = 0xFF30; t['Psi'] = 0x03A8; t['Psicyrillic'] = 0x0470; t['Psmall'] = 0xF770; t['Q'] = 0x0051; t['Qcircle'] = 0x24C6; t['Qmonospace'] = 0xFF31; t['Qsmall'] = 0xF771; t['R'] = 0x0052; t['Raarmenian'] = 0x054C; t['Racute'] = 0x0154; t['Rcaron'] = 0x0158; t['Rcedilla'] = 0x0156; t['Rcircle'] = 0x24C7; t['Rcommaaccent'] = 0x0156; t['Rdblgrave'] = 0x0210; t['Rdotaccent'] = 0x1E58; t['Rdotbelow'] = 0x1E5A; t['Rdotbelowmacron'] = 0x1E5C; t['Reharmenian'] = 0x0550; t['Rfraktur'] = 0x211C; t['Rho'] = 0x03A1; t['Ringsmall'] = 0xF6FC; t['Rinvertedbreve'] = 0x0212; t['Rlinebelow'] = 0x1E5E; t['Rmonospace'] = 0xFF32; t['Rsmall'] = 0xF772; t['Rsmallinverted'] = 0x0281; t['Rsmallinvertedsuperior'] = 0x02B6; t['S'] = 0x0053; t['SF010000'] = 0x250C; t['SF020000'] = 0x2514; t['SF030000'] = 0x2510; t['SF040000'] = 0x2518; t['SF050000'] = 0x253C; t['SF060000'] = 0x252C; t['SF070000'] = 0x2534; t['SF080000'] = 0x251C; t['SF090000'] = 0x2524; t['SF100000'] = 0x2500; t['SF110000'] = 0x2502; t['SF190000'] = 0x2561; t['SF200000'] = 0x2562; t['SF210000'] = 0x2556; t['SF220000'] = 0x2555; t['SF230000'] = 0x2563; t['SF240000'] = 0x2551; t['SF250000'] = 0x2557; t['SF260000'] = 0x255D; t['SF270000'] = 0x255C; t['SF280000'] = 0x255B; t['SF360000'] = 0x255E; t['SF370000'] = 0x255F; t['SF380000'] = 0x255A; t['SF390000'] = 0x2554; t['SF400000'] = 0x2569; t['SF410000'] = 0x2566; t['SF420000'] = 0x2560; t['SF430000'] = 0x2550; t['SF440000'] = 0x256C; t['SF450000'] = 0x2567; t['SF460000'] = 0x2568; t['SF470000'] = 0x2564; t['SF480000'] = 0x2565; t['SF490000'] = 0x2559; t['SF500000'] = 0x2558; t['SF510000'] = 0x2552; t['SF520000'] = 0x2553; t['SF530000'] = 0x256B; t['SF540000'] = 0x256A; t['Sacute'] = 0x015A; t['Sacutedotaccent'] = 0x1E64; t['Sampigreek'] = 0x03E0; t['Scaron'] = 0x0160; t['Scarondotaccent'] = 0x1E66; t['Scaronsmall'] = 0xF6FD; t['Scedilla'] = 0x015E; t['Schwa'] = 0x018F; t['Schwacyrillic'] = 0x04D8; t['Schwadieresiscyrillic'] = 0x04DA; t['Scircle'] = 0x24C8; t['Scircumflex'] = 0x015C; t['Scommaaccent'] = 0x0218; t['Sdotaccent'] = 0x1E60; t['Sdotbelow'] = 0x1E62; t['Sdotbelowdotaccent'] = 0x1E68; t['Seharmenian'] = 0x054D; t['Sevenroman'] = 0x2166; t['Shaarmenian'] = 0x0547; t['Shacyrillic'] = 0x0428; t['Shchacyrillic'] = 0x0429; t['Sheicoptic'] = 0x03E2; t['Shhacyrillic'] = 0x04BA; t['Shimacoptic'] = 0x03EC; t['Sigma'] = 0x03A3; t['Sixroman'] = 0x2165; t['Smonospace'] = 0xFF33; t['Softsigncyrillic'] = 0x042C; t['Ssmall'] = 0xF773; t['Stigmagreek'] = 0x03DA; t['T'] = 0x0054; t['Tau'] = 0x03A4; t['Tbar'] = 0x0166; t['Tcaron'] = 0x0164; t['Tcedilla'] = 0x0162; t['Tcircle'] = 0x24C9; t['Tcircumflexbelow'] = 0x1E70; t['Tcommaaccent'] = 0x0162; t['Tdotaccent'] = 0x1E6A; t['Tdotbelow'] = 0x1E6C; t['Tecyrillic'] = 0x0422; t['Tedescendercyrillic'] = 0x04AC; t['Tenroman'] = 0x2169; t['Tetsecyrillic'] = 0x04B4; t['Theta'] = 0x0398; t['Thook'] = 0x01AC; t['Thorn'] = 0x00DE; t['Thornsmall'] = 0xF7FE; t['Threeroman'] = 0x2162; t['Tildesmall'] = 0xF6FE; t['Tiwnarmenian'] = 0x054F; t['Tlinebelow'] = 0x1E6E; t['Tmonospace'] = 0xFF34; t['Toarmenian'] = 0x0539; t['Tonefive'] = 0x01BC; t['Tonesix'] = 0x0184; t['Tonetwo'] = 0x01A7; t['Tretroflexhook'] = 0x01AE; t['Tsecyrillic'] = 0x0426; t['Tshecyrillic'] = 0x040B; t['Tsmall'] = 0xF774; t['Twelveroman'] = 0x216B; t['Tworoman'] = 0x2161; t['U'] = 0x0055; t['Uacute'] = 0x00DA; t['Uacutesmall'] = 0xF7FA; t['Ubreve'] = 0x016C; t['Ucaron'] = 0x01D3; t['Ucircle'] = 0x24CA; t['Ucircumflex'] = 0x00DB; t['Ucircumflexbelow'] = 0x1E76; t['Ucircumflexsmall'] = 0xF7FB; t['Ucyrillic'] = 0x0423; t['Udblacute'] = 0x0170; t['Udblgrave'] = 0x0214; t['Udieresis'] = 0x00DC; t['Udieresisacute'] = 0x01D7; t['Udieresisbelow'] = 0x1E72; t['Udieresiscaron'] = 0x01D9; t['Udieresiscyrillic'] = 0x04F0; t['Udieresisgrave'] = 0x01DB; t['Udieresismacron'] = 0x01D5; t['Udieresissmall'] = 0xF7FC; t['Udotbelow'] = 0x1EE4; t['Ugrave'] = 0x00D9; t['Ugravesmall'] = 0xF7F9; t['Uhookabove'] = 0x1EE6; t['Uhorn'] = 0x01AF; t['Uhornacute'] = 0x1EE8; t['Uhorndotbelow'] = 0x1EF0; t['Uhorngrave'] = 0x1EEA; t['Uhornhookabove'] = 0x1EEC; t['Uhorntilde'] = 0x1EEE; t['Uhungarumlaut'] = 0x0170; t['Uhungarumlautcyrillic'] = 0x04F2; t['Uinvertedbreve'] = 0x0216; t['Ukcyrillic'] = 0x0478; t['Umacron'] = 0x016A; t['Umacroncyrillic'] = 0x04EE; t['Umacrondieresis'] = 0x1E7A; t['Umonospace'] = 0xFF35; t['Uogonek'] = 0x0172; t['Upsilon'] = 0x03A5; t['Upsilon1'] = 0x03D2; t['Upsilonacutehooksymbolgreek'] = 0x03D3; t['Upsilonafrican'] = 0x01B1; t['Upsilondieresis'] = 0x03AB; t['Upsilondieresishooksymbolgreek'] = 0x03D4; t['Upsilonhooksymbol'] = 0x03D2; t['Upsilontonos'] = 0x038E; t['Uring'] = 0x016E; t['Ushortcyrillic'] = 0x040E; t['Usmall'] = 0xF775; t['Ustraightcyrillic'] = 0x04AE; t['Ustraightstrokecyrillic'] = 0x04B0; t['Utilde'] = 0x0168; t['Utildeacute'] = 0x1E78; t['Utildebelow'] = 0x1E74; t['V'] = 0x0056; t['Vcircle'] = 0x24CB; t['Vdotbelow'] = 0x1E7E; t['Vecyrillic'] = 0x0412; t['Vewarmenian'] = 0x054E; t['Vhook'] = 0x01B2; t['Vmonospace'] = 0xFF36; t['Voarmenian'] = 0x0548; t['Vsmall'] = 0xF776; t['Vtilde'] = 0x1E7C; t['W'] = 0x0057; t['Wacute'] = 0x1E82; t['Wcircle'] = 0x24CC; t['Wcircumflex'] = 0x0174; t['Wdieresis'] = 0x1E84; t['Wdotaccent'] = 0x1E86; t['Wdotbelow'] = 0x1E88; t['Wgrave'] = 0x1E80; t['Wmonospace'] = 0xFF37; t['Wsmall'] = 0xF777; t['X'] = 0x0058; t['Xcircle'] = 0x24CD; t['Xdieresis'] = 0x1E8C; t['Xdotaccent'] = 0x1E8A; t['Xeharmenian'] = 0x053D; t['Xi'] = 0x039E; t['Xmonospace'] = 0xFF38; t['Xsmall'] = 0xF778; t['Y'] = 0x0059; t['Yacute'] = 0x00DD; t['Yacutesmall'] = 0xF7FD; t['Yatcyrillic'] = 0x0462; t['Ycircle'] = 0x24CE; t['Ycircumflex'] = 0x0176; t['Ydieresis'] = 0x0178; t['Ydieresissmall'] = 0xF7FF; t['Ydotaccent'] = 0x1E8E; t['Ydotbelow'] = 0x1EF4; t['Yericyrillic'] = 0x042B; t['Yerudieresiscyrillic'] = 0x04F8; t['Ygrave'] = 0x1EF2; t['Yhook'] = 0x01B3; t['Yhookabove'] = 0x1EF6; t['Yiarmenian'] = 0x0545; t['Yicyrillic'] = 0x0407; t['Yiwnarmenian'] = 0x0552; t['Ymonospace'] = 0xFF39; t['Ysmall'] = 0xF779; t['Ytilde'] = 0x1EF8; t['Yusbigcyrillic'] = 0x046A; t['Yusbigiotifiedcyrillic'] = 0x046C; t['Yuslittlecyrillic'] = 0x0466; t['Yuslittleiotifiedcyrillic'] = 0x0468; t['Z'] = 0x005A; t['Zaarmenian'] = 0x0536; t['Zacute'] = 0x0179; t['Zcaron'] = 0x017D; t['Zcaronsmall'] = 0xF6FF; t['Zcircle'] = 0x24CF; t['Zcircumflex'] = 0x1E90; t['Zdot'] = 0x017B; t['Zdotaccent'] = 0x017B; t['Zdotbelow'] = 0x1E92; t['Zecyrillic'] = 0x0417; t['Zedescendercyrillic'] = 0x0498; t['Zedieresiscyrillic'] = 0x04DE; t['Zeta'] = 0x0396; t['Zhearmenian'] = 0x053A; t['Zhebrevecyrillic'] = 0x04C1; t['Zhecyrillic'] = 0x0416; t['Zhedescendercyrillic'] = 0x0496; t['Zhedieresiscyrillic'] = 0x04DC; t['Zlinebelow'] = 0x1E94; t['Zmonospace'] = 0xFF3A; t['Zsmall'] = 0xF77A; t['Zstroke'] = 0x01B5; t['a'] = 0x0061; t['aabengali'] = 0x0986; t['aacute'] = 0x00E1; t['aadeva'] = 0x0906; t['aagujarati'] = 0x0A86; t['aagurmukhi'] = 0x0A06; t['aamatragurmukhi'] = 0x0A3E; t['aarusquare'] = 0x3303; t['aavowelsignbengali'] = 0x09BE; t['aavowelsigndeva'] = 0x093E; t['aavowelsigngujarati'] = 0x0ABE; t['abbreviationmarkarmenian'] = 0x055F; t['abbreviationsigndeva'] = 0x0970; t['abengali'] = 0x0985; t['abopomofo'] = 0x311A; t['abreve'] = 0x0103; t['abreveacute'] = 0x1EAF; t['abrevecyrillic'] = 0x04D1; t['abrevedotbelow'] = 0x1EB7; t['abrevegrave'] = 0x1EB1; t['abrevehookabove'] = 0x1EB3; t['abrevetilde'] = 0x1EB5; t['acaron'] = 0x01CE; t['acircle'] = 0x24D0; t['acircumflex'] = 0x00E2; t['acircumflexacute'] = 0x1EA5; t['acircumflexdotbelow'] = 0x1EAD; t['acircumflexgrave'] = 0x1EA7; t['acircumflexhookabove'] = 0x1EA9; t['acircumflextilde'] = 0x1EAB; t['acute'] = 0x00B4; t['acutebelowcmb'] = 0x0317; t['acutecmb'] = 0x0301; t['acutecomb'] = 0x0301; t['acutedeva'] = 0x0954; t['acutelowmod'] = 0x02CF; t['acutetonecmb'] = 0x0341; t['acyrillic'] = 0x0430; t['adblgrave'] = 0x0201; t['addakgurmukhi'] = 0x0A71; t['adeva'] = 0x0905; t['adieresis'] = 0x00E4; t['adieresiscyrillic'] = 0x04D3; t['adieresismacron'] = 0x01DF; t['adotbelow'] = 0x1EA1; t['adotmacron'] = 0x01E1; t['ae'] = 0x00E6; t['aeacute'] = 0x01FD; t['aekorean'] = 0x3150; t['aemacron'] = 0x01E3; t['afii00208'] = 0x2015; t['afii08941'] = 0x20A4; t['afii10017'] = 0x0410; t['afii10018'] = 0x0411; t['afii10019'] = 0x0412; t['afii10020'] = 0x0413; t['afii10021'] = 0x0414; t['afii10022'] = 0x0415; t['afii10023'] = 0x0401; t['afii10024'] = 0x0416; t['afii10025'] = 0x0417; t['afii10026'] = 0x0418; t['afii10027'] = 0x0419; t['afii10028'] = 0x041A; t['afii10029'] = 0x041B; t['afii10030'] = 0x041C; t['afii10031'] = 0x041D; t['afii10032'] = 0x041E; t['afii10033'] = 0x041F; t['afii10034'] = 0x0420; t['afii10035'] = 0x0421; t['afii10036'] = 0x0422; t['afii10037'] = 0x0423; t['afii10038'] = 0x0424; t['afii10039'] = 0x0425; t['afii10040'] = 0x0426; t['afii10041'] = 0x0427; t['afii10042'] = 0x0428; t['afii10043'] = 0x0429; t['afii10044'] = 0x042A; t['afii10045'] = 0x042B; t['afii10046'] = 0x042C; t['afii10047'] = 0x042D; t['afii10048'] = 0x042E; t['afii10049'] = 0x042F; t['afii10050'] = 0x0490; t['afii10051'] = 0x0402; t['afii10052'] = 0x0403; t['afii10053'] = 0x0404; t['afii10054'] = 0x0405; t['afii10055'] = 0x0406; t['afii10056'] = 0x0407; t['afii10057'] = 0x0408; t['afii10058'] = 0x0409; t['afii10059'] = 0x040A; t['afii10060'] = 0x040B; t['afii10061'] = 0x040C; t['afii10062'] = 0x040E; t['afii10063'] = 0xF6C4; t['afii10064'] = 0xF6C5; t['afii10065'] = 0x0430; t['afii10066'] = 0x0431; t['afii10067'] = 0x0432; t['afii10068'] = 0x0433; t['afii10069'] = 0x0434; t['afii10070'] = 0x0435; t['afii10071'] = 0x0451; t['afii10072'] = 0x0436; t['afii10073'] = 0x0437; t['afii10074'] = 0x0438; t['afii10075'] = 0x0439; t['afii10076'] = 0x043A; t['afii10077'] = 0x043B; t['afii10078'] = 0x043C; t['afii10079'] = 0x043D; t['afii10080'] = 0x043E; t['afii10081'] = 0x043F; t['afii10082'] = 0x0440; t['afii10083'] = 0x0441; t['afii10084'] = 0x0442; t['afii10085'] = 0x0443; t['afii10086'] = 0x0444; t['afii10087'] = 0x0445; t['afii10088'] = 0x0446; t['afii10089'] = 0x0447; t['afii10090'] = 0x0448; t['afii10091'] = 0x0449; t['afii10092'] = 0x044A; t['afii10093'] = 0x044B; t['afii10094'] = 0x044C; t['afii10095'] = 0x044D; t['afii10096'] = 0x044E; t['afii10097'] = 0x044F; t['afii10098'] = 0x0491; t['afii10099'] = 0x0452; t['afii10100'] = 0x0453; t['afii10101'] = 0x0454; t['afii10102'] = 0x0455; t['afii10103'] = 0x0456; t['afii10104'] = 0x0457; t['afii10105'] = 0x0458; t['afii10106'] = 0x0459; t['afii10107'] = 0x045A; t['afii10108'] = 0x045B; t['afii10109'] = 0x045C; t['afii10110'] = 0x045E; t['afii10145'] = 0x040F; t['afii10146'] = 0x0462; t['afii10147'] = 0x0472; t['afii10148'] = 0x0474; t['afii10192'] = 0xF6C6; t['afii10193'] = 0x045F; t['afii10194'] = 0x0463; t['afii10195'] = 0x0473; t['afii10196'] = 0x0475; t['afii10831'] = 0xF6C7; t['afii10832'] = 0xF6C8; t['afii10846'] = 0x04D9; t['afii299'] = 0x200E; t['afii300'] = 0x200F; t['afii301'] = 0x200D; t['afii57381'] = 0x066A; t['afii57388'] = 0x060C; t['afii57392'] = 0x0660; t['afii57393'] = 0x0661; t['afii57394'] = 0x0662; t['afii57395'] = 0x0663; t['afii57396'] = 0x0664; t['afii57397'] = 0x0665; t['afii57398'] = 0x0666; t['afii57399'] = 0x0667; t['afii57400'] = 0x0668; t['afii57401'] = 0x0669; t['afii57403'] = 0x061B; t['afii57407'] = 0x061F; t['afii57409'] = 0x0621; t['afii57410'] = 0x0622; t['afii57411'] = 0x0623; t['afii57412'] = 0x0624; t['afii57413'] = 0x0625; t['afii57414'] = 0x0626; t['afii57415'] = 0x0627; t['afii57416'] = 0x0628; t['afii57417'] = 0x0629; t['afii57418'] = 0x062A; t['afii57419'] = 0x062B; t['afii57420'] = 0x062C; t['afii57421'] = 0x062D; t['afii57422'] = 0x062E; t['afii57423'] = 0x062F; t['afii57424'] = 0x0630; t['afii57425'] = 0x0631; t['afii57426'] = 0x0632; t['afii57427'] = 0x0633; t['afii57428'] = 0x0634; t['afii57429'] = 0x0635; t['afii57430'] = 0x0636; t['afii57431'] = 0x0637; t['afii57432'] = 0x0638; t['afii57433'] = 0x0639; t['afii57434'] = 0x063A; t['afii57440'] = 0x0640; t['afii57441'] = 0x0641; t['afii57442'] = 0x0642; t['afii57443'] = 0x0643; t['afii57444'] = 0x0644; t['afii57445'] = 0x0645; t['afii57446'] = 0x0646; t['afii57448'] = 0x0648; t['afii57449'] = 0x0649; t['afii57450'] = 0x064A; t['afii57451'] = 0x064B; t['afii57452'] = 0x064C; t['afii57453'] = 0x064D; t['afii57454'] = 0x064E; t['afii57455'] = 0x064F; t['afii57456'] = 0x0650; t['afii57457'] = 0x0651; t['afii57458'] = 0x0652; t['afii57470'] = 0x0647; t['afii57505'] = 0x06A4; t['afii57506'] = 0x067E; t['afii57507'] = 0x0686; t['afii57508'] = 0x0698; t['afii57509'] = 0x06AF; t['afii57511'] = 0x0679; t['afii57512'] = 0x0688; t['afii57513'] = 0x0691; t['afii57514'] = 0x06BA; t['afii57519'] = 0x06D2; t['afii57534'] = 0x06D5; t['afii57636'] = 0x20AA; t['afii57645'] = 0x05BE; t['afii57658'] = 0x05C3; t['afii57664'] = 0x05D0; t['afii57665'] = 0x05D1; t['afii57666'] = 0x05D2; t['afii57667'] = 0x05D3; t['afii57668'] = 0x05D4; t['afii57669'] = 0x05D5; t['afii57670'] = 0x05D6; t['afii57671'] = 0x05D7; t['afii57672'] = 0x05D8; t['afii57673'] = 0x05D9; t['afii57674'] = 0x05DA; t['afii57675'] = 0x05DB; t['afii57676'] = 0x05DC; t['afii57677'] = 0x05DD; t['afii57678'] = 0x05DE; t['afii57679'] = 0x05DF; t['afii57680'] = 0x05E0; t['afii57681'] = 0x05E1; t['afii57682'] = 0x05E2; t['afii57683'] = 0x05E3; t['afii57684'] = 0x05E4; t['afii57685'] = 0x05E5; t['afii57686'] = 0x05E6; t['afii57687'] = 0x05E7; t['afii57688'] = 0x05E8; t['afii57689'] = 0x05E9; t['afii57690'] = 0x05EA; t['afii57694'] = 0xFB2A; t['afii57695'] = 0xFB2B; t['afii57700'] = 0xFB4B; t['afii57705'] = 0xFB1F; t['afii57716'] = 0x05F0; t['afii57717'] = 0x05F1; t['afii57718'] = 0x05F2; t['afii57723'] = 0xFB35; t['afii57793'] = 0x05B4; t['afii57794'] = 0x05B5; t['afii57795'] = 0x05B6; t['afii57796'] = 0x05BB; t['afii57797'] = 0x05B8; t['afii57798'] = 0x05B7; t['afii57799'] = 0x05B0; t['afii57800'] = 0x05B2; t['afii57801'] = 0x05B1; t['afii57802'] = 0x05B3; t['afii57803'] = 0x05C2; t['afii57804'] = 0x05C1; t['afii57806'] = 0x05B9; t['afii57807'] = 0x05BC; t['afii57839'] = 0x05BD; t['afii57841'] = 0x05BF; t['afii57842'] = 0x05C0; t['afii57929'] = 0x02BC; t['afii61248'] = 0x2105; t['afii61289'] = 0x2113; t['afii61352'] = 0x2116; t['afii61573'] = 0x202C; t['afii61574'] = 0x202D; t['afii61575'] = 0x202E; t['afii61664'] = 0x200C; t['afii63167'] = 0x066D; t['afii64937'] = 0x02BD; t['agrave'] = 0x00E0; t['agujarati'] = 0x0A85; t['agurmukhi'] = 0x0A05; t['ahiragana'] = 0x3042; t['ahookabove'] = 0x1EA3; t['aibengali'] = 0x0990; t['aibopomofo'] = 0x311E; t['aideva'] = 0x0910; t['aiecyrillic'] = 0x04D5; t['aigujarati'] = 0x0A90; t['aigurmukhi'] = 0x0A10; t['aimatragurmukhi'] = 0x0A48; t['ainarabic'] = 0x0639; t['ainfinalarabic'] = 0xFECA; t['aininitialarabic'] = 0xFECB; t['ainmedialarabic'] = 0xFECC; t['ainvertedbreve'] = 0x0203; t['aivowelsignbengali'] = 0x09C8; t['aivowelsigndeva'] = 0x0948; t['aivowelsigngujarati'] = 0x0AC8; t['akatakana'] = 0x30A2; t['akatakanahalfwidth'] = 0xFF71; t['akorean'] = 0x314F; t['alef'] = 0x05D0; t['alefarabic'] = 0x0627; t['alefdageshhebrew'] = 0xFB30; t['aleffinalarabic'] = 0xFE8E; t['alefhamzaabovearabic'] = 0x0623; t['alefhamzaabovefinalarabic'] = 0xFE84; t['alefhamzabelowarabic'] = 0x0625; t['alefhamzabelowfinalarabic'] = 0xFE88; t['alefhebrew'] = 0x05D0; t['aleflamedhebrew'] = 0xFB4F; t['alefmaddaabovearabic'] = 0x0622; t['alefmaddaabovefinalarabic'] = 0xFE82; t['alefmaksuraarabic'] = 0x0649; t['alefmaksurafinalarabic'] = 0xFEF0; t['alefmaksurainitialarabic'] = 0xFEF3; t['alefmaksuramedialarabic'] = 0xFEF4; t['alefpatahhebrew'] = 0xFB2E; t['alefqamatshebrew'] = 0xFB2F; t['aleph'] = 0x2135; t['allequal'] = 0x224C; t['alpha'] = 0x03B1; t['alphatonos'] = 0x03AC; t['amacron'] = 0x0101; t['amonospace'] = 0xFF41; t['ampersand'] = 0x0026; t['ampersandmonospace'] = 0xFF06; t['ampersandsmall'] = 0xF726; t['amsquare'] = 0x33C2; t['anbopomofo'] = 0x3122; t['angbopomofo'] = 0x3124; t['angbracketleft'] = 0x3008; // Glyph is missing from Adobe's original list. t['angbracketright'] = 0x3009; // Glyph is missing from Adobe's original list. t['angkhankhuthai'] = 0x0E5A; t['angle'] = 0x2220; t['anglebracketleft'] = 0x3008; t['anglebracketleftvertical'] = 0xFE3F; t['anglebracketright'] = 0x3009; t['anglebracketrightvertical'] = 0xFE40; t['angleleft'] = 0x2329; t['angleright'] = 0x232A; t['angstrom'] = 0x212B; t['anoteleia'] = 0x0387; t['anudattadeva'] = 0x0952; t['anusvarabengali'] = 0x0982; t['anusvaradeva'] = 0x0902; t['anusvaragujarati'] = 0x0A82; t['aogonek'] = 0x0105; t['apaatosquare'] = 0x3300; t['aparen'] = 0x249C; t['apostrophearmenian'] = 0x055A; t['apostrophemod'] = 0x02BC; t['apple'] = 0xF8FF; t['approaches'] = 0x2250; t['approxequal'] = 0x2248; t['approxequalorimage'] = 0x2252; t['approximatelyequal'] = 0x2245; t['araeaekorean'] = 0x318E; t['araeakorean'] = 0x318D; t['arc'] = 0x2312; t['arighthalfring'] = 0x1E9A; t['aring'] = 0x00E5; t['aringacute'] = 0x01FB; t['aringbelow'] = 0x1E01; t['arrowboth'] = 0x2194; t['arrowdashdown'] = 0x21E3; t['arrowdashleft'] = 0x21E0; t['arrowdashright'] = 0x21E2; t['arrowdashup'] = 0x21E1; t['arrowdblboth'] = 0x21D4; t['arrowdbldown'] = 0x21D3; t['arrowdblleft'] = 0x21D0; t['arrowdblright'] = 0x21D2; t['arrowdblup'] = 0x21D1; t['arrowdown'] = 0x2193; t['arrowdownleft'] = 0x2199; t['arrowdownright'] = 0x2198; t['arrowdownwhite'] = 0x21E9; t['arrowheaddownmod'] = 0x02C5; t['arrowheadleftmod'] = 0x02C2; t['arrowheadrightmod'] = 0x02C3; t['arrowheadupmod'] = 0x02C4; t['arrowhorizex'] = 0xF8E7; t['arrowleft'] = 0x2190; t['arrowleftdbl'] = 0x21D0; t['arrowleftdblstroke'] = 0x21CD; t['arrowleftoverright'] = 0x21C6; t['arrowleftwhite'] = 0x21E6; t['arrowright'] = 0x2192; t['arrowrightdblstroke'] = 0x21CF; t['arrowrightheavy'] = 0x279E; t['arrowrightoverleft'] = 0x21C4; t['arrowrightwhite'] = 0x21E8; t['arrowtableft'] = 0x21E4; t['arrowtabright'] = 0x21E5; t['arrowup'] = 0x2191; t['arrowupdn'] = 0x2195; t['arrowupdnbse'] = 0x21A8; t['arrowupdownbase'] = 0x21A8; t['arrowupleft'] = 0x2196; t['arrowupleftofdown'] = 0x21C5; t['arrowupright'] = 0x2197; t['arrowupwhite'] = 0x21E7; t['arrowvertex'] = 0xF8E6; t['asciicircum'] = 0x005E; t['asciicircummonospace'] = 0xFF3E; t['asciitilde'] = 0x007E; t['asciitildemonospace'] = 0xFF5E; t['ascript'] = 0x0251; t['ascriptturned'] = 0x0252; t['asmallhiragana'] = 0x3041; t['asmallkatakana'] = 0x30A1; t['asmallkatakanahalfwidth'] = 0xFF67; t['asterisk'] = 0x002A; t['asteriskaltonearabic'] = 0x066D; t['asteriskarabic'] = 0x066D; t['asteriskmath'] = 0x2217; t['asteriskmonospace'] = 0xFF0A; t['asterisksmall'] = 0xFE61; t['asterism'] = 0x2042; t['asuperior'] = 0xF6E9; t['asymptoticallyequal'] = 0x2243; t['at'] = 0x0040; t['atilde'] = 0x00E3; t['atmonospace'] = 0xFF20; t['atsmall'] = 0xFE6B; t['aturned'] = 0x0250; t['aubengali'] = 0x0994; t['aubopomofo'] = 0x3120; t['audeva'] = 0x0914; t['augujarati'] = 0x0A94; t['augurmukhi'] = 0x0A14; t['aulengthmarkbengali'] = 0x09D7; t['aumatragurmukhi'] = 0x0A4C; t['auvowelsignbengali'] = 0x09CC; t['auvowelsigndeva'] = 0x094C; t['auvowelsigngujarati'] = 0x0ACC; t['avagrahadeva'] = 0x093D; t['aybarmenian'] = 0x0561; t['ayin'] = 0x05E2; t['ayinaltonehebrew'] = 0xFB20; t['ayinhebrew'] = 0x05E2; t['b'] = 0x0062; t['babengali'] = 0x09AC; t['backslash'] = 0x005C; t['backslashmonospace'] = 0xFF3C; t['badeva'] = 0x092C; t['bagujarati'] = 0x0AAC; t['bagurmukhi'] = 0x0A2C; t['bahiragana'] = 0x3070; t['bahtthai'] = 0x0E3F; t['bakatakana'] = 0x30D0; t['bar'] = 0x007C; t['barmonospace'] = 0xFF5C; t['bbopomofo'] = 0x3105; t['bcircle'] = 0x24D1; t['bdotaccent'] = 0x1E03; t['bdotbelow'] = 0x1E05; t['beamedsixteenthnotes'] = 0x266C; t['because'] = 0x2235; t['becyrillic'] = 0x0431; t['beharabic'] = 0x0628; t['behfinalarabic'] = 0xFE90; t['behinitialarabic'] = 0xFE91; t['behiragana'] = 0x3079; t['behmedialarabic'] = 0xFE92; t['behmeeminitialarabic'] = 0xFC9F; t['behmeemisolatedarabic'] = 0xFC08; t['behnoonfinalarabic'] = 0xFC6D; t['bekatakana'] = 0x30D9; t['benarmenian'] = 0x0562; t['bet'] = 0x05D1; t['beta'] = 0x03B2; t['betasymbolgreek'] = 0x03D0; t['betdagesh'] = 0xFB31; t['betdageshhebrew'] = 0xFB31; t['bethebrew'] = 0x05D1; t['betrafehebrew'] = 0xFB4C; t['bhabengali'] = 0x09AD; t['bhadeva'] = 0x092D; t['bhagujarati'] = 0x0AAD; t['bhagurmukhi'] = 0x0A2D; t['bhook'] = 0x0253; t['bihiragana'] = 0x3073; t['bikatakana'] = 0x30D3; t['bilabialclick'] = 0x0298; t['bindigurmukhi'] = 0x0A02; t['birusquare'] = 0x3331; t['blackcircle'] = 0x25CF; t['blackdiamond'] = 0x25C6; t['blackdownpointingtriangle'] = 0x25BC; t['blackleftpointingpointer'] = 0x25C4; t['blackleftpointingtriangle'] = 0x25C0; t['blacklenticularbracketleft'] = 0x3010; t['blacklenticularbracketleftvertical'] = 0xFE3B; t['blacklenticularbracketright'] = 0x3011; t['blacklenticularbracketrightvertical'] = 0xFE3C; t['blacklowerlefttriangle'] = 0x25E3; t['blacklowerrighttriangle'] = 0x25E2; t['blackrectangle'] = 0x25AC; t['blackrightpointingpointer'] = 0x25BA; t['blackrightpointingtriangle'] = 0x25B6; t['blacksmallsquare'] = 0x25AA; t['blacksmilingface'] = 0x263B; t['blacksquare'] = 0x25A0; t['blackstar'] = 0x2605; t['blackupperlefttriangle'] = 0x25E4; t['blackupperrighttriangle'] = 0x25E5; t['blackuppointingsmalltriangle'] = 0x25B4; t['blackuppointingtriangle'] = 0x25B2; t['blank'] = 0x2423; t['blinebelow'] = 0x1E07; t['block'] = 0x2588; t['bmonospace'] = 0xFF42; t['bobaimaithai'] = 0x0E1A; t['bohiragana'] = 0x307C; t['bokatakana'] = 0x30DC; t['bparen'] = 0x249D; t['bqsquare'] = 0x33C3; t['braceex'] = 0xF8F4; t['braceleft'] = 0x007B; t['braceleftbt'] = 0xF8F3; t['braceleftmid'] = 0xF8F2; t['braceleftmonospace'] = 0xFF5B; t['braceleftsmall'] = 0xFE5B; t['bracelefttp'] = 0xF8F1; t['braceleftvertical'] = 0xFE37; t['braceright'] = 0x007D; t['bracerightbt'] = 0xF8FE; t['bracerightmid'] = 0xF8FD; t['bracerightmonospace'] = 0xFF5D; t['bracerightsmall'] = 0xFE5C; t['bracerighttp'] = 0xF8FC; t['bracerightvertical'] = 0xFE38; t['bracketleft'] = 0x005B; t['bracketleftbt'] = 0xF8F0; t['bracketleftex'] = 0xF8EF; t['bracketleftmonospace'] = 0xFF3B; t['bracketlefttp'] = 0xF8EE; t['bracketright'] = 0x005D; t['bracketrightbt'] = 0xF8FB; t['bracketrightex'] = 0xF8FA; t['bracketrightmonospace'] = 0xFF3D; t['bracketrighttp'] = 0xF8F9; t['breve'] = 0x02D8; t['brevebelowcmb'] = 0x032E; t['brevecmb'] = 0x0306; t['breveinvertedbelowcmb'] = 0x032F; t['breveinvertedcmb'] = 0x0311; t['breveinverteddoublecmb'] = 0x0361; t['bridgebelowcmb'] = 0x032A; t['bridgeinvertedbelowcmb'] = 0x033A; t['brokenbar'] = 0x00A6; t['bstroke'] = 0x0180; t['bsuperior'] = 0xF6EA; t['btopbar'] = 0x0183; t['buhiragana'] = 0x3076; t['bukatakana'] = 0x30D6; t['bullet'] = 0x2022; t['bulletinverse'] = 0x25D8; t['bulletoperator'] = 0x2219; t['bullseye'] = 0x25CE; t['c'] = 0x0063; t['caarmenian'] = 0x056E; t['cabengali'] = 0x099A; t['cacute'] = 0x0107; t['cadeva'] = 0x091A; t['cagujarati'] = 0x0A9A; t['cagurmukhi'] = 0x0A1A; t['calsquare'] = 0x3388; t['candrabindubengali'] = 0x0981; t['candrabinducmb'] = 0x0310; t['candrabindudeva'] = 0x0901; t['candrabindugujarati'] = 0x0A81; t['capslock'] = 0x21EA; t['careof'] = 0x2105; t['caron'] = 0x02C7; t['caronbelowcmb'] = 0x032C; t['caroncmb'] = 0x030C; t['carriagereturn'] = 0x21B5; t['cbopomofo'] = 0x3118; t['ccaron'] = 0x010D; t['ccedilla'] = 0x00E7; t['ccedillaacute'] = 0x1E09; t['ccircle'] = 0x24D2; t['ccircumflex'] = 0x0109; t['ccurl'] = 0x0255; t['cdot'] = 0x010B; t['cdotaccent'] = 0x010B; t['cdsquare'] = 0x33C5; t['cedilla'] = 0x00B8; t['cedillacmb'] = 0x0327; t['cent'] = 0x00A2; t['centigrade'] = 0x2103; t['centinferior'] = 0xF6DF; t['centmonospace'] = 0xFFE0; t['centoldstyle'] = 0xF7A2; t['centsuperior'] = 0xF6E0; t['chaarmenian'] = 0x0579; t['chabengali'] = 0x099B; t['chadeva'] = 0x091B; t['chagujarati'] = 0x0A9B; t['chagurmukhi'] = 0x0A1B; t['chbopomofo'] = 0x3114; t['cheabkhasiancyrillic'] = 0x04BD; t['checkmark'] = 0x2713; t['checyrillic'] = 0x0447; t['chedescenderabkhasiancyrillic'] = 0x04BF; t['chedescendercyrillic'] = 0x04B7; t['chedieresiscyrillic'] = 0x04F5; t['cheharmenian'] = 0x0573; t['chekhakassiancyrillic'] = 0x04CC; t['cheverticalstrokecyrillic'] = 0x04B9; t['chi'] = 0x03C7; t['chieuchacirclekorean'] = 0x3277; t['chieuchaparenkorean'] = 0x3217; t['chieuchcirclekorean'] = 0x3269; t['chieuchkorean'] = 0x314A; t['chieuchparenkorean'] = 0x3209; t['chochangthai'] = 0x0E0A; t['chochanthai'] = 0x0E08; t['chochingthai'] = 0x0E09; t['chochoethai'] = 0x0E0C; t['chook'] = 0x0188; t['cieucacirclekorean'] = 0x3276; t['cieucaparenkorean'] = 0x3216; t['cieuccirclekorean'] = 0x3268; t['cieuckorean'] = 0x3148; t['cieucparenkorean'] = 0x3208; t['cieucuparenkorean'] = 0x321C; t['circle'] = 0x25CB; t['circlecopyrt'] = 0x00A9; // Glyph is missing from Adobe's original list. t['circlemultiply'] = 0x2297; t['circleot'] = 0x2299; t['circleplus'] = 0x2295; t['circlepostalmark'] = 0x3036; t['circlewithlefthalfblack'] = 0x25D0; t['circlewithrighthalfblack'] = 0x25D1; t['circumflex'] = 0x02C6; t['circumflexbelowcmb'] = 0x032D; t['circumflexcmb'] = 0x0302; t['clear'] = 0x2327; t['clickalveolar'] = 0x01C2; t['clickdental'] = 0x01C0; t['clicklateral'] = 0x01C1; t['clickretroflex'] = 0x01C3; t['club'] = 0x2663; t['clubsuitblack'] = 0x2663; t['clubsuitwhite'] = 0x2667; t['cmcubedsquare'] = 0x33A4; t['cmonospace'] = 0xFF43; t['cmsquaredsquare'] = 0x33A0; t['coarmenian'] = 0x0581; t['colon'] = 0x003A; t['colonmonetary'] = 0x20A1; t['colonmonospace'] = 0xFF1A; t['colonsign'] = 0x20A1; t['colonsmall'] = 0xFE55; t['colontriangularhalfmod'] = 0x02D1; t['colontriangularmod'] = 0x02D0; t['comma'] = 0x002C; t['commaabovecmb'] = 0x0313; t['commaaboverightcmb'] = 0x0315; t['commaaccent'] = 0xF6C3; t['commaarabic'] = 0x060C; t['commaarmenian'] = 0x055D; t['commainferior'] = 0xF6E1; t['commamonospace'] = 0xFF0C; t['commareversedabovecmb'] = 0x0314; t['commareversedmod'] = 0x02BD; t['commasmall'] = 0xFE50; t['commasuperior'] = 0xF6E2; t['commaturnedabovecmb'] = 0x0312; t['commaturnedmod'] = 0x02BB; t['compass'] = 0x263C; t['congruent'] = 0x2245; t['contourintegral'] = 0x222E; t['control'] = 0x2303; t['controlACK'] = 0x0006; t['controlBEL'] = 0x0007; t['controlBS'] = 0x0008; t['controlCAN'] = 0x0018; t['controlCR'] = 0x000D; t['controlDC1'] = 0x0011; t['controlDC2'] = 0x0012; t['controlDC3'] = 0x0013; t['controlDC4'] = 0x0014; t['controlDEL'] = 0x007F; t['controlDLE'] = 0x0010; t['controlEM'] = 0x0019; t['controlENQ'] = 0x0005; t['controlEOT'] = 0x0004; t['controlESC'] = 0x001B; t['controlETB'] = 0x0017; t['controlETX'] = 0x0003; t['controlFF'] = 0x000C; t['controlFS'] = 0x001C; t['controlGS'] = 0x001D; t['controlHT'] = 0x0009; t['controlLF'] = 0x000A; t['controlNAK'] = 0x0015; t['controlRS'] = 0x001E; t['controlSI'] = 0x000F; t['controlSO'] = 0x000E; t['controlSOT'] = 0x0002; t['controlSTX'] = 0x0001; t['controlSUB'] = 0x001A; t['controlSYN'] = 0x0016; t['controlUS'] = 0x001F; t['controlVT'] = 0x000B; t['copyright'] = 0x00A9; t['copyrightsans'] = 0xF8E9; t['copyrightserif'] = 0xF6D9; t['cornerbracketleft'] = 0x300C; t['cornerbracketlefthalfwidth'] = 0xFF62; t['cornerbracketleftvertical'] = 0xFE41; t['cornerbracketright'] = 0x300D; t['cornerbracketrighthalfwidth'] = 0xFF63; t['cornerbracketrightvertical'] = 0xFE42; t['corporationsquare'] = 0x337F; t['cosquare'] = 0x33C7; t['coverkgsquare'] = 0x33C6; t['cparen'] = 0x249E; t['cruzeiro'] = 0x20A2; t['cstretched'] = 0x0297; t['curlyand'] = 0x22CF; t['curlyor'] = 0x22CE; t['currency'] = 0x00A4; t['cyrBreve'] = 0xF6D1; t['cyrFlex'] = 0xF6D2; t['cyrbreve'] = 0xF6D4; t['cyrflex'] = 0xF6D5; t['d'] = 0x0064; t['daarmenian'] = 0x0564; t['dabengali'] = 0x09A6; t['dadarabic'] = 0x0636; t['dadeva'] = 0x0926; t['dadfinalarabic'] = 0xFEBE; t['dadinitialarabic'] = 0xFEBF; t['dadmedialarabic'] = 0xFEC0; t['dagesh'] = 0x05BC; t['dageshhebrew'] = 0x05BC; t['dagger'] = 0x2020; t['daggerdbl'] = 0x2021; t['dagujarati'] = 0x0AA6; t['dagurmukhi'] = 0x0A26; t['dahiragana'] = 0x3060; t['dakatakana'] = 0x30C0; t['dalarabic'] = 0x062F; t['dalet'] = 0x05D3; t['daletdagesh'] = 0xFB33; t['daletdageshhebrew'] = 0xFB33; t['dalethebrew'] = 0x05D3; t['dalfinalarabic'] = 0xFEAA; t['dammaarabic'] = 0x064F; t['dammalowarabic'] = 0x064F; t['dammatanaltonearabic'] = 0x064C; t['dammatanarabic'] = 0x064C; t['danda'] = 0x0964; t['dargahebrew'] = 0x05A7; t['dargalefthebrew'] = 0x05A7; t['dasiapneumatacyrilliccmb'] = 0x0485; t['dblGrave'] = 0xF6D3; t['dblanglebracketleft'] = 0x300A; t['dblanglebracketleftvertical'] = 0xFE3D; t['dblanglebracketright'] = 0x300B; t['dblanglebracketrightvertical'] = 0xFE3E; t['dblarchinvertedbelowcmb'] = 0x032B; t['dblarrowleft'] = 0x21D4; t['dblarrowright'] = 0x21D2; t['dbldanda'] = 0x0965; t['dblgrave'] = 0xF6D6; t['dblgravecmb'] = 0x030F; t['dblintegral'] = 0x222C; t['dbllowline'] = 0x2017; t['dbllowlinecmb'] = 0x0333; t['dbloverlinecmb'] = 0x033F; t['dblprimemod'] = 0x02BA; t['dblverticalbar'] = 0x2016; t['dblverticallineabovecmb'] = 0x030E; t['dbopomofo'] = 0x3109; t['dbsquare'] = 0x33C8; t['dcaron'] = 0x010F; t['dcedilla'] = 0x1E11; t['dcircle'] = 0x24D3; t['dcircumflexbelow'] = 0x1E13; t['dcroat'] = 0x0111; t['ddabengali'] = 0x09A1; t['ddadeva'] = 0x0921; t['ddagujarati'] = 0x0AA1; t['ddagurmukhi'] = 0x0A21; t['ddalarabic'] = 0x0688; t['ddalfinalarabic'] = 0xFB89; t['dddhadeva'] = 0x095C; t['ddhabengali'] = 0x09A2; t['ddhadeva'] = 0x0922; t['ddhagujarati'] = 0x0AA2; t['ddhagurmukhi'] = 0x0A22; t['ddotaccent'] = 0x1E0B; t['ddotbelow'] = 0x1E0D; t['decimalseparatorarabic'] = 0x066B; t['decimalseparatorpersian'] = 0x066B; t['decyrillic'] = 0x0434; t['degree'] = 0x00B0; t['dehihebrew'] = 0x05AD; t['dehiragana'] = 0x3067; t['deicoptic'] = 0x03EF; t['dekatakana'] = 0x30C7; t['deleteleft'] = 0x232B; t['deleteright'] = 0x2326; t['delta'] = 0x03B4; t['deltaturned'] = 0x018D; t['denominatorminusonenumeratorbengali'] = 0x09F8; t['dezh'] = 0x02A4; t['dhabengali'] = 0x09A7; t['dhadeva'] = 0x0927; t['dhagujarati'] = 0x0AA7; t['dhagurmukhi'] = 0x0A27; t['dhook'] = 0x0257; t['dialytikatonos'] = 0x0385; t['dialytikatonoscmb'] = 0x0344; t['diamond'] = 0x2666; t['diamondsuitwhite'] = 0x2662; t['dieresis'] = 0x00A8; t['dieresisacute'] = 0xF6D7; t['dieresisbelowcmb'] = 0x0324; t['dieresiscmb'] = 0x0308; t['dieresisgrave'] = 0xF6D8; t['dieresistonos'] = 0x0385; t['dihiragana'] = 0x3062; t['dikatakana'] = 0x30C2; t['dittomark'] = 0x3003; t['divide'] = 0x00F7; t['divides'] = 0x2223; t['divisionslash'] = 0x2215; t['djecyrillic'] = 0x0452; t['dkshade'] = 0x2593; t['dlinebelow'] = 0x1E0F; t['dlsquare'] = 0x3397; t['dmacron'] = 0x0111; t['dmonospace'] = 0xFF44; t['dnblock'] = 0x2584; t['dochadathai'] = 0x0E0E; t['dodekthai'] = 0x0E14; t['dohiragana'] = 0x3069; t['dokatakana'] = 0x30C9; t['dollar'] = 0x0024; t['dollarinferior'] = 0xF6E3; t['dollarmonospace'] = 0xFF04; t['dollaroldstyle'] = 0xF724; t['dollarsmall'] = 0xFE69; t['dollarsuperior'] = 0xF6E4; t['dong'] = 0x20AB; t['dorusquare'] = 0x3326; t['dotaccent'] = 0x02D9; t['dotaccentcmb'] = 0x0307; t['dotbelowcmb'] = 0x0323; t['dotbelowcomb'] = 0x0323; t['dotkatakana'] = 0x30FB; t['dotlessi'] = 0x0131; t['dotlessj'] = 0xF6BE; t['dotlessjstrokehook'] = 0x0284; t['dotmath'] = 0x22C5; t['dottedcircle'] = 0x25CC; t['doubleyodpatah'] = 0xFB1F; t['doubleyodpatahhebrew'] = 0xFB1F; t['downtackbelowcmb'] = 0x031E; t['downtackmod'] = 0x02D5; t['dparen'] = 0x249F; t['dsuperior'] = 0xF6EB; t['dtail'] = 0x0256; t['dtopbar'] = 0x018C; t['duhiragana'] = 0x3065; t['dukatakana'] = 0x30C5; t['dz'] = 0x01F3; t['dzaltone'] = 0x02A3; t['dzcaron'] = 0x01C6; t['dzcurl'] = 0x02A5; t['dzeabkhasiancyrillic'] = 0x04E1; t['dzecyrillic'] = 0x0455; t['dzhecyrillic'] = 0x045F; t['e'] = 0x0065; t['eacute'] = 0x00E9; t['earth'] = 0x2641; t['ebengali'] = 0x098F; t['ebopomofo'] = 0x311C; t['ebreve'] = 0x0115; t['ecandradeva'] = 0x090D; t['ecandragujarati'] = 0x0A8D; t['ecandravowelsigndeva'] = 0x0945; t['ecandravowelsigngujarati'] = 0x0AC5; t['ecaron'] = 0x011B; t['ecedillabreve'] = 0x1E1D; t['echarmenian'] = 0x0565; t['echyiwnarmenian'] = 0x0587; t['ecircle'] = 0x24D4; t['ecircumflex'] = 0x00EA; t['ecircumflexacute'] = 0x1EBF; t['ecircumflexbelow'] = 0x1E19; t['ecircumflexdotbelow'] = 0x1EC7; t['ecircumflexgrave'] = 0x1EC1; t['ecircumflexhookabove'] = 0x1EC3; t['ecircumflextilde'] = 0x1EC5; t['ecyrillic'] = 0x0454; t['edblgrave'] = 0x0205; t['edeva'] = 0x090F; t['edieresis'] = 0x00EB; t['edot'] = 0x0117; t['edotaccent'] = 0x0117; t['edotbelow'] = 0x1EB9; t['eegurmukhi'] = 0x0A0F; t['eematragurmukhi'] = 0x0A47; t['efcyrillic'] = 0x0444; t['egrave'] = 0x00E8; t['egujarati'] = 0x0A8F; t['eharmenian'] = 0x0567; t['ehbopomofo'] = 0x311D; t['ehiragana'] = 0x3048; t['ehookabove'] = 0x1EBB; t['eibopomofo'] = 0x311F; t['eight'] = 0x0038; t['eightarabic'] = 0x0668; t['eightbengali'] = 0x09EE; t['eightcircle'] = 0x2467; t['eightcircleinversesansserif'] = 0x2791; t['eightdeva'] = 0x096E; t['eighteencircle'] = 0x2471; t['eighteenparen'] = 0x2485; t['eighteenperiod'] = 0x2499; t['eightgujarati'] = 0x0AEE; t['eightgurmukhi'] = 0x0A6E; t['eighthackarabic'] = 0x0668; t['eighthangzhou'] = 0x3028; t['eighthnotebeamed'] = 0x266B; t['eightideographicparen'] = 0x3227; t['eightinferior'] = 0x2088; t['eightmonospace'] = 0xFF18; t['eightoldstyle'] = 0xF738; t['eightparen'] = 0x247B; t['eightperiod'] = 0x248F; t['eightpersian'] = 0x06F8; t['eightroman'] = 0x2177; t['eightsuperior'] = 0x2078; t['eightthai'] = 0x0E58; t['einvertedbreve'] = 0x0207; t['eiotifiedcyrillic'] = 0x0465; t['ekatakana'] = 0x30A8; t['ekatakanahalfwidth'] = 0xFF74; t['ekonkargurmukhi'] = 0x0A74; t['ekorean'] = 0x3154; t['elcyrillic'] = 0x043B; t['element'] = 0x2208; t['elevencircle'] = 0x246A; t['elevenparen'] = 0x247E; t['elevenperiod'] = 0x2492; t['elevenroman'] = 0x217A; t['ellipsis'] = 0x2026; t['ellipsisvertical'] = 0x22EE; t['emacron'] = 0x0113; t['emacronacute'] = 0x1E17; t['emacrongrave'] = 0x1E15; t['emcyrillic'] = 0x043C; t['emdash'] = 0x2014; t['emdashvertical'] = 0xFE31; t['emonospace'] = 0xFF45; t['emphasismarkarmenian'] = 0x055B; t['emptyset'] = 0x2205; t['enbopomofo'] = 0x3123; t['encyrillic'] = 0x043D; t['endash'] = 0x2013; t['endashvertical'] = 0xFE32; t['endescendercyrillic'] = 0x04A3; t['eng'] = 0x014B; t['engbopomofo'] = 0x3125; t['enghecyrillic'] = 0x04A5; t['enhookcyrillic'] = 0x04C8; t['enspace'] = 0x2002; t['eogonek'] = 0x0119; t['eokorean'] = 0x3153; t['eopen'] = 0x025B; t['eopenclosed'] = 0x029A; t['eopenreversed'] = 0x025C; t['eopenreversedclosed'] = 0x025E; t['eopenreversedhook'] = 0x025D; t['eparen'] = 0x24A0; t['epsilon'] = 0x03B5; t['epsilontonos'] = 0x03AD; t['equal'] = 0x003D; t['equalmonospace'] = 0xFF1D; t['equalsmall'] = 0xFE66; t['equalsuperior'] = 0x207C; t['equivalence'] = 0x2261; t['erbopomofo'] = 0x3126; t['ercyrillic'] = 0x0440; t['ereversed'] = 0x0258; t['ereversedcyrillic'] = 0x044D; t['escyrillic'] = 0x0441; t['esdescendercyrillic'] = 0x04AB; t['esh'] = 0x0283; t['eshcurl'] = 0x0286; t['eshortdeva'] = 0x090E; t['eshortvowelsigndeva'] = 0x0946; t['eshreversedloop'] = 0x01AA; t['eshsquatreversed'] = 0x0285; t['esmallhiragana'] = 0x3047; t['esmallkatakana'] = 0x30A7; t['esmallkatakanahalfwidth'] = 0xFF6A; t['estimated'] = 0x212E; t['esuperior'] = 0xF6EC; t['eta'] = 0x03B7; t['etarmenian'] = 0x0568; t['etatonos'] = 0x03AE; t['eth'] = 0x00F0; t['etilde'] = 0x1EBD; t['etildebelow'] = 0x1E1B; t['etnahtafoukhhebrew'] = 0x0591; t['etnahtafoukhlefthebrew'] = 0x0591; t['etnahtahebrew'] = 0x0591; t['etnahtalefthebrew'] = 0x0591; t['eturned'] = 0x01DD; t['eukorean'] = 0x3161; t['euro'] = 0x20AC; t['evowelsignbengali'] = 0x09C7; t['evowelsigndeva'] = 0x0947; t['evowelsigngujarati'] = 0x0AC7; t['exclam'] = 0x0021; t['exclamarmenian'] = 0x055C; t['exclamdbl'] = 0x203C; t['exclamdown'] = 0x00A1; t['exclamdownsmall'] = 0xF7A1; t['exclammonospace'] = 0xFF01; t['exclamsmall'] = 0xF721; t['existential'] = 0x2203; t['ezh'] = 0x0292; t['ezhcaron'] = 0x01EF; t['ezhcurl'] = 0x0293; t['ezhreversed'] = 0x01B9; t['ezhtail'] = 0x01BA; t['f'] = 0x0066; t['fadeva'] = 0x095E; t['fagurmukhi'] = 0x0A5E; t['fahrenheit'] = 0x2109; t['fathaarabic'] = 0x064E; t['fathalowarabic'] = 0x064E; t['fathatanarabic'] = 0x064B; t['fbopomofo'] = 0x3108; t['fcircle'] = 0x24D5; t['fdotaccent'] = 0x1E1F; t['feharabic'] = 0x0641; t['feharmenian'] = 0x0586; t['fehfinalarabic'] = 0xFED2; t['fehinitialarabic'] = 0xFED3; t['fehmedialarabic'] = 0xFED4; t['feicoptic'] = 0x03E5; t['female'] = 0x2640; t['ff'] = 0xFB00; t['ffi'] = 0xFB03; t['ffl'] = 0xFB04; t['fi'] = 0xFB01; t['fifteencircle'] = 0x246E; t['fifteenparen'] = 0x2482; t['fifteenperiod'] = 0x2496; t['figuredash'] = 0x2012; t['filledbox'] = 0x25A0; t['filledrect'] = 0x25AC; t['finalkaf'] = 0x05DA; t['finalkafdagesh'] = 0xFB3A; t['finalkafdageshhebrew'] = 0xFB3A; t['finalkafhebrew'] = 0x05DA; t['finalmem'] = 0x05DD; t['finalmemhebrew'] = 0x05DD; t['finalnun'] = 0x05DF; t['finalnunhebrew'] = 0x05DF; t['finalpe'] = 0x05E3; t['finalpehebrew'] = 0x05E3; t['finaltsadi'] = 0x05E5; t['finaltsadihebrew'] = 0x05E5; t['firsttonechinese'] = 0x02C9; t['fisheye'] = 0x25C9; t['fitacyrillic'] = 0x0473; t['five'] = 0x0035; t['fivearabic'] = 0x0665; t['fivebengali'] = 0x09EB; t['fivecircle'] = 0x2464; t['fivecircleinversesansserif'] = 0x278E; t['fivedeva'] = 0x096B; t['fiveeighths'] = 0x215D; t['fivegujarati'] = 0x0AEB; t['fivegurmukhi'] = 0x0A6B; t['fivehackarabic'] = 0x0665; t['fivehangzhou'] = 0x3025; t['fiveideographicparen'] = 0x3224; t['fiveinferior'] = 0x2085; t['fivemonospace'] = 0xFF15; t['fiveoldstyle'] = 0xF735; t['fiveparen'] = 0x2478; t['fiveperiod'] = 0x248C; t['fivepersian'] = 0x06F5; t['fiveroman'] = 0x2174; t['fivesuperior'] = 0x2075; t['fivethai'] = 0x0E55; t['fl'] = 0xFB02; t['florin'] = 0x0192; t['fmonospace'] = 0xFF46; t['fmsquare'] = 0x3399; t['fofanthai'] = 0x0E1F; t['fofathai'] = 0x0E1D; t['fongmanthai'] = 0x0E4F; t['forall'] = 0x2200; t['four'] = 0x0034; t['fourarabic'] = 0x0664; t['fourbengali'] = 0x09EA; t['fourcircle'] = 0x2463; t['fourcircleinversesansserif'] = 0x278D; t['fourdeva'] = 0x096A; t['fourgujarati'] = 0x0AEA; t['fourgurmukhi'] = 0x0A6A; t['fourhackarabic'] = 0x0664; t['fourhangzhou'] = 0x3024; t['fourideographicparen'] = 0x3223; t['fourinferior'] = 0x2084; t['fourmonospace'] = 0xFF14; t['fournumeratorbengali'] = 0x09F7; t['fouroldstyle'] = 0xF734; t['fourparen'] = 0x2477; t['fourperiod'] = 0x248B; t['fourpersian'] = 0x06F4; t['fourroman'] = 0x2173; t['foursuperior'] = 0x2074; t['fourteencircle'] = 0x246D; t['fourteenparen'] = 0x2481; t['fourteenperiod'] = 0x2495; t['fourthai'] = 0x0E54; t['fourthtonechinese'] = 0x02CB; t['fparen'] = 0x24A1; t['fraction'] = 0x2044; t['franc'] = 0x20A3; t['g'] = 0x0067; t['gabengali'] = 0x0997; t['gacute'] = 0x01F5; t['gadeva'] = 0x0917; t['gafarabic'] = 0x06AF; t['gaffinalarabic'] = 0xFB93; t['gafinitialarabic'] = 0xFB94; t['gafmedialarabic'] = 0xFB95; t['gagujarati'] = 0x0A97; t['gagurmukhi'] = 0x0A17; t['gahiragana'] = 0x304C; t['gakatakana'] = 0x30AC; t['gamma'] = 0x03B3; t['gammalatinsmall'] = 0x0263; t['gammasuperior'] = 0x02E0; t['gangiacoptic'] = 0x03EB; t['gbopomofo'] = 0x310D; t['gbreve'] = 0x011F; t['gcaron'] = 0x01E7; t['gcedilla'] = 0x0123; t['gcircle'] = 0x24D6; t['gcircumflex'] = 0x011D; t['gcommaaccent'] = 0x0123; t['gdot'] = 0x0121; t['gdotaccent'] = 0x0121; t['gecyrillic'] = 0x0433; t['gehiragana'] = 0x3052; t['gekatakana'] = 0x30B2; t['geometricallyequal'] = 0x2251; t['gereshaccenthebrew'] = 0x059C; t['gereshhebrew'] = 0x05F3; t['gereshmuqdamhebrew'] = 0x059D; t['germandbls'] = 0x00DF; t['gershayimaccenthebrew'] = 0x059E; t['gershayimhebrew'] = 0x05F4; t['getamark'] = 0x3013; t['ghabengali'] = 0x0998; t['ghadarmenian'] = 0x0572; t['ghadeva'] = 0x0918; t['ghagujarati'] = 0x0A98; t['ghagurmukhi'] = 0x0A18; t['ghainarabic'] = 0x063A; t['ghainfinalarabic'] = 0xFECE; t['ghaininitialarabic'] = 0xFECF; t['ghainmedialarabic'] = 0xFED0; t['ghemiddlehookcyrillic'] = 0x0495; t['ghestrokecyrillic'] = 0x0493; t['gheupturncyrillic'] = 0x0491; t['ghhadeva'] = 0x095A; t['ghhagurmukhi'] = 0x0A5A; t['ghook'] = 0x0260; t['ghzsquare'] = 0x3393; t['gihiragana'] = 0x304E; t['gikatakana'] = 0x30AE; t['gimarmenian'] = 0x0563; t['gimel'] = 0x05D2; t['gimeldagesh'] = 0xFB32; t['gimeldageshhebrew'] = 0xFB32; t['gimelhebrew'] = 0x05D2; t['gjecyrillic'] = 0x0453; t['glottalinvertedstroke'] = 0x01BE; t['glottalstop'] = 0x0294; t['glottalstopinverted'] = 0x0296; t['glottalstopmod'] = 0x02C0; t['glottalstopreversed'] = 0x0295; t['glottalstopreversedmod'] = 0x02C1; t['glottalstopreversedsuperior'] = 0x02E4; t['glottalstopstroke'] = 0x02A1; t['glottalstopstrokereversed'] = 0x02A2; t['gmacron'] = 0x1E21; t['gmonospace'] = 0xFF47; t['gohiragana'] = 0x3054; t['gokatakana'] = 0x30B4; t['gparen'] = 0x24A2; t['gpasquare'] = 0x33AC; t['gradient'] = 0x2207; t['grave'] = 0x0060; t['gravebelowcmb'] = 0x0316; t['gravecmb'] = 0x0300; t['gravecomb'] = 0x0300; t['gravedeva'] = 0x0953; t['gravelowmod'] = 0x02CE; t['gravemonospace'] = 0xFF40; t['gravetonecmb'] = 0x0340; t['greater'] = 0x003E; t['greaterequal'] = 0x2265; t['greaterequalorless'] = 0x22DB; t['greatermonospace'] = 0xFF1E; t['greaterorequivalent'] = 0x2273; t['greaterorless'] = 0x2277; t['greateroverequal'] = 0x2267; t['greatersmall'] = 0xFE65; t['gscript'] = 0x0261; t['gstroke'] = 0x01E5; t['guhiragana'] = 0x3050; t['guillemotleft'] = 0x00AB; t['guillemotright'] = 0x00BB; t['guilsinglleft'] = 0x2039; t['guilsinglright'] = 0x203A; t['gukatakana'] = 0x30B0; t['guramusquare'] = 0x3318; t['gysquare'] = 0x33C9; t['h'] = 0x0068; t['haabkhasiancyrillic'] = 0x04A9; t['haaltonearabic'] = 0x06C1; t['habengali'] = 0x09B9; t['hadescendercyrillic'] = 0x04B3; t['hadeva'] = 0x0939; t['hagujarati'] = 0x0AB9; t['hagurmukhi'] = 0x0A39; t['haharabic'] = 0x062D; t['hahfinalarabic'] = 0xFEA2; t['hahinitialarabic'] = 0xFEA3; t['hahiragana'] = 0x306F; t['hahmedialarabic'] = 0xFEA4; t['haitusquare'] = 0x332A; t['hakatakana'] = 0x30CF; t['hakatakanahalfwidth'] = 0xFF8A; t['halantgurmukhi'] = 0x0A4D; t['hamzaarabic'] = 0x0621; t['hamzalowarabic'] = 0x0621; t['hangulfiller'] = 0x3164; t['hardsigncyrillic'] = 0x044A; t['harpoonleftbarbup'] = 0x21BC; t['harpoonrightbarbup'] = 0x21C0; t['hasquare'] = 0x33CA; t['hatafpatah'] = 0x05B2; t['hatafpatah16'] = 0x05B2; t['hatafpatah23'] = 0x05B2; t['hatafpatah2f'] = 0x05B2; t['hatafpatahhebrew'] = 0x05B2; t['hatafpatahnarrowhebrew'] = 0x05B2; t['hatafpatahquarterhebrew'] = 0x05B2; t['hatafpatahwidehebrew'] = 0x05B2; t['hatafqamats'] = 0x05B3; t['hatafqamats1b'] = 0x05B3; t['hatafqamats28'] = 0x05B3; t['hatafqamats34'] = 0x05B3; t['hatafqamatshebrew'] = 0x05B3; t['hatafqamatsnarrowhebrew'] = 0x05B3; t['hatafqamatsquarterhebrew'] = 0x05B3; t['hatafqamatswidehebrew'] = 0x05B3; t['hatafsegol'] = 0x05B1; t['hatafsegol17'] = 0x05B1; t['hatafsegol24'] = 0x05B1; t['hatafsegol30'] = 0x05B1; t['hatafsegolhebrew'] = 0x05B1; t['hatafsegolnarrowhebrew'] = 0x05B1; t['hatafsegolquarterhebrew'] = 0x05B1; t['hatafsegolwidehebrew'] = 0x05B1; t['hbar'] = 0x0127; t['hbopomofo'] = 0x310F; t['hbrevebelow'] = 0x1E2B; t['hcedilla'] = 0x1E29; t['hcircle'] = 0x24D7; t['hcircumflex'] = 0x0125; t['hdieresis'] = 0x1E27; t['hdotaccent'] = 0x1E23; t['hdotbelow'] = 0x1E25; t['he'] = 0x05D4; t['heart'] = 0x2665; t['heartsuitblack'] = 0x2665; t['heartsuitwhite'] = 0x2661; t['hedagesh'] = 0xFB34; t['hedageshhebrew'] = 0xFB34; t['hehaltonearabic'] = 0x06C1; t['heharabic'] = 0x0647; t['hehebrew'] = 0x05D4; t['hehfinalaltonearabic'] = 0xFBA7; t['hehfinalalttwoarabic'] = 0xFEEA; t['hehfinalarabic'] = 0xFEEA; t['hehhamzaabovefinalarabic'] = 0xFBA5; t['hehhamzaaboveisolatedarabic'] = 0xFBA4; t['hehinitialaltonearabic'] = 0xFBA8; t['hehinitialarabic'] = 0xFEEB; t['hehiragana'] = 0x3078; t['hehmedialaltonearabic'] = 0xFBA9; t['hehmedialarabic'] = 0xFEEC; t['heiseierasquare'] = 0x337B; t['hekatakana'] = 0x30D8; t['hekatakanahalfwidth'] = 0xFF8D; t['hekutaarusquare'] = 0x3336; t['henghook'] = 0x0267; t['herutusquare'] = 0x3339; t['het'] = 0x05D7; t['hethebrew'] = 0x05D7; t['hhook'] = 0x0266; t['hhooksuperior'] = 0x02B1; t['hieuhacirclekorean'] = 0x327B; t['hieuhaparenkorean'] = 0x321B; t['hieuhcirclekorean'] = 0x326D; t['hieuhkorean'] = 0x314E; t['hieuhparenkorean'] = 0x320D; t['hihiragana'] = 0x3072; t['hikatakana'] = 0x30D2; t['hikatakanahalfwidth'] = 0xFF8B; t['hiriq'] = 0x05B4; t['hiriq14'] = 0x05B4; t['hiriq21'] = 0x05B4; t['hiriq2d'] = 0x05B4; t['hiriqhebrew'] = 0x05B4; t['hiriqnarrowhebrew'] = 0x05B4; t['hiriqquarterhebrew'] = 0x05B4; t['hiriqwidehebrew'] = 0x05B4; t['hlinebelow'] = 0x1E96; t['hmonospace'] = 0xFF48; t['hoarmenian'] = 0x0570; t['hohipthai'] = 0x0E2B; t['hohiragana'] = 0x307B; t['hokatakana'] = 0x30DB; t['hokatakanahalfwidth'] = 0xFF8E; t['holam'] = 0x05B9; t['holam19'] = 0x05B9; t['holam26'] = 0x05B9; t['holam32'] = 0x05B9; t['holamhebrew'] = 0x05B9; t['holamnarrowhebrew'] = 0x05B9; t['holamquarterhebrew'] = 0x05B9; t['holamwidehebrew'] = 0x05B9; t['honokhukthai'] = 0x0E2E; t['hookabovecomb'] = 0x0309; t['hookcmb'] = 0x0309; t['hookpalatalizedbelowcmb'] = 0x0321; t['hookretroflexbelowcmb'] = 0x0322; t['hoonsquare'] = 0x3342; t['horicoptic'] = 0x03E9; t['horizontalbar'] = 0x2015; t['horncmb'] = 0x031B; t['hotsprings'] = 0x2668; t['house'] = 0x2302; t['hparen'] = 0x24A3; t['hsuperior'] = 0x02B0; t['hturned'] = 0x0265; t['huhiragana'] = 0x3075; t['huiitosquare'] = 0x3333; t['hukatakana'] = 0x30D5; t['hukatakanahalfwidth'] = 0xFF8C; t['hungarumlaut'] = 0x02DD; t['hungarumlautcmb'] = 0x030B; t['hv'] = 0x0195; t['hyphen'] = 0x002D; t['hypheninferior'] = 0xF6E5; t['hyphenmonospace'] = 0xFF0D; t['hyphensmall'] = 0xFE63; t['hyphensuperior'] = 0xF6E6; t['hyphentwo'] = 0x2010; t['i'] = 0x0069; t['iacute'] = 0x00ED; t['iacyrillic'] = 0x044F; t['ibengali'] = 0x0987; t['ibopomofo'] = 0x3127; t['ibreve'] = 0x012D; t['icaron'] = 0x01D0; t['icircle'] = 0x24D8; t['icircumflex'] = 0x00EE; t['icyrillic'] = 0x0456; t['idblgrave'] = 0x0209; t['ideographearthcircle'] = 0x328F; t['ideographfirecircle'] = 0x328B; t['ideographicallianceparen'] = 0x323F; t['ideographiccallparen'] = 0x323A; t['ideographiccentrecircle'] = 0x32A5; t['ideographicclose'] = 0x3006; t['ideographiccomma'] = 0x3001; t['ideographiccommaleft'] = 0xFF64; t['ideographiccongratulationparen'] = 0x3237; t['ideographiccorrectcircle'] = 0x32A3; t['ideographicearthparen'] = 0x322F; t['ideographicenterpriseparen'] = 0x323D; t['ideographicexcellentcircle'] = 0x329D; t['ideographicfestivalparen'] = 0x3240; t['ideographicfinancialcircle'] = 0x3296; t['ideographicfinancialparen'] = 0x3236; t['ideographicfireparen'] = 0x322B; t['ideographichaveparen'] = 0x3232; t['ideographichighcircle'] = 0x32A4; t['ideographiciterationmark'] = 0x3005; t['ideographiclaborcircle'] = 0x3298; t['ideographiclaborparen'] = 0x3238; t['ideographicleftcircle'] = 0x32A7; t['ideographiclowcircle'] = 0x32A6; t['ideographicmedicinecircle'] = 0x32A9; t['ideographicmetalparen'] = 0x322E; t['ideographicmoonparen'] = 0x322A; t['ideographicnameparen'] = 0x3234; t['ideographicperiod'] = 0x3002; t['ideographicprintcircle'] = 0x329E; t['ideographicreachparen'] = 0x3243; t['ideographicrepresentparen'] = 0x3239; t['ideographicresourceparen'] = 0x323E; t['ideographicrightcircle'] = 0x32A8; t['ideographicsecretcircle'] = 0x3299; t['ideographicselfparen'] = 0x3242; t['ideographicsocietyparen'] = 0x3233; t['ideographicspace'] = 0x3000; t['ideographicspecialparen'] = 0x3235; t['ideographicstockparen'] = 0x3231; t['ideographicstudyparen'] = 0x323B; t['ideographicsunparen'] = 0x3230; t['ideographicsuperviseparen'] = 0x323C; t['ideographicwaterparen'] = 0x322C; t['ideographicwoodparen'] = 0x322D; t['ideographiczero'] = 0x3007; t['ideographmetalcircle'] = 0x328E; t['ideographmooncircle'] = 0x328A; t['ideographnamecircle'] = 0x3294; t['ideographsuncircle'] = 0x3290; t['ideographwatercircle'] = 0x328C; t['ideographwoodcircle'] = 0x328D; t['ideva'] = 0x0907; t['idieresis'] = 0x00EF; t['idieresisacute'] = 0x1E2F; t['idieresiscyrillic'] = 0x04E5; t['idotbelow'] = 0x1ECB; t['iebrevecyrillic'] = 0x04D7; t['iecyrillic'] = 0x0435; t['ieungacirclekorean'] = 0x3275; t['ieungaparenkorean'] = 0x3215; t['ieungcirclekorean'] = 0x3267; t['ieungkorean'] = 0x3147; t['ieungparenkorean'] = 0x3207; t['igrave'] = 0x00EC; t['igujarati'] = 0x0A87; t['igurmukhi'] = 0x0A07; t['ihiragana'] = 0x3044; t['ihookabove'] = 0x1EC9; t['iibengali'] = 0x0988; t['iicyrillic'] = 0x0438; t['iideva'] = 0x0908; t['iigujarati'] = 0x0A88; t['iigurmukhi'] = 0x0A08; t['iimatragurmukhi'] = 0x0A40; t['iinvertedbreve'] = 0x020B; t['iishortcyrillic'] = 0x0439; t['iivowelsignbengali'] = 0x09C0; t['iivowelsigndeva'] = 0x0940; t['iivowelsigngujarati'] = 0x0AC0; t['ij'] = 0x0133; t['ikatakana'] = 0x30A4; t['ikatakanahalfwidth'] = 0xFF72; t['ikorean'] = 0x3163; t['ilde'] = 0x02DC; t['iluyhebrew'] = 0x05AC; t['imacron'] = 0x012B; t['imacroncyrillic'] = 0x04E3; t['imageorapproximatelyequal'] = 0x2253; t['imatragurmukhi'] = 0x0A3F; t['imonospace'] = 0xFF49; t['increment'] = 0x2206; t['infinity'] = 0x221E; t['iniarmenian'] = 0x056B; t['integral'] = 0x222B; t['integralbottom'] = 0x2321; t['integralbt'] = 0x2321; t['integralex'] = 0xF8F5; t['integraltop'] = 0x2320; t['integraltp'] = 0x2320; t['intersection'] = 0x2229; t['intisquare'] = 0x3305; t['invbullet'] = 0x25D8; t['invcircle'] = 0x25D9; t['invsmileface'] = 0x263B; t['iocyrillic'] = 0x0451; t['iogonek'] = 0x012F; t['iota'] = 0x03B9; t['iotadieresis'] = 0x03CA; t['iotadieresistonos'] = 0x0390; t['iotalatin'] = 0x0269; t['iotatonos'] = 0x03AF; t['iparen'] = 0x24A4; t['irigurmukhi'] = 0x0A72; t['ismallhiragana'] = 0x3043; t['ismallkatakana'] = 0x30A3; t['ismallkatakanahalfwidth'] = 0xFF68; t['issharbengali'] = 0x09FA; t['istroke'] = 0x0268; t['isuperior'] = 0xF6ED; t['iterationhiragana'] = 0x309D; t['iterationkatakana'] = 0x30FD; t['itilde'] = 0x0129; t['itildebelow'] = 0x1E2D; t['iubopomofo'] = 0x3129; t['iucyrillic'] = 0x044E; t['ivowelsignbengali'] = 0x09BF; t['ivowelsigndeva'] = 0x093F; t['ivowelsigngujarati'] = 0x0ABF; t['izhitsacyrillic'] = 0x0475; t['izhitsadblgravecyrillic'] = 0x0477; t['j'] = 0x006A; t['jaarmenian'] = 0x0571; t['jabengali'] = 0x099C; t['jadeva'] = 0x091C; t['jagujarati'] = 0x0A9C; t['jagurmukhi'] = 0x0A1C; t['jbopomofo'] = 0x3110; t['jcaron'] = 0x01F0; t['jcircle'] = 0x24D9; t['jcircumflex'] = 0x0135; t['jcrossedtail'] = 0x029D; t['jdotlessstroke'] = 0x025F; t['jecyrillic'] = 0x0458; t['jeemarabic'] = 0x062C; t['jeemfinalarabic'] = 0xFE9E; t['jeeminitialarabic'] = 0xFE9F; t['jeemmedialarabic'] = 0xFEA0; t['jeharabic'] = 0x0698; t['jehfinalarabic'] = 0xFB8B; t['jhabengali'] = 0x099D; t['jhadeva'] = 0x091D; t['jhagujarati'] = 0x0A9D; t['jhagurmukhi'] = 0x0A1D; t['jheharmenian'] = 0x057B; t['jis'] = 0x3004; t['jmonospace'] = 0xFF4A; t['jparen'] = 0x24A5; t['jsuperior'] = 0x02B2; t['k'] = 0x006B; t['kabashkircyrillic'] = 0x04A1; t['kabengali'] = 0x0995; t['kacute'] = 0x1E31; t['kacyrillic'] = 0x043A; t['kadescendercyrillic'] = 0x049B; t['kadeva'] = 0x0915; t['kaf'] = 0x05DB; t['kafarabic'] = 0x0643; t['kafdagesh'] = 0xFB3B; t['kafdageshhebrew'] = 0xFB3B; t['kaffinalarabic'] = 0xFEDA; t['kafhebrew'] = 0x05DB; t['kafinitialarabic'] = 0xFEDB; t['kafmedialarabic'] = 0xFEDC; t['kafrafehebrew'] = 0xFB4D; t['kagujarati'] = 0x0A95; t['kagurmukhi'] = 0x0A15; t['kahiragana'] = 0x304B; t['kahookcyrillic'] = 0x04C4; t['kakatakana'] = 0x30AB; t['kakatakanahalfwidth'] = 0xFF76; t['kappa'] = 0x03BA; t['kappasymbolgreek'] = 0x03F0; t['kapyeounmieumkorean'] = 0x3171; t['kapyeounphieuphkorean'] = 0x3184; t['kapyeounpieupkorean'] = 0x3178; t['kapyeounssangpieupkorean'] = 0x3179; t['karoriisquare'] = 0x330D; t['kashidaautoarabic'] = 0x0640; t['kashidaautonosidebearingarabic'] = 0x0640; t['kasmallkatakana'] = 0x30F5; t['kasquare'] = 0x3384; t['kasraarabic'] = 0x0650; t['kasratanarabic'] = 0x064D; t['kastrokecyrillic'] = 0x049F; t['katahiraprolongmarkhalfwidth'] = 0xFF70; t['kaverticalstrokecyrillic'] = 0x049D; t['kbopomofo'] = 0x310E; t['kcalsquare'] = 0x3389; t['kcaron'] = 0x01E9; t['kcedilla'] = 0x0137; t['kcircle'] = 0x24DA; t['kcommaaccent'] = 0x0137; t['kdotbelow'] = 0x1E33; t['keharmenian'] = 0x0584; t['kehiragana'] = 0x3051; t['kekatakana'] = 0x30B1; t['kekatakanahalfwidth'] = 0xFF79; t['kenarmenian'] = 0x056F; t['kesmallkatakana'] = 0x30F6; t['kgreenlandic'] = 0x0138; t['khabengali'] = 0x0996; t['khacyrillic'] = 0x0445; t['khadeva'] = 0x0916; t['khagujarati'] = 0x0A96; t['khagurmukhi'] = 0x0A16; t['khaharabic'] = 0x062E; t['khahfinalarabic'] = 0xFEA6; t['khahinitialarabic'] = 0xFEA7; t['khahmedialarabic'] = 0xFEA8; t['kheicoptic'] = 0x03E7; t['khhadeva'] = 0x0959; t['khhagurmukhi'] = 0x0A59; t['khieukhacirclekorean'] = 0x3278; t['khieukhaparenkorean'] = 0x3218; t['khieukhcirclekorean'] = 0x326A; t['khieukhkorean'] = 0x314B; t['khieukhparenkorean'] = 0x320A; t['khokhaithai'] = 0x0E02; t['khokhonthai'] = 0x0E05; t['khokhuatthai'] = 0x0E03; t['khokhwaithai'] = 0x0E04; t['khomutthai'] = 0x0E5B; t['khook'] = 0x0199; t['khorakhangthai'] = 0x0E06; t['khzsquare'] = 0x3391; t['kihiragana'] = 0x304D; t['kikatakana'] = 0x30AD; t['kikatakanahalfwidth'] = 0xFF77; t['kiroguramusquare'] = 0x3315; t['kiromeetorusquare'] = 0x3316; t['kirosquare'] = 0x3314; t['kiyeokacirclekorean'] = 0x326E; t['kiyeokaparenkorean'] = 0x320E; t['kiyeokcirclekorean'] = 0x3260; t['kiyeokkorean'] = 0x3131; t['kiyeokparenkorean'] = 0x3200; t['kiyeoksioskorean'] = 0x3133; t['kjecyrillic'] = 0x045C; t['klinebelow'] = 0x1E35; t['klsquare'] = 0x3398; t['kmcubedsquare'] = 0x33A6; t['kmonospace'] = 0xFF4B; t['kmsquaredsquare'] = 0x33A2; t['kohiragana'] = 0x3053; t['kohmsquare'] = 0x33C0; t['kokaithai'] = 0x0E01; t['kokatakana'] = 0x30B3; t['kokatakanahalfwidth'] = 0xFF7A; t['kooposquare'] = 0x331E; t['koppacyrillic'] = 0x0481; t['koreanstandardsymbol'] = 0x327F; t['koroniscmb'] = 0x0343; t['kparen'] = 0x24A6; t['kpasquare'] = 0x33AA; t['ksicyrillic'] = 0x046F; t['ktsquare'] = 0x33CF; t['kturned'] = 0x029E; t['kuhiragana'] = 0x304F; t['kukatakana'] = 0x30AF; t['kukatakanahalfwidth'] = 0xFF78; t['kvsquare'] = 0x33B8; t['kwsquare'] = 0x33BE; t['l'] = 0x006C; t['labengali'] = 0x09B2; t['lacute'] = 0x013A; t['ladeva'] = 0x0932; t['lagujarati'] = 0x0AB2; t['lagurmukhi'] = 0x0A32; t['lakkhangyaothai'] = 0x0E45; t['lamaleffinalarabic'] = 0xFEFC; t['lamalefhamzaabovefinalarabic'] = 0xFEF8; t['lamalefhamzaaboveisolatedarabic'] = 0xFEF7; t['lamalefhamzabelowfinalarabic'] = 0xFEFA; t['lamalefhamzabelowisolatedarabic'] = 0xFEF9; t['lamalefisolatedarabic'] = 0xFEFB; t['lamalefmaddaabovefinalarabic'] = 0xFEF6; t['lamalefmaddaaboveisolatedarabic'] = 0xFEF5; t['lamarabic'] = 0x0644; t['lambda'] = 0x03BB; t['lambdastroke'] = 0x019B; t['lamed'] = 0x05DC; t['lameddagesh'] = 0xFB3C; t['lameddageshhebrew'] = 0xFB3C; t['lamedhebrew'] = 0x05DC; t['lamfinalarabic'] = 0xFEDE; t['lamhahinitialarabic'] = 0xFCCA; t['laminitialarabic'] = 0xFEDF; t['lamjeeminitialarabic'] = 0xFCC9; t['lamkhahinitialarabic'] = 0xFCCB; t['lamlamhehisolatedarabic'] = 0xFDF2; t['lammedialarabic'] = 0xFEE0; t['lammeemhahinitialarabic'] = 0xFD88; t['lammeeminitialarabic'] = 0xFCCC; t['largecircle'] = 0x25EF; t['lbar'] = 0x019A; t['lbelt'] = 0x026C; t['lbopomofo'] = 0x310C; t['lcaron'] = 0x013E; t['lcedilla'] = 0x013C; t['lcircle'] = 0x24DB; t['lcircumflexbelow'] = 0x1E3D; t['lcommaaccent'] = 0x013C; t['ldot'] = 0x0140; t['ldotaccent'] = 0x0140; t['ldotbelow'] = 0x1E37; t['ldotbelowmacron'] = 0x1E39; t['leftangleabovecmb'] = 0x031A; t['lefttackbelowcmb'] = 0x0318; t['less'] = 0x003C; t['lessequal'] = 0x2264; t['lessequalorgreater'] = 0x22DA; t['lessmonospace'] = 0xFF1C; t['lessorequivalent'] = 0x2272; t['lessorgreater'] = 0x2276; t['lessoverequal'] = 0x2266; t['lesssmall'] = 0xFE64; t['lezh'] = 0x026E; t['lfblock'] = 0x258C; t['lhookretroflex'] = 0x026D; t['lira'] = 0x20A4; t['liwnarmenian'] = 0x056C; t['lj'] = 0x01C9; t['ljecyrillic'] = 0x0459; t['ll'] = 0xF6C0; t['lladeva'] = 0x0933; t['llagujarati'] = 0x0AB3; t['llinebelow'] = 0x1E3B; t['llladeva'] = 0x0934; t['llvocalicbengali'] = 0x09E1; t['llvocalicdeva'] = 0x0961; t['llvocalicvowelsignbengali'] = 0x09E3; t['llvocalicvowelsigndeva'] = 0x0963; t['lmiddletilde'] = 0x026B; t['lmonospace'] = 0xFF4C; t['lmsquare'] = 0x33D0; t['lochulathai'] = 0x0E2C; t['logicaland'] = 0x2227; t['logicalnot'] = 0x00AC; t['logicalnotreversed'] = 0x2310; t['logicalor'] = 0x2228; t['lolingthai'] = 0x0E25; t['longs'] = 0x017F; t['lowlinecenterline'] = 0xFE4E; t['lowlinecmb'] = 0x0332; t['lowlinedashed'] = 0xFE4D; t['lozenge'] = 0x25CA; t['lparen'] = 0x24A7; t['lslash'] = 0x0142; t['lsquare'] = 0x2113; t['lsuperior'] = 0xF6EE; t['ltshade'] = 0x2591; t['luthai'] = 0x0E26; t['lvocalicbengali'] = 0x098C; t['lvocalicdeva'] = 0x090C; t['lvocalicvowelsignbengali'] = 0x09E2; t['lvocalicvowelsigndeva'] = 0x0962; t['lxsquare'] = 0x33D3; t['m'] = 0x006D; t['mabengali'] = 0x09AE; t['macron'] = 0x00AF; t['macronbelowcmb'] = 0x0331; t['macroncmb'] = 0x0304; t['macronlowmod'] = 0x02CD; t['macronmonospace'] = 0xFFE3; t['macute'] = 0x1E3F; t['madeva'] = 0x092E; t['magujarati'] = 0x0AAE; t['magurmukhi'] = 0x0A2E; t['mahapakhhebrew'] = 0x05A4; t['mahapakhlefthebrew'] = 0x05A4; t['mahiragana'] = 0x307E; t['maichattawalowleftthai'] = 0xF895; t['maichattawalowrightthai'] = 0xF894; t['maichattawathai'] = 0x0E4B; t['maichattawaupperleftthai'] = 0xF893; t['maieklowleftthai'] = 0xF88C; t['maieklowrightthai'] = 0xF88B; t['maiekthai'] = 0x0E48; t['maiekupperleftthai'] = 0xF88A; t['maihanakatleftthai'] = 0xF884; t['maihanakatthai'] = 0x0E31; t['maitaikhuleftthai'] = 0xF889; t['maitaikhuthai'] = 0x0E47; t['maitholowleftthai'] = 0xF88F; t['maitholowrightthai'] = 0xF88E; t['maithothai'] = 0x0E49; t['maithoupperleftthai'] = 0xF88D; t['maitrilowleftthai'] = 0xF892; t['maitrilowrightthai'] = 0xF891; t['maitrithai'] = 0x0E4A; t['maitriupperleftthai'] = 0xF890; t['maiyamokthai'] = 0x0E46; t['makatakana'] = 0x30DE; t['makatakanahalfwidth'] = 0xFF8F; t['male'] = 0x2642; t['mansyonsquare'] = 0x3347; t['maqafhebrew'] = 0x05BE; t['mars'] = 0x2642; t['masoracirclehebrew'] = 0x05AF; t['masquare'] = 0x3383; t['mbopomofo'] = 0x3107; t['mbsquare'] = 0x33D4; t['mcircle'] = 0x24DC; t['mcubedsquare'] = 0x33A5; t['mdotaccent'] = 0x1E41; t['mdotbelow'] = 0x1E43; t['meemarabic'] = 0x0645; t['meemfinalarabic'] = 0xFEE2; t['meeminitialarabic'] = 0xFEE3; t['meemmedialarabic'] = 0xFEE4; t['meemmeeminitialarabic'] = 0xFCD1; t['meemmeemisolatedarabic'] = 0xFC48; t['meetorusquare'] = 0x334D; t['mehiragana'] = 0x3081; t['meizierasquare'] = 0x337E; t['mekatakana'] = 0x30E1; t['mekatakanahalfwidth'] = 0xFF92; t['mem'] = 0x05DE; t['memdagesh'] = 0xFB3E; t['memdageshhebrew'] = 0xFB3E; t['memhebrew'] = 0x05DE; t['menarmenian'] = 0x0574; t['merkhahebrew'] = 0x05A5; t['merkhakefulahebrew'] = 0x05A6; t['merkhakefulalefthebrew'] = 0x05A6; t['merkhalefthebrew'] = 0x05A5; t['mhook'] = 0x0271; t['mhzsquare'] = 0x3392; t['middledotkatakanahalfwidth'] = 0xFF65; t['middot'] = 0x00B7; t['mieumacirclekorean'] = 0x3272; t['mieumaparenkorean'] = 0x3212; t['mieumcirclekorean'] = 0x3264; t['mieumkorean'] = 0x3141; t['mieumpansioskorean'] = 0x3170; t['mieumparenkorean'] = 0x3204; t['mieumpieupkorean'] = 0x316E; t['mieumsioskorean'] = 0x316F; t['mihiragana'] = 0x307F; t['mikatakana'] = 0x30DF; t['mikatakanahalfwidth'] = 0xFF90; t['minus'] = 0x2212; t['minusbelowcmb'] = 0x0320; t['minuscircle'] = 0x2296; t['minusmod'] = 0x02D7; t['minusplus'] = 0x2213; t['minute'] = 0x2032; t['miribaarusquare'] = 0x334A; t['mirisquare'] = 0x3349; t['mlonglegturned'] = 0x0270; t['mlsquare'] = 0x3396; t['mmcubedsquare'] = 0x33A3; t['mmonospace'] = 0xFF4D; t['mmsquaredsquare'] = 0x339F; t['mohiragana'] = 0x3082; t['mohmsquare'] = 0x33C1; t['mokatakana'] = 0x30E2; t['mokatakanahalfwidth'] = 0xFF93; t['molsquare'] = 0x33D6; t['momathai'] = 0x0E21; t['moverssquare'] = 0x33A7; t['moverssquaredsquare'] = 0x33A8; t['mparen'] = 0x24A8; t['mpasquare'] = 0x33AB; t['mssquare'] = 0x33B3; t['msuperior'] = 0xF6EF; t['mturned'] = 0x026F; t['mu'] = 0x00B5; t['mu1'] = 0x00B5; t['muasquare'] = 0x3382; t['muchgreater'] = 0x226B; t['muchless'] = 0x226A; t['mufsquare'] = 0x338C; t['mugreek'] = 0x03BC; t['mugsquare'] = 0x338D; t['muhiragana'] = 0x3080; t['mukatakana'] = 0x30E0; t['mukatakanahalfwidth'] = 0xFF91; t['mulsquare'] = 0x3395; t['multiply'] = 0x00D7; t['mumsquare'] = 0x339B; t['munahhebrew'] = 0x05A3; t['munahlefthebrew'] = 0x05A3; t['musicalnote'] = 0x266A; t['musicalnotedbl'] = 0x266B; t['musicflatsign'] = 0x266D; t['musicsharpsign'] = 0x266F; t['mussquare'] = 0x33B2; t['muvsquare'] = 0x33B6; t['muwsquare'] = 0x33BC; t['mvmegasquare'] = 0x33B9; t['mvsquare'] = 0x33B7; t['mwmegasquare'] = 0x33BF; t['mwsquare'] = 0x33BD; t['n'] = 0x006E; t['nabengali'] = 0x09A8; t['nabla'] = 0x2207; t['nacute'] = 0x0144; t['nadeva'] = 0x0928; t['nagujarati'] = 0x0AA8; t['nagurmukhi'] = 0x0A28; t['nahiragana'] = 0x306A; t['nakatakana'] = 0x30CA; t['nakatakanahalfwidth'] = 0xFF85; t['napostrophe'] = 0x0149; t['nasquare'] = 0x3381; t['nbopomofo'] = 0x310B; t['nbspace'] = 0x00A0; t['ncaron'] = 0x0148; t['ncedilla'] = 0x0146; t['ncircle'] = 0x24DD; t['ncircumflexbelow'] = 0x1E4B; t['ncommaaccent'] = 0x0146; t['ndotaccent'] = 0x1E45; t['ndotbelow'] = 0x1E47; t['nehiragana'] = 0x306D; t['nekatakana'] = 0x30CD; t['nekatakanahalfwidth'] = 0xFF88; t['newsheqelsign'] = 0x20AA; t['nfsquare'] = 0x338B; t['ngabengali'] = 0x0999; t['ngadeva'] = 0x0919; t['ngagujarati'] = 0x0A99; t['ngagurmukhi'] = 0x0A19; t['ngonguthai'] = 0x0E07; t['nhiragana'] = 0x3093; t['nhookleft'] = 0x0272; t['nhookretroflex'] = 0x0273; t['nieunacirclekorean'] = 0x326F; t['nieunaparenkorean'] = 0x320F; t['nieuncieuckorean'] = 0x3135; t['nieuncirclekorean'] = 0x3261; t['nieunhieuhkorean'] = 0x3136; t['nieunkorean'] = 0x3134; t['nieunpansioskorean'] = 0x3168; t['nieunparenkorean'] = 0x3201; t['nieunsioskorean'] = 0x3167; t['nieuntikeutkorean'] = 0x3166; t['nihiragana'] = 0x306B; t['nikatakana'] = 0x30CB; t['nikatakanahalfwidth'] = 0xFF86; t['nikhahitleftthai'] = 0xF899; t['nikhahitthai'] = 0x0E4D; t['nine'] = 0x0039; t['ninearabic'] = 0x0669; t['ninebengali'] = 0x09EF; t['ninecircle'] = 0x2468; t['ninecircleinversesansserif'] = 0x2792; t['ninedeva'] = 0x096F; t['ninegujarati'] = 0x0AEF; t['ninegurmukhi'] = 0x0A6F; t['ninehackarabic'] = 0x0669; t['ninehangzhou'] = 0x3029; t['nineideographicparen'] = 0x3228; t['nineinferior'] = 0x2089; t['ninemonospace'] = 0xFF19; t['nineoldstyle'] = 0xF739; t['nineparen'] = 0x247C; t['nineperiod'] = 0x2490; t['ninepersian'] = 0x06F9; t['nineroman'] = 0x2178; t['ninesuperior'] = 0x2079; t['nineteencircle'] = 0x2472; t['nineteenparen'] = 0x2486; t['nineteenperiod'] = 0x249A; t['ninethai'] = 0x0E59; t['nj'] = 0x01CC; t['njecyrillic'] = 0x045A; t['nkatakana'] = 0x30F3; t['nkatakanahalfwidth'] = 0xFF9D; t['nlegrightlong'] = 0x019E; t['nlinebelow'] = 0x1E49; t['nmonospace'] = 0xFF4E; t['nmsquare'] = 0x339A; t['nnabengali'] = 0x09A3; t['nnadeva'] = 0x0923; t['nnagujarati'] = 0x0AA3; t['nnagurmukhi'] = 0x0A23; t['nnnadeva'] = 0x0929; t['nohiragana'] = 0x306E; t['nokatakana'] = 0x30CE; t['nokatakanahalfwidth'] = 0xFF89; t['nonbreakingspace'] = 0x00A0; t['nonenthai'] = 0x0E13; t['nonuthai'] = 0x0E19; t['noonarabic'] = 0x0646; t['noonfinalarabic'] = 0xFEE6; t['noonghunnaarabic'] = 0x06BA; t['noonghunnafinalarabic'] = 0xFB9F; t['nooninitialarabic'] = 0xFEE7; t['noonjeeminitialarabic'] = 0xFCD2; t['noonjeemisolatedarabic'] = 0xFC4B; t['noonmedialarabic'] = 0xFEE8; t['noonmeeminitialarabic'] = 0xFCD5; t['noonmeemisolatedarabic'] = 0xFC4E; t['noonnoonfinalarabic'] = 0xFC8D; t['notcontains'] = 0x220C; t['notelement'] = 0x2209; t['notelementof'] = 0x2209; t['notequal'] = 0x2260; t['notgreater'] = 0x226F; t['notgreaternorequal'] = 0x2271; t['notgreaternorless'] = 0x2279; t['notidentical'] = 0x2262; t['notless'] = 0x226E; t['notlessnorequal'] = 0x2270; t['notparallel'] = 0x2226; t['notprecedes'] = 0x2280; t['notsubset'] = 0x2284; t['notsucceeds'] = 0x2281; t['notsuperset'] = 0x2285; t['nowarmenian'] = 0x0576; t['nparen'] = 0x24A9; t['nssquare'] = 0x33B1; t['nsuperior'] = 0x207F; t['ntilde'] = 0x00F1; t['nu'] = 0x03BD; t['nuhiragana'] = 0x306C; t['nukatakana'] = 0x30CC; t['nukatakanahalfwidth'] = 0xFF87; t['nuktabengali'] = 0x09BC; t['nuktadeva'] = 0x093C; t['nuktagujarati'] = 0x0ABC; t['nuktagurmukhi'] = 0x0A3C; t['numbersign'] = 0x0023; t['numbersignmonospace'] = 0xFF03; t['numbersignsmall'] = 0xFE5F; t['numeralsigngreek'] = 0x0374; t['numeralsignlowergreek'] = 0x0375; t['numero'] = 0x2116; t['nun'] = 0x05E0; t['nundagesh'] = 0xFB40; t['nundageshhebrew'] = 0xFB40; t['nunhebrew'] = 0x05E0; t['nvsquare'] = 0x33B5; t['nwsquare'] = 0x33BB; t['nyabengali'] = 0x099E; t['nyadeva'] = 0x091E; t['nyagujarati'] = 0x0A9E; t['nyagurmukhi'] = 0x0A1E; t['o'] = 0x006F; t['oacute'] = 0x00F3; t['oangthai'] = 0x0E2D; t['obarred'] = 0x0275; t['obarredcyrillic'] = 0x04E9; t['obarreddieresiscyrillic'] = 0x04EB; t['obengali'] = 0x0993; t['obopomofo'] = 0x311B; t['obreve'] = 0x014F; t['ocandradeva'] = 0x0911; t['ocandragujarati'] = 0x0A91; t['ocandravowelsigndeva'] = 0x0949; t['ocandravowelsigngujarati'] = 0x0AC9; t['ocaron'] = 0x01D2; t['ocircle'] = 0x24DE; t['ocircumflex'] = 0x00F4; t['ocircumflexacute'] = 0x1ED1; t['ocircumflexdotbelow'] = 0x1ED9; t['ocircumflexgrave'] = 0x1ED3; t['ocircumflexhookabove'] = 0x1ED5; t['ocircumflextilde'] = 0x1ED7; t['ocyrillic'] = 0x043E; t['odblacute'] = 0x0151; t['odblgrave'] = 0x020D; t['odeva'] = 0x0913; t['odieresis'] = 0x00F6; t['odieresiscyrillic'] = 0x04E7; t['odotbelow'] = 0x1ECD; t['oe'] = 0x0153; t['oekorean'] = 0x315A; t['ogonek'] = 0x02DB; t['ogonekcmb'] = 0x0328; t['ograve'] = 0x00F2; t['ogujarati'] = 0x0A93; t['oharmenian'] = 0x0585; t['ohiragana'] = 0x304A; t['ohookabove'] = 0x1ECF; t['ohorn'] = 0x01A1; t['ohornacute'] = 0x1EDB; t['ohorndotbelow'] = 0x1EE3; t['ohorngrave'] = 0x1EDD; t['ohornhookabove'] = 0x1EDF; t['ohorntilde'] = 0x1EE1; t['ohungarumlaut'] = 0x0151; t['oi'] = 0x01A3; t['oinvertedbreve'] = 0x020F; t['okatakana'] = 0x30AA; t['okatakanahalfwidth'] = 0xFF75; t['okorean'] = 0x3157; t['olehebrew'] = 0x05AB; t['omacron'] = 0x014D; t['omacronacute'] = 0x1E53; t['omacrongrave'] = 0x1E51; t['omdeva'] = 0x0950; t['omega'] = 0x03C9; t['omega1'] = 0x03D6; t['omegacyrillic'] = 0x0461; t['omegalatinclosed'] = 0x0277; t['omegaroundcyrillic'] = 0x047B; t['omegatitlocyrillic'] = 0x047D; t['omegatonos'] = 0x03CE; t['omgujarati'] = 0x0AD0; t['omicron'] = 0x03BF; t['omicrontonos'] = 0x03CC; t['omonospace'] = 0xFF4F; t['one'] = 0x0031; t['onearabic'] = 0x0661; t['onebengali'] = 0x09E7; t['onecircle'] = 0x2460; t['onecircleinversesansserif'] = 0x278A; t['onedeva'] = 0x0967; t['onedotenleader'] = 0x2024; t['oneeighth'] = 0x215B; t['onefitted'] = 0xF6DC; t['onegujarati'] = 0x0AE7; t['onegurmukhi'] = 0x0A67; t['onehackarabic'] = 0x0661; t['onehalf'] = 0x00BD; t['onehangzhou'] = 0x3021; t['oneideographicparen'] = 0x3220; t['oneinferior'] = 0x2081; t['onemonospace'] = 0xFF11; t['onenumeratorbengali'] = 0x09F4; t['oneoldstyle'] = 0xF731; t['oneparen'] = 0x2474; t['oneperiod'] = 0x2488; t['onepersian'] = 0x06F1; t['onequarter'] = 0x00BC; t['oneroman'] = 0x2170; t['onesuperior'] = 0x00B9; t['onethai'] = 0x0E51; t['onethird'] = 0x2153; t['oogonek'] = 0x01EB; t['oogonekmacron'] = 0x01ED; t['oogurmukhi'] = 0x0A13; t['oomatragurmukhi'] = 0x0A4B; t['oopen'] = 0x0254; t['oparen'] = 0x24AA; t['openbullet'] = 0x25E6; t['option'] = 0x2325; t['ordfeminine'] = 0x00AA; t['ordmasculine'] = 0x00BA; t['orthogonal'] = 0x221F; t['oshortdeva'] = 0x0912; t['oshortvowelsigndeva'] = 0x094A; t['oslash'] = 0x00F8; t['oslashacute'] = 0x01FF; t['osmallhiragana'] = 0x3049; t['osmallkatakana'] = 0x30A9; t['osmallkatakanahalfwidth'] = 0xFF6B; t['ostrokeacute'] = 0x01FF; t['osuperior'] = 0xF6F0; t['otcyrillic'] = 0x047F; t['otilde'] = 0x00F5; t['otildeacute'] = 0x1E4D; t['otildedieresis'] = 0x1E4F; t['oubopomofo'] = 0x3121; t['overline'] = 0x203E; t['overlinecenterline'] = 0xFE4A; t['overlinecmb'] = 0x0305; t['overlinedashed'] = 0xFE49; t['overlinedblwavy'] = 0xFE4C; t['overlinewavy'] = 0xFE4B; t['overscore'] = 0x00AF; t['ovowelsignbengali'] = 0x09CB; t['ovowelsigndeva'] = 0x094B; t['ovowelsigngujarati'] = 0x0ACB; t['p'] = 0x0070; t['paampssquare'] = 0x3380; t['paasentosquare'] = 0x332B; t['pabengali'] = 0x09AA; t['pacute'] = 0x1E55; t['padeva'] = 0x092A; t['pagedown'] = 0x21DF; t['pageup'] = 0x21DE; t['pagujarati'] = 0x0AAA; t['pagurmukhi'] = 0x0A2A; t['pahiragana'] = 0x3071; t['paiyannoithai'] = 0x0E2F; t['pakatakana'] = 0x30D1; t['palatalizationcyrilliccmb'] = 0x0484; t['palochkacyrillic'] = 0x04C0; t['pansioskorean'] = 0x317F; t['paragraph'] = 0x00B6; t['parallel'] = 0x2225; t['parenleft'] = 0x0028; t['parenleftaltonearabic'] = 0xFD3E; t['parenleftbt'] = 0xF8ED; t['parenleftex'] = 0xF8EC; t['parenleftinferior'] = 0x208D; t['parenleftmonospace'] = 0xFF08; t['parenleftsmall'] = 0xFE59; t['parenleftsuperior'] = 0x207D; t['parenlefttp'] = 0xF8EB; t['parenleftvertical'] = 0xFE35; t['parenright'] = 0x0029; t['parenrightaltonearabic'] = 0xFD3F; t['parenrightbt'] = 0xF8F8; t['parenrightex'] = 0xF8F7; t['parenrightinferior'] = 0x208E; t['parenrightmonospace'] = 0xFF09; t['parenrightsmall'] = 0xFE5A; t['parenrightsuperior'] = 0x207E; t['parenrighttp'] = 0xF8F6; t['parenrightvertical'] = 0xFE36; t['partialdiff'] = 0x2202; t['paseqhebrew'] = 0x05C0; t['pashtahebrew'] = 0x0599; t['pasquare'] = 0x33A9; t['patah'] = 0x05B7; t['patah11'] = 0x05B7; t['patah1d'] = 0x05B7; t['patah2a'] = 0x05B7; t['patahhebrew'] = 0x05B7; t['patahnarrowhebrew'] = 0x05B7; t['patahquarterhebrew'] = 0x05B7; t['patahwidehebrew'] = 0x05B7; t['pazerhebrew'] = 0x05A1; t['pbopomofo'] = 0x3106; t['pcircle'] = 0x24DF; t['pdotaccent'] = 0x1E57; t['pe'] = 0x05E4; t['pecyrillic'] = 0x043F; t['pedagesh'] = 0xFB44; t['pedageshhebrew'] = 0xFB44; t['peezisquare'] = 0x333B; t['pefinaldageshhebrew'] = 0xFB43; t['peharabic'] = 0x067E; t['peharmenian'] = 0x057A; t['pehebrew'] = 0x05E4; t['pehfinalarabic'] = 0xFB57; t['pehinitialarabic'] = 0xFB58; t['pehiragana'] = 0x307A; t['pehmedialarabic'] = 0xFB59; t['pekatakana'] = 0x30DA; t['pemiddlehookcyrillic'] = 0x04A7; t['perafehebrew'] = 0xFB4E; t['percent'] = 0x0025; t['percentarabic'] = 0x066A; t['percentmonospace'] = 0xFF05; t['percentsmall'] = 0xFE6A; t['period'] = 0x002E; t['periodarmenian'] = 0x0589; t['periodcentered'] = 0x00B7; t['periodhalfwidth'] = 0xFF61; t['periodinferior'] = 0xF6E7; t['periodmonospace'] = 0xFF0E; t['periodsmall'] = 0xFE52; t['periodsuperior'] = 0xF6E8; t['perispomenigreekcmb'] = 0x0342; t['perpendicular'] = 0x22A5; t['perthousand'] = 0x2030; t['peseta'] = 0x20A7; t['pfsquare'] = 0x338A; t['phabengali'] = 0x09AB; t['phadeva'] = 0x092B; t['phagujarati'] = 0x0AAB; t['phagurmukhi'] = 0x0A2B; t['phi'] = 0x03C6; t['phi1'] = 0x03D5; t['phieuphacirclekorean'] = 0x327A; t['phieuphaparenkorean'] = 0x321A; t['phieuphcirclekorean'] = 0x326C; t['phieuphkorean'] = 0x314D; t['phieuphparenkorean'] = 0x320C; t['philatin'] = 0x0278; t['phinthuthai'] = 0x0E3A; t['phisymbolgreek'] = 0x03D5; t['phook'] = 0x01A5; t['phophanthai'] = 0x0E1E; t['phophungthai'] = 0x0E1C; t['phosamphaothai'] = 0x0E20; t['pi'] = 0x03C0; t['pieupacirclekorean'] = 0x3273; t['pieupaparenkorean'] = 0x3213; t['pieupcieuckorean'] = 0x3176; t['pieupcirclekorean'] = 0x3265; t['pieupkiyeokkorean'] = 0x3172; t['pieupkorean'] = 0x3142; t['pieupparenkorean'] = 0x3205; t['pieupsioskiyeokkorean'] = 0x3174; t['pieupsioskorean'] = 0x3144; t['pieupsiostikeutkorean'] = 0x3175; t['pieupthieuthkorean'] = 0x3177; t['pieuptikeutkorean'] = 0x3173; t['pihiragana'] = 0x3074; t['pikatakana'] = 0x30D4; t['pisymbolgreek'] = 0x03D6; t['piwrarmenian'] = 0x0583; t['plus'] = 0x002B; t['plusbelowcmb'] = 0x031F; t['pluscircle'] = 0x2295; t['plusminus'] = 0x00B1; t['plusmod'] = 0x02D6; t['plusmonospace'] = 0xFF0B; t['plussmall'] = 0xFE62; t['plussuperior'] = 0x207A; t['pmonospace'] = 0xFF50; t['pmsquare'] = 0x33D8; t['pohiragana'] = 0x307D; t['pointingindexdownwhite'] = 0x261F; t['pointingindexleftwhite'] = 0x261C; t['pointingindexrightwhite'] = 0x261E; t['pointingindexupwhite'] = 0x261D; t['pokatakana'] = 0x30DD; t['poplathai'] = 0x0E1B; t['postalmark'] = 0x3012; t['postalmarkface'] = 0x3020; t['pparen'] = 0x24AB; t['precedes'] = 0x227A; t['prescription'] = 0x211E; t['primemod'] = 0x02B9; t['primereversed'] = 0x2035; t['product'] = 0x220F; t['projective'] = 0x2305; t['prolongedkana'] = 0x30FC; t['propellor'] = 0x2318; t['propersubset'] = 0x2282; t['propersuperset'] = 0x2283; t['proportion'] = 0x2237; t['proportional'] = 0x221D; t['psi'] = 0x03C8; t['psicyrillic'] = 0x0471; t['psilipneumatacyrilliccmb'] = 0x0486; t['pssquare'] = 0x33B0; t['puhiragana'] = 0x3077; t['pukatakana'] = 0x30D7; t['pvsquare'] = 0x33B4; t['pwsquare'] = 0x33BA; t['q'] = 0x0071; t['qadeva'] = 0x0958; t['qadmahebrew'] = 0x05A8; t['qafarabic'] = 0x0642; t['qaffinalarabic'] = 0xFED6; t['qafinitialarabic'] = 0xFED7; t['qafmedialarabic'] = 0xFED8; t['qamats'] = 0x05B8; t['qamats10'] = 0x05B8; t['qamats1a'] = 0x05B8; t['qamats1c'] = 0x05B8; t['qamats27'] = 0x05B8; t['qamats29'] = 0x05B8; t['qamats33'] = 0x05B8; t['qamatsde'] = 0x05B8; t['qamatshebrew'] = 0x05B8; t['qamatsnarrowhebrew'] = 0x05B8; t['qamatsqatanhebrew'] = 0x05B8; t['qamatsqatannarrowhebrew'] = 0x05B8; t['qamatsqatanquarterhebrew'] = 0x05B8; t['qamatsqatanwidehebrew'] = 0x05B8; t['qamatsquarterhebrew'] = 0x05B8; t['qamatswidehebrew'] = 0x05B8; t['qarneyparahebrew'] = 0x059F; t['qbopomofo'] = 0x3111; t['qcircle'] = 0x24E0; t['qhook'] = 0x02A0; t['qmonospace'] = 0xFF51; t['qof'] = 0x05E7; t['qofdagesh'] = 0xFB47; t['qofdageshhebrew'] = 0xFB47; t['qofhebrew'] = 0x05E7; t['qparen'] = 0x24AC; t['quarternote'] = 0x2669; t['qubuts'] = 0x05BB; t['qubuts18'] = 0x05BB; t['qubuts25'] = 0x05BB; t['qubuts31'] = 0x05BB; t['qubutshebrew'] = 0x05BB; t['qubutsnarrowhebrew'] = 0x05BB; t['qubutsquarterhebrew'] = 0x05BB; t['qubutswidehebrew'] = 0x05BB; t['question'] = 0x003F; t['questionarabic'] = 0x061F; t['questionarmenian'] = 0x055E; t['questiondown'] = 0x00BF; t['questiondownsmall'] = 0xF7BF; t['questiongreek'] = 0x037E; t['questionmonospace'] = 0xFF1F; t['questionsmall'] = 0xF73F; t['quotedbl'] = 0x0022; t['quotedblbase'] = 0x201E; t['quotedblleft'] = 0x201C; t['quotedblmonospace'] = 0xFF02; t['quotedblprime'] = 0x301E; t['quotedblprimereversed'] = 0x301D; t['quotedblright'] = 0x201D; t['quoteleft'] = 0x2018; t['quoteleftreversed'] = 0x201B; t['quotereversed'] = 0x201B; t['quoteright'] = 0x2019; t['quoterightn'] = 0x0149; t['quotesinglbase'] = 0x201A; t['quotesingle'] = 0x0027; t['quotesinglemonospace'] = 0xFF07; t['r'] = 0x0072; t['raarmenian'] = 0x057C; t['rabengali'] = 0x09B0; t['racute'] = 0x0155; t['radeva'] = 0x0930; t['radical'] = 0x221A; t['radicalex'] = 0xF8E5; t['radoverssquare'] = 0x33AE; t['radoverssquaredsquare'] = 0x33AF; t['radsquare'] = 0x33AD; t['rafe'] = 0x05BF; t['rafehebrew'] = 0x05BF; t['ragujarati'] = 0x0AB0; t['ragurmukhi'] = 0x0A30; t['rahiragana'] = 0x3089; t['rakatakana'] = 0x30E9; t['rakatakanahalfwidth'] = 0xFF97; t['ralowerdiagonalbengali'] = 0x09F1; t['ramiddlediagonalbengali'] = 0x09F0; t['ramshorn'] = 0x0264; t['ratio'] = 0x2236; t['rbopomofo'] = 0x3116; t['rcaron'] = 0x0159; t['rcedilla'] = 0x0157; t['rcircle'] = 0x24E1; t['rcommaaccent'] = 0x0157; t['rdblgrave'] = 0x0211; t['rdotaccent'] = 0x1E59; t['rdotbelow'] = 0x1E5B; t['rdotbelowmacron'] = 0x1E5D; t['referencemark'] = 0x203B; t['reflexsubset'] = 0x2286; t['reflexsuperset'] = 0x2287; t['registered'] = 0x00AE; t['registersans'] = 0xF8E8; t['registerserif'] = 0xF6DA; t['reharabic'] = 0x0631; t['reharmenian'] = 0x0580; t['rehfinalarabic'] = 0xFEAE; t['rehiragana'] = 0x308C; t['rekatakana'] = 0x30EC; t['rekatakanahalfwidth'] = 0xFF9A; t['resh'] = 0x05E8; t['reshdageshhebrew'] = 0xFB48; t['reshhebrew'] = 0x05E8; t['reversedtilde'] = 0x223D; t['reviahebrew'] = 0x0597; t['reviamugrashhebrew'] = 0x0597; t['revlogicalnot'] = 0x2310; t['rfishhook'] = 0x027E; t['rfishhookreversed'] = 0x027F; t['rhabengali'] = 0x09DD; t['rhadeva'] = 0x095D; t['rho'] = 0x03C1; t['rhook'] = 0x027D; t['rhookturned'] = 0x027B; t['rhookturnedsuperior'] = 0x02B5; t['rhosymbolgreek'] = 0x03F1; t['rhotichookmod'] = 0x02DE; t['rieulacirclekorean'] = 0x3271; t['rieulaparenkorean'] = 0x3211; t['rieulcirclekorean'] = 0x3263; t['rieulhieuhkorean'] = 0x3140; t['rieulkiyeokkorean'] = 0x313A; t['rieulkiyeoksioskorean'] = 0x3169; t['rieulkorean'] = 0x3139; t['rieulmieumkorean'] = 0x313B; t['rieulpansioskorean'] = 0x316C; t['rieulparenkorean'] = 0x3203; t['rieulphieuphkorean'] = 0x313F; t['rieulpieupkorean'] = 0x313C; t['rieulpieupsioskorean'] = 0x316B; t['rieulsioskorean'] = 0x313D; t['rieulthieuthkorean'] = 0x313E; t['rieultikeutkorean'] = 0x316A; t['rieulyeorinhieuhkorean'] = 0x316D; t['rightangle'] = 0x221F; t['righttackbelowcmb'] = 0x0319; t['righttriangle'] = 0x22BF; t['rihiragana'] = 0x308A; t['rikatakana'] = 0x30EA; t['rikatakanahalfwidth'] = 0xFF98; t['ring'] = 0x02DA; t['ringbelowcmb'] = 0x0325; t['ringcmb'] = 0x030A; t['ringhalfleft'] = 0x02BF; t['ringhalfleftarmenian'] = 0x0559; t['ringhalfleftbelowcmb'] = 0x031C; t['ringhalfleftcentered'] = 0x02D3; t['ringhalfright'] = 0x02BE; t['ringhalfrightbelowcmb'] = 0x0339; t['ringhalfrightcentered'] = 0x02D2; t['rinvertedbreve'] = 0x0213; t['rittorusquare'] = 0x3351; t['rlinebelow'] = 0x1E5F; t['rlongleg'] = 0x027C; t['rlonglegturned'] = 0x027A; t['rmonospace'] = 0xFF52; t['rohiragana'] = 0x308D; t['rokatakana'] = 0x30ED; t['rokatakanahalfwidth'] = 0xFF9B; t['roruathai'] = 0x0E23; t['rparen'] = 0x24AD; t['rrabengali'] = 0x09DC; t['rradeva'] = 0x0931; t['rragurmukhi'] = 0x0A5C; t['rreharabic'] = 0x0691; t['rrehfinalarabic'] = 0xFB8D; t['rrvocalicbengali'] = 0x09E0; t['rrvocalicdeva'] = 0x0960; t['rrvocalicgujarati'] = 0x0AE0; t['rrvocalicvowelsignbengali'] = 0x09C4; t['rrvocalicvowelsigndeva'] = 0x0944; t['rrvocalicvowelsigngujarati'] = 0x0AC4; t['rsuperior'] = 0xF6F1; t['rtblock'] = 0x2590; t['rturned'] = 0x0279; t['rturnedsuperior'] = 0x02B4; t['ruhiragana'] = 0x308B; t['rukatakana'] = 0x30EB; t['rukatakanahalfwidth'] = 0xFF99; t['rupeemarkbengali'] = 0x09F2; t['rupeesignbengali'] = 0x09F3; t['rupiah'] = 0xF6DD; t['ruthai'] = 0x0E24; t['rvocalicbengali'] = 0x098B; t['rvocalicdeva'] = 0x090B; t['rvocalicgujarati'] = 0x0A8B; t['rvocalicvowelsignbengali'] = 0x09C3; t['rvocalicvowelsigndeva'] = 0x0943; t['rvocalicvowelsigngujarati'] = 0x0AC3; t['s'] = 0x0073; t['sabengali'] = 0x09B8; t['sacute'] = 0x015B; t['sacutedotaccent'] = 0x1E65; t['sadarabic'] = 0x0635; t['sadeva'] = 0x0938; t['sadfinalarabic'] = 0xFEBA; t['sadinitialarabic'] = 0xFEBB; t['sadmedialarabic'] = 0xFEBC; t['sagujarati'] = 0x0AB8; t['sagurmukhi'] = 0x0A38; t['sahiragana'] = 0x3055; t['sakatakana'] = 0x30B5; t['sakatakanahalfwidth'] = 0xFF7B; t['sallallahoualayhewasallamarabic'] = 0xFDFA; t['samekh'] = 0x05E1; t['samekhdagesh'] = 0xFB41; t['samekhdageshhebrew'] = 0xFB41; t['samekhhebrew'] = 0x05E1; t['saraaathai'] = 0x0E32; t['saraaethai'] = 0x0E41; t['saraaimaimalaithai'] = 0x0E44; t['saraaimaimuanthai'] = 0x0E43; t['saraamthai'] = 0x0E33; t['saraathai'] = 0x0E30; t['saraethai'] = 0x0E40; t['saraiileftthai'] = 0xF886; t['saraiithai'] = 0x0E35; t['saraileftthai'] = 0xF885; t['saraithai'] = 0x0E34; t['saraothai'] = 0x0E42; t['saraueeleftthai'] = 0xF888; t['saraueethai'] = 0x0E37; t['saraueleftthai'] = 0xF887; t['sarauethai'] = 0x0E36; t['sarauthai'] = 0x0E38; t['sarauuthai'] = 0x0E39; t['sbopomofo'] = 0x3119; t['scaron'] = 0x0161; t['scarondotaccent'] = 0x1E67; t['scedilla'] = 0x015F; t['schwa'] = 0x0259; t['schwacyrillic'] = 0x04D9; t['schwadieresiscyrillic'] = 0x04DB; t['schwahook'] = 0x025A; t['scircle'] = 0x24E2; t['scircumflex'] = 0x015D; t['scommaaccent'] = 0x0219; t['sdotaccent'] = 0x1E61; t['sdotbelow'] = 0x1E63; t['sdotbelowdotaccent'] = 0x1E69; t['seagullbelowcmb'] = 0x033C; t['second'] = 0x2033; t['secondtonechinese'] = 0x02CA; t['section'] = 0x00A7; t['seenarabic'] = 0x0633; t['seenfinalarabic'] = 0xFEB2; t['seeninitialarabic'] = 0xFEB3; t['seenmedialarabic'] = 0xFEB4; t['segol'] = 0x05B6; t['segol13'] = 0x05B6; t['segol1f'] = 0x05B6; t['segol2c'] = 0x05B6; t['segolhebrew'] = 0x05B6; t['segolnarrowhebrew'] = 0x05B6; t['segolquarterhebrew'] = 0x05B6; t['segoltahebrew'] = 0x0592; t['segolwidehebrew'] = 0x05B6; t['seharmenian'] = 0x057D; t['sehiragana'] = 0x305B; t['sekatakana'] = 0x30BB; t['sekatakanahalfwidth'] = 0xFF7E; t['semicolon'] = 0x003B; t['semicolonarabic'] = 0x061B; t['semicolonmonospace'] = 0xFF1B; t['semicolonsmall'] = 0xFE54; t['semivoicedmarkkana'] = 0x309C; t['semivoicedmarkkanahalfwidth'] = 0xFF9F; t['sentisquare'] = 0x3322; t['sentosquare'] = 0x3323; t['seven'] = 0x0037; t['sevenarabic'] = 0x0667; t['sevenbengali'] = 0x09ED; t['sevencircle'] = 0x2466; t['sevencircleinversesansserif'] = 0x2790; t['sevendeva'] = 0x096D; t['seveneighths'] = 0x215E; t['sevengujarati'] = 0x0AED; t['sevengurmukhi'] = 0x0A6D; t['sevenhackarabic'] = 0x0667; t['sevenhangzhou'] = 0x3027; t['sevenideographicparen'] = 0x3226; t['seveninferior'] = 0x2087; t['sevenmonospace'] = 0xFF17; t['sevenoldstyle'] = 0xF737; t['sevenparen'] = 0x247A; t['sevenperiod'] = 0x248E; t['sevenpersian'] = 0x06F7; t['sevenroman'] = 0x2176; t['sevensuperior'] = 0x2077; t['seventeencircle'] = 0x2470; t['seventeenparen'] = 0x2484; t['seventeenperiod'] = 0x2498; t['seventhai'] = 0x0E57; t['sfthyphen'] = 0x00AD; t['shaarmenian'] = 0x0577; t['shabengali'] = 0x09B6; t['shacyrillic'] = 0x0448; t['shaddaarabic'] = 0x0651; t['shaddadammaarabic'] = 0xFC61; t['shaddadammatanarabic'] = 0xFC5E; t['shaddafathaarabic'] = 0xFC60; t['shaddakasraarabic'] = 0xFC62; t['shaddakasratanarabic'] = 0xFC5F; t['shade'] = 0x2592; t['shadedark'] = 0x2593; t['shadelight'] = 0x2591; t['shademedium'] = 0x2592; t['shadeva'] = 0x0936; t['shagujarati'] = 0x0AB6; t['shagurmukhi'] = 0x0A36; t['shalshelethebrew'] = 0x0593; t['shbopomofo'] = 0x3115; t['shchacyrillic'] = 0x0449; t['sheenarabic'] = 0x0634; t['sheenfinalarabic'] = 0xFEB6; t['sheeninitialarabic'] = 0xFEB7; t['sheenmedialarabic'] = 0xFEB8; t['sheicoptic'] = 0x03E3; t['sheqel'] = 0x20AA; t['sheqelhebrew'] = 0x20AA; t['sheva'] = 0x05B0; t['sheva115'] = 0x05B0; t['sheva15'] = 0x05B0; t['sheva22'] = 0x05B0; t['sheva2e'] = 0x05B0; t['shevahebrew'] = 0x05B0; t['shevanarrowhebrew'] = 0x05B0; t['shevaquarterhebrew'] = 0x05B0; t['shevawidehebrew'] = 0x05B0; t['shhacyrillic'] = 0x04BB; t['shimacoptic'] = 0x03ED; t['shin'] = 0x05E9; t['shindagesh'] = 0xFB49; t['shindageshhebrew'] = 0xFB49; t['shindageshshindot'] = 0xFB2C; t['shindageshshindothebrew'] = 0xFB2C; t['shindageshsindot'] = 0xFB2D; t['shindageshsindothebrew'] = 0xFB2D; t['shindothebrew'] = 0x05C1; t['shinhebrew'] = 0x05E9; t['shinshindot'] = 0xFB2A; t['shinshindothebrew'] = 0xFB2A; t['shinsindot'] = 0xFB2B; t['shinsindothebrew'] = 0xFB2B; t['shook'] = 0x0282; t['sigma'] = 0x03C3; t['sigma1'] = 0x03C2; t['sigmafinal'] = 0x03C2; t['sigmalunatesymbolgreek'] = 0x03F2; t['sihiragana'] = 0x3057; t['sikatakana'] = 0x30B7; t['sikatakanahalfwidth'] = 0xFF7C; t['siluqhebrew'] = 0x05BD; t['siluqlefthebrew'] = 0x05BD; t['similar'] = 0x223C; t['sindothebrew'] = 0x05C2; t['siosacirclekorean'] = 0x3274; t['siosaparenkorean'] = 0x3214; t['sioscieuckorean'] = 0x317E; t['sioscirclekorean'] = 0x3266; t['sioskiyeokkorean'] = 0x317A; t['sioskorean'] = 0x3145; t['siosnieunkorean'] = 0x317B; t['siosparenkorean'] = 0x3206; t['siospieupkorean'] = 0x317D; t['siostikeutkorean'] = 0x317C; t['six'] = 0x0036; t['sixarabic'] = 0x0666; t['sixbengali'] = 0x09EC; t['sixcircle'] = 0x2465; t['sixcircleinversesansserif'] = 0x278F; t['sixdeva'] = 0x096C; t['sixgujarati'] = 0x0AEC; t['sixgurmukhi'] = 0x0A6C; t['sixhackarabic'] = 0x0666; t['sixhangzhou'] = 0x3026; t['sixideographicparen'] = 0x3225; t['sixinferior'] = 0x2086; t['sixmonospace'] = 0xFF16; t['sixoldstyle'] = 0xF736; t['sixparen'] = 0x2479; t['sixperiod'] = 0x248D; t['sixpersian'] = 0x06F6; t['sixroman'] = 0x2175; t['sixsuperior'] = 0x2076; t['sixteencircle'] = 0x246F; t['sixteencurrencydenominatorbengali'] = 0x09F9; t['sixteenparen'] = 0x2483; t['sixteenperiod'] = 0x2497; t['sixthai'] = 0x0E56; t['slash'] = 0x002F; t['slashmonospace'] = 0xFF0F; t['slong'] = 0x017F; t['slongdotaccent'] = 0x1E9B; t['smileface'] = 0x263A; t['smonospace'] = 0xFF53; t['sofpasuqhebrew'] = 0x05C3; t['softhyphen'] = 0x00AD; t['softsigncyrillic'] = 0x044C; t['sohiragana'] = 0x305D; t['sokatakana'] = 0x30BD; t['sokatakanahalfwidth'] = 0xFF7F; t['soliduslongoverlaycmb'] = 0x0338; t['solidusshortoverlaycmb'] = 0x0337; t['sorusithai'] = 0x0E29; t['sosalathai'] = 0x0E28; t['sosothai'] = 0x0E0B; t['sosuathai'] = 0x0E2A; t['space'] = 0x0020; t['spacehackarabic'] = 0x0020; t['spade'] = 0x2660; t['spadesuitblack'] = 0x2660; t['spadesuitwhite'] = 0x2664; t['sparen'] = 0x24AE; t['squarebelowcmb'] = 0x033B; t['squarecc'] = 0x33C4; t['squarecm'] = 0x339D; t['squarediagonalcrosshatchfill'] = 0x25A9; t['squarehorizontalfill'] = 0x25A4; t['squarekg'] = 0x338F; t['squarekm'] = 0x339E; t['squarekmcapital'] = 0x33CE; t['squareln'] = 0x33D1; t['squarelog'] = 0x33D2; t['squaremg'] = 0x338E; t['squaremil'] = 0x33D5; t['squaremm'] = 0x339C; t['squaremsquared'] = 0x33A1; t['squareorthogonalcrosshatchfill'] = 0x25A6; t['squareupperlefttolowerrightfill'] = 0x25A7; t['squareupperrighttolowerleftfill'] = 0x25A8; t['squareverticalfill'] = 0x25A5; t['squarewhitewithsmallblack'] = 0x25A3; t['srsquare'] = 0x33DB; t['ssabengali'] = 0x09B7; t['ssadeva'] = 0x0937; t['ssagujarati'] = 0x0AB7; t['ssangcieuckorean'] = 0x3149; t['ssanghieuhkorean'] = 0x3185; t['ssangieungkorean'] = 0x3180; t['ssangkiyeokkorean'] = 0x3132; t['ssangnieunkorean'] = 0x3165; t['ssangpieupkorean'] = 0x3143; t['ssangsioskorean'] = 0x3146; t['ssangtikeutkorean'] = 0x3138; t['ssuperior'] = 0xF6F2; t['sterling'] = 0x00A3; t['sterlingmonospace'] = 0xFFE1; t['strokelongoverlaycmb'] = 0x0336; t['strokeshortoverlaycmb'] = 0x0335; t['subset'] = 0x2282; t['subsetnotequal'] = 0x228A; t['subsetorequal'] = 0x2286; t['succeeds'] = 0x227B; t['suchthat'] = 0x220B; t['suhiragana'] = 0x3059; t['sukatakana'] = 0x30B9; t['sukatakanahalfwidth'] = 0xFF7D; t['sukunarabic'] = 0x0652; t['summation'] = 0x2211; t['sun'] = 0x263C; t['superset'] = 0x2283; t['supersetnotequal'] = 0x228B; t['supersetorequal'] = 0x2287; t['svsquare'] = 0x33DC; t['syouwaerasquare'] = 0x337C; t['t'] = 0x0074; t['tabengali'] = 0x09A4; t['tackdown'] = 0x22A4; t['tackleft'] = 0x22A3; t['tadeva'] = 0x0924; t['tagujarati'] = 0x0AA4; t['tagurmukhi'] = 0x0A24; t['taharabic'] = 0x0637; t['tahfinalarabic'] = 0xFEC2; t['tahinitialarabic'] = 0xFEC3; t['tahiragana'] = 0x305F; t['tahmedialarabic'] = 0xFEC4; t['taisyouerasquare'] = 0x337D; t['takatakana'] = 0x30BF; t['takatakanahalfwidth'] = 0xFF80; t['tatweelarabic'] = 0x0640; t['tau'] = 0x03C4; t['tav'] = 0x05EA; t['tavdages'] = 0xFB4A; t['tavdagesh'] = 0xFB4A; t['tavdageshhebrew'] = 0xFB4A; t['tavhebrew'] = 0x05EA; t['tbar'] = 0x0167; t['tbopomofo'] = 0x310A; t['tcaron'] = 0x0165; t['tccurl'] = 0x02A8; t['tcedilla'] = 0x0163; t['tcheharabic'] = 0x0686; t['tchehfinalarabic'] = 0xFB7B; t['tchehinitialarabic'] = 0xFB7C; t['tchehmedialarabic'] = 0xFB7D; t['tcircle'] = 0x24E3; t['tcircumflexbelow'] = 0x1E71; t['tcommaaccent'] = 0x0163; t['tdieresis'] = 0x1E97; t['tdotaccent'] = 0x1E6B; t['tdotbelow'] = 0x1E6D; t['tecyrillic'] = 0x0442; t['tedescendercyrillic'] = 0x04AD; t['teharabic'] = 0x062A; t['tehfinalarabic'] = 0xFE96; t['tehhahinitialarabic'] = 0xFCA2; t['tehhahisolatedarabic'] = 0xFC0C; t['tehinitialarabic'] = 0xFE97; t['tehiragana'] = 0x3066; t['tehjeeminitialarabic'] = 0xFCA1; t['tehjeemisolatedarabic'] = 0xFC0B; t['tehmarbutaarabic'] = 0x0629; t['tehmarbutafinalarabic'] = 0xFE94; t['tehmedialarabic'] = 0xFE98; t['tehmeeminitialarabic'] = 0xFCA4; t['tehmeemisolatedarabic'] = 0xFC0E; t['tehnoonfinalarabic'] = 0xFC73; t['tekatakana'] = 0x30C6; t['tekatakanahalfwidth'] = 0xFF83; t['telephone'] = 0x2121; t['telephoneblack'] = 0x260E; t['telishagedolahebrew'] = 0x05A0; t['telishaqetanahebrew'] = 0x05A9; t['tencircle'] = 0x2469; t['tenideographicparen'] = 0x3229; t['tenparen'] = 0x247D; t['tenperiod'] = 0x2491; t['tenroman'] = 0x2179; t['tesh'] = 0x02A7; t['tet'] = 0x05D8; t['tetdagesh'] = 0xFB38; t['tetdageshhebrew'] = 0xFB38; t['tethebrew'] = 0x05D8; t['tetsecyrillic'] = 0x04B5; t['tevirhebrew'] = 0x059B; t['tevirlefthebrew'] = 0x059B; t['thabengali'] = 0x09A5; t['thadeva'] = 0x0925; t['thagujarati'] = 0x0AA5; t['thagurmukhi'] = 0x0A25; t['thalarabic'] = 0x0630; t['thalfinalarabic'] = 0xFEAC; t['thanthakhatlowleftthai'] = 0xF898; t['thanthakhatlowrightthai'] = 0xF897; t['thanthakhatthai'] = 0x0E4C; t['thanthakhatupperleftthai'] = 0xF896; t['theharabic'] = 0x062B; t['thehfinalarabic'] = 0xFE9A; t['thehinitialarabic'] = 0xFE9B; t['thehmedialarabic'] = 0xFE9C; t['thereexists'] = 0x2203; t['therefore'] = 0x2234; t['theta'] = 0x03B8; t['theta1'] = 0x03D1; t['thetasymbolgreek'] = 0x03D1; t['thieuthacirclekorean'] = 0x3279; t['thieuthaparenkorean'] = 0x3219; t['thieuthcirclekorean'] = 0x326B; t['thieuthkorean'] = 0x314C; t['thieuthparenkorean'] = 0x320B; t['thirteencircle'] = 0x246C; t['thirteenparen'] = 0x2480; t['thirteenperiod'] = 0x2494; t['thonangmonthothai'] = 0x0E11; t['thook'] = 0x01AD; t['thophuthaothai'] = 0x0E12; t['thorn'] = 0x00FE; t['thothahanthai'] = 0x0E17; t['thothanthai'] = 0x0E10; t['thothongthai'] = 0x0E18; t['thothungthai'] = 0x0E16; t['thousandcyrillic'] = 0x0482; t['thousandsseparatorarabic'] = 0x066C; t['thousandsseparatorpersian'] = 0x066C; t['three'] = 0x0033; t['threearabic'] = 0x0663; t['threebengali'] = 0x09E9; t['threecircle'] = 0x2462; t['threecircleinversesansserif'] = 0x278C; t['threedeva'] = 0x0969; t['threeeighths'] = 0x215C; t['threegujarati'] = 0x0AE9; t['threegurmukhi'] = 0x0A69; t['threehackarabic'] = 0x0663; t['threehangzhou'] = 0x3023; t['threeideographicparen'] = 0x3222; t['threeinferior'] = 0x2083; t['threemonospace'] = 0xFF13; t['threenumeratorbengali'] = 0x09F6; t['threeoldstyle'] = 0xF733; t['threeparen'] = 0x2476; t['threeperiod'] = 0x248A; t['threepersian'] = 0x06F3; t['threequarters'] = 0x00BE; t['threequartersemdash'] = 0xF6DE; t['threeroman'] = 0x2172; t['threesuperior'] = 0x00B3; t['threethai'] = 0x0E53; t['thzsquare'] = 0x3394; t['tihiragana'] = 0x3061; t['tikatakana'] = 0x30C1; t['tikatakanahalfwidth'] = 0xFF81; t['tikeutacirclekorean'] = 0x3270; t['tikeutaparenkorean'] = 0x3210; t['tikeutcirclekorean'] = 0x3262; t['tikeutkorean'] = 0x3137; t['tikeutparenkorean'] = 0x3202; t['tilde'] = 0x02DC; t['tildebelowcmb'] = 0x0330; t['tildecmb'] = 0x0303; t['tildecomb'] = 0x0303; t['tildedoublecmb'] = 0x0360; t['tildeoperator'] = 0x223C; t['tildeoverlaycmb'] = 0x0334; t['tildeverticalcmb'] = 0x033E; t['timescircle'] = 0x2297; t['tipehahebrew'] = 0x0596; t['tipehalefthebrew'] = 0x0596; t['tippigurmukhi'] = 0x0A70; t['titlocyrilliccmb'] = 0x0483; t['tiwnarmenian'] = 0x057F; t['tlinebelow'] = 0x1E6F; t['tmonospace'] = 0xFF54; t['toarmenian'] = 0x0569; t['tohiragana'] = 0x3068; t['tokatakana'] = 0x30C8; t['tokatakanahalfwidth'] = 0xFF84; t['tonebarextrahighmod'] = 0x02E5; t['tonebarextralowmod'] = 0x02E9; t['tonebarhighmod'] = 0x02E6; t['tonebarlowmod'] = 0x02E8; t['tonebarmidmod'] = 0x02E7; t['tonefive'] = 0x01BD; t['tonesix'] = 0x0185; t['tonetwo'] = 0x01A8; t['tonos'] = 0x0384; t['tonsquare'] = 0x3327; t['topatakthai'] = 0x0E0F; t['tortoiseshellbracketleft'] = 0x3014; t['tortoiseshellbracketleftsmall'] = 0xFE5D; t['tortoiseshellbracketleftvertical'] = 0xFE39; t['tortoiseshellbracketright'] = 0x3015; t['tortoiseshellbracketrightsmall'] = 0xFE5E; t['tortoiseshellbracketrightvertical'] = 0xFE3A; t['totaothai'] = 0x0E15; t['tpalatalhook'] = 0x01AB; t['tparen'] = 0x24AF; t['trademark'] = 0x2122; t['trademarksans'] = 0xF8EA; t['trademarkserif'] = 0xF6DB; t['tretroflexhook'] = 0x0288; t['triagdn'] = 0x25BC; t['triaglf'] = 0x25C4; t['triagrt'] = 0x25BA; t['triagup'] = 0x25B2; t['ts'] = 0x02A6; t['tsadi'] = 0x05E6; t['tsadidagesh'] = 0xFB46; t['tsadidageshhebrew'] = 0xFB46; t['tsadihebrew'] = 0x05E6; t['tsecyrillic'] = 0x0446; t['tsere'] = 0x05B5; t['tsere12'] = 0x05B5; t['tsere1e'] = 0x05B5; t['tsere2b'] = 0x05B5; t['tserehebrew'] = 0x05B5; t['tserenarrowhebrew'] = 0x05B5; t['tserequarterhebrew'] = 0x05B5; t['tserewidehebrew'] = 0x05B5; t['tshecyrillic'] = 0x045B; t['tsuperior'] = 0xF6F3; t['ttabengali'] = 0x099F; t['ttadeva'] = 0x091F; t['ttagujarati'] = 0x0A9F; t['ttagurmukhi'] = 0x0A1F; t['tteharabic'] = 0x0679; t['ttehfinalarabic'] = 0xFB67; t['ttehinitialarabic'] = 0xFB68; t['ttehmedialarabic'] = 0xFB69; t['tthabengali'] = 0x09A0; t['tthadeva'] = 0x0920; t['tthagujarati'] = 0x0AA0; t['tthagurmukhi'] = 0x0A20; t['tturned'] = 0x0287; t['tuhiragana'] = 0x3064; t['tukatakana'] = 0x30C4; t['tukatakanahalfwidth'] = 0xFF82; t['tusmallhiragana'] = 0x3063; t['tusmallkatakana'] = 0x30C3; t['tusmallkatakanahalfwidth'] = 0xFF6F; t['twelvecircle'] = 0x246B; t['twelveparen'] = 0x247F; t['twelveperiod'] = 0x2493; t['twelveroman'] = 0x217B; t['twentycircle'] = 0x2473; t['twentyhangzhou'] = 0x5344; t['twentyparen'] = 0x2487; t['twentyperiod'] = 0x249B; t['two'] = 0x0032; t['twoarabic'] = 0x0662; t['twobengali'] = 0x09E8; t['twocircle'] = 0x2461; t['twocircleinversesansserif'] = 0x278B; t['twodeva'] = 0x0968; t['twodotenleader'] = 0x2025; t['twodotleader'] = 0x2025; t['twodotleadervertical'] = 0xFE30; t['twogujarati'] = 0x0AE8; t['twogurmukhi'] = 0x0A68; t['twohackarabic'] = 0x0662; t['twohangzhou'] = 0x3022; t['twoideographicparen'] = 0x3221; t['twoinferior'] = 0x2082; t['twomonospace'] = 0xFF12; t['twonumeratorbengali'] = 0x09F5; t['twooldstyle'] = 0xF732; t['twoparen'] = 0x2475; t['twoperiod'] = 0x2489; t['twopersian'] = 0x06F2; t['tworoman'] = 0x2171; t['twostroke'] = 0x01BB; t['twosuperior'] = 0x00B2; t['twothai'] = 0x0E52; t['twothirds'] = 0x2154; t['u'] = 0x0075; t['uacute'] = 0x00FA; t['ubar'] = 0x0289; t['ubengali'] = 0x0989; t['ubopomofo'] = 0x3128; t['ubreve'] = 0x016D; t['ucaron'] = 0x01D4; t['ucircle'] = 0x24E4; t['ucircumflex'] = 0x00FB; t['ucircumflexbelow'] = 0x1E77; t['ucyrillic'] = 0x0443; t['udattadeva'] = 0x0951; t['udblacute'] = 0x0171; t['udblgrave'] = 0x0215; t['udeva'] = 0x0909; t['udieresis'] = 0x00FC; t['udieresisacute'] = 0x01D8; t['udieresisbelow'] = 0x1E73; t['udieresiscaron'] = 0x01DA; t['udieresiscyrillic'] = 0x04F1; t['udieresisgrave'] = 0x01DC; t['udieresismacron'] = 0x01D6; t['udotbelow'] = 0x1EE5; t['ugrave'] = 0x00F9; t['ugujarati'] = 0x0A89; t['ugurmukhi'] = 0x0A09; t['uhiragana'] = 0x3046; t['uhookabove'] = 0x1EE7; t['uhorn'] = 0x01B0; t['uhornacute'] = 0x1EE9; t['uhorndotbelow'] = 0x1EF1; t['uhorngrave'] = 0x1EEB; t['uhornhookabove'] = 0x1EED; t['uhorntilde'] = 0x1EEF; t['uhungarumlaut'] = 0x0171; t['uhungarumlautcyrillic'] = 0x04F3; t['uinvertedbreve'] = 0x0217; t['ukatakana'] = 0x30A6; t['ukatakanahalfwidth'] = 0xFF73; t['ukcyrillic'] = 0x0479; t['ukorean'] = 0x315C; t['umacron'] = 0x016B; t['umacroncyrillic'] = 0x04EF; t['umacrondieresis'] = 0x1E7B; t['umatragurmukhi'] = 0x0A41; t['umonospace'] = 0xFF55; t['underscore'] = 0x005F; t['underscoredbl'] = 0x2017; t['underscoremonospace'] = 0xFF3F; t['underscorevertical'] = 0xFE33; t['underscorewavy'] = 0xFE4F; t['union'] = 0x222A; t['universal'] = 0x2200; t['uogonek'] = 0x0173; t['uparen'] = 0x24B0; t['upblock'] = 0x2580; t['upperdothebrew'] = 0x05C4; t['upsilon'] = 0x03C5; t['upsilondieresis'] = 0x03CB; t['upsilondieresistonos'] = 0x03B0; t['upsilonlatin'] = 0x028A; t['upsilontonos'] = 0x03CD; t['uptackbelowcmb'] = 0x031D; t['uptackmod'] = 0x02D4; t['uragurmukhi'] = 0x0A73; t['uring'] = 0x016F; t['ushortcyrillic'] = 0x045E; t['usmallhiragana'] = 0x3045; t['usmallkatakana'] = 0x30A5; t['usmallkatakanahalfwidth'] = 0xFF69; t['ustraightcyrillic'] = 0x04AF; t['ustraightstrokecyrillic'] = 0x04B1; t['utilde'] = 0x0169; t['utildeacute'] = 0x1E79; t['utildebelow'] = 0x1E75; t['uubengali'] = 0x098A; t['uudeva'] = 0x090A; t['uugujarati'] = 0x0A8A; t['uugurmukhi'] = 0x0A0A; t['uumatragurmukhi'] = 0x0A42; t['uuvowelsignbengali'] = 0x09C2; t['uuvowelsigndeva'] = 0x0942; t['uuvowelsigngujarati'] = 0x0AC2; t['uvowelsignbengali'] = 0x09C1; t['uvowelsigndeva'] = 0x0941; t['uvowelsigngujarati'] = 0x0AC1; t['v'] = 0x0076; t['vadeva'] = 0x0935; t['vagujarati'] = 0x0AB5; t['vagurmukhi'] = 0x0A35; t['vakatakana'] = 0x30F7; t['vav'] = 0x05D5; t['vavdagesh'] = 0xFB35; t['vavdagesh65'] = 0xFB35; t['vavdageshhebrew'] = 0xFB35; t['vavhebrew'] = 0x05D5; t['vavholam'] = 0xFB4B; t['vavholamhebrew'] = 0xFB4B; t['vavvavhebrew'] = 0x05F0; t['vavyodhebrew'] = 0x05F1; t['vcircle'] = 0x24E5; t['vdotbelow'] = 0x1E7F; t['vecyrillic'] = 0x0432; t['veharabic'] = 0x06A4; t['vehfinalarabic'] = 0xFB6B; t['vehinitialarabic'] = 0xFB6C; t['vehmedialarabic'] = 0xFB6D; t['vekatakana'] = 0x30F9; t['venus'] = 0x2640; t['verticalbar'] = 0x007C; t['verticallineabovecmb'] = 0x030D; t['verticallinebelowcmb'] = 0x0329; t['verticallinelowmod'] = 0x02CC; t['verticallinemod'] = 0x02C8; t['vewarmenian'] = 0x057E; t['vhook'] = 0x028B; t['vikatakana'] = 0x30F8; t['viramabengali'] = 0x09CD; t['viramadeva'] = 0x094D; t['viramagujarati'] = 0x0ACD; t['visargabengali'] = 0x0983; t['visargadeva'] = 0x0903; t['visargagujarati'] = 0x0A83; t['vmonospace'] = 0xFF56; t['voarmenian'] = 0x0578; t['voicediterationhiragana'] = 0x309E; t['voicediterationkatakana'] = 0x30FE; t['voicedmarkkana'] = 0x309B; t['voicedmarkkanahalfwidth'] = 0xFF9E; t['vokatakana'] = 0x30FA; t['vparen'] = 0x24B1; t['vtilde'] = 0x1E7D; t['vturned'] = 0x028C; t['vuhiragana'] = 0x3094; t['vukatakana'] = 0x30F4; t['w'] = 0x0077; t['wacute'] = 0x1E83; t['waekorean'] = 0x3159; t['wahiragana'] = 0x308F; t['wakatakana'] = 0x30EF; t['wakatakanahalfwidth'] = 0xFF9C; t['wakorean'] = 0x3158; t['wasmallhiragana'] = 0x308E; t['wasmallkatakana'] = 0x30EE; t['wattosquare'] = 0x3357; t['wavedash'] = 0x301C; t['wavyunderscorevertical'] = 0xFE34; t['wawarabic'] = 0x0648; t['wawfinalarabic'] = 0xFEEE; t['wawhamzaabovearabic'] = 0x0624; t['wawhamzaabovefinalarabic'] = 0xFE86; t['wbsquare'] = 0x33DD; t['wcircle'] = 0x24E6; t['wcircumflex'] = 0x0175; t['wdieresis'] = 0x1E85; t['wdotaccent'] = 0x1E87; t['wdotbelow'] = 0x1E89; t['wehiragana'] = 0x3091; t['weierstrass'] = 0x2118; t['wekatakana'] = 0x30F1; t['wekorean'] = 0x315E; t['weokorean'] = 0x315D; t['wgrave'] = 0x1E81; t['whitebullet'] = 0x25E6; t['whitecircle'] = 0x25CB; t['whitecircleinverse'] = 0x25D9; t['whitecornerbracketleft'] = 0x300E; t['whitecornerbracketleftvertical'] = 0xFE43; t['whitecornerbracketright'] = 0x300F; t['whitecornerbracketrightvertical'] = 0xFE44; t['whitediamond'] = 0x25C7; t['whitediamondcontainingblacksmalldiamond'] = 0x25C8; t['whitedownpointingsmalltriangle'] = 0x25BF; t['whitedownpointingtriangle'] = 0x25BD; t['whiteleftpointingsmalltriangle'] = 0x25C3; t['whiteleftpointingtriangle'] = 0x25C1; t['whitelenticularbracketleft'] = 0x3016; t['whitelenticularbracketright'] = 0x3017; t['whiterightpointingsmalltriangle'] = 0x25B9; t['whiterightpointingtriangle'] = 0x25B7; t['whitesmallsquare'] = 0x25AB; t['whitesmilingface'] = 0x263A; t['whitesquare'] = 0x25A1; t['whitestar'] = 0x2606; t['whitetelephone'] = 0x260F; t['whitetortoiseshellbracketleft'] = 0x3018; t['whitetortoiseshellbracketright'] = 0x3019; t['whiteuppointingsmalltriangle'] = 0x25B5; t['whiteuppointingtriangle'] = 0x25B3; t['wihiragana'] = 0x3090; t['wikatakana'] = 0x30F0; t['wikorean'] = 0x315F; t['wmonospace'] = 0xFF57; t['wohiragana'] = 0x3092; t['wokatakana'] = 0x30F2; t['wokatakanahalfwidth'] = 0xFF66; t['won'] = 0x20A9; t['wonmonospace'] = 0xFFE6; t['wowaenthai'] = 0x0E27; t['wparen'] = 0x24B2; t['wring'] = 0x1E98; t['wsuperior'] = 0x02B7; t['wturned'] = 0x028D; t['wynn'] = 0x01BF; t['x'] = 0x0078; t['xabovecmb'] = 0x033D; t['xbopomofo'] = 0x3112; t['xcircle'] = 0x24E7; t['xdieresis'] = 0x1E8D; t['xdotaccent'] = 0x1E8B; t['xeharmenian'] = 0x056D; t['xi'] = 0x03BE; t['xmonospace'] = 0xFF58; t['xparen'] = 0x24B3; t['xsuperior'] = 0x02E3; t['y'] = 0x0079; t['yaadosquare'] = 0x334E; t['yabengali'] = 0x09AF; t['yacute'] = 0x00FD; t['yadeva'] = 0x092F; t['yaekorean'] = 0x3152; t['yagujarati'] = 0x0AAF; t['yagurmukhi'] = 0x0A2F; t['yahiragana'] = 0x3084; t['yakatakana'] = 0x30E4; t['yakatakanahalfwidth'] = 0xFF94; t['yakorean'] = 0x3151; t['yamakkanthai'] = 0x0E4E; t['yasmallhiragana'] = 0x3083; t['yasmallkatakana'] = 0x30E3; t['yasmallkatakanahalfwidth'] = 0xFF6C; t['yatcyrillic'] = 0x0463; t['ycircle'] = 0x24E8; t['ycircumflex'] = 0x0177; t['ydieresis'] = 0x00FF; t['ydotaccent'] = 0x1E8F; t['ydotbelow'] = 0x1EF5; t['yeharabic'] = 0x064A; t['yehbarreearabic'] = 0x06D2; t['yehbarreefinalarabic'] = 0xFBAF; t['yehfinalarabic'] = 0xFEF2; t['yehhamzaabovearabic'] = 0x0626; t['yehhamzaabovefinalarabic'] = 0xFE8A; t['yehhamzaaboveinitialarabic'] = 0xFE8B; t['yehhamzaabovemedialarabic'] = 0xFE8C; t['yehinitialarabic'] = 0xFEF3; t['yehmedialarabic'] = 0xFEF4; t['yehmeeminitialarabic'] = 0xFCDD; t['yehmeemisolatedarabic'] = 0xFC58; t['yehnoonfinalarabic'] = 0xFC94; t['yehthreedotsbelowarabic'] = 0x06D1; t['yekorean'] = 0x3156; t['yen'] = 0x00A5; t['yenmonospace'] = 0xFFE5; t['yeokorean'] = 0x3155; t['yeorinhieuhkorean'] = 0x3186; t['yerahbenyomohebrew'] = 0x05AA; t['yerahbenyomolefthebrew'] = 0x05AA; t['yericyrillic'] = 0x044B; t['yerudieresiscyrillic'] = 0x04F9; t['yesieungkorean'] = 0x3181; t['yesieungpansioskorean'] = 0x3183; t['yesieungsioskorean'] = 0x3182; t['yetivhebrew'] = 0x059A; t['ygrave'] = 0x1EF3; t['yhook'] = 0x01B4; t['yhookabove'] = 0x1EF7; t['yiarmenian'] = 0x0575; t['yicyrillic'] = 0x0457; t['yikorean'] = 0x3162; t['yinyang'] = 0x262F; t['yiwnarmenian'] = 0x0582; t['ymonospace'] = 0xFF59; t['yod'] = 0x05D9; t['yoddagesh'] = 0xFB39; t['yoddageshhebrew'] = 0xFB39; t['yodhebrew'] = 0x05D9; t['yodyodhebrew'] = 0x05F2; t['yodyodpatahhebrew'] = 0xFB1F; t['yohiragana'] = 0x3088; t['yoikorean'] = 0x3189; t['yokatakana'] = 0x30E8; t['yokatakanahalfwidth'] = 0xFF96; t['yokorean'] = 0x315B; t['yosmallhiragana'] = 0x3087; t['yosmallkatakana'] = 0x30E7; t['yosmallkatakanahalfwidth'] = 0xFF6E; t['yotgreek'] = 0x03F3; t['yoyaekorean'] = 0x3188; t['yoyakorean'] = 0x3187; t['yoyakthai'] = 0x0E22; t['yoyingthai'] = 0x0E0D; t['yparen'] = 0x24B4; t['ypogegrammeni'] = 0x037A; t['ypogegrammenigreekcmb'] = 0x0345; t['yr'] = 0x01A6; t['yring'] = 0x1E99; t['ysuperior'] = 0x02B8; t['ytilde'] = 0x1EF9; t['yturned'] = 0x028E; t['yuhiragana'] = 0x3086; t['yuikorean'] = 0x318C; t['yukatakana'] = 0x30E6; t['yukatakanahalfwidth'] = 0xFF95; t['yukorean'] = 0x3160; t['yusbigcyrillic'] = 0x046B; t['yusbigiotifiedcyrillic'] = 0x046D; t['yuslittlecyrillic'] = 0x0467; t['yuslittleiotifiedcyrillic'] = 0x0469; t['yusmallhiragana'] = 0x3085; t['yusmallkatakana'] = 0x30E5; t['yusmallkatakanahalfwidth'] = 0xFF6D; t['yuyekorean'] = 0x318B; t['yuyeokorean'] = 0x318A; t['yyabengali'] = 0x09DF; t['yyadeva'] = 0x095F; t['z'] = 0x007A; t['zaarmenian'] = 0x0566; t['zacute'] = 0x017A; t['zadeva'] = 0x095B; t['zagurmukhi'] = 0x0A5B; t['zaharabic'] = 0x0638; t['zahfinalarabic'] = 0xFEC6; t['zahinitialarabic'] = 0xFEC7; t['zahiragana'] = 0x3056; t['zahmedialarabic'] = 0xFEC8; t['zainarabic'] = 0x0632; t['zainfinalarabic'] = 0xFEB0; t['zakatakana'] = 0x30B6; t['zaqefgadolhebrew'] = 0x0595; t['zaqefqatanhebrew'] = 0x0594; t['zarqahebrew'] = 0x0598; t['zayin'] = 0x05D6; t['zayindagesh'] = 0xFB36; t['zayindageshhebrew'] = 0xFB36; t['zayinhebrew'] = 0x05D6; t['zbopomofo'] = 0x3117; t['zcaron'] = 0x017E; t['zcircle'] = 0x24E9; t['zcircumflex'] = 0x1E91; t['zcurl'] = 0x0291; t['zdot'] = 0x017C; t['zdotaccent'] = 0x017C; t['zdotbelow'] = 0x1E93; t['zecyrillic'] = 0x0437; t['zedescendercyrillic'] = 0x0499; t['zedieresiscyrillic'] = 0x04DF; t['zehiragana'] = 0x305C; t['zekatakana'] = 0x30BC; t['zero'] = 0x0030; t['zeroarabic'] = 0x0660; t['zerobengali'] = 0x09E6; t['zerodeva'] = 0x0966; t['zerogujarati'] = 0x0AE6; t['zerogurmukhi'] = 0x0A66; t['zerohackarabic'] = 0x0660; t['zeroinferior'] = 0x2080; t['zeromonospace'] = 0xFF10; t['zerooldstyle'] = 0xF730; t['zeropersian'] = 0x06F0; t['zerosuperior'] = 0x2070; t['zerothai'] = 0x0E50; t['zerowidthjoiner'] = 0xFEFF; t['zerowidthnonjoiner'] = 0x200C; t['zerowidthspace'] = 0x200B; t['zeta'] = 0x03B6; t['zhbopomofo'] = 0x3113; t['zhearmenian'] = 0x056A; t['zhebrevecyrillic'] = 0x04C2; t['zhecyrillic'] = 0x0436; t['zhedescendercyrillic'] = 0x0497; t['zhedieresiscyrillic'] = 0x04DD; t['zihiragana'] = 0x3058; t['zikatakana'] = 0x30B8; t['zinorhebrew'] = 0x05AE; t['zlinebelow'] = 0x1E95; t['zmonospace'] = 0xFF5A; t['zohiragana'] = 0x305E; t['zokatakana'] = 0x30BE; t['zparen'] = 0x24B5; t['zretroflexhook'] = 0x0290; t['zstroke'] = 0x01B6; t['zuhiragana'] = 0x305A; t['zukatakana'] = 0x30BA; t['.notdef'] = 0x0000; }); var getDingbatsGlyphsUnicode = getLookupTableFactory(function (t) { t['space'] = 0x0020; t['a1'] = 0x2701; t['a2'] = 0x2702; t['a202'] = 0x2703; t['a3'] = 0x2704; t['a4'] = 0x260E; t['a5'] = 0x2706; t['a119'] = 0x2707; t['a118'] = 0x2708; t['a117'] = 0x2709; t['a11'] = 0x261B; t['a12'] = 0x261E; t['a13'] = 0x270C; t['a14'] = 0x270D; t['a15'] = 0x270E; t['a16'] = 0x270F; t['a105'] = 0x2710; t['a17'] = 0x2711; t['a18'] = 0x2712; t['a19'] = 0x2713; t['a20'] = 0x2714; t['a21'] = 0x2715; t['a22'] = 0x2716; t['a23'] = 0x2717; t['a24'] = 0x2718; t['a25'] = 0x2719; t['a26'] = 0x271A; t['a27'] = 0x271B; t['a28'] = 0x271C; t['a6'] = 0x271D; t['a7'] = 0x271E; t['a8'] = 0x271F; t['a9'] = 0x2720; t['a10'] = 0x2721; t['a29'] = 0x2722; t['a30'] = 0x2723; t['a31'] = 0x2724; t['a32'] = 0x2725; t['a33'] = 0x2726; t['a34'] = 0x2727; t['a35'] = 0x2605; t['a36'] = 0x2729; t['a37'] = 0x272A; t['a38'] = 0x272B; t['a39'] = 0x272C; t['a40'] = 0x272D; t['a41'] = 0x272E; t['a42'] = 0x272F; t['a43'] = 0x2730; t['a44'] = 0x2731; t['a45'] = 0x2732; t['a46'] = 0x2733; t['a47'] = 0x2734; t['a48'] = 0x2735; t['a49'] = 0x2736; t['a50'] = 0x2737; t['a51'] = 0x2738; t['a52'] = 0x2739; t['a53'] = 0x273A; t['a54'] = 0x273B; t['a55'] = 0x273C; t['a56'] = 0x273D; t['a57'] = 0x273E; t['a58'] = 0x273F; t['a59'] = 0x2740; t['a60'] = 0x2741; t['a61'] = 0x2742; t['a62'] = 0x2743; t['a63'] = 0x2744; t['a64'] = 0x2745; t['a65'] = 0x2746; t['a66'] = 0x2747; t['a67'] = 0x2748; t['a68'] = 0x2749; t['a69'] = 0x274A; t['a70'] = 0x274B; t['a71'] = 0x25CF; t['a72'] = 0x274D; t['a73'] = 0x25A0; t['a74'] = 0x274F; t['a203'] = 0x2750; t['a75'] = 0x2751; t['a204'] = 0x2752; t['a76'] = 0x25B2; t['a77'] = 0x25BC; t['a78'] = 0x25C6; t['a79'] = 0x2756; t['a81'] = 0x25D7; t['a82'] = 0x2758; t['a83'] = 0x2759; t['a84'] = 0x275A; t['a97'] = 0x275B; t['a98'] = 0x275C; t['a99'] = 0x275D; t['a100'] = 0x275E; t['a101'] = 0x2761; t['a102'] = 0x2762; t['a103'] = 0x2763; t['a104'] = 0x2764; t['a106'] = 0x2765; t['a107'] = 0x2766; t['a108'] = 0x2767; t['a112'] = 0x2663; t['a111'] = 0x2666; t['a110'] = 0x2665; t['a109'] = 0x2660; t['a120'] = 0x2460; t['a121'] = 0x2461; t['a122'] = 0x2462; t['a123'] = 0x2463; t['a124'] = 0x2464; t['a125'] = 0x2465; t['a126'] = 0x2466; t['a127'] = 0x2467; t['a128'] = 0x2468; t['a129'] = 0x2469; t['a130'] = 0x2776; t['a131'] = 0x2777; t['a132'] = 0x2778; t['a133'] = 0x2779; t['a134'] = 0x277A; t['a135'] = 0x277B; t['a136'] = 0x277C; t['a137'] = 0x277D; t['a138'] = 0x277E; t['a139'] = 0x277F; t['a140'] = 0x2780; t['a141'] = 0x2781; t['a142'] = 0x2782; t['a143'] = 0x2783; t['a144'] = 0x2784; t['a145'] = 0x2785; t['a146'] = 0x2786; t['a147'] = 0x2787; t['a148'] = 0x2788; t['a149'] = 0x2789; t['a150'] = 0x278A; t['a151'] = 0x278B; t['a152'] = 0x278C; t['a153'] = 0x278D; t['a154'] = 0x278E; t['a155'] = 0x278F; t['a156'] = 0x2790; t['a157'] = 0x2791; t['a158'] = 0x2792; t['a159'] = 0x2793; t['a160'] = 0x2794; t['a161'] = 0x2192; t['a163'] = 0x2194; t['a164'] = 0x2195; t['a196'] = 0x2798; t['a165'] = 0x2799; t['a192'] = 0x279A; t['a166'] = 0x279B; t['a167'] = 0x279C; t['a168'] = 0x279D; t['a169'] = 0x279E; t['a170'] = 0x279F; t['a171'] = 0x27A0; t['a172'] = 0x27A1; t['a173'] = 0x27A2; t['a162'] = 0x27A3; t['a174'] = 0x27A4; t['a175'] = 0x27A5; t['a176'] = 0x27A6; t['a177'] = 0x27A7; t['a178'] = 0x27A8; t['a179'] = 0x27A9; t['a193'] = 0x27AA; t['a180'] = 0x27AB; t['a199'] = 0x27AC; t['a181'] = 0x27AD; t['a200'] = 0x27AE; t['a182'] = 0x27AF; t['a201'] = 0x27B1; t['a183'] = 0x27B2; t['a184'] = 0x27B3; t['a197'] = 0x27B4; t['a185'] = 0x27B5; t['a194'] = 0x27B6; t['a198'] = 0x27B7; t['a186'] = 0x27B8; t['a195'] = 0x27B9; t['a187'] = 0x27BA; t['a188'] = 0x27BB; t['a189'] = 0x27BC; t['a190'] = 0x27BD; t['a191'] = 0x27BE; t['a89'] = 0x2768; // 0xF8D7 t['a90'] = 0x2769; // 0xF8D8 t['a93'] = 0x276A; // 0xF8D9 t['a94'] = 0x276B; // 0xF8DA t['a91'] = 0x276C; // 0xF8DB t['a92'] = 0x276D; // 0xF8DC t['a205'] = 0x276E; // 0xF8DD t['a85'] = 0x276F; // 0xF8DE t['a206'] = 0x2770; // 0xF8DF t['a86'] = 0x2771; // 0xF8E0 t['a87'] = 0x2772; // 0xF8E1 t['a88'] = 0x2773; // 0xF8E2 t['a95'] = 0x2774; // 0xF8E3 t['a96'] = 0x2775; // 0xF8E4 t['.notdef'] = 0x0000; }); exports.getGlyphsUnicode = getGlyphsUnicode; exports.getDingbatsGlyphsUnicode = getDingbatsGlyphsUnicode; })); (function (root, factory) { { factory((root.pdfjsCoreJbig2 = {}), root.pdfjsSharedUtil, root.pdfjsCoreArithmeticDecoder); } }(this, function (exports, sharedUtil, coreArithmeticDecoder) { var error = sharedUtil.error; var log2 = sharedUtil.log2; var readInt8 = sharedUtil.readInt8; var readUint16 = sharedUtil.readUint16; var readUint32 = sharedUtil.readUint32; var shadow = sharedUtil.shadow; var ArithmeticDecoder = coreArithmeticDecoder.ArithmeticDecoder; var Jbig2Image = (function Jbig2ImageClosure() { // Utility data structures function ContextCache() {} ContextCache.prototype = { getContexts: function(id) { if (id in this) { return this[id]; } return (this[id] = new Int8Array(1 << 16)); } }; function DecodingContext(data, start, end) { this.data = data; this.start = start; this.end = end; } DecodingContext.prototype = { get decoder() { var decoder = new ArithmeticDecoder(this.data, this.start, this.end); return shadow(this, 'decoder', decoder); }, get contextCache() { var cache = new ContextCache(); return shadow(this, 'contextCache', cache); } }; // Annex A. Arithmetic Integer Decoding Procedure // A.2 Procedure for decoding values function decodeInteger(contextCache, procedure, decoder) { var contexts = contextCache.getContexts(procedure); var prev = 1; function readBits(length) { var v = 0; for (var i = 0; i < length; i++) { var bit = decoder.readBit(contexts, prev); prev = (prev < 256 ? (prev << 1) | bit : (((prev << 1) | bit) & 511) | 256); v = (v << 1) | bit; } return v >>> 0; } var sign = readBits(1); var value = readBits(1) ? (readBits(1) ? (readBits(1) ? (readBits(1) ? (readBits(1) ? (readBits(32) + 4436) : readBits(12) + 340) : readBits(8) + 84) : readBits(6) + 20) : readBits(4) + 4) : readBits(2); return (sign === 0 ? value : (value > 0 ? -value : null)); } // A.3 The IAID decoding procedure function decodeIAID(contextCache, decoder, codeLength) { var contexts = contextCache.getContexts('IAID'); var prev = 1; for (var i = 0; i < codeLength; i++) { var bit = decoder.readBit(contexts, prev); prev = (prev << 1) | bit; } if (codeLength < 31) { return prev & ((1 << codeLength) - 1); } return prev & 0x7FFFFFFF; } // 7.3 Segment types var SegmentTypes = [ 'SymbolDictionary', null, null, null, 'IntermediateTextRegion', null, 'ImmediateTextRegion', 'ImmediateLosslessTextRegion', null, null, null, null, null, null, null, null, 'patternDictionary', null, null, null, 'IntermediateHalftoneRegion', null, 'ImmediateHalftoneRegion', 'ImmediateLosslessHalftoneRegion', null, null, null, null, null, null, null, null, null, null, null, null, 'IntermediateGenericRegion', null, 'ImmediateGenericRegion', 'ImmediateLosslessGenericRegion', 'IntermediateGenericRefinementRegion', null, 'ImmediateGenericRefinementRegion', 'ImmediateLosslessGenericRefinementRegion', null, null, null, null, 'PageInformation', 'EndOfPage', 'EndOfStripe', 'EndOfFile', 'Profiles', 'Tables', null, null, null, null, null, null, null, null, 'Extension' ]; var CodingTemplates = [ [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: 2, y: -1}, {x: -4, y: 0}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}], [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: 2, y: -2}, {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: 2, y: -1}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}], [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -2, y: 0}, {x: -1, y: 0}], [{x: -3, y: -1}, {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -4, y: 0}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}] ]; var RefinementTemplates = [ { coding: [{x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}], reference: [{x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}, {x: 0, y: 0}, {x: 1, y: 0}, {x: -1, y: 1}, {x: 0, y: 1}, {x: 1, y: 1}] }, { coding: [{x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}], reference: [{x: 0, y: -1}, {x: -1, y: 0}, {x: 0, y: 0}, {x: 1, y: 0}, {x: 0, y: 1}, {x: 1, y: 1}] } ]; // See 6.2.5.7 Decoding the bitmap. var ReusedContexts = [ 0x9B25, // 10011 0110010 0101 0x0795, // 0011 110010 101 0x00E5, // 001 11001 01 0x0195 // 011001 0101 ]; var RefinementReusedContexts = [ 0x0020, // '000' + '0' (coding) + '00010000' + '0' (reference) 0x0008 // '0000' + '001000' ]; function decodeBitmapTemplate0(width, height, decodingContext) { var decoder = decodingContext.decoder; var contexts = decodingContext.contextCache.getContexts('GB'); var contextLabel, i, j, pixel, row, row1, row2, bitmap = []; // ...ooooo.... // ..ooooooo... Context template for current pixel (X) // .ooooX...... (concatenate values of 'o'-pixels to get contextLabel) var OLD_PIXEL_MASK = 0x7BF7; // 01111 0111111 0111 for (i = 0; i < height; i++) { row = bitmap[i] = new Uint8Array(width); row1 = (i < 1) ? row : bitmap[i - 1]; row2 = (i < 2) ? row : bitmap[i - 2]; // At the beginning of each row: // Fill contextLabel with pixels that are above/right of (X) contextLabel = (row2[0] << 13) | (row2[1] << 12) | (row2[2] << 11) | (row1[0] << 7) | (row1[1] << 6) | (row1[2] << 5) | (row1[3] << 4); for (j = 0; j < width; j++) { row[j] = pixel = decoder.readBit(contexts, contextLabel); // At each pixel: Clear contextLabel pixels that are shifted // out of the context, then add new ones. contextLabel = ((contextLabel & OLD_PIXEL_MASK) << 1) | (j + 3 < width ? row2[j + 3] << 11 : 0) | (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel; } } return bitmap; } // 6.2 Generic Region Decoding Procedure function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, decodingContext) { if (mmr) { error('JBIG2 error: MMR encoding is not supported'); } // Use optimized version for the most common case if (templateIndex === 0 && !skip && !prediction && at.length === 4 && at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 && at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) { return decodeBitmapTemplate0(width, height, decodingContext); } var useskip = !!skip; var template = CodingTemplates[templateIndex].concat(at); // Sorting is non-standard, and it is not required. But sorting increases // the number of template bits that can be reused from the previous // contextLabel in the main loop. template.sort(function (a, b) { return (a.y - b.y) || (a.x - b.x); }); var templateLength = template.length; var templateX = new Int8Array(templateLength); var templateY = new Int8Array(templateLength); var changingTemplateEntries = []; var reuseMask = 0, minX = 0, maxX = 0, minY = 0; var c, k; for (k = 0; k < templateLength; k++) { templateX[k] = template[k].x; templateY[k] = template[k].y; minX = Math.min(minX, template[k].x); maxX = Math.max(maxX, template[k].x); minY = Math.min(minY, template[k].y); // Check if the template pixel appears in two consecutive context labels, // so it can be reused. Otherwise, we add it to the list of changing // template entries. if (k < templateLength - 1 && template[k].y === template[k + 1].y && template[k].x === template[k + 1].x - 1) { reuseMask |= 1 << (templateLength - 1 - k); } else { changingTemplateEntries.push(k); } } var changingEntriesLength = changingTemplateEntries.length; var changingTemplateX = new Int8Array(changingEntriesLength); var changingTemplateY = new Int8Array(changingEntriesLength); var changingTemplateBit = new Uint16Array(changingEntriesLength); for (c = 0; c < changingEntriesLength; c++) { k = changingTemplateEntries[c]; changingTemplateX[c] = template[k].x; changingTemplateY[c] = template[k].y; changingTemplateBit[c] = 1 << (templateLength - 1 - k); } // Get the safe bounding box edges from the width, height, minX, maxX, minY var sbb_left = -minX; var sbb_top = -minY; var sbb_right = width - maxX; var pseudoPixelContext = ReusedContexts[templateIndex]; var row = new Uint8Array(width); var bitmap = []; var decoder = decodingContext.decoder; var contexts = decodingContext.contextCache.getContexts('GB'); var ltp = 0, j, i0, j0, contextLabel = 0, bit, shift; for (var i = 0; i < height; i++) { if (prediction) { var sltp = decoder.readBit(contexts, pseudoPixelContext); ltp ^= sltp; if (ltp) { bitmap.push(row); // duplicate previous row continue; } } row = new Uint8Array(row); bitmap.push(row); for (j = 0; j < width; j++) { if (useskip && skip[i][j]) { row[j] = 0; continue; } // Are we in the middle of a scanline, so we can reuse contextLabel // bits? if (j >= sbb_left && j < sbb_right && i >= sbb_top) { // If yes, we can just shift the bits that are reusable and only // fetch the remaining ones. contextLabel = (contextLabel << 1) & reuseMask; for (k = 0; k < changingEntriesLength; k++) { i0 = i + changingTemplateY[k]; j0 = j + changingTemplateX[k]; bit = bitmap[i0][j0]; if (bit) { bit = changingTemplateBit[k]; contextLabel |= bit; } } } else { // compute the contextLabel from scratch contextLabel = 0; shift = templateLength - 1; for (k = 0; k < templateLength; k++, shift--) { j0 = j + templateX[k]; if (j0 >= 0 && j0 < width) { i0 = i + templateY[k]; if (i0 >= 0) { bit = bitmap[i0][j0]; if (bit) { contextLabel |= bit << shift; } } } } } var pixel = decoder.readBit(contexts, contextLabel); row[j] = pixel; } } return bitmap; } // 6.3.2 Generic Refinement Region Decoding Procedure function decodeRefinement(width, height, templateIndex, referenceBitmap, offsetX, offsetY, prediction, at, decodingContext) { var codingTemplate = RefinementTemplates[templateIndex].coding; if (templateIndex === 0) { codingTemplate = codingTemplate.concat([at[0]]); } var codingTemplateLength = codingTemplate.length; var codingTemplateX = new Int32Array(codingTemplateLength); var codingTemplateY = new Int32Array(codingTemplateLength); var k; for (k = 0; k < codingTemplateLength; k++) { codingTemplateX[k] = codingTemplate[k].x; codingTemplateY[k] = codingTemplate[k].y; } var referenceTemplate = RefinementTemplates[templateIndex].reference; if (templateIndex === 0) { referenceTemplate = referenceTemplate.concat([at[1]]); } var referenceTemplateLength = referenceTemplate.length; var referenceTemplateX = new Int32Array(referenceTemplateLength); var referenceTemplateY = new Int32Array(referenceTemplateLength); for (k = 0; k < referenceTemplateLength; k++) { referenceTemplateX[k] = referenceTemplate[k].x; referenceTemplateY[k] = referenceTemplate[k].y; } var referenceWidth = referenceBitmap[0].length; var referenceHeight = referenceBitmap.length; var pseudoPixelContext = RefinementReusedContexts[templateIndex]; var bitmap = []; var decoder = decodingContext.decoder; var contexts = decodingContext.contextCache.getContexts('GR'); var ltp = 0; for (var i = 0; i < height; i++) { if (prediction) { var sltp = decoder.readBit(contexts, pseudoPixelContext); ltp ^= sltp; if (ltp) { error('JBIG2 error: prediction is not supported'); } } var row = new Uint8Array(width); bitmap.push(row); for (var j = 0; j < width; j++) { var i0, j0; var contextLabel = 0; for (k = 0; k < codingTemplateLength; k++) { i0 = i + codingTemplateY[k]; j0 = j + codingTemplateX[k]; if (i0 < 0 || j0 < 0 || j0 >= width) { contextLabel <<= 1; // out of bound pixel } else { contextLabel = (contextLabel << 1) | bitmap[i0][j0]; } } for (k = 0; k < referenceTemplateLength; k++) { i0 = i + referenceTemplateY[k] + offsetY; j0 = j + referenceTemplateX[k] + offsetX; if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || j0 >= referenceWidth) { contextLabel <<= 1; // out of bound pixel } else { contextLabel = (contextLabel << 1) | referenceBitmap[i0][j0]; } } var pixel = decoder.readBit(contexts, contextLabel); row[j] = pixel; } } return bitmap; } // 6.5.5 Decoding the symbol dictionary function decodeSymbolDictionary(huffman, refinement, symbols, numberOfNewSymbols, numberOfExportedSymbols, huffmanTables, templateIndex, at, refinementTemplateIndex, refinementAt, decodingContext) { if (huffman) { error('JBIG2 error: huffman is not supported'); } var newSymbols = []; var currentHeight = 0; var symbolCodeLength = log2(symbols.length + numberOfNewSymbols); var decoder = decodingContext.decoder; var contextCache = decodingContext.contextCache; while (newSymbols.length < numberOfNewSymbols) { var deltaHeight = decodeInteger(contextCache, 'IADH', decoder); // 6.5.6 currentHeight += deltaHeight; var currentWidth = 0; var totalWidth = 0; while (true) { var deltaWidth = decodeInteger(contextCache, 'IADW', decoder); // 6.5.7 if (deltaWidth === null) { break; // OOB } currentWidth += deltaWidth; totalWidth += currentWidth; var bitmap; if (refinement) { // 6.5.8.2 Refinement/aggregate-coded symbol bitmap var numberOfInstances = decodeInteger(contextCache, 'IAAI', decoder); if (numberOfInstances > 1) { bitmap = decodeTextRegion(huffman, refinement, currentWidth, currentHeight, 0, numberOfInstances, 1, //strip size symbols.concat(newSymbols), symbolCodeLength, 0, //transposed 0, //ds offset 1, //top left 7.4.3.1.1 0, //OR operator huffmanTables, refinementTemplateIndex, refinementAt, decodingContext); } else { var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3 var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4 var symbol = (symbolId < symbols.length ? symbols[symbolId] : newSymbols[symbolId - symbols.length]); bitmap = decodeRefinement(currentWidth, currentHeight, refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt, decodingContext); } } else { // 6.5.8.1 Direct-coded symbol bitmap bitmap = decodeBitmap(false, currentWidth, currentHeight, templateIndex, false, null, at, decodingContext); } newSymbols.push(bitmap); } } // 6.5.10 Exported symbols var exportedSymbols = []; var flags = [], currentFlag = false; var totalSymbolsLength = symbols.length + numberOfNewSymbols; while (flags.length < totalSymbolsLength) { var runLength = decodeInteger(contextCache, 'IAEX', decoder); while (runLength--) { flags.push(currentFlag); } currentFlag = !currentFlag; } for (var i = 0, ii = symbols.length; i < ii; i++) { if (flags[i]) { exportedSymbols.push(symbols[i]); } } for (var j = 0; j < numberOfNewSymbols; i++, j++) { if (flags[i]) { exportedSymbols.push(newSymbols[j]); } } return exportedSymbols; } function decodeTextRegion(huffman, refinement, width, height, defaultPixelValue, numberOfSymbolInstances, stripSize, inputSymbols, symbolCodeLength, transposed, dsOffset, referenceCorner, combinationOperator, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext) { if (huffman) { error('JBIG2 error: huffman is not supported'); } // Prepare bitmap var bitmap = []; var i, row; for (i = 0; i < height; i++) { row = new Uint8Array(width); if (defaultPixelValue) { for (var j = 0; j < width; j++) { row[j] = defaultPixelValue; } } bitmap.push(row); } var decoder = decodingContext.decoder; var contextCache = decodingContext.contextCache; var stripT = -decodeInteger(contextCache, 'IADT', decoder); // 6.4.6 var firstS = 0; i = 0; while (i < numberOfSymbolInstances) { var deltaT = decodeInteger(contextCache, 'IADT', decoder); // 6.4.6 stripT += deltaT; var deltaFirstS = decodeInteger(contextCache, 'IAFS', decoder); // 6.4.7 firstS += deltaFirstS; var currentS = firstS; do { var currentT = (stripSize === 1 ? 0 : decodeInteger(contextCache, 'IAIT', decoder)); // 6.4.9 var t = stripSize * stripT + currentT; var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); var applyRefinement = (refinement && decodeInteger(contextCache, 'IARI', decoder)); var symbolBitmap = inputSymbols[symbolId]; var symbolWidth = symbolBitmap[0].length; var symbolHeight = symbolBitmap.length; if (applyRefinement) { var rdw = decodeInteger(contextCache, 'IARDW', decoder); // 6.4.11.1 var rdh = decodeInteger(contextCache, 'IARDH', decoder); // 6.4.11.2 var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3 var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4 symbolWidth += rdw; symbolHeight += rdh; symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx, (rdh >> 1) + rdy, false, refinementAt, decodingContext); } var offsetT = t - ((referenceCorner & 1) ? 0 : symbolHeight); var offsetS = currentS - ((referenceCorner & 2) ? symbolWidth : 0); var s2, t2, symbolRow; if (transposed) { // Place Symbol Bitmap from T1,S1 for (s2 = 0; s2 < symbolHeight; s2++) { row = bitmap[offsetS + s2]; if (!row) { continue; } symbolRow = symbolBitmap[s2]; // To ignore Parts of Symbol bitmap which goes // outside bitmap region var maxWidth = Math.min(width - offsetT, symbolWidth); switch (combinationOperator) { case 0: // OR for (t2 = 0; t2 < maxWidth; t2++) { row[offsetT + t2] |= symbolRow[t2]; } break; case 2: // XOR for (t2 = 0; t2 < maxWidth; t2++) { row[offsetT + t2] ^= symbolRow[t2]; } break; default: error('JBIG2 error: operator ' + combinationOperator + ' is not supported'); } } currentS += symbolHeight - 1; } else { for (t2 = 0; t2 < symbolHeight; t2++) { row = bitmap[offsetT + t2]; if (!row) { continue; } symbolRow = symbolBitmap[t2]; switch (combinationOperator) { case 0: // OR for (s2 = 0; s2 < symbolWidth; s2++) { row[offsetS + s2] |= symbolRow[s2]; } break; case 2: // XOR for (s2 = 0; s2 < symbolWidth; s2++) { row[offsetS + s2] ^= symbolRow[s2]; } break; default: error('JBIG2 error: operator ' + combinationOperator + ' is not supported'); } } currentS += symbolWidth - 1; } i++; var deltaS = decodeInteger(contextCache, 'IADS', decoder); // 6.4.8 if (deltaS === null) { break; // OOB } currentS += deltaS + dsOffset; } while (true); } return bitmap; } function readSegmentHeader(data, start) { var segmentHeader = {}; segmentHeader.number = readUint32(data, start); var flags = data[start + 4]; var segmentType = flags & 0x3F; if (!SegmentTypes[segmentType]) { error('JBIG2 error: invalid segment type: ' + segmentType); } segmentHeader.type = segmentType; segmentHeader.typeName = SegmentTypes[segmentType]; segmentHeader.deferredNonRetain = !!(flags & 0x80); var pageAssociationFieldSize = !!(flags & 0x40); var referredFlags = data[start + 5]; var referredToCount = (referredFlags >> 5) & 7; var retainBits = [referredFlags & 31]; var position = start + 6; if (referredFlags === 7) { referredToCount = readUint32(data, position - 1) & 0x1FFFFFFF; position += 3; var bytes = (referredToCount + 7) >> 3; retainBits[0] = data[position++]; while (--bytes > 0) { retainBits.push(data[position++]); } } else if (referredFlags === 5 || referredFlags === 6) { error('JBIG2 error: invalid referred-to flags'); } segmentHeader.retainBits = retainBits; var referredToSegmentNumberSize = (segmentHeader.number <= 256 ? 1 : (segmentHeader.number <= 65536 ? 2 : 4)); var referredTo = []; var i, ii; for (i = 0; i < referredToCount; i++) { var number = (referredToSegmentNumberSize === 1 ? data[position] : (referredToSegmentNumberSize === 2 ? readUint16(data, position) : readUint32(data, position))); referredTo.push(number); position += referredToSegmentNumberSize; } segmentHeader.referredTo = referredTo; if (!pageAssociationFieldSize) { segmentHeader.pageAssociation = data[position++]; } else { segmentHeader.pageAssociation = readUint32(data, position); position += 4; } segmentHeader.length = readUint32(data, position); position += 4; if (segmentHeader.length === 0xFFFFFFFF) { // 7.2.7 Segment data length, unknown segment length if (segmentType === 38) { // ImmediateGenericRegion var genericRegionInfo = readRegionSegmentInformation(data, position); var genericRegionSegmentFlags = data[position + RegionSegmentInformationFieldLength]; var genericRegionMmr = !!(genericRegionSegmentFlags & 1); // searching for the segment end var searchPatternLength = 6; var searchPattern = new Uint8Array(searchPatternLength); if (!genericRegionMmr) { searchPattern[0] = 0xFF; searchPattern[1] = 0xAC; } searchPattern[2] = (genericRegionInfo.height >>> 24) & 0xFF; searchPattern[3] = (genericRegionInfo.height >> 16) & 0xFF; searchPattern[4] = (genericRegionInfo.height >> 8) & 0xFF; searchPattern[5] = genericRegionInfo.height & 0xFF; for (i = position, ii = data.length; i < ii; i++) { var j = 0; while (j < searchPatternLength && searchPattern[j] === data[i + j]) { j++; } if (j === searchPatternLength) { segmentHeader.length = i + searchPatternLength; break; } } if (segmentHeader.length === 0xFFFFFFFF) { error('JBIG2 error: segment end was not found'); } } else { error('JBIG2 error: invalid unknown segment length'); } } segmentHeader.headerEnd = position; return segmentHeader; } function readSegments(header, data, start, end) { var segments = []; var position = start; while (position < end) { var segmentHeader = readSegmentHeader(data, position); position = segmentHeader.headerEnd; var segment = { header: segmentHeader, data: data }; if (!header.randomAccess) { segment.start = position; position += segmentHeader.length; segment.end = position; } segments.push(segment); if (segmentHeader.type === 51) { break; // end of file is found } } if (header.randomAccess) { for (var i = 0, ii = segments.length; i < ii; i++) { segments[i].start = position; position += segments[i].header.length; segments[i].end = position; } } return segments; } // 7.4.1 Region segment information field function readRegionSegmentInformation(data, start) { return { width: readUint32(data, start), height: readUint32(data, start + 4), x: readUint32(data, start + 8), y: readUint32(data, start + 12), combinationOperator: data[start + 16] & 7 }; } var RegionSegmentInformationFieldLength = 17; function processSegment(segment, visitor) { var header = segment.header; var data = segment.data, position = segment.start, end = segment.end; var args, at, i, atLength; switch (header.type) { case 0: // SymbolDictionary // 7.4.2 Symbol dictionary segment syntax var dictionary = {}; var dictionaryFlags = readUint16(data, position); // 7.4.2.1.1 dictionary.huffman = !!(dictionaryFlags & 1); dictionary.refinement = !!(dictionaryFlags & 2); dictionary.huffmanDHSelector = (dictionaryFlags >> 2) & 3; dictionary.huffmanDWSelector = (dictionaryFlags >> 4) & 3; dictionary.bitmapSizeSelector = (dictionaryFlags >> 6) & 1; dictionary.aggregationInstancesSelector = (dictionaryFlags >> 7) & 1; dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256); dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512); dictionary.template = (dictionaryFlags >> 10) & 3; dictionary.refinementTemplate = (dictionaryFlags >> 12) & 1; position += 2; if (!dictionary.huffman) { atLength = dictionary.template === 0 ? 4 : 1; at = []; for (i = 0; i < atLength; i++) { at.push({ x: readInt8(data, position), y: readInt8(data, position + 1) }); position += 2; } dictionary.at = at; } if (dictionary.refinement && !dictionary.refinementTemplate) { at = []; for (i = 0; i < 2; i++) { at.push({ x: readInt8(data, position), y: readInt8(data, position + 1) }); position += 2; } dictionary.refinementAt = at; } dictionary.numberOfExportedSymbols = readUint32(data, position); position += 4; dictionary.numberOfNewSymbols = readUint32(data, position); position += 4; args = [dictionary, header.number, header.referredTo, data, position, end]; break; case 6: // ImmediateTextRegion case 7: // ImmediateLosslessTextRegion var textRegion = {}; textRegion.info = readRegionSegmentInformation(data, position); position += RegionSegmentInformationFieldLength; var textRegionSegmentFlags = readUint16(data, position); position += 2; textRegion.huffman = !!(textRegionSegmentFlags & 1); textRegion.refinement = !!(textRegionSegmentFlags & 2); textRegion.stripSize = 1 << ((textRegionSegmentFlags >> 2) & 3); textRegion.referenceCorner = (textRegionSegmentFlags >> 4) & 3; textRegion.transposed = !!(textRegionSegmentFlags & 64); textRegion.combinationOperator = (textRegionSegmentFlags >> 7) & 3; textRegion.defaultPixelValue = (textRegionSegmentFlags >> 9) & 1; textRegion.dsOffset = (textRegionSegmentFlags << 17) >> 27; textRegion.refinementTemplate = (textRegionSegmentFlags >> 15) & 1; if (textRegion.huffman) { var textRegionHuffmanFlags = readUint16(data, position); position += 2; textRegion.huffmanFS = (textRegionHuffmanFlags) & 3; textRegion.huffmanDS = (textRegionHuffmanFlags >> 2) & 3; textRegion.huffmanDT = (textRegionHuffmanFlags >> 4) & 3; textRegion.huffmanRefinementDW = (textRegionHuffmanFlags >> 6) & 3; textRegion.huffmanRefinementDH = (textRegionHuffmanFlags >> 8) & 3; textRegion.huffmanRefinementDX = (textRegionHuffmanFlags >> 10) & 3; textRegion.huffmanRefinementDY = (textRegionHuffmanFlags >> 12) & 3; textRegion.huffmanRefinementSizeSelector = !!(textRegionHuffmanFlags & 14); } if (textRegion.refinement && !textRegion.refinementTemplate) { at = []; for (i = 0; i < 2; i++) { at.push({ x: readInt8(data, position), y: readInt8(data, position + 1) }); position += 2; } textRegion.refinementAt = at; } textRegion.numberOfSymbolInstances = readUint32(data, position); position += 4; // TODO 7.4.3.1.7 Symbol ID Huffman table decoding if (textRegion.huffman) { error('JBIG2 error: huffman is not supported'); } args = [textRegion, header.referredTo, data, position, end]; break; case 38: // ImmediateGenericRegion case 39: // ImmediateLosslessGenericRegion var genericRegion = {}; genericRegion.info = readRegionSegmentInformation(data, position); position += RegionSegmentInformationFieldLength; var genericRegionSegmentFlags = data[position++]; genericRegion.mmr = !!(genericRegionSegmentFlags & 1); genericRegion.template = (genericRegionSegmentFlags >> 1) & 3; genericRegion.prediction = !!(genericRegionSegmentFlags & 8); if (!genericRegion.mmr) { atLength = genericRegion.template === 0 ? 4 : 1; at = []; for (i = 0; i < atLength; i++) { at.push({ x: readInt8(data, position), y: readInt8(data, position + 1) }); position += 2; } genericRegion.at = at; } args = [genericRegion, data, position, end]; break; case 48: // PageInformation var pageInfo = { width: readUint32(data, position), height: readUint32(data, position + 4), resolutionX: readUint32(data, position + 8), resolutionY: readUint32(data, position + 12) }; if (pageInfo.height === 0xFFFFFFFF) { delete pageInfo.height; } var pageSegmentFlags = data[position + 16]; var pageStripingInformation = readUint16(data, position + 17); pageInfo.lossless = !!(pageSegmentFlags & 1); pageInfo.refinement = !!(pageSegmentFlags & 2); pageInfo.defaultPixelValue = (pageSegmentFlags >> 2) & 1; pageInfo.combinationOperator = (pageSegmentFlags >> 3) & 3; pageInfo.requiresBuffer = !!(pageSegmentFlags & 32); pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64); args = [pageInfo]; break; case 49: // EndOfPage break; case 50: // EndOfStripe break; case 51: // EndOfFile break; case 62: // 7.4.15 defines 2 extension types which // are comments and can be ignored. break; default: error('JBIG2 error: segment type ' + header.typeName + '(' + header.type + ') is not implemented'); } var callbackName = 'on' + header.typeName; if (callbackName in visitor) { visitor[callbackName].apply(visitor, args); } } function processSegments(segments, visitor) { for (var i = 0, ii = segments.length; i < ii; i++) { processSegment(segments[i], visitor); } } function parseJbig2(data, start, end) { var position = start; if (data[position] !== 0x97 || data[position + 1] !== 0x4A || data[position + 2] !== 0x42 || data[position + 3] !== 0x32 || data[position + 4] !== 0x0D || data[position + 5] !== 0x0A || data[position + 6] !== 0x1A || data[position + 7] !== 0x0A) { error('JBIG2 error: invalid header'); } var header = {}; position += 8; var flags = data[position++]; header.randomAccess = !(flags & 1); if (!(flags & 2)) { header.numberOfPages = readUint32(data, position); position += 4; } var segments = readSegments(header, data, position, end); error('Not implemented'); // processSegments(segments, new SimpleSegmentVisitor()); } function parseJbig2Chunks(chunks) { var visitor = new SimpleSegmentVisitor(); for (var i = 0, ii = chunks.length; i < ii; i++) { var chunk = chunks[i]; var segments = readSegments({}, chunk.data, chunk.start, chunk.end); processSegments(segments, visitor); } return visitor.buffer; } function SimpleSegmentVisitor() {} SimpleSegmentVisitor.prototype = { onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) { this.currentPageInfo = info; var rowSize = (info.width + 7) >> 3; var buffer = new Uint8Array(rowSize * info.height); // The contents of ArrayBuffers are initialized to 0. // Fill the buffer with 0xFF only if info.defaultPixelValue is set if (info.defaultPixelValue) { for (var i = 0, ii = buffer.length; i < ii; i++) { buffer[i] = 0xFF; } } this.buffer = buffer; }, drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) { var pageInfo = this.currentPageInfo; var width = regionInfo.width, height = regionInfo.height; var rowSize = (pageInfo.width + 7) >> 3; var combinationOperator = pageInfo.combinationOperatorOverride ? regionInfo.combinationOperator : pageInfo.combinationOperator; var buffer = this.buffer; var mask0 = 128 >> (regionInfo.x & 7); var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3); var i, j, mask, offset; switch (combinationOperator) { case 0: // OR for (i = 0; i < height; i++) { mask = mask0; offset = offset0; for (j = 0; j < width; j++) { if (bitmap[i][j]) { buffer[offset] |= mask; } mask >>= 1; if (!mask) { mask = 128; offset++; } } offset0 += rowSize; } break; case 2: // XOR for (i = 0; i < height; i++) { mask = mask0; offset = offset0; for (j = 0; j < width; j++) { if (bitmap[i][j]) { buffer[offset] ^= mask; } mask >>= 1; if (!mask) { mask = 128; offset++; } } offset0 += rowSize; } break; default: error('JBIG2 error: operator ' + combinationOperator + ' is not supported'); } }, onImmediateGenericRegion: function SimpleSegmentVisitor_onImmediateGenericRegion(region, data, start, end) { var regionInfo = region.info; var decodingContext = new DecodingContext(data, start, end); var bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, region.template, region.prediction, null, region.at, decodingContext); this.drawBitmap(regionInfo, bitmap); }, onImmediateLosslessGenericRegion: function SimpleSegmentVisitor_onImmediateLosslessGenericRegion() { this.onImmediateGenericRegion.apply(this, arguments); }, onSymbolDictionary: function SimpleSegmentVisitor_onSymbolDictionary(dictionary, currentSegment, referredSegments, data, start, end) { var huffmanTables; if (dictionary.huffman) { error('JBIG2 error: huffman is not supported'); } // Combines exported symbols from all referred segments var symbols = this.symbols; if (!symbols) { this.symbols = symbols = {}; } var inputSymbols = []; for (var i = 0, ii = referredSegments.length; i < ii; i++) { inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]); } var decodingContext = new DecodingContext(data, start, end); symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, dictionary.numberOfExportedSymbols, huffmanTables, dictionary.template, dictionary.at, dictionary.refinementTemplate, dictionary.refinementAt, decodingContext); }, onImmediateTextRegion: function SimpleSegmentVisitor_onImmediateTextRegion(region, referredSegments, data, start, end) { var regionInfo = region.info; var huffmanTables; // Combines exported symbols from all referred segments var symbols = this.symbols; var inputSymbols = []; for (var i = 0, ii = referredSegments.length; i < ii; i++) { inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]); } var symbolCodeLength = log2(inputSymbols.length); var decodingContext = new DecodingContext(data, start, end); var bitmap = decodeTextRegion(region.huffman, region.refinement, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.numberOfSymbolInstances, region.stripSize, inputSymbols, symbolCodeLength, region.transposed, region.dsOffset, region.referenceCorner, region.combinationOperator, huffmanTables, region.refinementTemplate, region.refinementAt, decodingContext); this.drawBitmap(regionInfo, bitmap); }, onImmediateLosslessTextRegion: function SimpleSegmentVisitor_onImmediateLosslessTextRegion() { this.onImmediateTextRegion.apply(this, arguments); } }; function Jbig2Image() {} Jbig2Image.prototype = { parseChunks: function Jbig2Image_parseChunks(chunks) { return parseJbig2Chunks(chunks); } }; return Jbig2Image; })(); exports.Jbig2Image = Jbig2Image; })); (function (root, factory) { { factory((root.pdfjsCoreJpx = {}), root.pdfjsSharedUtil, root.pdfjsCoreArithmeticDecoder); } }(this, function (exports, sharedUtil, coreArithmeticDecoder) { var info = sharedUtil.info; var log2 = sharedUtil.log2; var readUint16 = sharedUtil.readUint16; var readUint32 = sharedUtil.readUint32; var warn = sharedUtil.warn; var ArithmeticDecoder = coreArithmeticDecoder.ArithmeticDecoder; var JpxImage = (function JpxImageClosure() { // Table E.1 var SubbandsGainLog2 = { 'LL': 0, 'LH': 1, 'HL': 1, 'HH': 2 }; function JpxImage() { this.failOnCorruptedImage = false; } JpxImage.prototype = { parse: function JpxImage_parse(data) { var head = readUint16(data, 0); // No box header, immediate start of codestream (SOC) if (head === 0xFF4F) { this.parseCodestream(data, 0, data.length); return; } var position = 0, length = data.length; while (position < length) { var headerSize = 8; var lbox = readUint32(data, position); var tbox = readUint32(data, position + 4); position += headerSize; if (lbox === 1) { // XLBox: read UInt64 according to spec. // JavaScript's int precision of 53 bit should be sufficient here. lbox = readUint32(data, position) * 4294967296 + readUint32(data, position + 4); position += 8; headerSize += 8; } if (lbox === 0) { lbox = length - position + headerSize; } if (lbox < headerSize) { throw new Error('JPX Error: Invalid box field size'); } var dataLength = lbox - headerSize; var jumpDataLength = true; switch (tbox) { case 0x6A703268: // 'jp2h' jumpDataLength = false; // parsing child boxes break; case 0x636F6C72: // 'colr' // Colorspaces are not used, the CS from the PDF is used. var method = data[position]; if (method === 1) { // enumerated colorspace var colorspace = readUint32(data, position + 3); switch (colorspace) { case 16: // this indicates a sRGB colorspace case 17: // this indicates a grayscale colorspace case 18: // this indicates a YUV colorspace break; default: warn('Unknown colorspace ' + colorspace); break; } } else if (method === 2) { info('ICC profile not supported'); } break; case 0x6A703263: // 'jp2c' this.parseCodestream(data, position, position + dataLength); break; case 0x6A502020: // 'jP\024\024' if (0x0d0a870a !== readUint32(data, position)) { warn('Invalid JP2 signature'); } break; // The following header types are valid but currently not used: case 0x6A501A1A: // 'jP\032\032' case 0x66747970: // 'ftyp' case 0x72726571: // 'rreq' case 0x72657320: // 'res ' case 0x69686472: // 'ihdr' break; default: var headerType = String.fromCharCode((tbox >> 24) & 0xFF, (tbox >> 16) & 0xFF, (tbox >> 8) & 0xFF, tbox & 0xFF); warn('Unsupported header type ' + tbox + ' (' + headerType + ')'); break; } if (jumpDataLength) { position += dataLength; } } }, parseImageProperties: function JpxImage_parseImageProperties(stream) { var newByte = stream.getByte(); while (newByte >= 0) { var oldByte = newByte; newByte = stream.getByte(); var code = (oldByte << 8) | newByte; // Image and tile size (SIZ) if (code === 0xFF51) { stream.skip(4); var Xsiz = stream.getInt32() >>> 0; // Byte 4 var Ysiz = stream.getInt32() >>> 0; // Byte 8 var XOsiz = stream.getInt32() >>> 0; // Byte 12 var YOsiz = stream.getInt32() >>> 0; // Byte 16 stream.skip(16); var Csiz = stream.getUint16(); // Byte 36 this.width = Xsiz - XOsiz; this.height = Ysiz - YOsiz; this.componentsCount = Csiz; // Results are always returned as Uint8Arrays this.bitsPerComponent = 8; return; } } throw new Error('JPX Error: No size marker found in JPX stream'); }, parseCodestream: function JpxImage_parseCodestream(data, start, end) { var context = {}; try { var doNotRecover = false; var position = start; while (position + 1 < end) { var code = readUint16(data, position); position += 2; var length = 0, j, sqcd, spqcds, spqcdSize, scalarExpounded, tile; switch (code) { case 0xFF4F: // Start of codestream (SOC) context.mainHeader = true; break; case 0xFFD9: // End of codestream (EOC) break; case 0xFF51: // Image and tile size (SIZ) length = readUint16(data, position); var siz = {}; siz.Xsiz = readUint32(data, position + 4); siz.Ysiz = readUint32(data, position + 8); siz.XOsiz = readUint32(data, position + 12); siz.YOsiz = readUint32(data, position + 16); siz.XTsiz = readUint32(data, position + 20); siz.YTsiz = readUint32(data, position + 24); siz.XTOsiz = readUint32(data, position + 28); siz.YTOsiz = readUint32(data, position + 32); var componentsCount = readUint16(data, position + 36); siz.Csiz = componentsCount; var components = []; j = position + 38; for (var i = 0; i < componentsCount; i++) { var component = { precision: (data[j] & 0x7F) + 1, isSigned: !!(data[j] & 0x80), XRsiz: data[j + 1], YRsiz: data[j + 1] }; calculateComponentDimensions(component, siz); components.push(component); } context.SIZ = siz; context.components = components; calculateTileGrids(context, components); context.QCC = []; context.COC = []; break; case 0xFF5C: // Quantization default (QCD) length = readUint16(data, position); var qcd = {}; j = position + 2; sqcd = data[j++]; switch (sqcd & 0x1F) { case 0: spqcdSize = 8; scalarExpounded = true; break; case 1: spqcdSize = 16; scalarExpounded = false; break; case 2: spqcdSize = 16; scalarExpounded = true; break; default: throw new Error('JPX Error: Invalid SQcd value ' + sqcd); } qcd.noQuantization = (spqcdSize === 8); qcd.scalarExpounded = scalarExpounded; qcd.guardBits = sqcd >> 5; spqcds = []; while (j < length + position) { var spqcd = {}; if (spqcdSize === 8) { spqcd.epsilon = data[j++] >> 3; spqcd.mu = 0; } else { spqcd.epsilon = data[j] >> 3; spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1]; j += 2; } spqcds.push(spqcd); } qcd.SPqcds = spqcds; if (context.mainHeader) { context.QCD = qcd; } else { context.currentTile.QCD = qcd; context.currentTile.QCC = []; } break; case 0xFF5D: // Quantization component (QCC) length = readUint16(data, position); var qcc = {}; j = position + 2; var cqcc; if (context.SIZ.Csiz < 257) { cqcc = data[j++]; } else { cqcc = readUint16(data, j); j += 2; } sqcd = data[j++]; switch (sqcd & 0x1F) { case 0: spqcdSize = 8; scalarExpounded = true; break; case 1: spqcdSize = 16; scalarExpounded = false; break; case 2: spqcdSize = 16; scalarExpounded = true; break; default: throw new Error('JPX Error: Invalid SQcd value ' + sqcd); } qcc.noQuantization = (spqcdSize === 8); qcc.scalarExpounded = scalarExpounded; qcc.guardBits = sqcd >> 5; spqcds = []; while (j < (length + position)) { spqcd = {}; if (spqcdSize === 8) { spqcd.epsilon = data[j++] >> 3; spqcd.mu = 0; } else { spqcd.epsilon = data[j] >> 3; spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1]; j += 2; } spqcds.push(spqcd); } qcc.SPqcds = spqcds; if (context.mainHeader) { context.QCC[cqcc] = qcc; } else { context.currentTile.QCC[cqcc] = qcc; } break; case 0xFF52: // Coding style default (COD) length = readUint16(data, position); var cod = {}; j = position + 2; var scod = data[j++]; cod.entropyCoderWithCustomPrecincts = !!(scod & 1); cod.sopMarkerUsed = !!(scod & 2); cod.ephMarkerUsed = !!(scod & 4); cod.progressionOrder = data[j++]; cod.layersCount = readUint16(data, j); j += 2; cod.multipleComponentTransform = data[j++]; cod.decompositionLevelsCount = data[j++]; cod.xcb = (data[j++] & 0xF) + 2; cod.ycb = (data[j++] & 0xF) + 2; var blockStyle = data[j++]; cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1); cod.resetContextProbabilities = !!(blockStyle & 2); cod.terminationOnEachCodingPass = !!(blockStyle & 4); cod.verticalyStripe = !!(blockStyle & 8); cod.predictableTermination = !!(blockStyle & 16); cod.segmentationSymbolUsed = !!(blockStyle & 32); cod.reversibleTransformation = data[j++]; if (cod.entropyCoderWithCustomPrecincts) { var precinctsSizes = []; while (j < length + position) { var precinctsSize = data[j++]; precinctsSizes.push({ PPx: precinctsSize & 0xF, PPy: precinctsSize >> 4 }); } cod.precinctsSizes = precinctsSizes; } var unsupported = []; if (cod.selectiveArithmeticCodingBypass) { unsupported.push('selectiveArithmeticCodingBypass'); } if (cod.resetContextProbabilities) { unsupported.push('resetContextProbabilities'); } if (cod.terminationOnEachCodingPass) { unsupported.push('terminationOnEachCodingPass'); } if (cod.verticalyStripe) { unsupported.push('verticalyStripe'); } if (cod.predictableTermination) { unsupported.push('predictableTermination'); } if (unsupported.length > 0) { doNotRecover = true; throw new Error('JPX Error: Unsupported COD options (' + unsupported.join(', ') + ')'); } if (context.mainHeader) { context.COD = cod; } else { context.currentTile.COD = cod; context.currentTile.COC = []; } break; case 0xFF90: // Start of tile-part (SOT) length = readUint16(data, position); tile = {}; tile.index = readUint16(data, position + 2); tile.length = readUint32(data, position + 4); tile.dataEnd = tile.length + position - 2; tile.partIndex = data[position + 8]; tile.partsCount = data[position + 9]; context.mainHeader = false; if (tile.partIndex === 0) { // reset component specific settings tile.COD = context.COD; tile.COC = context.COC.slice(0); // clone of the global COC tile.QCD = context.QCD; tile.QCC = context.QCC.slice(0); // clone of the global COC } context.currentTile = tile; break; case 0xFF93: // Start of data (SOD) tile = context.currentTile; if (tile.partIndex === 0) { initializeTile(context, tile.index); buildPackets(context); } // moving to the end of the data length = tile.dataEnd - position; parseTilePackets(context, data, position, length); break; case 0xFF55: // Tile-part lengths, main header (TLM) case 0xFF57: // Packet length, main header (PLM) case 0xFF58: // Packet length, tile-part header (PLT) case 0xFF64: // Comment (COM) length = readUint16(data, position); // skipping content break; case 0xFF53: // Coding style component (COC) throw new Error('JPX Error: Codestream code 0xFF53 (COC) is ' + 'not implemented'); default: throw new Error('JPX Error: Unknown codestream code: ' + code.toString(16)); } position += length; } } catch (e) { if (doNotRecover || this.failOnCorruptedImage) { throw e; } else { warn('Trying to recover from ' + e.message); } } this.tiles = transformComponents(context); this.width = context.SIZ.Xsiz - context.SIZ.XOsiz; this.height = context.SIZ.Ysiz - context.SIZ.YOsiz; this.componentsCount = context.SIZ.Csiz; } }; function calculateComponentDimensions(component, siz) { // Section B.2 Component mapping component.x0 = Math.ceil(siz.XOsiz / component.XRsiz); component.x1 = Math.ceil(siz.Xsiz / component.XRsiz); component.y0 = Math.ceil(siz.YOsiz / component.YRsiz); component.y1 = Math.ceil(siz.Ysiz / component.YRsiz); component.width = component.x1 - component.x0; component.height = component.y1 - component.y0; } function calculateTileGrids(context, components) { var siz = context.SIZ; // Section B.3 Division into tile and tile-components var tile, tiles = []; var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz); var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz); for (var q = 0; q < numYtiles; q++) { for (var p = 0; p < numXtiles; p++) { tile = {}; tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz); tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz); tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz); tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz); tile.width = tile.tx1 - tile.tx0; tile.height = tile.ty1 - tile.ty0; tile.components = []; tiles.push(tile); } } context.tiles = tiles; var componentsCount = siz.Csiz; for (var i = 0, ii = componentsCount; i < ii; i++) { var component = components[i]; for (var j = 0, jj = tiles.length; j < jj; j++) { var tileComponent = {}; tile = tiles[j]; tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz); tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz); tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz); tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz); tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0; tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0; tile.components[i] = tileComponent; } } } function getBlocksDimensions(context, component, r) { var codOrCoc = component.codingStyleParameters; var result = {}; if (!codOrCoc.entropyCoderWithCustomPrecincts) { result.PPx = 15; result.PPy = 15; } else { result.PPx = codOrCoc.precinctsSizes[r].PPx; result.PPy = codOrCoc.precinctsSizes[r].PPy; } // calculate codeblock size as described in section B.7 result.xcb_ = (r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) : Math.min(codOrCoc.xcb, result.PPx)); result.ycb_ = (r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) : Math.min(codOrCoc.ycb, result.PPy)); return result; } function buildPrecincts(context, resolution, dimensions) { // Section B.6 Division resolution to precincts var precinctWidth = 1 << dimensions.PPx; var precinctHeight = 1 << dimensions.PPy; // Jasper introduces codeblock groups for mapping each subband codeblocks // to precincts. Precinct partition divides a resolution according to width // and height parameters. The subband that belongs to the resolution level // has a different size than the level, unless it is the zero resolution. // From Jasper documentation: jpeg2000.pdf, section K: Tier-2 coding: // The precinct partitioning for a particular subband is derived from a // partitioning of its parent LL band (i.e., the LL band at the next higher // resolution level)... The LL band associated with each resolution level is // divided into precincts... Each of the resulting precinct regions is then // mapped into its child subbands (if any) at the next lower resolution // level. This is accomplished by using the coordinate transformation // (u, v) = (ceil(x/2), ceil(y/2)) where (x, y) and (u, v) are the // coordinates of a point in the LL band and child subband, respectively. var isZeroRes = resolution.resLevel === 0; var precinctWidthInSubband = 1 << (dimensions.PPx + (isZeroRes ? 0 : -1)); var precinctHeightInSubband = 1 << (dimensions.PPy + (isZeroRes ? 0 : -1)); var numprecinctswide = (resolution.trx1 > resolution.trx0 ? Math.ceil(resolution.trx1 / precinctWidth) - Math.floor(resolution.trx0 / precinctWidth) : 0); var numprecinctshigh = (resolution.try1 > resolution.try0 ? Math.ceil(resolution.try1 / precinctHeight) - Math.floor(resolution.try0 / precinctHeight) : 0); var numprecincts = numprecinctswide * numprecinctshigh; resolution.precinctParameters = { precinctWidth: precinctWidth, precinctHeight: precinctHeight, numprecinctswide: numprecinctswide, numprecinctshigh: numprecinctshigh, numprecincts: numprecincts, precinctWidthInSubband: precinctWidthInSubband, precinctHeightInSubband: precinctHeightInSubband }; } function buildCodeblocks(context, subband, dimensions) { // Section B.7 Division sub-band into code-blocks var xcb_ = dimensions.xcb_; var ycb_ = dimensions.ycb_; var codeblockWidth = 1 << xcb_; var codeblockHeight = 1 << ycb_; var cbx0 = subband.tbx0 >> xcb_; var cby0 = subband.tby0 >> ycb_; var cbx1 = (subband.tbx1 + codeblockWidth - 1) >> xcb_; var cby1 = (subband.tby1 + codeblockHeight - 1) >> ycb_; var precinctParameters = subband.resolution.precinctParameters; var codeblocks = []; var precincts = []; var i, j, codeblock, precinctNumber; for (j = cby0; j < cby1; j++) { for (i = cbx0; i < cbx1; i++) { codeblock = { cbx: i, cby: j, tbx0: codeblockWidth * i, tby0: codeblockHeight * j, tbx1: codeblockWidth * (i + 1), tby1: codeblockHeight * (j + 1) }; codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0); codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0); codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1); codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1); // Calculate precinct number for this codeblock, codeblock position // should be relative to its subband, use actual dimension and position // See comment about codeblock group width and height var pi = Math.floor((codeblock.tbx0_ - subband.tbx0) / precinctParameters.precinctWidthInSubband); var pj = Math.floor((codeblock.tby0_ - subband.tby0) / precinctParameters.precinctHeightInSubband); precinctNumber = pi + (pj * precinctParameters.numprecinctswide); codeblock.precinctNumber = precinctNumber; codeblock.subbandType = subband.type; codeblock.Lblock = 3; if (codeblock.tbx1_ <= codeblock.tbx0_ || codeblock.tby1_ <= codeblock.tby0_) { continue; } codeblocks.push(codeblock); // building precinct for the sub-band var precinct = precincts[precinctNumber]; if (precinct !== undefined) { if (i < precinct.cbxMin) { precinct.cbxMin = i; } else if (i > precinct.cbxMax) { precinct.cbxMax = i; } if (j < precinct.cbyMin) { precinct.cbxMin = j; } else if (j > precinct.cbyMax) { precinct.cbyMax = j; } } else { precincts[precinctNumber] = precinct = { cbxMin: i, cbyMin: j, cbxMax: i, cbyMax: j }; } codeblock.precinct = precinct; } } subband.codeblockParameters = { codeblockWidth: xcb_, codeblockHeight: ycb_, numcodeblockwide: cbx1 - cbx0 + 1, numcodeblockhigh: cby1 - cby0 + 1 }; subband.codeblocks = codeblocks; subband.precincts = precincts; } function createPacket(resolution, precinctNumber, layerNumber) { var precinctCodeblocks = []; // Section B.10.8 Order of info in packet var subbands = resolution.subbands; // sub-bands already ordered in 'LL', 'HL', 'LH', and 'HH' sequence for (var i = 0, ii = subbands.length; i < ii; i++) { var subband = subbands[i]; var codeblocks = subband.codeblocks; for (var j = 0, jj = codeblocks.length; j < jj; j++) { var codeblock = codeblocks[j]; if (codeblock.precinctNumber !== precinctNumber) { continue; } precinctCodeblocks.push(codeblock); } } return { layerNumber: layerNumber, codeblocks: precinctCodeblocks }; } function LayerResolutionComponentPositionIterator(context) { var siz = context.SIZ; var tileIndex = context.currentTile.index; var tile = context.tiles[tileIndex]; var layersCount = tile.codingStyleDefaultParameters.layersCount; var componentsCount = siz.Csiz; var maxDecompositionLevelsCount = 0; for (var q = 0; q < componentsCount; q++) { maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount); } var l = 0, r = 0, i = 0, k = 0; this.nextPacket = function JpxImage_nextPacket() { // Section B.12.1.1 Layer-resolution-component-position for (; l < layersCount; l++) { for (; r <= maxDecompositionLevelsCount; r++) { for (; i < componentsCount; i++) { var component = tile.components[i]; if (r > component.codingStyleParameters.decompositionLevelsCount) { continue; } var resolution = component.resolutions[r]; var numprecincts = resolution.precinctParameters.numprecincts; for (; k < numprecincts;) { var packet = createPacket(resolution, k, l); k++; return packet; } k = 0; } i = 0; } r = 0; } throw new Error('JPX Error: Out of packets'); }; } function ResolutionLayerComponentPositionIterator(context) { var siz = context.SIZ; var tileIndex = context.currentTile.index; var tile = context.tiles[tileIndex]; var layersCount = tile.codingStyleDefaultParameters.layersCount; var componentsCount = siz.Csiz; var maxDecompositionLevelsCount = 0; for (var q = 0; q < componentsCount; q++) { maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount); } var r = 0, l = 0, i = 0, k = 0; this.nextPacket = function JpxImage_nextPacket() { // Section B.12.1.2 Resolution-layer-component-position for (; r <= maxDecompositionLevelsCount; r++) { for (; l < layersCount; l++) { for (; i < componentsCount; i++) { var component = tile.components[i]; if (r > component.codingStyleParameters.decompositionLevelsCount) { continue; } var resolution = component.resolutions[r]; var numprecincts = resolution.precinctParameters.numprecincts; for (; k < numprecincts;) { var packet = createPacket(resolution, k, l); k++; return packet; } k = 0; } i = 0; } l = 0; } throw new Error('JPX Error: Out of packets'); }; } function ResolutionPositionComponentLayerIterator(context) { var siz = context.SIZ; var tileIndex = context.currentTile.index; var tile = context.tiles[tileIndex]; var layersCount = tile.codingStyleDefaultParameters.layersCount; var componentsCount = siz.Csiz; var l, r, c, p; var maxDecompositionLevelsCount = 0; for (c = 0; c < componentsCount; c++) { var component = tile.components[c]; maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, component.codingStyleParameters.decompositionLevelsCount); } var maxNumPrecinctsInLevel = new Int32Array( maxDecompositionLevelsCount + 1); for (r = 0; r <= maxDecompositionLevelsCount; ++r) { var maxNumPrecincts = 0; for (c = 0; c < componentsCount; ++c) { var resolutions = tile.components[c].resolutions; if (r < resolutions.length) { maxNumPrecincts = Math.max(maxNumPrecincts, resolutions[r].precinctParameters.numprecincts); } } maxNumPrecinctsInLevel[r] = maxNumPrecincts; } l = 0; r = 0; c = 0; p = 0; this.nextPacket = function JpxImage_nextPacket() { // Section B.12.1.3 Resolution-position-component-layer for (; r <= maxDecompositionLevelsCount; r++) { for (; p < maxNumPrecinctsInLevel[r]; p++) { for (; c < componentsCount; c++) { var component = tile.components[c]; if (r > component.codingStyleParameters.decompositionLevelsCount) { continue; } var resolution = component.resolutions[r]; var numprecincts = resolution.precinctParameters.numprecincts; if (p >= numprecincts) { continue; } for (; l < layersCount;) { var packet = createPacket(resolution, p, l); l++; return packet; } l = 0; } c = 0; } p = 0; } throw new Error('JPX Error: Out of packets'); }; } function PositionComponentResolutionLayerIterator(context) { var siz = context.SIZ; var tileIndex = context.currentTile.index; var tile = context.tiles[tileIndex]; var layersCount = tile.codingStyleDefaultParameters.layersCount; var componentsCount = siz.Csiz; var precinctsSizes = getPrecinctSizesInImageScale(tile); var precinctsIterationSizes = precinctsSizes; var l = 0, r = 0, c = 0, px = 0, py = 0; this.nextPacket = function JpxImage_nextPacket() { // Section B.12.1.4 Position-component-resolution-layer for (; py < precinctsIterationSizes.maxNumHigh; py++) { for (; px < precinctsIterationSizes.maxNumWide; px++) { for (; c < componentsCount; c++) { var component = tile.components[c]; var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount; for (; r <= decompositionLevelsCount; r++) { var resolution = component.resolutions[r]; var sizeInImageScale = precinctsSizes.components[c].resolutions[r]; var k = getPrecinctIndexIfExist( px, py, sizeInImageScale, precinctsIterationSizes, resolution); if (k === null) { continue; } for (; l < layersCount;) { var packet = createPacket(resolution, k, l); l++; return packet; } l = 0; } r = 0; } c = 0; } px = 0; } throw new Error('JPX Error: Out of packets'); }; } function ComponentPositionResolutionLayerIterator(context) { var siz = context.SIZ; var tileIndex = context.currentTile.index; var tile = context.tiles[tileIndex]; var layersCount = tile.codingStyleDefaultParameters.layersCount; var componentsCount = siz.Csiz; var precinctsSizes = getPrecinctSizesInImageScale(tile); var l = 0, r = 0, c = 0, px = 0, py = 0; this.nextPacket = function JpxImage_nextPacket() { // Section B.12.1.5 Component-position-resolution-layer for (; c < componentsCount; ++c) { var component = tile.components[c]; var precinctsIterationSizes = precinctsSizes.components[c]; var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount; for (; py < precinctsIterationSizes.maxNumHigh; py++) { for (; px < precinctsIterationSizes.maxNumWide; px++) { for (; r <= decompositionLevelsCount; r++) { var resolution = component.resolutions[r]; var sizeInImageScale = precinctsIterationSizes.resolutions[r]; var k = getPrecinctIndexIfExist( px, py, sizeInImageScale, precinctsIterationSizes, resolution); if (k === null) { continue; } for (; l < layersCount;) { var packet = createPacket(resolution, k, l); l++; return packet; } l = 0; } r = 0; } px = 0; } py = 0; } throw new Error('JPX Error: Out of packets'); }; } function getPrecinctIndexIfExist( pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) { var posX = pxIndex * precinctIterationSizes.minWidth; var posY = pyIndex * precinctIterationSizes.minHeight; if (posX % sizeInImageScale.width !== 0 || posY % sizeInImageScale.height !== 0) { return null; } var startPrecinctRowIndex = (posY / sizeInImageScale.width) * resolution.precinctParameters.numprecinctswide; return (posX / sizeInImageScale.height) + startPrecinctRowIndex; } function getPrecinctSizesInImageScale(tile) { var componentsCount = tile.components.length; var minWidth = Number.MAX_VALUE; var minHeight = Number.MAX_VALUE; var maxNumWide = 0; var maxNumHigh = 0; var sizePerComponent = new Array(componentsCount); for (var c = 0; c < componentsCount; c++) { var component = tile.components[c]; var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount; var sizePerResolution = new Array(decompositionLevelsCount + 1); var minWidthCurrentComponent = Number.MAX_VALUE; var minHeightCurrentComponent = Number.MAX_VALUE; var maxNumWideCurrentComponent = 0; var maxNumHighCurrentComponent = 0; var scale = 1; for (var r = decompositionLevelsCount; r >= 0; --r) { var resolution = component.resolutions[r]; var widthCurrentResolution = scale * resolution.precinctParameters.precinctWidth; var heightCurrentResolution = scale * resolution.precinctParameters.precinctHeight; minWidthCurrentComponent = Math.min( minWidthCurrentComponent, widthCurrentResolution); minHeightCurrentComponent = Math.min( minHeightCurrentComponent, heightCurrentResolution); maxNumWideCurrentComponent = Math.max(maxNumWideCurrentComponent, resolution.precinctParameters.numprecinctswide); maxNumHighCurrentComponent = Math.max(maxNumHighCurrentComponent, resolution.precinctParameters.numprecinctshigh); sizePerResolution[r] = { width: widthCurrentResolution, height: heightCurrentResolution }; scale <<= 1; } minWidth = Math.min(minWidth, minWidthCurrentComponent); minHeight = Math.min(minHeight, minHeightCurrentComponent); maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent); maxNumHigh = Math.max(maxNumHigh, maxNumHighCurrentComponent); sizePerComponent[c] = { resolutions: sizePerResolution, minWidth: minWidthCurrentComponent, minHeight: minHeightCurrentComponent, maxNumWide: maxNumWideCurrentComponent, maxNumHigh: maxNumHighCurrentComponent }; } return { components: sizePerComponent, minWidth: minWidth, minHeight: minHeight, maxNumWide: maxNumWide, maxNumHigh: maxNumHigh }; } function buildPackets(context) { var siz = context.SIZ; var tileIndex = context.currentTile.index; var tile = context.tiles[tileIndex]; var componentsCount = siz.Csiz; // Creating resolutions and sub-bands for each component for (var c = 0; c < componentsCount; c++) { var component = tile.components[c]; var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount; // Section B.5 Resolution levels and sub-bands var resolutions = []; var subbands = []; for (var r = 0; r <= decompositionLevelsCount; r++) { var blocksDimensions = getBlocksDimensions(context, component, r); var resolution = {}; var scale = 1 << (decompositionLevelsCount - r); resolution.trx0 = Math.ceil(component.tcx0 / scale); resolution.try0 = Math.ceil(component.tcy0 / scale); resolution.trx1 = Math.ceil(component.tcx1 / scale); resolution.try1 = Math.ceil(component.tcy1 / scale); resolution.resLevel = r; buildPrecincts(context, resolution, blocksDimensions); resolutions.push(resolution); var subband; if (r === 0) { // one sub-band (LL) with last decomposition subband = {}; subband.type = 'LL'; subband.tbx0 = Math.ceil(component.tcx0 / scale); subband.tby0 = Math.ceil(component.tcy0 / scale); subband.tbx1 = Math.ceil(component.tcx1 / scale); subband.tby1 = Math.ceil(component.tcy1 / scale); subband.resolution = resolution; buildCodeblocks(context, subband, blocksDimensions); subbands.push(subband); resolution.subbands = [subband]; } else { var bscale = 1 << (decompositionLevelsCount - r + 1); var resolutionSubbands = []; // three sub-bands (HL, LH and HH) with rest of decompositions subband = {}; subband.type = 'HL'; subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5); subband.tby0 = Math.ceil(component.tcy0 / bscale); subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5); subband.tby1 = Math.ceil(component.tcy1 / bscale); subband.resolution = resolution; buildCodeblocks(context, subband, blocksDimensions); subbands.push(subband); resolutionSubbands.push(subband); subband = {}; subband.type = 'LH'; subband.tbx0 = Math.ceil(component.tcx0 / bscale); subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5); subband.tbx1 = Math.ceil(component.tcx1 / bscale); subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5); subband.resolution = resolution; buildCodeblocks(context, subband, blocksDimensions); subbands.push(subband); resolutionSubbands.push(subband); subband = {}; subband.type = 'HH'; subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5); subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5); subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5); subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5); subband.resolution = resolution; buildCodeblocks(context, subband, blocksDimensions); subbands.push(subband); resolutionSubbands.push(subband); resolution.subbands = resolutionSubbands; } } component.resolutions = resolutions; component.subbands = subbands; } // Generate the packets sequence var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder; switch (progressionOrder) { case 0: tile.packetsIterator = new LayerResolutionComponentPositionIterator(context); break; case 1: tile.packetsIterator = new ResolutionLayerComponentPositionIterator(context); break; case 2: tile.packetsIterator = new ResolutionPositionComponentLayerIterator(context); break; case 3: tile.packetsIterator = new PositionComponentResolutionLayerIterator(context); break; case 4: tile.packetsIterator = new ComponentPositionResolutionLayerIterator(context); break; default: throw new Error('JPX Error: Unsupported progression order ' + progressionOrder); } } function parseTilePackets(context, data, offset, dataLength) { var position = 0; var buffer, bufferSize = 0, skipNextBit = false; function readBits(count) { while (bufferSize < count) { var b = data[offset + position]; position++; if (skipNextBit) { buffer = (buffer << 7) | b; bufferSize += 7; skipNextBit = false; } else { buffer = (buffer << 8) | b; bufferSize += 8; } if (b === 0xFF) { skipNextBit = true; } } bufferSize -= count; return (buffer >>> bufferSize) & ((1 << count) - 1); } function skipMarkerIfEqual(value) { if (data[offset + position - 1] === 0xFF && data[offset + position] === value) { skipBytes(1); return true; } else if (data[offset + position] === 0xFF && data[offset + position + 1] === value) { skipBytes(2); return true; } return false; } function skipBytes(count) { position += count; } function alignToByte() { bufferSize = 0; if (skipNextBit) { position++; skipNextBit = false; } } function readCodingpasses() { if (readBits(1) === 0) { return 1; } if (readBits(1) === 0) { return 2; } var value = readBits(2); if (value < 3) { return value + 3; } value = readBits(5); if (value < 31) { return value + 6; } value = readBits(7); return value + 37; } var tileIndex = context.currentTile.index; var tile = context.tiles[tileIndex]; var sopMarkerUsed = context.COD.sopMarkerUsed; var ephMarkerUsed = context.COD.ephMarkerUsed; var packetsIterator = tile.packetsIterator; while (position < dataLength) { alignToByte(); if (sopMarkerUsed && skipMarkerIfEqual(0x91)) { // Skip also marker segment length and packet sequence ID skipBytes(4); } var packet = packetsIterator.nextPacket(); if (!readBits(1)) { continue; } var layerNumber = packet.layerNumber; var queue = [], codeblock; for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) { codeblock = packet.codeblocks[i]; var precinct = codeblock.precinct; var codeblockColumn = codeblock.cbx - precinct.cbxMin; var codeblockRow = codeblock.cby - precinct.cbyMin; var codeblockIncluded = false; var firstTimeInclusion = false; var valueReady; if (codeblock['included'] !== undefined) { codeblockIncluded = !!readBits(1); } else { // reading inclusion tree precinct = codeblock.precinct; var inclusionTree, zeroBitPlanesTree; if (precinct['inclusionTree'] !== undefined) { inclusionTree = precinct.inclusionTree; } else { // building inclusion and zero bit-planes trees var width = precinct.cbxMax - precinct.cbxMin + 1; var height = precinct.cbyMax - precinct.cbyMin + 1; inclusionTree = new InclusionTree(width, height, layerNumber); zeroBitPlanesTree = new TagTree(width, height); precinct.inclusionTree = inclusionTree; precinct.zeroBitPlanesTree = zeroBitPlanesTree; } if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) { while (true) { if (readBits(1)) { valueReady = !inclusionTree.nextLevel(); if (valueReady) { codeblock.included = true; codeblockIncluded = firstTimeInclusion = true; break; } } else { inclusionTree.incrementValue(layerNumber); break; } } } } if (!codeblockIncluded) { continue; } if (firstTimeInclusion) { zeroBitPlanesTree = precinct.zeroBitPlanesTree; zeroBitPlanesTree.reset(codeblockColumn, codeblockRow); while (true) { if (readBits(1)) { valueReady = !zeroBitPlanesTree.nextLevel(); if (valueReady) { break; } } else { zeroBitPlanesTree.incrementValue(); } } codeblock.zeroBitPlanes = zeroBitPlanesTree.value; } var codingpasses = readCodingpasses(); while (readBits(1)) { codeblock.Lblock++; } var codingpassesLog2 = log2(codingpasses); // rounding down log2 var bits = ((codingpasses < (1 << codingpassesLog2)) ? codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock; var codedDataLength = readBits(bits); queue.push({ codeblock: codeblock, codingpasses: codingpasses, dataLength: codedDataLength }); } alignToByte(); if (ephMarkerUsed) { skipMarkerIfEqual(0x92); } while (queue.length > 0) { var packetItem = queue.shift(); codeblock = packetItem.codeblock; if (codeblock['data'] === undefined) { codeblock.data = []; } codeblock.data.push({ data: data, start: offset + position, end: offset + position + packetItem.dataLength, codingpasses: packetItem.codingpasses }); position += packetItem.dataLength; } } return position; } function copyCoefficients(coefficients, levelWidth, levelHeight, subband, delta, mb, reversible, segmentationSymbolUsed) { var x0 = subband.tbx0; var y0 = subband.tby0; var width = subband.tbx1 - subband.tbx0; var codeblocks = subband.codeblocks; var right = subband.type.charAt(0) === 'H' ? 1 : 0; var bottom = subband.type.charAt(1) === 'H' ? levelWidth : 0; for (var i = 0, ii = codeblocks.length; i < ii; ++i) { var codeblock = codeblocks[i]; var blockWidth = codeblock.tbx1_ - codeblock.tbx0_; var blockHeight = codeblock.tby1_ - codeblock.tby0_; if (blockWidth === 0 || blockHeight === 0) { continue; } if (codeblock['data'] === undefined) { continue; } var bitModel, currentCodingpassType; bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType, codeblock.zeroBitPlanes, mb); currentCodingpassType = 2; // first bit plane starts from cleanup // collect data var data = codeblock.data, totalLength = 0, codingpasses = 0; var j, jj, dataItem; for (j = 0, jj = data.length; j < jj; j++) { dataItem = data[j]; totalLength += dataItem.end - dataItem.start; codingpasses += dataItem.codingpasses; } var encodedData = new Uint8Array(totalLength); var position = 0; for (j = 0, jj = data.length; j < jj; j++) { dataItem = data[j]; var chunk = dataItem.data.subarray(dataItem.start, dataItem.end); encodedData.set(chunk, position); position += chunk.length; } // decoding the item var decoder = new ArithmeticDecoder(encodedData, 0, totalLength); bitModel.setDecoder(decoder); for (j = 0; j < codingpasses; j++) { switch (currentCodingpassType) { case 0: bitModel.runSignificancePropogationPass(); break; case 1: bitModel.runMagnitudeRefinementPass(); break; case 2: bitModel.runCleanupPass(); if (segmentationSymbolUsed) { bitModel.checkSegmentationSymbol(); } break; } currentCodingpassType = (currentCodingpassType + 1) % 3; } var offset = (codeblock.tbx0_ - x0) + (codeblock.tby0_ - y0) * width; var sign = bitModel.coefficentsSign; var magnitude = bitModel.coefficentsMagnitude; var bitsDecoded = bitModel.bitsDecoded; var magnitudeCorrection = reversible ? 0 : 0.5; var k, n, nb; position = 0; // Do the interleaving of Section F.3.3 here, so we do not need // to copy later. LL level is not interleaved, just copied. var interleave = (subband.type !== 'LL'); for (j = 0; j < blockHeight; j++) { var row = (offset / width) | 0; // row in the non-interleaved subband var levelOffset = 2 * row * (levelWidth - width) + right + bottom; for (k = 0; k < blockWidth; k++) { n = magnitude[position]; if (n !== 0) { n = (n + magnitudeCorrection) * delta; if (sign[position] !== 0) { n = -n; } nb = bitsDecoded[position]; var pos = interleave ? (levelOffset + (offset << 1)) : offset; if (reversible && (nb >= mb)) { coefficients[pos] = n; } else { coefficients[pos] = n * (1 << (mb - nb)); } } offset++; position++; } offset += width - blockWidth; } } } function transformTile(context, tile, c) { var component = tile.components[c]; var codingStyleParameters = component.codingStyleParameters; var quantizationParameters = component.quantizationParameters; var decompositionLevelsCount = codingStyleParameters.decompositionLevelsCount; var spqcds = quantizationParameters.SPqcds; var scalarExpounded = quantizationParameters.scalarExpounded; var guardBits = quantizationParameters.guardBits; var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed; var precision = context.components[c].precision; var reversible = codingStyleParameters.reversibleTransformation; var transform = (reversible ? new ReversibleTransform() : new IrreversibleTransform()); var subbandCoefficients = []; var b = 0; for (var i = 0; i <= decompositionLevelsCount; i++) { var resolution = component.resolutions[i]; var width = resolution.trx1 - resolution.trx0; var height = resolution.try1 - resolution.try0; // Allocate space for the whole sublevel. var coefficients = new Float32Array(width * height); for (var j = 0, jj = resolution.subbands.length; j < jj; j++) { var mu, epsilon; if (!scalarExpounded) { // formula E-5 mu = spqcds[0].mu; epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0); } else { mu = spqcds[b].mu; epsilon = spqcds[b].epsilon; b++; } var subband = resolution.subbands[j]; var gainLog2 = SubbandsGainLog2[subband.type]; // calulate quantization coefficient (Section E.1.1.1) var delta = (reversible ? 1 : Math.pow(2, precision + gainLog2 - epsilon) * (1 + mu / 2048)); var mb = (guardBits + epsilon - 1); // In the first resolution level, copyCoefficients will fill the // whole array with coefficients. In the succeding passes, // copyCoefficients will consecutively fill in the values that belong // to the interleaved positions of the HL, LH, and HH coefficients. // The LL coefficients will then be interleaved in Transform.iterate(). copyCoefficients(coefficients, width, height, subband, delta, mb, reversible, segmentationSymbolUsed); } subbandCoefficients.push({ width: width, height: height, items: coefficients }); } var result = transform.calculate(subbandCoefficients, component.tcx0, component.tcy0); return { left: component.tcx0, top: component.tcy0, width: result.width, height: result.height, items: result.items }; } function transformComponents(context) { var siz = context.SIZ; var components = context.components; var componentsCount = siz.Csiz; var resultImages = []; for (var i = 0, ii = context.tiles.length; i < ii; i++) { var tile = context.tiles[i]; var transformedTiles = []; var c; for (c = 0; c < componentsCount; c++) { transformedTiles[c] = transformTile(context, tile, c); } var tile0 = transformedTiles[0]; var out = new Uint8Array(tile0.items.length * componentsCount); var result = { left: tile0.left, top: tile0.top, width: tile0.width, height: tile0.height, items: out }; // Section G.2.2 Inverse multi component transform var shift, offset, max, min, maxK; var pos = 0, j, jj, y0, y1, y2, r, g, b, k, val; if (tile.codingStyleDefaultParameters.multipleComponentTransform) { var fourComponents = componentsCount === 4; var y0items = transformedTiles[0].items; var y1items = transformedTiles[1].items; var y2items = transformedTiles[2].items; var y3items = fourComponents ? transformedTiles[3].items : null; // HACK: The multiple component transform formulas below assume that // all components have the same precision. With this in mind, we // compute shift and offset only once. shift = components[0].precision - 8; offset = (128 << shift) + 0.5; max = 255 * (1 << shift); maxK = max * 0.5; min = -maxK; var component0 = tile.components[0]; var alpha01 = componentsCount - 3; jj = y0items.length; if (!component0.codingStyleParameters.reversibleTransformation) { // inverse irreversible multiple component transform for (j = 0; j < jj; j++, pos += alpha01) { y0 = y0items[j] + offset; y1 = y1items[j]; y2 = y2items[j]; r = y0 + 1.402 * y2; g = y0 - 0.34413 * y1 - 0.71414 * y2; b = y0 + 1.772 * y1; out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift; out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift; out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift; } } else { // inverse reversible multiple component transform for (j = 0; j < jj; j++, pos += alpha01) { y0 = y0items[j] + offset; y1 = y1items[j]; y2 = y2items[j]; g = y0 - ((y2 + y1) >> 2); r = g + y2; b = g + y1; out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift; out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift; out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift; } } if (fourComponents) { for (j = 0, pos = 3; j < jj; j++, pos += 4) { k = y3items[j]; out[pos] = k <= min ? 0 : k >= maxK ? 255 : (k + offset) >> shift; } } } else { // no multi-component transform for (c = 0; c < componentsCount; c++) { var items = transformedTiles[c].items; shift = components[c].precision - 8; offset = (128 << shift) + 0.5; max = (127.5 * (1 << shift)); min = -max; for (pos = c, j = 0, jj = items.length; j < jj; j++) { val = items[j]; out[pos] = val <= min ? 0 : val >= max ? 255 : (val + offset) >> shift; pos += componentsCount; } } } resultImages.push(result); } return resultImages; } function initializeTile(context, tileIndex) { var siz = context.SIZ; var componentsCount = siz.Csiz; var tile = context.tiles[tileIndex]; for (var c = 0; c < componentsCount; c++) { var component = tile.components[c]; var qcdOrQcc = (context.currentTile.QCC[c] !== undefined ? context.currentTile.QCC[c] : context.currentTile.QCD); component.quantizationParameters = qcdOrQcc; var codOrCoc = (context.currentTile.COC[c] !== undefined ? context.currentTile.COC[c] : context.currentTile.COD); component.codingStyleParameters = codOrCoc; } tile.codingStyleDefaultParameters = context.currentTile.COD; } // Section B.10.2 Tag trees var TagTree = (function TagTreeClosure() { function TagTree(width, height) { var levelsLength = log2(Math.max(width, height)) + 1; this.levels = []; for (var i = 0; i < levelsLength; i++) { var level = { width: width, height: height, items: [] }; this.levels.push(level); width = Math.ceil(width / 2); height = Math.ceil(height / 2); } } TagTree.prototype = { reset: function TagTree_reset(i, j) { var currentLevel = 0, value = 0, level; while (currentLevel < this.levels.length) { level = this.levels[currentLevel]; var index = i + j * level.width; if (level.items[index] !== undefined) { value = level.items[index]; break; } level.index = index; i >>= 1; j >>= 1; currentLevel++; } currentLevel--; level = this.levels[currentLevel]; level.items[level.index] = value; this.currentLevel = currentLevel; delete this.value; }, incrementValue: function TagTree_incrementValue() { var level = this.levels[this.currentLevel]; level.items[level.index]++; }, nextLevel: function TagTree_nextLevel() { var currentLevel = this.currentLevel; var level = this.levels[currentLevel]; var value = level.items[level.index]; currentLevel--; if (currentLevel < 0) { this.value = value; return false; } this.currentLevel = currentLevel; level = this.levels[currentLevel]; level.items[level.index] = value; return true; } }; return TagTree; })(); var InclusionTree = (function InclusionTreeClosure() { function InclusionTree(width, height, defaultValue) { var levelsLength = log2(Math.max(width, height)) + 1; this.levels = []; for (var i = 0; i < levelsLength; i++) { var items = new Uint8Array(width * height); for (var j = 0, jj = items.length; j < jj; j++) { items[j] = defaultValue; } var level = { width: width, height: height, items: items }; this.levels.push(level); width = Math.ceil(width / 2); height = Math.ceil(height / 2); } } InclusionTree.prototype = { reset: function InclusionTree_reset(i, j, stopValue) { var currentLevel = 0; while (currentLevel < this.levels.length) { var level = this.levels[currentLevel]; var index = i + j * level.width; level.index = index; var value = level.items[index]; if (value === 0xFF) { break; } if (value > stopValue) { this.currentLevel = currentLevel; // already know about this one, propagating the value to top levels this.propagateValues(); return false; } i >>= 1; j >>= 1; currentLevel++; } this.currentLevel = currentLevel - 1; return true; }, incrementValue: function InclusionTree_incrementValue(stopValue) { var level = this.levels[this.currentLevel]; level.items[level.index] = stopValue + 1; this.propagateValues(); }, propagateValues: function InclusionTree_propagateValues() { var levelIndex = this.currentLevel; var level = this.levels[levelIndex]; var currentValue = level.items[level.index]; while (--levelIndex >= 0) { level = this.levels[levelIndex]; level.items[level.index] = currentValue; } }, nextLevel: function InclusionTree_nextLevel() { var currentLevel = this.currentLevel; var level = this.levels[currentLevel]; var value = level.items[level.index]; level.items[level.index] = 0xFF; currentLevel--; if (currentLevel < 0) { return false; } this.currentLevel = currentLevel; level = this.levels[currentLevel]; level.items[level.index] = value; return true; } }; return InclusionTree; })(); // Section D. Coefficient bit modeling var BitModel = (function BitModelClosure() { var UNIFORM_CONTEXT = 17; var RUNLENGTH_CONTEXT = 18; // Table D-1 // The index is binary presentation: 0dddvvhh, ddd - sum of Di (0..4), // vv - sum of Vi (0..2), and hh - sum of Hi (0..2) var LLAndLHContextsLabel = new Uint8Array([ 0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8 ]); var HLContextLabel = new Uint8Array([ 0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8 ]); var HHContextLabel = new Uint8Array([ 0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5, 5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8 ]); function BitModel(width, height, subband, zeroBitPlanes, mb) { this.width = width; this.height = height; this.contextLabelTable = (subband === 'HH' ? HHContextLabel : (subband === 'HL' ? HLContextLabel : LLAndLHContextsLabel)); var coefficientCount = width * height; // coefficients outside the encoding region treated as insignificant // add border state cells for significanceState this.neighborsSignificance = new Uint8Array(coefficientCount); this.coefficentsSign = new Uint8Array(coefficientCount); this.coefficentsMagnitude = mb > 14 ? new Uint32Array(coefficientCount) : mb > 6 ? new Uint16Array(coefficientCount) : new Uint8Array(coefficientCount); this.processingFlags = new Uint8Array(coefficientCount); var bitsDecoded = new Uint8Array(coefficientCount); if (zeroBitPlanes !== 0) { for (var i = 0; i < coefficientCount; i++) { bitsDecoded[i] = zeroBitPlanes; } } this.bitsDecoded = bitsDecoded; this.reset(); } BitModel.prototype = { setDecoder: function BitModel_setDecoder(decoder) { this.decoder = decoder; }, reset: function BitModel_reset() { // We have 17 contexts that are accessed via context labels, // plus the uniform and runlength context. this.contexts = new Int8Array(19); // Contexts are packed into 1 byte: // highest 7 bits carry the index, lowest bit carries mps this.contexts[0] = (4 << 1) | 0; this.contexts[UNIFORM_CONTEXT] = (46 << 1) | 0; this.contexts[RUNLENGTH_CONTEXT] = (3 << 1) | 0; }, setNeighborsSignificance: function BitModel_setNeighborsSignificance(row, column, index) { var neighborsSignificance = this.neighborsSignificance; var width = this.width, height = this.height; var left = (column > 0); var right = (column + 1 < width); var i; if (row > 0) { i = index - width; if (left) { neighborsSignificance[i - 1] += 0x10; } if (right) { neighborsSignificance[i + 1] += 0x10; } neighborsSignificance[i] += 0x04; } if (row + 1 < height) { i = index + width; if (left) { neighborsSignificance[i - 1] += 0x10; } if (right) { neighborsSignificance[i + 1] += 0x10; } neighborsSignificance[i] += 0x04; } if (left) { neighborsSignificance[index - 1] += 0x01; } if (right) { neighborsSignificance[index + 1] += 0x01; } neighborsSignificance[index] |= 0x80; }, runSignificancePropogationPass: function BitModel_runSignificancePropogationPass() { var decoder = this.decoder; var width = this.width, height = this.height; var coefficentsMagnitude = this.coefficentsMagnitude; var coefficentsSign = this.coefficentsSign; var neighborsSignificance = this.neighborsSignificance; var processingFlags = this.processingFlags; var contexts = this.contexts; var labels = this.contextLabelTable; var bitsDecoded = this.bitsDecoded; var processedInverseMask = ~1; var processedMask = 1; var firstMagnitudeBitMask = 2; for (var i0 = 0; i0 < height; i0 += 4) { for (var j = 0; j < width; j++) { var index = i0 * width + j; for (var i1 = 0; i1 < 4; i1++, index += width) { var i = i0 + i1; if (i >= height) { break; } // clear processed flag first processingFlags[index] &= processedInverseMask; if (coefficentsMagnitude[index] || !neighborsSignificance[index]) { continue; } var contextLabel = labels[neighborsSignificance[index]]; var decision = decoder.readBit(contexts, contextLabel); if (decision) { var sign = this.decodeSignBit(i, j, index); coefficentsSign[index] = sign; coefficentsMagnitude[index] = 1; this.setNeighborsSignificance(i, j, index); processingFlags[index] |= firstMagnitudeBitMask; } bitsDecoded[index]++; processingFlags[index] |= processedMask; } } } }, decodeSignBit: function BitModel_decodeSignBit(row, column, index) { var width = this.width, height = this.height; var coefficentsMagnitude = this.coefficentsMagnitude; var coefficentsSign = this.coefficentsSign; var contribution, sign0, sign1, significance1; var contextLabel, decoded; // calculate horizontal contribution significance1 = (column > 0 && coefficentsMagnitude[index - 1] !== 0); if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) { sign1 = coefficentsSign[index + 1]; if (significance1) { sign0 = coefficentsSign[index - 1]; contribution = 1 - sign1 - sign0; } else { contribution = 1 - sign1 - sign1; } } else if (significance1) { sign0 = coefficentsSign[index - 1]; contribution = 1 - sign0 - sign0; } else { contribution = 0; } var horizontalContribution = 3 * contribution; // calculate vertical contribution and combine with the horizontal significance1 = (row > 0 && coefficentsMagnitude[index - width] !== 0); if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) { sign1 = coefficentsSign[index + width]; if (significance1) { sign0 = coefficentsSign[index - width]; contribution = 1 - sign1 - sign0 + horizontalContribution; } else { contribution = 1 - sign1 - sign1 + horizontalContribution; } } else if (significance1) { sign0 = coefficentsSign[index - width]; contribution = 1 - sign0 - sign0 + horizontalContribution; } else { contribution = horizontalContribution; } if (contribution >= 0) { contextLabel = 9 + contribution; decoded = this.decoder.readBit(this.contexts, contextLabel); } else { contextLabel = 9 - contribution; decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1; } return decoded; }, runMagnitudeRefinementPass: function BitModel_runMagnitudeRefinementPass() { var decoder = this.decoder; var width = this.width, height = this.height; var coefficentsMagnitude = this.coefficentsMagnitude; var neighborsSignificance = this.neighborsSignificance; var contexts = this.contexts; var bitsDecoded = this.bitsDecoded; var processingFlags = this.processingFlags; var processedMask = 1; var firstMagnitudeBitMask = 2; var length = width * height; var width4 = width * 4; for (var index0 = 0, indexNext; index0 < length; index0 = indexNext) { indexNext = Math.min(length, index0 + width4); for (var j = 0; j < width; j++) { for (var index = index0 + j; index < indexNext; index += width) { // significant but not those that have just become if (!coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) { continue; } var contextLabel = 16; if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) { processingFlags[index] ^= firstMagnitudeBitMask; // first refinement var significance = neighborsSignificance[index] & 127; contextLabel = significance === 0 ? 15 : 14; } var bit = decoder.readBit(contexts, contextLabel); coefficentsMagnitude[index] = (coefficentsMagnitude[index] << 1) | bit; bitsDecoded[index]++; processingFlags[index] |= processedMask; } } } }, runCleanupPass: function BitModel_runCleanupPass() { var decoder = this.decoder; var width = this.width, height = this.height; var neighborsSignificance = this.neighborsSignificance; var coefficentsMagnitude = this.coefficentsMagnitude; var coefficentsSign = this.coefficentsSign; var contexts = this.contexts; var labels = this.contextLabelTable; var bitsDecoded = this.bitsDecoded; var processingFlags = this.processingFlags; var processedMask = 1; var firstMagnitudeBitMask = 2; var oneRowDown = width; var twoRowsDown = width * 2; var threeRowsDown = width * 3; var iNext; for (var i0 = 0; i0 < height; i0 = iNext) { iNext = Math.min(i0 + 4, height); var indexBase = i0 * width; var checkAllEmpty = i0 + 3 < height; for (var j = 0; j < width; j++) { var index0 = indexBase + j; // using the property: labels[neighborsSignificance[index]] === 0 // when neighborsSignificance[index] === 0 var allEmpty = (checkAllEmpty && processingFlags[index0] === 0 && processingFlags[index0 + oneRowDown] === 0 && processingFlags[index0 + twoRowsDown] === 0 && processingFlags[index0 + threeRowsDown] === 0 && neighborsSignificance[index0] === 0 && neighborsSignificance[index0 + oneRowDown] === 0 && neighborsSignificance[index0 + twoRowsDown] === 0 && neighborsSignificance[index0 + threeRowsDown] === 0); var i1 = 0, index = index0; var i = i0, sign; if (allEmpty) { var hasSignificantCoefficent = decoder.readBit(contexts, RUNLENGTH_CONTEXT); if (!hasSignificantCoefficent) { bitsDecoded[index0]++; bitsDecoded[index0 + oneRowDown]++; bitsDecoded[index0 + twoRowsDown]++; bitsDecoded[index0 + threeRowsDown]++; continue; // next column } i1 = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) | decoder.readBit(contexts, UNIFORM_CONTEXT); if (i1 !== 0) { i = i0 + i1; index += i1 * width; } sign = this.decodeSignBit(i, j, index); coefficentsSign[index] = sign; coefficentsMagnitude[index] = 1; this.setNeighborsSignificance(i, j, index); processingFlags[index] |= firstMagnitudeBitMask; index = index0; for (var i2 = i0; i2 <= i; i2++, index += width) { bitsDecoded[index]++; } i1++; } for (i = i0 + i1; i < iNext; i++, index += width) { if (coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) { continue; } var contextLabel = labels[neighborsSignificance[index]]; var decision = decoder.readBit(contexts, contextLabel); if (decision === 1) { sign = this.decodeSignBit(i, j, index); coefficentsSign[index] = sign; coefficentsMagnitude[index] = 1; this.setNeighborsSignificance(i, j, index); processingFlags[index] |= firstMagnitudeBitMask; } bitsDecoded[index]++; } } } }, checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() { var decoder = this.decoder; var contexts = this.contexts; var symbol = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 3) | (decoder.readBit(contexts, UNIFORM_CONTEXT) << 2) | (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) | decoder.readBit(contexts, UNIFORM_CONTEXT); if (symbol !== 0xA) { throw new Error('JPX Error: Invalid segmentation symbol'); } } }; return BitModel; })(); // Section F, Discrete wavelet transformation var Transform = (function TransformClosure() { function Transform() {} Transform.prototype.calculate = function transformCalculate(subbands, u0, v0) { var ll = subbands[0]; for (var i = 1, ii = subbands.length; i < ii; i++) { ll = this.iterate(ll, subbands[i], u0, v0); } return ll; }; Transform.prototype.extend = function extend(buffer, offset, size) { // Section F.3.7 extending... using max extension of 4 var i1 = offset - 1, j1 = offset + 1; var i2 = offset + size - 2, j2 = offset + size; buffer[i1--] = buffer[j1++]; buffer[j2++] = buffer[i2--]; buffer[i1--] = buffer[j1++]; buffer[j2++] = buffer[i2--]; buffer[i1--] = buffer[j1++]; buffer[j2++] = buffer[i2--]; buffer[i1] = buffer[j1]; buffer[j2] = buffer[i2]; }; Transform.prototype.iterate = function Transform_iterate(ll, hl_lh_hh, u0, v0) { var llWidth = ll.width, llHeight = ll.height, llItems = ll.items; var width = hl_lh_hh.width; var height = hl_lh_hh.height; var items = hl_lh_hh.items; var i, j, k, l, u, v; // Interleave LL according to Section F.3.3 for (k = 0, i = 0; i < llHeight; i++) { l = i * 2 * width; for (j = 0; j < llWidth; j++, k++, l += 2) { items[l] = llItems[k]; } } // The LL band is not needed anymore. llItems = ll.items = null; var bufferPadding = 4; var rowBuffer = new Float32Array(width + 2 * bufferPadding); // Section F.3.4 HOR_SR if (width === 1) { // if width = 1, when u0 even keep items as is, when odd divide by 2 if ((u0 & 1) !== 0) { for (v = 0, k = 0; v < height; v++, k += width) { items[k] *= 0.5; } } } else { for (v = 0, k = 0; v < height; v++, k += width) { rowBuffer.set(items.subarray(k, k + width), bufferPadding); this.extend(rowBuffer, bufferPadding, width); this.filter(rowBuffer, bufferPadding, width); items.set( rowBuffer.subarray(bufferPadding, bufferPadding + width), k); } } // Accesses to the items array can take long, because it may not fit into // CPU cache and has to be fetched from main memory. Since subsequent // accesses to the items array are not local when reading columns, we // have a cache miss every time. To reduce cache misses, get up to // 'numBuffers' items at a time and store them into the individual // buffers. The colBuffers should be small enough to fit into CPU cache. var numBuffers = 16; var colBuffers = []; for (i = 0; i < numBuffers; i++) { colBuffers.push(new Float32Array(height + 2 * bufferPadding)); } var b, currentBuffer = 0; ll = bufferPadding + height; // Section F.3.5 VER_SR if (height === 1) { // if height = 1, when v0 even keep items as is, when odd divide by 2 if ((v0 & 1) !== 0) { for (u = 0; u < width; u++) { items[u] *= 0.5; } } } else { for (u = 0; u < width; u++) { // if we ran out of buffers, copy several image columns at once if (currentBuffer === 0) { numBuffers = Math.min(width - u, numBuffers); for (k = u, l = bufferPadding; l < ll; k += width, l++) { for (b = 0; b < numBuffers; b++) { colBuffers[b][l] = items[k + b]; } } currentBuffer = numBuffers; } currentBuffer--; var buffer = colBuffers[currentBuffer]; this.extend(buffer, bufferPadding, height); this.filter(buffer, bufferPadding, height); // If this is last buffer in this group of buffers, flush all buffers. if (currentBuffer === 0) { k = u - numBuffers + 1; for (l = bufferPadding; l < ll; k += width, l++) { for (b = 0; b < numBuffers; b++) { items[k + b] = colBuffers[b][l]; } } } } } return { width: width, height: height, items: items }; }; return Transform; })(); // Section 3.8.2 Irreversible 9-7 filter var IrreversibleTransform = (function IrreversibleTransformClosure() { function IrreversibleTransform() { Transform.call(this); } IrreversibleTransform.prototype = Object.create(Transform.prototype); IrreversibleTransform.prototype.filter = function irreversibleTransformFilter(x, offset, length) { var len = length >> 1; offset = offset | 0; var j, n, current, next; var alpha = -1.586134342059924; var beta = -0.052980118572961; var gamma = 0.882911075530934; var delta = 0.443506852043971; var K = 1.230174104914001; var K_ = 1 / K; // step 1 is combined with step 3 // step 2 j = offset - 3; for (n = len + 4; n--; j += 2) { x[j] *= K_; } // step 1 & 3 j = offset - 2; current = delta * x[j -1]; for (n = len + 3; n--; j += 2) { next = delta * x[j + 1]; x[j] = K * x[j] - current - next; if (n--) { j += 2; current = delta * x[j + 1]; x[j] = K * x[j] - current - next; } else { break; } } // step 4 j = offset - 1; current = gamma * x[j - 1]; for (n = len + 2; n--; j += 2) { next = gamma * x[j + 1]; x[j] -= current + next; if (n--) { j += 2; current = gamma * x[j + 1]; x[j] -= current + next; } else { break; } } // step 5 j = offset; current = beta * x[j - 1]; for (n = len + 1; n--; j += 2) { next = beta * x[j + 1]; x[j] -= current + next; if (n--) { j += 2; current = beta * x[j + 1]; x[j] -= current + next; } else { break; } } // step 6 if (len !== 0) { j = offset + 1; current = alpha * x[j - 1]; for (n = len; n--; j += 2) { next = alpha * x[j + 1]; x[j] -= current + next; if (n--) { j += 2; current = alpha * x[j + 1]; x[j] -= current + next; } else { break; } } } }; return IrreversibleTransform; })(); // Section 3.8.1 Reversible 5-3 filter var ReversibleTransform = (function ReversibleTransformClosure() { function ReversibleTransform() { Transform.call(this); } ReversibleTransform.prototype = Object.create(Transform.prototype); ReversibleTransform.prototype.filter = function reversibleTransformFilter(x, offset, length) { var len = length >> 1; offset = offset | 0; var j, n; for (j = offset, n = len + 1; n--; j += 2) { x[j] -= (x[j - 1] + x[j + 1] + 2) >> 2; } for (j = offset + 1, n = len; n--; j += 2) { x[j] += (x[j - 1] + x[j + 1]) >> 1; } }; return ReversibleTransform; })(); return JpxImage; })(); exports.JpxImage = JpxImage; })); (function (root, factory) { { factory((root.pdfjsCoreMetrics = {}), root.pdfjsSharedUtil); } }(this, function (exports, sharedUtil) { var getLookupTableFactory = sharedUtil.getLookupTableFactory; // The Metrics object contains glyph widths (in glyph space units). // As per PDF spec, for most fonts (Type 3 being an exception) a glyph // space unit corresponds to 1/1000th of text space unit. var getMetrics = getLookupTableFactory(function (t) { t['Courier'] = 600; t['Courier-Bold'] = 600; t['Courier-BoldOblique'] = 600; t['Courier-Oblique'] = 600; t['Helvetica'] = getLookupTableFactory(function (t) { t['space'] = 278; t['exclam'] = 278; t['quotedbl'] = 355; t['numbersign'] = 556; t['dollar'] = 556; t['percent'] = 889; t['ampersand'] = 667; t['quoteright'] = 222; t['parenleft'] = 333; t['parenright'] = 333; t['asterisk'] = 389; t['plus'] = 584; t['comma'] = 278; t['hyphen'] = 333; t['period'] = 278; t['slash'] = 278; t['zero'] = 556; t['one'] = 556; t['two'] = 556; t['three'] = 556; t['four'] = 556; t['five'] = 556; t['six'] = 556; t['seven'] = 556; t['eight'] = 556; t['nine'] = 556; t['colon'] = 278; t['semicolon'] = 278; t['less'] = 584; t['equal'] = 584; t['greater'] = 584; t['question'] = 556; t['at'] = 1015; t['A'] = 667; t['B'] = 667; t['C'] = 722; t['D'] = 722; t['E'] = 667; t['F'] = 611; t['G'] = 778; t['H'] = 722; t['I'] = 278; t['J'] = 500; t['K'] = 667; t['L'] = 556; t['M'] = 833; t['N'] = 722; t['O'] = 778; t['P'] = 667; t['Q'] = 778; t['R'] = 722; t['S'] = 667; t['T'] = 611; t['U'] = 722; t['V'] = 667; t['W'] = 944; t['X'] = 667; t['Y'] = 667; t['Z'] = 611; t['bracketleft'] = 278; t['backslash'] = 278; t['bracketright'] = 278; t['asciicircum'] = 469; t['underscore'] = 556; t['quoteleft'] = 222; t['a'] = 556; t['b'] = 556; t['c'] = 500; t['d'] = 556; t['e'] = 556; t['f'] = 278; t['g'] = 556; t['h'] = 556; t['i'] = 222; t['j'] = 222; t['k'] = 500; t['l'] = 222; t['m'] = 833; t['n'] = 556; t['o'] = 556; t['p'] = 556; t['q'] = 556; t['r'] = 333; t['s'] = 500; t['t'] = 278; t['u'] = 556; t['v'] = 500; t['w'] = 722; t['x'] = 500; t['y'] = 500; t['z'] = 500; t['braceleft'] = 334; t['bar'] = 260; t['braceright'] = 334; t['asciitilde'] = 584; t['exclamdown'] = 333; t['cent'] = 556; t['sterling'] = 556; t['fraction'] = 167; t['yen'] = 556; t['florin'] = 556; t['section'] = 556; t['currency'] = 556; t['quotesingle'] = 191; t['quotedblleft'] = 333; t['guillemotleft'] = 556; t['guilsinglleft'] = 333; t['guilsinglright'] = 333; t['fi'] = 500; t['fl'] = 500; t['endash'] = 556; t['dagger'] = 556; t['daggerdbl'] = 556; t['periodcentered'] = 278; t['paragraph'] = 537; t['bullet'] = 350; t['quotesinglbase'] = 222; t['quotedblbase'] = 333; t['quotedblright'] = 333; t['guillemotright'] = 556; t['ellipsis'] = 1000; t['perthousand'] = 1000; t['questiondown'] = 611; t['grave'] = 333; t['acute'] = 333; t['circumflex'] = 333; t['tilde'] = 333; t['macron'] = 333; t['breve'] = 333; t['dotaccent'] = 333; t['dieresis'] = 333; t['ring'] = 333; t['cedilla'] = 333; t['hungarumlaut'] = 333; t['ogonek'] = 333; t['caron'] = 333; t['emdash'] = 1000; t['AE'] = 1000; t['ordfeminine'] = 370; t['Lslash'] = 556; t['Oslash'] = 778; t['OE'] = 1000; t['ordmasculine'] = 365; t['ae'] = 889; t['dotlessi'] = 278; t['lslash'] = 222; t['oslash'] = 611; t['oe'] = 944; t['germandbls'] = 611; t['Idieresis'] = 278; t['eacute'] = 556; t['abreve'] = 556; t['uhungarumlaut'] = 556; t['ecaron'] = 556; t['Ydieresis'] = 667; t['divide'] = 584; t['Yacute'] = 667; t['Acircumflex'] = 667; t['aacute'] = 556; t['Ucircumflex'] = 722; t['yacute'] = 500; t['scommaaccent'] = 500; t['ecircumflex'] = 556; t['Uring'] = 722; t['Udieresis'] = 722; t['aogonek'] = 556; t['Uacute'] = 722; t['uogonek'] = 556; t['Edieresis'] = 667; t['Dcroat'] = 722; t['commaaccent'] = 250; t['copyright'] = 737; t['Emacron'] = 667; t['ccaron'] = 500; t['aring'] = 556; t['Ncommaaccent'] = 722; t['lacute'] = 222; t['agrave'] = 556; t['Tcommaaccent'] = 611; t['Cacute'] = 722; t['atilde'] = 556; t['Edotaccent'] = 667; t['scaron'] = 500; t['scedilla'] = 500; t['iacute'] = 278; t['lozenge'] = 471; t['Rcaron'] = 722; t['Gcommaaccent'] = 778; t['ucircumflex'] = 556; t['acircumflex'] = 556; t['Amacron'] = 667; t['rcaron'] = 333; t['ccedilla'] = 500; t['Zdotaccent'] = 611; t['Thorn'] = 667; t['Omacron'] = 778; t['Racute'] = 722; t['Sacute'] = 667; t['dcaron'] = 643; t['Umacron'] = 722; t['uring'] = 556; t['threesuperior'] = 333; t['Ograve'] = 778; t['Agrave'] = 667; t['Abreve'] = 667; t['multiply'] = 584; t['uacute'] = 556; t['Tcaron'] = 611; t['partialdiff'] = 476; t['ydieresis'] = 500; t['Nacute'] = 722; t['icircumflex'] = 278; t['Ecircumflex'] = 667; t['adieresis'] = 556; t['edieresis'] = 556; t['cacute'] = 500; t['nacute'] = 556; t['umacron'] = 556; t['Ncaron'] = 722; t['Iacute'] = 278; t['plusminus'] = 584; t['brokenbar'] = 260; t['registered'] = 737; t['Gbreve'] = 778; t['Idotaccent'] = 278; t['summation'] = 600; t['Egrave'] = 667; t['racute'] = 333; t['omacron'] = 556; t['Zacute'] = 611; t['Zcaron'] = 611; t['greaterequal'] = 549; t['Eth'] = 722; t['Ccedilla'] = 722; t['lcommaaccent'] = 222; t['tcaron'] = 317; t['eogonek'] = 556; t['Uogonek'] = 722; t['Aacute'] = 667; t['Adieresis'] = 667; t['egrave'] = 556; t['zacute'] = 500; t['iogonek'] = 222; t['Oacute'] = 778; t['oacute'] = 556; t['amacron'] = 556; t['sacute'] = 500; t['idieresis'] = 278; t['Ocircumflex'] = 778; t['Ugrave'] = 722; t['Delta'] = 612; t['thorn'] = 556; t['twosuperior'] = 333; t['Odieresis'] = 778; t['mu'] = 556; t['igrave'] = 278; t['ohungarumlaut'] = 556; t['Eogonek'] = 667; t['dcroat'] = 556; t['threequarters'] = 834; t['Scedilla'] = 667; t['lcaron'] = 299; t['Kcommaaccent'] = 667; t['Lacute'] = 556; t['trademark'] = 1000; t['edotaccent'] = 556; t['Igrave'] = 278; t['Imacron'] = 278; t['Lcaron'] = 556; t['onehalf'] = 834; t['lessequal'] = 549; t['ocircumflex'] = 556; t['ntilde'] = 556; t['Uhungarumlaut'] = 722; t['Eacute'] = 667; t['emacron'] = 556; t['gbreve'] = 556; t['onequarter'] = 834; t['Scaron'] = 667; t['Scommaaccent'] = 667; t['Ohungarumlaut'] = 778; t['degree'] = 400; t['ograve'] = 556; t['Ccaron'] = 722; t['ugrave'] = 556; t['radical'] = 453; t['Dcaron'] = 722; t['rcommaaccent'] = 333; t['Ntilde'] = 722; t['otilde'] = 556; t['Rcommaaccent'] = 722; t['Lcommaaccent'] = 556; t['Atilde'] = 667; t['Aogonek'] = 667; t['Aring'] = 667; t['Otilde'] = 778; t['zdotaccent'] = 500; t['Ecaron'] = 667; t['Iogonek'] = 278; t['kcommaaccent'] = 500; t['minus'] = 584; t['Icircumflex'] = 278; t['ncaron'] = 556; t['tcommaaccent'] = 278; t['logicalnot'] = 584; t['odieresis'] = 556; t['udieresis'] = 556; t['notequal'] = 549; t['gcommaaccent'] = 556; t['eth'] = 556; t['zcaron'] = 500; t['ncommaaccent'] = 556; t['onesuperior'] = 333; t['imacron'] = 278; t['Euro'] = 556; }); t['Helvetica-Bold'] = getLookupTableFactory(function (t) { t['space'] = 278; t['exclam'] = 333; t['quotedbl'] = 474; t['numbersign'] = 556; t['dollar'] = 556; t['percent'] = 889; t['ampersand'] = 722; t['quoteright'] = 278; t['parenleft'] = 333; t['parenright'] = 333; t['asterisk'] = 389; t['plus'] = 584; t['comma'] = 278; t['hyphen'] = 333; t['period'] = 278; t['slash'] = 278; t['zero'] = 556; t['one'] = 556; t['two'] = 556; t['three'] = 556; t['four'] = 556; t['five'] = 556; t['six'] = 556; t['seven'] = 556; t['eight'] = 556; t['nine'] = 556; t['colon'] = 333; t['semicolon'] = 333; t['less'] = 584; t['equal'] = 584; t['greater'] = 584; t['question'] = 611; t['at'] = 975; t['A'] = 722; t['B'] = 722; t['C'] = 722; t['D'] = 722; t['E'] = 667; t['F'] = 611; t['G'] = 778; t['H'] = 722; t['I'] = 278; t['J'] = 556; t['K'] = 722; t['L'] = 611; t['M'] = 833; t['N'] = 722; t['O'] = 778; t['P'] = 667; t['Q'] = 778; t['R'] = 722; t['S'] = 667; t['T'] = 611; t['U'] = 722; t['V'] = 667; t['W'] = 944; t['X'] = 667; t['Y'] = 667; t['Z'] = 611; t['bracketleft'] = 333; t['backslash'] = 278; t['bracketright'] = 333; t['asciicircum'] = 584; t['underscore'] = 556; t['quoteleft'] = 278; t['a'] = 556; t['b'] = 611; t['c'] = 556; t['d'] = 611; t['e'] = 556; t['f'] = 333; t['g'] = 611; t['h'] = 611; t['i'] = 278; t['j'] = 278; t['k'] = 556; t['l'] = 278; t['m'] = 889; t['n'] = 611; t['o'] = 611; t['p'] = 611; t['q'] = 611; t['r'] = 389; t['s'] = 556; t['t'] = 333; t['u'] = 611; t['v'] = 556; t['w'] = 778; t['x'] = 556; t['y'] = 556; t['z'] = 500; t['braceleft'] = 389; t['bar'] = 280; t['braceright'] = 389; t['asciitilde'] = 584; t['exclamdown'] = 333; t['cent'] = 556; t['sterling'] = 556; t['fraction'] = 167; t['yen'] = 556; t['florin'] = 556; t['section'] = 556; t['currency'] = 556; t['quotesingle'] = 238; t['quotedblleft'] = 500; t['guillemotleft'] = 556; t['guilsinglleft'] = 333; t['guilsinglright'] = 333; t['fi'] = 611; t['fl'] = 611; t['endash'] = 556; t['dagger'] = 556; t['daggerdbl'] = 556; t['periodcentered'] = 278; t['paragraph'] = 556; t['bullet'] = 350; t['quotesinglbase'] = 278; t['quotedblbase'] = 500; t['quotedblright'] = 500; t['guillemotright'] = 556; t['ellipsis'] = 1000; t['perthousand'] = 1000; t['questiondown'] = 611; t['grave'] = 333; t['acute'] = 333; t['circumflex'] = 333; t['tilde'] = 333; t['macron'] = 333; t['breve'] = 333; t['dotaccent'] = 333; t['dieresis'] = 333; t['ring'] = 333; t['cedilla'] = 333; t['hungarumlaut'] = 333; t['ogonek'] = 333; t['caron'] = 333; t['emdash'] = 1000; t['AE'] = 1000; t['ordfeminine'] = 370; t['Lslash'] = 611; t['Oslash'] = 778; t['OE'] = 1000; t['ordmasculine'] = 365; t['ae'] = 889; t['dotlessi'] = 278; t['lslash'] = 278; t['oslash'] = 611; t['oe'] = 944; t['germandbls'] = 611; t['Idieresis'] = 278; t['eacute'] = 556; t['abreve'] = 556; t['uhungarumlaut'] = 611; t['ecaron'] = 556; t['Ydieresis'] = 667; t['divide'] = 584; t['Yacute'] = 667; t['Acircumflex'] = 722; t['aacute'] = 556; t['Ucircumflex'] = 722; t['yacute'] = 556; t['scommaaccent'] = 556; t['ecircumflex'] = 556; t['Uring'] = 722; t['Udieresis'] = 722; t['aogonek'] = 556; t['Uacute'] = 722; t['uogonek'] = 611; t['Edieresis'] = 667; t['Dcroat'] = 722; t['commaaccent'] = 250; t['copyright'] = 737; t['Emacron'] = 667; t['ccaron'] = 556; t['aring'] = 556; t['Ncommaaccent'] = 722; t['lacute'] = 278; t['agrave'] = 556; t['Tcommaaccent'] = 611; t['Cacute'] = 722; t['atilde'] = 556; t['Edotaccent'] = 667; t['scaron'] = 556; t['scedilla'] = 556; t['iacute'] = 278; t['lozenge'] = 494; t['Rcaron'] = 722; t['Gcommaaccent'] = 778; t['ucircumflex'] = 611; t['acircumflex'] = 556; t['Amacron'] = 722; t['rcaron'] = 389; t['ccedilla'] = 556; t['Zdotaccent'] = 611; t['Thorn'] = 667; t['Omacron'] = 778; t['Racute'] = 722; t['Sacute'] = 667; t['dcaron'] = 743; t['Umacron'] = 722; t['uring'] = 611; t['threesuperior'] = 333; t['Ograve'] = 778; t['Agrave'] = 722; t['Abreve'] = 722; t['multiply'] = 584; t['uacute'] = 611; t['Tcaron'] = 611; t['partialdiff'] = 494; t['ydieresis'] = 556; t['Nacute'] = 722; t['icircumflex'] = 278; t['Ecircumflex'] = 667; t['adieresis'] = 556; t['edieresis'] = 556; t['cacute'] = 556; t['nacute'] = 611; t['umacron'] = 611; t['Ncaron'] = 722; t['Iacute'] = 278; t['plusminus'] = 584; t['brokenbar'] = 280; t['registered'] = 737; t['Gbreve'] = 778; t['Idotaccent'] = 278; t['summation'] = 600; t['Egrave'] = 667; t['racute'] = 389; t['omacron'] = 611; t['Zacute'] = 611; t['Zcaron'] = 611; t['greaterequal'] = 549; t['Eth'] = 722; t['Ccedilla'] = 722; t['lcommaaccent'] = 278; t['tcaron'] = 389; t['eogonek'] = 556; t['Uogonek'] = 722; t['Aacute'] = 722; t['Adieresis'] = 722; t['egrave'] = 556; t['zacute'] = 500; t['iogonek'] = 278; t['Oacute'] = 778; t['oacute'] = 611; t['amacron'] = 556; t['sacute'] = 556; t['idieresis'] = 278; t['Ocircumflex'] = 778; t['Ugrave'] = 722; t['Delta'] = 612; t['thorn'] = 611; t['twosuperior'] = 333; t['Odieresis'] = 778; t['mu'] = 611; t['igrave'] = 278; t['ohungarumlaut'] = 611; t['Eogonek'] = 667; t['dcroat'] = 611; t['threequarters'] = 834; t['Scedilla'] = 667; t['lcaron'] = 400; t['Kcommaaccent'] = 722; t['Lacute'] = 611; t['trademark'] = 1000; t['edotaccent'] = 556; t['Igrave'] = 278; t['Imacron'] = 278; t['Lcaron'] = 611; t['onehalf'] = 834; t['lessequal'] = 549; t['ocircumflex'] = 611; t['ntilde'] = 611; t['Uhungarumlaut'] = 722; t['Eacute'] = 667; t['emacron'] = 556; t['gbreve'] = 611; t['onequarter'] = 834; t['Scaron'] = 667; t['Scommaaccent'] = 667; t['Ohungarumlaut'] = 778; t['degree'] = 400; t['ograve'] = 611; t['Ccaron'] = 722; t['ugrave'] = 611; t['radical'] = 549; t['Dcaron'] = 722; t['rcommaaccent'] = 389; t['Ntilde'] = 722; t['otilde'] = 611; t['Rcommaaccent'] = 722; t['Lcommaaccent'] = 611; t['Atilde'] = 722; t['Aogonek'] = 722; t['Aring'] = 722; t['Otilde'] = 778; t['zdotaccent'] = 500; t['Ecaron'] = 667; t['Iogonek'] = 278; t['kcommaaccent'] = 556; t['minus'] = 584; t['Icircumflex'] = 278; t['ncaron'] = 611; t['tcommaaccent'] = 333; t['logicalnot'] = 584; t['odieresis'] = 611; t['udieresis'] = 611; t['notequal'] = 549; t['gcommaaccent'] = 611; t['eth'] = 611; t['zcaron'] = 500; t['ncommaaccent'] = 611; t['onesuperior'] = 333; t['imacron'] = 278; t['Euro'] = 556; }); t['Helvetica-BoldOblique'] = getLookupTableFactory(function (t) { t['space'] = 278; t['exclam'] = 333; t['quotedbl'] = 474; t['numbersign'] = 556; t['dollar'] = 556; t['percent'] = 889; t['ampersand'] = 722; t['quoteright'] = 278; t['parenleft'] = 333; t['parenright'] = 333; t['asterisk'] = 389; t['plus'] = 584; t['comma'] = 278; t['hyphen'] = 333; t['period'] = 278; t['slash'] = 278; t['zero'] = 556; t['one'] = 556; t['two'] = 556; t['three'] = 556; t['four'] = 556; t['five'] = 556; t['six'] = 556; t['seven'] = 556; t['eight'] = 556; t['nine'] = 556; t['colon'] = 333; t['semicolon'] = 333; t['less'] = 584; t['equal'] = 584; t['greater'] = 584; t['question'] = 611; t['at'] = 975; t['A'] = 722; t['B'] = 722; t['C'] = 722; t['D'] = 722; t['E'] = 667; t['F'] = 611; t['G'] = 778; t['H'] = 722; t['I'] = 278; t['J'] = 556; t['K'] = 722; t['L'] = 611; t['M'] = 833; t['N'] = 722; t['O'] = 778; t['P'] = 667; t['Q'] = 778; t['R'] = 722; t['S'] = 667; t['T'] = 611; t['U'] = 722; t['V'] = 667; t['W'] = 944; t['X'] = 667; t['Y'] = 667; t['Z'] = 611; t['bracketleft'] = 333; t['backslash'] = 278; t['bracketright'] = 333; t['asciicircum'] = 584; t['underscore'] = 556; t['quoteleft'] = 278; t['a'] = 556; t['b'] = 611; t['c'] = 556; t['d'] = 611; t['e'] = 556; t['f'] = 333; t['g'] = 611; t['h'] = 611; t['i'] = 278; t['j'] = 278; t['k'] = 556; t['l'] = 278; t['m'] = 889; t['n'] = 611; t['o'] = 611; t['p'] = 611; t['q'] = 611; t['r'] = 389; t['s'] = 556; t['t'] = 333; t['u'] = 611; t['v'] = 556; t['w'] = 778; t['x'] = 556; t['y'] = 556; t['z'] = 500; t['braceleft'] = 389; t['bar'] = 280; t['braceright'] = 389; t['asciitilde'] = 584; t['exclamdown'] = 333; t['cent'] = 556; t['sterling'] = 556; t['fraction'] = 167; t['yen'] = 556; t['florin'] = 556; t['section'] = 556; t['currency'] = 556; t['quotesingle'] = 238; t['quotedblleft'] = 500; t['guillemotleft'] = 556; t['guilsinglleft'] = 333; t['guilsinglright'] = 333; t['fi'] = 611; t['fl'] = 611; t['endash'] = 556; t['dagger'] = 556; t['daggerdbl'] = 556; t['periodcentered'] = 278; t['paragraph'] = 556; t['bullet'] = 350; t['quotesinglbase'] = 278; t['quotedblbase'] = 500; t['quotedblright'] = 500; t['guillemotright'] = 556; t['ellipsis'] = 1000; t['perthousand'] = 1000; t['questiondown'] = 611; t['grave'] = 333; t['acute'] = 333; t['circumflex'] = 333; t['tilde'] = 333; t['macron'] = 333; t['breve'] = 333; t['dotaccent'] = 333; t['dieresis'] = 333; t['ring'] = 333; t['cedilla'] = 333; t['hungarumlaut'] = 333; t['ogonek'] = 333; t['caron'] = 333; t['emdash'] = 1000; t['AE'] = 1000; t['ordfeminine'] = 370; t['Lslash'] = 611; t['Oslash'] = 778; t['OE'] = 1000; t['ordmasculine'] = 365; t['ae'] = 889; t['dotlessi'] = 278; t['lslash'] = 278; t['oslash'] = 611; t['oe'] = 944; t['germandbls'] = 611; t['Idieresis'] = 278; t['eacute'] = 556; t['abreve'] = 556; t['uhungarumlaut'] = 611; t['ecaron'] = 556; t['Ydieresis'] = 667; t['divide'] = 584; t['Yacute'] = 667; t['Acircumflex'] = 722; t['aacute'] = 556; t['Ucircumflex'] = 722; t['yacute'] = 556; t['scommaaccent'] = 556; t['ecircumflex'] = 556; t['Uring'] = 722; t['Udieresis'] = 722; t['aogonek'] = 556; t['Uacute'] = 722; t['uogonek'] = 611; t['Edieresis'] = 667; t['Dcroat'] = 722; t['commaaccent'] = 250; t['copyright'] = 737; t['Emacron'] = 667; t['ccaron'] = 556; t['aring'] = 556; t['Ncommaaccent'] = 722; t['lacute'] = 278; t['agrave'] = 556; t['Tcommaaccent'] = 611; t['Cacute'] = 722; t['atilde'] = 556; t['Edotaccent'] = 667; t['scaron'] = 556; t['scedilla'] = 556; t['iacute'] = 278; t['lozenge'] = 494; t['Rcaron'] = 722; t['Gcommaaccent'] = 778; t['ucircumflex'] = 611; t['acircumflex'] = 556; t['Amacron'] = 722; t['rcaron'] = 389; t['ccedilla'] = 556; t['Zdotaccent'] = 611; t['Thorn'] = 667; t['Omacron'] = 778; t['Racute'] = 722; t['Sacute'] = 667; t['dcaron'] = 743; t['Umacron'] = 722; t['uring'] = 611; t['threesuperior'] = 333; t['Ograve'] = 778; t['Agrave'] = 722; t['Abreve'] = 722; t['multiply'] = 584; t['uacute'] = 611; t['Tcaron'] = 611; t['partialdiff'] = 494; t['ydieresis'] = 556; t['Nacute'] = 722; t['icircumflex'] = 278; t['Ecircumflex'] = 667; t['adieresis'] = 556; t['edieresis'] = 556; t['cacute'] = 556; t['nacute'] = 611; t['umacron'] = 611; t['Ncaron'] = 722; t['Iacute'] = 278; t['plusminus'] = 584; t['brokenbar'] = 280; t['registered'] = 737; t['Gbreve'] = 778; t['Idotaccent'] = 278; t['summation'] = 600; t['Egrave'] = 667; t['racute'] = 389; t['omacron'] = 611; t['Zacute'] = 611; t['Zcaron'] = 611; t['greaterequal'] = 549; t['Eth'] = 722; t['Ccedilla'] = 722; t['lcommaaccent'] = 278; t['tcaron'] = 389; t['eogonek'] = 556; t['Uogonek'] = 722; t['Aacute'] = 722; t['Adieresis'] = 722; t['egrave'] = 556; t['zacute'] = 500; t['iogonek'] = 278; t['Oacute'] = 778; t['oacute'] = 611; t['amacron'] = 556; t['sacute'] = 556; t['idieresis'] = 278; t['Ocircumflex'] = 778; t['Ugrave'] = 722; t['Delta'] = 612; t['thorn'] = 611; t['twosuperior'] = 333; t['Odieresis'] = 778; t['mu'] = 611; t['igrave'] = 278; t['ohungarumlaut'] = 611; t['Eogonek'] = 667; t['dcroat'] = 611; t['threequarters'] = 834; t['Scedilla'] = 667; t['lcaron'] = 400; t['Kcommaaccent'] = 722; t['Lacute'] = 611; t['trademark'] = 1000; t['edotaccent'] = 556; t['Igrave'] = 278; t['Imacron'] = 278; t['Lcaron'] = 611; t['onehalf'] = 834; t['lessequal'] = 549; t['ocircumflex'] = 611; t['ntilde'] = 611; t['Uhungarumlaut'] = 722; t['Eacute'] = 667; t['emacron'] = 556; t['gbreve'] = 611; t['onequarter'] = 834; t['Scaron'] = 667; t['Scommaaccent'] = 667; t['Ohungarumlaut'] = 778; t['degree'] = 400; t['ograve'] = 611; t['Ccaron'] = 722; t['ugrave'] = 611; t['radical'] = 549; t['Dcaron'] = 722; t['rcommaaccent'] = 389; t['Ntilde'] = 722; t['otilde'] = 611; t['Rcommaaccent'] = 722; t['Lcommaaccent'] = 611; t['Atilde'] = 722; t['Aogonek'] = 722; t['Aring'] = 722; t['Otilde'] = 778; t['zdotaccent'] = 500; t['Ecaron'] = 667; t['Iogonek'] = 278; t['kcommaaccent'] = 556; t['minus'] = 584; t['Icircumflex'] = 278; t['ncaron'] = 611; t['tcommaaccent'] = 333; t['logicalnot'] = 584; t['odieresis'] = 611; t['udieresis'] = 611; t['notequal'] = 549; t['gcommaaccent'] = 611; t['eth'] = 611; t['zcaron'] = 500; t['ncommaaccent'] = 611; t['onesuperior'] = 333; t['imacron'] = 278; t['Euro'] = 556; }); t['Helvetica-Oblique'] = getLookupTableFactory(function (t) { t['space'] = 278; t['exclam'] = 278; t['quotedbl'] = 355; t['numbersign'] = 556; t['dollar'] = 556; t['percent'] = 889; t['ampersand'] = 667; t['quoteright'] = 222; t['parenleft'] = 333; t['parenright'] = 333; t['asterisk'] = 389; t['plus'] = 584; t['comma'] = 278; t['hyphen'] = 333; t['period'] = 278; t['slash'] = 278; t['zero'] = 556; t['one'] = 556; t['two'] = 556; t['three'] = 556; t['four'] = 556; t['five'] = 556; t['six'] = 556; t['seven'] = 556; t['eight'] = 556; t['nine'] = 556; t['colon'] = 278; t['semicolon'] = 278; t['less'] = 584; t['equal'] = 584; t['greater'] = 584; t['question'] = 556; t['at'] = 1015; t['A'] = 667; t['B'] = 667; t['C'] = 722; t['D'] = 722; t['E'] = 667; t['F'] = 611; t['G'] = 778; t['H'] = 722; t['I'] = 278; t['J'] = 500; t['K'] = 667; t['L'] = 556; t['M'] = 833; t['N'] = 722; t['O'] = 778; t['P'] = 667; t['Q'] = 778; t['R'] = 722; t['S'] = 667; t['T'] = 611; t['U'] = 722; t['V'] = 667; t['W'] = 944; t['X'] = 667; t['Y'] = 667; t['Z'] = 611; t['bracketleft'] = 278; t['backslash'] = 278; t['bracketright'] = 278; t['asciicircum'] = 469; t['underscore'] = 556; t['quoteleft'] = 222; t['a'] = 556; t['b'] = 556; t['c'] = 500; t['d'] = 556; t['e'] = 556; t['f'] = 278; t['g'] = 556; t['h'] = 556; t['i'] = 222; t['j'] = 222; t['k'] = 500; t['l'] = 222; t['m'] = 833; t['n'] = 556; t['o'] = 556; t['p'] = 556; t['q'] = 556; t['r'] = 333; t['s'] = 500; t['t'] = 278; t['u'] = 556; t['v'] = 500; t['w'] = 722; t['x'] = 500; t['y'] = 500; t['z'] = 500; t['braceleft'] = 334; t['bar'] = 260; t['braceright'] = 334; t['asciitilde'] = 584; t['exclamdown'] = 333; t['cent'] = 556; t['sterling'] = 556; t['fraction'] = 167; t['yen'] = 556; t['florin'] = 556; t['section'] = 556; t['currency'] = 556; t['quotesingle'] = 191; t['quotedblleft'] = 333; t['guillemotleft'] = 556; t['guilsinglleft'] = 333; t['guilsinglright'] = 333; t['fi'] = 500; t['fl'] = 500; t['endash'] = 556; t['dagger'] = 556; t['daggerdbl'] = 556; t['periodcentered'] = 278; t['paragraph'] = 537; t['bullet'] = 350; t['quotesinglbase'] = 222; t['quotedblbase'] = 333; t['quotedblright'] = 333; t['guillemotright'] = 556; t['ellipsis'] = 1000; t['perthousand'] = 1000; t['questiondown'] = 611; t['grave'] = 333; t['acute'] = 333; t['circumflex'] = 333; t['tilde'] = 333; t['macron'] = 333; t['breve'] = 333; t['dotaccent'] = 333; t['dieresis'] = 333; t['ring'] = 333; t['cedilla'] = 333; t['hungarumlaut'] = 333; t['ogonek'] = 333; t['caron'] = 333; t['emdash'] = 1000; t['AE'] = 1000; t['ordfeminine'] = 370; t['Lslash'] = 556; t['Oslash'] = 778; t['OE'] = 1000; t['ordmasculine'] = 365; t['ae'] = 889; t['dotlessi'] = 278; t['lslash'] = 222; t['oslash'] = 611; t['oe'] = 944; t['germandbls'] = 611; t['Idieresis'] = 278; t['eacute'] = 556; t['abreve'] = 556; t['uhungarumlaut'] = 556; t['ecaron'] = 556; t['Ydieresis'] = 667; t['divide'] = 584; t['Yacute'] = 667; t['Acircumflex'] = 667; t['aacute'] = 556; t['Ucircumflex'] = 722; t['yacute'] = 500; t['scommaaccent'] = 500; t['ecircumflex'] = 556; t['Uring'] = 722; t['Udieresis'] = 722; t['aogonek'] = 556; t['Uacute'] = 722; t['uogonek'] = 556; t['Edieresis'] = 667; t['Dcroat'] = 722; t['commaaccent'] = 250; t['copyright'] = 737; t['Emacron'] = 667; t['ccaron'] = 500; t['aring'] = 556; t['Ncommaaccent'] = 722; t['lacute'] = 222; t['agrave'] = 556; t['Tcommaaccent'] = 611; t['Cacute'] = 722; t['atilde'] = 556; t['Edotaccent'] = 667; t['scaron'] = 500; t['scedilla'] = 500; t['iacute'] = 278; t['lozenge'] = 471; t['Rcaron'] = 722; t['Gcommaaccent'] = 778; t['ucircumflex'] = 556; t['acircumflex'] = 556; t['Amacron'] = 667; t['rcaron'] = 333; t['ccedilla'] = 500; t['Zdotaccent'] = 611; t['Thorn'] = 667; t['Omacron'] = 778; t['Racute'] = 722; t['Sacute'] = 667; t['dcaron'] = 643; t['Umacron'] = 722; t['uring'] = 556; t['threesuperior'] = 333; t['Ograve'] = 778; t['Agrave'] = 667; t['Abreve'] = 667; t['multiply'] = 584; t['uacute'] = 556; t['Tcaron'] = 611; t['partialdiff'] = 476; t['ydieresis'] = 500; t['Nacute'] = 722; t['icircumflex'] = 278; t['Ecircumflex'] = 667; t['adieresis'] = 556; t['edieresis'] = 556; t['cacute'] = 500; t['nacute'] = 556; t['umacron'] = 556; t['Ncaron'] = 722; t['Iacute'] = 278; t['plusminus'] = 584; t['brokenbar'] = 260; t['registered'] = 737; t['Gbreve'] = 778; t['Idotaccent'] = 278; t['summation'] = 600; t['Egrave'] = 667; t['racute'] = 333; t['omacron'] = 556; t['Zacute'] = 611; t['Zcaron'] = 611; t['greaterequal'] = 549; t['Eth'] = 722; t['Ccedilla'] = 722; t['lcommaaccent'] = 222; t['tcaron'] = 317; t['eogonek'] = 556; t['Uogonek'] = 722; t['Aacute'] = 667; t['Adieresis'] = 667; t['egrave'] = 556; t['zacute'] = 500; t['iogonek'] = 222; t['Oacute'] = 778; t['oacute'] = 556; t['amacron'] = 556; t['sacute'] = 500; t['idieresis'] = 278; t['Ocircumflex'] = 778; t['Ugrave'] = 722; t['Delta'] = 612; t['thorn'] = 556; t['twosuperior'] = 333; t['Odieresis'] = 778; t['mu'] = 556; t['igrave'] = 278; t['ohungarumlaut'] = 556; t['Eogonek'] = 667; t['dcroat'] = 556; t['threequarters'] = 834; t['Scedilla'] = 667; t['lcaron'] = 299; t['Kcommaaccent'] = 667; t['Lacute'] = 556; t['trademark'] = 1000; t['edotaccent'] = 556; t['Igrave'] = 278; t['Imacron'] = 278; t['Lcaron'] = 556; t['onehalf'] = 834; t['lessequal'] = 549; t['ocircumflex'] = 556; t['ntilde'] = 556; t['Uhungarumlaut'] = 722; t['Eacute'] = 667; t['emacron'] = 556; t['gbreve'] = 556; t['onequarter'] = 834; t['Scaron'] = 667; t['Scommaaccent'] = 667; t['Ohungarumlaut'] = 778; t['degree'] = 400; t['ograve'] = 556; t['Ccaron'] = 722; t['ugrave'] = 556; t['radical'] = 453; t['Dcaron'] = 722; t['rcommaaccent'] = 333; t['Ntilde'] = 722; t['otilde'] = 556; t['Rcommaaccent'] = 722; t['Lcommaaccent'] = 556; t['Atilde'] = 667; t['Aogonek'] = 667; t['Aring'] = 667; t['Otilde'] = 778; t['zdotaccent'] = 500; t['Ecaron'] = 667; t['Iogonek'] = 278; t['kcommaaccent'] = 500; t['minus'] = 584; t['Icircumflex'] = 278; t['ncaron'] = 556; t['tcommaaccent'] = 278; t['logicalnot'] = 584; t['odieresis'] = 556; t['udieresis'] = 556; t['notequal'] = 549; t['gcommaaccent'] = 556; t['eth'] = 556; t['zcaron'] = 500; t['ncommaaccent'] = 556; t['onesuperior'] = 333; t['imacron'] = 278; t['Euro'] = 556; }); t['Symbol'] = getLookupTableFactory(function (t) { t['space'] = 250; t['exclam'] = 333; t['universal'] = 713; t['numbersign'] = 500; t['existential'] = 549; t['percent'] = 833; t['ampersand'] = 778; t['suchthat'] = 439; t['parenleft'] = 333; t['parenright'] = 333; t['asteriskmath'] = 500; t['plus'] = 549; t['comma'] = 250; t['minus'] = 549; t['period'] = 250; t['slash'] = 278; t['zero'] = 500; t['one'] = 500; t['two'] = 500; t['three'] = 500; t['four'] = 500; t['five'] = 500; t['six'] = 500; t['seven'] = 500; t['eight'] = 500; t['nine'] = 500; t['colon'] = 278; t['semicolon'] = 278; t['less'] = 549; t['equal'] = 549; t['greater'] = 549; t['question'] = 444; t['congruent'] = 549; t['Alpha'] = 722; t['Beta'] = 667; t['Chi'] = 722; t['Delta'] = 612; t['Epsilon'] = 611; t['Phi'] = 763; t['Gamma'] = 603; t['Eta'] = 722; t['Iota'] = 333; t['theta1'] = 631; t['Kappa'] = 722; t['Lambda'] = 686; t['Mu'] = 889; t['Nu'] = 722; t['Omicron'] = 722; t['Pi'] = 768; t['Theta'] = 741; t['Rho'] = 556; t['Sigma'] = 592; t['Tau'] = 611; t['Upsilon'] = 690; t['sigma1'] = 439; t['Omega'] = 768; t['Xi'] = 645; t['Psi'] = 795; t['Zeta'] = 611; t['bracketleft'] = 333; t['therefore'] = 863; t['bracketright'] = 333; t['perpendicular'] = 658; t['underscore'] = 500; t['radicalex'] = 500; t['alpha'] = 631; t['beta'] = 549; t['chi'] = 549; t['delta'] = 494; t['epsilon'] = 439; t['phi'] = 521; t['gamma'] = 411; t['eta'] = 603; t['iota'] = 329; t['phi1'] = 603; t['kappa'] = 549; t['lambda'] = 549; t['mu'] = 576; t['nu'] = 521; t['omicron'] = 549; t['pi'] = 549; t['theta'] = 521; t['rho'] = 549; t['sigma'] = 603; t['tau'] = 439; t['upsilon'] = 576; t['omega1'] = 713; t['omega'] = 686; t['xi'] = 493; t['psi'] = 686; t['zeta'] = 494; t['braceleft'] = 480; t['bar'] = 200; t['braceright'] = 480; t['similar'] = 549; t['Euro'] = 750; t['Upsilon1'] = 620; t['minute'] = 247; t['lessequal'] = 549; t['fraction'] = 167; t['infinity'] = 713; t['florin'] = 500; t['club'] = 753; t['diamond'] = 753; t['heart'] = 753; t['spade'] = 753; t['arrowboth'] = 1042; t['arrowleft'] = 987; t['arrowup'] = 603; t['arrowright'] = 987; t['arrowdown'] = 603; t['degree'] = 400; t['plusminus'] = 549; t['second'] = 411; t['greaterequal'] = 549; t['multiply'] = 549; t['proportional'] = 713; t['partialdiff'] = 494; t['bullet'] = 460; t['divide'] = 549; t['notequal'] = 549; t['equivalence'] = 549; t['approxequal'] = 549; t['ellipsis'] = 1000; t['arrowvertex'] = 603; t['arrowhorizex'] = 1000; t['carriagereturn'] = 658; t['aleph'] = 823; t['Ifraktur'] = 686; t['Rfraktur'] = 795; t['weierstrass'] = 987; t['circlemultiply'] = 768; t['circleplus'] = 768; t['emptyset'] = 823; t['intersection'] = 768; t['union'] = 768; t['propersuperset'] = 713; t['reflexsuperset'] = 713; t['notsubset'] = 713; t['propersubset'] = 713; t['reflexsubset'] = 713; t['element'] = 713; t['notelement'] = 713; t['angle'] = 768; t['gradient'] = 713; t['registerserif'] = 790; t['copyrightserif'] = 790; t['trademarkserif'] = 890; t['product'] = 823; t['radical'] = 549; t['dotmath'] = 250; t['logicalnot'] = 713; t['logicaland'] = 603; t['logicalor'] = 603; t['arrowdblboth'] = 1042; t['arrowdblleft'] = 987; t['arrowdblup'] = 603; t['arrowdblright'] = 987; t['arrowdbldown'] = 603; t['lozenge'] = 494; t['angleleft'] = 329; t['registersans'] = 790; t['copyrightsans'] = 790; t['trademarksans'] = 786; t['summation'] = 713; t['parenlefttp'] = 384; t['parenleftex'] = 384; t['parenleftbt'] = 384; t['bracketlefttp'] = 384; t['bracketleftex'] = 384; t['bracketleftbt'] = 384; t['bracelefttp'] = 494; t['braceleftmid'] = 494; t['braceleftbt'] = 494; t['braceex'] = 494; t['angleright'] = 329; t['integral'] = 274; t['integraltp'] = 686; t['integralex'] = 686; t['integralbt'] = 686; t['parenrighttp'] = 384; t['parenrightex'] = 384; t['parenrightbt'] = 384; t['bracketrighttp'] = 384; t['bracketrightex'] = 384; t['bracketrightbt'] = 384; t['bracerighttp'] = 494; t['bracerightmid'] = 494; t['bracerightbt'] = 494; t['apple'] = 790; }); t['Times-Roman'] = getLookupTableFactory(function (t) { t['space'] = 250; t['exclam'] = 333; t['quotedbl'] = 408; t['numbersign'] = 500; t['dollar'] = 500; t['percent'] = 833; t['ampersand'] = 778; t['quoteright'] = 333; t['parenleft'] = 333; t['parenright'] = 333; t['asterisk'] = 500; t['plus'] = 564; t['comma'] = 250; t['hyphen'] = 333; t['period'] = 250; t['slash'] = 278; t['zero'] = 500; t['one'] = 500; t['two'] = 500; t['three'] = 500; t['four'] = 500; t['five'] = 500; t['six'] = 500; t['seven'] = 500; t['eight'] = 500; t['nine'] = 500; t['colon'] = 278; t['semicolon'] = 278; t['less'] = 564; t['equal'] = 564; t['greater'] = 564; t['question'] = 444; t['at'] = 921; t['A'] = 722; t['B'] = 667; t['C'] = 667; t['D'] = 722; t['E'] = 611; t['F'] = 556; t['G'] = 722; t['H'] = 722; t['I'] = 333; t['J'] = 389; t['K'] = 722; t['L'] = 611; t['M'] = 889; t['N'] = 722; t['O'] = 722; t['P'] = 556; t['Q'] = 722; t['R'] = 667; t['S'] = 556; t['T'] = 611; t['U'] = 722; t['V'] = 722; t['W'] = 944; t['X'] = 722; t['Y'] = 722; t['Z'] = 611; t['bracketleft'] = 333; t['backslash'] = 278; t['bracketright'] = 333; t['asciicircum'] = 469; t['underscore'] = 500; t['quoteleft'] = 333; t['a'] = 444; t['b'] = 500; t['c'] = 444; t['d'] = 500; t['e'] = 444; t['f'] = 333; t['g'] = 500; t['h'] = 500; t['i'] = 278; t['j'] = 278; t['k'] = 500; t['l'] = 278; t['m'] = 778; t['n'] = 500; t['o'] = 500; t['p'] = 500; t['q'] = 500; t['r'] = 333; t['s'] = 389; t['t'] = 278; t['u'] = 500; t['v'] = 500; t['w'] = 722; t['x'] = 500; t['y'] = 500; t['z'] = 444; t['braceleft'] = 480; t['bar'] = 200; t['braceright'] = 480; t['asciitilde'] = 541; t['exclamdown'] = 333; t['cent'] = 500; t['sterling'] = 500; t['fraction'] = 167; t['yen'] = 500; t['florin'] = 500; t['section'] = 500; t['currency'] = 500; t['quotesingle'] = 180; t['quotedblleft'] = 444; t['guillemotleft'] = 500; t['guilsinglleft'] = 333; t['guilsinglright'] = 333; t['fi'] = 556; t['fl'] = 556; t['endash'] = 500; t['dagger'] = 500; t['daggerdbl'] = 500; t['periodcentered'] = 250; t['paragraph'] = 453; t['bullet'] = 350; t['quotesinglbase'] = 333; t['quotedblbase'] = 444; t['quotedblright'] = 444; t['guillemotright'] = 500; t['ellipsis'] = 1000; t['perthousand'] = 1000; t['questiondown'] = 444; t['grave'] = 333; t['acute'] = 333; t['circumflex'] = 333; t['tilde'] = 333; t['macron'] = 333; t['breve'] = 333; t['dotaccent'] = 333; t['dieresis'] = 333; t['ring'] = 333; t['cedilla'] = 333; t['hungarumlaut'] = 333; t['ogonek'] = 333; t['caron'] = 333; t['emdash'] = 1000; t['AE'] = 889; t['ordfeminine'] = 276; t['Lslash'] = 611; t['Oslash'] = 722; t['OE'] = 889; t['ordmasculine'] = 310; t['ae'] = 667; t['dotlessi'] = 278; t['lslash'] = 278; t['oslash'] = 500; t['oe'] = 722; t['germandbls'] = 500; t['Idieresis'] = 333; t['eacute'] = 444; t['abreve'] = 444; t['uhungarumlaut'] = 500; t['ecaron'] = 444; t['Ydieresis'] = 722; t['divide'] = 564; t['Yacute'] = 722; t['Acircumflex'] = 722; t['aacute'] = 444; t['Ucircumflex'] = 722; t['yacute'] = 500; t['scommaaccent'] = 389; t['ecircumflex'] = 444; t['Uring'] = 722; t['Udieresis'] = 722; t['aogonek'] = 444; t['Uacute'] = 722; t['uogonek'] = 500; t['Edieresis'] = 611; t['Dcroat'] = 722; t['commaaccent'] = 250; t['copyright'] = 760; t['Emacron'] = 611; t['ccaron'] = 444; t['aring'] = 444; t['Ncommaaccent'] = 722; t['lacute'] = 278; t['agrave'] = 444; t['Tcommaaccent'] = 611; t['Cacute'] = 667; t['atilde'] = 444; t['Edotaccent'] = 611; t['scaron'] = 389; t['scedilla'] = 389; t['iacute'] = 278; t['lozenge'] = 471; t['Rcaron'] = 667; t['Gcommaaccent'] = 722; t['ucircumflex'] = 500; t['acircumflex'] = 444; t['Amacron'] = 722; t['rcaron'] = 333; t['ccedilla'] = 444; t['Zdotaccent'] = 611; t['Thorn'] = 556; t['Omacron'] = 722; t['Racute'] = 667; t['Sacute'] = 556; t['dcaron'] = 588; t['Umacron'] = 722; t['uring'] = 500; t['threesuperior'] = 300; t['Ograve'] = 722; t['Agrave'] = 722; t['Abreve'] = 722; t['multiply'] = 564; t['uacute'] = 500; t['Tcaron'] = 611; t['partialdiff'] = 476; t['ydieresis'] = 500; t['Nacute'] = 722; t['icircumflex'] = 278; t['Ecircumflex'] = 611; t['adieresis'] = 444; t['edieresis'] = 444; t['cacute'] = 444; t['nacute'] = 500; t['umacron'] = 500; t['Ncaron'] = 722; t['Iacute'] = 333; t['plusminus'] = 564; t['brokenbar'] = 200; t['registered'] = 760; t['Gbreve'] = 722; t['Idotaccent'] = 333; t['summation'] = 600; t['Egrave'] = 611; t['racute'] = 333; t['omacron'] = 500; t['Zacute'] = 611; t['Zcaron'] = 611; t['greaterequal'] = 549; t['Eth'] = 722; t['Ccedilla'] = 667; t['lcommaaccent'] = 278; t['tcaron'] = 326; t['eogonek'] = 444; t['Uogonek'] = 722; t['Aacute'] = 722; t['Adieresis'] = 722; t['egrave'] = 444; t['zacute'] = 444; t['iogonek'] = 278; t['Oacute'] = 722; t['oacute'] = 500; t['amacron'] = 444; t['sacute'] = 389; t['idieresis'] = 278; t['Ocircumflex'] = 722; t['Ugrave'] = 722; t['Delta'] = 612; t['thorn'] = 500; t['twosuperior'] = 300; t['Odieresis'] = 722; t['mu'] = 500; t['igrave'] = 278; t['ohungarumlaut'] = 500; t['Eogonek'] = 611; t['dcroat'] = 500; t['threequarters'] = 750; t['Scedilla'] = 556; t['lcaron'] = 344; t['Kcommaaccent'] = 722; t['Lacute'] = 611; t['trademark'] = 980; t['edotaccent'] = 444; t['Igrave'] = 333; t['Imacron'] = 333; t['Lcaron'] = 611; t['onehalf'] = 750; t['lessequal'] = 549; t['ocircumflex'] = 500; t['ntilde'] = 500; t['Uhungarumlaut'] = 722; t['Eacute'] = 611; t['emacron'] = 444; t['gbreve'] = 500; t['onequarter'] = 750; t['Scaron'] = 556; t['Scommaaccent'] = 556; t['Ohungarumlaut'] = 722; t['degree'] = 400; t['ograve'] = 500; t['Ccaron'] = 667; t['ugrave'] = 500; t['radical'] = 453; t['Dcaron'] = 722; t['rcommaaccent'] = 333; t['Ntilde'] = 722; t['otilde'] = 500; t['Rcommaaccent'] = 667; t['Lcommaaccent'] = 611; t['Atilde'] = 722; t['Aogonek'] = 722; t['Aring'] = 722; t['Otilde'] = 722; t['zdotaccent'] = 444; t['Ecaron'] = 611; t['Iogonek'] = 333; t['kcommaaccent'] = 500; t['minus'] = 564; t['Icircumflex'] = 333; t['ncaron'] = 500; t['tcommaaccent'] = 278; t['logicalnot'] = 564; t['odieresis'] = 500; t['udieresis'] = 500; t['notequal'] = 549; t['gcommaaccent'] = 500; t['eth'] = 500; t['zcaron'] = 444; t['ncommaaccent'] = 500; t['onesuperior'] = 300; t['imacron'] = 278; t['Euro'] = 500; }); t['Times-Bold'] = getLookupTableFactory(function (t) { t['space'] = 250; t['exclam'] = 333; t['quotedbl'] = 555; t['numbersign'] = 500; t['dollar'] = 500; t['percent'] = 1000; t['ampersand'] = 833; t['quoteright'] = 333; t['parenleft'] = 333; t['parenright'] = 333; t['asterisk'] = 500; t['plus'] = 570; t['comma'] = 250; t['hyphen'] = 333; t['period'] = 250; t['slash'] = 278; t['zero'] = 500; t['one'] = 500; t['two'] = 500; t['three'] = 500; t['four'] = 500; t['five'] = 500; t['six'] = 500; t['seven'] = 500; t['eight'] = 500; t['nine'] = 500; t['colon'] = 333; t['semicolon'] = 333; t['less'] = 570; t['equal'] = 570; t['greater'] = 570; t['question'] = 500; t['at'] = 930; t['A'] = 722; t['B'] = 667; t['C'] = 722; t['D'] = 722; t['E'] = 667; t['F'] = 611; t['G'] = 778; t['H'] = 778; t['I'] = 389; t['J'] = 500; t['K'] = 778; t['L'] = 667; t['M'] = 944; t['N'] = 722; t['O'] = 778; t['P'] = 611; t['Q'] = 778; t['R'] = 722; t['S'] = 556; t['T'] = 667; t['U'] = 722; t['V'] = 722; t['W'] = 1000; t['X'] = 722; t['Y'] = 722; t['Z'] = 667; t['bracketleft'] = 333; t['backslash'] = 278; t['bracketright'] = 333; t['asciicircum'] = 581; t['underscore'] = 500; t['quoteleft'] = 333; t['a'] = 500; t['b'] = 556; t['c'] = 444; t['d'] = 556; t['e'] = 444; t['f'] = 333; t['g'] = 500; t['h'] = 556; t['i'] = 278; t['j'] = 333; t['k'] = 556; t['l'] = 278; t['m'] = 833; t['n'] = 556; t['o'] = 500; t['p'] = 556; t['q'] = 556; t['r'] = 444; t['s'] = 389; t['t'] = 333; t['u'] = 556; t['v'] = 500; t['w'] = 722; t['x'] = 500; t['y'] = 500; t['z'] = 444; t['braceleft'] = 394; t['bar'] = 220; t['braceright'] = 394; t['asciitilde'] = 520; t['exclamdown'] = 333; t['cent'] = 500; t['sterling'] = 500; t['fraction'] = 167; t['yen'] = 500; t['florin'] = 500; t['section'] = 500; t['currency'] = 500; t['quotesingle'] = 278; t['quotedblleft'] = 500; t['guillemotleft'] = 500; t['guilsinglleft'] = 333; t['guilsinglright'] = 333; t['fi'] = 556; t['fl'] = 556; t['endash'] = 500; t['dagger'] = 500; t['daggerdbl'] = 500; t['periodcentered'] = 250; t['paragraph'] = 540; t['bullet'] = 350; t['quotesinglbase'] = 333; t['quotedblbase'] = 500; t['quotedblright'] = 500; t['guillemotright'] = 500; t['ellipsis'] = 1000; t['perthousand'] = 1000; t['questiondown'] = 500; t['grave'] = 333; t['acute'] = 333; t['circumflex'] = 333; t['tilde'] = 333; t['macron'] = 333; t['breve'] = 333; t['dotaccent'] = 333; t['dieresis'] = 333; t['ring'] = 333; t['cedilla'] = 333; t['hungarumlaut'] = 333; t['ogonek'] = 333; t['caron'] = 333; t['emdash'] = 1000; t['AE'] = 1000; t['ordfeminine'] = 300; t['Lslash'] = 667; t['Oslash'] = 778; t['OE'] = 1000; t['ordmasculine'] = 330; t['ae'] = 722; t['dotlessi'] = 278; t['lslash'] = 278; t['oslash'] = 500; t['oe'] = 722; t['germandbls'] = 556; t['Idieresis'] = 389; t['eacute'] = 444; t['abreve'] = 500; t['uhungarumlaut'] = 556; t['ecaron'] = 444; t['Ydieresis'] = 722; t['divide'] = 570; t['Yacute'] = 722; t['Acircumflex'] = 722; t['aacute'] = 500; t['Ucircumflex'] = 722; t['yacute'] = 500; t['scommaaccent'] = 389; t['ecircumflex'] = 444; t['Uring'] = 722; t['Udieresis'] = 722; t['aogonek'] = 500; t['Uacute'] = 722; t['uogonek'] = 556; t['Edieresis'] = 667; t['Dcroat'] = 722; t['commaaccent'] = 250; t['copyright'] = 747; t['Emacron'] = 667; t['ccaron'] = 444; t['aring'] = 500; t['Ncommaaccent'] = 722; t['lacute'] = 278; t['agrave'] = 500; t['Tcommaaccent'] = 667; t['Cacute'] = 722; t['atilde'] = 500; t['Edotaccent'] = 667; t['scaron'] = 389; t['scedilla'] = 389; t['iacute'] = 278; t['lozenge'] = 494; t['Rcaron'] = 722; t['Gcommaaccent'] = 778; t['ucircumflex'] = 556; t['acircumflex'] = 500; t['Amacron'] = 722; t['rcaron'] = 444; t['ccedilla'] = 444; t['Zdotaccent'] = 667; t['Thorn'] = 611; t['Omacron'] = 778; t['Racute'] = 722; t['Sacute'] = 556; t['dcaron'] = 672; t['Umacron'] = 722; t['uring'] = 556; t['threesuperior'] = 300; t['Ograve'] = 778; t['Agrave'] = 722; t['Abreve'] = 722; t['multiply'] = 570; t['uacute'] = 556; t['Tcaron'] = 667; t['partialdiff'] = 494; t['ydieresis'] = 500; t['Nacute'] = 722; t['icircumflex'] = 278; t['Ecircumflex'] = 667; t['adieresis'] = 500; t['edieresis'] = 444; t['cacute'] = 444; t['nacute'] = 556; t['umacron'] = 556; t['Ncaron'] = 722; t['Iacute'] = 389; t['plusminus'] = 570; t['brokenbar'] = 220; t['registered'] = 747; t['Gbreve'] = 778; t['Idotaccent'] = 389; t['summation'] = 600; t['Egrave'] = 667; t['racute'] = 444; t['omacron'] = 500; t['Zacute'] = 667; t['Zcaron'] = 667; t['greaterequal'] = 549; t['Eth'] = 722; t['Ccedilla'] = 722; t['lcommaaccent'] = 278; t['tcaron'] = 416; t['eogonek'] = 444; t['Uogonek'] = 722; t['Aacute'] = 722; t['Adieresis'] = 722; t['egrave'] = 444; t['zacute'] = 444; t['iogonek'] = 278; t['Oacute'] = 778; t['oacute'] = 500; t['amacron'] = 500; t['sacute'] = 389; t['idieresis'] = 278; t['Ocircumflex'] = 778; t['Ugrave'] = 722; t['Delta'] = 612; t['thorn'] = 556; t['twosuperior'] = 300; t['Odieresis'] = 778; t['mu'] = 556; t['igrave'] = 278; t['ohungarumlaut'] = 500; t['Eogonek'] = 667; t['dcroat'] = 556; t['threequarters'] = 750; t['Scedilla'] = 556; t['lcaron'] = 394; t['Kcommaaccent'] = 778; t['Lacute'] = 667; t['trademark'] = 1000; t['edotaccent'] = 444; t['Igrave'] = 389; t['Imacron'] = 389; t['Lcaron'] = 667; t['onehalf'] = 750; t['lessequal'] = 549; t['ocircumflex'] = 500; t['ntilde'] = 556; t['Uhungarumlaut'] = 722; t['Eacute'] = 667; t['emacron'] = 444; t['gbreve'] = 500; t['onequarter'] = 750; t['Scaron'] = 556; t['Scommaaccent'] = 556; t['Ohungarumlaut'] = 778; t['degree'] = 400; t['ograve'] = 500; t['Ccaron'] = 722; t['ugrave'] = 556; t['radical'] = 549; t['Dcaron'] = 722; t['rcommaaccent'] = 444; t['Ntilde'] = 722; t['otilde'] = 500; t['Rcommaaccent'] = 722; t['Lcommaaccent'] = 667; t['Atilde'] = 722; t['Aogonek'] = 722; t['Aring'] = 722; t['Otilde'] = 778; t['zdotaccent'] = 444; t['Ecaron'] = 667; t['Iogonek'] = 389; t['kcommaaccent'] = 556; t['minus'] = 570; t['Icircumflex'] = 389; t['ncaron'] = 556; t['tcommaaccent'] = 333; t['logicalnot'] = 570; t['odieresis'] = 500; t['udieresis'] = 556; t['notequal'] = 549; t['gcommaaccent'] = 500; t['eth'] = 500; t['zcaron'] = 444; t['ncommaaccent'] = 556; t['onesuperior'] = 300; t['imacron'] = 278; t['Euro'] = 500; }); t['Times-BoldItalic'] = getLookupTableFactory(function (t) { t['space'] = 250; t['exclam'] = 389; t['quotedbl'] = 555; t['numbersign'] = 500; t['dollar'] = 500; t['percent'] = 833; t['ampersand'] = 778; t['quoteright'] = 333; t['parenleft'] = 333; t['parenright'] = 333; t['asterisk'] = 500; t['plus'] = 570; t['comma'] = 250; t['hyphen'] = 333; t['period'] = 250; t['slash'] = 278; t['zero'] = 500; t['one'] = 500; t['two'] = 500; t['three'] = 500; t['four'] = 500; t['five'] = 500; t['six'] = 500; t['seven'] = 500; t['eight'] = 500; t['nine'] = 500; t['colon'] = 333; t['semicolon'] = 333; t['less'] = 570; t['equal'] = 570; t['greater'] = 570; t['question'] = 500; t['at'] = 832; t['A'] = 667; t['B'] = 667; t['C'] = 667; t['D'] = 722; t['E'] = 667; t['F'] = 667; t['G'] = 722; t['H'] = 778; t['I'] = 389; t['J'] = 500; t['K'] = 667; t['L'] = 611; t['M'] = 889; t['N'] = 722; t['O'] = 722; t['P'] = 611; t['Q'] = 722; t['R'] = 667; t['S'] = 556; t['T'] = 611; t['U'] = 722; t['V'] = 667; t['W'] = 889; t['X'] = 667; t['Y'] = 611; t['Z'] = 611; t['bracketleft'] = 333; t['backslash'] = 278; t['bracketright'] = 333; t['asciicircum'] = 570; t['underscore'] = 500; t['quoteleft'] = 333; t['a'] = 500; t['b'] = 500; t['c'] = 444; t['d'] = 500; t['e'] = 444; t['f'] = 333; t['g'] = 500; t['h'] = 556; t['i'] = 278; t['j'] = 278; t['k'] = 500; t['l'] = 278; t['m'] = 778; t['n'] = 556; t['o'] = 500; t['p'] = 500; t['q'] = 500; t['r'] = 389; t['s'] = 389; t['t'] = 278; t['u'] = 556; t['v'] = 444; t['w'] = 667; t['x'] = 500; t['y'] = 444; t['z'] = 389; t['braceleft'] = 348; t['bar'] = 220; t['braceright'] = 348; t['asciitilde'] = 570; t['exclamdown'] = 389; t['cent'] = 500; t['sterling'] = 500; t['fraction'] = 167; t['yen'] = 500; t['florin'] = 500; t['section'] = 500; t['currency'] = 500; t['quotesingle'] = 278; t['quotedblleft'] = 500; t['guillemotleft'] = 500; t['guilsinglleft'] = 333; t['guilsinglright'] = 333; t['fi'] = 556; t['fl'] = 556; t['endash'] = 500; t['dagger'] = 500; t['daggerdbl'] = 500; t['periodcentered'] = 250; t['paragraph'] = 500; t['bullet'] = 350; t['quotesinglbase'] = 333; t['quotedblbase'] = 500; t['quotedblright'] = 500; t['guillemotright'] = 500; t['ellipsis'] = 1000; t['perthousand'] = 1000; t['questiondown'] = 500; t['grave'] = 333; t['acute'] = 333; t['circumflex'] = 333; t['tilde'] = 333; t['macron'] = 333; t['breve'] = 333; t['dotaccent'] = 333; t['dieresis'] = 333; t['ring'] = 333; t['cedilla'] = 333; t['hungarumlaut'] = 333; t['ogonek'] = 333; t['caron'] = 333; t['emdash'] = 1000; t['AE'] = 944; t['ordfeminine'] = 266; t['Lslash'] = 611; t['Oslash'] = 722; t['OE'] = 944; t['ordmasculine'] = 300; t['ae'] = 722; t['dotlessi'] = 278; t['lslash'] = 278; t['oslash'] = 500; t['oe'] = 722; t['germandbls'] = 500; t['Idieresis'] = 389; t['eacute'] = 444; t['abreve'] = 500; t['uhungarumlaut'] = 556; t['ecaron'] = 444; t['Ydieresis'] = 611; t['divide'] = 570; t['Yacute'] = 611; t['Acircumflex'] = 667; t['aacute'] = 500; t['Ucircumflex'] = 722; t['yacute'] = 444; t['scommaaccent'] = 389; t['ecircumflex'] = 444; t['Uring'] = 722; t['Udieresis'] = 722; t['aogonek'] = 500; t['Uacute'] = 722; t['uogonek'] = 556; t['Edieresis'] = 667; t['Dcroat'] = 722; t['commaaccent'] = 250; t['copyright'] = 747; t['Emacron'] = 667; t['ccaron'] = 444; t['aring'] = 500; t['Ncommaaccent'] = 722; t['lacute'] = 278; t['agrave'] = 500; t['Tcommaaccent'] = 611; t['Cacute'] = 667; t['atilde'] = 500; t['Edotaccent'] = 667; t['scaron'] = 389; t['scedilla'] = 389; t['iacute'] = 278; t['lozenge'] = 494; t['Rcaron'] = 667; t['Gcommaaccent'] = 722; t['ucircumflex'] = 556; t['acircumflex'] = 500; t['Amacron'] = 667; t['rcaron'] = 389; t['ccedilla'] = 444; t['Zdotaccent'] = 611; t['Thorn'] = 611; t['Omacron'] = 722; t['Racute'] = 667; t['Sacute'] = 556; t['dcaron'] = 608; t['Umacron'] = 722; t['uring'] = 556; t['threesuperior'] = 300; t['Ograve'] = 722; t['Agrave'] = 667; t['Abreve'] = 667; t['multiply'] = 570; t['uacute'] = 556; t['Tcaron'] = 611; t['partialdiff'] = 494; t['ydieresis'] = 444; t['Nacute'] = 722; t['icircumflex'] = 278; t['Ecircumflex'] = 667; t['adieresis'] = 500; t['edieresis'] = 444; t['cacute'] = 444; t['nacute'] = 556; t['umacron'] = 556; t['Ncaron'] = 722; t['Iacute'] = 389; t['plusminus'] = 570; t['brokenbar'] = 220; t['registered'] = 747; t['Gbreve'] = 722; t['Idotaccent'] = 389; t['summation'] = 600; t['Egrave'] = 667; t['racute'] = 389; t['omacron'] = 500; t['Zacute'] = 611; t['Zcaron'] = 611; t['greaterequal'] = 549; t['Eth'] = 722; t['Ccedilla'] = 667; t['lcommaaccent'] = 278; t['tcaron'] = 366; t['eogonek'] = 444; t['Uogonek'] = 722; t['Aacute'] = 667; t['Adieresis'] = 667; t['egrave'] = 444; t['zacute'] = 389; t['iogonek'] = 278; t['Oacute'] = 722; t['oacute'] = 500; t['amacron'] = 500; t['sacute'] = 389; t['idieresis'] = 278; t['Ocircumflex'] = 722; t['Ugrave'] = 722; t['Delta'] = 612; t['thorn'] = 500; t['twosuperior'] = 300; t['Odieresis'] = 722; t['mu'] = 576; t['igrave'] = 278; t['ohungarumlaut'] = 500; t['Eogonek'] = 667; t['dcroat'] = 500; t['threequarters'] = 750; t['Scedilla'] = 556; t['lcaron'] = 382; t['Kcommaaccent'] = 667; t['Lacute'] = 611; t['trademark'] = 1000; t['edotaccent'] = 444; t['Igrave'] = 389; t['Imacron'] = 389; t['Lcaron'] = 611; t['onehalf'] = 750; t['lessequal'] = 549; t['ocircumflex'] = 500; t['ntilde'] = 556; t['Uhungarumlaut'] = 722; t['Eacute'] = 667; t['emacron'] = 444; t['gbreve'] = 500; t['onequarter'] = 750; t['Scaron'] = 556; t['Scommaaccent'] = 556; t['Ohungarumlaut'] = 722; t['degree'] = 400; t['ograve'] = 500; t['Ccaron'] = 667; t['ugrave'] = 556; t['radical'] = 549; t['Dcaron'] = 722; t['rcommaaccent'] = 389; t['Ntilde'] = 722; t['otilde'] = 500; t['Rcommaaccent'] = 667; t['Lcommaaccent'] = 611; t['Atilde'] = 667; t['Aogonek'] = 667; t['Aring'] = 667; t['Otilde'] = 722; t['zdotaccent'] = 389; t['Ecaron'] = 667; t['Iogonek'] = 389; t['kcommaaccent'] = 500; t['minus'] = 606; t['Icircumflex'] = 389; t['ncaron'] = 556; t['tcommaaccent'] = 278; t['logicalnot'] = 606; t['odieresis'] = 500; t['udieresis'] = 556; t['notequal'] = 549; t['gcommaaccent'] = 500; t['eth'] = 500; t['zcaron'] = 389; t['ncommaaccent'] = 556; t['onesuperior'] = 300; t['imacron'] = 278; t['Euro'] = 500; }); t['Times-Italic'] = getLookupTableFactory(function (t) { t['space'] = 250; t['exclam'] = 333; t['quotedbl'] = 420; t['numbersign'] = 500; t['dollar'] = 500; t['percent'] = 833; t['ampersand'] = 778; t['quoteright'] = 333; t['parenleft'] = 333; t['parenright'] = 333; t['asterisk'] = 500; t['plus'] = 675; t['comma'] = 250; t['hyphen'] = 333; t['period'] = 250; t['slash'] = 278; t['zero'] = 500; t['one'] = 500; t['two'] = 500; t['three'] = 500; t['four'] = 500; t['five'] = 500; t['six'] = 500; t['seven'] = 500; t['eight'] = 500; t['nine'] = 500; t['colon'] = 333; t['semicolon'] = 333; t['less'] = 675; t['equal'] = 675; t['greater'] = 675; t['question'] = 500; t['at'] = 920; t['A'] = 611; t['B'] = 611; t['C'] = 667; t['D'] = 722; t['E'] = 611; t['F'] = 611; t['G'] = 722; t['H'] = 722; t['I'] = 333; t['J'] = 444; t['K'] = 667; t['L'] = 556; t['M'] = 833; t['N'] = 667; t['O'] = 722; t['P'] = 611; t['Q'] = 722; t['R'] = 611; t['S'] = 500; t['T'] = 556; t['U'] = 722; t['V'] = 611; t['W'] = 833; t['X'] = 611; t['Y'] = 556; t['Z'] = 556; t['bracketleft'] = 389; t['backslash'] = 278; t['bracketright'] = 389; t['asciicircum'] = 422; t['underscore'] = 500; t['quoteleft'] = 333; t['a'] = 500; t['b'] = 500; t['c'] = 444; t['d'] = 500; t['e'] = 444; t['f'] = 278; t['g'] = 500; t['h'] = 500; t['i'] = 278; t['j'] = 278; t['k'] = 444; t['l'] = 278; t['m'] = 722; t['n'] = 500; t['o'] = 500; t['p'] = 500; t['q'] = 500; t['r'] = 389; t['s'] = 389; t['t'] = 278; t['u'] = 500; t['v'] = 444; t['w'] = 667; t['x'] = 444; t['y'] = 444; t['z'] = 389; t['braceleft'] = 400; t['bar'] = 275; t['braceright'] = 400; t['asciitilde'] = 541; t['exclamdown'] = 389; t['cent'] = 500; t['sterling'] = 500; t['fraction'] = 167; t['yen'] = 500; t['florin'] = 500; t['section'] = 500; t['currency'] = 500; t['quotesingle'] = 214; t['quotedblleft'] = 556; t['guillemotleft'] = 500; t['guilsinglleft'] = 333; t['guilsinglright'] = 333; t['fi'] = 500; t['fl'] = 500; t['endash'] = 500; t['dagger'] = 500; t['daggerdbl'] = 500; t['periodcentered'] = 250; t['paragraph'] = 523; t['bullet'] = 350; t['quotesinglbase'] = 333; t['quotedblbase'] = 556; t['quotedblright'] = 556; t['guillemotright'] = 500; t['ellipsis'] = 889; t['perthousand'] = 1000; t['questiondown'] = 500; t['grave'] = 333; t['acute'] = 333; t['circumflex'] = 333; t['tilde'] = 333; t['macron'] = 333; t['breve'] = 333; t['dotaccent'] = 333; t['dieresis'] = 333; t['ring'] = 333; t['cedilla'] = 333; t['hungarumlaut'] = 333; t['ogonek'] = 333; t['caron'] = 333; t['emdash'] = 889; t['AE'] = 889; t['ordfeminine'] = 276; t['Lslash'] = 556; t['Oslash'] = 722; t['OE'] = 944; t['ordmasculine'] = 310; t['ae'] = 667; t['dotlessi'] = 278; t['lslash'] = 278; t['oslash'] = 500; t['oe'] = 667; t['germandbls'] = 500; t['Idieresis'] = 333; t['eacute'] = 444; t['abreve'] = 500; t['uhungarumlaut'] = 500; t['ecaron'] = 444; t['Ydieresis'] = 556; t['divide'] = 675; t['Yacute'] = 556; t['Acircumflex'] = 611; t['aacute'] = 500; t['Ucircumflex'] = 722; t['yacute'] = 444; t['scommaaccent'] = 389; t['ecircumflex'] = 444; t['Uring'] = 722; t['Udieresis'] = 722; t['aogonek'] = 500; t['Uacute'] = 722; t['uogonek'] = 500; t['Edieresis'] = 611; t['Dcroat'] = 722; t['commaaccent'] = 250; t['copyright'] = 760; t['Emacron'] = 611; t['ccaron'] = 444; t['aring'] = 500; t['Ncommaaccent'] = 667; t['lacute'] = 278; t['agrave'] = 500; t['Tcommaaccent'] = 556; t['Cacute'] = 667; t['atilde'] = 500; t['Edotaccent'] = 611; t['scaron'] = 389; t['scedilla'] = 389; t['iacute'] = 278; t['lozenge'] = 471; t['Rcaron'] = 611; t['Gcommaaccent'] = 722; t['ucircumflex'] = 500; t['acircumflex'] = 500; t['Amacron'] = 611; t['rcaron'] = 389; t['ccedilla'] = 444; t['Zdotaccent'] = 556; t['Thorn'] = 611; t['Omacron'] = 722; t['Racute'] = 611; t['Sacute'] = 500; t['dcaron'] = 544; t['Umacron'] = 722; t['uring'] = 500; t['threesuperior'] = 300; t['Ograve'] = 722; t['Agrave'] = 611; t['Abreve'] = 611; t['multiply'] = 675; t['uacute'] = 500; t['Tcaron'] = 556; t['partialdiff'] = 476; t['ydieresis'] = 444; t['Nacute'] = 667; t['icircumflex'] = 278; t['Ecircumflex'] = 611; t['adieresis'] = 500; t['edieresis'] = 444; t['cacute'] = 444; t['nacute'] = 500; t['umacron'] = 500; t['Ncaron'] = 667; t['Iacute'] = 333; t['plusminus'] = 675; t['brokenbar'] = 275; t['registered'] = 760; t['Gbreve'] = 722; t['Idotaccent'] = 333; t['summation'] = 600; t['Egrave'] = 611; t['racute'] = 389; t['omacron'] = 500; t['Zacute'] = 556; t['Zcaron'] = 556; t['greaterequal'] = 549; t['Eth'] = 722; t['Ccedilla'] = 667; t['lcommaaccent'] = 278; t['tcaron'] = 300; t['eogonek'] = 444; t['Uogonek'] = 722; t['Aacute'] = 611; t['Adieresis'] = 611; t['egrave'] = 444; t['zacute'] = 389; t['iogonek'] = 278; t['Oacute'] = 722; t['oacute'] = 500; t['amacron'] = 500; t['sacute'] = 389; t['idieresis'] = 278; t['Ocircumflex'] = 722; t['Ugrave'] = 722; t['Delta'] = 612; t['thorn'] = 500; t['twosuperior'] = 300; t['Odieresis'] = 722; t['mu'] = 500; t['igrave'] = 278; t['ohungarumlaut'] = 500; t['Eogonek'] = 611; t['dcroat'] = 500; t['threequarters'] = 750; t['Scedilla'] = 500; t['lcaron'] = 300; t['Kcommaaccent'] = 667; t['Lacute'] = 556; t['trademark'] = 980; t['edotaccent'] = 444; t['Igrave'] = 333; t['Imacron'] = 333; t['Lcaron'] = 611; t['onehalf'] = 750; t['lessequal'] = 549; t['ocircumflex'] = 500; t['ntilde'] = 500; t['Uhungarumlaut'] = 722; t['Eacute'] = 611; t['emacron'] = 444; t['gbreve'] = 500; t['onequarter'] = 750; t['Scaron'] = 500; t['Scommaaccent'] = 500; t['Ohungarumlaut'] = 722; t['degree'] = 400; t['ograve'] = 500; t['Ccaron'] = 667; t['ugrave'] = 500; t['radical'] = 453; t['Dcaron'] = 722; t['rcommaaccent'] = 389; t['Ntilde'] = 667; t['otilde'] = 500; t['Rcommaaccent'] = 611; t['Lcommaaccent'] = 556; t['Atilde'] = 611; t['Aogonek'] = 611; t['Aring'] = 611; t['Otilde'] = 722; t['zdotaccent'] = 389; t['Ecaron'] = 611; t['Iogonek'] = 333; t['kcommaaccent'] = 444; t['minus'] = 675; t['Icircumflex'] = 333; t['ncaron'] = 500; t['tcommaaccent'] = 278; t['logicalnot'] = 675; t['odieresis'] = 500; t['udieresis'] = 500; t['notequal'] = 549; t['gcommaaccent'] = 500; t['eth'] = 500; t['zcaron'] = 389; t['ncommaaccent'] = 500; t['onesuperior'] = 300; t['imacron'] = 278; t['Euro'] = 500; }); t['ZapfDingbats'] = getLookupTableFactory(function (t) { t['space'] = 278; t['a1'] = 974; t['a2'] = 961; t['a202'] = 974; t['a3'] = 980; t['a4'] = 719; t['a5'] = 789; t['a119'] = 790; t['a118'] = 791; t['a117'] = 690; t['a11'] = 960; t['a12'] = 939; t['a13'] = 549; t['a14'] = 855; t['a15'] = 911; t['a16'] = 933; t['a105'] = 911; t['a17'] = 945; t['a18'] = 974; t['a19'] = 755; t['a20'] = 846; t['a21'] = 762; t['a22'] = 761; t['a23'] = 571; t['a24'] = 677; t['a25'] = 763; t['a26'] = 760; t['a27'] = 759; t['a28'] = 754; t['a6'] = 494; t['a7'] = 552; t['a8'] = 537; t['a9'] = 577; t['a10'] = 692; t['a29'] = 786; t['a30'] = 788; t['a31'] = 788; t['a32'] = 790; t['a33'] = 793; t['a34'] = 794; t['a35'] = 816; t['a36'] = 823; t['a37'] = 789; t['a38'] = 841; t['a39'] = 823; t['a40'] = 833; t['a41'] = 816; t['a42'] = 831; t['a43'] = 923; t['a44'] = 744; t['a45'] = 723; t['a46'] = 749; t['a47'] = 790; t['a48'] = 792; t['a49'] = 695; t['a50'] = 776; t['a51'] = 768; t['a52'] = 792; t['a53'] = 759; t['a54'] = 707; t['a55'] = 708; t['a56'] = 682; t['a57'] = 701; t['a58'] = 826; t['a59'] = 815; t['a60'] = 789; t['a61'] = 789; t['a62'] = 707; t['a63'] = 687; t['a64'] = 696; t['a65'] = 689; t['a66'] = 786; t['a67'] = 787; t['a68'] = 713; t['a69'] = 791; t['a70'] = 785; t['a71'] = 791; t['a72'] = 873; t['a73'] = 761; t['a74'] = 762; t['a203'] = 762; t['a75'] = 759; t['a204'] = 759; t['a76'] = 892; t['a77'] = 892; t['a78'] = 788; t['a79'] = 784; t['a81'] = 438; t['a82'] = 138; t['a83'] = 277; t['a84'] = 415; t['a97'] = 392; t['a98'] = 392; t['a99'] = 668; t['a100'] = 668; t['a89'] = 390; t['a90'] = 390; t['a93'] = 317; t['a94'] = 317; t['a91'] = 276; t['a92'] = 276; t['a205'] = 509; t['a85'] = 509; t['a206'] = 410; t['a86'] = 410; t['a87'] = 234; t['a88'] = 234; t['a95'] = 334; t['a96'] = 334; t['a101'] = 732; t['a102'] = 544; t['a103'] = 544; t['a104'] = 910; t['a106'] = 667; t['a107'] = 760; t['a108'] = 760; t['a112'] = 776; t['a111'] = 595; t['a110'] = 694; t['a109'] = 626; t['a120'] = 788; t['a121'] = 788; t['a122'] = 788; t['a123'] = 788; t['a124'] = 788; t['a125'] = 788; t['a126'] = 788; t['a127'] = 788; t['a128'] = 788; t['a129'] = 788; t['a130'] = 788; t['a131'] = 788; t['a132'] = 788; t['a133'] = 788; t['a134'] = 788; t['a135'] = 788; t['a136'] = 788; t['a137'] = 788; t['a138'] = 788; t['a139'] = 788; t['a140'] = 788; t['a141'] = 788; t['a142'] = 788; t['a143'] = 788; t['a144'] = 788; t['a145'] = 788; t['a146'] = 788; t['a147'] = 788; t['a148'] = 788; t['a149'] = 788; t['a150'] = 788; t['a151'] = 788; t['a152'] = 788; t['a153'] = 788; t['a154'] = 788; t['a155'] = 788; t['a156'] = 788; t['a157'] = 788; t['a158'] = 788; t['a159'] = 788; t['a160'] = 894; t['a161'] = 838; t['a163'] = 1016; t['a164'] = 458; t['a196'] = 748; t['a165'] = 924; t['a192'] = 748; t['a166'] = 918; t['a167'] = 927; t['a168'] = 928; t['a169'] = 928; t['a170'] = 834; t['a171'] = 873; t['a172'] = 828; t['a173'] = 924; t['a162'] = 924; t['a174'] = 917; t['a175'] = 930; t['a176'] = 931; t['a177'] = 463; t['a178'] = 883; t['a179'] = 836; t['a193'] = 836; t['a180'] = 867; t['a199'] = 867; t['a181'] = 696; t['a200'] = 696; t['a182'] = 874; t['a201'] = 874; t['a183'] = 760; t['a184'] = 946; t['a197'] = 771; t['a185'] = 865; t['a194'] = 771; t['a198'] = 888; t['a186'] = 967; t['a195'] = 888; t['a187'] = 831; t['a188'] = 873; t['a189'] = 927; t['a190'] = 970; t['a191'] = 918; }); }); exports.getMetrics = getMetrics; })); (function (root, factory) { { factory((root.pdfjsCoreMurmurHash3 = {}), root.pdfjsSharedUtil); } }(this, function (exports, sharedUtil) { var Uint32ArrayView = sharedUtil.Uint32ArrayView; var MurmurHash3_64 = (function MurmurHash3_64Closure (seed) { // Workaround for missing math precison in JS. var MASK_HIGH = 0xffff0000; var MASK_LOW = 0xffff; function MurmurHash3_64 (seed) { var SEED = 0xc3d2e1f0; this.h1 = seed ? seed & 0xffffffff : SEED; this.h2 = seed ? seed & 0xffffffff : SEED; } var alwaysUseUint32ArrayView = false; // old webkits have issues with non-aligned arrays try { new Uint32Array(new Uint8Array(5).buffer, 0, 1); } catch (e) { alwaysUseUint32ArrayView = true; } MurmurHash3_64.prototype = { update: function MurmurHash3_64_update(input) { var useUint32ArrayView = alwaysUseUint32ArrayView; var i; if (typeof input === 'string') { var data = new Uint8Array(input.length * 2); var length = 0; for (i = 0; i < input.length; i++) { var code = input.charCodeAt(i); if (code <= 0xff) { data[length++] = code; } else { data[length++] = code >>> 8; data[length++] = code & 0xff; } } } else if (input instanceof Uint8Array) { data = input; length = data.length; } else if (typeof input === 'object' && ('length' in input)) { // processing regular arrays as well, e.g. for IE9 data = input; length = data.length; useUint32ArrayView = true; } else { throw new Error('Wrong data format in MurmurHash3_64_update. ' + 'Input must be a string or array.'); } var blockCounts = length >> 2; var tailLength = length - blockCounts * 4; // we don't care about endianness here var dataUint32 = useUint32ArrayView ? new Uint32ArrayView(data, blockCounts) : new Uint32Array(data.buffer, 0, blockCounts); var k1 = 0; var k2 = 0; var h1 = this.h1; var h2 = this.h2; var C1 = 0xcc9e2d51; var C2 = 0x1b873593; var C1_LOW = C1 & MASK_LOW; var C2_LOW = C2 & MASK_LOW; for (i = 0; i < blockCounts; i++) { if (i & 1) { k1 = dataUint32[i]; k1 = (k1 * C1 & MASK_HIGH) | (k1 * C1_LOW & MASK_LOW); k1 = k1 << 15 | k1 >>> 17; k1 = (k1 * C2 & MASK_HIGH) | (k1 * C2_LOW & MASK_LOW); h1 ^= k1; h1 = h1 << 13 | h1 >>> 19; h1 = h1 * 5 + 0xe6546b64; } else { k2 = dataUint32[i]; k2 = (k2 * C1 & MASK_HIGH) | (k2 * C1_LOW & MASK_LOW); k2 = k2 << 15 | k2 >>> 17; k2 = (k2 * C2 & MASK_HIGH) | (k2 * C2_LOW & MASK_LOW); h2 ^= k2; h2 = h2 << 13 | h2 >>> 19; h2 = h2 * 5 + 0xe6546b64; } } k1 = 0; switch (tailLength) { case 3: k1 ^= data[blockCounts * 4 + 2] << 16; /* falls through */ case 2: k1 ^= data[blockCounts * 4 + 1] << 8; /* falls through */ case 1: k1 ^= data[blockCounts * 4]; /* falls through */ k1 = (k1 * C1 & MASK_HIGH) | (k1 * C1_LOW & MASK_LOW); k1 = k1 << 15 | k1 >>> 17; k1 = (k1 * C2 & MASK_HIGH) | (k1 * C2_LOW & MASK_LOW); if (blockCounts & 1) { h1 ^= k1; } else { h2 ^= k1; } } this.h1 = h1; this.h2 = h2; return this; }, hexdigest: function MurmurHash3_64_hexdigest () { var h1 = this.h1; var h2 = this.h2; h1 ^= h2 >>> 1; h1 = (h1 * 0xed558ccd & MASK_HIGH) | (h1 * 0x8ccd & MASK_LOW); h2 = (h2 * 0xff51afd7 & MASK_HIGH) | (((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16); h1 ^= h2 >>> 1; h1 = (h1 * 0x1a85ec53 & MASK_HIGH) | (h1 * 0xec53 & MASK_LOW); h2 = (h2 * 0xc4ceb9fe & MASK_HIGH) | (((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16); h1 ^= h2 >>> 1; for (var i = 0, arr = [h1, h2], str = ''; i < arr.length; i++) { var hex = (arr[i] >>> 0).toString(16); while (hex.length < 8) { hex = '0' + hex; } str += hex; } return str; } }; return MurmurHash3_64; })(); exports.MurmurHash3_64 = MurmurHash3_64; })); (function (root, factory) { { factory((root.pdfjsCorePrimitives = {}), root.pdfjsSharedUtil); } }(this, function (exports, sharedUtil) { var isArray = sharedUtil.isArray; var Name = (function NameClosure() { function Name(name) { this.name = name; } Name.prototype = {}; var nameCache = Object.create(null); Name.get = function Name_get(name) { var nameValue = nameCache[name]; return (nameValue ? nameValue : (nameCache[name] = new Name(name))); }; return Name; })(); var Cmd = (function CmdClosure() { function Cmd(cmd) { this.cmd = cmd; } Cmd.prototype = {}; var cmdCache = Object.create(null); Cmd.get = function Cmd_get(cmd) { var cmdValue = cmdCache[cmd]; return (cmdValue ? cmdValue : (cmdCache[cmd] = new Cmd(cmd))); }; return Cmd; })(); var Dict = (function DictClosure() { var nonSerializable = function nonSerializableClosure() { return nonSerializable; // creating closure on some variable }; // xref is optional function Dict(xref) { // Map should only be used internally, use functions below to access. this.map = Object.create(null); this.xref = xref; this.objId = null; this.__nonSerializable__ = nonSerializable; // disable cloning of the Dict } Dict.prototype = { assignXref: function Dict_assignXref(newXref) { this.xref = newXref; }, // automatically dereferences Ref objects get: function Dict_get(key1, key2, key3) { var value; var xref = this.xref; if (typeof (value = this.map[key1]) !== 'undefined' || key1 in this.map || typeof key2 === 'undefined') { return xref ? xref.fetchIfRef(value) : value; } if (typeof (value = this.map[key2]) !== 'undefined' || key2 in this.map || typeof key3 === 'undefined') { return xref ? xref.fetchIfRef(value) : value; } value = this.map[key3] || null; return xref ? xref.fetchIfRef(value) : value; }, // Same as get(), but returns a promise and uses fetchIfRefAsync(). getAsync: function Dict_getAsync(key1, key2, key3) { var value; var xref = this.xref; if (typeof (value = this.map[key1]) !== 'undefined' || key1 in this.map || typeof key2 === 'undefined') { if (xref) { return xref.fetchIfRefAsync(value); } return Promise.resolve(value); } if (typeof (value = this.map[key2]) !== 'undefined' || key2 in this.map || typeof key3 === 'undefined') { if (xref) { return xref.fetchIfRefAsync(value); } return Promise.resolve(value); } value = this.map[key3] || null; if (xref) { return xref.fetchIfRefAsync(value); } return Promise.resolve(value); }, // Same as get(), but dereferences all elements if the result is an Array. getArray: function Dict_getArray(key1, key2, key3) { var value = this.get(key1, key2, key3); var xref = this.xref; if (!isArray(value) || !xref) { return value; } value = value.slice(); // Ensure that we don't modify the Dict data. for (var i = 0, ii = value.length; i < ii; i++) { if (!isRef(value[i])) { continue; } value[i] = xref.fetch(value[i]); } return value; }, // no dereferencing getRaw: function Dict_getRaw(key) { return this.map[key]; }, getKeys: function Dict_getKeys() { return Object.keys(this.map); }, set: function Dict_set(key, value) { this.map[key] = value; }, has: function Dict_has(key) { return key in this.map; }, forEach: function Dict_forEach(callback) { for (var key in this.map) { callback(key, this.get(key)); } } }; Dict.empty = new Dict(null); Dict.merge = function Dict_merge(xref, dictArray) { var mergedDict = new Dict(xref); for (var i = 0, ii = dictArray.length; i < ii; i++) { var dict = dictArray[i]; if (!isDict(dict)) { continue; } for (var keyName in dict.map) { if (mergedDict.map[keyName]) { continue; } mergedDict.map[keyName] = dict.map[keyName]; } } return mergedDict; }; return Dict; })(); var Ref = (function RefClosure() { function Ref(num, gen) { this.num = num; this.gen = gen; } Ref.prototype = { toString: function Ref_toString() { // This function is hot, so we make the string as compact as possible. // |this.gen| is almost always zero, so we treat that case specially. var str = this.num + 'R'; if (this.gen !== 0) { str += this.gen; } return str; } }; return Ref; })(); // The reference is identified by number and generation. // This structure stores only one instance of the reference. var RefSet = (function RefSetClosure() { function RefSet() { this.dict = Object.create(null); } RefSet.prototype = { has: function RefSet_has(ref) { return ref.toString() in this.dict; }, put: function RefSet_put(ref) { this.dict[ref.toString()] = true; }, remove: function RefSet_remove(ref) { delete this.dict[ref.toString()]; } }; return RefSet; })(); var RefSetCache = (function RefSetCacheClosure() { function RefSetCache() { this.dict = Object.create(null); } RefSetCache.prototype = { get: function RefSetCache_get(ref) { return this.dict[ref.toString()]; }, has: function RefSetCache_has(ref) { return ref.toString() in this.dict; }, put: function RefSetCache_put(ref, obj) { this.dict[ref.toString()] = obj; }, putAlias: function RefSetCache_putAlias(ref, aliasRef) { this.dict[ref.toString()] = this.get(aliasRef); }, forEach: function RefSetCache_forEach(fn, thisArg) { for (var i in this.dict) { fn.call(thisArg, this.dict[i]); } }, clear: function RefSetCache_clear() { this.dict = Object.create(null); } }; return RefSetCache; })(); function isName(v) { return v instanceof Name; } function isCmd(v, cmd) { return v instanceof Cmd && (cmd === undefined || v.cmd === cmd); } function isDict(v, type) { if (!(v instanceof Dict)) { return false; } if (!type) { return true; } var dictType = v.get('Type'); return isName(dictType) && dictType.name === type; } function isRef(v) { return v instanceof Ref; } function isStream(v) { return typeof v === 'object' && v !== null && v.getBytes !== undefined; } exports.Cmd = Cmd; exports.Dict = Dict; exports.Name = Name; exports.Ref = Ref; exports.RefSet = RefSet; exports.RefSetCache = RefSetCache; exports.isCmd = isCmd; exports.isDict = isDict; exports.isName = isName; exports.isRef = isRef; exports.isStream = isStream; })); (function (root, factory) { { factory((root.pdfjsCoreStandardFonts = {}), root.pdfjsSharedUtil); } }(this, function (exports, sharedUtil) { var getLookupTableFactory = sharedUtil.getLookupTableFactory; /** * Hold a map of decoded fonts and of the standard fourteen Type1 * fonts and their acronyms. */ var getStdFontMap = getLookupTableFactory(function (t) { t['ArialNarrow'] = 'Helvetica'; t['ArialNarrow-Bold'] = 'Helvetica-Bold'; t['ArialNarrow-BoldItalic'] = 'Helvetica-BoldOblique'; t['ArialNarrow-Italic'] = 'Helvetica-Oblique'; t['ArialBlack'] = 'Helvetica'; t['ArialBlack-Bold'] = 'Helvetica-Bold'; t['ArialBlack-BoldItalic'] = 'Helvetica-BoldOblique'; t['ArialBlack-Italic'] = 'Helvetica-Oblique'; t['Arial'] = 'Helvetica'; t['Arial-Bold'] = 'Helvetica-Bold'; t['Arial-BoldItalic'] = 'Helvetica-BoldOblique'; t['Arial-Italic'] = 'Helvetica-Oblique'; t['Arial-BoldItalicMT'] = 'Helvetica-BoldOblique'; t['Arial-BoldMT'] = 'Helvetica-Bold'; t['Arial-ItalicMT'] = 'Helvetica-Oblique'; t['ArialMT'] = 'Helvetica'; t['Courier-Bold'] = 'Courier-Bold'; t['Courier-BoldItalic'] = 'Courier-BoldOblique'; t['Courier-Italic'] = 'Courier-Oblique'; t['CourierNew'] = 'Courier'; t['CourierNew-Bold'] = 'Courier-Bold'; t['CourierNew-BoldItalic'] = 'Courier-BoldOblique'; t['CourierNew-Italic'] = 'Courier-Oblique'; t['CourierNewPS-BoldItalicMT'] = 'Courier-BoldOblique'; t['CourierNewPS-BoldMT'] = 'Courier-Bold'; t['CourierNewPS-ItalicMT'] = 'Courier-Oblique'; t['CourierNewPSMT'] = 'Courier'; t['Helvetica'] = 'Helvetica'; t['Helvetica-Bold'] = 'Helvetica-Bold'; t['Helvetica-BoldItalic'] = 'Helvetica-BoldOblique'; t['Helvetica-BoldOblique'] = 'Helvetica-BoldOblique'; t['Helvetica-Italic'] = 'Helvetica-Oblique'; t['Helvetica-Oblique'] = 'Helvetica-Oblique'; t['Symbol-Bold'] = 'Symbol'; t['Symbol-BoldItalic'] = 'Symbol'; t['Symbol-Italic'] = 'Symbol'; t['TimesNewRoman'] = 'Times-Roman'; t['TimesNewRoman-Bold'] = 'Times-Bold'; t['TimesNewRoman-BoldItalic'] = 'Times-BoldItalic'; t['TimesNewRoman-Italic'] = 'Times-Italic'; t['TimesNewRomanPS'] = 'Times-Roman'; t['TimesNewRomanPS-Bold'] = 'Times-Bold'; t['TimesNewRomanPS-BoldItalic'] = 'Times-BoldItalic'; t['TimesNewRomanPS-BoldItalicMT'] = 'Times-BoldItalic'; t['TimesNewRomanPS-BoldMT'] = 'Times-Bold'; t['TimesNewRomanPS-Italic'] = 'Times-Italic'; t['TimesNewRomanPS-ItalicMT'] = 'Times-Italic'; t['TimesNewRomanPSMT'] = 'Times-Roman'; t['TimesNewRomanPSMT-Bold'] = 'Times-Bold'; t['TimesNewRomanPSMT-BoldItalic'] = 'Times-BoldItalic'; t['TimesNewRomanPSMT-Italic'] = 'Times-Italic'; }); /** * Holds the map of the non-standard fonts that might be included as * a standard fonts without glyph data. */ var getNonStdFontMap = getLookupTableFactory(function (t) { t['CenturyGothic'] = 'Helvetica'; t['CenturyGothic-Bold'] = 'Helvetica-Bold'; t['CenturyGothic-BoldItalic'] = 'Helvetica-BoldOblique'; t['CenturyGothic-Italic'] = 'Helvetica-Oblique'; t['ComicSansMS'] = 'Comic Sans MS'; t['ComicSansMS-Bold'] = 'Comic Sans MS-Bold'; t['ComicSansMS-BoldItalic'] = 'Comic Sans MS-BoldItalic'; t['ComicSansMS-Italic'] = 'Comic Sans MS-Italic'; t['LucidaConsole'] = 'Courier'; t['LucidaConsole-Bold'] = 'Courier-Bold'; t['LucidaConsole-BoldItalic'] = 'Courier-BoldOblique'; t['LucidaConsole-Italic'] = 'Courier-Oblique'; t['MS-Gothic'] = 'MS Gothic'; t['MS-Gothic-Bold'] = 'MS Gothic-Bold'; t['MS-Gothic-BoldItalic'] = 'MS Gothic-BoldItalic'; t['MS-Gothic-Italic'] = 'MS Gothic-Italic'; t['MS-Mincho'] = 'MS Mincho'; t['MS-Mincho-Bold'] = 'MS Mincho-Bold'; t['MS-Mincho-BoldItalic'] = 'MS Mincho-BoldItalic'; t['MS-Mincho-Italic'] = 'MS Mincho-Italic'; t['MS-PGothic'] = 'MS PGothic'; t['MS-PGothic-Bold'] = 'MS PGothic-Bold'; t['MS-PGothic-BoldItalic'] = 'MS PGothic-BoldItalic'; t['MS-PGothic-Italic'] = 'MS PGothic-Italic'; t['MS-PMincho'] = 'MS PMincho'; t['MS-PMincho-Bold'] = 'MS PMincho-Bold'; t['MS-PMincho-BoldItalic'] = 'MS PMincho-BoldItalic'; t['MS-PMincho-Italic'] = 'MS PMincho-Italic'; t['Wingdings'] = 'ZapfDingbats'; }); var getSerifFonts = getLookupTableFactory(function (t) { t['Adobe Jenson'] = true; t['Adobe Text'] = true; t['Albertus'] = true; t['Aldus'] = true; t['Alexandria'] = true; t['Algerian'] = true; t['American Typewriter'] = true; t['Antiqua'] = true; t['Apex'] = true; t['Arno'] = true; t['Aster'] = true; t['Aurora'] = true; t['Baskerville'] = true; t['Bell'] = true; t['Bembo'] = true; t['Bembo Schoolbook'] = true; t['Benguiat'] = true; t['Berkeley Old Style'] = true; t['Bernhard Modern'] = true; t['Berthold City'] = true; t['Bodoni'] = true; t['Bauer Bodoni'] = true; t['Book Antiqua'] = true; t['Bookman'] = true; t['Bordeaux Roman'] = true; t['Californian FB'] = true; t['Calisto'] = true; t['Calvert'] = true; t['Capitals'] = true; t['Cambria'] = true; t['Cartier'] = true; t['Caslon'] = true; t['Catull'] = true; t['Centaur'] = true; t['Century Old Style'] = true; t['Century Schoolbook'] = true; t['Chaparral'] = true; t['Charis SIL'] = true; t['Cheltenham'] = true; t['Cholla Slab'] = true; t['Clarendon'] = true; t['Clearface'] = true; t['Cochin'] = true; t['Colonna'] = true; t['Computer Modern'] = true; t['Concrete Roman'] = true; t['Constantia'] = true; t['Cooper Black'] = true; t['Corona'] = true; t['Ecotype'] = true; t['Egyptienne'] = true; t['Elephant'] = true; t['Excelsior'] = true; t['Fairfield'] = true; t['FF Scala'] = true; t['Folkard'] = true; t['Footlight'] = true; t['FreeSerif'] = true; t['Friz Quadrata'] = true; t['Garamond'] = true; t['Gentium'] = true; t['Georgia'] = true; t['Gloucester'] = true; t['Goudy Old Style'] = true; t['Goudy Schoolbook'] = true; t['Goudy Pro Font'] = true; t['Granjon'] = true; t['Guardian Egyptian'] = true; t['Heather'] = true; t['Hercules'] = true; t['High Tower Text'] = true; t['Hiroshige'] = true; t['Hoefler Text'] = true; t['Humana Serif'] = true; t['Imprint'] = true; t['Ionic No. 5'] = true; t['Janson'] = true; t['Joanna'] = true; t['Korinna'] = true; t['Lexicon'] = true; t['Liberation Serif'] = true; t['Linux Libertine'] = true; t['Literaturnaya'] = true; t['Lucida'] = true; t['Lucida Bright'] = true; t['Melior'] = true; t['Memphis'] = true; t['Miller'] = true; t['Minion'] = true; t['Modern'] = true; t['Mona Lisa'] = true; t['Mrs Eaves'] = true; t['MS Serif'] = true; t['Museo Slab'] = true; t['New York'] = true; t['Nimbus Roman'] = true; t['NPS Rawlinson Roadway'] = true; t['Palatino'] = true; t['Perpetua'] = true; t['Plantin'] = true; t['Plantin Schoolbook'] = true; t['Playbill'] = true; t['Poor Richard'] = true; t['Rawlinson Roadway'] = true; t['Renault'] = true; t['Requiem'] = true; t['Rockwell'] = true; t['Roman'] = true; t['Rotis Serif'] = true; t['Sabon'] = true; t['Scala'] = true; t['Seagull'] = true; t['Sistina'] = true; t['Souvenir'] = true; t['STIX'] = true; t['Stone Informal'] = true; t['Stone Serif'] = true; t['Sylfaen'] = true; t['Times'] = true; t['Trajan'] = true; t['Trinité'] = true; t['Trump Mediaeval'] = true; t['Utopia'] = true; t['Vale Type'] = true; t['Bitstream Vera'] = true; t['Vera Serif'] = true; t['Versailles'] = true; t['Wanted'] = true; t['Weiss'] = true; t['Wide Latin'] = true; t['Windsor'] = true; t['XITS'] = true; }); var getSymbolsFonts = getLookupTableFactory(function (t) { t['Dingbats'] = true; t['Symbol'] = true; t['ZapfDingbats'] = true; }); // Glyph map for well-known standard fonts. Sometimes Ghostscript uses CID // fonts, but does not embed the CID to GID mapping. The mapping is incomplete // for all glyphs, but common for some set of the standard fonts. var getGlyphMapForStandardFonts = getLookupTableFactory(function (t) { t[2] = 10; t[3] = 32; t[4] = 33; t[5] = 34; t[6] = 35; t[7] = 36; t[8] = 37; t[9] = 38; t[10] = 39; t[11] = 40; t[12] = 41; t[13] = 42; t[14] = 43; t[15] = 44; t[16] = 45; t[17] = 46; t[18] = 47; t[19] = 48; t[20] = 49; t[21] = 50; t[22] = 51; t[23] = 52; t[24] = 53; t[25] = 54; t[26] = 55; t[27] = 56; t[28] = 57; t[29] = 58; t[30] = 894; t[31] = 60; t[32] = 61; t[33] = 62; t[34] = 63; t[35] = 64; t[36] = 65; t[37] = 66; t[38] = 67; t[39] = 68; t[40] = 69; t[41] = 70; t[42] = 71; t[43] = 72; t[44] = 73; t[45] = 74; t[46] = 75; t[47] = 76; t[48] = 77; t[49] = 78; t[50] = 79; t[51] = 80; t[52] = 81; t[53] = 82; t[54] = 83; t[55] = 84; t[56] = 85; t[57] = 86; t[58] = 87; t[59] = 88; t[60] = 89; t[61] = 90; t[62] = 91; t[63] = 92; t[64] = 93; t[65] = 94; t[66] = 95; t[67] = 96; t[68] = 97; t[69] = 98; t[70] = 99; t[71] = 100; t[72] = 101; t[73] = 102; t[74] = 103; t[75] = 104; t[76] = 105; t[77] = 106; t[78] = 107; t[79] = 108; t[80] = 109; t[81] = 110; t[82] = 111; t[83] = 112; t[84] = 113; t[85] = 114; t[86] = 115; t[87] = 116; t[88] = 117; t[89] = 118; t[90] = 119; t[91] = 120; t[92] = 121; t[93] = 122; t[94] = 123; t[95] = 124; t[96] = 125; t[97] = 126; t[98] = 196; t[99] = 197; t[100] = 199; t[101] = 201; t[102] = 209; t[103] = 214; t[104] = 220; t[105] = 225; t[106] = 224; t[107] = 226; t[108] = 228; t[109] = 227; t[110] = 229; t[111] = 231; t[112] = 233; t[113] = 232; t[114] = 234; t[115] = 235; t[116] = 237; t[117] = 236; t[118] = 238; t[119] = 239; t[120] = 241; t[121] = 243; t[122] = 242; t[123] = 244; t[124] = 246; t[125] = 245; t[126] = 250; t[127] = 249; t[128] = 251; t[129] = 252; t[130] = 8224; t[131] = 176; t[132] = 162; t[133] = 163; t[134] = 167; t[135] = 8226; t[136] = 182; t[137] = 223; t[138] = 174; t[139] = 169; t[140] = 8482; t[141] = 180; t[142] = 168; t[143] = 8800; t[144] = 198; t[145] = 216; t[146] = 8734; t[147] = 177; t[148] = 8804; t[149] = 8805; t[150] = 165; t[151] = 181; t[152] = 8706; t[153] = 8721; t[154] = 8719; t[156] = 8747; t[157] = 170; t[158] = 186; t[159] = 8486; t[160] = 230; t[161] = 248; t[162] = 191; t[163] = 161; t[164] = 172; t[165] = 8730; t[166] = 402; t[167] = 8776; t[168] = 8710; t[169] = 171; t[170] = 187; t[171] = 8230; t[210] = 218; t[223] = 711; t[224] = 321; t[225] = 322; t[227] = 353; t[229] = 382; t[234] = 253; t[252] = 263; t[253] = 268; t[254] = 269; t[258] = 258; t[260] = 260; t[261] = 261; t[265] = 280; t[266] = 281; t[268] = 283; t[269] = 313; t[275] = 323; t[276] = 324; t[278] = 328; t[284] = 345; t[285] = 346; t[286] = 347; t[292] = 367; t[295] = 377; t[296] = 378; t[298] = 380; t[305] = 963; t[306] = 964; t[307] = 966; t[308] = 8215; t[309] = 8252; t[310] = 8319; t[311] = 8359; t[312] = 8592; t[313] = 8593; t[337] = 9552; t[493] = 1039; t[494] = 1040; t[705] = 1524; t[706] = 8362; t[710] = 64288; t[711] = 64298; t[759] = 1617; t[761] = 1776; t[763] = 1778; t[775] = 1652; t[777] = 1764; t[778] = 1780; t[779] = 1781; t[780] = 1782; t[782] = 771; t[783] = 64726; t[786] = 8363; t[788] = 8532; t[790] = 768; t[791] = 769; t[792] = 768; t[795] = 803; t[797] = 64336; t[798] = 64337; t[799] = 64342; t[800] = 64343; t[801] = 64344; t[802] = 64345; t[803] = 64362; t[804] = 64363; t[805] = 64364; t[2424] = 7821; t[2425] = 7822; t[2426] = 7823; t[2427] = 7824; t[2428] = 7825; t[2429] = 7826; t[2430] = 7827; t[2433] = 7682; t[2678] = 8045; t[2679] = 8046; t[2830] = 1552; t[2838] = 686; t[2840] = 751; t[2842] = 753; t[2843] = 754; t[2844] = 755; t[2846] = 757; t[2856] = 767; t[2857] = 848; t[2858] = 849; t[2862] = 853; t[2863] = 854; t[2864] = 855; t[2865] = 861; t[2866] = 862; t[2906] = 7460; t[2908] = 7462; t[2909] = 7463; t[2910] = 7464; t[2912] = 7466; t[2913] = 7467; t[2914] = 7468; t[2916] = 7470; t[2917] = 7471; t[2918] = 7472; t[2920] = 7474; t[2921] = 7475; t[2922] = 7476; t[2924] = 7478; t[2925] = 7479; t[2926] = 7480; t[2928] = 7482; t[2929] = 7483; t[2930] = 7484; t[2932] = 7486; t[2933] = 7487; t[2934] = 7488; t[2936] = 7490; t[2937] = 7491; t[2938] = 7492; t[2940] = 7494; t[2941] = 7495; t[2942] = 7496; t[2944] = 7498; t[2946] = 7500; t[2948] = 7502; t[2950] = 7504; t[2951] = 7505; t[2952] = 7506; t[2954] = 7508; t[2955] = 7509; t[2956] = 7510; t[2958] = 7512; t[2959] = 7513; t[2960] = 7514; t[2962] = 7516; t[2963] = 7517; t[2964] = 7518; t[2966] = 7520; t[2967] = 7521; t[2968] = 7522; t[2970] = 7524; t[2971] = 7525; t[2972] = 7526; t[2974] = 7528; t[2975] = 7529; t[2976] = 7530; t[2978] = 1537; t[2979] = 1538; t[2980] = 1539; t[2982] = 1549; t[2983] = 1551; t[2984] = 1552; t[2986] = 1554; t[2987] = 1555; t[2988] = 1556; t[2990] = 1623; t[2991] = 1624; t[2995] = 1775; t[2999] = 1791; t[3002] = 64290; t[3003] = 64291; t[3004] = 64292; t[3006] = 64294; t[3007] = 64295; t[3008] = 64296; t[3011] = 1900; t[3014] = 8223; t[3015] = 8244; t[3017] = 7532; t[3018] = 7533; t[3019] = 7534; t[3075] = 7590; t[3076] = 7591; t[3079] = 7594; t[3080] = 7595; t[3083] = 7598; t[3084] = 7599; t[3087] = 7602; t[3088] = 7603; t[3091] = 7606; t[3092] = 7607; t[3095] = 7610; t[3096] = 7611; t[3099] = 7614; t[3100] = 7615; t[3103] = 7618; t[3104] = 7619; t[3107] = 8337; t[3108] = 8338; t[3116] = 1884; t[3119] = 1885; t[3120] = 1885; t[3123] = 1886; t[3124] = 1886; t[3127] = 1887; t[3128] = 1887; t[3131] = 1888; t[3132] = 1888; t[3135] = 1889; t[3136] = 1889; t[3139] = 1890; t[3140] = 1890; t[3143] = 1891; t[3144] = 1891; t[3147] = 1892; t[3148] = 1892; t[3153] = 580; t[3154] = 581; t[3157] = 584; t[3158] = 585; t[3161] = 588; t[3162] = 589; t[3165] = 891; t[3166] = 892; t[3169] = 1274; t[3170] = 1275; t[3173] = 1278; t[3174] = 1279; t[3181] = 7622; t[3182] = 7623; t[3282] = 11799; t[3316] = 578; t[3379] = 42785; t[3393] = 1159; t[3416] = 8377; }); // The glyph map for ArialBlack differs slightly from the glyph map used for // other well-known standard fonts. Hence we use this (incomplete) CID to GID // mapping to adjust the glyph map for non-embedded ArialBlack fonts. var getSupplementalGlyphMapForArialBlack = getLookupTableFactory(function (t) { t[227] = 322; t[264] = 261; t[291] = 346; }); exports.getStdFontMap = getStdFontMap; exports.getNonStdFontMap = getNonStdFontMap; exports.getSerifFonts = getSerifFonts; exports.getSymbolsFonts = getSymbolsFonts; exports.getGlyphMapForStandardFonts = getGlyphMapForStandardFonts; exports.getSupplementalGlyphMapForArialBlack = getSupplementalGlyphMapForArialBlack; })); (function (root, factory) { { factory((root.pdfjsCoreUnicode = {}), root.pdfjsSharedUtil); } }(this, function (exports, sharedUtil) { var getLookupTableFactory = sharedUtil.getLookupTableFactory; // Some characters, e.g. copyrightserif, are mapped to the private use area // and might not be displayed using standard fonts. Mapping/hacking well-known // chars to the similar equivalents in the normal characters range. var getSpecialPUASymbols = getLookupTableFactory(function (t) { t[63721] = 0x00A9; // copyrightsans (0xF8E9) => copyright t[63193] = 0x00A9; // copyrightserif (0xF6D9) => copyright t[63720] = 0x00AE; // registersans (0xF8E8) => registered t[63194] = 0x00AE; // registerserif (0xF6DA) => registered t[63722] = 0x2122; // trademarksans (0xF8EA) => trademark t[63195] = 0x2122; // trademarkserif (0xF6DB) => trademark t[63729] = 0x23A7; // bracelefttp (0xF8F1) t[63730] = 0x23A8; // braceleftmid (0xF8F2) t[63731] = 0x23A9; // braceleftbt (0xF8F3) t[63740] = 0x23AB; // bracerighttp (0xF8FC) t[63741] = 0x23AC; // bracerightmid (0xF8FD) t[63742] = 0x23AD; // bracerightbt (0xF8FE) t[63726] = 0x23A1; // bracketlefttp (0xF8EE) t[63727] = 0x23A2; // bracketleftex (0xF8EF) t[63728] = 0x23A3; // bracketleftbt (0xF8F0) t[63737] = 0x23A4; // bracketrighttp (0xF8F9) t[63738] = 0x23A5; // bracketrightex (0xF8FA) t[63739] = 0x23A6; // bracketrightbt (0xF8FB) t[63723] = 0x239B; // parenlefttp (0xF8EB) t[63724] = 0x239C; // parenleftex (0xF8EC) t[63725] = 0x239D; // parenleftbt (0xF8ED) t[63734] = 0x239E; // parenrighttp (0xF8F6) t[63735] = 0x239F; // parenrightex (0xF8F7) t[63736] = 0x23A0; // parenrightbt (0xF8F8) }); function mapSpecialUnicodeValues(code) { if (code >= 0xFFF0 && code <= 0xFFFF) { // Specials unicode block. return 0; } else if (code >= 0xF600 && code <= 0xF8FF) { return (getSpecialPUASymbols()[code] || code); } return code; } function getUnicodeForGlyph(name, glyphsUnicodeMap) { var unicode = glyphsUnicodeMap[name]; if (unicode !== undefined) { return unicode; } if (!name) { return -1; } // Try to recover valid Unicode values from 'uniXXXX'/'uXXXX{XX}' glyphs. if (name[0] === 'u') { var nameLen = name.length, hexStr; if (nameLen === 7 && name[1] === 'n' && name[2] === 'i') { // 'uniXXXX' hexStr = name.substr(3); } else if (nameLen >= 5 && nameLen <= 7) { // 'uXXXX{XX}' hexStr = name.substr(1); } else { return -1; } // Check for upper-case hexadecimal characters, to avoid false positives. if (hexStr === hexStr.toUpperCase()) { unicode = parseInt(hexStr, 16); if (unicode >= 0) { return unicode; } } } return -1; } var UnicodeRanges = [ { 'begin': 0x0000, 'end': 0x007F }, // Basic Latin { 'begin': 0x0080, 'end': 0x00FF }, // Latin-1 Supplement { 'begin': 0x0100, 'end': 0x017F }, // Latin Extended-A { 'begin': 0x0180, 'end': 0x024F }, // Latin Extended-B { 'begin': 0x0250, 'end': 0x02AF }, // IPA Extensions { 'begin': 0x02B0, 'end': 0x02FF }, // Spacing Modifier Letters { 'begin': 0x0300, 'end': 0x036F }, // Combining Diacritical Marks { 'begin': 0x0370, 'end': 0x03FF }, // Greek and Coptic { 'begin': 0x2C80, 'end': 0x2CFF }, // Coptic { 'begin': 0x0400, 'end': 0x04FF }, // Cyrillic { 'begin': 0x0530, 'end': 0x058F }, // Armenian { 'begin': 0x0590, 'end': 0x05FF }, // Hebrew { 'begin': 0xA500, 'end': 0xA63F }, // Vai { 'begin': 0x0600, 'end': 0x06FF }, // Arabic { 'begin': 0x07C0, 'end': 0x07FF }, // NKo { 'begin': 0x0900, 'end': 0x097F }, // Devanagari { 'begin': 0x0980, 'end': 0x09FF }, // Bengali { 'begin': 0x0A00, 'end': 0x0A7F }, // Gurmukhi { 'begin': 0x0A80, 'end': 0x0AFF }, // Gujarati { 'begin': 0x0B00, 'end': 0x0B7F }, // Oriya { 'begin': 0x0B80, 'end': 0x0BFF }, // Tamil { 'begin': 0x0C00, 'end': 0x0C7F }, // Telugu { 'begin': 0x0C80, 'end': 0x0CFF }, // Kannada { 'begin': 0x0D00, 'end': 0x0D7F }, // Malayalam { 'begin': 0x0E00, 'end': 0x0E7F }, // Thai { 'begin': 0x0E80, 'end': 0x0EFF }, // Lao { 'begin': 0x10A0, 'end': 0x10FF }, // Georgian { 'begin': 0x1B00, 'end': 0x1B7F }, // Balinese { 'begin': 0x1100, 'end': 0x11FF }, // Hangul Jamo { 'begin': 0x1E00, 'end': 0x1EFF }, // Latin Extended Additional { 'begin': 0x1F00, 'end': 0x1FFF }, // Greek Extended { 'begin': 0x2000, 'end': 0x206F }, // General Punctuation { 'begin': 0x2070, 'end': 0x209F }, // Superscripts And Subscripts { 'begin': 0x20A0, 'end': 0x20CF }, // Currency Symbol { 'begin': 0x20D0, 'end': 0x20FF }, // Combining Diacritical Marks { 'begin': 0x2100, 'end': 0x214F }, // Letterlike Symbols { 'begin': 0x2150, 'end': 0x218F }, // Number Forms { 'begin': 0x2190, 'end': 0x21FF }, // Arrows { 'begin': 0x2200, 'end': 0x22FF }, // Mathematical Operators { 'begin': 0x2300, 'end': 0x23FF }, // Miscellaneous Technical { 'begin': 0x2400, 'end': 0x243F }, // Control Pictures { 'begin': 0x2440, 'end': 0x245F }, // Optical Character Recognition { 'begin': 0x2460, 'end': 0x24FF }, // Enclosed Alphanumerics { 'begin': 0x2500, 'end': 0x257F }, // Box Drawing { 'begin': 0x2580, 'end': 0x259F }, // Block Elements { 'begin': 0x25A0, 'end': 0x25FF }, // Geometric Shapes { 'begin': 0x2600, 'end': 0x26FF }, // Miscellaneous Symbols { 'begin': 0x2700, 'end': 0x27BF }, // Dingbats { 'begin': 0x3000, 'end': 0x303F }, // CJK Symbols And Punctuation { 'begin': 0x3040, 'end': 0x309F }, // Hiragana { 'begin': 0x30A0, 'end': 0x30FF }, // Katakana { 'begin': 0x3100, 'end': 0x312F }, // Bopomofo { 'begin': 0x3130, 'end': 0x318F }, // Hangul Compatibility Jamo { 'begin': 0xA840, 'end': 0xA87F }, // Phags-pa { 'begin': 0x3200, 'end': 0x32FF }, // Enclosed CJK Letters And Months { 'begin': 0x3300, 'end': 0x33FF }, // CJK Compatibility { 'begin': 0xAC00, 'end': 0xD7AF }, // Hangul Syllables { 'begin': 0xD800, 'end': 0xDFFF }, // Non-Plane 0 * { 'begin': 0x10900, 'end': 0x1091F }, // Phoenicia { 'begin': 0x4E00, 'end': 0x9FFF }, // CJK Unified Ideographs { 'begin': 0xE000, 'end': 0xF8FF }, // Private Use Area (plane 0) { 'begin': 0x31C0, 'end': 0x31EF }, // CJK Strokes { 'begin': 0xFB00, 'end': 0xFB4F }, // Alphabetic Presentation Forms { 'begin': 0xFB50, 'end': 0xFDFF }, // Arabic Presentation Forms-A { 'begin': 0xFE20, 'end': 0xFE2F }, // Combining Half Marks { 'begin': 0xFE10, 'end': 0xFE1F }, // Vertical Forms { 'begin': 0xFE50, 'end': 0xFE6F }, // Small Form Variants { 'begin': 0xFE70, 'end': 0xFEFF }, // Arabic Presentation Forms-B { 'begin': 0xFF00, 'end': 0xFFEF }, // Halfwidth And Fullwidth Forms { 'begin': 0xFFF0, 'end': 0xFFFF }, // Specials { 'begin': 0x0F00, 'end': 0x0FFF }, // Tibetan { 'begin': 0x0700, 'end': 0x074F }, // Syriac { 'begin': 0x0780, 'end': 0x07BF }, // Thaana { 'begin': 0x0D80, 'end': 0x0DFF }, // Sinhala { 'begin': 0x1000, 'end': 0x109F }, // Myanmar { 'begin': 0x1200, 'end': 0x137F }, // Ethiopic { 'begin': 0x13A0, 'end': 0x13FF }, // Cherokee { 'begin': 0x1400, 'end': 0x167F }, // Unified Canadian Aboriginal Syllabics { 'begin': 0x1680, 'end': 0x169F }, // Ogham { 'begin': 0x16A0, 'end': 0x16FF }, // Runic { 'begin': 0x1780, 'end': 0x17FF }, // Khmer { 'begin': 0x1800, 'end': 0x18AF }, // Mongolian { 'begin': 0x2800, 'end': 0x28FF }, // Braille Patterns { 'begin': 0xA000, 'end': 0xA48F }, // Yi Syllables { 'begin': 0x1700, 'end': 0x171F }, // Tagalog { 'begin': 0x10300, 'end': 0x1032F }, // Old Italic { 'begin': 0x10330, 'end': 0x1034F }, // Gothic { 'begin': 0x10400, 'end': 0x1044F }, // Deseret { 'begin': 0x1D000, 'end': 0x1D0FF }, // Byzantine Musical Symbols { 'begin': 0x1D400, 'end': 0x1D7FF }, // Mathematical Alphanumeric Symbols { 'begin': 0xFF000, 'end': 0xFFFFD }, // Private Use (plane 15) { 'begin': 0xFE00, 'end': 0xFE0F }, // Variation Selectors { 'begin': 0xE0000, 'end': 0xE007F }, // Tags { 'begin': 0x1900, 'end': 0x194F }, // Limbu { 'begin': 0x1950, 'end': 0x197F }, // Tai Le { 'begin': 0x1980, 'end': 0x19DF }, // New Tai Lue { 'begin': 0x1A00, 'end': 0x1A1F }, // Buginese { 'begin': 0x2C00, 'end': 0x2C5F }, // Glagolitic { 'begin': 0x2D30, 'end': 0x2D7F }, // Tifinagh { 'begin': 0x4DC0, 'end': 0x4DFF }, // Yijing Hexagram Symbols { 'begin': 0xA800, 'end': 0xA82F }, // Syloti Nagri { 'begin': 0x10000, 'end': 0x1007F }, // Linear B Syllabary { 'begin': 0x10140, 'end': 0x1018F }, // Ancient Greek Numbers { 'begin': 0x10380, 'end': 0x1039F }, // Ugaritic { 'begin': 0x103A0, 'end': 0x103DF }, // Old Persian { 'begin': 0x10450, 'end': 0x1047F }, // Shavian { 'begin': 0x10480, 'end': 0x104AF }, // Osmanya { 'begin': 0x10800, 'end': 0x1083F }, // Cypriot Syllabary { 'begin': 0x10A00, 'end': 0x10A5F }, // Kharoshthi { 'begin': 0x1D300, 'end': 0x1D35F }, // Tai Xuan Jing Symbols { 'begin': 0x12000, 'end': 0x123FF }, // Cuneiform { 'begin': 0x1D360, 'end': 0x1D37F }, // Counting Rod Numerals { 'begin': 0x1B80, 'end': 0x1BBF }, // Sundanese { 'begin': 0x1C00, 'end': 0x1C4F }, // Lepcha { 'begin': 0x1C50, 'end': 0x1C7F }, // Ol Chiki { 'begin': 0xA880, 'end': 0xA8DF }, // Saurashtra { 'begin': 0xA900, 'end': 0xA92F }, // Kayah Li { 'begin': 0xA930, 'end': 0xA95F }, // Rejang { 'begin': 0xAA00, 'end': 0xAA5F }, // Cham { 'begin': 0x10190, 'end': 0x101CF }, // Ancient Symbols { 'begin': 0x101D0, 'end': 0x101FF }, // Phaistos Disc { 'begin': 0x102A0, 'end': 0x102DF }, // Carian { 'begin': 0x1F030, 'end': 0x1F09F } // Domino Tiles ]; function getUnicodeRangeFor(value) { for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) { var range = UnicodeRanges[i]; if (value >= range.begin && value < range.end) { return i; } } return -1; } function isRTLRangeFor(value) { var range = UnicodeRanges[13]; if (value >= range.begin && value < range.end) { return true; } range = UnicodeRanges[11]; if (value >= range.begin && value < range.end) { return true; } return false; } // The normalization table is obtained by filtering the Unicode characters // database with entries. var getNormalizedUnicodes = getLookupTableFactory(function (t) { t['\u00A8'] = '\u0020\u0308'; t['\u00AF'] = '\u0020\u0304'; t['\u00B4'] = '\u0020\u0301'; t['\u00B5'] = '\u03BC'; t['\u00B8'] = '\u0020\u0327'; t['\u0132'] = '\u0049\u004A'; t['\u0133'] = '\u0069\u006A'; t['\u013F'] = '\u004C\u00B7'; t['\u0140'] = '\u006C\u00B7'; t['\u0149'] = '\u02BC\u006E'; t['\u017F'] = '\u0073'; t['\u01C4'] = '\u0044\u017D'; t['\u01C5'] = '\u0044\u017E'; t['\u01C6'] = '\u0064\u017E'; t['\u01C7'] = '\u004C\u004A'; t['\u01C8'] = '\u004C\u006A'; t['\u01C9'] = '\u006C\u006A'; t['\u01CA'] = '\u004E\u004A'; t['\u01CB'] = '\u004E\u006A'; t['\u01CC'] = '\u006E\u006A'; t['\u01F1'] = '\u0044\u005A'; t['\u01F2'] = '\u0044\u007A'; t['\u01F3'] = '\u0064\u007A'; t['\u02D8'] = '\u0020\u0306'; t['\u02D9'] = '\u0020\u0307'; t['\u02DA'] = '\u0020\u030A'; t['\u02DB'] = '\u0020\u0328'; t['\u02DC'] = '\u0020\u0303'; t['\u02DD'] = '\u0020\u030B'; t['\u037A'] = '\u0020\u0345'; t['\u0384'] = '\u0020\u0301'; t['\u03D0'] = '\u03B2'; t['\u03D1'] = '\u03B8'; t['\u03D2'] = '\u03A5'; t['\u03D5'] = '\u03C6'; t['\u03D6'] = '\u03C0'; t['\u03F0'] = '\u03BA'; t['\u03F1'] = '\u03C1'; t['\u03F2'] = '\u03C2'; t['\u03F4'] = '\u0398'; t['\u03F5'] = '\u03B5'; t['\u03F9'] = '\u03A3'; t['\u0587'] = '\u0565\u0582'; t['\u0675'] = '\u0627\u0674'; t['\u0676'] = '\u0648\u0674'; t['\u0677'] = '\u06C7\u0674'; t['\u0678'] = '\u064A\u0674'; t['\u0E33'] = '\u0E4D\u0E32'; t['\u0EB3'] = '\u0ECD\u0EB2'; t['\u0EDC'] = '\u0EAB\u0E99'; t['\u0EDD'] = '\u0EAB\u0EA1'; t['\u0F77'] = '\u0FB2\u0F81'; t['\u0F79'] = '\u0FB3\u0F81'; t['\u1E9A'] = '\u0061\u02BE'; t['\u1FBD'] = '\u0020\u0313'; t['\u1FBF'] = '\u0020\u0313'; t['\u1FC0'] = '\u0020\u0342'; t['\u1FFE'] = '\u0020\u0314'; t['\u2002'] = '\u0020'; t['\u2003'] = '\u0020'; t['\u2004'] = '\u0020'; t['\u2005'] = '\u0020'; t['\u2006'] = '\u0020'; t['\u2008'] = '\u0020'; t['\u2009'] = '\u0020'; t['\u200A'] = '\u0020'; t['\u2017'] = '\u0020\u0333'; t['\u2024'] = '\u002E'; t['\u2025'] = '\u002E\u002E'; t['\u2026'] = '\u002E\u002E\u002E'; t['\u2033'] = '\u2032\u2032'; t['\u2034'] = '\u2032\u2032\u2032'; t['\u2036'] = '\u2035\u2035'; t['\u2037'] = '\u2035\u2035\u2035'; t['\u203C'] = '\u0021\u0021'; t['\u203E'] = '\u0020\u0305'; t['\u2047'] = '\u003F\u003F'; t['\u2048'] = '\u003F\u0021'; t['\u2049'] = '\u0021\u003F'; t['\u2057'] = '\u2032\u2032\u2032\u2032'; t['\u205F'] = '\u0020'; t['\u20A8'] = '\u0052\u0073'; t['\u2100'] = '\u0061\u002F\u0063'; t['\u2101'] = '\u0061\u002F\u0073'; t['\u2103'] = '\u00B0\u0043'; t['\u2105'] = '\u0063\u002F\u006F'; t['\u2106'] = '\u0063\u002F\u0075'; t['\u2107'] = '\u0190'; t['\u2109'] = '\u00B0\u0046'; t['\u2116'] = '\u004E\u006F'; t['\u2121'] = '\u0054\u0045\u004C'; t['\u2135'] = '\u05D0'; t['\u2136'] = '\u05D1'; t['\u2137'] = '\u05D2'; t['\u2138'] = '\u05D3'; t['\u213B'] = '\u0046\u0041\u0058'; t['\u2160'] = '\u0049'; t['\u2161'] = '\u0049\u0049'; t['\u2162'] = '\u0049\u0049\u0049'; t['\u2163'] = '\u0049\u0056'; t['\u2164'] = '\u0056'; t['\u2165'] = '\u0056\u0049'; t['\u2166'] = '\u0056\u0049\u0049'; t['\u2167'] = '\u0056\u0049\u0049\u0049'; t['\u2168'] = '\u0049\u0058'; t['\u2169'] = '\u0058'; t['\u216A'] = '\u0058\u0049'; t['\u216B'] = '\u0058\u0049\u0049'; t['\u216C'] = '\u004C'; t['\u216D'] = '\u0043'; t['\u216E'] = '\u0044'; t['\u216F'] = '\u004D'; t['\u2170'] = '\u0069'; t['\u2171'] = '\u0069\u0069'; t['\u2172'] = '\u0069\u0069\u0069'; t['\u2173'] = '\u0069\u0076'; t['\u2174'] = '\u0076'; t['\u2175'] = '\u0076\u0069'; t['\u2176'] = '\u0076\u0069\u0069'; t['\u2177'] = '\u0076\u0069\u0069\u0069'; t['\u2178'] = '\u0069\u0078'; t['\u2179'] = '\u0078'; t['\u217A'] = '\u0078\u0069'; t['\u217B'] = '\u0078\u0069\u0069'; t['\u217C'] = '\u006C'; t['\u217D'] = '\u0063'; t['\u217E'] = '\u0064'; t['\u217F'] = '\u006D'; t['\u222C'] = '\u222B\u222B'; t['\u222D'] = '\u222B\u222B\u222B'; t['\u222F'] = '\u222E\u222E'; t['\u2230'] = '\u222E\u222E\u222E'; t['\u2474'] = '\u0028\u0031\u0029'; t['\u2475'] = '\u0028\u0032\u0029'; t['\u2476'] = '\u0028\u0033\u0029'; t['\u2477'] = '\u0028\u0034\u0029'; t['\u2478'] = '\u0028\u0035\u0029'; t['\u2479'] = '\u0028\u0036\u0029'; t['\u247A'] = '\u0028\u0037\u0029'; t['\u247B'] = '\u0028\u0038\u0029'; t['\u247C'] = '\u0028\u0039\u0029'; t['\u247D'] = '\u0028\u0031\u0030\u0029'; t['\u247E'] = '\u0028\u0031\u0031\u0029'; t['\u247F'] = '\u0028\u0031\u0032\u0029'; t['\u2480'] = '\u0028\u0031\u0033\u0029'; t['\u2481'] = '\u0028\u0031\u0034\u0029'; t['\u2482'] = '\u0028\u0031\u0035\u0029'; t['\u2483'] = '\u0028\u0031\u0036\u0029'; t['\u2484'] = '\u0028\u0031\u0037\u0029'; t['\u2485'] = '\u0028\u0031\u0038\u0029'; t['\u2486'] = '\u0028\u0031\u0039\u0029'; t['\u2487'] = '\u0028\u0032\u0030\u0029'; t['\u2488'] = '\u0031\u002E'; t['\u2489'] = '\u0032\u002E'; t['\u248A'] = '\u0033\u002E'; t['\u248B'] = '\u0034\u002E'; t['\u248C'] = '\u0035\u002E'; t['\u248D'] = '\u0036\u002E'; t['\u248E'] = '\u0037\u002E'; t['\u248F'] = '\u0038\u002E'; t['\u2490'] = '\u0039\u002E'; t['\u2491'] = '\u0031\u0030\u002E'; t['\u2492'] = '\u0031\u0031\u002E'; t['\u2493'] = '\u0031\u0032\u002E'; t['\u2494'] = '\u0031\u0033\u002E'; t['\u2495'] = '\u0031\u0034\u002E'; t['\u2496'] = '\u0031\u0035\u002E'; t['\u2497'] = '\u0031\u0036\u002E'; t['\u2498'] = '\u0031\u0037\u002E'; t['\u2499'] = '\u0031\u0038\u002E'; t['\u249A'] = '\u0031\u0039\u002E'; t['\u249B'] = '\u0032\u0030\u002E'; t['\u249C'] = '\u0028\u0061\u0029'; t['\u249D'] = '\u0028\u0062\u0029'; t['\u249E'] = '\u0028\u0063\u0029'; t['\u249F'] = '\u0028\u0064\u0029'; t['\u24A0'] = '\u0028\u0065\u0029'; t['\u24A1'] = '\u0028\u0066\u0029'; t['\u24A2'] = '\u0028\u0067\u0029'; t['\u24A3'] = '\u0028\u0068\u0029'; t['\u24A4'] = '\u0028\u0069\u0029'; t['\u24A5'] = '\u0028\u006A\u0029'; t['\u24A6'] = '\u0028\u006B\u0029'; t['\u24A7'] = '\u0028\u006C\u0029'; t['\u24A8'] = '\u0028\u006D\u0029'; t['\u24A9'] = '\u0028\u006E\u0029'; t['\u24AA'] = '\u0028\u006F\u0029'; t['\u24AB'] = '\u0028\u0070\u0029'; t['\u24AC'] = '\u0028\u0071\u0029'; t['\u24AD'] = '\u0028\u0072\u0029'; t['\u24AE'] = '\u0028\u0073\u0029'; t['\u24AF'] = '\u0028\u0074\u0029'; t['\u24B0'] = '\u0028\u0075\u0029'; t['\u24B1'] = '\u0028\u0076\u0029'; t['\u24B2'] = '\u0028\u0077\u0029'; t['\u24B3'] = '\u0028\u0078\u0029'; t['\u24B4'] = '\u0028\u0079\u0029'; t['\u24B5'] = '\u0028\u007A\u0029'; t['\u2A0C'] = '\u222B\u222B\u222B\u222B'; t['\u2A74'] = '\u003A\u003A\u003D'; t['\u2A75'] = '\u003D\u003D'; t['\u2A76'] = '\u003D\u003D\u003D'; t['\u2E9F'] = '\u6BCD'; t['\u2EF3'] = '\u9F9F'; t['\u2F00'] = '\u4E00'; t['\u2F01'] = '\u4E28'; t['\u2F02'] = '\u4E36'; t['\u2F03'] = '\u4E3F'; t['\u2F04'] = '\u4E59'; t['\u2F05'] = '\u4E85'; t['\u2F06'] = '\u4E8C'; t['\u2F07'] = '\u4EA0'; t['\u2F08'] = '\u4EBA'; t['\u2F09'] = '\u513F'; t['\u2F0A'] = '\u5165'; t['\u2F0B'] = '\u516B'; t['\u2F0C'] = '\u5182'; t['\u2F0D'] = '\u5196'; t['\u2F0E'] = '\u51AB'; t['\u2F0F'] = '\u51E0'; t['\u2F10'] = '\u51F5'; t['\u2F11'] = '\u5200'; t['\u2F12'] = '\u529B'; t['\u2F13'] = '\u52F9'; t['\u2F14'] = '\u5315'; t['\u2F15'] = '\u531A'; t['\u2F16'] = '\u5338'; t['\u2F17'] = '\u5341'; t['\u2F18'] = '\u535C'; t['\u2F19'] = '\u5369'; t['\u2F1A'] = '\u5382'; t['\u2F1B'] = '\u53B6'; t['\u2F1C'] = '\u53C8'; t['\u2F1D'] = '\u53E3'; t['\u2F1E'] = '\u56D7'; t['\u2F1F'] = '\u571F'; t['\u2F20'] = '\u58EB'; t['\u2F21'] = '\u5902'; t['\u2F22'] = '\u590A'; t['\u2F23'] = '\u5915'; t['\u2F24'] = '\u5927'; t['\u2F25'] = '\u5973'; t['\u2F26'] = '\u5B50'; t['\u2F27'] = '\u5B80'; t['\u2F28'] = '\u5BF8'; t['\u2F29'] = '\u5C0F'; t['\u2F2A'] = '\u5C22'; t['\u2F2B'] = '\u5C38'; t['\u2F2C'] = '\u5C6E'; t['\u2F2D'] = '\u5C71'; t['\u2F2E'] = '\u5DDB'; t['\u2F2F'] = '\u5DE5'; t['\u2F30'] = '\u5DF1'; t['\u2F31'] = '\u5DFE'; t['\u2F32'] = '\u5E72'; t['\u2F33'] = '\u5E7A'; t['\u2F34'] = '\u5E7F'; t['\u2F35'] = '\u5EF4'; t['\u2F36'] = '\u5EFE'; t['\u2F37'] = '\u5F0B'; t['\u2F38'] = '\u5F13'; t['\u2F39'] = '\u5F50'; t['\u2F3A'] = '\u5F61'; t['\u2F3B'] = '\u5F73'; t['\u2F3C'] = '\u5FC3'; t['\u2F3D'] = '\u6208'; t['\u2F3E'] = '\u6236'; t['\u2F3F'] = '\u624B'; t['\u2F40'] = '\u652F'; t['\u2F41'] = '\u6534'; t['\u2F42'] = '\u6587'; t['\u2F43'] = '\u6597'; t['\u2F44'] = '\u65A4'; t['\u2F45'] = '\u65B9'; t['\u2F46'] = '\u65E0'; t['\u2F47'] = '\u65E5'; t['\u2F48'] = '\u66F0'; t['\u2F49'] = '\u6708'; t['\u2F4A'] = '\u6728'; t['\u2F4B'] = '\u6B20'; t['\u2F4C'] = '\u6B62'; t['\u2F4D'] = '\u6B79'; t['\u2F4E'] = '\u6BB3'; t['\u2F4F'] = '\u6BCB'; t['\u2F50'] = '\u6BD4'; t['\u2F51'] = '\u6BDB'; t['\u2F52'] = '\u6C0F'; t['\u2F53'] = '\u6C14'; t['\u2F54'] = '\u6C34'; t['\u2F55'] = '\u706B'; t['\u2F56'] = '\u722A'; t['\u2F57'] = '\u7236'; t['\u2F58'] = '\u723B'; t['\u2F59'] = '\u723F'; t['\u2F5A'] = '\u7247'; t['\u2F5B'] = '\u7259'; t['\u2F5C'] = '\u725B'; t['\u2F5D'] = '\u72AC'; t['\u2F5E'] = '\u7384'; t['\u2F5F'] = '\u7389'; t['\u2F60'] = '\u74DC'; t['\u2F61'] = '\u74E6'; t['\u2F62'] = '\u7518'; t['\u2F63'] = '\u751F'; t['\u2F64'] = '\u7528'; t['\u2F65'] = '\u7530'; t['\u2F66'] = '\u758B'; t['\u2F67'] = '\u7592'; t['\u2F68'] = '\u7676'; t['\u2F69'] = '\u767D'; t['\u2F6A'] = '\u76AE'; t['\u2F6B'] = '\u76BF'; t['\u2F6C'] = '\u76EE'; t['\u2F6D'] = '\u77DB'; t['\u2F6E'] = '\u77E2'; t['\u2F6F'] = '\u77F3'; t['\u2F70'] = '\u793A'; t['\u2F71'] = '\u79B8'; t['\u2F72'] = '\u79BE'; t['\u2F73'] = '\u7A74'; t['\u2F74'] = '\u7ACB'; t['\u2F75'] = '\u7AF9'; t['\u2F76'] = '\u7C73'; t['\u2F77'] = '\u7CF8'; t['\u2F78'] = '\u7F36'; t['\u2F79'] = '\u7F51'; t['\u2F7A'] = '\u7F8A'; t['\u2F7B'] = '\u7FBD'; t['\u2F7C'] = '\u8001'; t['\u2F7D'] = '\u800C'; t['\u2F7E'] = '\u8012'; t['\u2F7F'] = '\u8033'; t['\u2F80'] = '\u807F'; t['\u2F81'] = '\u8089'; t['\u2F82'] = '\u81E3'; t['\u2F83'] = '\u81EA'; t['\u2F84'] = '\u81F3'; t['\u2F85'] = '\u81FC'; t['\u2F86'] = '\u820C'; t['\u2F87'] = '\u821B'; t['\u2F88'] = '\u821F'; t['\u2F89'] = '\u826E'; t['\u2F8A'] = '\u8272'; t['\u2F8B'] = '\u8278'; t['\u2F8C'] = '\u864D'; t['\u2F8D'] = '\u866B'; t['\u2F8E'] = '\u8840'; t['\u2F8F'] = '\u884C'; t['\u2F90'] = '\u8863'; t['\u2F91'] = '\u897E'; t['\u2F92'] = '\u898B'; t['\u2F93'] = '\u89D2'; t['\u2F94'] = '\u8A00'; t['\u2F95'] = '\u8C37'; t['\u2F96'] = '\u8C46'; t['\u2F97'] = '\u8C55'; t['\u2F98'] = '\u8C78'; t['\u2F99'] = '\u8C9D'; t['\u2F9A'] = '\u8D64'; t['\u2F9B'] = '\u8D70'; t['\u2F9C'] = '\u8DB3'; t['\u2F9D'] = '\u8EAB'; t['\u2F9E'] = '\u8ECA'; t['\u2F9F'] = '\u8F9B'; t['\u2FA0'] = '\u8FB0'; t['\u2FA1'] = '\u8FB5'; t['\u2FA2'] = '\u9091'; t['\u2FA3'] = '\u9149'; t['\u2FA4'] = '\u91C6'; t['\u2FA5'] = '\u91CC'; t['\u2FA6'] = '\u91D1'; t['\u2FA7'] = '\u9577'; t['\u2FA8'] = '\u9580'; t['\u2FA9'] = '\u961C'; t['\u2FAA'] = '\u96B6'; t['\u2FAB'] = '\u96B9'; t['\u2FAC'] = '\u96E8'; t['\u2FAD'] = '\u9751'; t['\u2FAE'] = '\u975E'; t['\u2FAF'] = '\u9762'; t['\u2FB0'] = '\u9769'; t['\u2FB1'] = '\u97CB'; t['\u2FB2'] = '\u97ED'; t['\u2FB3'] = '\u97F3'; t['\u2FB4'] = '\u9801'; t['\u2FB5'] = '\u98A8'; t['\u2FB6'] = '\u98DB'; t['\u2FB7'] = '\u98DF'; t['\u2FB8'] = '\u9996'; t['\u2FB9'] = '\u9999'; t['\u2FBA'] = '\u99AC'; t['\u2FBB'] = '\u9AA8'; t['\u2FBC'] = '\u9AD8'; t['\u2FBD'] = '\u9ADF'; t['\u2FBE'] = '\u9B25'; t['\u2FBF'] = '\u9B2F'; t['\u2FC0'] = '\u9B32'; t['\u2FC1'] = '\u9B3C'; t['\u2FC2'] = '\u9B5A'; t['\u2FC3'] = '\u9CE5'; t['\u2FC4'] = '\u9E75'; t['\u2FC5'] = '\u9E7F'; t['\u2FC6'] = '\u9EA5'; t['\u2FC7'] = '\u9EBB'; t['\u2FC8'] = '\u9EC3'; t['\u2FC9'] = '\u9ECD'; t['\u2FCA'] = '\u9ED1'; t['\u2FCB'] = '\u9EF9'; t['\u2FCC'] = '\u9EFD'; t['\u2FCD'] = '\u9F0E'; t['\u2FCE'] = '\u9F13'; t['\u2FCF'] = '\u9F20'; t['\u2FD0'] = '\u9F3B'; t['\u2FD1'] = '\u9F4A'; t['\u2FD2'] = '\u9F52'; t['\u2FD3'] = '\u9F8D'; t['\u2FD4'] = '\u9F9C'; t['\u2FD5'] = '\u9FA0'; t['\u3036'] = '\u3012'; t['\u3038'] = '\u5341'; t['\u3039'] = '\u5344'; t['\u303A'] = '\u5345'; t['\u309B'] = '\u0020\u3099'; t['\u309C'] = '\u0020\u309A'; t['\u3131'] = '\u1100'; t['\u3132'] = '\u1101'; t['\u3133'] = '\u11AA'; t['\u3134'] = '\u1102'; t['\u3135'] = '\u11AC'; t['\u3136'] = '\u11AD'; t['\u3137'] = '\u1103'; t['\u3138'] = '\u1104'; t['\u3139'] = '\u1105'; t['\u313A'] = '\u11B0'; t['\u313B'] = '\u11B1'; t['\u313C'] = '\u11B2'; t['\u313D'] = '\u11B3'; t['\u313E'] = '\u11B4'; t['\u313F'] = '\u11B5'; t['\u3140'] = '\u111A'; t['\u3141'] = '\u1106'; t['\u3142'] = '\u1107'; t['\u3143'] = '\u1108'; t['\u3144'] = '\u1121'; t['\u3145'] = '\u1109'; t['\u3146'] = '\u110A'; t['\u3147'] = '\u110B'; t['\u3148'] = '\u110C'; t['\u3149'] = '\u110D'; t['\u314A'] = '\u110E'; t['\u314B'] = '\u110F'; t['\u314C'] = '\u1110'; t['\u314D'] = '\u1111'; t['\u314E'] = '\u1112'; t['\u314F'] = '\u1161'; t['\u3150'] = '\u1162'; t['\u3151'] = '\u1163'; t['\u3152'] = '\u1164'; t['\u3153'] = '\u1165'; t['\u3154'] = '\u1166'; t['\u3155'] = '\u1167'; t['\u3156'] = '\u1168'; t['\u3157'] = '\u1169'; t['\u3158'] = '\u116A'; t['\u3159'] = '\u116B'; t['\u315A'] = '\u116C'; t['\u315B'] = '\u116D'; t['\u315C'] = '\u116E'; t['\u315D'] = '\u116F'; t['\u315E'] = '\u1170'; t['\u315F'] = '\u1171'; t['\u3160'] = '\u1172'; t['\u3161'] = '\u1173'; t['\u3162'] = '\u1174'; t['\u3163'] = '\u1175'; t['\u3164'] = '\u1160'; t['\u3165'] = '\u1114'; t['\u3166'] = '\u1115'; t['\u3167'] = '\u11C7'; t['\u3168'] = '\u11C8'; t['\u3169'] = '\u11CC'; t['\u316A'] = '\u11CE'; t['\u316B'] = '\u11D3'; t['\u316C'] = '\u11D7'; t['\u316D'] = '\u11D9'; t['\u316E'] = '\u111C'; t['\u316F'] = '\u11DD'; t['\u3170'] = '\u11DF'; t['\u3171'] = '\u111D'; t['\u3172'] = '\u111E'; t['\u3173'] = '\u1120'; t['\u3174'] = '\u1122'; t['\u3175'] = '\u1123'; t['\u3176'] = '\u1127'; t['\u3177'] = '\u1129'; t['\u3178'] = '\u112B'; t['\u3179'] = '\u112C'; t['\u317A'] = '\u112D'; t['\u317B'] = '\u112E'; t['\u317C'] = '\u112F'; t['\u317D'] = '\u1132'; t['\u317E'] = '\u1136'; t['\u317F'] = '\u1140'; t['\u3180'] = '\u1147'; t['\u3181'] = '\u114C'; t['\u3182'] = '\u11F1'; t['\u3183'] = '\u11F2'; t['\u3184'] = '\u1157'; t['\u3185'] = '\u1158'; t['\u3186'] = '\u1159'; t['\u3187'] = '\u1184'; t['\u3188'] = '\u1185'; t['\u3189'] = '\u1188'; t['\u318A'] = '\u1191'; t['\u318B'] = '\u1192'; t['\u318C'] = '\u1194'; t['\u318D'] = '\u119E'; t['\u318E'] = '\u11A1'; t['\u3200'] = '\u0028\u1100\u0029'; t['\u3201'] = '\u0028\u1102\u0029'; t['\u3202'] = '\u0028\u1103\u0029'; t['\u3203'] = '\u0028\u1105\u0029'; t['\u3204'] = '\u0028\u1106\u0029'; t['\u3205'] = '\u0028\u1107\u0029'; t['\u3206'] = '\u0028\u1109\u0029'; t['\u3207'] = '\u0028\u110B\u0029'; t['\u3208'] = '\u0028\u110C\u0029'; t['\u3209'] = '\u0028\u110E\u0029'; t['\u320A'] = '\u0028\u110F\u0029'; t['\u320B'] = '\u0028\u1110\u0029'; t['\u320C'] = '\u0028\u1111\u0029'; t['\u320D'] = '\u0028\u1112\u0029'; t['\u320E'] = '\u0028\u1100\u1161\u0029'; t['\u320F'] = '\u0028\u1102\u1161\u0029'; t['\u3210'] = '\u0028\u1103\u1161\u0029'; t['\u3211'] = '\u0028\u1105\u1161\u0029'; t['\u3212'] = '\u0028\u1106\u1161\u0029'; t['\u3213'] = '\u0028\u1107\u1161\u0029'; t['\u3214'] = '\u0028\u1109\u1161\u0029'; t['\u3215'] = '\u0028\u110B\u1161\u0029'; t['\u3216'] = '\u0028\u110C\u1161\u0029'; t['\u3217'] = '\u0028\u110E\u1161\u0029'; t['\u3218'] = '\u0028\u110F\u1161\u0029'; t['\u3219'] = '\u0028\u1110\u1161\u0029'; t['\u321A'] = '\u0028\u1111\u1161\u0029'; t['\u321B'] = '\u0028\u1112\u1161\u0029'; t['\u321C'] = '\u0028\u110C\u116E\u0029'; t['\u321D'] = '\u0028\u110B\u1169\u110C\u1165\u11AB\u0029'; t['\u321E'] = '\u0028\u110B\u1169\u1112\u116E\u0029'; t['\u3220'] = '\u0028\u4E00\u0029'; t['\u3221'] = '\u0028\u4E8C\u0029'; t['\u3222'] = '\u0028\u4E09\u0029'; t['\u3223'] = '\u0028\u56DB\u0029'; t['\u3224'] = '\u0028\u4E94\u0029'; t['\u3225'] = '\u0028\u516D\u0029'; t['\u3226'] = '\u0028\u4E03\u0029'; t['\u3227'] = '\u0028\u516B\u0029'; t['\u3228'] = '\u0028\u4E5D\u0029'; t['\u3229'] = '\u0028\u5341\u0029'; t['\u322A'] = '\u0028\u6708\u0029'; t['\u322B'] = '\u0028\u706B\u0029'; t['\u322C'] = '\u0028\u6C34\u0029'; t['\u322D'] = '\u0028\u6728\u0029'; t['\u322E'] = '\u0028\u91D1\u0029'; t['\u322F'] = '\u0028\u571F\u0029'; t['\u3230'] = '\u0028\u65E5\u0029'; t['\u3231'] = '\u0028\u682A\u0029'; t['\u3232'] = '\u0028\u6709\u0029'; t['\u3233'] = '\u0028\u793E\u0029'; t['\u3234'] = '\u0028\u540D\u0029'; t['\u3235'] = '\u0028\u7279\u0029'; t['\u3236'] = '\u0028\u8CA1\u0029'; t['\u3237'] = '\u0028\u795D\u0029'; t['\u3238'] = '\u0028\u52B4\u0029'; t['\u3239'] = '\u0028\u4EE3\u0029'; t['\u323A'] = '\u0028\u547C\u0029'; t['\u323B'] = '\u0028\u5B66\u0029'; t['\u323C'] = '\u0028\u76E3\u0029'; t['\u323D'] = '\u0028\u4F01\u0029'; t['\u323E'] = '\u0028\u8CC7\u0029'; t['\u323F'] = '\u0028\u5354\u0029'; t['\u3240'] = '\u0028\u796D\u0029'; t['\u3241'] = '\u0028\u4F11\u0029'; t['\u3242'] = '\u0028\u81EA\u0029'; t['\u3243'] = '\u0028\u81F3\u0029'; t['\u32C0'] = '\u0031\u6708'; t['\u32C1'] = '\u0032\u6708'; t['\u32C2'] = '\u0033\u6708'; t['\u32C3'] = '\u0034\u6708'; t['\u32C4'] = '\u0035\u6708'; t['\u32C5'] = '\u0036\u6708'; t['\u32C6'] = '\u0037\u6708'; t['\u32C7'] = '\u0038\u6708'; t['\u32C8'] = '\u0039\u6708'; t['\u32C9'] = '\u0031\u0030\u6708'; t['\u32CA'] = '\u0031\u0031\u6708'; t['\u32CB'] = '\u0031\u0032\u6708'; t['\u3358'] = '\u0030\u70B9'; t['\u3359'] = '\u0031\u70B9'; t['\u335A'] = '\u0032\u70B9'; t['\u335B'] = '\u0033\u70B9'; t['\u335C'] = '\u0034\u70B9'; t['\u335D'] = '\u0035\u70B9'; t['\u335E'] = '\u0036\u70B9'; t['\u335F'] = '\u0037\u70B9'; t['\u3360'] = '\u0038\u70B9'; t['\u3361'] = '\u0039\u70B9'; t['\u3362'] = '\u0031\u0030\u70B9'; t['\u3363'] = '\u0031\u0031\u70B9'; t['\u3364'] = '\u0031\u0032\u70B9'; t['\u3365'] = '\u0031\u0033\u70B9'; t['\u3366'] = '\u0031\u0034\u70B9'; t['\u3367'] = '\u0031\u0035\u70B9'; t['\u3368'] = '\u0031\u0036\u70B9'; t['\u3369'] = '\u0031\u0037\u70B9'; t['\u336A'] = '\u0031\u0038\u70B9'; t['\u336B'] = '\u0031\u0039\u70B9'; t['\u336C'] = '\u0032\u0030\u70B9'; t['\u336D'] = '\u0032\u0031\u70B9'; t['\u336E'] = '\u0032\u0032\u70B9'; t['\u336F'] = '\u0032\u0033\u70B9'; t['\u3370'] = '\u0032\u0034\u70B9'; t['\u33E0'] = '\u0031\u65E5'; t['\u33E1'] = '\u0032\u65E5'; t['\u33E2'] = '\u0033\u65E5'; t['\u33E3'] = '\u0034\u65E5'; t['\u33E4'] = '\u0035\u65E5'; t['\u33E5'] = '\u0036\u65E5'; t['\u33E6'] = '\u0037\u65E5'; t['\u33E7'] = '\u0038\u65E5'; t['\u33E8'] = '\u0039\u65E5'; t['\u33E9'] = '\u0031\u0030\u65E5'; t['\u33EA'] = '\u0031\u0031\u65E5'; t['\u33EB'] = '\u0031\u0032\u65E5'; t['\u33EC'] = '\u0031\u0033\u65E5'; t['\u33ED'] = '\u0031\u0034\u65E5'; t['\u33EE'] = '\u0031\u0035\u65E5'; t['\u33EF'] = '\u0031\u0036\u65E5'; t['\u33F0'] = '\u0031\u0037\u65E5'; t['\u33F1'] = '\u0031\u0038\u65E5'; t['\u33F2'] = '\u0031\u0039\u65E5'; t['\u33F3'] = '\u0032\u0030\u65E5'; t['\u33F4'] = '\u0032\u0031\u65E5'; t['\u33F5'] = '\u0032\u0032\u65E5'; t['\u33F6'] = '\u0032\u0033\u65E5'; t['\u33F7'] = '\u0032\u0034\u65E5'; t['\u33F8'] = '\u0032\u0035\u65E5'; t['\u33F9'] = '\u0032\u0036\u65E5'; t['\u33FA'] = '\u0032\u0037\u65E5'; t['\u33FB'] = '\u0032\u0038\u65E5'; t['\u33FC'] = '\u0032\u0039\u65E5'; t['\u33FD'] = '\u0033\u0030\u65E5'; t['\u33FE'] = '\u0033\u0031\u65E5'; t['\uFB00'] = '\u0066\u0066'; t['\uFB01'] = '\u0066\u0069'; t['\uFB02'] = '\u0066\u006C'; t['\uFB03'] = '\u0066\u0066\u0069'; t['\uFB04'] = '\u0066\u0066\u006C'; t['\uFB05'] = '\u017F\u0074'; t['\uFB06'] = '\u0073\u0074'; t['\uFB13'] = '\u0574\u0576'; t['\uFB14'] = '\u0574\u0565'; t['\uFB15'] = '\u0574\u056B'; t['\uFB16'] = '\u057E\u0576'; t['\uFB17'] = '\u0574\u056D'; t['\uFB4F'] = '\u05D0\u05DC'; t['\uFB50'] = '\u0671'; t['\uFB51'] = '\u0671'; t['\uFB52'] = '\u067B'; t['\uFB53'] = '\u067B'; t['\uFB54'] = '\u067B'; t['\uFB55'] = '\u067B'; t['\uFB56'] = '\u067E'; t['\uFB57'] = '\u067E'; t['\uFB58'] = '\u067E'; t['\uFB59'] = '\u067E'; t['\uFB5A'] = '\u0680'; t['\uFB5B'] = '\u0680'; t['\uFB5C'] = '\u0680'; t['\uFB5D'] = '\u0680'; t['\uFB5E'] = '\u067A'; t['\uFB5F'] = '\u067A'; t['\uFB60'] = '\u067A'; t['\uFB61'] = '\u067A'; t['\uFB62'] = '\u067F'; t['\uFB63'] = '\u067F'; t['\uFB64'] = '\u067F'; t['\uFB65'] = '\u067F'; t['\uFB66'] = '\u0679'; t['\uFB67'] = '\u0679'; t['\uFB68'] = '\u0679'; t['\uFB69'] = '\u0679'; t['\uFB6A'] = '\u06A4'; t['\uFB6B'] = '\u06A4'; t['\uFB6C'] = '\u06A4'; t['\uFB6D'] = '\u06A4'; t['\uFB6E'] = '\u06A6'; t['\uFB6F'] = '\u06A6'; t['\uFB70'] = '\u06A6'; t['\uFB71'] = '\u06A6'; t['\uFB72'] = '\u0684'; t['\uFB73'] = '\u0684'; t['\uFB74'] = '\u0684'; t['\uFB75'] = '\u0684'; t['\uFB76'] = '\u0683'; t['\uFB77'] = '\u0683'; t['\uFB78'] = '\u0683'; t['\uFB79'] = '\u0683'; t['\uFB7A'] = '\u0686'; t['\uFB7B'] = '\u0686'; t['\uFB7C'] = '\u0686'; t['\uFB7D'] = '\u0686'; t['\uFB7E'] = '\u0687'; t['\uFB7F'] = '\u0687'; t['\uFB80'] = '\u0687'; t['\uFB81'] = '\u0687'; t['\uFB82'] = '\u068D'; t['\uFB83'] = '\u068D'; t['\uFB84'] = '\u068C'; t['\uFB85'] = '\u068C'; t['\uFB86'] = '\u068E'; t['\uFB87'] = '\u068E'; t['\uFB88'] = '\u0688'; t['\uFB89'] = '\u0688'; t['\uFB8A'] = '\u0698'; t['\uFB8B'] = '\u0698'; t['\uFB8C'] = '\u0691'; t['\uFB8D'] = '\u0691'; t['\uFB8E'] = '\u06A9'; t['\uFB8F'] = '\u06A9'; t['\uFB90'] = '\u06A9'; t['\uFB91'] = '\u06A9'; t['\uFB92'] = '\u06AF'; t['\uFB93'] = '\u06AF'; t['\uFB94'] = '\u06AF'; t['\uFB95'] = '\u06AF'; t['\uFB96'] = '\u06B3'; t['\uFB97'] = '\u06B3'; t['\uFB98'] = '\u06B3'; t['\uFB99'] = '\u06B3'; t['\uFB9A'] = '\u06B1'; t['\uFB9B'] = '\u06B1'; t['\uFB9C'] = '\u06B1'; t['\uFB9D'] = '\u06B1'; t['\uFB9E'] = '\u06BA'; t['\uFB9F'] = '\u06BA'; t['\uFBA0'] = '\u06BB'; t['\uFBA1'] = '\u06BB'; t['\uFBA2'] = '\u06BB'; t['\uFBA3'] = '\u06BB'; t['\uFBA4'] = '\u06C0'; t['\uFBA5'] = '\u06C0'; t['\uFBA6'] = '\u06C1'; t['\uFBA7'] = '\u06C1'; t['\uFBA8'] = '\u06C1'; t['\uFBA9'] = '\u06C1'; t['\uFBAA'] = '\u06BE'; t['\uFBAB'] = '\u06BE'; t['\uFBAC'] = '\u06BE'; t['\uFBAD'] = '\u06BE'; t['\uFBAE'] = '\u06D2'; t['\uFBAF'] = '\u06D2'; t['\uFBB0'] = '\u06D3'; t['\uFBB1'] = '\u06D3'; t['\uFBD3'] = '\u06AD'; t['\uFBD4'] = '\u06AD'; t['\uFBD5'] = '\u06AD'; t['\uFBD6'] = '\u06AD'; t['\uFBD7'] = '\u06C7'; t['\uFBD8'] = '\u06C7'; t['\uFBD9'] = '\u06C6'; t['\uFBDA'] = '\u06C6'; t['\uFBDB'] = '\u06C8'; t['\uFBDC'] = '\u06C8'; t['\uFBDD'] = '\u0677'; t['\uFBDE'] = '\u06CB'; t['\uFBDF'] = '\u06CB'; t['\uFBE0'] = '\u06C5'; t['\uFBE1'] = '\u06C5'; t['\uFBE2'] = '\u06C9'; t['\uFBE3'] = '\u06C9'; t['\uFBE4'] = '\u06D0'; t['\uFBE5'] = '\u06D0'; t['\uFBE6'] = '\u06D0'; t['\uFBE7'] = '\u06D0'; t['\uFBE8'] = '\u0649'; t['\uFBE9'] = '\u0649'; t['\uFBEA'] = '\u0626\u0627'; t['\uFBEB'] = '\u0626\u0627'; t['\uFBEC'] = '\u0626\u06D5'; t['\uFBED'] = '\u0626\u06D5'; t['\uFBEE'] = '\u0626\u0648'; t['\uFBEF'] = '\u0626\u0648'; t['\uFBF0'] = '\u0626\u06C7'; t['\uFBF1'] = '\u0626\u06C7'; t['\uFBF2'] = '\u0626\u06C6'; t['\uFBF3'] = '\u0626\u06C6'; t['\uFBF4'] = '\u0626\u06C8'; t['\uFBF5'] = '\u0626\u06C8'; t['\uFBF6'] = '\u0626\u06D0'; t['\uFBF7'] = '\u0626\u06D0'; t['\uFBF8'] = '\u0626\u06D0'; t['\uFBF9'] = '\u0626\u0649'; t['\uFBFA'] = '\u0626\u0649'; t['\uFBFB'] = '\u0626\u0649'; t['\uFBFC'] = '\u06CC'; t['\uFBFD'] = '\u06CC'; t['\uFBFE'] = '\u06CC'; t['\uFBFF'] = '\u06CC'; t['\uFC00'] = '\u0626\u062C'; t['\uFC01'] = '\u0626\u062D'; t['\uFC02'] = '\u0626\u0645'; t['\uFC03'] = '\u0626\u0649'; t['\uFC04'] = '\u0626\u064A'; t['\uFC05'] = '\u0628\u062C'; t['\uFC06'] = '\u0628\u062D'; t['\uFC07'] = '\u0628\u062E'; t['\uFC08'] = '\u0628\u0645'; t['\uFC09'] = '\u0628\u0649'; t['\uFC0A'] = '\u0628\u064A'; t['\uFC0B'] = '\u062A\u062C'; t['\uFC0C'] = '\u062A\u062D'; t['\uFC0D'] = '\u062A\u062E'; t['\uFC0E'] = '\u062A\u0645'; t['\uFC0F'] = '\u062A\u0649'; t['\uFC10'] = '\u062A\u064A'; t['\uFC11'] = '\u062B\u062C'; t['\uFC12'] = '\u062B\u0645'; t['\uFC13'] = '\u062B\u0649'; t['\uFC14'] = '\u062B\u064A'; t['\uFC15'] = '\u062C\u062D'; t['\uFC16'] = '\u062C\u0645'; t['\uFC17'] = '\u062D\u062C'; t['\uFC18'] = '\u062D\u0645'; t['\uFC19'] = '\u062E\u062C'; t['\uFC1A'] = '\u062E\u062D'; t['\uFC1B'] = '\u062E\u0645'; t['\uFC1C'] = '\u0633\u062C'; t['\uFC1D'] = '\u0633\u062D'; t['\uFC1E'] = '\u0633\u062E'; t['\uFC1F'] = '\u0633\u0645'; t['\uFC20'] = '\u0635\u062D'; t['\uFC21'] = '\u0635\u0645'; t['\uFC22'] = '\u0636\u062C'; t['\uFC23'] = '\u0636\u062D'; t['\uFC24'] = '\u0636\u062E'; t['\uFC25'] = '\u0636\u0645'; t['\uFC26'] = '\u0637\u062D'; t['\uFC27'] = '\u0637\u0645'; t['\uFC28'] = '\u0638\u0645'; t['\uFC29'] = '\u0639\u062C'; t['\uFC2A'] = '\u0639\u0645'; t['\uFC2B'] = '\u063A\u062C'; t['\uFC2C'] = '\u063A\u0645'; t['\uFC2D'] = '\u0641\u062C'; t['\uFC2E'] = '\u0641\u062D'; t['\uFC2F'] = '\u0641\u062E'; t['\uFC30'] = '\u0641\u0645'; t['\uFC31'] = '\u0641\u0649'; t['\uFC32'] = '\u0641\u064A'; t['\uFC33'] = '\u0642\u062D'; t['\uFC34'] = '\u0642\u0645'; t['\uFC35'] = '\u0642\u0649'; t['\uFC36'] = '\u0642\u064A'; t['\uFC37'] = '\u0643\u0627'; t['\uFC38'] = '\u0643\u062C'; t['\uFC39'] = '\u0643\u062D'; t['\uFC3A'] = '\u0643\u062E'; t['\uFC3B'] = '\u0643\u0644'; t['\uFC3C'] = '\u0643\u0645'; t['\uFC3D'] = '\u0643\u0649'; t['\uFC3E'] = '\u0643\u064A'; t['\uFC3F'] = '\u0644\u062C'; t['\uFC40'] = '\u0644\u062D'; t['\uFC41'] = '\u0644\u062E'; t['\uFC42'] = '\u0644\u0645'; t['\uFC43'] = '\u0644\u0649'; t['\uFC44'] = '\u0644\u064A'; t['\uFC45'] = '\u0645\u062C'; t['\uFC46'] = '\u0645\u062D'; t['\uFC47'] = '\u0645\u062E'; t['\uFC48'] = '\u0645\u0645'; t['\uFC49'] = '\u0645\u0649'; t['\uFC4A'] = '\u0645\u064A'; t['\uFC4B'] = '\u0646\u062C'; t['\uFC4C'] = '\u0646\u062D'; t['\uFC4D'] = '\u0646\u062E'; t['\uFC4E'] = '\u0646\u0645'; t['\uFC4F'] = '\u0646\u0649'; t['\uFC50'] = '\u0646\u064A'; t['\uFC51'] = '\u0647\u062C'; t['\uFC52'] = '\u0647\u0645'; t['\uFC53'] = '\u0647\u0649'; t['\uFC54'] = '\u0647\u064A'; t['\uFC55'] = '\u064A\u062C'; t['\uFC56'] = '\u064A\u062D'; t['\uFC57'] = '\u064A\u062E'; t['\uFC58'] = '\u064A\u0645'; t['\uFC59'] = '\u064A\u0649'; t['\uFC5A'] = '\u064A\u064A'; t['\uFC5B'] = '\u0630\u0670'; t['\uFC5C'] = '\u0631\u0670'; t['\uFC5D'] = '\u0649\u0670'; t['\uFC5E'] = '\u0020\u064C\u0651'; t['\uFC5F'] = '\u0020\u064D\u0651'; t['\uFC60'] = '\u0020\u064E\u0651'; t['\uFC61'] = '\u0020\u064F\u0651'; t['\uFC62'] = '\u0020\u0650\u0651'; t['\uFC63'] = '\u0020\u0651\u0670'; t['\uFC64'] = '\u0626\u0631'; t['\uFC65'] = '\u0626\u0632'; t['\uFC66'] = '\u0626\u0645'; t['\uFC67'] = '\u0626\u0646'; t['\uFC68'] = '\u0626\u0649'; t['\uFC69'] = '\u0626\u064A'; t['\uFC6A'] = '\u0628\u0631'; t['\uFC6B'] = '\u0628\u0632'; t['\uFC6C'] = '\u0628\u0645'; t['\uFC6D'] = '\u0628\u0646'; t['\uFC6E'] = '\u0628\u0649'; t['\uFC6F'] = '\u0628\u064A'; t['\uFC70'] = '\u062A\u0631'; t['\uFC71'] = '\u062A\u0632'; t['\uFC72'] = '\u062A\u0645'; t['\uFC73'] = '\u062A\u0646'; t['\uFC74'] = '\u062A\u0649'; t['\uFC75'] = '\u062A\u064A'; t['\uFC76'] = '\u062B\u0631'; t['\uFC77'] = '\u062B\u0632'; t['\uFC78'] = '\u062B\u0645'; t['\uFC79'] = '\u062B\u0646'; t['\uFC7A'] = '\u062B\u0649'; t['\uFC7B'] = '\u062B\u064A'; t['\uFC7C'] = '\u0641\u0649'; t['\uFC7D'] = '\u0641\u064A'; t['\uFC7E'] = '\u0642\u0649'; t['\uFC7F'] = '\u0642\u064A'; t['\uFC80'] = '\u0643\u0627'; t['\uFC81'] = '\u0643\u0644'; t['\uFC82'] = '\u0643\u0645'; t['\uFC83'] = '\u0643\u0649'; t['\uFC84'] = '\u0643\u064A'; t['\uFC85'] = '\u0644\u0645'; t['\uFC86'] = '\u0644\u0649'; t['\uFC87'] = '\u0644\u064A'; t['\uFC88'] = '\u0645\u0627'; t['\uFC89'] = '\u0645\u0645'; t['\uFC8A'] = '\u0646\u0631'; t['\uFC8B'] = '\u0646\u0632'; t['\uFC8C'] = '\u0646\u0645'; t['\uFC8D'] = '\u0646\u0646'; t['\uFC8E'] = '\u0646\u0649'; t['\uFC8F'] = '\u0646\u064A'; t['\uFC90'] = '\u0649\u0670'; t['\uFC91'] = '\u064A\u0631'; t['\uFC92'] = '\u064A\u0632'; t['\uFC93'] = '\u064A\u0645'; t['\uFC94'] = '\u064A\u0646'; t['\uFC95'] = '\u064A\u0649'; t['\uFC96'] = '\u064A\u064A'; t['\uFC97'] = '\u0626\u062C'; t['\uFC98'] = '\u0626\u062D'; t['\uFC99'] = '\u0626\u062E'; t['\uFC9A'] = '\u0626\u0645'; t['\uFC9B'] = '\u0626\u0647'; t['\uFC9C'] = '\u0628\u062C'; t['\uFC9D'] = '\u0628\u062D'; t['\uFC9E'] = '\u0628\u062E'; t['\uFC9F'] = '\u0628\u0645'; t['\uFCA0'] = '\u0628\u0647'; t['\uFCA1'] = '\u062A\u062C'; t['\uFCA2'] = '\u062A\u062D'; t['\uFCA3'] = '\u062A\u062E'; t['\uFCA4'] = '\u062A\u0645'; t['\uFCA5'] = '\u062A\u0647'; t['\uFCA6'] = '\u062B\u0645'; t['\uFCA7'] = '\u062C\u062D'; t['\uFCA8'] = '\u062C\u0645'; t['\uFCA9'] = '\u062D\u062C'; t['\uFCAA'] = '\u062D\u0645'; t['\uFCAB'] = '\u062E\u062C'; t['\uFCAC'] = '\u062E\u0645'; t['\uFCAD'] = '\u0633\u062C'; t['\uFCAE'] = '\u0633\u062D'; t['\uFCAF'] = '\u0633\u062E'; t['\uFCB0'] = '\u0633\u0645'; t['\uFCB1'] = '\u0635\u062D'; t['\uFCB2'] = '\u0635\u062E'; t['\uFCB3'] = '\u0635\u0645'; t['\uFCB4'] = '\u0636\u062C'; t['\uFCB5'] = '\u0636\u062D'; t['\uFCB6'] = '\u0636\u062E'; t['\uFCB7'] = '\u0636\u0645'; t['\uFCB8'] = '\u0637\u062D'; t['\uFCB9'] = '\u0638\u0645'; t['\uFCBA'] = '\u0639\u062C'; t['\uFCBB'] = '\u0639\u0645'; t['\uFCBC'] = '\u063A\u062C'; t['\uFCBD'] = '\u063A\u0645'; t['\uFCBE'] = '\u0641\u062C'; t['\uFCBF'] = '\u0641\u062D'; t['\uFCC0'] = '\u0641\u062E'; t['\uFCC1'] = '\u0641\u0645'; t['\uFCC2'] = '\u0642\u062D'; t['\uFCC3'] = '\u0642\u0645'; t['\uFCC4'] = '\u0643\u062C'; t['\uFCC5'] = '\u0643\u062D'; t['\uFCC6'] = '\u0643\u062E'; t['\uFCC7'] = '\u0643\u0644'; t['\uFCC8'] = '\u0643\u0645'; t['\uFCC9'] = '\u0644\u062C'; t['\uFCCA'] = '\u0644\u062D'; t['\uFCCB'] = '\u0644\u062E'; t['\uFCCC'] = '\u0644\u0645'; t['\uFCCD'] = '\u0644\u0647'; t['\uFCCE'] = '\u0645\u062C'; t['\uFCCF'] = '\u0645\u062D'; t['\uFCD0'] = '\u0645\u062E'; t['\uFCD1'] = '\u0645\u0645'; t['\uFCD2'] = '\u0646\u062C'; t['\uFCD3'] = '\u0646\u062D'; t['\uFCD4'] = '\u0646\u062E'; t['\uFCD5'] = '\u0646\u0645'; t['\uFCD6'] = '\u0646\u0647'; t['\uFCD7'] = '\u0647\u062C'; t['\uFCD8'] = '\u0647\u0645'; t['\uFCD9'] = '\u0647\u0670'; t['\uFCDA'] = '\u064A\u062C'; t['\uFCDB'] = '\u064A\u062D'; t['\uFCDC'] = '\u064A\u062E'; t['\uFCDD'] = '\u064A\u0645'; t['\uFCDE'] = '\u064A\u0647'; t['\uFCDF'] = '\u0626\u0645'; t['\uFCE0'] = '\u0626\u0647'; t['\uFCE1'] = '\u0628\u0645'; t['\uFCE2'] = '\u0628\u0647'; t['\uFCE3'] = '\u062A\u0645'; t['\uFCE4'] = '\u062A\u0647'; t['\uFCE5'] = '\u062B\u0645'; t['\uFCE6'] = '\u062B\u0647'; t['\uFCE7'] = '\u0633\u0645'; t['\uFCE8'] = '\u0633\u0647'; t['\uFCE9'] = '\u0634\u0645'; t['\uFCEA'] = '\u0634\u0647'; t['\uFCEB'] = '\u0643\u0644'; t['\uFCEC'] = '\u0643\u0645'; t['\uFCED'] = '\u0644\u0645'; t['\uFCEE'] = '\u0646\u0645'; t['\uFCEF'] = '\u0646\u0647'; t['\uFCF0'] = '\u064A\u0645'; t['\uFCF1'] = '\u064A\u0647'; t['\uFCF2'] = '\u0640\u064E\u0651'; t['\uFCF3'] = '\u0640\u064F\u0651'; t['\uFCF4'] = '\u0640\u0650\u0651'; t['\uFCF5'] = '\u0637\u0649'; t['\uFCF6'] = '\u0637\u064A'; t['\uFCF7'] = '\u0639\u0649'; t['\uFCF8'] = '\u0639\u064A'; t['\uFCF9'] = '\u063A\u0649'; t['\uFCFA'] = '\u063A\u064A'; t['\uFCFB'] = '\u0633\u0649'; t['\uFCFC'] = '\u0633\u064A'; t['\uFCFD'] = '\u0634\u0649'; t['\uFCFE'] = '\u0634\u064A'; t['\uFCFF'] = '\u062D\u0649'; t['\uFD00'] = '\u062D\u064A'; t['\uFD01'] = '\u062C\u0649'; t['\uFD02'] = '\u062C\u064A'; t['\uFD03'] = '\u062E\u0649'; t['\uFD04'] = '\u062E\u064A'; t['\uFD05'] = '\u0635\u0649'; t['\uFD06'] = '\u0635\u064A'; t['\uFD07'] = '\u0636\u0649'; t['\uFD08'] = '\u0636\u064A'; t['\uFD09'] = '\u0634\u062C'; t['\uFD0A'] = '\u0634\u062D'; t['\uFD0B'] = '\u0634\u062E'; t['\uFD0C'] = '\u0634\u0645'; t['\uFD0D'] = '\u0634\u0631'; t['\uFD0E'] = '\u0633\u0631'; t['\uFD0F'] = '\u0635\u0631'; t['\uFD10'] = '\u0636\u0631'; t['\uFD11'] = '\u0637\u0649'; t['\uFD12'] = '\u0637\u064A'; t['\uFD13'] = '\u0639\u0649'; t['\uFD14'] = '\u0639\u064A'; t['\uFD15'] = '\u063A\u0649'; t['\uFD16'] = '\u063A\u064A'; t['\uFD17'] = '\u0633\u0649'; t['\uFD18'] = '\u0633\u064A'; t['\uFD19'] = '\u0634\u0649'; t['\uFD1A'] = '\u0634\u064A'; t['\uFD1B'] = '\u062D\u0649'; t['\uFD1C'] = '\u062D\u064A'; t['\uFD1D'] = '\u062C\u0649'; t['\uFD1E'] = '\u062C\u064A'; t['\uFD1F'] = '\u062E\u0649'; t['\uFD20'] = '\u062E\u064A'; t['\uFD21'] = '\u0635\u0649'; t['\uFD22'] = '\u0635\u064A'; t['\uFD23'] = '\u0636\u0649'; t['\uFD24'] = '\u0636\u064A'; t['\uFD25'] = '\u0634\u062C'; t['\uFD26'] = '\u0634\u062D'; t['\uFD27'] = '\u0634\u062E'; t['\uFD28'] = '\u0634\u0645'; t['\uFD29'] = '\u0634\u0631'; t['\uFD2A'] = '\u0633\u0631'; t['\uFD2B'] = '\u0635\u0631'; t['\uFD2C'] = '\u0636\u0631'; t['\uFD2D'] = '\u0634\u062C'; t['\uFD2E'] = '\u0634\u062D'; t['\uFD2F'] = '\u0634\u062E'; t['\uFD30'] = '\u0634\u0645'; t['\uFD31'] = '\u0633\u0647'; t['\uFD32'] = '\u0634\u0647'; t['\uFD33'] = '\u0637\u0645'; t['\uFD34'] = '\u0633\u062C'; t['\uFD35'] = '\u0633\u062D'; t['\uFD36'] = '\u0633\u062E'; t['\uFD37'] = '\u0634\u062C'; t['\uFD38'] = '\u0634\u062D'; t['\uFD39'] = '\u0634\u062E'; t['\uFD3A'] = '\u0637\u0645'; t['\uFD3B'] = '\u0638\u0645'; t['\uFD3C'] = '\u0627\u064B'; t['\uFD3D'] = '\u0627\u064B'; t['\uFD50'] = '\u062A\u062C\u0645'; t['\uFD51'] = '\u062A\u062D\u062C'; t['\uFD52'] = '\u062A\u062D\u062C'; t['\uFD53'] = '\u062A\u062D\u0645'; t['\uFD54'] = '\u062A\u062E\u0645'; t['\uFD55'] = '\u062A\u0645\u062C'; t['\uFD56'] = '\u062A\u0645\u062D'; t['\uFD57'] = '\u062A\u0645\u062E'; t['\uFD58'] = '\u062C\u0645\u062D'; t['\uFD59'] = '\u062C\u0645\u062D'; t['\uFD5A'] = '\u062D\u0645\u064A'; t['\uFD5B'] = '\u062D\u0645\u0649'; t['\uFD5C'] = '\u0633\u062D\u062C'; t['\uFD5D'] = '\u0633\u062C\u062D'; t['\uFD5E'] = '\u0633\u062C\u0649'; t['\uFD5F'] = '\u0633\u0645\u062D'; t['\uFD60'] = '\u0633\u0645\u062D'; t['\uFD61'] = '\u0633\u0645\u062C'; t['\uFD62'] = '\u0633\u0645\u0645'; t['\uFD63'] = '\u0633\u0645\u0645'; t['\uFD64'] = '\u0635\u062D\u062D'; t['\uFD65'] = '\u0635\u062D\u062D'; t['\uFD66'] = '\u0635\u0645\u0645'; t['\uFD67'] = '\u0634\u062D\u0645'; t['\uFD68'] = '\u0634\u062D\u0645'; t['\uFD69'] = '\u0634\u062C\u064A'; t['\uFD6A'] = '\u0634\u0645\u062E'; t['\uFD6B'] = '\u0634\u0645\u062E'; t['\uFD6C'] = '\u0634\u0645\u0645'; t['\uFD6D'] = '\u0634\u0645\u0645'; t['\uFD6E'] = '\u0636\u062D\u0649'; t['\uFD6F'] = '\u0636\u062E\u0645'; t['\uFD70'] = '\u0636\u062E\u0645'; t['\uFD71'] = '\u0637\u0645\u062D'; t['\uFD72'] = '\u0637\u0645\u062D'; t['\uFD73'] = '\u0637\u0645\u0645'; t['\uFD74'] = '\u0637\u0645\u064A'; t['\uFD75'] = '\u0639\u062C\u0645'; t['\uFD76'] = '\u0639\u0645\u0645'; t['\uFD77'] = '\u0639\u0645\u0645'; t['\uFD78'] = '\u0639\u0645\u0649'; t['\uFD79'] = '\u063A\u0645\u0645'; t['\uFD7A'] = '\u063A\u0645\u064A'; t['\uFD7B'] = '\u063A\u0645\u0649'; t['\uFD7C'] = '\u0641\u062E\u0645'; t['\uFD7D'] = '\u0641\u062E\u0645'; t['\uFD7E'] = '\u0642\u0645\u062D'; t['\uFD7F'] = '\u0642\u0645\u0645'; t['\uFD80'] = '\u0644\u062D\u0645'; t['\uFD81'] = '\u0644\u062D\u064A'; t['\uFD82'] = '\u0644\u062D\u0649'; t['\uFD83'] = '\u0644\u062C\u062C'; t['\uFD84'] = '\u0644\u062C\u062C'; t['\uFD85'] = '\u0644\u062E\u0645'; t['\uFD86'] = '\u0644\u062E\u0645'; t['\uFD87'] = '\u0644\u0645\u062D'; t['\uFD88'] = '\u0644\u0645\u062D'; t['\uFD89'] = '\u0645\u062D\u062C'; t['\uFD8A'] = '\u0645\u062D\u0645'; t['\uFD8B'] = '\u0645\u062D\u064A'; t['\uFD8C'] = '\u0645\u062C\u062D'; t['\uFD8D'] = '\u0645\u062C\u0645'; t['\uFD8E'] = '\u0645\u062E\u062C'; t['\uFD8F'] = '\u0645\u062E\u0645'; t['\uFD92'] = '\u0645\u062C\u062E'; t['\uFD93'] = '\u0647\u0645\u062C'; t['\uFD94'] = '\u0647\u0645\u0645'; t['\uFD95'] = '\u0646\u062D\u0645'; t['\uFD96'] = '\u0646\u062D\u0649'; t['\uFD97'] = '\u0646\u062C\u0645'; t['\uFD98'] = '\u0646\u062C\u0645'; t['\uFD99'] = '\u0646\u062C\u0649'; t['\uFD9A'] = '\u0646\u0645\u064A'; t['\uFD9B'] = '\u0646\u0645\u0649'; t['\uFD9C'] = '\u064A\u0645\u0645'; t['\uFD9D'] = '\u064A\u0645\u0645'; t['\uFD9E'] = '\u0628\u062E\u064A'; t['\uFD9F'] = '\u062A\u062C\u064A'; t['\uFDA0'] = '\u062A\u062C\u0649'; t['\uFDA1'] = '\u062A\u062E\u064A'; t['\uFDA2'] = '\u062A\u062E\u0649'; t['\uFDA3'] = '\u062A\u0645\u064A'; t['\uFDA4'] = '\u062A\u0645\u0649'; t['\uFDA5'] = '\u062C\u0645\u064A'; t['\uFDA6'] = '\u062C\u062D\u0649'; t['\uFDA7'] = '\u062C\u0645\u0649'; t['\uFDA8'] = '\u0633\u062E\u0649'; t['\uFDA9'] = '\u0635\u062D\u064A'; t['\uFDAA'] = '\u0634\u062D\u064A'; t['\uFDAB'] = '\u0636\u062D\u064A'; t['\uFDAC'] = '\u0644\u062C\u064A'; t['\uFDAD'] = '\u0644\u0645\u064A'; t['\uFDAE'] = '\u064A\u062D\u064A'; t['\uFDAF'] = '\u064A\u062C\u064A'; t['\uFDB0'] = '\u064A\u0645\u064A'; t['\uFDB1'] = '\u0645\u0645\u064A'; t['\uFDB2'] = '\u0642\u0645\u064A'; t['\uFDB3'] = '\u0646\u062D\u064A'; t['\uFDB4'] = '\u0642\u0645\u062D'; t['\uFDB5'] = '\u0644\u062D\u0645'; t['\uFDB6'] = '\u0639\u0645\u064A'; t['\uFDB7'] = '\u0643\u0645\u064A'; t['\uFDB8'] = '\u0646\u062C\u062D'; t['\uFDB9'] = '\u0645\u062E\u064A'; t['\uFDBA'] = '\u0644\u062C\u0645'; t['\uFDBB'] = '\u0643\u0645\u0645'; t['\uFDBC'] = '\u0644\u062C\u0645'; t['\uFDBD'] = '\u0646\u062C\u062D'; t['\uFDBE'] = '\u062C\u062D\u064A'; t['\uFDBF'] = '\u062D\u062C\u064A'; t['\uFDC0'] = '\u0645\u062C\u064A'; t['\uFDC1'] = '\u0641\u0645\u064A'; t['\uFDC2'] = '\u0628\u062D\u064A'; t['\uFDC3'] = '\u0643\u0645\u0645'; t['\uFDC4'] = '\u0639\u062C\u0645'; t['\uFDC5'] = '\u0635\u0645\u0645'; t['\uFDC6'] = '\u0633\u062E\u064A'; t['\uFDC7'] = '\u0646\u062C\u064A'; t['\uFE49'] = '\u203E'; t['\uFE4A'] = '\u203E'; t['\uFE4B'] = '\u203E'; t['\uFE4C'] = '\u203E'; t['\uFE4D'] = '\u005F'; t['\uFE4E'] = '\u005F'; t['\uFE4F'] = '\u005F'; t['\uFE80'] = '\u0621'; t['\uFE81'] = '\u0622'; t['\uFE82'] = '\u0622'; t['\uFE83'] = '\u0623'; t['\uFE84'] = '\u0623'; t['\uFE85'] = '\u0624'; t['\uFE86'] = '\u0624'; t['\uFE87'] = '\u0625'; t['\uFE88'] = '\u0625'; t['\uFE89'] = '\u0626'; t['\uFE8A'] = '\u0626'; t['\uFE8B'] = '\u0626'; t['\uFE8C'] = '\u0626'; t['\uFE8D'] = '\u0627'; t['\uFE8E'] = '\u0627'; t['\uFE8F'] = '\u0628'; t['\uFE90'] = '\u0628'; t['\uFE91'] = '\u0628'; t['\uFE92'] = '\u0628'; t['\uFE93'] = '\u0629'; t['\uFE94'] = '\u0629'; t['\uFE95'] = '\u062A'; t['\uFE96'] = '\u062A'; t['\uFE97'] = '\u062A'; t['\uFE98'] = '\u062A'; t['\uFE99'] = '\u062B'; t['\uFE9A'] = '\u062B'; t['\uFE9B'] = '\u062B'; t['\uFE9C'] = '\u062B'; t['\uFE9D'] = '\u062C'; t['\uFE9E'] = '\u062C'; t['\uFE9F'] = '\u062C'; t['\uFEA0'] = '\u062C'; t['\uFEA1'] = '\u062D'; t['\uFEA2'] = '\u062D'; t['\uFEA3'] = '\u062D'; t['\uFEA4'] = '\u062D'; t['\uFEA5'] = '\u062E'; t['\uFEA6'] = '\u062E'; t['\uFEA7'] = '\u062E'; t['\uFEA8'] = '\u062E'; t['\uFEA9'] = '\u062F'; t['\uFEAA'] = '\u062F'; t['\uFEAB'] = '\u0630'; t['\uFEAC'] = '\u0630'; t['\uFEAD'] = '\u0631'; t['\uFEAE'] = '\u0631'; t['\uFEAF'] = '\u0632'; t['\uFEB0'] = '\u0632'; t['\uFEB1'] = '\u0633'; t['\uFEB2'] = '\u0633'; t['\uFEB3'] = '\u0633'; t['\uFEB4'] = '\u0633'; t['\uFEB5'] = '\u0634'; t['\uFEB6'] = '\u0634'; t['\uFEB7'] = '\u0634'; t['\uFEB8'] = '\u0634'; t['\uFEB9'] = '\u0635'; t['\uFEBA'] = '\u0635'; t['\uFEBB'] = '\u0635'; t['\uFEBC'] = '\u0635'; t['\uFEBD'] = '\u0636'; t['\uFEBE'] = '\u0636'; t['\uFEBF'] = '\u0636'; t['\uFEC0'] = '\u0636'; t['\uFEC1'] = '\u0637'; t['\uFEC2'] = '\u0637'; t['\uFEC3'] = '\u0637'; t['\uFEC4'] = '\u0637'; t['\uFEC5'] = '\u0638'; t['\uFEC6'] = '\u0638'; t['\uFEC7'] = '\u0638'; t['\uFEC8'] = '\u0638'; t['\uFEC9'] = '\u0639'; t['\uFECA'] = '\u0639'; t['\uFECB'] = '\u0639'; t['\uFECC'] = '\u0639'; t['\uFECD'] = '\u063A'; t['\uFECE'] = '\u063A'; t['\uFECF'] = '\u063A'; t['\uFED0'] = '\u063A'; t['\uFED1'] = '\u0641'; t['\uFED2'] = '\u0641'; t['\uFED3'] = '\u0641'; t['\uFED4'] = '\u0641'; t['\uFED5'] = '\u0642'; t['\uFED6'] = '\u0642'; t['\uFED7'] = '\u0642'; t['\uFED8'] = '\u0642'; t['\uFED9'] = '\u0643'; t['\uFEDA'] = '\u0643'; t['\uFEDB'] = '\u0643'; t['\uFEDC'] = '\u0643'; t['\uFEDD'] = '\u0644'; t['\uFEDE'] = '\u0644'; t['\uFEDF'] = '\u0644'; t['\uFEE0'] = '\u0644'; t['\uFEE1'] = '\u0645'; t['\uFEE2'] = '\u0645'; t['\uFEE3'] = '\u0645'; t['\uFEE4'] = '\u0645'; t['\uFEE5'] = '\u0646'; t['\uFEE6'] = '\u0646'; t['\uFEE7'] = '\u0646'; t['\uFEE8'] = '\u0646'; t['\uFEE9'] = '\u0647'; t['\uFEEA'] = '\u0647'; t['\uFEEB'] = '\u0647'; t['\uFEEC'] = '\u0647'; t['\uFEED'] = '\u0648'; t['\uFEEE'] = '\u0648'; t['\uFEEF'] = '\u0649'; t['\uFEF0'] = '\u0649'; t['\uFEF1'] = '\u064A'; t['\uFEF2'] = '\u064A'; t['\uFEF3'] = '\u064A'; t['\uFEF4'] = '\u064A'; t['\uFEF5'] = '\u0644\u0622'; t['\uFEF6'] = '\u0644\u0622'; t['\uFEF7'] = '\u0644\u0623'; t['\uFEF8'] = '\u0644\u0623'; t['\uFEF9'] = '\u0644\u0625'; t['\uFEFA'] = '\u0644\u0625'; t['\uFEFB'] = '\u0644\u0627'; t['\uFEFC'] = '\u0644\u0627'; }); function reverseIfRtl(chars) { var charsLength = chars.length; //reverse an arabic ligature if (charsLength <= 1 || !isRTLRangeFor(chars.charCodeAt(0))) { return chars; } var s = ''; for (var ii = charsLength - 1; ii >= 0; ii--) { s += chars[ii]; } return s; } exports.mapSpecialUnicodeValues = mapSpecialUnicodeValues; exports.reverseIfRtl = reverseIfRtl; exports.getUnicodeRangeFor = getUnicodeRangeFor; exports.getNormalizedUnicodes = getNormalizedUnicodes; exports.getUnicodeForGlyph = getUnicodeForGlyph; })); (function (root, factory) { { factory((root.pdfjsCoreStream = {}), root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreJbig2, root.pdfjsCoreJpg, root.pdfjsCoreJpx); } }(this, function (exports, sharedUtil, corePrimitives, coreJbig2, coreJpg, coreJpx) { var Util = sharedUtil.Util; var error = sharedUtil.error; var info = sharedUtil.info; var isArray = sharedUtil.isArray; var createObjectURL = sharedUtil.createObjectURL; var shadow = sharedUtil.shadow; var warn = sharedUtil.warn; var Dict = corePrimitives.Dict; var Jbig2Image = coreJbig2.Jbig2Image; var JpegImage = coreJpg.JpegImage; var JpxImage = coreJpx.JpxImage; var Stream = (function StreamClosure() { function Stream(arrayBuffer, start, length, dict) { this.bytes = (arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer)); this.start = start || 0; this.pos = this.start; this.end = (start + length) || this.bytes.length; this.dict = dict; } // required methods for a stream. if a particular stream does not // implement these, an error should be thrown Stream.prototype = { get length() { return this.end - this.start; }, get isEmpty() { return this.length === 0; }, getByte: function Stream_getByte() { if (this.pos >= this.end) { return -1; } return this.bytes[this.pos++]; }, getUint16: function Stream_getUint16() { var b0 = this.getByte(); var b1 = this.getByte(); if (b0 === -1 || b1 === -1) { return -1; } return (b0 << 8) + b1; }, getInt32: function Stream_getInt32() { var b0 = this.getByte(); var b1 = this.getByte(); var b2 = this.getByte(); var b3 = this.getByte(); return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; }, // returns subarray of original buffer // should only be read getBytes: function Stream_getBytes(length) { var bytes = this.bytes; var pos = this.pos; var strEnd = this.end; if (!length) { return bytes.subarray(pos, strEnd); } var end = pos + length; if (end > strEnd) { end = strEnd; } this.pos = end; return bytes.subarray(pos, end); }, peekByte: function Stream_peekByte() { var peekedByte = this.getByte(); this.pos--; return peekedByte; }, peekBytes: function Stream_peekBytes(length) { var bytes = this.getBytes(length); this.pos -= bytes.length; return bytes; }, skip: function Stream_skip(n) { if (!n) { n = 1; } this.pos += n; }, reset: function Stream_reset() { this.pos = this.start; }, moveStart: function Stream_moveStart() { this.start = this.pos; }, makeSubStream: function Stream_makeSubStream(start, length, dict) { return new Stream(this.bytes.buffer, start, length, dict); }, isStream: true }; return Stream; })(); var StringStream = (function StringStreamClosure() { function StringStream(str) { var length = str.length; var bytes = new Uint8Array(length); for (var n = 0; n < length; ++n) { bytes[n] = str.charCodeAt(n); } Stream.call(this, bytes); } StringStream.prototype = Stream.prototype; return StringStream; })(); // super class for the decoding streams var DecodeStream = (function DecodeStreamClosure() { // Lots of DecodeStreams are created whose buffers are never used. For these // we share a single empty buffer. This is (a) space-efficient and (b) avoids // having special cases that would be required if we used |null| for an empty // buffer. var emptyBuffer = new Uint8Array(0); function DecodeStream(maybeMinBufferLength) { this.pos = 0; this.bufferLength = 0; this.eof = false; this.buffer = emptyBuffer; this.minBufferLength = 512; if (maybeMinBufferLength) { // Compute the first power of two that is as big as maybeMinBufferLength. while (this.minBufferLength < maybeMinBufferLength) { this.minBufferLength *= 2; } } } DecodeStream.prototype = { get isEmpty() { while (!this.eof && this.bufferLength === 0) { this.readBlock(); } return this.bufferLength === 0; }, ensureBuffer: function DecodeStream_ensureBuffer(requested) { var buffer = this.buffer; if (requested <= buffer.byteLength) { return buffer; } var size = this.minBufferLength; while (size < requested) { size *= 2; } var buffer2 = new Uint8Array(size); buffer2.set(buffer); return (this.buffer = buffer2); }, getByte: function DecodeStream_getByte() { var pos = this.pos; while (this.bufferLength <= pos) { if (this.eof) { return -1; } this.readBlock(); } return this.buffer[this.pos++]; }, getUint16: function DecodeStream_getUint16() { var b0 = this.getByte(); var b1 = this.getByte(); if (b0 === -1 || b1 === -1) { return -1; } return (b0 << 8) + b1; }, getInt32: function DecodeStream_getInt32() { var b0 = this.getByte(); var b1 = this.getByte(); var b2 = this.getByte(); var b3 = this.getByte(); return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; }, getBytes: function DecodeStream_getBytes(length) { var end, pos = this.pos; if (length) { this.ensureBuffer(pos + length); end = pos + length; while (!this.eof && this.bufferLength < end) { this.readBlock(); } var bufEnd = this.bufferLength; if (end > bufEnd) { end = bufEnd; } } else { while (!this.eof) { this.readBlock(); } end = this.bufferLength; } this.pos = end; return this.buffer.subarray(pos, end); }, peekByte: function DecodeStream_peekByte() { var peekedByte = this.getByte(); this.pos--; return peekedByte; }, peekBytes: function DecodeStream_peekBytes(length) { var bytes = this.getBytes(length); this.pos -= bytes.length; return bytes; }, makeSubStream: function DecodeStream_makeSubStream(start, length, dict) { var end = start + length; while (this.bufferLength <= end && !this.eof) { this.readBlock(); } return new Stream(this.buffer, start, length, dict); }, skip: function DecodeStream_skip(n) { if (!n) { n = 1; } this.pos += n; }, reset: function DecodeStream_reset() { this.pos = 0; }, getBaseStreams: function DecodeStream_getBaseStreams() { if (this.str && this.str.getBaseStreams) { return this.str.getBaseStreams(); } return []; } }; return DecodeStream; })(); var StreamsSequenceStream = (function StreamsSequenceStreamClosure() { function StreamsSequenceStream(streams) { this.streams = streams; DecodeStream.call(this, /* maybeLength = */ null); } StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype); StreamsSequenceStream.prototype.readBlock = function streamSequenceStreamReadBlock() { var streams = this.streams; if (streams.length === 0) { this.eof = true; return; } var stream = streams.shift(); var chunk = stream.getBytes(); var bufferLength = this.bufferLength; var newLength = bufferLength + chunk.length; var buffer = this.ensureBuffer(newLength); buffer.set(chunk, bufferLength); this.bufferLength = newLength; }; StreamsSequenceStream.prototype.getBaseStreams = function StreamsSequenceStream_getBaseStreams() { var baseStreams = []; for (var i = 0, ii = this.streams.length; i < ii; i++) { var stream = this.streams[i]; if (stream.getBaseStreams) { Util.appendToArray(baseStreams, stream.getBaseStreams()); } } return baseStreams; }; return StreamsSequenceStream; })(); var FlateStream = (function FlateStreamClosure() { var codeLenCodeMap = new Int32Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]); var lengthDecode = new Int32Array([ 0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102 ]); var distDecode = new Int32Array([ 0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001 ]); var fixedLitCodeTab = [new Int32Array([ 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0, 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8, 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4, 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc, 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc, 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2, 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca, 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6, 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce, 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe, 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1, 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9, 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5, 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd, 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3, 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb, 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db, 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7, 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf, 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff ]), 9]; var fixedDistCodeTab = [new Int32Array([ 0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000 ]), 5]; function FlateStream(str, maybeLength) { this.str = str; this.dict = str.dict; var cmf = str.getByte(); var flg = str.getByte(); if (cmf === -1 || flg === -1) { error('Invalid header in flate stream: ' + cmf + ', ' + flg); } if ((cmf & 0x0f) !== 0x08) { error('Unknown compression method in flate stream: ' + cmf + ', ' + flg); } if ((((cmf << 8) + flg) % 31) !== 0) { error('Bad FCHECK in flate stream: ' + cmf + ', ' + flg); } if (flg & 0x20) { error('FDICT bit set in flate stream: ' + cmf + ', ' + flg); } this.codeSize = 0; this.codeBuf = 0; DecodeStream.call(this, maybeLength); } FlateStream.prototype = Object.create(DecodeStream.prototype); FlateStream.prototype.getBits = function FlateStream_getBits(bits) { var str = this.str; var codeSize = this.codeSize; var codeBuf = this.codeBuf; var b; while (codeSize < bits) { if ((b = str.getByte()) === -1) { error('Bad encoding in flate stream'); } codeBuf |= b << codeSize; codeSize += 8; } b = codeBuf & ((1 << bits) - 1); this.codeBuf = codeBuf >> bits; this.codeSize = codeSize -= bits; return b; }; FlateStream.prototype.getCode = function FlateStream_getCode(table) { var str = this.str; var codes = table[0]; var maxLen = table[1]; var codeSize = this.codeSize; var codeBuf = this.codeBuf; var b; while (codeSize < maxLen) { if ((b = str.getByte()) === -1) { // premature end of stream. code might however still be valid. // codeSize < codeLen check below guards against incomplete codeVal. break; } codeBuf |= (b << codeSize); codeSize += 8; } var code = codes[codeBuf & ((1 << maxLen) - 1)]; var codeLen = code >> 16; var codeVal = code & 0xffff; if (codeLen < 1 || codeSize < codeLen) { error('Bad encoding in flate stream'); } this.codeBuf = (codeBuf >> codeLen); this.codeSize = (codeSize - codeLen); return codeVal; }; FlateStream.prototype.generateHuffmanTable = function flateStreamGenerateHuffmanTable(lengths) { var n = lengths.length; // find max code length var maxLen = 0; var i; for (i = 0; i < n; ++i) { if (lengths[i] > maxLen) { maxLen = lengths[i]; } } // build the table var size = 1 << maxLen; var codes = new Int32Array(size); for (var len = 1, code = 0, skip = 2; len <= maxLen; ++len, code <<= 1, skip <<= 1) { for (var val = 0; val < n; ++val) { if (lengths[val] === len) { // bit-reverse the code var code2 = 0; var t = code; for (i = 0; i < len; ++i) { code2 = (code2 << 1) | (t & 1); t >>= 1; } // fill the table entries for (i = code2; i < size; i += skip) { codes[i] = (len << 16) | val; } ++code; } } } return [codes, maxLen]; }; FlateStream.prototype.readBlock = function FlateStream_readBlock() { var buffer, len; var str = this.str; // read block header var hdr = this.getBits(3); if (hdr & 1) { this.eof = true; } hdr >>= 1; if (hdr === 0) { // uncompressed block var b; if ((b = str.getByte()) === -1) { error('Bad block header in flate stream'); } var blockLen = b; if ((b = str.getByte()) === -1) { error('Bad block header in flate stream'); } blockLen |= (b << 8); if ((b = str.getByte()) === -1) { error('Bad block header in flate stream'); } var check = b; if ((b = str.getByte()) === -1) { error('Bad block header in flate stream'); } check |= (b << 8); if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) { // Ignoring error for bad "empty" block (see issue 1277) error('Bad uncompressed block length in flate stream'); } this.codeBuf = 0; this.codeSize = 0; var bufferLength = this.bufferLength; buffer = this.ensureBuffer(bufferLength + blockLen); var end = bufferLength + blockLen; this.bufferLength = end; if (blockLen === 0) { if (str.peekByte() === -1) { this.eof = true; } } else { for (var n = bufferLength; n < end; ++n) { if ((b = str.getByte()) === -1) { this.eof = true; break; } buffer[n] = b; } } return; } var litCodeTable; var distCodeTable; if (hdr === 1) { // compressed block, fixed codes litCodeTable = fixedLitCodeTab; distCodeTable = fixedDistCodeTab; } else if (hdr === 2) { // compressed block, dynamic codes var numLitCodes = this.getBits(5) + 257; var numDistCodes = this.getBits(5) + 1; var numCodeLenCodes = this.getBits(4) + 4; // build the code lengths code table var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length); var i; for (i = 0; i < numCodeLenCodes; ++i) { codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3); } var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths); // build the literal and distance code tables len = 0; i = 0; var codes = numLitCodes + numDistCodes; var codeLengths = new Uint8Array(codes); var bitsLength, bitsOffset, what; while (i < codes) { var code = this.getCode(codeLenCodeTab); if (code === 16) { bitsLength = 2; bitsOffset = 3; what = len; } else if (code === 17) { bitsLength = 3; bitsOffset = 3; what = (len = 0); } else if (code === 18) { bitsLength = 7; bitsOffset = 11; what = (len = 0); } else { codeLengths[i++] = len = code; continue; } var repeatLength = this.getBits(bitsLength) + bitsOffset; while (repeatLength-- > 0) { codeLengths[i++] = what; } } litCodeTable = this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes)); distCodeTable = this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes)); } else { error('Unknown block type in flate stream'); } buffer = this.buffer; var limit = buffer ? buffer.length : 0; var pos = this.bufferLength; while (true) { var code1 = this.getCode(litCodeTable); if (code1 < 256) { if (pos + 1 >= limit) { buffer = this.ensureBuffer(pos + 1); limit = buffer.length; } buffer[pos++] = code1; continue; } if (code1 === 256) { this.bufferLength = pos; return; } code1 -= 257; code1 = lengthDecode[code1]; var code2 = code1 >> 16; if (code2 > 0) { code2 = this.getBits(code2); } len = (code1 & 0xffff) + code2; code1 = this.getCode(distCodeTable); code1 = distDecode[code1]; code2 = code1 >> 16; if (code2 > 0) { code2 = this.getBits(code2); } var dist = (code1 & 0xffff) + code2; if (pos + len >= limit) { buffer = this.ensureBuffer(pos + len); limit = buffer.length; } for (var k = 0; k < len; ++k, ++pos) { buffer[pos] = buffer[pos - dist]; } } }; return FlateStream; })(); var PredictorStream = (function PredictorStreamClosure() { function PredictorStream(str, maybeLength, params) { var predictor = this.predictor = params.get('Predictor') || 1; if (predictor <= 1) { return str; // no prediction } if (predictor !== 2 && (predictor < 10 || predictor > 15)) { error('Unsupported predictor: ' + predictor); } if (predictor === 2) { this.readBlock = this.readBlockTiff; } else { this.readBlock = this.readBlockPng; } this.str = str; this.dict = str.dict; var colors = this.colors = params.get('Colors') || 1; var bits = this.bits = params.get('BitsPerComponent') || 8; var columns = this.columns = params.get('Columns') || 1; this.pixBytes = (colors * bits + 7) >> 3; this.rowBytes = (columns * colors * bits + 7) >> 3; DecodeStream.call(this, maybeLength); return this; } PredictorStream.prototype = Object.create(DecodeStream.prototype); PredictorStream.prototype.readBlockTiff = function predictorStreamReadBlockTiff() { var rowBytes = this.rowBytes; var bufferLength = this.bufferLength; var buffer = this.ensureBuffer(bufferLength + rowBytes); var bits = this.bits; var colors = this.colors; var rawBytes = this.str.getBytes(rowBytes); this.eof = !rawBytes.length; if (this.eof) { return; } var inbuf = 0, outbuf = 0; var inbits = 0, outbits = 0; var pos = bufferLength; var i; if (bits === 1) { for (i = 0; i < rowBytes; ++i) { var c = rawBytes[i]; inbuf = (inbuf << 8) | c; // bitwise addition is exclusive or // first shift inbuf and then add buffer[pos++] = (c ^ (inbuf >> colors)) & 0xFF; // truncate inbuf (assumes colors < 16) inbuf &= 0xFFFF; } } else if (bits === 8) { for (i = 0; i < colors; ++i) { buffer[pos++] = rawBytes[i]; } for (; i < rowBytes; ++i) { buffer[pos] = buffer[pos - colors] + rawBytes[i]; pos++; } } else { var compArray = new Uint8Array(colors + 1); var bitMask = (1 << bits) - 1; var j = 0, k = bufferLength; var columns = this.columns; for (i = 0; i < columns; ++i) { for (var kk = 0; kk < colors; ++kk) { if (inbits < bits) { inbuf = (inbuf << 8) | (rawBytes[j++] & 0xFF); inbits += 8; } compArray[kk] = (compArray[kk] + (inbuf >> (inbits - bits))) & bitMask; inbits -= bits; outbuf = (outbuf << bits) | compArray[kk]; outbits += bits; if (outbits >= 8) { buffer[k++] = (outbuf >> (outbits - 8)) & 0xFF; outbits -= 8; } } } if (outbits > 0) { buffer[k++] = (outbuf << (8 - outbits)) + (inbuf & ((1 << (8 - outbits)) - 1)); } } this.bufferLength += rowBytes; }; PredictorStream.prototype.readBlockPng = function predictorStreamReadBlockPng() { var rowBytes = this.rowBytes; var pixBytes = this.pixBytes; var predictor = this.str.getByte(); var rawBytes = this.str.getBytes(rowBytes); this.eof = !rawBytes.length; if (this.eof) { return; } var bufferLength = this.bufferLength; var buffer = this.ensureBuffer(bufferLength + rowBytes); var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength); if (prevRow.length === 0) { prevRow = new Uint8Array(rowBytes); } var i, j = bufferLength, up, c; switch (predictor) { case 0: for (i = 0; i < rowBytes; ++i) { buffer[j++] = rawBytes[i]; } break; case 1: for (i = 0; i < pixBytes; ++i) { buffer[j++] = rawBytes[i]; } for (; i < rowBytes; ++i) { buffer[j] = (buffer[j - pixBytes] + rawBytes[i]) & 0xFF; j++; } break; case 2: for (i = 0; i < rowBytes; ++i) { buffer[j++] = (prevRow[i] + rawBytes[i]) & 0xFF; } break; case 3: for (i = 0; i < pixBytes; ++i) { buffer[j++] = (prevRow[i] >> 1) + rawBytes[i]; } for (; i < rowBytes; ++i) { buffer[j] = (((prevRow[i] + buffer[j - pixBytes]) >> 1) + rawBytes[i]) & 0xFF; j++; } break; case 4: // we need to save the up left pixels values. the simplest way // is to create a new buffer for (i = 0; i < pixBytes; ++i) { up = prevRow[i]; c = rawBytes[i]; buffer[j++] = up + c; } for (; i < rowBytes; ++i) { up = prevRow[i]; var upLeft = prevRow[i - pixBytes]; var left = buffer[j - pixBytes]; var p = left + up - upLeft; var pa = p - left; if (pa < 0) { pa = -pa; } var pb = p - up; if (pb < 0) { pb = -pb; } var pc = p - upLeft; if (pc < 0) { pc = -pc; } c = rawBytes[i]; if (pa <= pb && pa <= pc) { buffer[j++] = left + c; } else if (pb <= pc) { buffer[j++] = up + c; } else { buffer[j++] = upLeft + c; } } break; default: error('Unsupported predictor: ' + predictor); } this.bufferLength += rowBytes; }; return PredictorStream; })(); /** * Depending on the type of JPEG a JpegStream is handled in different ways. For * JPEG's that are supported natively such as DeviceGray and DeviceRGB the image * data is stored and then loaded by the browser. For unsupported JPEG's we use * a library to decode these images and the stream behaves like all the other * DecodeStreams. */ var JpegStream = (function JpegStreamClosure() { function JpegStream(stream, maybeLength, dict, xref) { // Some images may contain 'junk' before the SOI (start-of-image) marker. // Note: this seems to mainly affect inline images. var ch; while ((ch = stream.getByte()) !== -1) { if (ch === 0xFF) { // Find the first byte of the SOI marker (0xFFD8). stream.skip(-1); // Reset the stream position to the SOI. break; } } this.stream = stream; this.maybeLength = maybeLength; this.dict = dict; DecodeStream.call(this, maybeLength); } JpegStream.prototype = Object.create(DecodeStream.prototype); Object.defineProperty(JpegStream.prototype, 'bytes', { get: function JpegStream_bytes() { // If this.maybeLength is null, we'll get the entire stream. return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength)); }, configurable: true }); JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) { if (this.bufferLength) { return; } try { var jpegImage = new JpegImage(); // checking if values needs to be transformed before conversion if (this.forceRGB && this.dict && isArray(this.dict.get('Decode'))) { var decodeArr = this.dict.get('Decode'); var bitsPerComponent = this.dict.get('BitsPerComponent') || 8; var decodeArrLength = decodeArr.length; var transform = new Int32Array(decodeArrLength); var transformNeeded = false; var maxValue = (1 << bitsPerComponent) - 1; for (var i = 0; i < decodeArrLength; i += 2) { transform[i] = ((decodeArr[i + 1] - decodeArr[i]) * 256) | 0; transform[i + 1] = (decodeArr[i] * maxValue) | 0; if (transform[i] !== 256 || transform[i + 1] !== 0) { transformNeeded = true; } } if (transformNeeded) { jpegImage.decodeTransform = transform; } } jpegImage.parse(this.bytes); var data = jpegImage.getData(this.drawWidth, this.drawHeight, this.forceRGB); this.buffer = data; this.bufferLength = data.length; this.eof = true; } catch (e) { error('JPEG error: ' + e); } }; JpegStream.prototype.getBytes = function JpegStream_getBytes(length) { this.ensureBuffer(); return this.buffer; }; JpegStream.prototype.getIR = function JpegStream_getIR(forceDataSchema) { return createObjectURL(this.bytes, 'image/jpeg', forceDataSchema); }; return JpegStream; })(); /** * For JPEG 2000's we use a library to decode these images and * the stream behaves like all the other DecodeStreams. */ var JpxStream = (function JpxStreamClosure() { function JpxStream(stream, maybeLength, dict) { this.stream = stream; this.maybeLength = maybeLength; this.dict = dict; DecodeStream.call(this, maybeLength); } JpxStream.prototype = Object.create(DecodeStream.prototype); Object.defineProperty(JpxStream.prototype, 'bytes', { get: function JpxStream_bytes() { // If this.maybeLength is null, we'll get the entire stream. return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength)); }, configurable: true }); JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) { if (this.bufferLength) { return; } var jpxImage = new JpxImage(); jpxImage.parse(this.bytes); var width = jpxImage.width; var height = jpxImage.height; var componentsCount = jpxImage.componentsCount; var tileCount = jpxImage.tiles.length; if (tileCount === 1) { this.buffer = jpxImage.tiles[0].items; } else { var data = new Uint8Array(width * height * componentsCount); for (var k = 0; k < tileCount; k++) { var tileComponents = jpxImage.tiles[k]; var tileWidth = tileComponents.width; var tileHeight = tileComponents.height; var tileLeft = tileComponents.left; var tileTop = tileComponents.top; var src = tileComponents.items; var srcPosition = 0; var dataPosition = (width * tileTop + tileLeft) * componentsCount; var imgRowSize = width * componentsCount; var tileRowSize = tileWidth * componentsCount; for (var j = 0; j < tileHeight; j++) { var rowBytes = src.subarray(srcPosition, srcPosition + tileRowSize); data.set(rowBytes, dataPosition); srcPosition += tileRowSize; dataPosition += imgRowSize; } } this.buffer = data; } this.bufferLength = this.buffer.length; this.eof = true; }; return JpxStream; })(); /** * For JBIG2's we use a library to decode these images and * the stream behaves like all the other DecodeStreams. */ var Jbig2Stream = (function Jbig2StreamClosure() { function Jbig2Stream(stream, maybeLength, dict) { this.stream = stream; this.maybeLength = maybeLength; this.dict = dict; DecodeStream.call(this, maybeLength); } Jbig2Stream.prototype = Object.create(DecodeStream.prototype); Object.defineProperty(Jbig2Stream.prototype, 'bytes', { get: function Jbig2Stream_bytes() { // If this.maybeLength is null, we'll get the entire stream. return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength)); }, configurable: true }); Jbig2Stream.prototype.ensureBuffer = function Jbig2Stream_ensureBuffer(req) { if (this.bufferLength) { return; } var jbig2Image = new Jbig2Image(); var chunks = [], xref = this.dict.xref; var decodeParams = xref.fetchIfRef(this.dict.get('DecodeParms')); // According to the PDF specification, DecodeParms can be either // a dictionary, or an array whose elements are dictionaries. if (isArray(decodeParams)) { if (decodeParams.length > 1) { warn('JBIG2 - \'DecodeParms\' array with multiple elements ' + 'not supported.'); } decodeParams = xref.fetchIfRef(decodeParams[0]); } if (decodeParams && decodeParams.has('JBIG2Globals')) { var globalsStream = decodeParams.get('JBIG2Globals'); var globals = globalsStream.getBytes(); chunks.push({data: globals, start: 0, end: globals.length}); } chunks.push({data: this.bytes, start: 0, end: this.bytes.length}); var data = jbig2Image.parseChunks(chunks); var dataLength = data.length; // JBIG2 had black as 1 and white as 0, inverting the colors for (var i = 0; i < dataLength; i++) { data[i] ^= 0xFF; } this.buffer = data; this.bufferLength = dataLength; this.eof = true; }; return Jbig2Stream; })(); var DecryptStream = (function DecryptStreamClosure() { function DecryptStream(str, maybeLength, decrypt) { this.str = str; this.dict = str.dict; this.decrypt = decrypt; this.nextChunk = null; this.initialized = false; DecodeStream.call(this, maybeLength); } var chunkSize = 512; DecryptStream.prototype = Object.create(DecodeStream.prototype); DecryptStream.prototype.readBlock = function DecryptStream_readBlock() { var chunk; if (this.initialized) { chunk = this.nextChunk; } else { chunk = this.str.getBytes(chunkSize); this.initialized = true; } if (!chunk || chunk.length === 0) { this.eof = true; return; } this.nextChunk = this.str.getBytes(chunkSize); var hasMoreData = this.nextChunk && this.nextChunk.length > 0; var decrypt = this.decrypt; chunk = decrypt(chunk, !hasMoreData); var bufferLength = this.bufferLength; var i, n = chunk.length; var buffer = this.ensureBuffer(bufferLength + n); for (i = 0; i < n; i++) { buffer[bufferLength++] = chunk[i]; } this.bufferLength = bufferLength; }; return DecryptStream; })(); var Ascii85Stream = (function Ascii85StreamClosure() { // Checks if ch is one of the following characters: SPACE, TAB, CR or LF. function isSpace(ch) { return (ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A); } function Ascii85Stream(str, maybeLength) { this.str = str; this.dict = str.dict; this.input = new Uint8Array(5); // Most streams increase in size when decoded, but Ascii85 streams // typically shrink by ~20%. if (maybeLength) { maybeLength = 0.8 * maybeLength; } DecodeStream.call(this, maybeLength); } Ascii85Stream.prototype = Object.create(DecodeStream.prototype); Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() { var TILDA_CHAR = 0x7E; // '~' var Z_LOWER_CHAR = 0x7A; // 'z' var EOF = -1; var str = this.str; var c = str.getByte(); while (isSpace(c)) { c = str.getByte(); } if (c === EOF || c === TILDA_CHAR) { this.eof = true; return; } var bufferLength = this.bufferLength, buffer; var i; // special code for z if (c === Z_LOWER_CHAR) { buffer = this.ensureBuffer(bufferLength + 4); for (i = 0; i < 4; ++i) { buffer[bufferLength + i] = 0; } this.bufferLength += 4; } else { var input = this.input; input[0] = c; for (i = 1; i < 5; ++i) { c = str.getByte(); while (isSpace(c)) { c = str.getByte(); } input[i] = c; if (c === EOF || c === TILDA_CHAR) { break; } } buffer = this.ensureBuffer(bufferLength + i - 1); this.bufferLength += i - 1; // partial ending; if (i < 5) { for (; i < 5; ++i) { input[i] = 0x21 + 84; } this.eof = true; } var t = 0; for (i = 0; i < 5; ++i) { t = t * 85 + (input[i] - 0x21); } for (i = 3; i >= 0; --i) { buffer[bufferLength + i] = t & 0xFF; t >>= 8; } } }; return Ascii85Stream; })(); var AsciiHexStream = (function AsciiHexStreamClosure() { function AsciiHexStream(str, maybeLength) { this.str = str; this.dict = str.dict; this.firstDigit = -1; // Most streams increase in size when decoded, but AsciiHex streams shrink // by 50%. if (maybeLength) { maybeLength = 0.5 * maybeLength; } DecodeStream.call(this, maybeLength); } AsciiHexStream.prototype = Object.create(DecodeStream.prototype); AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() { var UPSTREAM_BLOCK_SIZE = 8000; var bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE); if (!bytes.length) { this.eof = true; return; } var maxDecodeLength = (bytes.length + 1) >> 1; var buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength); var bufferLength = this.bufferLength; var firstDigit = this.firstDigit; for (var i = 0, ii = bytes.length; i < ii; i++) { var ch = bytes[i], digit; if (ch >= 0x30 && ch <= 0x39) { // '0'-'9' digit = ch & 0x0F; } else if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) { // 'A'-'Z', 'a'-'z' digit = (ch & 0x0F) + 9; } else if (ch === 0x3E) { // '>' this.eof = true; break; } else { // probably whitespace continue; // ignoring } if (firstDigit < 0) { firstDigit = digit; } else { buffer[bufferLength++] = (firstDigit << 4) | digit; firstDigit = -1; } } if (firstDigit >= 0 && this.eof) { // incomplete byte buffer[bufferLength++] = (firstDigit << 4); firstDigit = -1; } this.firstDigit = firstDigit; this.bufferLength = bufferLength; }; return AsciiHexStream; })(); var RunLengthStream = (function RunLengthStreamClosure() { function RunLengthStream(str, maybeLength) { this.str = str; this.dict = str.dict; DecodeStream.call(this, maybeLength); } RunLengthStream.prototype = Object.create(DecodeStream.prototype); RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() { // The repeatHeader has following format. The first byte defines type of run // and amount of bytes to repeat/copy: n = 0 through 127 - copy next n bytes // (in addition to the second byte from the header), n = 129 through 255 - // duplicate the second byte from the header (257 - n) times, n = 128 - end. var repeatHeader = this.str.getBytes(2); if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) { this.eof = true; return; } var buffer; var bufferLength = this.bufferLength; var n = repeatHeader[0]; if (n < 128) { // copy n bytes buffer = this.ensureBuffer(bufferLength + n + 1); buffer[bufferLength++] = repeatHeader[1]; if (n > 0) { var source = this.str.getBytes(n); buffer.set(source, bufferLength); bufferLength += n; } } else { n = 257 - n; var b = repeatHeader[1]; buffer = this.ensureBuffer(bufferLength + n + 1); for (var i = 0; i < n; i++) { buffer[bufferLength++] = b; } } this.bufferLength = bufferLength; }; return RunLengthStream; })(); var CCITTFaxStream = (function CCITTFaxStreamClosure() { var ccittEOL = -2; var ccittEOF = -1; var twoDimPass = 0; var twoDimHoriz = 1; var twoDimVert0 = 2; var twoDimVertR1 = 3; var twoDimVertL1 = 4; var twoDimVertR2 = 5; var twoDimVertL2 = 6; var twoDimVertR3 = 7; var twoDimVertL3 = 8; var twoDimTable = [ [-1, -1], [-1, -1], // 000000x [7, twoDimVertL3], // 0000010 [7, twoDimVertR3], // 0000011 [6, twoDimVertL2], [6, twoDimVertL2], // 000010x [6, twoDimVertR2], [6, twoDimVertR2], // 000011x [4, twoDimPass], [4, twoDimPass], // 0001xxx [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [3, twoDimHoriz], [3, twoDimHoriz], // 001xxxx [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimVertL1], [3, twoDimVertL1], // 010xxxx [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertR1], [3, twoDimVertR1], // 011xxxx [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [1, twoDimVert0], [1, twoDimVert0], // 1xxxxxx [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0] ]; var whiteTable1 = [ [-1, -1], // 00000 [12, ccittEOL], // 00001 [-1, -1], [-1, -1], // 0001x [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 001xx [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 010xx [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 011xx [11, 1792], [11, 1792], // 1000x [12, 1984], // 10010 [12, 2048], // 10011 [12, 2112], // 10100 [12, 2176], // 10101 [12, 2240], // 10110 [12, 2304], // 10111 [11, 1856], [11, 1856], // 1100x [11, 1920], [11, 1920], // 1101x [12, 2368], // 11100 [12, 2432], // 11101 [12, 2496], // 11110 [12, 2560] // 11111 ]; var whiteTable2 = [ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000000xx [8, 29], [8, 29], // 00000010x [8, 30], [8, 30], // 00000011x [8, 45], [8, 45], // 00000100x [8, 46], [8, 46], // 00000101x [7, 22], [7, 22], [7, 22], [7, 22], // 0000011xx [7, 23], [7, 23], [7, 23], [7, 23], // 0000100xx [8, 47], [8, 47], // 00001010x [8, 48], [8, 48], // 00001011x [6, 13], [6, 13], [6, 13], [6, 13], // 000011xxx [6, 13], [6, 13], [6, 13], [6, 13], [7, 20], [7, 20], [7, 20], [7, 20], // 0001000xx [8, 33], [8, 33], // 00010010x [8, 34], [8, 34], // 00010011x [8, 35], [8, 35], // 00010100x [8, 36], [8, 36], // 00010101x [8, 37], [8, 37], // 00010110x [8, 38], [8, 38], // 00010111x [7, 19], [7, 19], [7, 19], [7, 19], // 0001100xx [8, 31], [8, 31], // 00011010x [8, 32], [8, 32], // 00011011x [6, 1], [6, 1], [6, 1], [6, 1], // 000111xxx [6, 1], [6, 1], [6, 1], [6, 1], [6, 12], [6, 12], [6, 12], [6, 12], // 001000xxx [6, 12], [6, 12], [6, 12], [6, 12], [8, 53], [8, 53], // 00100100x [8, 54], [8, 54], // 00100101x [7, 26], [7, 26], [7, 26], [7, 26], // 0010011xx [8, 39], [8, 39], // 00101000x [8, 40], [8, 40], // 00101001x [8, 41], [8, 41], // 00101010x [8, 42], [8, 42], // 00101011x [8, 43], [8, 43], // 00101100x [8, 44], [8, 44], // 00101101x [7, 21], [7, 21], [7, 21], [7, 21], // 0010111xx [7, 28], [7, 28], [7, 28], [7, 28], // 0011000xx [8, 61], [8, 61], // 00110010x [8, 62], [8, 62], // 00110011x [8, 63], [8, 63], // 00110100x [8, 0], [8, 0], // 00110101x [8, 320], [8, 320], // 00110110x [8, 384], [8, 384], // 00110111x [5, 10], [5, 10], [5, 10], [5, 10], // 00111xxxx [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 11], [5, 11], [5, 11], [5, 11], // 01000xxxx [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [7, 27], [7, 27], [7, 27], [7, 27], // 0100100xx [8, 59], [8, 59], // 01001010x [8, 60], [8, 60], // 01001011x [9, 1472], // 010011000 [9, 1536], // 010011001 [9, 1600], // 010011010 [9, 1728], // 010011011 [7, 18], [7, 18], [7, 18], [7, 18], // 0100111xx [7, 24], [7, 24], [7, 24], [7, 24], // 0101000xx [8, 49], [8, 49], // 01010010x [8, 50], [8, 50], // 01010011x [8, 51], [8, 51], // 01010100x [8, 52], [8, 52], // 01010101x [7, 25], [7, 25], [7, 25], [7, 25], // 0101011xx [8, 55], [8, 55], // 01011000x [8, 56], [8, 56], // 01011001x [8, 57], [8, 57], // 01011010x [8, 58], [8, 58], // 01011011x [6, 192], [6, 192], [6, 192], [6, 192], // 010111xxx [6, 192], [6, 192], [6, 192], [6, 192], [6, 1664], [6, 1664], [6, 1664], [6, 1664], // 011000xxx [6, 1664], [6, 1664], [6, 1664], [6, 1664], [8, 448], [8, 448], // 01100100x [8, 512], [8, 512], // 01100101x [9, 704], // 011001100 [9, 768], // 011001101 [8, 640], [8, 640], // 01100111x [8, 576], [8, 576], // 01101000x [9, 832], // 011010010 [9, 896], // 011010011 [9, 960], // 011010100 [9, 1024], // 011010101 [9, 1088], // 011010110 [9, 1152], // 011010111 [9, 1216], // 011011000 [9, 1280], // 011011001 [9, 1344], // 011011010 [9, 1408], // 011011011 [7, 256], [7, 256], [7, 256], [7, 256], // 0110111xx [4, 2], [4, 2], [4, 2], [4, 2], // 0111xxxxx [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 3], [4, 3], [4, 3], [4, 3], // 1000xxxxx [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [5, 128], [5, 128], [5, 128], [5, 128], // 10010xxxx [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 8], [5, 8], [5, 8], [5, 8], // 10011xxxx [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 9], [5, 9], [5, 9], [5, 9], // 10100xxxx [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [6, 16], [6, 16], [6, 16], [6, 16], // 101010xxx [6, 16], [6, 16], [6, 16], [6, 16], [6, 17], [6, 17], [6, 17], [6, 17], // 101011xxx [6, 17], [6, 17], [6, 17], [6, 17], [4, 4], [4, 4], [4, 4], [4, 4], // 1011xxxxx [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 5], [4, 5], [4, 5], [4, 5], // 1100xxxxx [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [6, 14], [6, 14], [6, 14], [6, 14], // 110100xxx [6, 14], [6, 14], [6, 14], [6, 14], [6, 15], [6, 15], [6, 15], [6, 15], // 110101xxx [6, 15], [6, 15], [6, 15], [6, 15], [5, 64], [5, 64], [5, 64], [5, 64], // 11011xxxx [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [4, 6], [4, 6], [4, 6], [4, 6], // 1110xxxxx [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 7], [4, 7], [4, 7], [4, 7], // 1111xxxxx [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7] ]; var blackTable1 = [ [-1, -1], [-1, -1], // 000000000000x [12, ccittEOL], [12, ccittEOL], // 000000000001x [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000001xx [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000010xx [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000011xx [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000100xx [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000101xx [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000110xx [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000111xx [11, 1792], [11, 1792], [11, 1792], [11, 1792], // 00000001000xx [12, 1984], [12, 1984], // 000000010010x [12, 2048], [12, 2048], // 000000010011x [12, 2112], [12, 2112], // 000000010100x [12, 2176], [12, 2176], // 000000010101x [12, 2240], [12, 2240], // 000000010110x [12, 2304], [12, 2304], // 000000010111x [11, 1856], [11, 1856], [11, 1856], [11, 1856], // 00000001100xx [11, 1920], [11, 1920], [11, 1920], [11, 1920], // 00000001101xx [12, 2368], [12, 2368], // 000000011100x [12, 2432], [12, 2432], // 000000011101x [12, 2496], [12, 2496], // 000000011110x [12, 2560], [12, 2560], // 000000011111x [10, 18], [10, 18], [10, 18], [10, 18], // 0000001000xxx [10, 18], [10, 18], [10, 18], [10, 18], [12, 52], [12, 52], // 000000100100x [13, 640], // 0000001001010 [13, 704], // 0000001001011 [13, 768], // 0000001001100 [13, 832], // 0000001001101 [12, 55], [12, 55], // 000000100111x [12, 56], [12, 56], // 000000101000x [13, 1280], // 0000001010010 [13, 1344], // 0000001010011 [13, 1408], // 0000001010100 [13, 1472], // 0000001010101 [12, 59], [12, 59], // 000000101011x [12, 60], [12, 60], // 000000101100x [13, 1536], // 0000001011010 [13, 1600], // 0000001011011 [11, 24], [11, 24], [11, 24], [11, 24], // 00000010111xx [11, 25], [11, 25], [11, 25], [11, 25], // 00000011000xx [13, 1664], // 0000001100100 [13, 1728], // 0000001100101 [12, 320], [12, 320], // 000000110011x [12, 384], [12, 384], // 000000110100x [12, 448], [12, 448], // 000000110101x [13, 512], // 0000001101100 [13, 576], // 0000001101101 [12, 53], [12, 53], // 000000110111x [12, 54], [12, 54], // 000000111000x [13, 896], // 0000001110010 [13, 960], // 0000001110011 [13, 1024], // 0000001110100 [13, 1088], // 0000001110101 [13, 1152], // 0000001110110 [13, 1216], // 0000001110111 [10, 64], [10, 64], [10, 64], [10, 64], // 0000001111xxx [10, 64], [10, 64], [10, 64], [10, 64] ]; var blackTable2 = [ [8, 13], [8, 13], [8, 13], [8, 13], // 00000100xxxx [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [11, 23], [11, 23], // 00000101000x [12, 50], // 000001010010 [12, 51], // 000001010011 [12, 44], // 000001010100 [12, 45], // 000001010101 [12, 46], // 000001010110 [12, 47], // 000001010111 [12, 57], // 000001011000 [12, 58], // 000001011001 [12, 61], // 000001011010 [12, 256], // 000001011011 [10, 16], [10, 16], [10, 16], [10, 16], // 0000010111xx [10, 17], [10, 17], [10, 17], [10, 17], // 0000011000xx [12, 48], // 000001100100 [12, 49], // 000001100101 [12, 62], // 000001100110 [12, 63], // 000001100111 [12, 30], // 000001101000 [12, 31], // 000001101001 [12, 32], // 000001101010 [12, 33], // 000001101011 [12, 40], // 000001101100 [12, 41], // 000001101101 [11, 22], [11, 22], // 00000110111x [8, 14], [8, 14], [8, 14], [8, 14], // 00000111xxxx [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [7, 10], [7, 10], [7, 10], [7, 10], // 0000100xxxxx [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 11], [7, 11], [7, 11], [7, 11], // 0000101xxxxx [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [9, 15], [9, 15], [9, 15], [9, 15], // 000011000xxx [9, 15], [9, 15], [9, 15], [9, 15], [12, 128], // 000011001000 [12, 192], // 000011001001 [12, 26], // 000011001010 [12, 27], // 000011001011 [12, 28], // 000011001100 [12, 29], // 000011001101 [11, 19], [11, 19], // 00001100111x [11, 20], [11, 20], // 00001101000x [12, 34], // 000011010010 [12, 35], // 000011010011 [12, 36], // 000011010100 [12, 37], // 000011010101 [12, 38], // 000011010110 [12, 39], // 000011010111 [11, 21], [11, 21], // 00001101100x [12, 42], // 000011011010 [12, 43], // 000011011011 [10, 0], [10, 0], [10, 0], [10, 0], // 0000110111xx [7, 12], [7, 12], [7, 12], [7, 12], // 0000111xxxxx [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12] ]; var blackTable3 = [ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000xx [6, 9], // 000100 [6, 8], // 000101 [5, 7], [5, 7], // 00011x [4, 6], [4, 6], [4, 6], [4, 6], // 0010xx [4, 5], [4, 5], [4, 5], [4, 5], // 0011xx [3, 1], [3, 1], [3, 1], [3, 1], // 010xxx [3, 1], [3, 1], [3, 1], [3, 1], [3, 4], [3, 4], [3, 4], [3, 4], // 011xxx [3, 4], [3, 4], [3, 4], [3, 4], [2, 3], [2, 3], [2, 3], [2, 3], // 10xxxx [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 2], [2, 2], [2, 2], [2, 2], // 11xxxx [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2] ]; function CCITTFaxStream(str, maybeLength, params) { this.str = str; this.dict = str.dict; params = params || Dict.empty; this.encoding = params.get('K') || 0; this.eoline = params.get('EndOfLine') || false; this.byteAlign = params.get('EncodedByteAlign') || false; this.columns = params.get('Columns') || 1728; this.rows = params.get('Rows') || 0; var eoblock = params.get('EndOfBlock'); if (eoblock === null || eoblock === undefined) { eoblock = true; } this.eoblock = eoblock; this.black = params.get('BlackIs1') || false; this.codingLine = new Uint32Array(this.columns + 1); this.refLine = new Uint32Array(this.columns + 2); this.codingLine[0] = this.columns; this.codingPos = 0; this.row = 0; this.nextLine2D = this.encoding < 0; this.inputBits = 0; this.inputBuf = 0; this.outputBits = 0; var code1; while ((code1 = this.lookBits(12)) === 0) { this.eatBits(1); } if (code1 === 1) { this.eatBits(12); } if (this.encoding > 0) { this.nextLine2D = !this.lookBits(1); this.eatBits(1); } DecodeStream.call(this, maybeLength); } CCITTFaxStream.prototype = Object.create(DecodeStream.prototype); CCITTFaxStream.prototype.readBlock = function CCITTFaxStream_readBlock() { while (!this.eof) { var c = this.lookChar(); this.ensureBuffer(this.bufferLength + 1); this.buffer[this.bufferLength++] = c; } }; CCITTFaxStream.prototype.addPixels = function ccittFaxStreamAddPixels(a1, blackPixels) { var codingLine = this.codingLine; var codingPos = this.codingPos; if (a1 > codingLine[codingPos]) { if (a1 > this.columns) { info('row is wrong length'); this.err = true; a1 = this.columns; } if ((codingPos & 1) ^ blackPixels) { ++codingPos; } codingLine[codingPos] = a1; } this.codingPos = codingPos; }; CCITTFaxStream.prototype.addPixelsNeg = function ccittFaxStreamAddPixelsNeg(a1, blackPixels) { var codingLine = this.codingLine; var codingPos = this.codingPos; if (a1 > codingLine[codingPos]) { if (a1 > this.columns) { info('row is wrong length'); this.err = true; a1 = this.columns; } if ((codingPos & 1) ^ blackPixels) { ++codingPos; } codingLine[codingPos] = a1; } else if (a1 < codingLine[codingPos]) { if (a1 < 0) { info('invalid code'); this.err = true; a1 = 0; } while (codingPos > 0 && a1 < codingLine[codingPos - 1]) { --codingPos; } codingLine[codingPos] = a1; } this.codingPos = codingPos; }; CCITTFaxStream.prototype.lookChar = function CCITTFaxStream_lookChar() { var refLine = this.refLine; var codingLine = this.codingLine; var columns = this.columns; var refPos, blackPixels, bits, i; if (this.outputBits === 0) { if (this.eof) { return null; } this.err = false; var code1, code2, code3; if (this.nextLine2D) { for (i = 0; codingLine[i] < columns; ++i) { refLine[i] = codingLine[i]; } refLine[i++] = columns; refLine[i] = columns; codingLine[0] = 0; this.codingPos = 0; refPos = 0; blackPixels = 0; while (codingLine[this.codingPos] < columns) { code1 = this.getTwoDimCode(); switch (code1) { case twoDimPass: this.addPixels(refLine[refPos + 1], blackPixels); if (refLine[refPos + 1] < columns) { refPos += 2; } break; case twoDimHoriz: code1 = code2 = 0; if (blackPixels) { do { code1 += (code3 = this.getBlackCode()); } while (code3 >= 64); do { code2 += (code3 = this.getWhiteCode()); } while (code3 >= 64); } else { do { code1 += (code3 = this.getWhiteCode()); } while (code3 >= 64); do { code2 += (code3 = this.getBlackCode()); } while (code3 >= 64); } this.addPixels(codingLine[this.codingPos] + code1, blackPixels); if (codingLine[this.codingPos] < columns) { this.addPixels(codingLine[this.codingPos] + code2, blackPixels ^ 1); } while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { refPos += 2; } break; case twoDimVertR3: this.addPixels(refLine[refPos] + 3, blackPixels); blackPixels ^= 1; if (codingLine[this.codingPos] < columns) { ++refPos; while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { refPos += 2; } } break; case twoDimVertR2: this.addPixels(refLine[refPos] + 2, blackPixels); blackPixels ^= 1; if (codingLine[this.codingPos] < columns) { ++refPos; while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { refPos += 2; } } break; case twoDimVertR1: this.addPixels(refLine[refPos] + 1, blackPixels); blackPixels ^= 1; if (codingLine[this.codingPos] < columns) { ++refPos; while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { refPos += 2; } } break; case twoDimVert0: this.addPixels(refLine[refPos], blackPixels); blackPixels ^= 1; if (codingLine[this.codingPos] < columns) { ++refPos; while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { refPos += 2; } } break; case twoDimVertL3: this.addPixelsNeg(refLine[refPos] - 3, blackPixels); blackPixels ^= 1; if (codingLine[this.codingPos] < columns) { if (refPos > 0) { --refPos; } else { ++refPos; } while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { refPos += 2; } } break; case twoDimVertL2: this.addPixelsNeg(refLine[refPos] - 2, blackPixels); blackPixels ^= 1; if (codingLine[this.codingPos] < columns) { if (refPos > 0) { --refPos; } else { ++refPos; } while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { refPos += 2; } } break; case twoDimVertL1: this.addPixelsNeg(refLine[refPos] - 1, blackPixels); blackPixels ^= 1; if (codingLine[this.codingPos] < columns) { if (refPos > 0) { --refPos; } else { ++refPos; } while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { refPos += 2; } } break; case ccittEOF: this.addPixels(columns, 0); this.eof = true; break; default: info('bad 2d code'); this.addPixels(columns, 0); this.err = true; } } } else { codingLine[0] = 0; this.codingPos = 0; blackPixels = 0; while (codingLine[this.codingPos] < columns) { code1 = 0; if (blackPixels) { do { code1 += (code3 = this.getBlackCode()); } while (code3 >= 64); } else { do { code1 += (code3 = this.getWhiteCode()); } while (code3 >= 64); } this.addPixels(codingLine[this.codingPos] + code1, blackPixels); blackPixels ^= 1; } } var gotEOL = false; if (this.byteAlign) { this.inputBits &= ~7; } if (!this.eoblock && this.row === this.rows - 1) { this.eof = true; } else { code1 = this.lookBits(12); if (this.eoline) { while (code1 !== ccittEOF && code1 !== 1) { this.eatBits(1); code1 = this.lookBits(12); } } else { while (code1 === 0) { this.eatBits(1); code1 = this.lookBits(12); } } if (code1 === 1) { this.eatBits(12); gotEOL = true; } else if (code1 === ccittEOF) { this.eof = true; } } if (!this.eof && this.encoding > 0) { this.nextLine2D = !this.lookBits(1); this.eatBits(1); } if (this.eoblock && gotEOL && this.byteAlign) { code1 = this.lookBits(12); if (code1 === 1) { this.eatBits(12); if (this.encoding > 0) { this.lookBits(1); this.eatBits(1); } if (this.encoding >= 0) { for (i = 0; i < 4; ++i) { code1 = this.lookBits(12); if (code1 !== 1) { info('bad rtc code: ' + code1); } this.eatBits(12); if (this.encoding > 0) { this.lookBits(1); this.eatBits(1); } } } this.eof = true; } } else if (this.err && this.eoline) { while (true) { code1 = this.lookBits(13); if (code1 === ccittEOF) { this.eof = true; return null; } if ((code1 >> 1) === 1) { break; } this.eatBits(1); } this.eatBits(12); if (this.encoding > 0) { this.eatBits(1); this.nextLine2D = !(code1 & 1); } } if (codingLine[0] > 0) { this.outputBits = codingLine[this.codingPos = 0]; } else { this.outputBits = codingLine[this.codingPos = 1]; } this.row++; } var c; if (this.outputBits >= 8) { c = (this.codingPos & 1) ? 0 : 0xFF; this.outputBits -= 8; if (this.outputBits === 0 && codingLine[this.codingPos] < columns) { this.codingPos++; this.outputBits = (codingLine[this.codingPos] - codingLine[this.codingPos - 1]); } } else { bits = 8; c = 0; do { if (this.outputBits > bits) { c <<= bits; if (!(this.codingPos & 1)) { c |= 0xFF >> (8 - bits); } this.outputBits -= bits; bits = 0; } else { c <<= this.outputBits; if (!(this.codingPos & 1)) { c |= 0xFF >> (8 - this.outputBits); } bits -= this.outputBits; this.outputBits = 0; if (codingLine[this.codingPos] < columns) { this.codingPos++; this.outputBits = (codingLine[this.codingPos] - codingLine[this.codingPos - 1]); } else if (bits > 0) { c <<= bits; bits = 0; } } } while (bits); } if (this.black) { c ^= 0xFF; } return c; }; // This functions returns the code found from the table. // The start and end parameters set the boundaries for searching the table. // The limit parameter is optional. Function returns an array with three // values. The first array element indicates whether a valid code is being // returned. The second array element is the actual code. The third array // element indicates whether EOF was reached. CCITTFaxStream.prototype.findTableCode = function ccittFaxStreamFindTableCode(start, end, table, limit) { var limitValue = limit || 0; for (var i = start; i <= end; ++i) { var code = this.lookBits(i); if (code === ccittEOF) { return [true, 1, false]; } if (i < end) { code <<= end - i; } if (!limitValue || code >= limitValue) { var p = table[code - limitValue]; if (p[0] === i) { this.eatBits(i); return [true, p[1], true]; } } } return [false, 0, false]; }; CCITTFaxStream.prototype.getTwoDimCode = function ccittFaxStreamGetTwoDimCode() { var code = 0; var p; if (this.eoblock) { code = this.lookBits(7); p = twoDimTable[code]; if (p && p[0] > 0) { this.eatBits(p[0]); return p[1]; } } else { var result = this.findTableCode(1, 7, twoDimTable); if (result[0] && result[2]) { return result[1]; } } info('Bad two dim code'); return ccittEOF; }; CCITTFaxStream.prototype.getWhiteCode = function ccittFaxStreamGetWhiteCode() { var code = 0; var p; if (this.eoblock) { code = this.lookBits(12); if (code === ccittEOF) { return 1; } if ((code >> 5) === 0) { p = whiteTable1[code]; } else { p = whiteTable2[code >> 3]; } if (p[0] > 0) { this.eatBits(p[0]); return p[1]; } } else { var result = this.findTableCode(1, 9, whiteTable2); if (result[0]) { return result[1]; } result = this.findTableCode(11, 12, whiteTable1); if (result[0]) { return result[1]; } } info('bad white code'); this.eatBits(1); return 1; }; CCITTFaxStream.prototype.getBlackCode = function ccittFaxStreamGetBlackCode() { var code, p; if (this.eoblock) { code = this.lookBits(13); if (code === ccittEOF) { return 1; } if ((code >> 7) === 0) { p = blackTable1[code]; } else if ((code >> 9) === 0 && (code >> 7) !== 0) { p = blackTable2[(code >> 1) - 64]; } else { p = blackTable3[code >> 7]; } if (p[0] > 0) { this.eatBits(p[0]); return p[1]; } } else { var result = this.findTableCode(2, 6, blackTable3); if (result[0]) { return result[1]; } result = this.findTableCode(7, 12, blackTable2, 64); if (result[0]) { return result[1]; } result = this.findTableCode(10, 13, blackTable1); if (result[0]) { return result[1]; } } info('bad black code'); this.eatBits(1); return 1; }; CCITTFaxStream.prototype.lookBits = function CCITTFaxStream_lookBits(n) { var c; while (this.inputBits < n) { if ((c = this.str.getByte()) === -1) { if (this.inputBits === 0) { return ccittEOF; } return ((this.inputBuf << (n - this.inputBits)) & (0xFFFF >> (16 - n))); } this.inputBuf = (this.inputBuf << 8) | c; this.inputBits += 8; } return (this.inputBuf >> (this.inputBits - n)) & (0xFFFF >> (16 - n)); }; CCITTFaxStream.prototype.eatBits = function CCITTFaxStream_eatBits(n) { if ((this.inputBits -= n) < 0) { this.inputBits = 0; } }; return CCITTFaxStream; })(); var LZWStream = (function LZWStreamClosure() { function LZWStream(str, maybeLength, earlyChange) { this.str = str; this.dict = str.dict; this.cachedData = 0; this.bitsCached = 0; var maxLzwDictionarySize = 4096; var lzwState = { earlyChange: earlyChange, codeLength: 9, nextCode: 258, dictionaryValues: new Uint8Array(maxLzwDictionarySize), dictionaryLengths: new Uint16Array(maxLzwDictionarySize), dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize), currentSequence: new Uint8Array(maxLzwDictionarySize), currentSequenceLength: 0 }; for (var i = 0; i < 256; ++i) { lzwState.dictionaryValues[i] = i; lzwState.dictionaryLengths[i] = 1; } this.lzwState = lzwState; DecodeStream.call(this, maybeLength); } LZWStream.prototype = Object.create(DecodeStream.prototype); LZWStream.prototype.readBits = function LZWStream_readBits(n) { var bitsCached = this.bitsCached; var cachedData = this.cachedData; while (bitsCached < n) { var c = this.str.getByte(); if (c === -1) { this.eof = true; return null; } cachedData = (cachedData << 8) | c; bitsCached += 8; } this.bitsCached = (bitsCached -= n); this.cachedData = cachedData; this.lastCode = null; return (cachedData >>> bitsCached) & ((1 << n) - 1); }; LZWStream.prototype.readBlock = function LZWStream_readBlock() { var blockSize = 512; var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize; var i, j, q; var lzwState = this.lzwState; if (!lzwState) { return; // eof was found } var earlyChange = lzwState.earlyChange; var nextCode = lzwState.nextCode; var dictionaryValues = lzwState.dictionaryValues; var dictionaryLengths = lzwState.dictionaryLengths; var dictionaryPrevCodes = lzwState.dictionaryPrevCodes; var codeLength = lzwState.codeLength; var prevCode = lzwState.prevCode; var currentSequence = lzwState.currentSequence; var currentSequenceLength = lzwState.currentSequenceLength; var decodedLength = 0; var currentBufferLength = this.bufferLength; var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); for (i = 0; i < blockSize; i++) { var code = this.readBits(codeLength); var hasPrev = currentSequenceLength > 0; if (code < 256) { currentSequence[0] = code; currentSequenceLength = 1; } else if (code >= 258) { if (code < nextCode) { currentSequenceLength = dictionaryLengths[code]; for (j = currentSequenceLength - 1, q = code; j >= 0; j--) { currentSequence[j] = dictionaryValues[q]; q = dictionaryPrevCodes[q]; } } else { currentSequence[currentSequenceLength++] = currentSequence[0]; } } else if (code === 256) { codeLength = 9; nextCode = 258; currentSequenceLength = 0; continue; } else { this.eof = true; delete this.lzwState; break; } if (hasPrev) { dictionaryPrevCodes[nextCode] = prevCode; dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1; dictionaryValues[nextCode] = currentSequence[0]; nextCode++; codeLength = (nextCode + earlyChange) & (nextCode + earlyChange - 1) ? codeLength : Math.min(Math.log(nextCode + earlyChange) / 0.6931471805599453 + 1, 12) | 0; } prevCode = code; decodedLength += currentSequenceLength; if (estimatedDecodedSize < decodedLength) { do { estimatedDecodedSize += decodedSizeDelta; } while (estimatedDecodedSize < decodedLength); buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); } for (j = 0; j < currentSequenceLength; j++) { buffer[currentBufferLength++] = currentSequence[j]; } } lzwState.nextCode = nextCode; lzwState.codeLength = codeLength; lzwState.prevCode = prevCode; lzwState.currentSequenceLength = currentSequenceLength; this.bufferLength = currentBufferLength; }; return LZWStream; })(); var NullStream = (function NullStreamClosure() { function NullStream() { Stream.call(this, new Uint8Array(0)); } NullStream.prototype = Stream.prototype; return NullStream; })(); exports.Ascii85Stream = Ascii85Stream; exports.AsciiHexStream = AsciiHexStream; exports.CCITTFaxStream = CCITTFaxStream; exports.DecryptStream = DecryptStream; exports.DecodeStream = DecodeStream; exports.FlateStream = FlateStream; exports.Jbig2Stream = Jbig2Stream; exports.JpegStream = JpegStream; exports.JpxStream = JpxStream; exports.NullStream = NullStream; exports.PredictorStream = PredictorStream; exports.RunLengthStream = RunLengthStream; exports.Stream = Stream; exports.StreamsSequenceStream = StreamsSequenceStream; exports.StringStream = StringStream; exports.LZWStream = LZWStream; })); (function (root, factory) { { factory((root.pdfjsCoreCrypto = {}), root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreStream); } }(this, function (exports, sharedUtil, corePrimitives, coreStream) { var PasswordException = sharedUtil.PasswordException; var PasswordResponses = sharedUtil.PasswordResponses; var bytesToString = sharedUtil.bytesToString; var error = sharedUtil.error; var isInt = sharedUtil.isInt; var stringToBytes = sharedUtil.stringToBytes; var utf8StringToString = sharedUtil.utf8StringToString; var warn = sharedUtil.warn; var Name = corePrimitives.Name; var isName = corePrimitives.isName; var isDict = corePrimitives.isDict; var DecryptStream = coreStream.DecryptStream; var ARCFourCipher = (function ARCFourCipherClosure() { function ARCFourCipher(key) { this.a = 0; this.b = 0; var s = new Uint8Array(256); var i, j = 0, tmp, keyLength = key.length; for (i = 0; i < 256; ++i) { s[i] = i; } for (i = 0; i < 256; ++i) { tmp = s[i]; j = (j + tmp + key[i % keyLength]) & 0xFF; s[i] = s[j]; s[j] = tmp; } this.s = s; } ARCFourCipher.prototype = { encryptBlock: function ARCFourCipher_encryptBlock(data) { var i, n = data.length, tmp, tmp2; var a = this.a, b = this.b, s = this.s; var output = new Uint8Array(n); for (i = 0; i < n; ++i) { a = (a + 1) & 0xFF; tmp = s[a]; b = (b + tmp) & 0xFF; tmp2 = s[b]; s[a] = tmp2; s[b] = tmp; output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF]; } this.a = a; this.b = b; return output; } }; ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock; return ARCFourCipher; })(); var calculateMD5 = (function calculateMD5Closure() { var r = new Uint8Array([ 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]); var k = new Int32Array([ -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, -145523070, -1120210379, 718787259, -343485551]); function hash(data, offset, length) { var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878; // pre-processing var paddedLength = (length + 72) & ~63; // data + 9 extra bytes var padded = new Uint8Array(paddedLength); var i, j, n; for (i = 0; i < length; ++i) { padded[i] = data[offset++]; } padded[i++] = 0x80; n = paddedLength - 8; while (i < n) { padded[i++] = 0; } padded[i++] = (length << 3) & 0xFF; padded[i++] = (length >> 5) & 0xFF; padded[i++] = (length >> 13) & 0xFF; padded[i++] = (length >> 21) & 0xFF; padded[i++] = (length >>> 29) & 0xFF; padded[i++] = 0; padded[i++] = 0; padded[i++] = 0; var w = new Int32Array(16); for (i = 0; i < paddedLength;) { for (j = 0; j < 16; ++j, i += 4) { w[j] = (padded[i] | (padded[i + 1] << 8) | (padded[i + 2] << 16) | (padded[i + 3] << 24)); } var a = h0, b = h1, c = h2, d = h3, f, g; for (j = 0; j < 64; ++j) { if (j < 16) { f = (b & c) | ((~b) & d); g = j; } else if (j < 32) { f = (d & b) | ((~d) & c); g = (5 * j + 1) & 15; } else if (j < 48) { f = b ^ c ^ d; g = (3 * j + 5) & 15; } else { f = c ^ (b | (~d)); g = (7 * j) & 15; } var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j]; d = c; c = b; b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0; a = tmp; } h0 = (h0 + a) | 0; h1 = (h1 + b) | 0; h2 = (h2 + c) | 0; h3 = (h3 + d) | 0; } return new Uint8Array([ h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF, h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF, h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF, h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF ]); } return hash; })(); var Word64 = (function Word64Closure() { function Word64(highInteger, lowInteger) { this.high = highInteger | 0; this.low = lowInteger | 0; } Word64.prototype = { and: function Word64_and(word) { this.high &= word.high; this.low &= word.low; }, xor: function Word64_xor(word) { this.high ^= word.high; this.low ^= word.low; }, or: function Word64_or(word) { this.high |= word.high; this.low |= word.low; }, shiftRight: function Word64_shiftRight(places) { if (places >= 32) { this.low = (this.high >>> (places - 32)) | 0; this.high = 0; } else { this.low = (this.low >>> places) | (this.high << (32 - places)); this.high = (this.high >>> places) | 0; } }, shiftLeft: function Word64_shiftLeft(places) { if (places >= 32) { this.high = this.low << (places - 32); this.low = 0; } else { this.high = (this.high << places) | (this.low >>> (32 - places)); this.low = this.low << places; } }, rotateRight: function Word64_rotateRight(places) { var low, high; if (places & 32) { high = this.low; low = this.high; } else { low = this.low; high = this.high; } places &= 31; this.low = (low >>> places) | (high << (32 - places)); this.high = (high >>> places) | (low << (32 - places)); }, not: function Word64_not() { this.high = ~this.high; this.low = ~this.low; }, add: function Word64_add(word) { var lowAdd = (this.low >>> 0) + (word.low >>> 0); var highAdd = (this.high >>> 0) + (word.high >>> 0); if (lowAdd > 0xFFFFFFFF) { highAdd += 1; } this.low = lowAdd | 0; this.high = highAdd | 0; }, copyTo: function Word64_copyTo(bytes, offset) { bytes[offset] = (this.high >>> 24) & 0xFF; bytes[offset + 1] = (this.high >> 16) & 0xFF; bytes[offset + 2] = (this.high >> 8) & 0xFF; bytes[offset + 3] = this.high & 0xFF; bytes[offset + 4] = (this.low >>> 24) & 0xFF; bytes[offset + 5] = (this.low >> 16) & 0xFF; bytes[offset + 6] = (this.low >> 8) & 0xFF; bytes[offset + 7] = this.low & 0xFF; }, assign: function Word64_assign(word) { this.high = word.high; this.low = word.low; } }; return Word64; })(); var calculateSHA256 = (function calculateSHA256Closure() { function rotr(x, n) { return (x >>> n) | (x << 32 - n); } function ch(x, y, z) { return (x & y) ^ (~x & z); } function maj(x, y, z) { return (x & y) ^ (x & z) ^ (y & z); } function sigma(x) { return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22); } function sigmaPrime(x) { return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25); } function littleSigma(x) { return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3; } function littleSigmaPrime(x) { return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10; } var k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]; function hash(data, offset, length) { // initial hash values var h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372, h3 = 0xa54ff53a, h4 = 0x510e527f, h5 = 0x9b05688c, h6 = 0x1f83d9ab, h7 = 0x5be0cd19; // pre-processing var paddedLength = Math.ceil((length + 9) / 64) * 64; var padded = new Uint8Array(paddedLength); var i, j, n; for (i = 0; i < length; ++i) { padded[i] = data[offset++]; } padded[i++] = 0x80; n = paddedLength - 8; while (i < n) { padded[i++] = 0; } padded[i++] = 0; padded[i++] = 0; padded[i++] = 0; padded[i++] = (length >>> 29) & 0xFF; padded[i++] = (length >> 21) & 0xFF; padded[i++] = (length >> 13) & 0xFF; padded[i++] = (length >> 5) & 0xFF; padded[i++] = (length << 3) & 0xFF; var w = new Uint32Array(64); // for each 512 bit block for (i = 0; i < paddedLength;) { for (j = 0; j < 16; ++j) { w[j] = (padded[i] << 24 | (padded[i + 1] << 16) | (padded[i + 2] << 8) | (padded[i + 3])); i += 4; } for (j = 16; j < 64; ++j) { w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] + littleSigma(w[j - 15]) + w[j - 16] | 0; } var a = h0, b = h1, c = h2, d = h3, e = h4, f = h5, g = h6, h = h7, t1, t2; for (j = 0; j < 64; ++j) { t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j]; t2 = sigma(a) + maj(a, b, c); h = g; g = f; f = e; e = (d + t1) | 0; d = c; c = b; b = a; a = (t1 + t2) | 0; } h0 = (h0 + a) | 0; h1 = (h1 + b) | 0; h2 = (h2 + c) | 0; h3 = (h3 + d) | 0; h4 = (h4 + e) | 0; h5 = (h5 + f) | 0; h6 = (h6 + g) | 0; h7 = (h7 + h) | 0; } return new Uint8Array([ (h0 >> 24) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 8) & 0xFF, (h0) & 0xFF, (h1 >> 24) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 8) & 0xFF, (h1) & 0xFF, (h2 >> 24) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 8) & 0xFF, (h2) & 0xFF, (h3 >> 24) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 8) & 0xFF, (h3) & 0xFF, (h4 >> 24) & 0xFF, (h4 >> 16) & 0xFF, (h4 >> 8) & 0xFF, (h4) & 0xFF, (h5 >> 24) & 0xFF, (h5 >> 16) & 0xFF, (h5 >> 8) & 0xFF, (h5) & 0xFF, (h6 >> 24) & 0xFF, (h6 >> 16) & 0xFF, (h6 >> 8) & 0xFF, (h6) & 0xFF, (h7 >> 24) & 0xFF, (h7 >> 16) & 0xFF, (h7 >> 8) & 0xFF, (h7) & 0xFF ]); } return hash; })(); var calculateSHA512 = (function calculateSHA512Closure() { function ch(result, x, y, z, tmp) { result.assign(x); result.and(y); tmp.assign(x); tmp.not(); tmp.and(z); result.xor(tmp); } function maj(result, x, y, z, tmp) { result.assign(x); result.and(y); tmp.assign(x); tmp.and(z); result.xor(tmp); tmp.assign(y); tmp.and(z); result.xor(tmp); } function sigma(result, x, tmp) { result.assign(x); result.rotateRight(28); tmp.assign(x); tmp.rotateRight(34); result.xor(tmp); tmp.assign(x); tmp.rotateRight(39); result.xor(tmp); } function sigmaPrime(result, x, tmp) { result.assign(x); result.rotateRight(14); tmp.assign(x); tmp.rotateRight(18); result.xor(tmp); tmp.assign(x); tmp.rotateRight(41); result.xor(tmp); } function littleSigma(result, x, tmp) { result.assign(x); result.rotateRight(1); tmp.assign(x); tmp.rotateRight(8); result.xor(tmp); tmp.assign(x); tmp.shiftRight(7); result.xor(tmp); } function littleSigmaPrime(result, x, tmp) { result.assign(x); result.rotateRight(19); tmp.assign(x); tmp.rotateRight(61); result.xor(tmp); tmp.assign(x); tmp.shiftRight(6); result.xor(tmp); } var k = [ new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019), new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe), new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2), new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694), new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3), new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5), new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4), new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926), new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b), new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910), new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8), new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3), new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9), new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178), new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493), new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)]; function hash(data, offset, length, mode384) { mode384 = !!mode384; // initial hash values var h0, h1, h2, h3, h4, h5, h6, h7; if (!mode384) { h0 = new Word64(0x6a09e667, 0xf3bcc908); h1 = new Word64(0xbb67ae85, 0x84caa73b); h2 = new Word64(0x3c6ef372, 0xfe94f82b); h3 = new Word64(0xa54ff53a, 0x5f1d36f1); h4 = new Word64(0x510e527f, 0xade682d1); h5 = new Word64(0x9b05688c, 0x2b3e6c1f); h6 = new Word64(0x1f83d9ab, 0xfb41bd6b); h7 = new Word64(0x5be0cd19, 0x137e2179); } else { // SHA384 is exactly the same // except with different starting values and a trimmed result h0 = new Word64(0xcbbb9d5d, 0xc1059ed8); h1 = new Word64(0x629a292a, 0x367cd507); h2 = new Word64(0x9159015a, 0x3070dd17); h3 = new Word64(0x152fecd8, 0xf70e5939); h4 = new Word64(0x67332667, 0xffc00b31); h5 = new Word64(0x8eb44a87, 0x68581511); h6 = new Word64(0xdb0c2e0d, 0x64f98fa7); h7 = new Word64(0x47b5481d, 0xbefa4fa4); } // pre-processing var paddedLength = Math.ceil((length + 17) / 128) * 128; var padded = new Uint8Array(paddedLength); var i, j, n; for (i = 0; i < length; ++i) { padded[i] = data[offset++]; } padded[i++] = 0x80; n = paddedLength - 16; while (i < n) { padded[i++] = 0; } padded[i++] = 0; padded[i++] = 0; padded[i++] = 0; padded[i++] = 0; padded[i++] = 0; padded[i++] = 0; padded[i++] = 0; padded[i++] = 0; padded[i++] = 0; padded[i++] = 0; padded[i++] = 0; padded[i++] = (length >>> 29) & 0xFF; padded[i++] = (length >> 21) & 0xFF; padded[i++] = (length >> 13) & 0xFF; padded[i++] = (length >> 5) & 0xFF; padded[i++] = (length << 3) & 0xFF; var w = new Array(80); for (i = 0; i < 80; i++) { w[i] = new Word64(0, 0); } var a = new Word64(0, 0), b = new Word64(0, 0), c = new Word64(0, 0); var d = new Word64(0, 0), e = new Word64(0, 0), f = new Word64(0, 0); var g = new Word64(0, 0), h = new Word64(0, 0); var t1 = new Word64(0, 0), t2 = new Word64(0, 0); var tmp1 = new Word64(0, 0), tmp2 = new Word64(0, 0), tmp3; // for each 1024 bit block for (i = 0; i < paddedLength;) { for (j = 0; j < 16; ++j) { w[j].high = (padded[i] << 24) | (padded[i + 1] << 16) | (padded[i + 2] << 8) | (padded[i + 3]); w[j].low = (padded[i + 4]) << 24 | (padded[i + 5]) << 16 | (padded[i + 6]) << 8 | (padded[i + 7]); i += 8; } for (j = 16; j < 80; ++j) { tmp3 = w[j]; littleSigmaPrime(tmp3, w[j - 2], tmp2); tmp3.add(w[j - 7]); littleSigma(tmp1, w[j - 15], tmp2); tmp3.add(tmp1); tmp3.add(w[j - 16]); } a.assign(h0); b.assign(h1); c.assign(h2); d.assign(h3); e.assign(h4); f.assign(h5); g.assign(h6); h.assign(h7); for (j = 0; j < 80; ++j) { t1.assign(h); sigmaPrime(tmp1, e, tmp2); t1.add(tmp1); ch(tmp1, e, f, g, tmp2); t1.add(tmp1); t1.add(k[j]); t1.add(w[j]); sigma(t2, a, tmp2); maj(tmp1, a, b, c, tmp2); t2.add(tmp1); tmp3 = h; h = g; g = f; f = e; d.add(t1); e = d; d = c; c = b; b = a; tmp3.assign(t1); tmp3.add(t2); a = tmp3; } h0.add(a); h1.add(b); h2.add(c); h3.add(d); h4.add(e); h5.add(f); h6.add(g); h7.add(h); } var result; if (!mode384) { result = new Uint8Array(64); h0.copyTo(result,0); h1.copyTo(result,8); h2.copyTo(result,16); h3.copyTo(result,24); h4.copyTo(result,32); h5.copyTo(result,40); h6.copyTo(result,48); h7.copyTo(result,56); } else { result = new Uint8Array(48); h0.copyTo(result,0); h1.copyTo(result,8); h2.copyTo(result,16); h3.copyTo(result,24); h4.copyTo(result,32); h5.copyTo(result,40); } return result; } return hash; })(); var calculateSHA384 = (function calculateSHA384Closure() { function hash(data, offset, length) { return calculateSHA512(data, offset, length, true); } return hash; })(); var NullCipher = (function NullCipherClosure() { function NullCipher() { } NullCipher.prototype = { decryptBlock: function NullCipher_decryptBlock(data) { return data; } }; return NullCipher; })(); var AES128Cipher = (function AES128CipherClosure() { var rcon = new Uint8Array([ 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d]); var s = new Uint8Array([ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]); var inv_s = new Uint8Array([ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]); var mixCol = new Uint8Array(256); for (var i = 0; i < 256; i++) { if (i < 128) { mixCol[i] = i << 1; } else { mixCol[i] = (i << 1) ^ 0x1b; } } var mix = new Uint32Array([ 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]); function expandKey128(cipherKey) { var b = 176, result = new Uint8Array(b); result.set(cipherKey); for (var j = 16, i = 1; j < b; ++i) { // RotWord var t1 = result[j - 3], t2 = result[j - 2], t3 = result[j - 1], t4 = result[j - 4]; // SubWord t1 = s[t1]; t2 = s[t2]; t3 = s[t3]; t4 = s[t4]; // Rcon t1 = t1 ^ rcon[i]; for (var n = 0; n < 4; ++n) { result[j] = (t1 ^= result[j - 16]); j++; result[j] = (t2 ^= result[j - 16]); j++; result[j] = (t3 ^= result[j - 16]); j++; result[j] = (t4 ^= result[j - 16]); j++; } } return result; } function decrypt128(input, key) { var state = new Uint8Array(16); state.set(input); var i, j, k; var t, u, v; // AddRoundKey for (j = 0, k = 160; j < 16; ++j, ++k) { state[j] ^= key[k]; } for (i = 9; i >= 1; --i) { // InvShiftRows t = state[13]; state[13] = state[9]; state[9] = state[5]; state[5] = state[1]; state[1] = t; t = state[14]; u = state[10]; state[14] = state[6]; state[10] = state[2]; state[6] = t; state[2] = u; t = state[15]; u = state[11]; v = state[7]; state[15] = state[3]; state[11] = t; state[7] = u; state[3] = v; // InvSubBytes for (j = 0; j < 16; ++j) { state[j] = inv_s[state[j]]; } // AddRoundKey for (j = 0, k = i * 16; j < 16; ++j, ++k) { state[j] ^= key[k]; } // InvMixColumns for (j = 0; j < 16; j += 4) { var s0 = mix[state[j]], s1 = mix[state[j + 1]], s2 = mix[state[j + 2]], s3 = mix[state[j + 3]]; t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^ (s3 >>> 24) ^ (s3 << 8)); state[j] = (t >>> 24) & 0xFF; state[j + 1] = (t >> 16) & 0xFF; state[j + 2] = (t >> 8) & 0xFF; state[j + 3] = t & 0xFF; } } // InvShiftRows t = state[13]; state[13] = state[9]; state[9] = state[5]; state[5] = state[1]; state[1] = t; t = state[14]; u = state[10]; state[14] = state[6]; state[10] = state[2]; state[6] = t; state[2] = u; t = state[15]; u = state[11]; v = state[7]; state[15] = state[3]; state[11] = t; state[7] = u; state[3] = v; for (j = 0; j < 16; ++j) { // InvSubBytes state[j] = inv_s[state[j]]; // AddRoundKey state[j] ^= key[j]; } return state; } function encrypt128(input, key) { var t, u, v, k; var state = new Uint8Array(16); state.set(input); for (j = 0; j < 16; ++j) { // AddRoundKey state[j] ^= key[j]; } for (i = 1; i < 10; i++) { //SubBytes for (j = 0; j < 16; ++j) { state[j] = s[state[j]]; } //ShiftRows v = state[1]; state[1] = state[5]; state[5] = state[9]; state[9] = state[13]; state[13] = v; v = state[2]; u = state[6]; state[2] = state[10]; state[6] = state[14]; state[10] = v; state[14] = u; v = state[3]; u = state[7]; t = state[11]; state[3] = state[15]; state[7] = v; state[11] = u; state[15] = t; //MixColumns for (var j = 0; j < 16; j += 4) { var s0 = state[j + 0], s1 = state[j + 1]; var s2 = state[j + 2], s3 = state[j + 3]; t = s0 ^ s1 ^ s2 ^ s3; state[j + 0] ^= t ^ mixCol[s0 ^ s1]; state[j + 1] ^= t ^ mixCol[s1 ^ s2]; state[j + 2] ^= t ^ mixCol[s2 ^ s3]; state[j + 3] ^= t ^ mixCol[s3 ^ s0]; } //AddRoundKey for (j = 0, k = i * 16; j < 16; ++j, ++k) { state[j] ^= key[k]; } } //SubBytes for (j = 0; j < 16; ++j) { state[j] = s[state[j]]; } //ShiftRows v = state[1]; state[1] = state[5]; state[5] = state[9]; state[9] = state[13]; state[13] = v; v = state[2]; u = state[6]; state[2] = state[10]; state[6] = state[14]; state[10] = v; state[14] = u; v = state[3]; u = state[7]; t = state[11]; state[3] = state[15]; state[7] = v; state[11] = u; state[15] = t; //AddRoundKey for (j = 0, k = 160; j < 16; ++j, ++k) { state[j] ^= key[k]; } return state; } function AES128Cipher(key) { this.key = expandKey128(key); this.buffer = new Uint8Array(16); this.bufferPosition = 0; } function decryptBlock2(data, finalize) { var i, j, ii, sourceLength = data.length, buffer = this.buffer, bufferLength = this.bufferPosition, result = [], iv = this.iv; for (i = 0; i < sourceLength; ++i) { buffer[bufferLength] = data[i]; ++bufferLength; if (bufferLength < 16) { continue; } // buffer is full, decrypting var plain = decrypt128(buffer, this.key); // xor-ing the IV vector to get plain text for (j = 0; j < 16; ++j) { plain[j] ^= iv[j]; } iv = buffer; result.push(plain); buffer = new Uint8Array(16); bufferLength = 0; } // saving incomplete buffer this.buffer = buffer; this.bufferLength = bufferLength; this.iv = iv; if (result.length === 0) { return new Uint8Array([]); } // combining plain text blocks into one var outputLength = 16 * result.length; if (finalize) { // undo a padding that is described in RFC 2898 var lastBlock = result[result.length - 1]; var psLen = lastBlock[15]; if (psLen <= 16) { for (i = 15, ii = 16 - psLen; i >= ii; --i) { if (lastBlock[i] !== psLen) { // Invalid padding, assume that the block has no padding. psLen = 0; break; } } outputLength -= psLen; result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); } } var output = new Uint8Array(outputLength); for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { output.set(result[i], j); } return output; } AES128Cipher.prototype = { decryptBlock: function AES128Cipher_decryptBlock(data, finalize) { var i, sourceLength = data.length; var buffer = this.buffer, bufferLength = this.bufferPosition; // waiting for IV values -- they are at the start of the stream for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) { buffer[bufferLength] = data[i]; } if (bufferLength < 16) { // need more data this.bufferLength = bufferLength; return new Uint8Array([]); } this.iv = buffer; this.buffer = new Uint8Array(16); this.bufferLength = 0; // starting decryption this.decryptBlock = decryptBlock2; return this.decryptBlock(data.subarray(16), finalize); }, encrypt: function AES128Cipher_encrypt(data, iv) { var i, j, ii, sourceLength = data.length, buffer = this.buffer, bufferLength = this.bufferPosition, result = []; if (!iv) { iv = new Uint8Array(16); } for (i = 0; i < sourceLength; ++i) { buffer[bufferLength] = data[i]; ++bufferLength; if (bufferLength < 16) { continue; } for (j = 0; j < 16; ++j) { buffer[j] ^= iv[j]; } // buffer is full, encrypting var cipher = encrypt128(buffer, this.key); iv = cipher; result.push(cipher); buffer = new Uint8Array(16); bufferLength = 0; } // saving incomplete buffer this.buffer = buffer; this.bufferLength = bufferLength; this.iv = iv; if (result.length === 0) { return new Uint8Array([]); } // combining plain text blocks into one var outputLength = 16 * result.length; var output = new Uint8Array(outputLength); for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { output.set(result[i], j); } return output; } }; return AES128Cipher; })(); var AES256Cipher = (function AES256CipherClosure() { var rcon = new Uint8Array([ 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d]); var s = new Uint8Array([ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]); var inv_s = new Uint8Array([ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]); var mixCol = new Uint8Array(256); for (var i = 0; i < 256; i++) { if (i < 128) { mixCol[i] = i << 1; } else { mixCol[i] = (i << 1) ^ 0x1b; } } var mix = new Uint32Array([ 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]); function expandKey256(cipherKey) { var b = 240, result = new Uint8Array(b); var r = 1; result.set(cipherKey); for (var j = 32, i = 1; j < b; ++i) { if (j % 32 === 16) { t1 = s[t1]; t2 = s[t2]; t3 = s[t3]; t4 = s[t4]; } else if (j % 32 === 0) { // RotWord var t1 = result[j - 3], t2 = result[j - 2], t3 = result[j - 1], t4 = result[j - 4]; // SubWord t1 = s[t1]; t2 = s[t2]; t3 = s[t3]; t4 = s[t4]; // Rcon t1 = t1 ^ r; if ((r <<= 1) >= 256) { r = (r ^ 0x1b) & 0xFF; } } for (var n = 0; n < 4; ++n) { result[j] = (t1 ^= result[j - 32]); j++; result[j] = (t2 ^= result[j - 32]); j++; result[j] = (t3 ^= result[j - 32]); j++; result[j] = (t4 ^= result[j - 32]); j++; } } return result; } function decrypt256(input, key) { var state = new Uint8Array(16); state.set(input); var i, j, k; var t, u, v; // AddRoundKey for (j = 0, k = 224; j < 16; ++j, ++k) { state[j] ^= key[k]; } for (i = 13; i >= 1; --i) { // InvShiftRows t = state[13]; state[13] = state[9]; state[9] = state[5]; state[5] = state[1]; state[1] = t; t = state[14]; u = state[10]; state[14] = state[6]; state[10] = state[2]; state[6] = t; state[2] = u; t = state[15]; u = state[11]; v = state[7]; state[15] = state[3]; state[11] = t; state[7] = u; state[3] = v; // InvSubBytes for (j = 0; j < 16; ++j) { state[j] = inv_s[state[j]]; } // AddRoundKey for (j = 0, k = i * 16; j < 16; ++j, ++k) { state[j] ^= key[k]; } // InvMixColumns for (j = 0; j < 16; j += 4) { var s0 = mix[state[j]], s1 = mix[state[j + 1]], s2 = mix[state[j + 2]], s3 = mix[state[j + 3]]; t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^ (s3 >>> 24) ^ (s3 << 8)); state[j] = (t >>> 24) & 0xFF; state[j + 1] = (t >> 16) & 0xFF; state[j + 2] = (t >> 8) & 0xFF; state[j + 3] = t & 0xFF; } } // InvShiftRows t = state[13]; state[13] = state[9]; state[9] = state[5]; state[5] = state[1]; state[1] = t; t = state[14]; u = state[10]; state[14] = state[6]; state[10] = state[2]; state[6] = t; state[2] = u; t = state[15]; u = state[11]; v = state[7]; state[15] = state[3]; state[11] = t; state[7] = u; state[3] = v; for (j = 0; j < 16; ++j) { // InvSubBytes state[j] = inv_s[state[j]]; // AddRoundKey state[j] ^= key[j]; } return state; } function encrypt256(input, key) { var t, u, v, k; var state = new Uint8Array(16); state.set(input); for (j = 0; j < 16; ++j) { // AddRoundKey state[j] ^= key[j]; } for (i = 1; i < 14; i++) { //SubBytes for (j = 0; j < 16; ++j) { state[j] = s[state[j]]; } //ShiftRows v = state[1]; state[1] = state[5]; state[5] = state[9]; state[9] = state[13]; state[13] = v; v = state[2]; u = state[6]; state[2] = state[10]; state[6] = state[14]; state[10] = v; state[14] = u; v = state[3]; u = state[7]; t = state[11]; state[3] = state[15]; state[7] = v; state[11] = u; state[15] = t; //MixColumns for (var j = 0; j < 16; j += 4) { var s0 = state[j + 0], s1 = state[j + 1]; var s2 = state[j + 2], s3 = state[j + 3]; t = s0 ^ s1 ^ s2 ^ s3; state[j + 0] ^= t ^ mixCol[s0 ^ s1]; state[j + 1] ^= t ^ mixCol[s1 ^ s2]; state[j + 2] ^= t ^ mixCol[s2 ^ s3]; state[j + 3] ^= t ^ mixCol[s3 ^ s0]; } //AddRoundKey for (j = 0, k = i * 16; j < 16; ++j, ++k) { state[j] ^= key[k]; } } //SubBytes for (j = 0; j < 16; ++j) { state[j] = s[state[j]]; } //ShiftRows v = state[1]; state[1] = state[5]; state[5] = state[9]; state[9] = state[13]; state[13] = v; v = state[2]; u = state[6]; state[2] = state[10]; state[6] = state[14]; state[10] = v; state[14] = u; v = state[3]; u = state[7]; t = state[11]; state[3] = state[15]; state[7] = v; state[11] = u; state[15] = t; //AddRoundKey for (j = 0, k = 224; j < 16; ++j, ++k) { state[j] ^= key[k]; } return state; } function AES256Cipher(key) { this.key = expandKey256(key); this.buffer = new Uint8Array(16); this.bufferPosition = 0; } function decryptBlock2(data, finalize) { var i, j, ii, sourceLength = data.length, buffer = this.buffer, bufferLength = this.bufferPosition, result = [], iv = this.iv; for (i = 0; i < sourceLength; ++i) { buffer[bufferLength] = data[i]; ++bufferLength; if (bufferLength < 16) { continue; } // buffer is full, decrypting var plain = decrypt256(buffer, this.key); // xor-ing the IV vector to get plain text for (j = 0; j < 16; ++j) { plain[j] ^= iv[j]; } iv = buffer; result.push(plain); buffer = new Uint8Array(16); bufferLength = 0; } // saving incomplete buffer this.buffer = buffer; this.bufferLength = bufferLength; this.iv = iv; if (result.length === 0) { return new Uint8Array([]); } // combining plain text blocks into one var outputLength = 16 * result.length; if (finalize) { // undo a padding that is described in RFC 2898 var lastBlock = result[result.length - 1]; var psLen = lastBlock[15]; if (psLen <= 16) { for (i = 15, ii = 16 - psLen; i >= ii; --i) { if (lastBlock[i] !== psLen) { // Invalid padding, assume that the block has no padding. psLen = 0; break; } } outputLength -= psLen; result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); } } var output = new Uint8Array(outputLength); for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { output.set(result[i], j); } return output; } AES256Cipher.prototype = { decryptBlock: function AES256Cipher_decryptBlock(data, finalize, iv) { var i, sourceLength = data.length; var buffer = this.buffer, bufferLength = this.bufferPosition; // if not supplied an IV wait for IV values // they are at the start of the stream if (iv) { this.iv = iv; } else { for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) { buffer[bufferLength] = data[i]; } if (bufferLength < 16) { //need more data this.bufferLength = bufferLength; return new Uint8Array([]); } this.iv = buffer; data = data.subarray(16); } this.buffer = new Uint8Array(16); this.bufferLength = 0; // starting decryption this.decryptBlock = decryptBlock2; return this.decryptBlock(data, finalize); }, encrypt: function AES256Cipher_encrypt(data, iv) { var i, j, ii, sourceLength = data.length, buffer = this.buffer, bufferLength = this.bufferPosition, result = []; if (!iv) { iv = new Uint8Array(16); } for (i = 0; i < sourceLength; ++i) { buffer[bufferLength] = data[i]; ++bufferLength; if (bufferLength < 16) { continue; } for (j = 0; j < 16; ++j) { buffer[j] ^= iv[j]; } // buffer is full, encrypting var cipher = encrypt256(buffer, this.key); this.iv = cipher; result.push(cipher); buffer = new Uint8Array(16); bufferLength = 0; } // saving incomplete buffer this.buffer = buffer; this.bufferLength = bufferLength; this.iv = iv; if (result.length === 0) { return new Uint8Array([]); } // combining plain text blocks into one var outputLength = 16 * result.length; var output = new Uint8Array(outputLength); for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { output.set(result[i], j); } return output; } }; return AES256Cipher; })(); var PDF17 = (function PDF17Closure() { function compareByteArrays(array1, array2) { if (array1.length !== array2.length) { return false; } for (var i = 0; i < array1.length; i++) { if (array1[i] !== array2[i]) { return false; } } return true; } function PDF17() { } PDF17.prototype = { checkOwnerPassword: function PDF17_checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) { var hashData = new Uint8Array(password.length + 56); hashData.set(password, 0); hashData.set(ownerValidationSalt, password.length); hashData.set(userBytes, password.length + ownerValidationSalt.length); var result = calculateSHA256(hashData, 0, hashData.length); return compareByteArrays(result, ownerPassword); }, checkUserPassword: function PDF17_checkUserPassword(password, userValidationSalt, userPassword) { var hashData = new Uint8Array(password.length + 8); hashData.set(password, 0); hashData.set(userValidationSalt, password.length); var result = calculateSHA256(hashData, 0, hashData.length); return compareByteArrays(result, userPassword); }, getOwnerKey: function PDF17_getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) { var hashData = new Uint8Array(password.length + 56); hashData.set(password, 0); hashData.set(ownerKeySalt, password.length); hashData.set(userBytes, password.length + ownerKeySalt.length); var key = calculateSHA256(hashData, 0, hashData.length); var cipher = new AES256Cipher(key); return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16)); }, getUserKey: function PDF17_getUserKey(password, userKeySalt, userEncryption) { var hashData = new Uint8Array(password.length + 8); hashData.set(password, 0); hashData.set(userKeySalt, password.length); //key is the decryption key for the UE string var key = calculateSHA256(hashData, 0, hashData.length); var cipher = new AES256Cipher(key); return cipher.decryptBlock(userEncryption, false, new Uint8Array(16)); } }; return PDF17; })(); var PDF20 = (function PDF20Closure() { function concatArrays(array1, array2) { var t = new Uint8Array(array1.length + array2.length); t.set(array1, 0); t.set(array2, array1.length); return t; } function calculatePDF20Hash(password, input, userBytes) { //This refers to Algorithm 2.B as defined in ISO 32000-2 var k = calculateSHA256(input, 0, input.length).subarray(0, 32); var e = [0]; var i = 0; while (i < 64 || e[e.length - 1] > i - 32) { var arrayLength = password.length + k.length + userBytes.length; var k1 = new Uint8Array(arrayLength * 64); var array = concatArrays(password, k); array = concatArrays(array, userBytes); for (var j = 0, pos = 0; j < 64; j++, pos += arrayLength) { k1.set(array, pos); } //AES128 CBC NO PADDING with //first 16 bytes of k as the key and the second 16 as the iv. var cipher = new AES128Cipher(k.subarray(0, 16)); e = cipher.encrypt(k1, k.subarray(16, 32)); //Now we have to take the first 16 bytes of an unsigned //big endian integer... and compute the remainder //modulo 3.... That is a fairly large number and //JavaScript isn't going to handle that well... //So we're using a trick that allows us to perform //modulo math byte by byte var remainder = 0; for (var z = 0; z < 16; z++) { remainder *= (256 % 3); remainder %= 3; remainder += ((e[z] >>> 0) % 3); remainder %= 3; } if (remainder === 0) { k = calculateSHA256(e, 0, e.length); } else if (remainder === 1) { k = calculateSHA384(e, 0, e.length); } else if (remainder === 2) { k = calculateSHA512(e, 0, e.length); } i++; } return k.subarray(0, 32); } function PDF20() { } function compareByteArrays(array1, array2) { if (array1.length !== array2.length) { return false; } for (var i = 0; i < array1.length; i++) { if (array1[i] !== array2[i]) { return false; } } return true; } PDF20.prototype = { hash: function PDF20_hash(password, concatBytes, userBytes) { return calculatePDF20Hash(password, concatBytes, userBytes); }, checkOwnerPassword: function PDF20_checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) { var hashData = new Uint8Array(password.length + 56); hashData.set(password, 0); hashData.set(ownerValidationSalt, password.length); hashData.set(userBytes, password.length + ownerValidationSalt.length); var result = calculatePDF20Hash(password, hashData, userBytes); return compareByteArrays(result, ownerPassword); }, checkUserPassword: function PDF20_checkUserPassword(password, userValidationSalt, userPassword) { var hashData = new Uint8Array(password.length + 8); hashData.set(password, 0); hashData.set(userValidationSalt, password.length); var result = calculatePDF20Hash(password, hashData, []); return compareByteArrays(result, userPassword); }, getOwnerKey: function PDF20_getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) { var hashData = new Uint8Array(password.length + 56); hashData.set(password, 0); hashData.set(ownerKeySalt, password.length); hashData.set(userBytes, password.length + ownerKeySalt.length); var key = calculatePDF20Hash(password, hashData, userBytes); var cipher = new AES256Cipher(key); return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16)); }, getUserKey: function PDF20_getUserKey(password, userKeySalt, userEncryption) { var hashData = new Uint8Array(password.length + 8); hashData.set(password, 0); hashData.set(userKeySalt, password.length); //key is the decryption key for the UE string var key = calculatePDF20Hash(password, hashData, []); var cipher = new AES256Cipher(key); return cipher.decryptBlock(userEncryption, false, new Uint8Array(16)); } }; return PDF20; })(); var CipherTransform = (function CipherTransformClosure() { function CipherTransform(stringCipherConstructor, streamCipherConstructor) { this.stringCipherConstructor = stringCipherConstructor; this.streamCipherConstructor = streamCipherConstructor; } CipherTransform.prototype = { createStream: function CipherTransform_createStream(stream, length) { var cipher = new this.streamCipherConstructor(); return new DecryptStream(stream, length, function cipherTransformDecryptStream(data, finalize) { return cipher.decryptBlock(data, finalize); } ); }, decryptString: function CipherTransform_decryptString(s) { var cipher = new this.stringCipherConstructor(); var data = stringToBytes(s); data = cipher.decryptBlock(data, true); return bytesToString(data); } }; return CipherTransform; })(); var CipherTransformFactory = (function CipherTransformFactoryClosure() { var defaultPasswordBytes = new Uint8Array([ 0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41, 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08, 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80, 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]); function createEncryptionKey20(revision, password, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms) { if (password) { var passwordLength = Math.min(127, password.length); password = password.subarray(0, passwordLength); } else { password = []; } var pdfAlgorithm; if (revision === 6) { pdfAlgorithm = new PDF20(); } else { pdfAlgorithm = new PDF17(); } if (pdfAlgorithm) { if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, userPassword)) { return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption); } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt, uBytes, ownerPassword)) { return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, ownerEncryption); } } return null; } function prepareKeyData(fileId, password, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata) { var hashDataSize = 40 + ownerPassword.length + fileId.length; var hashData = new Uint8Array(hashDataSize), i = 0, j, n; if (password) { n = Math.min(32, password.length); for (; i < n; ++i) { hashData[i] = password[i]; } } j = 0; while (i < 32) { hashData[i++] = defaultPasswordBytes[j++]; } // as now the padded password in the hashData[0..i] for (j = 0, n = ownerPassword.length; j < n; ++j) { hashData[i++] = ownerPassword[j]; } hashData[i++] = flags & 0xFF; hashData[i++] = (flags >> 8) & 0xFF; hashData[i++] = (flags >> 16) & 0xFF; hashData[i++] = (flags >>> 24) & 0xFF; for (j = 0, n = fileId.length; j < n; ++j) { hashData[i++] = fileId[j]; } if (revision >= 4 && !encryptMetadata) { hashData[i++] = 0xFF; hashData[i++] = 0xFF; hashData[i++] = 0xFF; hashData[i++] = 0xFF; } var hash = calculateMD5(hashData, 0, i); var keyLengthInBytes = keyLength >> 3; if (revision >= 3) { for (j = 0; j < 50; ++j) { hash = calculateMD5(hash, 0, keyLengthInBytes); } } var encryptionKey = hash.subarray(0, keyLengthInBytes); var cipher, checkData; if (revision >= 3) { for (i = 0; i < 32; ++i) { hashData[i] = defaultPasswordBytes[i]; } for (j = 0, n = fileId.length; j < n; ++j) { hashData[i++] = fileId[j]; } cipher = new ARCFourCipher(encryptionKey); checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i)); n = encryptionKey.length; var derivedKey = new Uint8Array(n), k; for (j = 1; j <= 19; ++j) { for (k = 0; k < n; ++k) { derivedKey[k] = encryptionKey[k] ^ j; } cipher = new ARCFourCipher(derivedKey); checkData = cipher.encryptBlock(checkData); } for (j = 0, n = checkData.length; j < n; ++j) { if (userPassword[j] !== checkData[j]) { return null; } } } else { cipher = new ARCFourCipher(encryptionKey); checkData = cipher.encryptBlock(defaultPasswordBytes); for (j = 0, n = checkData.length; j < n; ++j) { if (userPassword[j] !== checkData[j]) { return null; } } } return encryptionKey; } function decodeUserPassword(password, ownerPassword, revision, keyLength) { var hashData = new Uint8Array(32), i = 0, j, n; n = Math.min(32, password.length); for (; i < n; ++i) { hashData[i] = password[i]; } j = 0; while (i < 32) { hashData[i++] = defaultPasswordBytes[j++]; } var hash = calculateMD5(hashData, 0, i); var keyLengthInBytes = keyLength >> 3; if (revision >= 3) { for (j = 0; j < 50; ++j) { hash = calculateMD5(hash, 0, hash.length); } } var cipher, userPassword; if (revision >= 3) { userPassword = ownerPassword; var derivedKey = new Uint8Array(keyLengthInBytes), k; for (j = 19; j >= 0; j--) { for (k = 0; k < keyLengthInBytes; ++k) { derivedKey[k] = hash[k] ^ j; } cipher = new ARCFourCipher(derivedKey); userPassword = cipher.encryptBlock(userPassword); } } else { cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes)); userPassword = cipher.encryptBlock(ownerPassword); } return userPassword; } var identityName = Name.get('Identity'); function CipherTransformFactory(dict, fileId, password) { var filter = dict.get('Filter'); if (!isName(filter) || filter.name !== 'Standard') { error('unknown encryption method'); } this.dict = dict; var algorithm = dict.get('V'); if (!isInt(algorithm) || (algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm !== 5)) { error('unsupported encryption algorithm'); } this.algorithm = algorithm; var keyLength = dict.get('Length'); if (!keyLength) { // Spec asks to rely on encryption dictionary's Length entry, however // some PDFs don't have it. Trying to recover. if (algorithm <= 3) { // For 1 and 2 it's fixed to 40-bit, for 3 40-bit is a minimal value. keyLength = 40; } else { // Trying to find default handler -- it usually has Length. var cfDict = dict.get('CF'); var streamCryptoName = dict.get('StmF'); if (isDict(cfDict) && isName(streamCryptoName)) { var handlerDict = cfDict.get(streamCryptoName.name); keyLength = (handlerDict && handlerDict.get('Length')) || 128; if (keyLength < 40) { // Sometimes it's incorrect value of bits, generators specify bytes. keyLength <<= 3; } } } } if (!isInt(keyLength) || keyLength < 40 || (keyLength % 8) !== 0) { error('invalid key length'); } // prepare keys var ownerPassword = stringToBytes(dict.get('O')).subarray(0, 32); var userPassword = stringToBytes(dict.get('U')).subarray(0, 32); var flags = dict.get('P'); var revision = dict.get('R'); // meaningful when V is 4 or 5 var encryptMetadata = ((algorithm === 4 || algorithm === 5) && dict.get('EncryptMetadata') !== false); this.encryptMetadata = encryptMetadata; var fileIdBytes = stringToBytes(fileId); var passwordBytes; if (password) { if (revision === 6) { try { password = utf8StringToString(password); } catch (ex) { warn('CipherTransformFactory: ' + 'Unable to convert UTF8 encoded password.'); } } passwordBytes = stringToBytes(password); } var encryptionKey; if (algorithm !== 5) { encryptionKey = prepareKeyData(fileIdBytes, passwordBytes, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata); } else { var ownerValidationSalt = stringToBytes(dict.get('O')).subarray(32, 40); var ownerKeySalt = stringToBytes(dict.get('O')).subarray(40, 48); var uBytes = stringToBytes(dict.get('U')).subarray(0, 48); var userValidationSalt = stringToBytes(dict.get('U')).subarray(32, 40); var userKeySalt = stringToBytes(dict.get('U')).subarray(40, 48); var ownerEncryption = stringToBytes(dict.get('OE')); var userEncryption = stringToBytes(dict.get('UE')); var perms = stringToBytes(dict.get('Perms')); encryptionKey = createEncryptionKey20(revision, passwordBytes, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms); } if (!encryptionKey && !password) { throw new PasswordException('No password given', PasswordResponses.NEED_PASSWORD); } else if (!encryptionKey && password) { // Attempting use the password as an owner password var decodedPassword = decodeUserPassword(passwordBytes, ownerPassword, revision, keyLength); encryptionKey = prepareKeyData(fileIdBytes, decodedPassword, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata); } if (!encryptionKey) { throw new PasswordException('Incorrect Password', PasswordResponses.INCORRECT_PASSWORD); } this.encryptionKey = encryptionKey; if (algorithm >= 4) { this.cf = dict.get('CF'); this.stmf = dict.get('StmF') || identityName; this.strf = dict.get('StrF') || identityName; this.eff = dict.get('EFF') || this.stmf; } } function buildObjectKey(num, gen, encryptionKey, isAes) { var key = new Uint8Array(encryptionKey.length + 9), i, n; for (i = 0, n = encryptionKey.length; i < n; ++i) { key[i] = encryptionKey[i]; } key[i++] = num & 0xFF; key[i++] = (num >> 8) & 0xFF; key[i++] = (num >> 16) & 0xFF; key[i++] = gen & 0xFF; key[i++] = (gen >> 8) & 0xFF; if (isAes) { key[i++] = 0x73; key[i++] = 0x41; key[i++] = 0x6C; key[i++] = 0x54; } var hash = calculateMD5(key, 0, i); return hash.subarray(0, Math.min(encryptionKey.length + 5, 16)); } function buildCipherConstructor(cf, name, num, gen, key) { var cryptFilter = cf.get(name.name); var cfm; if (cryptFilter !== null && cryptFilter !== undefined) { cfm = cryptFilter.get('CFM'); } if (!cfm || cfm.name === 'None') { return function cipherTransformFactoryBuildCipherConstructorNone() { return new NullCipher(); }; } if ('V2' === cfm.name) { return function cipherTransformFactoryBuildCipherConstructorV2() { return new ARCFourCipher(buildObjectKey(num, gen, key, false)); }; } if ('AESV2' === cfm.name) { return function cipherTransformFactoryBuildCipherConstructorAESV2() { return new AES128Cipher(buildObjectKey(num, gen, key, true)); }; } if ('AESV3' === cfm.name) { return function cipherTransformFactoryBuildCipherConstructorAESV3() { return new AES256Cipher(key); }; } error('Unknown crypto method'); } CipherTransformFactory.prototype = { createCipherTransform: function CipherTransformFactory_createCipherTransform(num, gen) { if (this.algorithm === 4 || this.algorithm === 5) { return new CipherTransform( buildCipherConstructor(this.cf, this.stmf, num, gen, this.encryptionKey), buildCipherConstructor(this.cf, this.strf, num, gen, this.encryptionKey)); } // algorithms 1 and 2 var key = buildObjectKey(num, gen, this.encryptionKey, false); var cipherConstructor = function buildCipherCipherConstructor() { return new ARCFourCipher(key); }; return new CipherTransform(cipherConstructor, cipherConstructor); } }; return CipherTransformFactory; })(); exports.AES128Cipher = AES128Cipher; exports.AES256Cipher = AES256Cipher; exports.ARCFourCipher = ARCFourCipher; exports.CipherTransformFactory = CipherTransformFactory; exports.PDF17 = PDF17; exports.PDF20 = PDF20; exports.calculateMD5 = calculateMD5; exports.calculateSHA256 = calculateSHA256; exports.calculateSHA384 = calculateSHA384; exports.calculateSHA512 = calculateSHA512; })); (function (root, factory) { { factory((root.pdfjsCoreFontRenderer = {}), root.pdfjsSharedUtil, root.pdfjsCoreStream, root.pdfjsCoreGlyphList, root.pdfjsCoreEncodings, root.pdfjsCoreCFFParser); } }(this, function (exports, sharedUtil, coreStream, coreGlyphList, coreEncodings, coreCFFParser) { var Util = sharedUtil.Util; var bytesToString = sharedUtil.bytesToString; var error = sharedUtil.error; var Stream = coreStream.Stream; var getGlyphsUnicode = coreGlyphList.getGlyphsUnicode; var StandardEncoding = coreEncodings.StandardEncoding; var CFFParser = coreCFFParser.CFFParser; var FontRendererFactory = (function FontRendererFactoryClosure() { function getLong(data, offset) { return (data[offset] << 24) | (data[offset + 1] << 16) | (data[offset + 2] << 8) | data[offset + 3]; } function getUshort(data, offset) { return (data[offset] << 8) | data[offset + 1]; } function parseCmap(data, start, end) { var offset = (getUshort(data, start + 2) === 1 ? getLong(data, start + 8) : getLong(data, start + 16)); var format = getUshort(data, start + offset); var length, ranges, p, i; if (format === 4) { length = getUshort(data, start + offset + 2); var segCount = getUshort(data, start + offset + 6) >> 1; p = start + offset + 14; ranges = []; for (i = 0; i < segCount; i++, p += 2) { ranges[i] = {end: getUshort(data, p)}; } p += 2; for (i = 0; i < segCount; i++, p += 2) { ranges[i].start = getUshort(data, p); } for (i = 0; i < segCount; i++, p += 2) { ranges[i].idDelta = getUshort(data, p); } for (i = 0; i < segCount; i++, p += 2) { var idOffset = getUshort(data, p); if (idOffset === 0) { continue; } ranges[i].ids = []; for (var j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) { ranges[i].ids[j] = getUshort(data, p + idOffset); idOffset += 2; } } return ranges; } else if (format === 12) { length = getLong(data, start + offset + 4); var groups = getLong(data, start + offset + 12); p = start + offset + 16; ranges = []; for (i = 0; i < groups; i++) { ranges.push({ start: getLong(data, p), end: getLong(data, p + 4), idDelta: getLong(data, p + 8) - getLong(data, p) }); p += 12; } return ranges; } error('not supported cmap: ' + format); } function parseCff(data, start, end, seacAnalysisEnabled) { var properties = {}; var parser = new CFFParser(new Stream(data, start, end - start), properties, seacAnalysisEnabled); var cff = parser.parse(); return { glyphs: cff.charStrings.objects, subrs: (cff.topDict.privateDict && cff.topDict.privateDict.subrsIndex && cff.topDict.privateDict.subrsIndex.objects), gsubrs: cff.globalSubrIndex && cff.globalSubrIndex.objects }; } function parseGlyfTable(glyf, loca, isGlyphLocationsLong) { var itemSize, itemDecode; if (isGlyphLocationsLong) { itemSize = 4; itemDecode = function fontItemDecodeLong(data, offset) { return (data[offset] << 24) | (data[offset + 1] << 16) | (data[offset + 2] << 8) | data[offset + 3]; }; } else { itemSize = 2; itemDecode = function fontItemDecode(data, offset) { return (data[offset] << 9) | (data[offset + 1] << 1); }; } var glyphs = []; var startOffset = itemDecode(loca, 0); for (var j = itemSize; j < loca.length; j += itemSize) { var endOffset = itemDecode(loca, j); glyphs.push(glyf.subarray(startOffset, endOffset)); startOffset = endOffset; } return glyphs; } function lookupCmap(ranges, unicode) { var code = unicode.charCodeAt(0), gid = 0; var l = 0, r = ranges.length - 1; while (l < r) { var c = (l + r + 1) >> 1; if (code < ranges[c].start) { r = c - 1; } else { l = c; } } if (ranges[l].start <= code && code <= ranges[l].end) { gid = (ranges[l].idDelta + (ranges[l].ids ? ranges[l].ids[code - ranges[l].start] : code)) & 0xFFFF; } return { charCode: code, glyphId: gid, }; } function compileGlyf(code, cmds, font) { function moveTo(x, y) { cmds.push({cmd: 'moveTo', args: [x, y]}); } function lineTo(x, y) { cmds.push({cmd: 'lineTo', args: [x, y]}); } function quadraticCurveTo(xa, ya, x, y) { cmds.push({cmd: 'quadraticCurveTo', args: [xa, ya, x, y]}); } var i = 0; var numberOfContours = ((code[i] << 24) | (code[i + 1] << 16)) >> 16; var flags; var x = 0, y = 0; i += 10; if (numberOfContours < 0) { // composite glyph do { flags = (code[i] << 8) | code[i + 1]; var glyphIndex = (code[i + 2] << 8) | code[i + 3]; i += 4; var arg1, arg2; if ((flags & 0x01)) { arg1 = ((code[i] << 24) | (code[i + 1] << 16)) >> 16; arg2 = ((code[i + 2] << 24) | (code[i + 3] << 16)) >> 16; i += 4; } else { arg1 = code[i++]; arg2 = code[i++]; } if ((flags & 0x02)) { x = arg1; y = arg2; } else { x = 0; y = 0; // TODO "they are points" ? } var scaleX = 1, scaleY = 1, scale01 = 0, scale10 = 0; if ((flags & 0x08)) { scaleX = scaleY = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824; i += 2; } else if ((flags & 0x40)) { scaleX = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824; scaleY = ((code[i + 2] << 24) | (code[i + 3] << 16)) / 1073741824; i += 4; } else if ((flags & 0x80)) { scaleX = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824; scale01 = ((code[i + 2] << 24) | (code[i + 3] << 16)) / 1073741824; scale10 = ((code[i + 4] << 24) | (code[i + 5] << 16)) / 1073741824; scaleY = ((code[i + 6] << 24) | (code[i + 7] << 16)) / 1073741824; i += 8; } var subglyph = font.glyphs[glyphIndex]; if (subglyph) { cmds.push({cmd: 'save'}); cmds.push({cmd: 'transform', args: [scaleX, scale01, scale10, scaleY, x, y]}); compileGlyf(subglyph, cmds, font); cmds.push({cmd: 'restore'}); } } while ((flags & 0x20)); } else { // simple glyph var endPtsOfContours = []; var j, jj; for (j = 0; j < numberOfContours; j++) { endPtsOfContours.push((code[i] << 8) | code[i + 1]); i += 2; } var instructionLength = (code[i] << 8) | code[i + 1]; i += 2 + instructionLength; // skipping the instructions var numberOfPoints = endPtsOfContours[endPtsOfContours.length - 1] + 1; var points = []; while (points.length < numberOfPoints) { flags = code[i++]; var repeat = 1; if ((flags & 0x08)) { repeat += code[i++]; } while (repeat-- > 0) { points.push({flags: flags}); } } for (j = 0; j < numberOfPoints; j++) { switch (points[j].flags & 0x12) { case 0x00: x += ((code[i] << 24) | (code[i + 1] << 16)) >> 16; i += 2; break; case 0x02: x -= code[i++]; break; case 0x12: x += code[i++]; break; } points[j].x = x; } for (j = 0; j < numberOfPoints; j++) { switch (points[j].flags & 0x24) { case 0x00: y += ((code[i] << 24) | (code[i + 1] << 16)) >> 16; i += 2; break; case 0x04: y -= code[i++]; break; case 0x24: y += code[i++]; break; } points[j].y = y; } var startPoint = 0; for (i = 0; i < numberOfContours; i++) { var endPoint = endPtsOfContours[i]; // contours might have implicit points, which is located in the middle // between two neighboring off-curve points var contour = points.slice(startPoint, endPoint + 1); if ((contour[0].flags & 1)) { contour.push(contour[0]); // using start point at the contour end } else if ((contour[contour.length - 1].flags & 1)) { // first is off-curve point, trying to use one from the end contour.unshift(contour[contour.length - 1]); } else { // start and end are off-curve points, creating implicit one var p = { flags: 1, x: (contour[0].x + contour[contour.length - 1].x) / 2, y: (contour[0].y + contour[contour.length - 1].y) / 2 }; contour.unshift(p); contour.push(p); } moveTo(contour[0].x, contour[0].y); for (j = 1, jj = contour.length; j < jj; j++) { if ((contour[j].flags & 1)) { lineTo(contour[j].x, contour[j].y); } else if ((contour[j + 1].flags & 1)){ quadraticCurveTo(contour[j].x, contour[j].y, contour[j + 1].x, contour[j + 1].y); j++; } else { quadraticCurveTo(contour[j].x, contour[j].y, (contour[j].x + contour[j + 1].x) / 2, (contour[j].y + contour[j + 1].y) / 2); } } startPoint = endPoint + 1; } } } function compileCharString(code, cmds, font) { var stack = []; var x = 0, y = 0; var stems = 0; function moveTo(x, y) { cmds.push({cmd: 'moveTo', args: [x, y]}); } function lineTo(x, y) { cmds.push({cmd: 'lineTo', args: [x, y]}); } function bezierCurveTo(x1, y1, x2, y2, x, y) { cmds.push({cmd: 'bezierCurveTo', args: [x1, y1, x2, y2, x, y]}); } function parse(code) { var i = 0; while (i < code.length) { var stackClean = false; var v = code[i++]; var xa, xb, ya, yb, y1, y2, y3, n, subrCode; switch (v) { case 1: // hstem stems += stack.length >> 1; stackClean = true; break; case 3: // vstem stems += stack.length >> 1; stackClean = true; break; case 4: // vmoveto y += stack.pop(); moveTo(x, y); stackClean = true; break; case 5: // rlineto while (stack.length > 0) { x += stack.shift(); y += stack.shift(); lineTo(x, y); } break; case 6: // hlineto while (stack.length > 0) { x += stack.shift(); lineTo(x, y); if (stack.length === 0) { break; } y += stack.shift(); lineTo(x, y); } break; case 7: // vlineto while (stack.length > 0) { y += stack.shift(); lineTo(x, y); if (stack.length === 0) { break; } x += stack.shift(); lineTo(x, y); } break; case 8: // rrcurveto while (stack.length > 0) { xa = x + stack.shift(); ya = y + stack.shift(); xb = xa + stack.shift(); yb = ya + stack.shift(); x = xb + stack.shift(); y = yb + stack.shift(); bezierCurveTo(xa, ya, xb, yb, x, y); } break; case 10: // callsubr n = stack.pop() + font.subrsBias; subrCode = font.subrs[n]; if (subrCode) { parse(subrCode); } break; case 11: // return return; case 12: v = code[i++]; switch (v) { case 34: // flex xa = x + stack.shift(); xb = xa + stack.shift(); y1 = y + stack.shift(); x = xb + stack.shift(); bezierCurveTo(xa, y, xb, y1, x, y1); xa = x + stack.shift(); xb = xa + stack.shift(); x = xb + stack.shift(); bezierCurveTo(xa, y1, xb, y, x, y); break; case 35: // flex xa = x + stack.shift(); ya = y + stack.shift(); xb = xa + stack.shift(); yb = ya + stack.shift(); x = xb + stack.shift(); y = yb + stack.shift(); bezierCurveTo(xa, ya, xb, yb, x, y); xa = x + stack.shift(); ya = y + stack.shift(); xb = xa + stack.shift(); yb = ya + stack.shift(); x = xb + stack.shift(); y = yb + stack.shift(); bezierCurveTo(xa, ya, xb, yb, x, y); stack.pop(); // fd break; case 36: // hflex1 xa = x + stack.shift(); y1 = y + stack.shift(); xb = xa + stack.shift(); y2 = y1 + stack.shift(); x = xb + stack.shift(); bezierCurveTo(xa, y1, xb, y2, x, y2); xa = x + stack.shift(); xb = xa + stack.shift(); y3 = y2 + stack.shift(); x = xb + stack.shift(); bezierCurveTo(xa, y2, xb, y3, x, y); break; case 37: // flex1 var x0 = x, y0 = y; xa = x + stack.shift(); ya = y + stack.shift(); xb = xa + stack.shift(); yb = ya + stack.shift(); x = xb + stack.shift(); y = yb + stack.shift(); bezierCurveTo(xa, ya, xb, yb, x, y); xa = x + stack.shift(); ya = y + stack.shift(); xb = xa + stack.shift(); yb = ya + stack.shift(); x = xb; y = yb; if (Math.abs(x - x0) > Math.abs(y - y0)) { x += stack.shift(); } else { y += stack.shift(); } bezierCurveTo(xa, ya, xb, yb, x, y); break; default: error('unknown operator: 12 ' + v); } break; case 14: // endchar if (stack.length >= 4) { var achar = stack.pop(); var bchar = stack.pop(); y = stack.pop(); x = stack.pop(); cmds.push({cmd: 'save'}); cmds.push({cmd: 'translate', args: [x, y]}); var cmap = lookupCmap(font.cmap, String.fromCharCode( font.glyphNameMap[StandardEncoding[achar]])); compileCharString(font.glyphs[cmap.glyphId], cmds, font); cmds.push({cmd: 'restore'}); cmap = lookupCmap(font.cmap, String.fromCharCode( font.glyphNameMap[StandardEncoding[bchar]])); compileCharString(font.glyphs[cmap.glyphId], cmds, font); } return; case 18: // hstemhm stems += stack.length >> 1; stackClean = true; break; case 19: // hintmask stems += stack.length >> 1; i += (stems + 7) >> 3; stackClean = true; break; case 20: // cntrmask stems += stack.length >> 1; i += (stems + 7) >> 3; stackClean = true; break; case 21: // rmoveto y += stack.pop(); x += stack.pop(); moveTo(x, y); stackClean = true; break; case 22: // hmoveto x += stack.pop(); moveTo(x, y); stackClean = true; break; case 23: // vstemhm stems += stack.length >> 1; stackClean = true; break; case 24: // rcurveline while (stack.length > 2) { xa = x + stack.shift(); ya = y + stack.shift(); xb = xa + stack.shift(); yb = ya + stack.shift(); x = xb + stack.shift(); y = yb + stack.shift(); bezierCurveTo(xa, ya, xb, yb, x, y); } x += stack.shift(); y += stack.shift(); lineTo(x, y); break; case 25: // rlinecurve while (stack.length > 6) { x += stack.shift(); y += stack.shift(); lineTo(x, y); } xa = x + stack.shift(); ya = y + stack.shift(); xb = xa + stack.shift(); yb = ya + stack.shift(); x = xb + stack.shift(); y = yb + stack.shift(); bezierCurveTo(xa, ya, xb, yb, x, y); break; case 26: // vvcurveto if (stack.length % 2) { x += stack.shift(); } while (stack.length > 0) { xa = x; ya = y + stack.shift(); xb = xa + stack.shift(); yb = ya + stack.shift(); x = xb; y = yb + stack.shift(); bezierCurveTo(xa, ya, xb, yb, x, y); } break; case 27: // hhcurveto if (stack.length % 2) { y += stack.shift(); } while (stack.length > 0) { xa = x + stack.shift(); ya = y; xb = xa + stack.shift(); yb = ya + stack.shift(); x = xb + stack.shift(); y = yb; bezierCurveTo(xa, ya, xb, yb, x, y); } break; case 28: stack.push(((code[i] << 24) | (code[i + 1] << 16)) >> 16); i += 2; break; case 29: // callgsubr n = stack.pop() + font.gsubrsBias; subrCode = font.gsubrs[n]; if (subrCode) { parse(subrCode); } break; case 30: // vhcurveto while (stack.length > 0) { xa = x; ya = y + stack.shift(); xb = xa + stack.shift(); yb = ya + stack.shift(); x = xb + stack.shift(); y = yb + (stack.length === 1 ? stack.shift() : 0); bezierCurveTo(xa, ya, xb, yb, x, y); if (stack.length === 0) { break; } xa = x + stack.shift(); ya = y; xb = xa + stack.shift(); yb = ya + stack.shift(); y = yb + stack.shift(); x = xb + (stack.length === 1 ? stack.shift() : 0); bezierCurveTo(xa, ya, xb, yb, x, y); } break; case 31: // hvcurveto while (stack.length > 0) { xa = x + stack.shift(); ya = y; xb = xa + stack.shift(); yb = ya + stack.shift(); y = yb + stack.shift(); x = xb + (stack.length === 1 ? stack.shift() : 0); bezierCurveTo(xa, ya, xb, yb, x, y); if (stack.length === 0) { break; } xa = x; ya = y + stack.shift(); xb = xa + stack.shift(); yb = ya + stack.shift(); x = xb + stack.shift(); y = yb + (stack.length === 1 ? stack.shift() : 0); bezierCurveTo(xa, ya, xb, yb, x, y); } break; default: if (v < 32) { error('unknown operator: ' + v); } if (v < 247) { stack.push(v - 139); } else if (v < 251) { stack.push((v - 247) * 256 + code[i++] + 108); } else if (v < 255) { stack.push(-(v - 251) * 256 - code[i++] - 108); } else { stack.push(((code[i] << 24) | (code[i + 1] << 16) | (code[i + 2] << 8) | code[i + 3]) / 65536); i += 4; } break; } if (stackClean) { stack.length = 0; } } } parse(code); } var noop = ''; function CompiledFont(fontMatrix) { this.compiledGlyphs = Object.create(null); this.compiledCharCodeToGlyphId = Object.create(null); this.fontMatrix = fontMatrix; } CompiledFont.prototype = { getPathJs: function (unicode) { var cmap = lookupCmap(this.cmap, unicode); var fn = this.compiledGlyphs[cmap.glyphId]; if (!fn) { fn = this.compileGlyph(this.glyphs[cmap.glyphId]); this.compiledGlyphs[cmap.glyphId] = fn; } if (this.compiledCharCodeToGlyphId[cmap.charCode] === undefined) { this.compiledCharCodeToGlyphId[cmap.charCode] = cmap.glyphId; } return fn; }, compileGlyph: function (code) { if (!code || code.length === 0 || code[0] === 14) { return noop; } var cmds = []; cmds.push({cmd: 'save'}); cmds.push({cmd: 'transform', args: this.fontMatrix.slice()}); cmds.push({cmd: 'scale', args: ['size', '-size']}); this.compileGlyphImpl(code, cmds); cmds.push({cmd: 'restore'}); return cmds; }, compileGlyphImpl: function () { error('Children classes should implement this.'); }, hasBuiltPath: function (unicode) { var cmap = lookupCmap(this.cmap, unicode); return (this.compiledGlyphs[cmap.glyphId] !== undefined && this.compiledCharCodeToGlyphId[cmap.charCode] !== undefined); } }; function TrueTypeCompiled(glyphs, cmap, fontMatrix) { fontMatrix = fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]; CompiledFont.call(this, fontMatrix); this.glyphs = glyphs; this.cmap = cmap; } Util.inherit(TrueTypeCompiled, CompiledFont, { compileGlyphImpl: function (code, cmds) { compileGlyf(code, cmds, this); } }); function Type2Compiled(cffInfo, cmap, fontMatrix, glyphNameMap) { fontMatrix = fontMatrix || [0.001, 0, 0, 0.001, 0, 0]; CompiledFont.call(this, fontMatrix); this.glyphs = cffInfo.glyphs; this.gsubrs = cffInfo.gsubrs || []; this.subrs = cffInfo.subrs || []; this.cmap = cmap; this.glyphNameMap = glyphNameMap || getGlyphsUnicode(); this.gsubrsBias = (this.gsubrs.length < 1240 ? 107 : (this.gsubrs.length < 33900 ? 1131 : 32768)); this.subrsBias = (this.subrs.length < 1240 ? 107 : (this.subrs.length < 33900 ? 1131 : 32768)); } Util.inherit(Type2Compiled, CompiledFont, { compileGlyphImpl: function (code, cmds) { compileCharString(code, cmds, this); } }); return { create: function FontRendererFactory_create(font, seacAnalysisEnabled) { var data = new Uint8Array(font.data); var cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm; var numTables = getUshort(data, 4); for (var i = 0, p = 12; i < numTables; i++, p += 16) { var tag = bytesToString(data.subarray(p, p + 4)); var offset = getLong(data, p + 8); var length = getLong(data, p + 12); switch (tag) { case 'cmap': cmap = parseCmap(data, offset, offset + length); break; case 'glyf': glyf = data.subarray(offset, offset + length); break; case 'loca': loca = data.subarray(offset, offset + length); break; case 'head': unitsPerEm = getUshort(data, offset + 18); indexToLocFormat = getUshort(data, offset + 50); break; case 'CFF ': cff = parseCff(data, offset, offset + length, seacAnalysisEnabled); break; } } if (glyf) { var fontMatrix = (!unitsPerEm ? font.fontMatrix : [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0]); return new TrueTypeCompiled( parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix); } else { return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap); } } }; })(); exports.FontRendererFactory = FontRendererFactory; })); (function (root, factory) { { factory((root.pdfjsCoreParser = {}), root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreStream); } }(this, function (exports, sharedUtil, corePrimitives, coreStream) { var MissingDataException = sharedUtil.MissingDataException; var StreamType = sharedUtil.StreamType; var assert = sharedUtil.assert; var error = sharedUtil.error; var info = sharedUtil.info; var isArray = sharedUtil.isArray; var isInt = sharedUtil.isInt; var isNum = sharedUtil.isNum; var isString = sharedUtil.isString; var warn = sharedUtil.warn; var Cmd = corePrimitives.Cmd; var Dict = corePrimitives.Dict; var Name = corePrimitives.Name; var Ref = corePrimitives.Ref; var isCmd = corePrimitives.isCmd; var isDict = corePrimitives.isDict; var isName = corePrimitives.isName; var Ascii85Stream = coreStream.Ascii85Stream; var AsciiHexStream = coreStream.AsciiHexStream; var CCITTFaxStream = coreStream.CCITTFaxStream; var FlateStream = coreStream.FlateStream; var Jbig2Stream = coreStream.Jbig2Stream; var JpegStream = coreStream.JpegStream; var JpxStream = coreStream.JpxStream; var LZWStream = coreStream.LZWStream; var NullStream = coreStream.NullStream; var PredictorStream = coreStream.PredictorStream; var RunLengthStream = coreStream.RunLengthStream; var EOF = {}; function isEOF(v) { return (v === EOF); } var MAX_LENGTH_TO_CACHE = 1000; var Parser = (function ParserClosure() { function Parser(lexer, allowStreams, xref) { this.lexer = lexer; this.allowStreams = allowStreams; this.xref = xref; this.imageCache = Object.create(null); this.refill(); } Parser.prototype = { refill: function Parser_refill() { this.buf1 = this.lexer.getObj(); this.buf2 = this.lexer.getObj(); }, shift: function Parser_shift() { if (isCmd(this.buf2, 'ID')) { this.buf1 = this.buf2; this.buf2 = null; } else { this.buf1 = this.buf2; this.buf2 = this.lexer.getObj(); } }, tryShift: function Parser_tryShift() { try { this.shift(); return true; } catch (e) { if (e instanceof MissingDataException) { throw e; } // Upon failure, the caller should reset this.lexer.pos to a known good // state and call this.shift() twice to reset the buffers. return false; } }, getObj: function Parser_getObj(cipherTransform) { var buf1 = this.buf1; this.shift(); if (buf1 instanceof Cmd) { switch (buf1.cmd) { case 'BI': // inline image return this.makeInlineImage(cipherTransform); case '[': // array var array = []; while (!isCmd(this.buf1, ']') && !isEOF(this.buf1)) { array.push(this.getObj(cipherTransform)); } if (isEOF(this.buf1)) { error('End of file inside array'); } this.shift(); return array; case '<<': // dictionary or stream var dict = new Dict(this.xref); while (!isCmd(this.buf1, '>>') && !isEOF(this.buf1)) { if (!isName(this.buf1)) { info('Malformed dictionary: key must be a name object'); this.shift(); continue; } var key = this.buf1.name; this.shift(); if (isEOF(this.buf1)) { break; } dict.set(key, this.getObj(cipherTransform)); } if (isEOF(this.buf1)) { error('End of file inside dictionary'); } // Stream objects are not allowed inside content streams or // object streams. if (isCmd(this.buf2, 'stream')) { return (this.allowStreams ? this.makeStream(dict, cipherTransform) : dict); } this.shift(); return dict; default: // simple object return buf1; } } if (isInt(buf1)) { // indirect reference or integer var num = buf1; if (isInt(this.buf1) && isCmd(this.buf2, 'R')) { var ref = new Ref(num, this.buf1); this.shift(); this.shift(); return ref; } return num; } if (isString(buf1)) { // string var str = buf1; if (cipherTransform) { str = cipherTransform.decryptString(str); } return str; } // simple object return buf1; }, /** * Find the end of the stream by searching for the /EI\s/. * @returns {number} The inline stream length. */ findDefaultInlineStreamEnd: function Parser_findDefaultInlineStreamEnd(stream) { var E = 0x45, I = 0x49, SPACE = 0x20, LF = 0xA, CR = 0xD; var startPos = stream.pos, state = 0, ch, i, n, followingBytes; while ((ch = stream.getByte()) !== -1) { if (state === 0) { state = (ch === E) ? 1 : 0; } else if (state === 1) { state = (ch === I) ? 2 : 0; } else { assert(state === 2); if (ch === SPACE || ch === LF || ch === CR) { // Let's check the next five bytes are ASCII... just be sure. n = 5; followingBytes = stream.peekBytes(n); for (i = 0; i < n; i++) { ch = followingBytes[i]; if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7F)) { // Not a LF, CR, SPACE or any visible ASCII character, i.e. // it's binary stuff. Resetting the state. state = 0; break; } } if (state === 2) { break; // Finished! } } else { state = 0; } } } return ((stream.pos - 4) - startPos); }, /** * Find the EOI (end-of-image) marker 0xFFD9 of the stream. * @returns {number} The inline stream length. */ findDCTDecodeInlineStreamEnd: function Parser_findDCTDecodeInlineStreamEnd(stream) { var startPos = stream.pos, foundEOI = false, b, markerLength, length; while ((b = stream.getByte()) !== -1) { if (b !== 0xFF) { // Not a valid marker. continue; } switch (stream.getByte()) { case 0x00: // Byte stuffing. // 0xFF00 appears to be a very common byte sequence in JPEG images. break; case 0xFF: // Fill byte. // Avoid skipping a valid marker, resetting the stream position. stream.skip(-1); break; case 0xD9: // EOI foundEOI = true; break; case 0xC0: // SOF0 case 0xC1: // SOF1 case 0xC2: // SOF2 case 0xC3: // SOF3 case 0xC5: // SOF5 case 0xC6: // SOF6 case 0xC7: // SOF7 case 0xC9: // SOF9 case 0xCA: // SOF10 case 0xCB: // SOF11 case 0xCD: // SOF13 case 0xCE: // SOF14 case 0xCF: // SOF15 case 0xC4: // DHT case 0xCC: // DAC case 0xDA: // SOS case 0xDB: // DQT case 0xDC: // DNL case 0xDD: // DRI case 0xDE: // DHP case 0xDF: // EXP case 0xE0: // APP0 case 0xE1: // APP1 case 0xE2: // APP2 case 0xE3: // APP3 case 0xE4: // APP4 case 0xE5: // APP5 case 0xE6: // APP6 case 0xE7: // APP7 case 0xE8: // APP8 case 0xE9: // APP9 case 0xEA: // APP10 case 0xEB: // APP11 case 0xEC: // APP12 case 0xED: // APP13 case 0xEE: // APP14 case 0xEF: // APP15 case 0xFE: // COM // The marker should be followed by the length of the segment. markerLength = stream.getUint16(); if (markerLength > 2) { // |markerLength| contains the byte length of the marker segment, // including its own length (2 bytes) and excluding the marker. stream.skip(markerLength - 2); // Jump to the next marker. } else { // The marker length is invalid, resetting the stream position. stream.skip(-2); } break; } if (foundEOI) { break; } } length = stream.pos - startPos; if (b === -1) { warn('Inline DCTDecode image stream: ' + 'EOI marker not found, searching for /EI/ instead.'); stream.skip(-length); // Reset the stream position. return this.findDefaultInlineStreamEnd(stream); } this.inlineStreamSkipEI(stream); return length; }, /** * Find the EOD (end-of-data) marker '~>' (i.e. TILDE + GT) of the stream. * @returns {number} The inline stream length. */ findASCII85DecodeInlineStreamEnd: function Parser_findASCII85DecodeInlineStreamEnd(stream) { var TILDE = 0x7E, GT = 0x3E; var startPos = stream.pos, ch, length; while ((ch = stream.getByte()) !== -1) { if (ch === TILDE && stream.peekByte() === GT) { stream.skip(); break; } } length = stream.pos - startPos; if (ch === -1) { warn('Inline ASCII85Decode image stream: ' + 'EOD marker not found, searching for /EI/ instead.'); stream.skip(-length); // Reset the stream position. return this.findDefaultInlineStreamEnd(stream); } this.inlineStreamSkipEI(stream); return length; }, /** * Find the EOD (end-of-data) marker '>' (i.e. GT) of the stream. * @returns {number} The inline stream length. */ findASCIIHexDecodeInlineStreamEnd: function Parser_findASCIIHexDecodeInlineStreamEnd(stream) { var GT = 0x3E; var startPos = stream.pos, ch, length; while ((ch = stream.getByte()) !== -1) { if (ch === GT) { break; } } length = stream.pos - startPos; if (ch === -1) { warn('Inline ASCIIHexDecode image stream: ' + 'EOD marker not found, searching for /EI/ instead.'); stream.skip(-length); // Reset the stream position. return this.findDefaultInlineStreamEnd(stream); } this.inlineStreamSkipEI(stream); return length; }, /** * Skip over the /EI/ for streams where we search for an EOD marker. */ inlineStreamSkipEI: function Parser_inlineStreamSkipEI(stream) { var E = 0x45, I = 0x49; var state = 0, ch; while ((ch = stream.getByte()) !== -1) { if (state === 0) { state = (ch === E) ? 1 : 0; } else if (state === 1) { state = (ch === I) ? 2 : 0; } else if (state === 2) { break; } } }, makeInlineImage: function Parser_makeInlineImage(cipherTransform) { var lexer = this.lexer; var stream = lexer.stream; // Parse dictionary. var dict = new Dict(this.xref); while (!isCmd(this.buf1, 'ID') && !isEOF(this.buf1)) { if (!isName(this.buf1)) { error('Dictionary key must be a name object'); } var key = this.buf1.name; this.shift(); if (isEOF(this.buf1)) { break; } dict.set(key, this.getObj(cipherTransform)); } // Extract the name of the first (i.e. the current) image filter. var filter = dict.get('Filter', 'F'), filterName; if (isName(filter)) { filterName = filter.name; } else if (isArray(filter) && isName(filter[0])) { filterName = filter[0].name; } // Parse image stream. var startPos = stream.pos, length, i, ii; if (filterName === 'DCTDecode' || filterName === 'DCT') { length = this.findDCTDecodeInlineStreamEnd(stream); } else if (filterName === 'ASCII85Decide' || filterName === 'A85') { length = this.findASCII85DecodeInlineStreamEnd(stream); } else if (filterName === 'ASCIIHexDecode' || filterName === 'AHx') { length = this.findASCIIHexDecodeInlineStreamEnd(stream); } else { length = this.findDefaultInlineStreamEnd(stream); } var imageStream = stream.makeSubStream(startPos, length, dict); // Cache all images below the MAX_LENGTH_TO_CACHE threshold by their // adler32 checksum. var adler32; if (length < MAX_LENGTH_TO_CACHE) { var imageBytes = imageStream.getBytes(); imageStream.reset(); var a = 1; var b = 0; for (i = 0, ii = imageBytes.length; i < ii; ++i) { // No modulo required in the loop if imageBytes.length < 5552. a += imageBytes[i] & 0xff; b += a; } adler32 = ((b % 65521) << 16) | (a % 65521); if (this.imageCache.adler32 === adler32) { this.buf2 = Cmd.get('EI'); this.shift(); this.imageCache[adler32].reset(); return this.imageCache[adler32]; } } if (cipherTransform) { imageStream = cipherTransform.createStream(imageStream, length); } imageStream = this.filter(imageStream, dict, length); imageStream.dict = dict; if (adler32 !== undefined) { imageStream.cacheKey = 'inline_' + length + '_' + adler32; this.imageCache[adler32] = imageStream; } this.buf2 = Cmd.get('EI'); this.shift(); return imageStream; }, makeStream: function Parser_makeStream(dict, cipherTransform) { var lexer = this.lexer; var stream = lexer.stream; // get stream start position lexer.skipToNextLine(); var pos = stream.pos - 1; // get length var length = dict.get('Length'); if (!isInt(length)) { info('Bad ' + length + ' attribute in stream'); length = 0; } // skip over the stream data stream.pos = pos + length; lexer.nextChar(); // Shift '>>' and check whether the new object marks the end of the stream if (this.tryShift() && isCmd(this.buf2, 'endstream')) { this.shift(); // 'stream' } else { // bad stream length, scanning for endstream stream.pos = pos; var SCAN_BLOCK_SIZE = 2048; var ENDSTREAM_SIGNATURE_LENGTH = 9; var ENDSTREAM_SIGNATURE = [0x65, 0x6E, 0x64, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6D]; var skipped = 0, found = false, i, j; while (stream.pos < stream.end) { var scanBytes = stream.peekBytes(SCAN_BLOCK_SIZE); var scanLength = scanBytes.length - ENDSTREAM_SIGNATURE_LENGTH; if (scanLength <= 0) { break; } found = false; i = 0; while (i < scanLength) { j = 0; while (j < ENDSTREAM_SIGNATURE_LENGTH && scanBytes[i + j] === ENDSTREAM_SIGNATURE[j]) { j++; } if (j >= ENDSTREAM_SIGNATURE_LENGTH) { found = true; break; } i++; } if (found) { skipped += i; stream.pos += i; break; } skipped += scanLength; stream.pos += scanLength; } if (!found) { error('Missing endstream'); } length = skipped; lexer.nextChar(); this.shift(); this.shift(); } this.shift(); // 'endstream' stream = stream.makeSubStream(pos, length, dict); if (cipherTransform) { stream = cipherTransform.createStream(stream, length); } stream = this.filter(stream, dict, length); stream.dict = dict; return stream; }, filter: function Parser_filter(stream, dict, length) { var filter = dict.get('Filter', 'F'); var params = dict.get('DecodeParms', 'DP'); if (isName(filter)) { return this.makeFilter(stream, filter.name, length, params); } var maybeLength = length; if (isArray(filter)) { var filterArray = filter; var paramsArray = params; for (var i = 0, ii = filterArray.length; i < ii; ++i) { filter = filterArray[i]; if (!isName(filter)) { error('Bad filter name: ' + filter); } params = null; if (isArray(paramsArray) && (i in paramsArray)) { params = paramsArray[i]; } stream = this.makeFilter(stream, filter.name, maybeLength, params); // after the first stream the length variable is invalid maybeLength = null; } } return stream; }, makeFilter: function Parser_makeFilter(stream, name, maybeLength, params) { if (stream.dict.get('Length') === 0 && !maybeLength) { warn('Empty "' + name + '" stream.'); return new NullStream(stream); } try { if (params && this.xref) { params = this.xref.fetchIfRef(params); } var xrefStreamStats = this.xref.stats.streamTypes; if (name === 'FlateDecode' || name === 'Fl') { xrefStreamStats[StreamType.FLATE] = true; if (params) { return new PredictorStream(new FlateStream(stream, maybeLength), maybeLength, params); } return new FlateStream(stream, maybeLength); } if (name === 'LZWDecode' || name === 'LZW') { xrefStreamStats[StreamType.LZW] = true; var earlyChange = 1; if (params) { if (params.has('EarlyChange')) { earlyChange = params.get('EarlyChange'); } return new PredictorStream( new LZWStream(stream, maybeLength, earlyChange), maybeLength, params); } return new LZWStream(stream, maybeLength, earlyChange); } if (name === 'DCTDecode' || name === 'DCT') { xrefStreamStats[StreamType.DCT] = true; return new JpegStream(stream, maybeLength, stream.dict, this.xref); } if (name === 'JPXDecode' || name === 'JPX') { xrefStreamStats[StreamType.JPX] = true; return new JpxStream(stream, maybeLength, stream.dict); } if (name === 'ASCII85Decode' || name === 'A85') { xrefStreamStats[StreamType.A85] = true; return new Ascii85Stream(stream, maybeLength); } if (name === 'ASCIIHexDecode' || name === 'AHx') { xrefStreamStats[StreamType.AHX] = true; return new AsciiHexStream(stream, maybeLength); } if (name === 'CCITTFaxDecode' || name === 'CCF') { xrefStreamStats[StreamType.CCF] = true; return new CCITTFaxStream(stream, maybeLength, params); } if (name === 'RunLengthDecode' || name === 'RL') { xrefStreamStats[StreamType.RL] = true; return new RunLengthStream(stream, maybeLength); } if (name === 'JBIG2Decode') { xrefStreamStats[StreamType.JBIG] = true; return new Jbig2Stream(stream, maybeLength, stream.dict); } warn('filter "' + name + '" not supported yet'); return stream; } catch (ex) { if (ex instanceof MissingDataException) { throw ex; } warn('Invalid stream: \"' + ex + '\"'); return new NullStream(stream); } } }; return Parser; })(); var Lexer = (function LexerClosure() { function Lexer(stream, knownCommands) { this.stream = stream; this.nextChar(); // While lexing, we build up many strings one char at a time. Using += for // this can result in lots of garbage strings. It's better to build an // array of single-char strings and then join() them together at the end. // And reusing a single array (i.e. |this.strBuf|) over and over for this // purpose uses less memory than using a new array for each string. this.strBuf = []; // The PDFs might have "glued" commands with other commands, operands or // literals, e.g. "q1". The knownCommands is a dictionary of the valid // commands and their prefixes. The prefixes are built the following way: // if there a command that is a prefix of the other valid command or // literal (e.g. 'f' and 'false') the following prefixes must be included, // 'fa', 'fal', 'fals'. The prefixes are not needed, if the command has no // other commands or literals as a prefix. The knowCommands is optional. this.knownCommands = knownCommands; } Lexer.isSpace = function Lexer_isSpace(ch) { // Space is one of the following characters: SPACE, TAB, CR or LF. return (ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A); }; // A '1' in this array means the character is white space. A '1' or // '2' means the character ends a name or command. var specialChars = [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx ]; function toHexDigit(ch) { if (ch >= 0x30 && ch <= 0x39) { // '0'-'9' return ch & 0x0F; } if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) { // 'A'-'F', 'a'-'f' return (ch & 0x0F) + 9; } return -1; } Lexer.prototype = { nextChar: function Lexer_nextChar() { return (this.currentChar = this.stream.getByte()); }, peekChar: function Lexer_peekChar() { return this.stream.peekByte(); }, getNumber: function Lexer_getNumber() { var ch = this.currentChar; var eNotation = false; var divideBy = 0; // different from 0 if it's a floating point value var sign = 1; if (ch === 0x2D) { // '-' sign = -1; ch = this.nextChar(); if (ch === 0x2D) { // '-' // Ignore double negative (this is consistent with Adobe Reader). ch = this.nextChar(); } } else if (ch === 0x2B) { // '+' ch = this.nextChar(); } if (ch === 0x2E) { // '.' divideBy = 10; ch = this.nextChar(); } if (ch < 0x30 || ch > 0x39) { // '0' - '9' error('Invalid number: ' + String.fromCharCode(ch)); return 0; } var baseValue = ch - 0x30; // '0' var powerValue = 0; var powerValueSign = 1; while ((ch = this.nextChar()) >= 0) { if (0x30 <= ch && ch <= 0x39) { // '0' - '9' var currentDigit = ch - 0x30; // '0' if (eNotation) { // We are after an 'e' or 'E' powerValue = powerValue * 10 + currentDigit; } else { if (divideBy !== 0) { // We are after a point divideBy *= 10; } baseValue = baseValue * 10 + currentDigit; } } else if (ch === 0x2E) { // '.' if (divideBy === 0) { divideBy = 1; } else { // A number can have only one '.' break; } } else if (ch === 0x2D) { // '-' // ignore minus signs in the middle of numbers to match // Adobe's behavior warn('Badly formated number'); } else if (ch === 0x45 || ch === 0x65) { // 'E', 'e' // 'E' can be either a scientific notation or the beginning of a new // operator ch = this.peekChar(); if (ch === 0x2B || ch === 0x2D) { // '+', '-' powerValueSign = (ch === 0x2D) ? -1 : 1; this.nextChar(); // Consume the sign character } else if (ch < 0x30 || ch > 0x39) { // '0' - '9' // The 'E' must be the beginning of a new operator break; } eNotation = true; } else { // the last character doesn't belong to us break; } } if (divideBy !== 0) { baseValue /= divideBy; } if (eNotation) { baseValue *= Math.pow(10, powerValueSign * powerValue); } return sign * baseValue; }, getString: function Lexer_getString() { var numParen = 1; var done = false; var strBuf = this.strBuf; strBuf.length = 0; var ch = this.nextChar(); while (true) { var charBuffered = false; switch (ch | 0) { case -1: warn('Unterminated string'); done = true; break; case 0x28: // '(' ++numParen; strBuf.push('('); break; case 0x29: // ')' if (--numParen === 0) { this.nextChar(); // consume strings ')' done = true; } else { strBuf.push(')'); } break; case 0x5C: // '\\' ch = this.nextChar(); switch (ch) { case -1: warn('Unterminated string'); done = true; break; case 0x6E: // 'n' strBuf.push('\n'); break; case 0x72: // 'r' strBuf.push('\r'); break; case 0x74: // 't' strBuf.push('\t'); break; case 0x62: // 'b' strBuf.push('\b'); break; case 0x66: // 'f' strBuf.push('\f'); break; case 0x5C: // '\' case 0x28: // '(' case 0x29: // ')' strBuf.push(String.fromCharCode(ch)); break; case 0x30: case 0x31: case 0x32: case 0x33: // '0'-'3' case 0x34: case 0x35: case 0x36: case 0x37: // '4'-'7' var x = ch & 0x0F; ch = this.nextChar(); charBuffered = true; if (ch >= 0x30 && ch <= 0x37) { // '0'-'7' x = (x << 3) + (ch & 0x0F); ch = this.nextChar(); if (ch >= 0x30 && ch <= 0x37) { // '0'-'7' charBuffered = false; x = (x << 3) + (ch & 0x0F); } } strBuf.push(String.fromCharCode(x)); break; case 0x0D: // CR if (this.peekChar() === 0x0A) { // LF this.nextChar(); } break; case 0x0A: // LF break; default: strBuf.push(String.fromCharCode(ch)); break; } break; default: strBuf.push(String.fromCharCode(ch)); break; } if (done) { break; } if (!charBuffered) { ch = this.nextChar(); } } return strBuf.join(''); }, getName: function Lexer_getName() { var ch, previousCh; var strBuf = this.strBuf; strBuf.length = 0; while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { if (ch === 0x23) { // '#' ch = this.nextChar(); if (specialChars[ch]) { warn('Lexer_getName: ' + 'NUMBER SIGN (#) should be followed by a hexadecimal number.'); strBuf.push('#'); break; } var x = toHexDigit(ch); if (x !== -1) { previousCh = ch; ch = this.nextChar(); var x2 = toHexDigit(ch); if (x2 === -1) { warn('Lexer_getName: Illegal digit (' + String.fromCharCode(ch) +') in hexadecimal number.'); strBuf.push('#', String.fromCharCode(previousCh)); if (specialChars[ch]) { break; } strBuf.push(String.fromCharCode(ch)); continue; } strBuf.push(String.fromCharCode((x << 4) | x2)); } else { strBuf.push('#', String.fromCharCode(ch)); } } else { strBuf.push(String.fromCharCode(ch)); } } if (strBuf.length > 127) { warn('name token is longer than allowed by the spec: ' + strBuf.length); } return Name.get(strBuf.join('')); }, getHexString: function Lexer_getHexString() { var strBuf = this.strBuf; strBuf.length = 0; var ch = this.currentChar; var isFirstHex = true; var firstDigit; var secondDigit; while (true) { if (ch < 0) { warn('Unterminated hex string'); break; } else if (ch === 0x3E) { // '>' this.nextChar(); break; } else if (specialChars[ch] === 1) { ch = this.nextChar(); continue; } else { if (isFirstHex) { firstDigit = toHexDigit(ch); if (firstDigit === -1) { warn('Ignoring invalid character "' + ch + '" in hex string'); ch = this.nextChar(); continue; } } else { secondDigit = toHexDigit(ch); if (secondDigit === -1) { warn('Ignoring invalid character "' + ch + '" in hex string'); ch = this.nextChar(); continue; } strBuf.push(String.fromCharCode((firstDigit << 4) | secondDigit)); } isFirstHex = !isFirstHex; ch = this.nextChar(); } } return strBuf.join(''); }, getObj: function Lexer_getObj() { // skip whitespace and comments var comment = false; var ch = this.currentChar; while (true) { if (ch < 0) { return EOF; } if (comment) { if (ch === 0x0A || ch === 0x0D) { // LF, CR comment = false; } } else if (ch === 0x25) { // '%' comment = true; } else if (specialChars[ch] !== 1) { break; } ch = this.nextChar(); } // start reading token switch (ch | 0) { case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: // '0'-'4' case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: // '5'-'9' case 0x2B: case 0x2D: case 0x2E: // '+', '-', '.' return this.getNumber(); case 0x28: // '(' return this.getString(); case 0x2F: // '/' return this.getName(); // array punctuation case 0x5B: // '[' this.nextChar(); return Cmd.get('['); case 0x5D: // ']' this.nextChar(); return Cmd.get(']'); // hex string or dict punctuation case 0x3C: // '<' ch = this.nextChar(); if (ch === 0x3C) { // dict punctuation this.nextChar(); return Cmd.get('<<'); } return this.getHexString(); // dict punctuation case 0x3E: // '>' ch = this.nextChar(); if (ch === 0x3E) { this.nextChar(); return Cmd.get('>>'); } return Cmd.get('>'); case 0x7B: // '{' this.nextChar(); return Cmd.get('{'); case 0x7D: // '}' this.nextChar(); return Cmd.get('}'); case 0x29: // ')' error('Illegal character: ' + ch); break; } // command var str = String.fromCharCode(ch); var knownCommands = this.knownCommands; var knownCommandFound = knownCommands && knownCommands[str] !== undefined; while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { // stop if known command is found and next character does not make // the str a command var possibleCommand = str + String.fromCharCode(ch); if (knownCommandFound && knownCommands[possibleCommand] === undefined) { break; } if (str.length === 128) { error('Command token too long: ' + str.length); } str = possibleCommand; knownCommandFound = knownCommands && knownCommands[str] !== undefined; } if (str === 'true') { return true; } if (str === 'false') { return false; } if (str === 'null') { return null; } return Cmd.get(str); }, skipToNextLine: function Lexer_skipToNextLine() { var ch = this.currentChar; while (ch >= 0) { if (ch === 0x0D) { // CR ch = this.nextChar(); if (ch === 0x0A) { // LF this.nextChar(); } break; } else if (ch === 0x0A) { // LF this.nextChar(); break; } ch = this.nextChar(); } } }; return Lexer; })(); var Linearization = { create: function LinearizationCreate(stream) { function getInt(name, allowZeroValue) { var obj = linDict.get(name); if (isInt(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) { return obj; } throw new Error('The "' + name + '" parameter in the linearization ' + 'dictionary is invalid.'); } function getHints() { var hints = linDict.get('H'), hintsLength, item; if (isArray(hints) && ((hintsLength = hints.length) === 2 || hintsLength === 4)) { for (var index = 0; index < hintsLength; index++) { if (!(isInt(item = hints[index]) && item > 0)) { throw new Error('Hint (' + index + ') in the linearization dictionary is invalid.'); } } return hints; } throw new Error('Hint array in the linearization dictionary is invalid.'); } var parser = new Parser(new Lexer(stream), false, null); var obj1 = parser.getObj(); var obj2 = parser.getObj(); var obj3 = parser.getObj(); var linDict = parser.getObj(); var obj, length; if (!(isInt(obj1) && isInt(obj2) && isCmd(obj3, 'obj') && isDict(linDict) && isNum(obj = linDict.get('Linearized')) && obj > 0)) { return null; // No valid linearization dictionary found. } else if ((length = getInt('L')) !== stream.length) { throw new Error('The "L" parameter in the linearization dictionary ' + 'does not equal the stream length.'); } return { length: length, hints: getHints(), objectNumberFirst: getInt('O'), endFirst: getInt('E'), numPages: getInt('N'), mainXRefEntriesOffset: getInt('T'), pageFirst: (linDict.has('P') ? getInt('P', true) : 0) }; } }; exports.EOF = EOF; exports.Lexer = Lexer; exports.Linearization = Linearization; exports.Parser = Parser; exports.isEOF = isEOF; })); (function (root, factory) { { factory((root.pdfjsCoreCMap = {}), root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreStream, root.pdfjsCoreParser); } }(this, function (exports, sharedUtil, corePrimitives, coreStream, coreParser) { var Util = sharedUtil.Util; var assert = sharedUtil.assert; var error = sharedUtil.error; var isInt = sharedUtil.isInt; var isString = sharedUtil.isString; var isName = corePrimitives.isName; var isCmd = corePrimitives.isCmd; var isStream = corePrimitives.isStream; var StringStream = coreStream.StringStream; var Lexer = coreParser.Lexer; var isEOF = coreParser.isEOF; var BUILT_IN_CMAPS = [ // << Start unicode maps. 'Adobe-GB1-UCS2', 'Adobe-CNS1-UCS2', 'Adobe-Japan1-UCS2', 'Adobe-Korea1-UCS2', // >> End unicode maps. '78-EUC-H', '78-EUC-V', '78-H', '78-RKSJ-H', '78-RKSJ-V', '78-V', '78ms-RKSJ-H', '78ms-RKSJ-V', '83pv-RKSJ-H', '90ms-RKSJ-H', '90ms-RKSJ-V', '90msp-RKSJ-H', '90msp-RKSJ-V', '90pv-RKSJ-H', '90pv-RKSJ-V', 'Add-H', 'Add-RKSJ-H', 'Add-RKSJ-V', 'Add-V', 'Adobe-CNS1-0', 'Adobe-CNS1-1', 'Adobe-CNS1-2', 'Adobe-CNS1-3', 'Adobe-CNS1-4', 'Adobe-CNS1-5', 'Adobe-CNS1-6', 'Adobe-GB1-0', 'Adobe-GB1-1', 'Adobe-GB1-2', 'Adobe-GB1-3', 'Adobe-GB1-4', 'Adobe-GB1-5', 'Adobe-Japan1-0', 'Adobe-Japan1-1', 'Adobe-Japan1-2', 'Adobe-Japan1-3', 'Adobe-Japan1-4', 'Adobe-Japan1-5', 'Adobe-Japan1-6', 'Adobe-Korea1-0', 'Adobe-Korea1-1', 'Adobe-Korea1-2', 'B5-H', 'B5-V', 'B5pc-H', 'B5pc-V', 'CNS-EUC-H', 'CNS-EUC-V', 'CNS1-H', 'CNS1-V', 'CNS2-H', 'CNS2-V', 'ETHK-B5-H', 'ETHK-B5-V', 'ETen-B5-H', 'ETen-B5-V', 'ETenms-B5-H', 'ETenms-B5-V', 'EUC-H', 'EUC-V', 'Ext-H', 'Ext-RKSJ-H', 'Ext-RKSJ-V', 'Ext-V', 'GB-EUC-H', 'GB-EUC-V', 'GB-H', 'GB-V', 'GBK-EUC-H', 'GBK-EUC-V', 'GBK2K-H', 'GBK2K-V', 'GBKp-EUC-H', 'GBKp-EUC-V', 'GBT-EUC-H', 'GBT-EUC-V', 'GBT-H', 'GBT-V', 'GBTpc-EUC-H', 'GBTpc-EUC-V', 'GBpc-EUC-H', 'GBpc-EUC-V', 'H', 'HKdla-B5-H', 'HKdla-B5-V', 'HKdlb-B5-H', 'HKdlb-B5-V', 'HKgccs-B5-H', 'HKgccs-B5-V', 'HKm314-B5-H', 'HKm314-B5-V', 'HKm471-B5-H', 'HKm471-B5-V', 'HKscs-B5-H', 'HKscs-B5-V', 'Hankaku', 'Hiragana', 'KSC-EUC-H', 'KSC-EUC-V', 'KSC-H', 'KSC-Johab-H', 'KSC-Johab-V', 'KSC-V', 'KSCms-UHC-H', 'KSCms-UHC-HW-H', 'KSCms-UHC-HW-V', 'KSCms-UHC-V', 'KSCpc-EUC-H', 'KSCpc-EUC-V', 'Katakana', 'NWP-H', 'NWP-V', 'RKSJ-H', 'RKSJ-V', 'Roman', 'UniCNS-UCS2-H', 'UniCNS-UCS2-V', 'UniCNS-UTF16-H', 'UniCNS-UTF16-V', 'UniCNS-UTF32-H', 'UniCNS-UTF32-V', 'UniCNS-UTF8-H', 'UniCNS-UTF8-V', 'UniGB-UCS2-H', 'UniGB-UCS2-V', 'UniGB-UTF16-H', 'UniGB-UTF16-V', 'UniGB-UTF32-H', 'UniGB-UTF32-V', 'UniGB-UTF8-H', 'UniGB-UTF8-V', 'UniJIS-UCS2-H', 'UniJIS-UCS2-HW-H', 'UniJIS-UCS2-HW-V', 'UniJIS-UCS2-V', 'UniJIS-UTF16-H', 'UniJIS-UTF16-V', 'UniJIS-UTF32-H', 'UniJIS-UTF32-V', 'UniJIS-UTF8-H', 'UniJIS-UTF8-V', 'UniJIS2004-UTF16-H', 'UniJIS2004-UTF16-V', 'UniJIS2004-UTF32-H', 'UniJIS2004-UTF32-V', 'UniJIS2004-UTF8-H', 'UniJIS2004-UTF8-V', 'UniJISPro-UCS2-HW-V', 'UniJISPro-UCS2-V', 'UniJISPro-UTF8-V', 'UniJISX0213-UTF32-H', 'UniJISX0213-UTF32-V', 'UniJISX02132004-UTF32-H', 'UniJISX02132004-UTF32-V', 'UniKS-UCS2-H', 'UniKS-UCS2-V', 'UniKS-UTF16-H', 'UniKS-UTF16-V', 'UniKS-UTF32-H', 'UniKS-UTF32-V', 'UniKS-UTF8-H', 'UniKS-UTF8-V', 'V', 'WP-Symbol']; // CMap, not to be confused with TrueType's cmap. var CMap = (function CMapClosure() { function CMap(builtInCMap) { // Codespace ranges are stored as follows: // [[1BytePairs], [2BytePairs], [3BytePairs], [4BytePairs]] // where nBytePairs are ranges e.g. [low1, high1, low2, high2, ...] this.codespaceRanges = [[], [], [], []]; this.numCodespaceRanges = 0; // Map entries have one of two forms. // - cid chars are 16-bit unsigned integers, stored as integers. // - bf chars are variable-length byte sequences, stored as strings, with // one byte per character. this._map = []; this.name = ''; this.vertical = false; this.useCMap = null; this.builtInCMap = builtInCMap; } CMap.prototype = { addCodespaceRange: function(n, low, high) { this.codespaceRanges[n - 1].push(low, high); this.numCodespaceRanges++; }, mapCidRange: function(low, high, dstLow) { while (low <= high) { this._map[low++] = dstLow++; } }, mapBfRange: function(low, high, dstLow) { var lastByte = dstLow.length - 1; while (low <= high) { this._map[low++] = dstLow; // Only the last byte has to be incremented. dstLow = dstLow.substr(0, lastByte) + String.fromCharCode(dstLow.charCodeAt(lastByte) + 1); } }, mapBfRangeToArray: function(low, high, array) { var i = 0, ii = array.length; while (low <= high && i < ii) { this._map[low] = array[i++]; ++low; } }, // This is used for both bf and cid chars. mapOne: function(src, dst) { this._map[src] = dst; }, lookup: function(code) { return this._map[code]; }, contains: function(code) { return this._map[code] !== undefined; }, forEach: function(callback) { // Most maps have fewer than 65536 entries, and for those we use normal // array iteration. But really sparse tables are possible -- e.g. with // indices in the *billions*. For such tables we use for..in, which isn't // ideal because it stringifies the indices for all present elements, but // it does avoid iterating over every undefined entry. var map = this._map; var length = map.length; var i; if (length <= 0x10000) { for (i = 0; i < length; i++) { if (map[i] !== undefined) { callback(i, map[i]); } } } else { for (i in this._map) { callback(i, map[i]); } } }, charCodeOf: function(value) { return this._map.indexOf(value); }, getMap: function() { return this._map; }, readCharCode: function(str, offset, out) { var c = 0; var codespaceRanges = this.codespaceRanges; var codespaceRangesLen = this.codespaceRanges.length; // 9.7.6.2 CMap Mapping // The code length is at most 4. for (var n = 0; n < codespaceRangesLen; n++) { c = ((c << 8) | str.charCodeAt(offset + n)) >>> 0; // Check each codespace range to see if it falls within. var codespaceRange = codespaceRanges[n]; for (var k = 0, kk = codespaceRange.length; k < kk;) { var low = codespaceRange[k++]; var high = codespaceRange[k++]; if (c >= low && c <= high) { out.charcode = c; out.length = n + 1; return; } } } out.charcode = 0; out.length = 1; }, get length() { return this._map.length; }, get isIdentityCMap() { if (!(this.name === 'Identity-H' || this.name === 'Identity-V')) { return false; } if (this._map.length !== 0x10000) { return false; } for (var i = 0; i < 0x10000; i++) { if (this._map[i] !== i) { return false; } } return true; } }; return CMap; })(); // A special case of CMap, where the _map array implicitly has a length of // 65536 and each element is equal to its index. var IdentityCMap = (function IdentityCMapClosure() { function IdentityCMap(vertical, n) { CMap.call(this); this.vertical = vertical; this.addCodespaceRange(n, 0, 0xffff); } Util.inherit(IdentityCMap, CMap, {}); IdentityCMap.prototype = { addCodespaceRange: CMap.prototype.addCodespaceRange, mapCidRange: function(low, high, dstLow) { error('should not call mapCidRange'); }, mapBfRange: function(low, high, dstLow) { error('should not call mapBfRange'); }, mapBfRangeToArray: function(low, high, array) { error('should not call mapBfRangeToArray'); }, mapOne: function(src, dst) { error('should not call mapCidOne'); }, lookup: function(code) { return (isInt(code) && code <= 0xffff) ? code : undefined; }, contains: function(code) { return isInt(code) && code <= 0xffff; }, forEach: function(callback) { for (var i = 0; i <= 0xffff; i++) { callback(i, i); } }, charCodeOf: function(value) { return (isInt(value) && value <= 0xffff) ? value : -1; }, getMap: function() { // Sometimes identity maps must be instantiated, but it's rare. var map = new Array(0x10000); for (var i = 0; i <= 0xffff; i++) { map[i] = i; } return map; }, readCharCode: CMap.prototype.readCharCode, get length() { return 0x10000; }, get isIdentityCMap() { error('should not access .isIdentityCMap'); } }; return IdentityCMap; })(); var BinaryCMapReader = (function BinaryCMapReaderClosure() { function fetchBinaryData(url) { return new Promise(function (resolve, reject) { var request = new XMLHttpRequest(); request.open('GET', url, true); request.responseType = 'arraybuffer'; request.onreadystatechange = function () { if (request.readyState === XMLHttpRequest.DONE) { if (!request.response || request.status !== 200 && request.status !== 0) { reject(new Error('Unable to get binary cMap at: ' + url)); } else { resolve(new Uint8Array(request.response)); } } }; request.send(null); }); } function hexToInt(a, size) { var n = 0; for (var i = 0; i <= size; i++) { n = (n << 8) | a[i]; } return n >>> 0; } function hexToStr(a, size) { // This code is hot. Special-case some common values to avoid creating an // object with subarray(). if (size === 1) { return String.fromCharCode(a[0], a[1]); } if (size === 3) { return String.fromCharCode(a[0], a[1], a[2], a[3]); } return String.fromCharCode.apply(null, a.subarray(0, size + 1)); } function addHex(a, b, size) { var c = 0; for (var i = size; i >= 0; i--) { c += a[i] + b[i]; a[i] = c & 255; c >>= 8; } } function incHex(a, size) { var c = 1; for (var i = size; i >= 0 && c > 0; i--) { c += a[i]; a[i] = c & 255; c >>= 8; } } var MAX_NUM_SIZE = 16; var MAX_ENCODED_NUM_SIZE = 19; // ceil(MAX_NUM_SIZE * 7 / 8) function BinaryCMapStream(data) { this.buffer = data; this.pos = 0; this.end = data.length; this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE); } BinaryCMapStream.prototype = { readByte: function () { if (this.pos >= this.end) { return -1; } return this.buffer[this.pos++]; }, readNumber: function () { var n = 0; var last; do { var b = this.readByte(); if (b < 0) { error('unexpected EOF in bcmap'); } last = !(b & 0x80); n = (n << 7) | (b & 0x7F); } while (!last); return n; }, readSigned: function () { var n = this.readNumber(); return (n & 1) ? ~(n >>> 1) : n >>> 1; }, readHex: function (num, size) { num.set(this.buffer.subarray(this.pos, this.pos + size + 1)); this.pos += size + 1; }, readHexNumber: function (num, size) { var last; var stack = this.tmpBuf, sp = 0; do { var b = this.readByte(); if (b < 0) { error('unexpected EOF in bcmap'); } last = !(b & 0x80); stack[sp++] = b & 0x7F; } while (!last); var i = size, buffer = 0, bufferSize = 0; while (i >= 0) { while (bufferSize < 8 && stack.length > 0) { buffer = (stack[--sp] << bufferSize) | buffer; bufferSize += 7; } num[i] = buffer & 255; i--; buffer >>= 8; bufferSize -= 8; } }, readHexSigned: function (num, size) { this.readHexNumber(num, size); var sign = num[size] & 1 ? 255 : 0; var c = 0; for (var i = 0; i <= size; i++) { c = ((c & 1) << 8) | num[i]; num[i] = (c >> 1) ^ sign; } }, readString: function () { var len = this.readNumber(); var s = ''; for (var i = 0; i < len; i++) { s += String.fromCharCode(this.readNumber()); } return s; } }; function processBinaryCMap(url, cMap, extend) { return fetchBinaryData(url).then(function (data) { var stream = new BinaryCMapStream(data); var header = stream.readByte(); cMap.vertical = !!(header & 1); var useCMap = null; var start = new Uint8Array(MAX_NUM_SIZE); var end = new Uint8Array(MAX_NUM_SIZE); var char = new Uint8Array(MAX_NUM_SIZE); var charCode = new Uint8Array(MAX_NUM_SIZE); var tmp = new Uint8Array(MAX_NUM_SIZE); var code; var b; while ((b = stream.readByte()) >= 0) { var type = b >> 5; if (type === 7) { // metadata, e.g. comment or usecmap switch (b & 0x1F) { case 0: stream.readString(); // skipping comment break; case 1: useCMap = stream.readString(); break; } continue; } var sequence = !!(b & 0x10); var dataSize = b & 15; assert(dataSize + 1 <= MAX_NUM_SIZE); var ucs2DataSize = 1; var subitemsCount = stream.readNumber(); var i; switch (type) { case 0: // codespacerange stream.readHex(start, dataSize); stream.readHexNumber(end, dataSize); addHex(end, start, dataSize); cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize)); for (i = 1; i < subitemsCount; i++) { incHex(end, dataSize); stream.readHexNumber(start, dataSize); addHex(start, end, dataSize); stream.readHexNumber(end, dataSize); addHex(end, start, dataSize); cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize)); } break; case 1: // notdefrange stream.readHex(start, dataSize); stream.readHexNumber(end, dataSize); addHex(end, start, dataSize); code = stream.readNumber(); // undefined range, skipping for (i = 1; i < subitemsCount; i++) { incHex(end, dataSize); stream.readHexNumber(start, dataSize); addHex(start, end, dataSize); stream.readHexNumber(end, dataSize); addHex(end, start, dataSize); code = stream.readNumber(); // nop } break; case 2: // cidchar stream.readHex(char, dataSize); code = stream.readNumber(); cMap.mapOne(hexToInt(char, dataSize), code); for (i = 1; i < subitemsCount; i++) { incHex(char, dataSize); if (!sequence) { stream.readHexNumber(tmp, dataSize); addHex(char, tmp, dataSize); } code = stream.readSigned() + (code + 1); cMap.mapOne(hexToInt(char, dataSize), code); } break; case 3: // cidrange stream.readHex(start, dataSize); stream.readHexNumber(end, dataSize); addHex(end, start, dataSize); code = stream.readNumber(); cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code); for (i = 1; i < subitemsCount; i++) { incHex(end, dataSize); if (!sequence) { stream.readHexNumber(start, dataSize); addHex(start, end, dataSize); } else { start.set(end); } stream.readHexNumber(end, dataSize); addHex(end, start, dataSize); code = stream.readNumber(); cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code); } break; case 4: // bfchar stream.readHex(char, ucs2DataSize); stream.readHex(charCode, dataSize); cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); for (i = 1; i < subitemsCount; i++) { incHex(char, ucs2DataSize); if (!sequence) { stream.readHexNumber(tmp, ucs2DataSize); addHex(char, tmp, ucs2DataSize); } incHex(charCode, dataSize); stream.readHexSigned(tmp, dataSize); addHex(charCode, tmp, dataSize); cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); } break; case 5: // bfrange stream.readHex(start, ucs2DataSize); stream.readHexNumber(end, ucs2DataSize); addHex(end, start, ucs2DataSize); stream.readHex(charCode, dataSize); cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize)); for (i = 1; i < subitemsCount; i++) { incHex(end, ucs2DataSize); if (!sequence) { stream.readHexNumber(start, ucs2DataSize); addHex(start, end, ucs2DataSize); } else { start.set(end); } stream.readHexNumber(end, ucs2DataSize); addHex(end, start, ucs2DataSize); stream.readHex(charCode, dataSize); cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize)); } break; default: error('Unknown type: ' + type); break; } } if (useCMap) { return extend(useCMap); } return cMap; }); } function BinaryCMapReader() {} BinaryCMapReader.prototype = { read: processBinaryCMap }; return BinaryCMapReader; })(); var CMapFactory = (function CMapFactoryClosure() { function strToInt(str) { var a = 0; for (var i = 0; i < str.length; i++) { a = (a << 8) | str.charCodeAt(i); } return a >>> 0; } function expectString(obj) { if (!isString(obj)) { error('Malformed CMap: expected string.'); } } function expectInt(obj) { if (!isInt(obj)) { error('Malformed CMap: expected int.'); } } function parseBfChar(cMap, lexer) { while (true) { var obj = lexer.getObj(); if (isEOF(obj)) { break; } if (isCmd(obj, 'endbfchar')) { return; } expectString(obj); var src = strToInt(obj); obj = lexer.getObj(); // TODO are /dstName used? expectString(obj); var dst = obj; cMap.mapOne(src, dst); } } function parseBfRange(cMap, lexer) { while (true) { var obj = lexer.getObj(); if (isEOF(obj)) { break; } if (isCmd(obj, 'endbfrange')) { return; } expectString(obj); var low = strToInt(obj); obj = lexer.getObj(); expectString(obj); var high = strToInt(obj); obj = lexer.getObj(); if (isInt(obj) || isString(obj)) { var dstLow = isInt(obj) ? String.fromCharCode(obj) : obj; cMap.mapBfRange(low, high, dstLow); } else if (isCmd(obj, '[')) { obj = lexer.getObj(); var array = []; while (!isCmd(obj, ']') && !isEOF(obj)) { array.push(obj); obj = lexer.getObj(); } cMap.mapBfRangeToArray(low, high, array); } else { break; } } error('Invalid bf range.'); } function parseCidChar(cMap, lexer) { while (true) { var obj = lexer.getObj(); if (isEOF(obj)) { break; } if (isCmd(obj, 'endcidchar')) { return; } expectString(obj); var src = strToInt(obj); obj = lexer.getObj(); expectInt(obj); var dst = obj; cMap.mapOne(src, dst); } } function parseCidRange(cMap, lexer) { while (true) { var obj = lexer.getObj(); if (isEOF(obj)) { break; } if (isCmd(obj, 'endcidrange')) { return; } expectString(obj); var low = strToInt(obj); obj = lexer.getObj(); expectString(obj); var high = strToInt(obj); obj = lexer.getObj(); expectInt(obj); var dstLow = obj; cMap.mapCidRange(low, high, dstLow); } } function parseCodespaceRange(cMap, lexer) { while (true) { var obj = lexer.getObj(); if (isEOF(obj)) { break; } if (isCmd(obj, 'endcodespacerange')) { return; } if (!isString(obj)) { break; } var low = strToInt(obj); obj = lexer.getObj(); if (!isString(obj)) { break; } var high = strToInt(obj); cMap.addCodespaceRange(obj.length, low, high); } error('Invalid codespace range.'); } function parseWMode(cMap, lexer) { var obj = lexer.getObj(); if (isInt(obj)) { cMap.vertical = !!obj; } } function parseCMapName(cMap, lexer) { var obj = lexer.getObj(); if (isName(obj) && isString(obj.name)) { cMap.name = obj.name; } } function parseCMap(cMap, lexer, builtInCMapParams, useCMap) { var previous; var embededUseCMap; objLoop: while (true) { var obj = lexer.getObj(); if (isEOF(obj)) { break; } else if (isName(obj)) { if (obj.name === 'WMode') { parseWMode(cMap, lexer); } else if (obj.name === 'CMapName') { parseCMapName(cMap, lexer); } previous = obj; } else if (isCmd(obj)) { switch (obj.cmd) { case 'endcmap': break objLoop; case 'usecmap': if (isName(previous)) { embededUseCMap = previous.name; } break; case 'begincodespacerange': parseCodespaceRange(cMap, lexer); break; case 'beginbfchar': parseBfChar(cMap, lexer); break; case 'begincidchar': parseCidChar(cMap, lexer); break; case 'beginbfrange': parseBfRange(cMap, lexer); break; case 'begincidrange': parseCidRange(cMap, lexer); break; } } } if (!useCMap && embededUseCMap) { // Load the usecmap definition from the file only if there wasn't one // specified. useCMap = embededUseCMap; } if (useCMap) { return extendCMap(cMap, builtInCMapParams, useCMap); } else { return Promise.resolve(cMap); } } function extendCMap(cMap, builtInCMapParams, useCMap) { return createBuiltInCMap(useCMap, builtInCMapParams).then( function(newCMap) { cMap.useCMap = newCMap; // If there aren't any code space ranges defined clone all the parent ones // into this cMap. if (cMap.numCodespaceRanges === 0) { var useCodespaceRanges = cMap.useCMap.codespaceRanges; for (var i = 0; i < useCodespaceRanges.length; i++) { cMap.codespaceRanges[i] = useCodespaceRanges[i].slice(); } cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges; } // Merge the map into the current one, making sure not to override // any previously defined entries. cMap.useCMap.forEach(function(key, value) { if (!cMap.contains(key)) { cMap.mapOne(key, cMap.useCMap.lookup(key)); } }); return cMap; }); } function parseBinaryCMap(name, builtInCMapParams) { var url = builtInCMapParams.url + name + '.bcmap'; var cMap = new CMap(true); return new BinaryCMapReader().read(url, cMap, function (useCMap) { return extendCMap(cMap, builtInCMapParams, useCMap); }); } function createBuiltInCMap(name, builtInCMapParams) { if (name === 'Identity-H') { return Promise.resolve(new IdentityCMap(false, 2)); } else if (name === 'Identity-V') { return Promise.resolve(new IdentityCMap(true, 2)); } if (BUILT_IN_CMAPS.indexOf(name) === -1) { return Promise.reject(new Error('Unknown cMap name: ' + name)); } assert(builtInCMapParams, 'built-in cMap parameters are not provided'); if (builtInCMapParams.packed) { return parseBinaryCMap(name, builtInCMapParams); } return new Promise(function (resolve, reject) { var url = builtInCMapParams.url + name; var request = new XMLHttpRequest(); request.onreadystatechange = function () { if (request.readyState === XMLHttpRequest.DONE) { if (request.status === 200 || request.status === 0) { var cMap = new CMap(true); var lexer = new Lexer(new StringStream(request.responseText)); parseCMap(cMap, lexer, builtInCMapParams, null).then( function (parsedCMap) { resolve(parsedCMap); }).catch(function (e) { reject(new Error({ message: 'Invalid CMap data', error: e })); }); } else { reject(new Error('Unable to get cMap at: ' + url)); } } }; request.open('GET', url, true); request.send(null); }); } return { create: function (encoding, builtInCMapParams, useCMap) { if (isName(encoding)) { return createBuiltInCMap(encoding.name, builtInCMapParams); } else if (isStream(encoding)) { var cMap = new CMap(); var lexer = new Lexer(encoding); return parseCMap(cMap, lexer, builtInCMapParams, useCMap).then( function (parsedCMap) { if (parsedCMap.isIdentityCMap) { return createBuiltInCMap(parsedCMap.name, builtInCMapParams); } return parsedCMap; }); } return Promise.reject(new Error('Encoding required.')); } }; })(); exports.CMap = CMap; exports.CMapFactory = CMapFactory; exports.IdentityCMap = IdentityCMap; })); (function (root, factory) { { factory((root.pdfjsCorePsParser = {}), root.pdfjsSharedUtil, root.pdfjsCoreParser); } }(this, function (exports, sharedUtil, coreParser) { var error = sharedUtil.error; var EOF = coreParser.EOF; var Lexer = coreParser.Lexer; var PostScriptParser = (function PostScriptParserClosure() { function PostScriptParser(lexer) { this.lexer = lexer; this.operators = []; this.token = null; this.prev = null; } PostScriptParser.prototype = { nextToken: function PostScriptParser_nextToken() { this.prev = this.token; this.token = this.lexer.getToken(); }, accept: function PostScriptParser_accept(type) { if (this.token.type === type) { this.nextToken(); return true; } return false; }, expect: function PostScriptParser_expect(type) { if (this.accept(type)) { return true; } error('Unexpected symbol: found ' + this.token.type + ' expected ' + type + '.'); }, parse: function PostScriptParser_parse() { this.nextToken(); this.expect(PostScriptTokenTypes.LBRACE); this.parseBlock(); this.expect(PostScriptTokenTypes.RBRACE); return this.operators; }, parseBlock: function PostScriptParser_parseBlock() { while (true) { if (this.accept(PostScriptTokenTypes.NUMBER)) { this.operators.push(this.prev.value); } else if (this.accept(PostScriptTokenTypes.OPERATOR)) { this.operators.push(this.prev.value); } else if (this.accept(PostScriptTokenTypes.LBRACE)) { this.parseCondition(); } else { return; } } }, parseCondition: function PostScriptParser_parseCondition() { // Add two place holders that will be updated later var conditionLocation = this.operators.length; this.operators.push(null, null); this.parseBlock(); this.expect(PostScriptTokenTypes.RBRACE); if (this.accept(PostScriptTokenTypes.IF)) { // The true block is right after the 'if' so it just falls through on // true else it jumps and skips the true block. this.operators[conditionLocation] = this.operators.length; this.operators[conditionLocation + 1] = 'jz'; } else if (this.accept(PostScriptTokenTypes.LBRACE)) { var jumpLocation = this.operators.length; this.operators.push(null, null); var endOfTrue = this.operators.length; this.parseBlock(); this.expect(PostScriptTokenTypes.RBRACE); this.expect(PostScriptTokenTypes.IFELSE); // The jump is added at the end of the true block to skip the false // block. this.operators[jumpLocation] = this.operators.length; this.operators[jumpLocation + 1] = 'j'; this.operators[conditionLocation] = endOfTrue; this.operators[conditionLocation + 1] = 'jz'; } else { error('PS Function: error parsing conditional.'); } } }; return PostScriptParser; })(); var PostScriptTokenTypes = { LBRACE: 0, RBRACE: 1, NUMBER: 2, OPERATOR: 3, IF: 4, IFELSE: 5 }; var PostScriptToken = (function PostScriptTokenClosure() { function PostScriptToken(type, value) { this.type = type; this.value = value; } var opCache = Object.create(null); PostScriptToken.getOperator = function PostScriptToken_getOperator(op) { var opValue = opCache[op]; if (opValue) { return opValue; } return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op); }; PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE, '{'); PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE, '}'); PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF'); PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE, 'IFELSE'); return PostScriptToken; })(); var PostScriptLexer = (function PostScriptLexerClosure() { function PostScriptLexer(stream) { this.stream = stream; this.nextChar(); this.strBuf = []; } PostScriptLexer.prototype = { nextChar: function PostScriptLexer_nextChar() { return (this.currentChar = this.stream.getByte()); }, getToken: function PostScriptLexer_getToken() { var comment = false; var ch = this.currentChar; // skip comments while (true) { if (ch < 0) { return EOF; } if (comment) { if (ch === 0x0A || ch === 0x0D) { comment = false; } } else if (ch === 0x25) { // '%' comment = true; } else if (!Lexer.isSpace(ch)) { break; } ch = this.nextChar(); } switch (ch | 0) { case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: // '0'-'4' case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: // '5'-'9' case 0x2B: case 0x2D: case 0x2E: // '+', '-', '.' return new PostScriptToken(PostScriptTokenTypes.NUMBER, this.getNumber()); case 0x7B: // '{' this.nextChar(); return PostScriptToken.LBRACE; case 0x7D: // '}' this.nextChar(); return PostScriptToken.RBRACE; } // operator var strBuf = this.strBuf; strBuf.length = 0; strBuf[0] = String.fromCharCode(ch); while ((ch = this.nextChar()) >= 0 && // and 'A'-'Z', 'a'-'z' ((ch >= 0x41 && ch <= 0x5A) || (ch >= 0x61 && ch <= 0x7A))) { strBuf.push(String.fromCharCode(ch)); } var str = strBuf.join(''); switch (str.toLowerCase()) { case 'if': return PostScriptToken.IF; case 'ifelse': return PostScriptToken.IFELSE; default: return PostScriptToken.getOperator(str); } }, getNumber: function PostScriptLexer_getNumber() { var ch = this.currentChar; var strBuf = this.strBuf; strBuf.length = 0; strBuf[0] = String.fromCharCode(ch); while ((ch = this.nextChar()) >= 0) { if ((ch >= 0x30 && ch <= 0x39) || // '0'-'9' ch === 0x2D || ch === 0x2E) { // '-', '.' strBuf.push(String.fromCharCode(ch)); } else { break; } } var value = parseFloat(strBuf.join('')); if (isNaN(value)) { error('Invalid floating point number: ' + value); } return value; } }; return PostScriptLexer; })(); exports.PostScriptLexer = PostScriptLexer; exports.PostScriptParser = PostScriptParser; })); (function (root, factory) { { factory((root.pdfjsCoreType1Parser = {}), root.pdfjsSharedUtil, root.pdfjsCoreStream, root.pdfjsCoreParser, root.pdfjsCoreEncodings); } }(this, function (exports, sharedUtil, coreStream, coreParser, coreEncodings) { var warn = sharedUtil.warn; var Stream = coreStream.Stream; var Lexer = coreParser.Lexer; var getEncoding = coreEncodings.getEncoding; // Hinting is currently disabled due to unknown problems on windows // in tracemonkey and various other pdfs with type1 fonts. var HINTING_ENABLED = false; /* * CharStrings are encoded following the the CharString Encoding sequence * describe in Chapter 6 of the "Adobe Type1 Font Format" specification. * The value in a byte indicates a command, a number, or subsequent bytes * that are to be interpreted in a special way. * * CharString Number Encoding: * A CharString byte containing the values from 32 through 255 inclusive * indicate an integer. These values are decoded in four ranges. * * 1. A CharString byte containing a value, v, between 32 and 246 inclusive, * indicate the integer v - 139. Thus, the integer values from -107 through * 107 inclusive may be encoded in single byte. * * 2. A CharString byte containing a value, v, between 247 and 250 inclusive, * indicates an integer involving the next byte, w, according to the formula: * [(v - 247) x 256] + w + 108 * * 3. A CharString byte containing a value, v, between 251 and 254 inclusive, * indicates an integer involving the next byte, w, according to the formula: * -[(v - 251) * 256] - w - 108 * * 4. A CharString containing the value 255 indicates that the next 4 bytes * are a two complement signed integer. The first of these bytes contains the * highest order bits, the second byte contains the next higher order bits * and the fourth byte contain the lowest order bits. * * * CharString Command Encoding: * CharStrings commands are encoded in 1 or 2 bytes. * * Single byte commands are encoded in 1 byte that contains a value between * 0 and 31 inclusive. * If a command byte contains the value 12, then the value in the next byte * indicates a command. This "escape" mechanism allows many extra commands * to be encoded and this encoding technique helps to minimize the length of * the charStrings. */ var Type1CharString = (function Type1CharStringClosure() { var COMMAND_MAP = { 'hstem': [1], 'vstem': [3], 'vmoveto': [4], 'rlineto': [5], 'hlineto': [6], 'vlineto': [7], 'rrcurveto': [8], 'callsubr': [10], 'flex': [12, 35], 'drop' : [12, 18], 'endchar': [14], 'rmoveto': [21], 'hmoveto': [22], 'vhcurveto': [30], 'hvcurveto': [31] }; function Type1CharString() { this.width = 0; this.lsb = 0; this.flexing = false; this.output = []; this.stack = []; } Type1CharString.prototype = { convert: function Type1CharString_convert(encoded, subrs, seacAnalysisEnabled) { var count = encoded.length; var error = false; var wx, sbx, subrNumber; for (var i = 0; i < count; i++) { var value = encoded[i]; if (value < 32) { if (value === 12) { value = (value << 8) + encoded[++i]; } switch (value) { case 1: // hstem if (!HINTING_ENABLED) { this.stack = []; break; } error = this.executeCommand(2, COMMAND_MAP.hstem); break; case 3: // vstem if (!HINTING_ENABLED) { this.stack = []; break; } error = this.executeCommand(2, COMMAND_MAP.vstem); break; case 4: // vmoveto if (this.flexing) { if (this.stack.length < 1) { error = true; break; } // Add the dx for flex and but also swap the values so they are // the right order. var dy = this.stack.pop(); this.stack.push(0, dy); break; } error = this.executeCommand(1, COMMAND_MAP.vmoveto); break; case 5: // rlineto error = this.executeCommand(2, COMMAND_MAP.rlineto); break; case 6: // hlineto error = this.executeCommand(1, COMMAND_MAP.hlineto); break; case 7: // vlineto error = this.executeCommand(1, COMMAND_MAP.vlineto); break; case 8: // rrcurveto error = this.executeCommand(6, COMMAND_MAP.rrcurveto); break; case 9: // closepath // closepath is a Type1 command that does not take argument and is // useless in Type2 and it can simply be ignored. this.stack = []; break; case 10: // callsubr if (this.stack.length < 1) { error = true; break; } subrNumber = this.stack.pop(); error = this.convert(subrs[subrNumber], subrs, seacAnalysisEnabled); break; case 11: // return return error; case 13: // hsbw if (this.stack.length < 2) { error = true; break; } // To convert to type2 we have to move the width value to the // first part of the charstring and then use hmoveto with lsb. wx = this.stack.pop(); sbx = this.stack.pop(); this.lsb = sbx; this.width = wx; this.stack.push(wx, sbx); error = this.executeCommand(2, COMMAND_MAP.hmoveto); break; case 14: // endchar this.output.push(COMMAND_MAP.endchar[0]); break; case 21: // rmoveto if (this.flexing) { break; } error = this.executeCommand(2, COMMAND_MAP.rmoveto); break; case 22: // hmoveto if (this.flexing) { // Add the dy for flex. this.stack.push(0); break; } error = this.executeCommand(1, COMMAND_MAP.hmoveto); break; case 30: // vhcurveto error = this.executeCommand(4, COMMAND_MAP.vhcurveto); break; case 31: // hvcurveto error = this.executeCommand(4, COMMAND_MAP.hvcurveto); break; case (12 << 8) + 0: // dotsection // dotsection is a Type1 command to specify some hinting feature // for dots that do not take a parameter and it can safely be // ignored for Type2. this.stack = []; break; case (12 << 8) + 1: // vstem3 if (!HINTING_ENABLED) { this.stack = []; break; } // [vh]stem3 are Type1 only and Type2 supports [vh]stem with // multiple parameters, so instead of returning [vh]stem3 take a // shortcut and return [vhstem] instead. error = this.executeCommand(2, COMMAND_MAP.vstem); break; case (12 << 8) + 2: // hstem3 if (!HINTING_ENABLED) { this.stack = []; break; } // See vstem3. error = this.executeCommand(2, COMMAND_MAP.hstem); break; case (12 << 8) + 6: // seac // seac is like type 2's special endchar but it doesn't use the // first argument asb, so remove it. if (seacAnalysisEnabled) { this.seac = this.stack.splice(-4, 4); error = this.executeCommand(0, COMMAND_MAP.endchar); } else { error = this.executeCommand(4, COMMAND_MAP.endchar); } break; case (12 << 8) + 7: // sbw if (this.stack.length < 4) { error = true; break; } // To convert to type2 we have to move the width value to the // first part of the charstring and then use rmoveto with // (dx, dy). The height argument will not be used for vmtx and // vhea tables reconstruction -- ignoring it. var wy = this.stack.pop(); wx = this.stack.pop(); var sby = this.stack.pop(); sbx = this.stack.pop(); this.lsb = sbx; this.width = wx; this.stack.push(wx, sbx, sby); error = this.executeCommand(3, COMMAND_MAP.rmoveto); break; case (12 << 8) + 12: // div if (this.stack.length < 2) { error = true; break; } var num2 = this.stack.pop(); var num1 = this.stack.pop(); this.stack.push(num1 / num2); break; case (12 << 8) + 16: // callothersubr if (this.stack.length < 2) { error = true; break; } subrNumber = this.stack.pop(); var numArgs = this.stack.pop(); if (subrNumber === 0 && numArgs === 3) { var flexArgs = this.stack.splice(this.stack.length - 17, 17); this.stack.push( flexArgs[2] + flexArgs[0], // bcp1x + rpx flexArgs[3] + flexArgs[1], // bcp1y + rpy flexArgs[4], // bcp2x flexArgs[5], // bcp2y flexArgs[6], // p2x flexArgs[7], // p2y flexArgs[8], // bcp3x flexArgs[9], // bcp3y flexArgs[10], // bcp4x flexArgs[11], // bcp4y flexArgs[12], // p3x flexArgs[13], // p3y flexArgs[14] // flexDepth // 15 = finalx unused by flex // 16 = finaly unused by flex ); error = this.executeCommand(13, COMMAND_MAP.flex, true); this.flexing = false; this.stack.push(flexArgs[15], flexArgs[16]); } else if (subrNumber === 1 && numArgs === 0) { this.flexing = true; } break; case (12 << 8) + 17: // pop // Ignore this since it is only used with othersubr. break; case (12 << 8) + 33: // setcurrentpoint // Ignore for now. this.stack = []; break; default: warn('Unknown type 1 charstring command of "' + value + '"'); break; } if (error) { break; } continue; } else if (value <= 246) { value = value - 139; } else if (value <= 250) { value = ((value - 247) * 256) + encoded[++i] + 108; } else if (value <= 254) { value = -((value - 251) * 256) - encoded[++i] - 108; } else { value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 | (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0; } this.stack.push(value); } return error; }, executeCommand: function(howManyArgs, command, keepStack) { var stackLength = this.stack.length; if (howManyArgs > stackLength) { return true; } var start = stackLength - howManyArgs; for (var i = start; i < stackLength; i++) { var value = this.stack[i]; if (value === (value | 0)) { // int this.output.push(28, (value >> 8) & 0xff, value & 0xff); } else { // fixed point value = (65536 * value) | 0; this.output.push(255, (value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF); } } this.output.push.apply(this.output, command); if (keepStack) { this.stack.splice(start, howManyArgs); } else { this.stack.length = 0; } return false; } }; return Type1CharString; })(); /* * Type1Parser encapsulate the needed code for parsing a Type1 font * program. Some of its logic depends on the Type2 charstrings * structure. * Note: this doesn't really parse the font since that would require evaluation * of PostScript, but it is possible in most cases to extract what we need * without a full parse. */ var Type1Parser = (function Type1ParserClosure() { /* * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence * of Plaintext Bytes. The function took a key as a parameter which can be * for decrypting the eexec block of for decoding charStrings. */ var EEXEC_ENCRYPT_KEY = 55665; var CHAR_STRS_ENCRYPT_KEY = 4330; function isHexDigit(code) { return code >= 48 && code <= 57 || // '0'-'9' code >= 65 && code <= 70 || // 'A'-'F' code >= 97 && code <= 102; // 'a'-'f' } function decrypt(data, key, discardNumber) { if (discardNumber >= data.length) { return new Uint8Array(0); } var r = key | 0, c1 = 52845, c2 = 22719, i, j; for (i = 0; i < discardNumber; i++) { r = ((data[i] + r) * c1 + c2) & ((1 << 16) - 1); } var count = data.length - discardNumber; var decrypted = new Uint8Array(count); for (i = discardNumber, j = 0; j < count; i++, j++) { var value = data[i]; decrypted[j] = value ^ (r >> 8); r = ((value + r) * c1 + c2) & ((1 << 16) - 1); } return decrypted; } function decryptAscii(data, key, discardNumber) { var r = key | 0, c1 = 52845, c2 = 22719; var count = data.length, maybeLength = count >>> 1; var decrypted = new Uint8Array(maybeLength); var i, j; for (i = 0, j = 0; i < count; i++) { var digit1 = data[i]; if (!isHexDigit(digit1)) { continue; } i++; var digit2; while (i < count && !isHexDigit(digit2 = data[i])) { i++; } if (i < count) { var value = parseInt(String.fromCharCode(digit1, digit2), 16); decrypted[j++] = value ^ (r >> 8); r = ((value + r) * c1 + c2) & ((1 << 16) - 1); } } return Array.prototype.slice.call(decrypted, discardNumber, j); } function isSpecial(c) { return c === 0x2F || // '/' c === 0x5B || c === 0x5D || // '[', ']' c === 0x7B || c === 0x7D || // '{', '}' c === 0x28 || c === 0x29; // '(', ')' } function Type1Parser(stream, encrypted, seacAnalysisEnabled) { if (encrypted) { var data = stream.getBytes(); var isBinary = !(isHexDigit(data[0]) && isHexDigit(data[1]) && isHexDigit(data[2]) && isHexDigit(data[3])); stream = new Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : decryptAscii(data, EEXEC_ENCRYPT_KEY, 4)); } this.seacAnalysisEnabled = !!seacAnalysisEnabled; this.stream = stream; this.nextChar(); } Type1Parser.prototype = { readNumberArray: function Type1Parser_readNumberArray() { this.getToken(); // read '[' or '{' (arrays can start with either) var array = []; while (true) { var token = this.getToken(); if (token === null || token === ']' || token === '}') { break; } array.push(parseFloat(token || 0)); } return array; }, readNumber: function Type1Parser_readNumber() { var token = this.getToken(); return parseFloat(token || 0); }, readInt: function Type1Parser_readInt() { // Use '| 0' to prevent setting a double into length such as the double // does not flow into the loop variable. var token = this.getToken(); return parseInt(token || 0, 10) | 0; }, readBoolean: function Type1Parser_readBoolean() { var token = this.getToken(); // Use 1 and 0 since that's what type2 charstrings use. return token === 'true' ? 1 : 0; }, nextChar : function Type1_nextChar() { return (this.currentChar = this.stream.getByte()); }, getToken: function Type1Parser_getToken() { // Eat whitespace and comments. var comment = false; var ch = this.currentChar; while (true) { if (ch === -1) { return null; } if (comment) { if (ch === 0x0A || ch === 0x0D) { comment = false; } } else if (ch === 0x25) { // '%' comment = true; } else if (!Lexer.isSpace(ch)) { break; } ch = this.nextChar(); } if (isSpecial(ch)) { this.nextChar(); return String.fromCharCode(ch); } var token = ''; do { token += String.fromCharCode(ch); ch = this.nextChar(); } while (ch >= 0 && !Lexer.isSpace(ch) && !isSpecial(ch)); return token; }, /* * Returns an object containing a Subrs array and a CharStrings * array extracted from and eexec encrypted block of data */ extractFontProgram: function Type1Parser_extractFontProgram() { var stream = this.stream; var subrs = [], charstrings = []; var privateData = Object.create(null); privateData['lenIV'] = 4; var program = { subrs: [], charstrings: [], properties: { 'privateData': privateData } }; var token, length, data, lenIV, encoded; while ((token = this.getToken()) !== null) { if (token !== '/') { continue; } token = this.getToken(); switch (token) { case 'CharStrings': // The number immediately following CharStrings must be greater or // equal to the number of CharStrings. this.getToken(); this.getToken(); // read in 'dict' this.getToken(); // read in 'dup' this.getToken(); // read in 'begin' while(true) { token = this.getToken(); if (token === null || token === 'end') { break; } if (token !== '/') { continue; } var glyph = this.getToken(); length = this.readInt(); this.getToken(); // read in 'RD' or '-|' data = stream.makeSubStream(stream.pos, length); lenIV = program.properties.privateData['lenIV']; encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV); // Skip past the required space and binary data. stream.skip(length); this.nextChar(); token = this.getToken(); // read in 'ND' or '|-' if (token === 'noaccess') { this.getToken(); // read in 'def' } charstrings.push({ glyph: glyph, encoded: encoded }); } break; case 'Subrs': var num = this.readInt(); this.getToken(); // read in 'array' while ((token = this.getToken()) === 'dup') { var index = this.readInt(); length = this.readInt(); this.getToken(); // read in 'RD' or '-|' data = stream.makeSubStream(stream.pos, length); lenIV = program.properties.privateData['lenIV']; encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV); // Skip past the required space and binary data. stream.skip(length); this.nextChar(); token = this.getToken(); // read in 'NP' or '|' if (token === 'noaccess') { this.getToken(); // read in 'put' } subrs[index] = encoded; } break; case 'BlueValues': case 'OtherBlues': case 'FamilyBlues': case 'FamilyOtherBlues': var blueArray = this.readNumberArray(); // *Blue* values may contain invalid data: disables reading of // those values when hinting is disabled. if (blueArray.length > 0 && (blueArray.length % 2) === 0 && HINTING_ENABLED) { program.properties.privateData[token] = blueArray; } break; case 'StemSnapH': case 'StemSnapV': program.properties.privateData[token] = this.readNumberArray(); break; case 'StdHW': case 'StdVW': program.properties.privateData[token] = this.readNumberArray()[0]; break; case 'BlueShift': case 'lenIV': case 'BlueFuzz': case 'BlueScale': case 'LanguageGroup': case 'ExpansionFactor': program.properties.privateData[token] = this.readNumber(); break; case 'ForceBold': program.properties.privateData[token] = this.readBoolean(); break; } } for (var i = 0; i < charstrings.length; i++) { glyph = charstrings[i].glyph; encoded = charstrings[i].encoded; var charString = new Type1CharString(); var error = charString.convert(encoded, subrs, this.seacAnalysisEnabled); var output = charString.output; if (error) { // It seems when FreeType encounters an error while evaluating a glyph // that it completely ignores the glyph so we'll mimic that behaviour // here and put an endchar to make the validator happy. output = [14]; } program.charstrings.push({ glyphName: glyph, charstring: output, width: charString.width, lsb: charString.lsb, seac: charString.seac }); } return program; }, extractFontHeader: function Type1Parser_extractFontHeader(properties) { var token; while ((token = this.getToken()) !== null) { if (token !== '/') { continue; } token = this.getToken(); switch (token) { case 'FontMatrix': var matrix = this.readNumberArray(); properties.fontMatrix = matrix; break; case 'Encoding': var encodingArg = this.getToken(); var encoding; if (!/^\d+$/.test(encodingArg)) { // encoding name is specified encoding = getEncoding(encodingArg); } else { encoding = []; var size = parseInt(encodingArg, 10) | 0; this.getToken(); // read in 'array' for (var j = 0; j < size; j++) { token = this.getToken(); // skipping till first dup or def (e.g. ignoring for statement) while (token !== 'dup' && token !== 'def') { token = this.getToken(); if (token === null) { return; // invalid header } } if (token === 'def') { break; // read all array data } var index = this.readInt(); this.getToken(); // read in '/' var glyph = this.getToken(); encoding[index] = glyph; this.getToken(); // read the in 'put' } } properties.builtInEncoding = encoding; break; case 'FontBBox': var fontBBox = this.readNumberArray(); // adjusting ascent/descent properties.ascent = fontBBox[3]; properties.descent = fontBBox[1]; properties.ascentScaled = true; break; } } } }; return Type1Parser; })(); exports.Type1Parser = Type1Parser; })); (function (root, factory) { { factory((root.pdfjsCoreFonts = {}), root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreStream, root.pdfjsCoreParser, root.pdfjsCoreGlyphList, root.pdfjsCoreCharsets, root.pdfjsCoreFontRenderer, root.pdfjsCoreEncodings, root.pdfjsCoreStandardFonts, root.pdfjsCoreUnicode, root.pdfjsCoreType1Parser, root.pdfjsCoreCFFParser); } }(this, function (exports, sharedUtil, corePrimitives, coreStream, coreParser, coreGlyphList, coreCharsets, coreFontRenderer, coreEncodings, coreStandardFonts, coreUnicode, coreType1Parser, coreCFFParser) { var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX; var FontType = sharedUtil.FontType; var Util = sharedUtil.Util; var assert = sharedUtil.assert; var bytesToString = sharedUtil.bytesToString; var error = sharedUtil.error; var info = sharedUtil.info; var isArray = sharedUtil.isArray; var isInt = sharedUtil.isInt; var isNum = sharedUtil.isNum; var readUint32 = sharedUtil.readUint32; var shadow = sharedUtil.shadow; var stringToBytes = sharedUtil.stringToBytes; var string32 = sharedUtil.string32; var warn = sharedUtil.warn; var MissingDataException = sharedUtil.MissingDataException; var Stream = coreStream.Stream; var Lexer = coreParser.Lexer; var getGlyphsUnicode = coreGlyphList.getGlyphsUnicode; var getDingbatsGlyphsUnicode = coreGlyphList.getDingbatsGlyphsUnicode; var ISOAdobeCharset = coreCharsets.ISOAdobeCharset; var ExpertCharset = coreCharsets.ExpertCharset; var ExpertSubsetCharset = coreCharsets.ExpertSubsetCharset; var FontRendererFactory = coreFontRenderer.FontRendererFactory; var WinAnsiEncoding = coreEncodings.WinAnsiEncoding; var StandardEncoding = coreEncodings.StandardEncoding; var MacRomanEncoding = coreEncodings.MacRomanEncoding; var SymbolSetEncoding = coreEncodings.SymbolSetEncoding; var ZapfDingbatsEncoding = coreEncodings.ZapfDingbatsEncoding; var ExpertEncoding = coreEncodings.ExpertEncoding; var getEncoding = coreEncodings.getEncoding; var getStdFontMap = coreStandardFonts.getStdFontMap; var getNonStdFontMap = coreStandardFonts.getNonStdFontMap; var getGlyphMapForStandardFonts = coreStandardFonts.getGlyphMapForStandardFonts; var getSupplementalGlyphMapForArialBlack = coreStandardFonts.getSupplementalGlyphMapForArialBlack; var getUnicodeRangeFor = coreUnicode.getUnicodeRangeFor; var mapSpecialUnicodeValues = coreUnicode.mapSpecialUnicodeValues; var getUnicodeForGlyph = coreUnicode.getUnicodeForGlyph; var Type1Parser = coreType1Parser.Type1Parser; var CFFStandardStrings = coreCFFParser.CFFStandardStrings; var CFFParser = coreCFFParser.CFFParser; var CFFCompiler = coreCFFParser.CFFCompiler; var CFF = coreCFFParser.CFF; var CFFHeader = coreCFFParser.CFFHeader; var CFFTopDict = coreCFFParser.CFFTopDict; var CFFPrivateDict = coreCFFParser.CFFPrivateDict; var CFFStrings = coreCFFParser.CFFStrings; var CFFIndex = coreCFFParser.CFFIndex; var CFFCharset = coreCFFParser.CFFCharset; // Unicode Private Use Area var PRIVATE_USE_OFFSET_START = 0xE000; var PRIVATE_USE_OFFSET_END = 0xF8FF; var SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = false; // PDF Glyph Space Units are one Thousandth of a TextSpace Unit // except for Type 3 fonts var PDF_GLYPH_SPACE_UNITS = 1000; // Accented charactars are not displayed properly on Windows, using this flag // to control analysis of seac charstrings. var SEAC_ANALYSIS_ENABLED = false; var FontFlags = { FixedPitch: 1, Serif: 2, Symbolic: 4, Script: 8, Nonsymbolic: 32, Italic: 64, AllCap: 65536, SmallCap: 131072, ForceBold: 262144 }; var MacStandardGlyphOrdering = [ '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis', 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar', 'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply', 'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter', 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla', 'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat']; function adjustWidths(properties) { if (!properties.fontMatrix) { return; } if (properties.fontMatrix[0] === FONT_IDENTITY_MATRIX[0]) { return; } // adjusting width to fontMatrix scale var scale = 0.001 / properties.fontMatrix[0]; var glyphsWidths = properties.widths; for (var glyph in glyphsWidths) { glyphsWidths[glyph] *= scale; } properties.defaultWidth *= scale; } function getFontType(type, subtype) { switch (type) { case 'Type1': return subtype === 'Type1C' ? FontType.TYPE1C : FontType.TYPE1; case 'CIDFontType0': return subtype === 'CIDFontType0C' ? FontType.CIDFONTTYPE0C : FontType.CIDFONTTYPE0; case 'OpenType': return FontType.OPENTYPE; case 'TrueType': return FontType.TRUETYPE; case 'CIDFontType2': return FontType.CIDFONTTYPE2; case 'MMType1': return FontType.MMTYPE1; case 'Type0': return FontType.TYPE0; default: return FontType.UNKNOWN; } } var Glyph = (function GlyphClosure() { function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) { this.fontChar = fontChar; this.unicode = unicode; this.accent = accent; this.width = width; this.vmetric = vmetric; this.operatorListId = operatorListId; this.isSpace = isSpace; this.isInFont = isInFont; } Glyph.prototype.matchesForCache = function(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) { return this.fontChar === fontChar && this.unicode === unicode && this.accent === accent && this.width === width && this.vmetric === vmetric && this.operatorListId === operatorListId && this.isSpace === isSpace && this.isInFont === isInFont; }; return Glyph; })(); var ToUnicodeMap = (function ToUnicodeMapClosure() { function ToUnicodeMap(cmap) { // The elements of this._map can be integers or strings, depending on how // |cmap| was created. this._map = cmap; } ToUnicodeMap.prototype = { get length() { return this._map.length; }, forEach: function(callback) { for (var charCode in this._map) { callback(charCode, this._map[charCode].charCodeAt(0)); } }, has: function(i) { return this._map[i] !== undefined; }, get: function(i) { return this._map[i]; }, charCodeOf: function(v) { return this._map.indexOf(v); } }; return ToUnicodeMap; })(); var IdentityToUnicodeMap = (function IdentityToUnicodeMapClosure() { function IdentityToUnicodeMap(firstChar, lastChar) { this.firstChar = firstChar; this.lastChar = lastChar; } IdentityToUnicodeMap.prototype = { get length() { return (this.lastChar + 1) - this.firstChar; }, forEach: function (callback) { for (var i = this.firstChar, ii = this.lastChar; i <= ii; i++) { callback(i, i); } }, has: function (i) { return this.firstChar <= i && i <= this.lastChar; }, get: function (i) { if (this.firstChar <= i && i <= this.lastChar) { return String.fromCharCode(i); } return undefined; }, charCodeOf: function (v) { return (isInt(v) && v >= this.firstChar && v <= this.lastChar) ? v : -1; } }; return IdentityToUnicodeMap; })(); var OpenTypeFileBuilder = (function OpenTypeFileBuilderClosure() { function writeInt16(dest, offset, num) { dest[offset] = (num >> 8) & 0xFF; dest[offset + 1] = num & 0xFF; } function writeInt32(dest, offset, num) { dest[offset] = (num >> 24) & 0xFF; dest[offset + 1] = (num >> 16) & 0xFF; dest[offset + 2] = (num >> 8) & 0xFF; dest[offset + 3] = num & 0xFF; } function writeData(dest, offset, data) { var i, ii; if (data instanceof Uint8Array) { dest.set(data, offset); } else if (typeof data === 'string') { for (i = 0, ii = data.length; i < ii; i++) { dest[offset++] = data.charCodeAt(i) & 0xFF; } } else { // treating everything else as array for (i = 0, ii = data.length; i < ii; i++) { dest[offset++] = data[i] & 0xFF; } } } function OpenTypeFileBuilder(sfnt) { this.sfnt = sfnt; this.tables = Object.create(null); } OpenTypeFileBuilder.getSearchParams = function OpenTypeFileBuilder_getSearchParams(entriesCount, entrySize) { var maxPower2 = 1, log2 = 0; while ((maxPower2 ^ entriesCount) > maxPower2) { maxPower2 <<= 1; log2++; } var searchRange = maxPower2 * entrySize; return { range: searchRange, entry: log2, rangeShift: entrySize * entriesCount - searchRange }; }; var OTF_HEADER_SIZE = 12; var OTF_TABLE_ENTRY_SIZE = 16; OpenTypeFileBuilder.prototype = { toArray: function OpenTypeFileBuilder_toArray() { var sfnt = this.sfnt; // Tables needs to be written by ascendant alphabetic order var tables = this.tables; var tablesNames = Object.keys(tables); tablesNames.sort(); var numTables = tablesNames.length; var i, j, jj, table, tableName; // layout the tables data var offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE; var tableOffsets = [offset]; for (i = 0; i < numTables; i++) { table = tables[tablesNames[i]]; var paddedLength = ((table.length + 3) & ~3) >>> 0; offset += paddedLength; tableOffsets.push(offset); } var file = new Uint8Array(offset); // write the table data first (mostly for checksum) for (i = 0; i < numTables; i++) { table = tables[tablesNames[i]]; writeData(file, tableOffsets[i], table); } // sfnt version (4 bytes) if (sfnt === 'true') { // Windows hates the Mac TrueType sfnt version number sfnt = string32(0x00010000); } file[0] = sfnt.charCodeAt(0) & 0xFF; file[1] = sfnt.charCodeAt(1) & 0xFF; file[2] = sfnt.charCodeAt(2) & 0xFF; file[3] = sfnt.charCodeAt(3) & 0xFF; // numTables (2 bytes) writeInt16(file, 4, numTables); var searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16); // searchRange (2 bytes) writeInt16(file, 6, searchParams.range); // entrySelector (2 bytes) writeInt16(file, 8, searchParams.entry); // rangeShift (2 bytes) writeInt16(file, 10, searchParams.rangeShift); offset = OTF_HEADER_SIZE; // writing table entries for (i = 0; i < numTables; i++) { tableName = tablesNames[i]; file[offset] = tableName.charCodeAt(0) & 0xFF; file[offset + 1] = tableName.charCodeAt(1) & 0xFF; file[offset + 2] = tableName.charCodeAt(2) & 0xFF; file[offset + 3] = tableName.charCodeAt(3) & 0xFF; // checksum var checksum = 0; for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) { var quad = readUint32(file, j); checksum = (checksum + quad) >>> 0; } writeInt32(file, offset + 4, checksum); // offset writeInt32(file, offset + 8, tableOffsets[i]); // length writeInt32(file, offset + 12, tables[tableName].length); offset += OTF_TABLE_ENTRY_SIZE; } return file; }, addTable: function OpenTypeFileBuilder_addTable(tag, data) { if (tag in this.tables) { throw new Error('Table ' + tag + ' already exists'); } this.tables[tag] = data; } }; return OpenTypeFileBuilder; })(); // Problematic Unicode characters in the fonts that needs to be moved to avoid // issues when they are painted on the canvas, e.g. complex-script shaping or // control/whitespace characters. The ranges are listed in pairs: the first item // is a code of the first problematic code, the second one is the next // non-problematic code. The ranges must be in sorted order. var ProblematicCharRanges = new Int32Array([ // Control characters. 0x0000, 0x0020, 0x007F, 0x00A1, 0x00AD, 0x00AE, // Chars that is used in complex-script shaping. 0x0600, 0x0780, 0x08A0, 0x10A0, 0x1780, 0x1800, // General punctuation chars. 0x2000, 0x2010, 0x2011, 0x2012, 0x2028, 0x2030, 0x205F, 0x2070, 0x25CC, 0x25CD, // Chars that is used in complex-script shaping. 0xAA60, 0xAA80, // Specials Unicode block. 0xFFF0, 0x10000 ]); /** * 'Font' is the class the outside world should use, it encapsulate all the font * decoding logics whatever type it is (assuming the font type is supported). * * For example to read a Type1 font and to attach it to the document: * var type1Font = new Font("MyFontName", binaryFile, propertiesObject); * type1Font.bind(); */ var Font = (function FontClosure() { function Font(name, file, properties) { var charCode, glyphName, unicode; this.name = name; this.loadedName = properties.loadedName; this.isType3Font = properties.isType3Font; this.sizes = []; this.missingFile = false; this.glyphCache = Object.create(null); var names = name.split('+'); names = names.length > 1 ? names[1] : names[0]; names = names.split(/[-,_]/g)[0]; this.isSerifFont = !!(properties.flags & FontFlags.Serif); this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); this.isMonospace = !!(properties.flags & FontFlags.FixedPitch); var type = properties.type; var subtype = properties.subtype; this.type = type; this.fallbackName = (this.isMonospace ? 'monospace' : (this.isSerifFont ? 'serif' : 'sans-serif')); this.differences = properties.differences; this.widths = properties.widths; this.defaultWidth = properties.defaultWidth; this.composite = properties.composite; this.wideChars = properties.wideChars; this.cMap = properties.cMap; this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS; this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS; this.fontMatrix = properties.fontMatrix; this.bbox = properties.bbox; this.toUnicode = properties.toUnicode; this.toFontChar = []; if (properties.type === 'Type3') { for (charCode = 0; charCode < 256; charCode++) { this.toFontChar[charCode] = (this.differences[charCode] || properties.defaultEncoding[charCode]); } this.fontType = FontType.TYPE3; return; } this.cidEncoding = properties.cidEncoding; this.vertical = properties.vertical; if (this.vertical) { this.vmetrics = properties.vmetrics; this.defaultVMetrics = properties.defaultVMetrics; } var glyphsUnicodeMap; if (!file || file.isEmpty) { if (file) { // Some bad PDF generators will include empty font files, // attempting to recover by assuming that no file exists. warn('Font file is empty in "' + name + '" (' + this.loadedName + ')'); } this.missingFile = true; // The file data is not specified. Trying to fix the font name // to be used with the canvas.font. var fontName = name.replace(/[,_]/g, '-'); var stdFontMap = getStdFontMap(), nonStdFontMap = getNonStdFontMap(); var isStandardFont = !!stdFontMap[fontName] || !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]); fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName; this.bold = (fontName.search(/bold/gi) !== -1); this.italic = ((fontName.search(/oblique/gi) !== -1) || (fontName.search(/italic/gi) !== -1)); // Use 'name' instead of 'fontName' here because the original // name ArialBlack for example will be replaced by Helvetica. this.black = (name.search(/Black/g) !== -1); // if at least one width is present, remeasure all chars when exists this.remeasure = Object.keys(this.widths).length > 0; if (isStandardFont && type === 'CIDFontType2' && properties.cidEncoding.indexOf('Identity-') === 0) { var GlyphMapForStandardFonts = getGlyphMapForStandardFonts(); // Standard fonts might be embedded as CID font without glyph mapping. // Building one based on GlyphMapForStandardFonts. var map = []; for (charCode in GlyphMapForStandardFonts) { map[+charCode] = GlyphMapForStandardFonts[charCode]; } if (/ArialBlack/i.test(name)) { var SupplementalGlyphMapForArialBlack = getSupplementalGlyphMapForArialBlack(); for (charCode in SupplementalGlyphMapForArialBlack) { map[+charCode] = SupplementalGlyphMapForArialBlack[charCode]; } } var isIdentityUnicode = this.toUnicode instanceof IdentityToUnicodeMap; if (!isIdentityUnicode) { this.toUnicode.forEach(function(charCode, unicodeCharCode) { map[+charCode] = unicodeCharCode; }); } this.toFontChar = map; this.toUnicode = new ToUnicodeMap(map); } else if (/Symbol/i.test(fontName)) { this.toFontChar = buildToFontChar(SymbolSetEncoding, getGlyphsUnicode(), properties.differences); } else if (/Dingbats/i.test(fontName)) { if (/Wingdings/i.test(name)) { warn('Non-embedded Wingdings font, falling back to ZapfDingbats.'); } this.toFontChar = buildToFontChar(ZapfDingbatsEncoding, getDingbatsGlyphsUnicode(), properties.differences); } else if (isStandardFont) { this.toFontChar = buildToFontChar(properties.defaultEncoding, getGlyphsUnicode(), properties.differences); } else { glyphsUnicodeMap = getGlyphsUnicode(); this.toUnicode.forEach(function(charCode, unicodeCharCode) { if (!this.composite) { glyphName = (properties.differences[charCode] || properties.defaultEncoding[charCode]); unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); if (unicode !== -1) { unicodeCharCode = unicode; } } this.toFontChar[charCode] = unicodeCharCode; }.bind(this)); } this.loadedName = fontName.split('-')[0]; this.loading = false; this.fontType = getFontType(type, subtype); return; } // Some fonts might use wrong font types for Type1C or CIDFontType0C if (subtype === 'Type1C' && (type !== 'Type1' && type !== 'MMType1')) { // Some TrueType fonts by mistake claim Type1C if (isTrueTypeFile(file)) { subtype = 'TrueType'; } else { type = 'Type1'; } } if (subtype === 'CIDFontType0C' && type !== 'CIDFontType0') { type = 'CIDFontType0'; } if (subtype === 'OpenType') { type = 'OpenType'; } // Some CIDFontType0C fonts by mistake claim CIDFontType0. if (type === 'CIDFontType0') { if (isType1File(file)) { subtype = 'CIDFontType0'; } else if (isOpenTypeFile(file)) { // Sometimes the type/subtype can be a complete lie (see issue6782.pdf). type = subtype = 'OpenType'; } else { subtype = 'CIDFontType0C'; } } var data; switch (type) { case 'MMType1': info('MMType1 font (' + name + '), falling back to Type1.'); /* falls through */ case 'Type1': case 'CIDFontType0': this.mimetype = 'font/opentype'; var cff = (subtype === 'Type1C' || subtype === 'CIDFontType0C') ? new CFFFont(file, properties) : new Type1Font(name, file, properties); adjustWidths(properties); // Wrap the CFF data inside an OTF font file data = this.convert(name, cff, properties); break; case 'OpenType': case 'TrueType': case 'CIDFontType2': this.mimetype = 'font/opentype'; // Repair the TrueType file. It is can be damaged in the point of // view of the sanitizer data = this.checkAndRepair(name, file, properties); if (this.isOpenType) { adjustWidths(properties); type = 'OpenType'; } break; default: error('Font ' + type + ' is not supported'); break; } this.data = data; this.fontType = getFontType(type, subtype); // Transfer some properties again that could change during font conversion this.fontMatrix = properties.fontMatrix; this.widths = properties.widths; this.defaultWidth = properties.defaultWidth; this.encoding = properties.baseEncoding; this.seacMap = properties.seacMap; this.loading = true; } Font.getFontID = (function () { var ID = 1; return function Font_getFontID() { return String(ID++); }; })(); function int16(b0, b1) { return (b0 << 8) + b1; } function signedInt16(b0, b1) { var value = (b0 << 8) + b1; return value & (1 << 15) ? value - 0x10000 : value; } function int32(b0, b1, b2, b3) { return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; } function string16(value) { return String.fromCharCode((value >> 8) & 0xff, value & 0xff); } function safeString16(value) { // clamp value to the 16-bit int range value = (value > 0x7FFF ? 0x7FFF : (value < -0x8000 ? -0x8000 : value)); return String.fromCharCode((value >> 8) & 0xff, value & 0xff); } function isTrueTypeFile(file) { var header = file.peekBytes(4); return readUint32(header, 0) === 0x00010000; } function isOpenTypeFile(file) { var header = file.peekBytes(4); return bytesToString(header) === 'OTTO'; } function isType1File(file) { var header = file.peekBytes(2); // All Type1 font programs must begin with the comment '%!' (0x25 + 0x21). if (header[0] === 0x25 && header[1] === 0x21) { return true; } // ... obviously some fonts violate that part of the specification, // please refer to the comment in |Type1Font| below. if (header[0] === 0x80 && header[1] === 0x01) { // pfb file header. return true; } return false; } function buildToFontChar(encoding, glyphsUnicodeMap, differences) { var toFontChar = [], unicode; for (var i = 0, ii = encoding.length; i < ii; i++) { unicode = getUnicodeForGlyph(encoding[i], glyphsUnicodeMap); if (unicode !== -1) { toFontChar[i] = unicode; } } for (var charCode in differences) { unicode = getUnicodeForGlyph(differences[charCode], glyphsUnicodeMap); if (unicode !== -1) { toFontChar[+charCode] = unicode; } } return toFontChar; } /** * Helper function for |adjustMapping|. * @return {boolean} */ function isProblematicUnicodeLocation(code) { // Using binary search to find a range start. var i = 0, j = ProblematicCharRanges.length - 1; while (i < j) { var c = (i + j + 1) >> 1; if (code < ProblematicCharRanges[c]) { j = c - 1; } else { i = c; } } // Even index means code in problematic range. return !(i & 1); } /** * Rebuilds the char code to glyph ID map by trying to replace the char codes * with their unicode value. It also moves char codes that are in known * problematic locations. * @return {Object} Two properties: * 'toFontChar' - maps original char codes(the value that will be read * from commands such as show text) to the char codes that will be used in the * font that we build * 'charCodeToGlyphId' - maps the new font char codes to glyph ids */ function adjustMapping(charCodeToGlyphId, properties) { var toUnicode = properties.toUnicode; var isSymbolic = !!(properties.flags & FontFlags.Symbolic); var isIdentityUnicode = properties.toUnicode instanceof IdentityToUnicodeMap; var newMap = Object.create(null); var toFontChar = []; var usedFontCharCodes = []; var nextAvailableFontCharCode = PRIVATE_USE_OFFSET_START; for (var originalCharCode in charCodeToGlyphId) { originalCharCode |= 0; var glyphId = charCodeToGlyphId[originalCharCode]; var fontCharCode = originalCharCode; // First try to map the value to a unicode position if a non identity map // was created. if (!isIdentityUnicode && toUnicode.has(originalCharCode)) { var unicode = toUnicode.get(fontCharCode); // TODO: Try to map ligatures to the correct spot. if (unicode.length === 1) { fontCharCode = unicode.charCodeAt(0); } } // Try to move control characters, special characters and already mapped // characters to the private use area since they will not be drawn by // canvas if left in their current position. Also, move characters if the // font was symbolic and there is only an identity unicode map since the // characters probably aren't in the correct position (fixes an issue // with firefox and thuluthfont). if ((usedFontCharCodes[fontCharCode] !== undefined || isProblematicUnicodeLocation(fontCharCode) || (isSymbolic && isIdentityUnicode)) && nextAvailableFontCharCode <= PRIVATE_USE_OFFSET_END) { // Room left. // Loop to try and find a free spot in the private use area. do { fontCharCode = nextAvailableFontCharCode++; if (SKIP_PRIVATE_USE_RANGE_F000_TO_F01F && fontCharCode === 0xF000) { fontCharCode = 0xF020; nextAvailableFontCharCode = fontCharCode + 1; } } while (usedFontCharCodes[fontCharCode] !== undefined && nextAvailableFontCharCode <= PRIVATE_USE_OFFSET_END); } newMap[fontCharCode] = glyphId; toFontChar[originalCharCode] = fontCharCode; usedFontCharCodes[fontCharCode] = true; } return { toFontChar: toFontChar, charCodeToGlyphId: newMap, nextAvailableFontCharCode: nextAvailableFontCharCode }; } function getRanges(glyphs, numGlyphs) { // Array.sort() sorts by characters, not numerically, so convert to an // array of characters. var codes = []; for (var charCode in glyphs) { // Remove an invalid glyph ID mappings to make OTS happy. if (glyphs[charCode] >= numGlyphs) { continue; } codes.push({ fontCharCode: charCode | 0, glyphId: glyphs[charCode] }); } codes.sort(function fontGetRangesSort(a, b) { return a.fontCharCode - b.fontCharCode; }); // Split the sorted codes into ranges. var ranges = []; var length = codes.length; for (var n = 0; n < length; ) { var start = codes[n].fontCharCode; var codeIndices = [codes[n].glyphId]; ++n; var end = start; while (n < length && end + 1 === codes[n].fontCharCode) { codeIndices.push(codes[n].glyphId); ++end; ++n; if (end === 0xFFFF) { break; } } ranges.push([start, end, codeIndices]); } return ranges; } function createCmapTable(glyphs, numGlyphs) { var ranges = getRanges(glyphs, numGlyphs); var numTables = ranges[ranges.length - 1][1] > 0xFFFF ? 2 : 1; var cmap = '\x00\x00' + // version string16(numTables) + // numTables '\x00\x03' + // platformID '\x00\x01' + // encodingID string32(4 + numTables * 8); // start of the table record var i, ii, j, jj; for (i = ranges.length - 1; i >= 0; --i) { if (ranges[i][0] <= 0xFFFF) { break; } } var bmpLength = i + 1; if (ranges[i][0] < 0xFFFF && ranges[i][1] === 0xFFFF) { ranges[i][1] = 0xFFFE; } var trailingRangesCount = ranges[i][1] < 0xFFFF ? 1 : 0; var segCount = bmpLength + trailingRangesCount; var searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2); // Fill up the 4 parallel arrays describing the segments. var startCount = ''; var endCount = ''; var idDeltas = ''; var idRangeOffsets = ''; var glyphsIds = ''; var bias = 0; var range, start, end, codes; for (i = 0, ii = bmpLength; i < ii; i++) { range = ranges[i]; start = range[0]; end = range[1]; startCount += string16(start); endCount += string16(end); codes = range[2]; var contiguous = true; for (j = 1, jj = codes.length; j < jj; ++j) { if (codes[j] !== codes[j - 1] + 1) { contiguous = false; break; } } if (!contiguous) { var offset = (segCount - i) * 2 + bias * 2; bias += (end - start + 1); idDeltas += string16(0); idRangeOffsets += string16(offset); for (j = 0, jj = codes.length; j < jj; ++j) { glyphsIds += string16(codes[j]); } } else { var startCode = codes[0]; idDeltas += string16((startCode - start) & 0xFFFF); idRangeOffsets += string16(0); } } if (trailingRangesCount > 0) { endCount += '\xFF\xFF'; startCount += '\xFF\xFF'; idDeltas += '\x00\x01'; idRangeOffsets += '\x00\x00'; } var format314 = '\x00\x00' + // language string16(2 * segCount) + string16(searchParams.range) + string16(searchParams.entry) + string16(searchParams.rangeShift) + endCount + '\x00\x00' + startCount + idDeltas + idRangeOffsets + glyphsIds; var format31012 = ''; var header31012 = ''; if (numTables > 1) { cmap += '\x00\x03' + // platformID '\x00\x0A' + // encodingID string32(4 + numTables * 8 + 4 + format314.length); // start of the table record format31012 = ''; for (i = 0, ii = ranges.length; i < ii; i++) { range = ranges[i]; start = range[0]; codes = range[2]; var code = codes[0]; for (j = 1, jj = codes.length; j < jj; ++j) { if (codes[j] !== codes[j - 1] + 1) { end = range[0] + j - 1; format31012 += string32(start) + // startCharCode string32(end) + // endCharCode string32(code); // startGlyphID start = end + 1; code = codes[j]; } } format31012 += string32(start) + // startCharCode string32(range[1]) + // endCharCode string32(code); // startGlyphID } header31012 = '\x00\x0C' + // format '\x00\x00' + // reserved string32(format31012.length + 16) + // length '\x00\x00\x00\x00' + // language string32(format31012.length / 12); // nGroups } return cmap + '\x00\x04' + // format string16(format314.length + 4) + // length format314 + header31012 + format31012; } function validateOS2Table(os2) { var stream = new Stream(os2.data); var version = stream.getUint16(); // TODO verify all OS/2 tables fields, but currently we validate only those // that give us issues stream.getBytes(60); // skipping type, misc sizes, panose, unicode ranges var selection = stream.getUint16(); if (version < 4 && (selection & 0x0300)) { return false; } var firstChar = stream.getUint16(); var lastChar = stream.getUint16(); if (firstChar > lastChar) { return false; } stream.getBytes(6); // skipping sTypoAscender/Descender/LineGap var usWinAscent = stream.getUint16(); if (usWinAscent === 0) { // makes font unreadable by windows return false; } // OS/2 appears to be valid, resetting some fields os2.data[8] = os2.data[9] = 0; // IE rejects fonts if fsType != 0 return true; } function createOS2Table(properties, charstrings, override) { override = override || { unitsPerEm: 0, yMax: 0, yMin: 0, ascent: 0, descent: 0 }; var ulUnicodeRange1 = 0; var ulUnicodeRange2 = 0; var ulUnicodeRange3 = 0; var ulUnicodeRange4 = 0; var firstCharIndex = null; var lastCharIndex = 0; if (charstrings) { for (var code in charstrings) { code |= 0; if (firstCharIndex > code || !firstCharIndex) { firstCharIndex = code; } if (lastCharIndex < code) { lastCharIndex = code; } var position = getUnicodeRangeFor(code); if (position < 32) { ulUnicodeRange1 |= 1 << position; } else if (position < 64) { ulUnicodeRange2 |= 1 << position - 32; } else if (position < 96) { ulUnicodeRange3 |= 1 << position - 64; } else if (position < 123) { ulUnicodeRange4 |= 1 << position - 96; } else { error('Unicode ranges Bits > 123 are reserved for internal usage'); } } } else { // TODO firstCharIndex = 0; lastCharIndex = 255; } var bbox = properties.bbox || [0, 0, 0, 0]; var unitsPerEm = (override.unitsPerEm || 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]); // if the font units differ to the PDF glyph space units // then scale up the values var scale = (properties.ascentScaled ? 1.0 : unitsPerEm / PDF_GLYPH_SPACE_UNITS); var typoAscent = (override.ascent || Math.round(scale * (properties.ascent || bbox[3]))); var typoDescent = (override.descent || Math.round(scale * (properties.descent || bbox[1]))); if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) { typoDescent = -typoDescent; // fixing incorrect descent } var winAscent = override.yMax || typoAscent; var winDescent = -override.yMin || -typoDescent; return '\x00\x03' + // version '\x02\x24' + // xAvgCharWidth '\x01\xF4' + // usWeightClass '\x00\x05' + // usWidthClass '\x00\x00' + // fstype (0 to let the font loads via font-face on IE) '\x02\x8A' + // ySubscriptXSize '\x02\xBB' + // ySubscriptYSize '\x00\x00' + // ySubscriptXOffset '\x00\x8C' + // ySubscriptYOffset '\x02\x8A' + // ySuperScriptXSize '\x02\xBB' + // ySuperScriptYSize '\x00\x00' + // ySuperScriptXOffset '\x01\xDF' + // ySuperScriptYOffset '\x00\x31' + // yStrikeOutSize '\x01\x02' + // yStrikeOutPosition '\x00\x00' + // sFamilyClass '\x00\x00\x06' + String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) + '\x00\x00\x00\x00\x00\x00' + // Panose string32(ulUnicodeRange1) + // ulUnicodeRange1 (Bits 0-31) string32(ulUnicodeRange2) + // ulUnicodeRange2 (Bits 32-63) string32(ulUnicodeRange3) + // ulUnicodeRange3 (Bits 64-95) string32(ulUnicodeRange4) + // ulUnicodeRange4 (Bits 96-127) '\x2A\x32\x31\x2A' + // achVendID string16(properties.italicAngle ? 1 : 0) + // fsSelection string16(firstCharIndex || properties.firstChar) + // usFirstCharIndex string16(lastCharIndex || properties.lastChar) + // usLastCharIndex string16(typoAscent) + // sTypoAscender string16(typoDescent) + // sTypoDescender '\x00\x64' + // sTypoLineGap (7%-10% of the unitsPerEM value) string16(winAscent) + // usWinAscent string16(winDescent) + // usWinDescent '\x00\x00\x00\x00' + // ulCodePageRange1 (Bits 0-31) '\x00\x00\x00\x00' + // ulCodePageRange2 (Bits 32-63) string16(properties.xHeight) + // sxHeight string16(properties.capHeight) + // sCapHeight string16(0) + // usDefaultChar string16(firstCharIndex || properties.firstChar) + // usBreakChar '\x00\x03'; // usMaxContext } function createPostTable(properties) { var angle = Math.floor(properties.italicAngle * (Math.pow(2, 16))); return ('\x00\x03\x00\x00' + // Version number string32(angle) + // italicAngle '\x00\x00' + // underlinePosition '\x00\x00' + // underlineThickness string32(properties.fixedPitch) + // isFixedPitch '\x00\x00\x00\x00' + // minMemType42 '\x00\x00\x00\x00' + // maxMemType42 '\x00\x00\x00\x00' + // minMemType1 '\x00\x00\x00\x00'); // maxMemType1 } function createNameTable(name, proto) { if (!proto) { proto = [[], []]; // no strings and unicode strings } var strings = [ proto[0][0] || 'Original licence', // 0.Copyright proto[0][1] || name, // 1.Font family proto[0][2] || 'Unknown', // 2.Font subfamily (font weight) proto[0][3] || 'uniqueID', // 3.Unique ID proto[0][4] || name, // 4.Full font name proto[0][5] || 'Version 0.11', // 5.Version proto[0][6] || '', // 6.Postscript name proto[0][7] || 'Unknown', // 7.Trademark proto[0][8] || 'Unknown', // 8.Manufacturer proto[0][9] || 'Unknown' // 9.Designer ]; // Mac want 1-byte per character strings while Windows want // 2-bytes per character, so duplicate the names table var stringsUnicode = []; var i, ii, j, jj, str; for (i = 0, ii = strings.length; i < ii; i++) { str = proto[1][i] || strings[i]; var strBufUnicode = []; for (j = 0, jj = str.length; j < jj; j++) { strBufUnicode.push(string16(str.charCodeAt(j))); } stringsUnicode.push(strBufUnicode.join('')); } var names = [strings, stringsUnicode]; var platforms = ['\x00\x01', '\x00\x03']; var encodings = ['\x00\x00', '\x00\x01']; var languages = ['\x00\x00', '\x04\x09']; var namesRecordCount = strings.length * platforms.length; var nameTable = '\x00\x00' + // format string16(namesRecordCount) + // Number of names Record string16(namesRecordCount * 12 + 6); // Storage // Build the name records field var strOffset = 0; for (i = 0, ii = platforms.length; i < ii; i++) { var strs = names[i]; for (j = 0, jj = strs.length; j < jj; j++) { str = strs[j]; var nameRecord = platforms[i] + // platform ID encodings[i] + // encoding ID languages[i] + // language ID string16(j) + // name ID string16(str.length) + string16(strOffset); nameTable += nameRecord; strOffset += str.length; } } nameTable += strings.join('') + stringsUnicode.join(''); return nameTable; } Font.prototype = { name: null, font: null, mimetype: null, encoding: null, get renderer() { var renderer = FontRendererFactory.create(this, SEAC_ANALYSIS_ENABLED); return shadow(this, 'renderer', renderer); }, exportData: function Font_exportData() { // TODO remove enumerating of the properties, e.g. hardcode exact names. var data = {}; for (var i in this) { if (this.hasOwnProperty(i)) { data[i] = this[i]; } } return data; }, checkAndRepair: function Font_checkAndRepair(name, font, properties) { function readTableEntry(file) { var tag = bytesToString(file.getBytes(4)); var checksum = file.getInt32() >>> 0; var offset = file.getInt32() >>> 0; var length = file.getInt32() >>> 0; // Read the table associated data var previousPosition = file.pos; file.pos = file.start ? file.start : 0; file.skip(offset); var data = file.getBytes(length); file.pos = previousPosition; if (tag === 'head') { // clearing checksum adjustment data[8] = data[9] = data[10] = data[11] = 0; data[17] |= 0x20; //Set font optimized for cleartype flag } return { tag: tag, checksum: checksum, length: length, offset: offset, data: data }; } function readOpenTypeHeader(ttf) { return { version: bytesToString(ttf.getBytes(4)), numTables: ttf.getUint16(), searchRange: ttf.getUint16(), entrySelector: ttf.getUint16(), rangeShift: ttf.getUint16() }; } /** * Read the appropriate subtable from the cmap according to 9.6.6.4 from * PDF spec */ function readCmapTable(cmap, font, isSymbolicFont, hasEncoding) { if (!cmap) { warn('No cmap table available.'); return { platformId: -1, encodingId: -1, mappings: [], hasShortCmap: false }; } var segment; var start = (font.start ? font.start : 0) + cmap.offset; font.pos = start; var version = font.getUint16(); var numTables = font.getUint16(); var potentialTable; var canBreak = false; // There's an order of preference in terms of which cmap subtable to // use: // - non-symbolic fonts the preference is a 3,1 table then a 1,0 table // - symbolic fonts the preference is a 3,0 table then a 1,0 table // The following takes advantage of the fact that the tables are sorted // to work. for (var i = 0; i < numTables; i++) { var platformId = font.getUint16(); var encodingId = font.getUint16(); var offset = font.getInt32() >>> 0; var useTable = false; if (platformId === 0 && encodingId === 0) { useTable = true; // Continue the loop since there still may be a higher priority // table. } else if (platformId === 1 && encodingId === 0) { useTable = true; // Continue the loop since there still may be a higher priority // table. } else if (platformId === 3 && encodingId === 1 && ((!isSymbolicFont && hasEncoding) || !potentialTable)) { useTable = true; if (!isSymbolicFont) { canBreak = true; } } else if (isSymbolicFont && platformId === 3 && encodingId === 0) { useTable = true; canBreak = true; } if (useTable) { potentialTable = { platformId: platformId, encodingId: encodingId, offset: offset }; } if (canBreak) { break; } } if (potentialTable) { font.pos = start + potentialTable.offset; } if (!potentialTable || font.peekByte() === -1) { warn('Could not find a preferred cmap table.'); return { platformId: -1, encodingId: -1, mappings: [], hasShortCmap: false }; } var format = font.getUint16(); var length = font.getUint16(); var language = font.getUint16(); var hasShortCmap = false; var mappings = []; var j, glyphId; // TODO(mack): refactor this cmap subtable reading logic out if (format === 0) { for (j = 0; j < 256; j++) { var index = font.getByte(); if (!index) { continue; } mappings.push({ charCode: j, glyphId: index }); } hasShortCmap = true; } else if (format === 4) { // re-creating the table in format 4 since the encoding // might be changed var segCount = (font.getUint16() >> 1); font.getBytes(6); // skipping range fields var segIndex, segments = []; for (segIndex = 0; segIndex < segCount; segIndex++) { segments.push({ end: font.getUint16() }); } font.getUint16(); for (segIndex = 0; segIndex < segCount; segIndex++) { segments[segIndex].start = font.getUint16(); } for (segIndex = 0; segIndex < segCount; segIndex++) { segments[segIndex].delta = font.getUint16(); } var offsetsCount = 0; for (segIndex = 0; segIndex < segCount; segIndex++) { segment = segments[segIndex]; var rangeOffset = font.getUint16(); if (!rangeOffset) { segment.offsetIndex = -1; continue; } var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex); segment.offsetIndex = offsetIndex; offsetsCount = Math.max(offsetsCount, offsetIndex + segment.end - segment.start + 1); } var offsets = []; for (j = 0; j < offsetsCount; j++) { offsets.push(font.getUint16()); } for (segIndex = 0; segIndex < segCount; segIndex++) { segment = segments[segIndex]; start = segment.start; var end = segment.end; var delta = segment.delta; offsetIndex = segment.offsetIndex; for (j = start; j <= end; j++) { if (j === 0xFFFF) { continue; } glyphId = (offsetIndex < 0 ? j : offsets[offsetIndex + j - start]); glyphId = (glyphId + delta) & 0xFFFF; if (glyphId === 0) { continue; } mappings.push({ charCode: j, glyphId: glyphId }); } } } else if (format === 6) { // Format 6 is a 2-bytes dense mapping, which means the font data // lives glue together even if they are pretty far in the unicode // table. (This looks weird, so I can have missed something), this // works on Linux but seems to fails on Mac so let's rewrite the // cmap table to a 3-1-4 style var firstCode = font.getUint16(); var entryCount = font.getUint16(); for (j = 0; j < entryCount; j++) { glyphId = font.getUint16(); var charCode = firstCode + j; mappings.push({ charCode: charCode, glyphId: glyphId }); } } else { warn('cmap table has unsupported format: ' + format); return { platformId: -1, encodingId: -1, mappings: [], hasShortCmap: false }; } // removing duplicate entries mappings.sort(function (a, b) { return a.charCode - b.charCode; }); for (i = 1; i < mappings.length; i++) { if (mappings[i - 1].charCode === mappings[i].charCode) { mappings.splice(i, 1); i--; } } return { platformId: potentialTable.platformId, encodingId: potentialTable.encodingId, mappings: mappings, hasShortCmap: hasShortCmap }; } function sanitizeMetrics(font, header, metrics, numGlyphs) { if (!header) { if (metrics) { metrics.data = null; } return; } font.pos = (font.start ? font.start : 0) + header.offset; font.pos += header.length - 2; var numOfMetrics = font.getUint16(); if (numOfMetrics > numGlyphs) { info('The numOfMetrics (' + numOfMetrics + ') should not be ' + 'greater than the numGlyphs (' + numGlyphs + ')'); // Reduce numOfMetrics if it is greater than numGlyphs numOfMetrics = numGlyphs; header.data[34] = (numOfMetrics & 0xff00) >> 8; header.data[35] = numOfMetrics & 0x00ff; } var numOfSidebearings = numGlyphs - numOfMetrics; var numMissing = numOfSidebearings - ((metrics.length - numOfMetrics * 4) >> 1); if (numMissing > 0) { // For each missing glyph, we set both the width and lsb to 0 (zero). // Since we need to add two properties for each glyph, this explains // the use of |numMissing * 2| when initializing the typed array. var entries = new Uint8Array(metrics.length + numMissing * 2); entries.set(metrics.data); metrics.data = entries; } } function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, hintsValid) { if (sourceEnd - sourceStart <= 12) { // glyph with data less than 12 is invalid one return 0; } var glyf = source.subarray(sourceStart, sourceEnd); var contoursCount = (glyf[0] << 8) | glyf[1]; if (contoursCount & 0x8000) { // complex glyph, writing as is dest.set(glyf, destStart); return glyf.length; } var i, j = 10, flagsCount = 0; for (i = 0; i < contoursCount; i++) { var endPoint = (glyf[j] << 8) | glyf[j + 1]; flagsCount = endPoint + 1; j += 2; } // skipping instructions var instructionsStart = j; var instructionsLength = (glyf[j] << 8) | glyf[j + 1]; j += 2 + instructionsLength; var instructionsEnd = j; // validating flags var coordinatesLength = 0; for (i = 0; i < flagsCount; i++) { var flag = glyf[j++]; if (flag & 0xC0) { // reserved flags must be zero, cleaning up glyf[j - 1] = flag & 0x3F; } var xyLength = ((flag & 2) ? 1 : (flag & 16) ? 0 : 2) + ((flag & 4) ? 1 : (flag & 32) ? 0 : 2); coordinatesLength += xyLength; if (flag & 8) { var repeat = glyf[j++]; i += repeat; coordinatesLength += repeat * xyLength; } } // glyph without coordinates will be rejected if (coordinatesLength === 0) { return 0; } var glyphDataLength = j + coordinatesLength; if (glyphDataLength > glyf.length) { // not enough data for coordinates return 0; } if (!hintsValid && instructionsLength > 0) { dest.set(glyf.subarray(0, instructionsStart), destStart); dest.set([0, 0], destStart + instructionsStart); dest.set(glyf.subarray(instructionsEnd, glyphDataLength), destStart + instructionsStart + 2); glyphDataLength -= instructionsLength; if (glyf.length - glyphDataLength > 3) { glyphDataLength = (glyphDataLength + 3) & ~3; } return glyphDataLength; } if (glyf.length - glyphDataLength > 3) { // truncating and aligning to 4 bytes the long glyph data glyphDataLength = (glyphDataLength + 3) & ~3; dest.set(glyf.subarray(0, glyphDataLength), destStart); return glyphDataLength; } // glyph data is fine dest.set(glyf, destStart); return glyf.length; } function sanitizeHead(head, numGlyphs, locaLength) { var data = head.data; // Validate version: // Should always be 0x00010000 var version = int32(data[0], data[1], data[2], data[3]); if (version >> 16 !== 1) { info('Attempting to fix invalid version in head table: ' + version); data[0] = 0; data[1] = 1; data[2] = 0; data[3] = 0; } var indexToLocFormat = int16(data[50], data[51]); if (indexToLocFormat < 0 || indexToLocFormat > 1) { info('Attempting to fix invalid indexToLocFormat in head table: ' + indexToLocFormat); // The value of indexToLocFormat should be 0 if the loca table // consists of short offsets, and should be 1 if the loca table // consists of long offsets. // // The number of entries in the loca table should be numGlyphs + 1. // // Using this information, we can work backwards to deduce if the // size of each offset in the loca table, and thus figure out the // appropriate value for indexToLocFormat. var numGlyphsPlusOne = numGlyphs + 1; if (locaLength === numGlyphsPlusOne << 1) { // 0x0000 indicates the loca table consists of short offsets data[50] = 0; data[51] = 0; } else if (locaLength === numGlyphsPlusOne << 2) { // 0x0001 indicates the loca table consists of long offsets data[50] = 0; data[51] = 1; } else { warn('Could not fix indexToLocFormat: ' + indexToLocFormat); } } } function sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry) { var itemSize, itemDecode, itemEncode; if (isGlyphLocationsLong) { itemSize = 4; itemDecode = function fontItemDecodeLong(data, offset) { return (data[offset] << 24) | (data[offset + 1] << 16) | (data[offset + 2] << 8) | data[offset + 3]; }; itemEncode = function fontItemEncodeLong(data, offset, value) { data[offset] = (value >>> 24) & 0xFF; data[offset + 1] = (value >> 16) & 0xFF; data[offset + 2] = (value >> 8) & 0xFF; data[offset + 3] = value & 0xFF; }; } else { itemSize = 2; itemDecode = function fontItemDecode(data, offset) { return (data[offset] << 9) | (data[offset + 1] << 1); }; itemEncode = function fontItemEncode(data, offset, value) { data[offset] = (value >> 9) & 0xFF; data[offset + 1] = (value >> 1) & 0xFF; }; } var locaData = loca.data; var locaDataSize = itemSize * (1 + numGlyphs); // is loca.data too short or long? if (locaData.length !== locaDataSize) { locaData = new Uint8Array(locaDataSize); locaData.set(loca.data.subarray(0, locaDataSize)); loca.data = locaData; } // removing the invalid glyphs var oldGlyfData = glyf.data; var oldGlyfDataLength = oldGlyfData.length; var newGlyfData = new Uint8Array(oldGlyfDataLength); var startOffset = itemDecode(locaData, 0); var writeOffset = 0; var missingGlyphData = Object.create(null); itemEncode(locaData, 0, writeOffset); var i, j; for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { var endOffset = itemDecode(locaData, j); if (endOffset > oldGlyfDataLength && ((oldGlyfDataLength + 3) & ~3) === endOffset) { // Aspose breaks fonts by aligning the glyphs to the qword, but not // the glyf table size, which makes last glyph out of range. endOffset = oldGlyfDataLength; } if (endOffset > oldGlyfDataLength) { // glyph end offset points outside glyf data, rejecting the glyph itemEncode(locaData, j, writeOffset); startOffset = endOffset; continue; } if (startOffset === endOffset) { missingGlyphData[i] = true; } var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset, newGlyfData, writeOffset, hintsValid); writeOffset += newLength; itemEncode(locaData, j, writeOffset); startOffset = endOffset; } if (writeOffset === 0) { // glyf table cannot be empty -- redoing the glyf and loca tables // to have single glyph with one point var simpleGlyph = new Uint8Array( [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]); for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { itemEncode(locaData, j, simpleGlyph.length); } glyf.data = simpleGlyph; return missingGlyphData; } if (dupFirstEntry) { var firstEntryLength = itemDecode(locaData, itemSize); if (newGlyfData.length > firstEntryLength + writeOffset) { glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset); } else { glyf.data = new Uint8Array(firstEntryLength + writeOffset); glyf.data.set(newGlyfData.subarray(0, writeOffset)); } glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset); itemEncode(loca.data, locaData.length - itemSize, writeOffset + firstEntryLength); } else { glyf.data = newGlyfData.subarray(0, writeOffset); } return missingGlyphData; } function readPostScriptTable(post, properties, maxpNumGlyphs) { var start = (font.start ? font.start : 0) + post.offset; font.pos = start; var length = post.length, end = start + length; var version = font.getInt32(); // skip rest to the tables font.getBytes(28); var glyphNames; var valid = true; var i; switch (version) { case 0x00010000: glyphNames = MacStandardGlyphOrdering; break; case 0x00020000: var numGlyphs = font.getUint16(); if (numGlyphs !== maxpNumGlyphs) { valid = false; break; } var glyphNameIndexes = []; for (i = 0; i < numGlyphs; ++i) { var index = font.getUint16(); if (index >= 32768) { valid = false; break; } glyphNameIndexes.push(index); } if (!valid) { break; } var customNames = []; var strBuf = []; while (font.pos < end) { var stringLength = font.getByte(); strBuf.length = stringLength; for (i = 0; i < stringLength; ++i) { strBuf[i] = String.fromCharCode(font.getByte()); } customNames.push(strBuf.join('')); } glyphNames = []; for (i = 0; i < numGlyphs; ++i) { var j = glyphNameIndexes[i]; if (j < 258) { glyphNames.push(MacStandardGlyphOrdering[j]); continue; } glyphNames.push(customNames[j - 258]); } break; case 0x00030000: break; default: warn('Unknown/unsupported post table version ' + version); valid = false; if (properties.defaultEncoding) { glyphNames = properties.defaultEncoding; } break; } properties.glyphNames = glyphNames; return valid; } function readNameTable(nameTable) { var start = (font.start ? font.start : 0) + nameTable.offset; font.pos = start; var names = [[], []]; var length = nameTable.length, end = start + length; var format = font.getUint16(); var FORMAT_0_HEADER_LENGTH = 6; if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) { // unsupported name table format or table "too" small return names; } var numRecords = font.getUint16(); var stringsStart = font.getUint16(); var records = []; var NAME_RECORD_LENGTH = 12; var i, ii; for (i = 0; i < numRecords && font.pos + NAME_RECORD_LENGTH <= end; i++) { var r = { platform: font.getUint16(), encoding: font.getUint16(), language: font.getUint16(), name: font.getUint16(), length: font.getUint16(), offset: font.getUint16() }; // using only Macintosh and Windows platform/encoding names if ((r.platform === 1 && r.encoding === 0 && r.language === 0) || (r.platform === 3 && r.encoding === 1 && r.language === 0x409)) { records.push(r); } } for (i = 0, ii = records.length; i < ii; i++) { var record = records[i]; if (record.length <= 0) { continue; // Nothing to process, ignoring. } var pos = start + stringsStart + record.offset; if (pos + record.length > end) { continue; // outside of name table, ignoring } font.pos = pos; var nameIndex = record.name; if (record.encoding) { // unicode var str = ''; for (var j = 0, jj = record.length; j < jj; j += 2) { str += String.fromCharCode(font.getUint16()); } names[1][nameIndex] = str; } else { names[0][nameIndex] = bytesToString(font.getBytes(record.length)); } } return names; } var TTOpsStackDeltas = [ 0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, 1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1, 0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2, 0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1, -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2]; // 0xC0-DF == -1 and 0xE0-FF == -2 function sanitizeTTProgram(table, ttContext) { var data = table.data; var i = 0, j, n, b, funcId, pc, lastEndf = 0, lastDeff = 0; var stack = []; var callstack = []; var functionsCalled = []; var tooComplexToFollowFunctions = ttContext.tooComplexToFollowFunctions; var inFDEF = false, ifLevel = 0, inELSE = 0; for (var ii = data.length; i < ii;) { var op = data[i++]; // The TrueType instruction set docs can be found at // https://developer.apple.com/fonts/TTRefMan/RM05/Chap5.html if (op === 0x40) { // NPUSHB - pushes n bytes n = data[i++]; if (inFDEF || inELSE) { i += n; } else { for (j = 0; j < n; j++) { stack.push(data[i++]); } } } else if (op === 0x41) { // NPUSHW - pushes n words n = data[i++]; if (inFDEF || inELSE) { i += n * 2; } else { for (j = 0; j < n; j++) { b = data[i++]; stack.push((b << 8) | data[i++]); } } } else if ((op & 0xF8) === 0xB0) { // PUSHB - pushes bytes n = op - 0xB0 + 1; if (inFDEF || inELSE) { i += n; } else { for (j = 0; j < n; j++) { stack.push(data[i++]); } } } else if ((op & 0xF8) === 0xB8) { // PUSHW - pushes words n = op - 0xB8 + 1; if (inFDEF || inELSE) { i += n * 2; } else { for (j = 0; j < n; j++) { b = data[i++]; stack.push((b << 8) | data[i++]); } } } else if (op === 0x2B && !tooComplexToFollowFunctions) { // CALL if (!inFDEF && !inELSE) { // collecting inforamtion about which functions are used funcId = stack[stack.length - 1]; ttContext.functionsUsed[funcId] = true; if (funcId in ttContext.functionsStackDeltas) { stack.length += ttContext.functionsStackDeltas[funcId]; } else if (funcId in ttContext.functionsDefined && functionsCalled.indexOf(funcId) < 0) { callstack.push({data: data, i: i, stackTop: stack.length - 1}); functionsCalled.push(funcId); pc = ttContext.functionsDefined[funcId]; if (!pc) { warn('TT: CALL non-existent function'); ttContext.hintsValid = false; return; } data = pc.data; i = pc.i; } } } else if (op === 0x2C && !tooComplexToFollowFunctions) { // FDEF if (inFDEF || inELSE) { warn('TT: nested FDEFs not allowed'); tooComplexToFollowFunctions = true; } inFDEF = true; // collecting inforamtion about which functions are defined lastDeff = i; funcId = stack.pop(); ttContext.functionsDefined[funcId] = {data: data, i: i}; } else if (op === 0x2D) { // ENDF - end of function if (inFDEF) { inFDEF = false; lastEndf = i; } else { pc = callstack.pop(); if (!pc) { warn('TT: ENDF bad stack'); ttContext.hintsValid = false; return; } funcId = functionsCalled.pop(); data = pc.data; i = pc.i; ttContext.functionsStackDeltas[funcId] = stack.length - pc.stackTop; } } else if (op === 0x89) { // IDEF - instruction definition if (inFDEF || inELSE) { warn('TT: nested IDEFs not allowed'); tooComplexToFollowFunctions = true; } inFDEF = true; // recording it as a function to track ENDF lastDeff = i; } else if (op === 0x58) { // IF ++ifLevel; } else if (op === 0x1B) { // ELSE inELSE = ifLevel; } else if (op === 0x59) { // EIF if (inELSE === ifLevel) { inELSE = 0; } --ifLevel; } else if (op === 0x1C) { // JMPR if (!inFDEF && !inELSE) { var offset = stack[stack.length - 1]; // only jumping forward to prevent infinite loop if (offset > 0) { i += offset - 1; } } } // Adjusting stack not extactly, but just enough to get function id if (!inFDEF && !inELSE) { var stackDelta = op <= 0x8E ? TTOpsStackDeltas[op] : op >= 0xC0 && op <= 0xDF ? -1 : op >= 0xE0 ? -2 : 0; if (op >= 0x71 && op <= 0x75) { n = stack.pop(); if (n === n) { stackDelta = -n * 2; } } while (stackDelta < 0 && stack.length > 0) { stack.pop(); stackDelta++; } while (stackDelta > 0) { stack.push(NaN); // pushing any number into stack stackDelta--; } } } ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions; var content = [data]; if (i > data.length) { content.push(new Uint8Array(i - data.length)); } if (lastDeff > lastEndf) { warn('TT: complementing a missing function tail'); // new function definition started, but not finished // complete function by [CLEAR, ENDF] content.push(new Uint8Array([0x22, 0x2D])); } foldTTTable(table, content); } function checkInvalidFunctions(ttContext, maxFunctionDefs) { if (ttContext.tooComplexToFollowFunctions) { return; } if (ttContext.functionsDefined.length > maxFunctionDefs) { warn('TT: more functions defined than expected'); ttContext.hintsValid = false; return; } for (var j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) { if (j > maxFunctionDefs) { warn('TT: invalid function id: ' + j); ttContext.hintsValid = false; return; } if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) { warn('TT: undefined function: ' + j); ttContext.hintsValid = false; return; } } } function foldTTTable(table, content) { if (content.length > 1) { // concatenating the content items var newLength = 0; var j, jj; for (j = 0, jj = content.length; j < jj; j++) { newLength += content[j].length; } newLength = (newLength + 3) & ~3; var result = new Uint8Array(newLength); var pos = 0; for (j = 0, jj = content.length; j < jj; j++) { result.set(content[j], pos); pos += content[j].length; } table.data = result; table.length = newLength; } } function sanitizeTTPrograms(fpgm, prep, cvt) { var ttContext = { functionsDefined: [], functionsUsed: [], functionsStackDeltas: [], tooComplexToFollowFunctions: false, hintsValid: true }; if (fpgm) { sanitizeTTProgram(fpgm, ttContext); } if (prep) { sanitizeTTProgram(prep, ttContext); } if (fpgm) { checkInvalidFunctions(ttContext, maxFunctionDefs); } if (cvt && (cvt.length & 1)) { var cvtData = new Uint8Array(cvt.length + 1); cvtData.set(cvt.data); cvt.data = cvtData; } return ttContext.hintsValid; } // The following steps modify the original font data, making copy font = new Stream(new Uint8Array(font.getBytes())); var VALID_TABLES = ['OS/2', 'cmap', 'head', 'hhea', 'hmtx', 'maxp', 'name', 'post', 'loca', 'glyf', 'fpgm', 'prep', 'cvt ', 'CFF ']; var header = readOpenTypeHeader(font); var numTables = header.numTables; var cff, cffFile; var tables = Object.create(null); tables['OS/2'] = null; tables['cmap'] = null; tables['head'] = null; tables['hhea'] = null; tables['hmtx'] = null; tables['maxp'] = null; tables['name'] = null; tables['post'] = null; var table; for (var i = 0; i < numTables; i++) { table = readTableEntry(font); if (VALID_TABLES.indexOf(table.tag) < 0) { continue; // skipping table if it's not a required or optional table } if (table.length === 0) { continue; // skipping empty tables } tables[table.tag] = table; } var isTrueType = !tables['CFF ']; if (!isTrueType) { // OpenType font if ((header.version === 'OTTO' && properties.type !== 'CIDFontType2') || !tables['head'] || !tables['hhea'] || !tables['maxp'] || !tables['post']) { // no major tables: throwing everything at CFFFont cffFile = new Stream(tables['CFF '].data); cff = new CFFFont(cffFile, properties); adjustWidths(properties); return this.convert(name, cff, properties); } delete tables['glyf']; delete tables['loca']; delete tables['fpgm']; delete tables['prep']; delete tables['cvt ']; this.isOpenType = true; } else { if (!tables['loca']) { error('Required "loca" table is not found'); } if (!tables['glyf']) { warn('Required "glyf" table is not found -- trying to recover.'); // Note: We use `sanitizeGlyphLocations` to add dummy glyf data below. tables['glyf'] = { tag: 'glyf', data: new Uint8Array(0), }; } this.isOpenType = false; } if (!tables['maxp']) { error('Required "maxp" table is not found'); } font.pos = (font.start || 0) + tables['maxp'].offset; var version = font.getInt32(); var numGlyphs = font.getUint16(); var maxFunctionDefs = 0; if (version >= 0x00010000 && tables['maxp'].length >= 22) { // maxZones can be invalid font.pos += 8; var maxZones = font.getUint16(); if (maxZones > 2) { // reset to 2 if font has invalid maxZones tables['maxp'].data[14] = 0; tables['maxp'].data[15] = 2; } font.pos += 4; maxFunctionDefs = font.getUint16(); } var dupFirstEntry = false; if (properties.type === 'CIDFontType2' && properties.toUnicode && properties.toUnicode.get(0) > '\u0000') { // oracle's defect (see 3427), duplicating first entry dupFirstEntry = true; numGlyphs++; tables['maxp'].data[4] = numGlyphs >> 8; tables['maxp'].data[5] = numGlyphs & 255; } var hintsValid = sanitizeTTPrograms(tables['fpgm'], tables['prep'], tables['cvt '], maxFunctionDefs); if (!hintsValid) { delete tables['fpgm']; delete tables['prep']; delete tables['cvt ']; } // Ensure the hmtx table contains the advance width and // sidebearings information for numGlyphs in the maxp table sanitizeMetrics(font, tables['hhea'], tables['hmtx'], numGlyphs); if (!tables['head']) { error('Required "head" table is not found'); } sanitizeHead(tables['head'], numGlyphs, isTrueType ? tables['loca'].length : 0); var missingGlyphs = Object.create(null); if (isTrueType) { var isGlyphLocationsLong = int16(tables['head'].data[50], tables['head'].data[51]); missingGlyphs = sanitizeGlyphLocations(tables['loca'], tables['glyf'], numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry); } if (!tables['hhea']) { error('Required "hhea" table is not found'); } // Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth // Sometimes it's 0. That needs to be fixed if (tables['hhea'].data[10] === 0 && tables['hhea'].data[11] === 0) { tables['hhea'].data[10] = 0xFF; tables['hhea'].data[11] = 0xFF; } // Extract some more font properties from the OpenType head and // hhea tables; yMin and descent value are always negative. var metricsOverride = { unitsPerEm: int16(tables['head'].data[18], tables['head'].data[19]), yMax: int16(tables['head'].data[42], tables['head'].data[43]), yMin: signedInt16(tables['head'].data[38], tables['head'].data[39]), ascent: int16(tables['hhea'].data[4], tables['hhea'].data[5]), descent: signedInt16(tables['hhea'].data[6], tables['hhea'].data[7]) }; // PDF FontDescriptor metrics lie -- using data from actual font. this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm; this.descent = metricsOverride.descent / metricsOverride.unitsPerEm; // The 'post' table has glyphs names. if (tables['post']) { var valid = readPostScriptTable(tables['post'], properties, numGlyphs); if (!valid) { tables['post'] = null; } } var charCodeToGlyphId = [], charCode; var toUnicode = properties.toUnicode, widths = properties.widths; var skipToUnicode = (toUnicode instanceof IdentityToUnicodeMap || toUnicode.length === 0x10000); // Helper function to try to skip mapping of empty glyphs. // Note: In some cases, just relying on the glyph data doesn't work, // hence we also use a few heuristics to fix various PDF files. function hasGlyph(glyphId, charCode, widthCode) { if (!missingGlyphs[glyphId]) { return true; } if (!skipToUnicode && charCode >= 0 && toUnicode.has(charCode)) { return true; } if (widths && widthCode >= 0 && isNum(widths[widthCode])) { return true; } return false; } // Some bad PDF generators, e.g. Scribus PDF, include glyph names // in a 'uniXXXX' format -- attempting to recover proper ones. function recoverGlyphName(name, glyphsUnicodeMap) { if (glyphsUnicodeMap[name] !== undefined) { return name; } // The glyph name is non-standard, trying to recover. var unicode = getUnicodeForGlyph(name, glyphsUnicodeMap); if (unicode !== -1) { for (var key in glyphsUnicodeMap) { if (glyphsUnicodeMap[key] === unicode) { return key; } } } warn('Unable to recover a standard glyph name for: ' + name); return name; } if (properties.type === 'CIDFontType2') { var cidToGidMap = properties.cidToGidMap || []; var isCidToGidMapEmpty = cidToGidMap.length === 0; properties.cMap.forEach(function(charCode, cid) { assert(cid <= 0xffff, 'Max size of CID is 65,535'); var glyphId = -1; if (isCidToGidMapEmpty) { glyphId = cid; } else if (cidToGidMap[cid] !== undefined) { glyphId = cidToGidMap[cid]; } if (glyphId >= 0 && glyphId < numGlyphs && hasGlyph(glyphId, charCode, cid)) { charCodeToGlyphId[charCode] = glyphId; } }); if (dupFirstEntry) { charCodeToGlyphId[0] = numGlyphs - 1; } } else { // Most of the following logic in this code branch is based on the // 9.6.6.4 of the PDF spec. var hasEncoding = properties.differences.length > 0 || !!properties.baseEncodingName; var cmapTable = readCmapTable(tables['cmap'], font, this.isSymbolicFont, hasEncoding); var cmapPlatformId = cmapTable.platformId; var cmapEncodingId = cmapTable.encodingId; var cmapMappings = cmapTable.mappings; var cmapMappingsLength = cmapMappings.length; // The spec seems to imply that if the font is symbolic the encoding // should be ignored, this doesn't appear to work for 'preistabelle.pdf' // where the the font is symbolic and it has an encoding. if (hasEncoding && (cmapPlatformId === 3 && cmapEncodingId === 1 || cmapPlatformId === 1 && cmapEncodingId === 0) || (cmapPlatformId === -1 && cmapEncodingId === -1 && // Temporary hack !!getEncoding(properties.baseEncodingName))) { // Temporary hack // When no preferred cmap table was found and |baseEncodingName| is // one of the predefined encodings, we seem to obtain a better // |charCodeToGlyphId| map from the code below (fixes bug 1057544). // TODO: Note that this is a hack which should be removed as soon as // we have proper support for more exotic cmap tables. var baseEncoding = []; if (properties.baseEncodingName === 'MacRomanEncoding' || properties.baseEncodingName === 'WinAnsiEncoding') { baseEncoding = getEncoding(properties.baseEncodingName); } var glyphsUnicodeMap = getGlyphsUnicode(); for (charCode = 0; charCode < 256; charCode++) { var glyphName, standardGlyphName; if (this.differences && charCode in this.differences) { glyphName = this.differences[charCode]; } else if (charCode in baseEncoding && baseEncoding[charCode] !== '') { glyphName = baseEncoding[charCode]; } else { glyphName = StandardEncoding[charCode]; } if (!glyphName) { continue; } // Ensure that non-standard glyph names are resolved to valid ones. standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap); var unicodeOrCharCode, isUnicode = false; if (cmapPlatformId === 3 && cmapEncodingId === 1) { unicodeOrCharCode = glyphsUnicodeMap[standardGlyphName]; isUnicode = true; } else if (cmapPlatformId === 1 && cmapEncodingId === 0) { // TODO: the encoding needs to be updated with mac os table. unicodeOrCharCode = MacRomanEncoding.indexOf(standardGlyphName); } var found = false; for (i = 0; i < cmapMappingsLength; ++i) { if (cmapMappings[i].charCode !== unicodeOrCharCode) { continue; } var code = isUnicode ? charCode : unicodeOrCharCode; if (hasGlyph(cmapMappings[i].glyphId, code, -1)) { charCodeToGlyphId[charCode] = cmapMappings[i].glyphId; found = true; break; } } if (!found && properties.glyphNames) { // Try to map using the post table. var glyphId = properties.glyphNames.indexOf(glyphName); // The post table ought to use the same kind of glyph names as the // `differences` array, but check the standard ones as a fallback. if (glyphId === -1 && standardGlyphName !== glyphName) { glyphId = properties.glyphNames.indexOf(standardGlyphName); } if (glyphId > 0 && hasGlyph(glyphId, -1, -1)) { charCodeToGlyphId[charCode] = glyphId; found = true; } } if (!found) { charCodeToGlyphId[charCode] = 0; // notdef } } } else if (cmapPlatformId === 0 && cmapEncodingId === 0) { // Default Unicode semantics, use the charcodes as is. for (i = 0; i < cmapMappingsLength; ++i) { charCodeToGlyphId[cmapMappings[i].charCode] = cmapMappings[i].glyphId; } } else { // For (3, 0) cmap tables: // The charcode key being stored in charCodeToGlyphId is the lower // byte of the two-byte charcodes of the cmap table since according to // the spec: 'each byte from the string shall be prepended with the // high byte of the range [of charcodes in the cmap table], to form // a two-byte character, which shall be used to select the // associated glyph description from the subtable'. // // For (1, 0) cmap tables: // 'single bytes from the string shall be used to look up the // associated glyph descriptions from the subtable'. This means // charcodes in the cmap will be single bytes, so no-op since // glyph.charCode & 0xFF === glyph.charCode for (i = 0; i < cmapMappingsLength; ++i) { charCode = cmapMappings[i].charCode & 0xFF; charCodeToGlyphId[charCode] = cmapMappings[i].glyphId; } } } if (charCodeToGlyphId.length === 0) { // defines at least one glyph charCodeToGlyphId[0] = 0; } // Converting glyphs and ids into font's cmap table var newMapping = adjustMapping(charCodeToGlyphId, properties); this.toFontChar = newMapping.toFontChar; tables['cmap'] = { tag: 'cmap', data: createCmapTable(newMapping.charCodeToGlyphId, numGlyphs) }; if (!tables['OS/2'] || !validateOS2Table(tables['OS/2'])) { tables['OS/2'] = { tag: 'OS/2', data: createOS2Table(properties, newMapping.charCodeToGlyphId, metricsOverride) }; } // Rewrite the 'post' table if needed if (!tables['post']) { tables['post'] = { tag: 'post', data: createPostTable(properties) }; } if (!isTrueType) { try { // Trying to repair CFF file cffFile = new Stream(tables['CFF '].data); var parser = new CFFParser(cffFile, properties, SEAC_ANALYSIS_ENABLED); cff = parser.parse(); var compiler = new CFFCompiler(cff); tables['CFF '].data = compiler.compile(); } catch (e) { warn('Failed to compile font ' + properties.loadedName); } } // Re-creating 'name' table if (!tables['name']) { tables['name'] = { tag: 'name', data: createNameTable(this.name) }; } else { // ... using existing 'name' table as prototype var namePrototype = readNameTable(tables['name']); tables['name'].data = createNameTable(name, namePrototype); } var builder = new OpenTypeFileBuilder(header.version); for (var tableTag in tables) { builder.addTable(tableTag, tables[tableTag].data); } return builder.toArray(); }, convert: function Font_convert(fontName, font, properties) { // TODO: Check the charstring widths to determine this. properties.fixedPitch = false; var mapping = font.getGlyphMapping(properties); var newMapping = adjustMapping(mapping, properties); this.toFontChar = newMapping.toFontChar; var numGlyphs = font.numGlyphs; function getCharCodes(charCodeToGlyphId, glyphId) { var charCodes = null; for (var charCode in charCodeToGlyphId) { if (glyphId === charCodeToGlyphId[charCode]) { if (!charCodes) { charCodes = []; } charCodes.push(charCode | 0); } } return charCodes; } function createCharCode(charCodeToGlyphId, glyphId) { for (var charCode in charCodeToGlyphId) { if (glyphId === charCodeToGlyphId[charCode]) { return charCode | 0; } } newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = glyphId; return newMapping.nextAvailableFontCharCode++; } var seacs = font.seacs; if (SEAC_ANALYSIS_ENABLED && seacs && seacs.length) { var matrix = properties.fontMatrix || FONT_IDENTITY_MATRIX; var charset = font.getCharset(); var seacMap = Object.create(null); for (var glyphId in seacs) { glyphId |= 0; var seac = seacs[glyphId]; var baseGlyphName = StandardEncoding[seac[2]]; var accentGlyphName = StandardEncoding[seac[3]]; var baseGlyphId = charset.indexOf(baseGlyphName); var accentGlyphId = charset.indexOf(accentGlyphName); if (baseGlyphId < 0 || accentGlyphId < 0) { continue; } var accentOffset = { x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4], y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5] }; var charCodes = getCharCodes(mapping, glyphId); if (!charCodes) { // There's no point in mapping it if the char code was never mapped // to begin with. continue; } for (var i = 0, ii = charCodes.length; i < ii; i++) { var charCode = charCodes[i]; // Find a fontCharCode that maps to the base and accent glyphs. // If one doesn't exists, create it. var charCodeToGlyphId = newMapping.charCodeToGlyphId; var baseFontCharCode = createCharCode(charCodeToGlyphId, baseGlyphId); var accentFontCharCode = createCharCode(charCodeToGlyphId, accentGlyphId); seacMap[charCode] = { baseFontCharCode: baseFontCharCode, accentFontCharCode: accentFontCharCode, accentOffset: accentOffset }; } } properties.seacMap = seacMap; } var unitsPerEm = 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]; var builder = new OpenTypeFileBuilder('\x4F\x54\x54\x4F'); // PostScript Font Program builder.addTable('CFF ', font.data); // OS/2 and Windows Specific metrics builder.addTable('OS/2', createOS2Table(properties, newMapping.charCodeToGlyphId)); // Character to glyphs mapping builder.addTable('cmap', createCmapTable(newMapping.charCodeToGlyphId, numGlyphs)); // Font header builder.addTable('head', '\x00\x01\x00\x00' + // Version number '\x00\x00\x10\x00' + // fontRevision '\x00\x00\x00\x00' + // checksumAdjustement '\x5F\x0F\x3C\xF5' + // magicNumber '\x00\x00' + // Flags safeString16(unitsPerEm) + // unitsPerEM '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // creation date '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // modifification date '\x00\x00' + // xMin safeString16(properties.descent) + // yMin '\x0F\xFF' + // xMax safeString16(properties.ascent) + // yMax string16(properties.italicAngle ? 2 : 0) + // macStyle '\x00\x11' + // lowestRecPPEM '\x00\x00' + // fontDirectionHint '\x00\x00' + // indexToLocFormat '\x00\x00'); // glyphDataFormat // Horizontal header builder.addTable('hhea', '\x00\x01\x00\x00' + // Version number safeString16(properties.ascent) + // Typographic Ascent safeString16(properties.descent) + // Typographic Descent '\x00\x00' + // Line Gap '\xFF\xFF' + // advanceWidthMax '\x00\x00' + // minLeftSidebearing '\x00\x00' + // minRightSidebearing '\x00\x00' + // xMaxExtent safeString16(properties.capHeight) + // caretSlopeRise safeString16(Math.tan(properties.italicAngle) * properties.xHeight) + // caretSlopeRun '\x00\x00' + // caretOffset '\x00\x00' + // -reserved- '\x00\x00' + // -reserved- '\x00\x00' + // -reserved- '\x00\x00' + // -reserved- '\x00\x00' + // metricDataFormat string16(numGlyphs)); // Number of HMetrics // Horizontal metrics builder.addTable('hmtx', (function fontFieldsHmtx() { var charstrings = font.charstrings; var cffWidths = font.cff ? font.cff.widths : null; var hmtx = '\x00\x00\x00\x00'; // Fake .notdef for (var i = 1, ii = numGlyphs; i < ii; i++) { var width = 0; if (charstrings) { var charstring = charstrings[i - 1]; width = 'width' in charstring ? charstring.width : 0; } else if (cffWidths) { width = Math.ceil(cffWidths[i] || 0); } hmtx += string16(width) + string16(0); } return hmtx; })()); // Maximum profile builder.addTable('maxp', '\x00\x00\x50\x00' + // Version number string16(numGlyphs)); // Num of glyphs // Naming tables builder.addTable('name', createNameTable(fontName)); // PostScript informations builder.addTable('post', createPostTable(properties)); return builder.toArray(); }, get spaceWidth() { if ('_shadowWidth' in this) { return this._shadowWidth; } // trying to estimate space character width var possibleSpaceReplacements = ['space', 'minus', 'one', 'i']; var width; for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) { var glyphName = possibleSpaceReplacements[i]; // if possible, getting width by glyph name if (glyphName in this.widths) { width = this.widths[glyphName]; break; } var glyphsUnicodeMap = getGlyphsUnicode(); var glyphUnicode = glyphsUnicodeMap[glyphName]; // finding the charcode via unicodeToCID map var charcode = 0; if (this.composite) { if (this.cMap.contains(glyphUnicode)) { charcode = this.cMap.lookup(glyphUnicode); } } // ... via toUnicode map if (!charcode && this.toUnicode) { charcode = this.toUnicode.charCodeOf(glyphUnicode); } // setting it to unicode if negative or undefined if (charcode <= 0) { charcode = glyphUnicode; } // trying to get width via charcode width = this.widths[charcode]; if (width) { break; // the non-zero width found } } width = width || this.defaultWidth; // Do not shadow the property here. See discussion: // https://github.com/mozilla/pdf.js/pull/2127#discussion_r1662280 this._shadowWidth = width; return width; }, charToGlyph: function Font_charToGlyph(charcode, isSpace) { var fontCharCode, width, operatorListId; var widthCode = charcode; if (this.cMap && this.cMap.contains(charcode)) { widthCode = this.cMap.lookup(charcode); } width = this.widths[widthCode]; width = isNum(width) ? width : this.defaultWidth; var vmetric = this.vmetrics && this.vmetrics[widthCode]; var unicode = this.toUnicode.get(charcode) || charcode; if (typeof unicode === 'number') { unicode = String.fromCharCode(unicode); } var isInFont = charcode in this.toFontChar; // First try the toFontChar map, if it's not there then try falling // back to the char code. fontCharCode = this.toFontChar[charcode] || charcode; if (this.missingFile) { fontCharCode = mapSpecialUnicodeValues(fontCharCode); } if (this.isType3Font) { // Font char code in this case is actually a glyph name. operatorListId = fontCharCode; } var accent = null; if (this.seacMap && this.seacMap[charcode]) { isInFont = true; var seac = this.seacMap[charcode]; fontCharCode = seac.baseFontCharCode; accent = { fontChar: String.fromCharCode(seac.accentFontCharCode), offset: seac.accentOffset }; } var fontChar = String.fromCharCode(fontCharCode); var glyph = this.glyphCache[charcode]; if (!glyph || !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont)) { glyph = new Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont); this.glyphCache[charcode] = glyph; } return glyph; }, charsToGlyphs: function Font_charsToGlyphs(chars) { var charsCache = this.charsCache; var glyphs, glyph, charcode; // if we translated this string before, just grab it from the cache if (charsCache) { glyphs = charsCache[chars]; if (glyphs) { return glyphs; } } // lazily create the translation cache if (!charsCache) { charsCache = this.charsCache = Object.create(null); } glyphs = []; var charsCacheKey = chars; var i = 0, ii; if (this.cMap) { // composite fonts have multi-byte strings convert the string from // single-byte to multi-byte var c = Object.create(null); while (i < chars.length) { this.cMap.readCharCode(chars, i, c); charcode = c.charcode; var length = c.length; i += length; // Space is char with code 0x20 and length 1 in multiple-byte codes. var isSpace = length === 1 && chars.charCodeAt(i - 1) === 0x20; glyph = this.charToGlyph(charcode, isSpace); glyphs.push(glyph); } } else { for (i = 0, ii = chars.length; i < ii; ++i) { charcode = chars.charCodeAt(i); glyph = this.charToGlyph(charcode, charcode === 0x20); glyphs.push(glyph); } } // Enter the translated string into the cache return (charsCache[charsCacheKey] = glyphs); } }; return Font; })(); var ErrorFont = (function ErrorFontClosure() { function ErrorFont(error) { this.error = error; this.loadedName = 'g_font_error'; this.loading = false; } ErrorFont.prototype = { charsToGlyphs: function ErrorFont_charsToGlyphs() { return []; }, exportData: function ErrorFont_exportData() { return {error: this.error}; } }; return ErrorFont; })(); /** * Shared logic for building a char code to glyph id mapping for Type1 and * simple CFF fonts. See section 9.6.6.2 of the spec. * @param {Object} properties Font properties object. * @param {Object} builtInEncoding The encoding contained within the actual font * data. * @param {Array} Array of glyph names where the index is the glyph ID. * @returns {Object} A char code to glyph ID map. */ function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) { var charCodeToGlyphId = Object.create(null); var glyphId, charCode, baseEncoding; if (properties.baseEncodingName) { // If a valid base encoding name was used, the mapping is initialized with // that. baseEncoding = getEncoding(properties.baseEncodingName); for (charCode = 0; charCode < baseEncoding.length; charCode++) { glyphId = glyphNames.indexOf(baseEncoding[charCode]); if (glyphId >= 0) { charCodeToGlyphId[charCode] = glyphId; } else { charCodeToGlyphId[charCode] = 0; // notdef } } } else if (!!(properties.flags & FontFlags.Symbolic)) { // For a symbolic font the encoding should be the fonts built-in // encoding. for (charCode in builtInEncoding) { charCodeToGlyphId[charCode] = builtInEncoding[charCode]; } } else { // For non-symbolic fonts that don't have a base encoding the standard // encoding should be used. baseEncoding = StandardEncoding; for (charCode = 0; charCode < baseEncoding.length; charCode++) { glyphId = glyphNames.indexOf(baseEncoding[charCode]); if (glyphId >= 0) { charCodeToGlyphId[charCode] = glyphId; } else { charCodeToGlyphId[charCode] = 0; // notdef } } } // Lastly, merge in the differences. var differences = properties.differences; if (differences) { for (charCode in differences) { var glyphName = differences[charCode]; glyphId = glyphNames.indexOf(glyphName); if (glyphId >= 0) { charCodeToGlyphId[charCode] = glyphId; } else { charCodeToGlyphId[charCode] = 0; // notdef } } } return charCodeToGlyphId; } // Type1Font is also a CIDFontType0. var Type1Font = (function Type1FontClosure() { function findBlock(streamBytes, signature, startIndex) { var streamBytesLength = streamBytes.length; var signatureLength = signature.length; var scanLength = streamBytesLength - signatureLength; var i = startIndex, j, found = false; while (i < scanLength) { j = 0; while (j < signatureLength && streamBytes[i + j] === signature[j]) { j++; } if (j >= signatureLength) { // `signature` found, skip over whitespace. i += j; while (i < streamBytesLength && Lexer.isSpace(streamBytes[i])) { i++; } found = true; break; } i++; } return { found: found, length: i, }; } function getHeaderBlock(stream, suggestedLength) { var EEXEC_SIGNATURE = [0x65, 0x65, 0x78, 0x65, 0x63]; var streamStartPos = stream.pos; // Save the initial stream position. var headerBytes, headerBytesLength, block; try { headerBytes = stream.getBytes(suggestedLength); headerBytesLength = headerBytes.length; } catch (ex) { if (ex instanceof MissingDataException) { throw ex; } // Ignore errors if the `suggestedLength` is huge enough that a Uint8Array // cannot hold the result of `getBytes`, and fallback to simply checking // the entire stream (fixes issue3928.pdf). } if (headerBytesLength === suggestedLength) { // Most of the time `suggestedLength` is correct, so to speed things up we // initially only check the last few bytes to see if the header was found. // Otherwise we (potentially) check the entire stream to prevent errors in // `Type1Parser` (fixes issue5686.pdf). block = findBlock(headerBytes, EEXEC_SIGNATURE, suggestedLength - 2 * EEXEC_SIGNATURE.length); if (block.found && block.length === suggestedLength) { return { stream: new Stream(headerBytes), length: suggestedLength, }; } } warn('Invalid "Length1" property in Type1 font -- trying to recover.'); stream.pos = streamStartPos; // Reset the stream position. var SCAN_BLOCK_LENGTH = 2048; var actualLength; while (true) { var scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH); block = findBlock(scanBytes, EEXEC_SIGNATURE, 0); if (block.length === 0) { break; } stream.pos += block.length; // Update the stream position. if (block.found) { actualLength = stream.pos - streamStartPos; break; } } stream.pos = streamStartPos; // Reset the stream position. if (actualLength) { return { stream: new Stream(stream.getBytes(actualLength)), length: actualLength, }; } warn('Unable to recover "Length1" property in Type1 font -- using as is.'); return { stream: new Stream(stream.getBytes(suggestedLength)), length: suggestedLength, }; } function getEexecBlock(stream, suggestedLength) { // We should ideally parse the eexec block to ensure that `suggestedLength` // is correct, so we don't truncate the block data if it's too small. // However, this would also require checking if the fixed-content portion // exists (using the 'Length3' property), and ensuring that it's valid. // // Given that `suggestedLength` almost always is correct, all the validation // would require a great deal of unnecessary parsing for most fonts. // To save time, we always fetch the entire stream instead, which also avoid // issues if `suggestedLength` is huge (see comment in `getHeaderBlock`). // // NOTE: This means that the function can include the fixed-content portion // in the returned eexec block. In practice this does *not* seem to matter, // since `Type1Parser_extractFontProgram` will skip over any non-commands. var eexecBytes = stream.getBytes(); return { stream: new Stream(eexecBytes), length: eexecBytes.length, }; } function Type1Font(name, file, properties) { // Some bad generators embed pfb file as is, we have to strip 6-byte header. // Also, length1 and length2 might be off by 6 bytes as well. // http://www.math.ubc.ca/~cass/piscript/type1.pdf var PFB_HEADER_SIZE = 6; var headerBlockLength = properties.length1; var eexecBlockLength = properties.length2; var pfbHeader = file.peekBytes(PFB_HEADER_SIZE); var pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01; if (pfbHeaderPresent) { file.skip(PFB_HEADER_SIZE); headerBlockLength = (pfbHeader[5] << 24) | (pfbHeader[4] << 16) | (pfbHeader[3] << 8) | pfbHeader[2]; } // Get the data block containing glyphs and subrs informations var headerBlock = getHeaderBlock(file, headerBlockLength); headerBlockLength = headerBlock.length; var headerBlockParser = new Type1Parser(headerBlock.stream, false, SEAC_ANALYSIS_ENABLED); headerBlockParser.extractFontHeader(properties); if (pfbHeaderPresent) { pfbHeader = file.getBytes(PFB_HEADER_SIZE); eexecBlockLength = (pfbHeader[5] << 24) | (pfbHeader[4] << 16) | (pfbHeader[3] << 8) | pfbHeader[2]; } // Decrypt the data blocks and retrieve it's content var eexecBlock = getEexecBlock(file, eexecBlockLength); eexecBlockLength = eexecBlock.length; var eexecBlockParser = new Type1Parser(eexecBlock.stream, true, SEAC_ANALYSIS_ENABLED); var data = eexecBlockParser.extractFontProgram(); for (var info in data.properties) { properties[info] = data.properties[info]; } var charstrings = data.charstrings; var type2Charstrings = this.getType2Charstrings(charstrings); var subrs = this.getType2Subrs(data.subrs); this.charstrings = charstrings; this.data = this.wrap(name, type2Charstrings, this.charstrings, subrs, properties); this.seacs = this.getSeacs(data.charstrings); } Type1Font.prototype = { get numGlyphs() { return this.charstrings.length + 1; }, getCharset: function Type1Font_getCharset() { var charset = ['.notdef']; var charstrings = this.charstrings; for (var glyphId = 0; glyphId < charstrings.length; glyphId++) { charset.push(charstrings[glyphId].glyphName); } return charset; }, getGlyphMapping: function Type1Font_getGlyphMapping(properties) { var charstrings = this.charstrings; var glyphNames = ['.notdef'], glyphId; for (glyphId = 0; glyphId < charstrings.length; glyphId++) { glyphNames.push(charstrings[glyphId].glyphName); } var encoding = properties.builtInEncoding; if (encoding) { var builtInEncoding = Object.create(null); for (var charCode in encoding) { glyphId = glyphNames.indexOf(encoding[charCode]); if (glyphId >= 0) { builtInEncoding[charCode] = glyphId; } } } return type1FontGlyphMapping(properties, builtInEncoding, glyphNames); }, getSeacs: function Type1Font_getSeacs(charstrings) { var i, ii; var seacMap = []; for (i = 0, ii = charstrings.length; i < ii; i++) { var charstring = charstrings[i]; if (charstring.seac) { // Offset by 1 for .notdef seacMap[i + 1] = charstring.seac; } } return seacMap; }, getType2Charstrings: function Type1Font_getType2Charstrings( type1Charstrings) { var type2Charstrings = []; for (var i = 0, ii = type1Charstrings.length; i < ii; i++) { type2Charstrings.push(type1Charstrings[i].charstring); } return type2Charstrings; }, getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) { var bias = 0; var count = type1Subrs.length; if (count < 1133) { bias = 107; } else if (count < 33769) { bias = 1131; } else { bias = 32768; } // Add a bunch of empty subrs to deal with the Type2 bias var type2Subrs = []; var i; for (i = 0; i < bias; i++) { type2Subrs.push([0x0B]); } for (i = 0; i < count; i++) { type2Subrs.push(type1Subrs[i]); } return type2Subrs; }, wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) { var cff = new CFF(); cff.header = new CFFHeader(1, 0, 4, 4); cff.names = [name]; var topDict = new CFFTopDict(); // CFF strings IDs 0...390 are predefined names, so refering // to entries in our own String INDEX starts at SID 391. topDict.setByName('version', 391); topDict.setByName('Notice', 392); topDict.setByName('FullName', 393); topDict.setByName('FamilyName', 394); topDict.setByName('Weight', 395); topDict.setByName('Encoding', null); // placeholder topDict.setByName('FontMatrix', properties.fontMatrix); topDict.setByName('FontBBox', properties.bbox); topDict.setByName('charset', null); // placeholder topDict.setByName('CharStrings', null); // placeholder topDict.setByName('Private', null); // placeholder cff.topDict = topDict; var strings = new CFFStrings(); strings.add('Version 0.11'); // Version strings.add('See original notice'); // Notice strings.add(name); // FullName strings.add(name); // FamilyName strings.add('Medium'); // Weight cff.strings = strings; cff.globalSubrIndex = new CFFIndex(); var count = glyphs.length; var charsetArray = [0]; var i, ii; for (i = 0; i < count; i++) { var index = CFFStandardStrings.indexOf(charstrings[i].glyphName); // TODO: Insert the string and correctly map it. Previously it was // thought mapping names that aren't in the standard strings to .notdef // was fine, however in issue818 when mapping them all to .notdef the // adieresis glyph no longer worked. if (index === -1) { index = 0; } charsetArray.push((index >> 8) & 0xff, index & 0xff); } cff.charset = new CFFCharset(false, 0, [], charsetArray); var charStringsIndex = new CFFIndex(); charStringsIndex.add([0x8B, 0x0E]); // .notdef for (i = 0; i < count; i++) { charStringsIndex.add(glyphs[i]); } cff.charStrings = charStringsIndex; var privateDict = new CFFPrivateDict(); privateDict.setByName('Subrs', null); // placeholder var fields = [ 'BlueValues', 'OtherBlues', 'FamilyBlues', 'FamilyOtherBlues', 'StemSnapH', 'StemSnapV', 'BlueShift', 'BlueFuzz', 'BlueScale', 'LanguageGroup', 'ExpansionFactor', 'ForceBold', 'StdHW', 'StdVW' ]; for (i = 0, ii = fields.length; i < ii; i++) { var field = fields[i]; if (!(field in properties.privateData)) { continue; } var value = properties.privateData[field]; if (isArray(value)) { // All of the private dictionary array data in CFF must be stored as // "delta-encoded" numbers. for (var j = value.length - 1; j > 0; j--) { value[j] -= value[j - 1]; // ... difference from previous value } } privateDict.setByName(field, value); } cff.topDict.privateDict = privateDict; var subrIndex = new CFFIndex(); for (i = 0, ii = subrs.length; i < ii; i++) { subrIndex.add(subrs[i]); } privateDict.subrsIndex = subrIndex; var compiler = new CFFCompiler(cff); return compiler.compile(); } }; return Type1Font; })(); var CFFFont = (function CFFFontClosure() { function CFFFont(file, properties) { this.properties = properties; var parser = new CFFParser(file, properties, SEAC_ANALYSIS_ENABLED); this.cff = parser.parse(); var compiler = new CFFCompiler(this.cff); this.seacs = this.cff.seacs; try { this.data = compiler.compile(); } catch (e) { warn('Failed to compile font ' + properties.loadedName); // There may have just been an issue with the compiler, set the data // anyway and hope the font loaded. this.data = file; } } CFFFont.prototype = { get numGlyphs() { return this.cff.charStrings.count; }, getCharset: function CFFFont_getCharset() { return this.cff.charset.charset; }, getGlyphMapping: function CFFFont_getGlyphMapping() { var cff = this.cff; var properties = this.properties; var charsets = cff.charset.charset; var charCodeToGlyphId; var glyphId; if (properties.composite) { charCodeToGlyphId = Object.create(null); if (cff.isCIDFont) { // If the font is actually a CID font then we should use the charset // to map CIDs to GIDs. for (glyphId = 0; glyphId < charsets.length; glyphId++) { var cid = charsets[glyphId]; var charCode = properties.cMap.charCodeOf(cid); charCodeToGlyphId[charCode] = glyphId; } } else { // If it is NOT actually a CID font then CIDs should be mapped // directly to GIDs. for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) { charCodeToGlyphId[glyphId] = glyphId; } } return charCodeToGlyphId; } var encoding = cff.encoding ? cff.encoding.encoding : null; charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets); return charCodeToGlyphId; } }; return CFFFont; })(); // Workaround for seac on Windows. (function checkSeacSupport() { if (typeof navigator !== 'undefined' && /Windows/.test(navigator.userAgent)) { SEAC_ANALYSIS_ENABLED = true; } })(); // Workaround for Private Use Area characters in Chrome on Windows // http://code.google.com/p/chromium/issues/detail?id=122465 // https://github.com/mozilla/pdf.js/issues/1689 (function checkChromeWindows() { if (typeof navigator !== 'undefined' && /Windows.*Chrome/.test(navigator.userAgent)) { SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = true; } })(); exports.SEAC_ANALYSIS_ENABLED = SEAC_ANALYSIS_ENABLED; exports.ErrorFont = ErrorFont; exports.Font = Font; exports.FontFlags = FontFlags; exports.IdentityToUnicodeMap = IdentityToUnicodeMap; exports.ToUnicodeMap = ToUnicodeMap; exports.getFontType = getFontType; })); (function (root, factory) { { factory((root.pdfjsCoreFunction = {}), root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCorePsParser); } }(this, function (exports, sharedUtil, corePrimitives, corePsParser) { var error = sharedUtil.error; var info = sharedUtil.info; var isArray = sharedUtil.isArray; var isBool = sharedUtil.isBool; var isDict = corePrimitives.isDict; var isStream = corePrimitives.isStream; var PostScriptLexer = corePsParser.PostScriptLexer; var PostScriptParser = corePsParser.PostScriptParser; var PDFFunction = (function PDFFunctionClosure() { var CONSTRUCT_SAMPLED = 0; var CONSTRUCT_INTERPOLATED = 2; var CONSTRUCT_STICHED = 3; var CONSTRUCT_POSTSCRIPT = 4; return { getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps, str) { var i, ii; var length = 1; for (i = 0, ii = size.length; i < ii; i++) { length *= size[i]; } length *= outputSize; var array = new Array(length); var codeSize = 0; var codeBuf = 0; // 32 is a valid bps so shifting won't work var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1); var strBytes = str.getBytes((length * bps + 7) / 8); var strIdx = 0; for (i = 0; i < length; i++) { while (codeSize < bps) { codeBuf <<= 8; codeBuf |= strBytes[strIdx++]; codeSize += 8; } codeSize -= bps; array[i] = (codeBuf >> codeSize) * sampleMul; codeBuf &= (1 << codeSize) - 1; } return array; }, getIR: function PDFFunction_getIR(xref, fn) { var dict = fn.dict; if (!dict) { dict = fn; } var types = [this.constructSampled, null, this.constructInterpolated, this.constructStiched, this.constructPostScript]; var typeNum = dict.get('FunctionType'); var typeFn = types[typeNum]; if (!typeFn) { error('Unknown type of function'); } return typeFn.call(this, fn, dict, xref); }, fromIR: function PDFFunction_fromIR(IR) { var type = IR[0]; switch (type) { case CONSTRUCT_SAMPLED: return this.constructSampledFromIR(IR); case CONSTRUCT_INTERPOLATED: return this.constructInterpolatedFromIR(IR); case CONSTRUCT_STICHED: return this.constructStichedFromIR(IR); //case CONSTRUCT_POSTSCRIPT: default: return this.constructPostScriptFromIR(IR); } }, parse: function PDFFunction_parse(xref, fn) { var IR = this.getIR(xref, fn); return this.fromIR(IR); }, parseArray: function PDFFunction_parseArray(xref, fnObj) { if (!isArray(fnObj)) { // not an array -- parsing as regular function return this.parse(xref, fnObj); } var fnArray = []; for (var j = 0, jj = fnObj.length; j < jj; j++) { var obj = xref.fetchIfRef(fnObj[j]); fnArray.push(PDFFunction.parse(xref, obj)); } return function (src, srcOffset, dest, destOffset) { for (var i = 0, ii = fnArray.length; i < ii; i++) { fnArray[i](src, srcOffset, dest, destOffset + i); } }; }, constructSampled: function PDFFunction_constructSampled(str, dict) { function toMultiArray(arr) { var inputLength = arr.length; var out = []; var index = 0; for (var i = 0; i < inputLength; i += 2) { out[index] = [arr[i], arr[i + 1]]; ++index; } return out; } var domain = dict.get('Domain'); var range = dict.get('Range'); if (!domain || !range) { error('No domain or range'); } var inputSize = domain.length / 2; var outputSize = range.length / 2; domain = toMultiArray(domain); range = toMultiArray(range); var size = dict.get('Size'); var bps = dict.get('BitsPerSample'); var order = dict.get('Order') || 1; if (order !== 1) { // No description how cubic spline interpolation works in PDF32000:2008 // As in poppler, ignoring order, linear interpolation may work as good info('No support for cubic spline interpolation: ' + order); } var encode = dict.get('Encode'); if (!encode) { encode = []; for (var i = 0; i < inputSize; ++i) { encode.push(0); encode.push(size[i] - 1); } } encode = toMultiArray(encode); var decode = dict.get('Decode'); if (!decode) { decode = range; } else { decode = toMultiArray(decode); } var samples = this.getSampleArray(size, outputSize, bps, str); return [ CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size, outputSize, Math.pow(2, bps) - 1, range ]; }, constructSampledFromIR: function PDFFunction_constructSampledFromIR(IR) { // See chapter 3, page 109 of the PDF reference function interpolate(x, xmin, xmax, ymin, ymax) { return ymin + ((x - xmin) * ((ymax - ymin) / (xmax - xmin))); } return function constructSampledFromIRResult(src, srcOffset, dest, destOffset) { // See chapter 3, page 110 of the PDF reference. var m = IR[1]; var domain = IR[2]; var encode = IR[3]; var decode = IR[4]; var samples = IR[5]; var size = IR[6]; var n = IR[7]; //var mask = IR[8]; var range = IR[9]; // Building the cube vertices: its part and sample index // http://rjwagner49.com/Mathematics/Interpolation.pdf var cubeVertices = 1 << m; var cubeN = new Float64Array(cubeVertices); var cubeVertex = new Uint32Array(cubeVertices); var i, j; for (j = 0; j < cubeVertices; j++) { cubeN[j] = 1; } var k = n, pos = 1; // Map x_i to y_j for 0 <= i < m using the sampled function. for (i = 0; i < m; ++i) { // x_i' = min(max(x_i, Domain_2i), Domain_2i+1) var domain_2i = domain[i][0]; var domain_2i_1 = domain[i][1]; var xi = Math.min(Math.max(src[srcOffset +i], domain_2i), domain_2i_1); // e_i = Interpolate(x_i', Domain_2i, Domain_2i+1, // Encode_2i, Encode_2i+1) var e = interpolate(xi, domain_2i, domain_2i_1, encode[i][0], encode[i][1]); // e_i' = min(max(e_i, 0), Size_i - 1) var size_i = size[i]; e = Math.min(Math.max(e, 0), size_i - 1); // Adjusting the cube: N and vertex sample index var e0 = e < size_i - 1 ? Math.floor(e) : e - 1; // e1 = e0 + 1; var n0 = e0 + 1 - e; // (e1 - e) / (e1 - e0); var n1 = e - e0; // (e - e0) / (e1 - e0); var offset0 = e0 * k; var offset1 = offset0 + k; // e1 * k for (j = 0; j < cubeVertices; j++) { if (j & pos) { cubeN[j] *= n1; cubeVertex[j] += offset1; } else { cubeN[j] *= n0; cubeVertex[j] += offset0; } } k *= size_i; pos <<= 1; } for (j = 0; j < n; ++j) { // Sum all cube vertices' samples portions var rj = 0; for (i = 0; i < cubeVertices; i++) { rj += samples[cubeVertex[i] + j] * cubeN[i]; } // r_j' = Interpolate(r_j, 0, 2^BitsPerSample - 1, // Decode_2j, Decode_2j+1) rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]); // y_j = min(max(r_j, range_2j), range_2j+1) dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), range[j][1]); } }; }, constructInterpolated: function PDFFunction_constructInterpolated(str, dict) { var c0 = dict.get('C0') || [0]; var c1 = dict.get('C1') || [1]; var n = dict.get('N'); if (!isArray(c0) || !isArray(c1)) { error('Illegal dictionary for interpolated function'); } var length = c0.length; var diff = []; for (var i = 0; i < length; ++i) { diff.push(c1[i] - c0[i]); } return [CONSTRUCT_INTERPOLATED, c0, diff, n]; }, constructInterpolatedFromIR: function PDFFunction_constructInterpolatedFromIR(IR) { var c0 = IR[1]; var diff = IR[2]; var n = IR[3]; var length = diff.length; return function constructInterpolatedFromIRResult(src, srcOffset, dest, destOffset) { var x = n === 1 ? src[srcOffset] : Math.pow(src[srcOffset], n); for (var j = 0; j < length; ++j) { dest[destOffset + j] = c0[j] + (x * diff[j]); } }; }, constructStiched: function PDFFunction_constructStiched(fn, dict, xref) { var domain = dict.get('Domain'); if (!domain) { error('No domain'); } var inputSize = domain.length / 2; if (inputSize !== 1) { error('Bad domain for stiched function'); } var fnRefs = dict.get('Functions'); var fns = []; for (var i = 0, ii = fnRefs.length; i < ii; ++i) { fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i]))); } var bounds = dict.get('Bounds'); var encode = dict.get('Encode'); return [CONSTRUCT_STICHED, domain, bounds, encode, fns]; }, constructStichedFromIR: function PDFFunction_constructStichedFromIR(IR) { var domain = IR[1]; var bounds = IR[2]; var encode = IR[3]; var fnsIR = IR[4]; var fns = []; var tmpBuf = new Float32Array(1); for (var i = 0, ii = fnsIR.length; i < ii; i++) { fns.push(PDFFunction.fromIR(fnsIR[i])); } return function constructStichedFromIRResult(src, srcOffset, dest, destOffset) { var clip = function constructStichedFromIRClip(v, min, max) { if (v > max) { v = max; } else if (v < min) { v = min; } return v; }; // clip to domain var v = clip(src[srcOffset], domain[0], domain[1]); // calulate which bound the value is in for (var i = 0, ii = bounds.length; i < ii; ++i) { if (v < bounds[i]) { break; } } // encode value into domain of function var dmin = domain[0]; if (i > 0) { dmin = bounds[i - 1]; } var dmax = domain[1]; if (i < bounds.length) { dmax = bounds[i]; } var rmin = encode[2 * i]; var rmax = encode[2 * i + 1]; // Prevent the value from becoming NaN as a result // of division by zero (fixes issue6113.pdf). tmpBuf[0] = dmin === dmax ? rmin : rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin); // call the appropriate function fns[i](tmpBuf, 0, dest, destOffset); }; }, constructPostScript: function PDFFunction_constructPostScript(fn, dict, xref) { var domain = dict.get('Domain'); var range = dict.get('Range'); if (!domain) { error('No domain.'); } if (!range) { error('No range.'); } var lexer = new PostScriptLexer(fn); var parser = new PostScriptParser(lexer); var code = parser.parse(); return [CONSTRUCT_POSTSCRIPT, domain, range, code]; }, constructPostScriptFromIR: function PDFFunction_constructPostScriptFromIR( IR) { var domain = IR[1]; var range = IR[2]; var code = IR[3]; var compiled = (new PostScriptCompiler()).compile(code, domain, range); if (compiled) { // Compiled function consists of simple expressions such as addition, // subtraction, Math.max, and also contains 'var' and 'return' // statements. See the generation in the PostScriptCompiler below. /*jshint -W054 */ return new Function('src', 'srcOffset', 'dest', 'destOffset', compiled); } info('Unable to compile PS function'); var numOutputs = range.length >> 1; var numInputs = domain.length >> 1; var evaluator = new PostScriptEvaluator(code); // Cache the values for a big speed up, the cache size is limited though // since the number of possible values can be huge from a PS function. var cache = Object.create(null); // The MAX_CACHE_SIZE is set to ~4x the maximum number of distinct values // seen in our tests. var MAX_CACHE_SIZE = 2048 * 4; var cache_available = MAX_CACHE_SIZE; var tmpBuf = new Float32Array(numInputs); return function constructPostScriptFromIRResult(src, srcOffset, dest, destOffset) { var i, value; var key = ''; var input = tmpBuf; for (i = 0; i < numInputs; i++) { value = src[srcOffset + i]; input[i] = value; key += value + '_'; } var cachedValue = cache[key]; if (cachedValue !== undefined) { dest.set(cachedValue, destOffset); return; } var output = new Float32Array(numOutputs); var stack = evaluator.execute(input); var stackIndex = stack.length - numOutputs; for (i = 0; i < numOutputs; i++) { value = stack[stackIndex + i]; var bound = range[i * 2]; if (value < bound) { value = bound; } else { bound = range[i * 2 +1]; if (value > bound) { value = bound; } } output[i] = value; } if (cache_available > 0) { cache_available--; cache[key] = output; } dest.set(output, destOffset); }; } }; })(); function isPDFFunction(v) { var fnDict; if (typeof v !== 'object') { return false; } else if (isDict(v)) { fnDict = v; } else if (isStream(v)) { fnDict = v.dict; } else { return false; } return fnDict.has('FunctionType'); } var PostScriptStack = (function PostScriptStackClosure() { var MAX_STACK_SIZE = 100; function PostScriptStack(initialStack) { this.stack = !initialStack ? [] : Array.prototype.slice.call(initialStack, 0); } PostScriptStack.prototype = { push: function PostScriptStack_push(value) { if (this.stack.length >= MAX_STACK_SIZE) { error('PostScript function stack overflow.'); } this.stack.push(value); }, pop: function PostScriptStack_pop() { if (this.stack.length <= 0) { error('PostScript function stack underflow.'); } return this.stack.pop(); }, copy: function PostScriptStack_copy(n) { if (this.stack.length + n >= MAX_STACK_SIZE) { error('PostScript function stack overflow.'); } var stack = this.stack; for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++) { stack.push(stack[i]); } }, index: function PostScriptStack_index(n) { this.push(this.stack[this.stack.length - n - 1]); }, // rotate the last n stack elements p times roll: function PostScriptStack_roll(n, p) { var stack = this.stack; var l = stack.length - n; var r = stack.length - 1, c = l + (p - Math.floor(p / n) * n), i, j, t; for (i = l, j = r; i < j; i++, j--) { t = stack[i]; stack[i] = stack[j]; stack[j] = t; } for (i = l, j = c - 1; i < j; i++, j--) { t = stack[i]; stack[i] = stack[j]; stack[j] = t; } for (i = c, j = r; i < j; i++, j--) { t = stack[i]; stack[i] = stack[j]; stack[j] = t; } } }; return PostScriptStack; })(); var PostScriptEvaluator = (function PostScriptEvaluatorClosure() { function PostScriptEvaluator(operators) { this.operators = operators; } PostScriptEvaluator.prototype = { execute: function PostScriptEvaluator_execute(initialStack) { var stack = new PostScriptStack(initialStack); var counter = 0; var operators = this.operators; var length = operators.length; var operator, a, b; while (counter < length) { operator = operators[counter++]; if (typeof operator === 'number') { // Operator is really an operand and should be pushed to the stack. stack.push(operator); continue; } switch (operator) { // non standard ps operators case 'jz': // jump if false b = stack.pop(); a = stack.pop(); if (!a) { counter = b; } break; case 'j': // jump a = stack.pop(); counter = a; break; // all ps operators in alphabetical order (excluding if/ifelse) case 'abs': a = stack.pop(); stack.push(Math.abs(a)); break; case 'add': b = stack.pop(); a = stack.pop(); stack.push(a + b); break; case 'and': b = stack.pop(); a = stack.pop(); if (isBool(a) && isBool(b)) { stack.push(a && b); } else { stack.push(a & b); } break; case 'atan': a = stack.pop(); stack.push(Math.atan(a)); break; case 'bitshift': b = stack.pop(); a = stack.pop(); if (a > 0) { stack.push(a << b); } else { stack.push(a >> b); } break; case 'ceiling': a = stack.pop(); stack.push(Math.ceil(a)); break; case 'copy': a = stack.pop(); stack.copy(a); break; case 'cos': a = stack.pop(); stack.push(Math.cos(a)); break; case 'cvi': a = stack.pop() | 0; stack.push(a); break; case 'cvr': // noop break; case 'div': b = stack.pop(); a = stack.pop(); stack.push(a / b); break; case 'dup': stack.copy(1); break; case 'eq': b = stack.pop(); a = stack.pop(); stack.push(a === b); break; case 'exch': stack.roll(2, 1); break; case 'exp': b = stack.pop(); a = stack.pop(); stack.push(Math.pow(a, b)); break; case 'false': stack.push(false); break; case 'floor': a = stack.pop(); stack.push(Math.floor(a)); break; case 'ge': b = stack.pop(); a = stack.pop(); stack.push(a >= b); break; case 'gt': b = stack.pop(); a = stack.pop(); stack.push(a > b); break; case 'idiv': b = stack.pop(); a = stack.pop(); stack.push((a / b) | 0); break; case 'index': a = stack.pop(); stack.index(a); break; case 'le': b = stack.pop(); a = stack.pop(); stack.push(a <= b); break; case 'ln': a = stack.pop(); stack.push(Math.log(a)); break; case 'log': a = stack.pop(); stack.push(Math.log(a) / Math.LN10); break; case 'lt': b = stack.pop(); a = stack.pop(); stack.push(a < b); break; case 'mod': b = stack.pop(); a = stack.pop(); stack.push(a % b); break; case 'mul': b = stack.pop(); a = stack.pop(); stack.push(a * b); break; case 'ne': b = stack.pop(); a = stack.pop(); stack.push(a !== b); break; case 'neg': a = stack.pop(); stack.push(-a); break; case 'not': a = stack.pop(); if (isBool(a)) { stack.push(!a); } else { stack.push(~a); } break; case 'or': b = stack.pop(); a = stack.pop(); if (isBool(a) && isBool(b)) { stack.push(a || b); } else { stack.push(a | b); } break; case 'pop': stack.pop(); break; case 'roll': b = stack.pop(); a = stack.pop(); stack.roll(a, b); break; case 'round': a = stack.pop(); stack.push(Math.round(a)); break; case 'sin': a = stack.pop(); stack.push(Math.sin(a)); break; case 'sqrt': a = stack.pop(); stack.push(Math.sqrt(a)); break; case 'sub': b = stack.pop(); a = stack.pop(); stack.push(a - b); break; case 'true': stack.push(true); break; case 'truncate': a = stack.pop(); a = a < 0 ? Math.ceil(a) : Math.floor(a); stack.push(a); break; case 'xor': b = stack.pop(); a = stack.pop(); if (isBool(a) && isBool(b)) { stack.push(a !== b); } else { stack.push(a ^ b); } break; default: error('Unknown operator ' + operator); break; } } return stack.stack; } }; return PostScriptEvaluator; })(); // Most of the PDFs functions consist of simple operations such as: // roll, exch, sub, cvr, pop, index, dup, mul, if, gt, add. // // We can compile most of such programs, and at the same moment, we can // optimize some expressions using basic math properties. Keeping track of // min/max values will allow us to avoid extra Math.min/Math.max calls. var PostScriptCompiler = (function PostScriptCompilerClosure() { function AstNode(type) { this.type = type; } AstNode.prototype.visit = function (visitor) { throw new Error('abstract method'); }; function AstArgument(index, min, max) { AstNode.call(this, 'args'); this.index = index; this.min = min; this.max = max; } AstArgument.prototype = Object.create(AstNode.prototype); AstArgument.prototype.visit = function (visitor) { visitor.visitArgument(this); }; function AstLiteral(number) { AstNode.call(this, 'literal'); this.number = number; this.min = number; this.max = number; } AstLiteral.prototype = Object.create(AstNode.prototype); AstLiteral.prototype.visit = function (visitor) { visitor.visitLiteral(this); }; function AstBinaryOperation(op, arg1, arg2, min, max) { AstNode.call(this, 'binary'); this.op = op; this.arg1 = arg1; this.arg2 = arg2; this.min = min; this.max = max; } AstBinaryOperation.prototype = Object.create(AstNode.prototype); AstBinaryOperation.prototype.visit = function (visitor) { visitor.visitBinaryOperation(this); }; function AstMin(arg, max) { AstNode.call(this, 'max'); this.arg = arg; this.min = arg.min; this.max = max; } AstMin.prototype = Object.create(AstNode.prototype); AstMin.prototype.visit = function (visitor) { visitor.visitMin(this); }; function AstVariable(index, min, max) { AstNode.call(this, 'var'); this.index = index; this.min = min; this.max = max; } AstVariable.prototype = Object.create(AstNode.prototype); AstVariable.prototype.visit = function (visitor) { visitor.visitVariable(this); }; function AstVariableDefinition(variable, arg) { AstNode.call(this, 'definition'); this.variable = variable; this.arg = arg; } AstVariableDefinition.prototype = Object.create(AstNode.prototype); AstVariableDefinition.prototype.visit = function (visitor) { visitor.visitVariableDefinition(this); }; function ExpressionBuilderVisitor() { this.parts = []; } ExpressionBuilderVisitor.prototype = { visitArgument: function (arg) { this.parts.push('Math.max(', arg.min, ', Math.min(', arg.max, ', src[srcOffset + ', arg.index, ']))'); }, visitVariable: function (variable) { this.parts.push('v', variable.index); }, visitLiteral: function (literal) { this.parts.push(literal.number); }, visitBinaryOperation: function (operation) { this.parts.push('('); operation.arg1.visit(this); this.parts.push(' ', operation.op, ' '); operation.arg2.visit(this); this.parts.push(')'); }, visitVariableDefinition: function (definition) { this.parts.push('var '); definition.variable.visit(this); this.parts.push(' = '); definition.arg.visit(this); this.parts.push(';'); }, visitMin: function (max) { this.parts.push('Math.min('); max.arg.visit(this); this.parts.push(', ', max.max, ')'); }, toString: function () { return this.parts.join(''); } }; function buildAddOperation(num1, num2) { if (num2.type === 'literal' && num2.number === 0) { // optimization: second operand is 0 return num1; } if (num1.type === 'literal' && num1.number === 0) { // optimization: first operand is 0 return num2; } if (num2.type === 'literal' && num1.type === 'literal') { // optimization: operands operand are literals return new AstLiteral(num1.number + num2.number); } return new AstBinaryOperation('+', num1, num2, num1.min + num2.min, num1.max + num2.max); } function buildMulOperation(num1, num2) { if (num2.type === 'literal') { // optimization: second operands is a literal... if (num2.number === 0) { return new AstLiteral(0); // and it's 0 } else if (num2.number === 1) { return num1; // and it's 1 } else if (num1.type === 'literal') { // ... and first operands is a literal too return new AstLiteral(num1.number * num2.number); } } if (num1.type === 'literal') { // optimization: first operands is a literal... if (num1.number === 0) { return new AstLiteral(0); // and it's 0 } else if (num1.number === 1) { return num2; // and it's 1 } } var min = Math.min(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max); var max = Math.max(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max); return new AstBinaryOperation('*', num1, num2, min, max); } function buildSubOperation(num1, num2) { if (num2.type === 'literal') { // optimization: second operands is a literal... if (num2.number === 0) { return num1; // ... and it's 0 } else if (num1.type === 'literal') { // ... and first operands is a literal too return new AstLiteral(num1.number - num2.number); } } if (num2.type === 'binary' && num2.op === '-' && num1.type === 'literal' && num1.number === 1 && num2.arg1.type === 'literal' && num2.arg1.number === 1) { // optimization for case: 1 - (1 - x) return num2.arg2; } return new AstBinaryOperation('-', num1, num2, num1.min - num2.max, num1.max - num2.min); } function buildMinOperation(num1, max) { if (num1.min >= max) { // optimization: num1 min value is not less than required max return new AstLiteral(max); // just returning max } else if (num1.max <= max) { // optimization: num1 max value is not greater than required max return num1; // just returning an argument } return new AstMin(num1, max); } function PostScriptCompiler() {} PostScriptCompiler.prototype = { compile: function PostScriptCompiler_compile(code, domain, range) { var stack = []; var i, ii; var instructions = []; var inputSize = domain.length >> 1, outputSize = range.length >> 1; var lastRegister = 0; var n, j; var num1, num2, ast1, ast2, tmpVar, item; for (i = 0; i < inputSize; i++) { stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1])); } for (i = 0, ii = code.length; i < ii; i++) { item = code[i]; if (typeof item === 'number') { stack.push(new AstLiteral(item)); continue; } switch (item) { case 'add': if (stack.length < 2) { return null; } num2 = stack.pop(); num1 = stack.pop(); stack.push(buildAddOperation(num1, num2)); break; case 'cvr': if (stack.length < 1) { return null; } break; case 'mul': if (stack.length < 2) { return null; } num2 = stack.pop(); num1 = stack.pop(); stack.push(buildMulOperation(num1, num2)); break; case 'sub': if (stack.length < 2) { return null; } num2 = stack.pop(); num1 = stack.pop(); stack.push(buildSubOperation(num1, num2)); break; case 'exch': if (stack.length < 2) { return null; } ast1 = stack.pop(); ast2 = stack.pop(); stack.push(ast1, ast2); break; case 'pop': if (stack.length < 1) { return null; } stack.pop(); break; case 'index': if (stack.length < 1) { return null; } num1 = stack.pop(); if (num1.type !== 'literal') { return null; } n = num1.number; if (n < 0 || (n|0) !== n || stack.length < n) { return null; } ast1 = stack[stack.length - n - 1]; if (ast1.type === 'literal' || ast1.type === 'var') { stack.push(ast1); break; } tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); stack[stack.length - n - 1] = tmpVar; stack.push(tmpVar); instructions.push(new AstVariableDefinition(tmpVar, ast1)); break; case 'dup': if (stack.length < 1) { return null; } if (typeof code[i + 1] === 'number' && code[i + 2] === 'gt' && code[i + 3] === i + 7 && code[i + 4] === 'jz' && code[i + 5] === 'pop' && code[i + 6] === code[i + 1]) { // special case of the commands sequence for the min operation num1 = stack.pop(); stack.push(buildMinOperation(num1, code[i + 1])); i += 6; break; } ast1 = stack[stack.length - 1]; if (ast1.type === 'literal' || ast1.type === 'var') { // we don't have to save into intermediate variable a literal or // variable. stack.push(ast1); break; } tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); stack[stack.length - 1] = tmpVar; stack.push(tmpVar); instructions.push(new AstVariableDefinition(tmpVar, ast1)); break; case 'roll': if (stack.length < 2) { return null; } num2 = stack.pop(); num1 = stack.pop(); if (num2.type !== 'literal' || num1.type !== 'literal') { // both roll operands must be numbers return null; } j = num2.number; n = num1.number; if (n <= 0 || (n|0) !== n || (j|0) !== j || stack.length < n) { // ... and integers return null; } j = ((j % n) + n) % n; if (j === 0) { break; // just skipping -- there are nothing to rotate } Array.prototype.push.apply(stack, stack.splice(stack.length - n, n - j)); break; default: return null; // unsupported operator } } if (stack.length !== outputSize) { return null; } var result = []; instructions.forEach(function (instruction) { var statementBuilder = new ExpressionBuilderVisitor(); instruction.visit(statementBuilder); result.push(statementBuilder.toString()); }); stack.forEach(function (expr, i) { var statementBuilder = new ExpressionBuilderVisitor(); expr.visit(statementBuilder); var min = range[i * 2], max = range[i * 2 + 1]; var out = [statementBuilder.toString()]; if (min > expr.min) { out.unshift('Math.max(', min, ', '); out.push(')'); } if (max < expr.max) { out.unshift('Math.min(', max, ', '); out.push(')'); } out.unshift('dest[destOffset + ', i, '] = '); out.push(';'); result.push(out.join('')); }); return result.join('\n'); } }; return PostScriptCompiler; })(); exports.isPDFFunction = isPDFFunction; exports.PDFFunction = PDFFunction; exports.PostScriptEvaluator = PostScriptEvaluator; exports.PostScriptCompiler = PostScriptCompiler; })); (function (root, factory) { { factory((root.pdfjsCoreColorSpace = {}), root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreFunction); } }(this, function (exports, sharedUtil, corePrimitives, coreFunction) { var error = sharedUtil.error; var info = sharedUtil.info; var isArray = sharedUtil.isArray; var isString = sharedUtil.isString; var shadow = sharedUtil.shadow; var warn = sharedUtil.warn; var isDict = corePrimitives.isDict; var isName = corePrimitives.isName; var isStream = corePrimitives.isStream; var PDFFunction = coreFunction.PDFFunction; var coreImage; // see _setCoreImage below var PDFImage; // = coreImage.PDFImage; var ColorSpace = (function ColorSpaceClosure() { // Constructor should define this.numComps, this.defaultColor, this.name function ColorSpace() { error('should not call ColorSpace constructor'); } ColorSpace.prototype = { /** * Converts the color value to the RGB color. The color components are * located in the src array starting from the srcOffset. Returns the array * of the rgb components, each value ranging from [0,255]. */ getRgb: function ColorSpace_getRgb(src, srcOffset) { var rgb = new Uint8Array(3); this.getRgbItem(src, srcOffset, rgb, 0); return rgb; }, /** * Converts the color value to the RGB color, similar to the getRgb method. * The result placed into the dest array starting from the destOffset. */ getRgbItem: function ColorSpace_getRgbItem(src, srcOffset, dest, destOffset) { error('Should not call ColorSpace.getRgbItem'); }, /** * Converts the specified number of the color values to the RGB colors. * The colors are located in the src array starting from the srcOffset. * The result is placed into the dest array starting from the destOffset. * The src array items shall be in [0,2^bits) range, the dest array items * will be in [0,255] range. alpha01 indicates how many alpha components * there are in the dest array; it will be either 0 (RGB array) or 1 (RGBA * array). */ getRgbBuffer: function ColorSpace_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { error('Should not call ColorSpace.getRgbBuffer'); }, /** * Determines the number of bytes required to store the result of the * conversion done by the getRgbBuffer method. As in getRgbBuffer, * |alpha01| is either 0 (RGB output) or 1 (RGBA output). */ getOutputLength: function ColorSpace_getOutputLength(inputLength, alpha01) { error('Should not call ColorSpace.getOutputLength'); }, /** * Returns true if source data will be equal the result/output data. */ isPassthrough: function ColorSpace_isPassthrough(bits) { return false; }, /** * Fills in the RGB colors in the destination buffer. alpha01 indicates * how many alpha components there are in the dest array; it will be either * 0 (RGB array) or 1 (RGBA array). */ fillRgb: function ColorSpace_fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) { var count = originalWidth * originalHeight; var rgbBuf = null; var numComponentColors = 1 << bpc; var needsResizing = originalHeight !== height || originalWidth !== width; var i, ii; if (this.isPassthrough(bpc)) { rgbBuf = comps; } else if (this.numComps === 1 && count > numComponentColors && this.name !== 'DeviceGray' && this.name !== 'DeviceRGB') { // Optimization: create a color map when there is just one component and // we are converting more colors than the size of the color map. We // don't build the map if the colorspace is gray or rgb since those // methods are faster than building a map. This mainly offers big speed // ups for indexed and alternate colorspaces. // // TODO it may be worth while to cache the color map. While running // testing I never hit a cache so I will leave that out for now (perhaps // we are reparsing colorspaces too much?). var allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : new Uint16Array(numComponentColors); var key; for (i = 0; i < numComponentColors; i++) { allColors[i] = i; } var colorMap = new Uint8Array(numComponentColors * 3); this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, /* alpha01 = */ 0); var destPos, rgbPos; if (!needsResizing) { // Fill in the RGB values directly into |dest|. destPos = 0; for (i = 0; i < count; ++i) { key = comps[i] * 3; dest[destPos++] = colorMap[key]; dest[destPos++] = colorMap[key + 1]; dest[destPos++] = colorMap[key + 2]; destPos += alpha01; } } else { rgbBuf = new Uint8Array(count * 3); rgbPos = 0; for (i = 0; i < count; ++i) { key = comps[i] * 3; rgbBuf[rgbPos++] = colorMap[key]; rgbBuf[rgbPos++] = colorMap[key + 1]; rgbBuf[rgbPos++] = colorMap[key + 2]; } } } else { if (!needsResizing) { // Fill in the RGB values directly into |dest|. this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, alpha01); } else { rgbBuf = new Uint8Array(count * 3); this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, /* alpha01 = */ 0); } } if (rgbBuf) { if (needsResizing) { PDFImage.resize(rgbBuf, bpc, 3, originalWidth, originalHeight, width, height, dest, alpha01); } else { rgbPos = 0; destPos = 0; for (i = 0, ii = width * actualHeight; i < ii; i++) { dest[destPos++] = rgbBuf[rgbPos++]; dest[destPos++] = rgbBuf[rgbPos++]; dest[destPos++] = rgbBuf[rgbPos++]; destPos += alpha01; } } } }, /** * True if the colorspace has components in the default range of [0, 1]. * This should be true for all colorspaces except for lab color spaces * which are [0,100], [-128, 127], [-128, 127]. */ usesZeroToOneRange: true }; ColorSpace.parse = function ColorSpace_parse(cs, xref, res) { var IR = ColorSpace.parseToIR(cs, xref, res); if (IR instanceof AlternateCS) { return IR; } return ColorSpace.fromIR(IR); }; ColorSpace.fromIR = function ColorSpace_fromIR(IR) { var name = isArray(IR) ? IR[0] : IR; var whitePoint, blackPoint, gamma; switch (name) { case 'DeviceGrayCS': return this.singletons.gray; case 'DeviceRgbCS': return this.singletons.rgb; case 'DeviceCmykCS': return this.singletons.cmyk; case 'CalGrayCS': whitePoint = IR[1]; blackPoint = IR[2]; gamma = IR[3]; return new CalGrayCS(whitePoint, blackPoint, gamma); case 'CalRGBCS': whitePoint = IR[1]; blackPoint = IR[2]; gamma = IR[3]; var matrix = IR[4]; return new CalRGBCS(whitePoint, blackPoint, gamma, matrix); case 'PatternCS': var basePatternCS = IR[1]; if (basePatternCS) { basePatternCS = ColorSpace.fromIR(basePatternCS); } return new PatternCS(basePatternCS); case 'IndexedCS': var baseIndexedCS = IR[1]; var hiVal = IR[2]; var lookup = IR[3]; return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup); case 'AlternateCS': var numComps = IR[1]; var alt = IR[2]; var tintFnIR = IR[3]; return new AlternateCS(numComps, ColorSpace.fromIR(alt), PDFFunction.fromIR(tintFnIR)); case 'LabCS': whitePoint = IR[1]; blackPoint = IR[2]; var range = IR[3]; return new LabCS(whitePoint, blackPoint, range); default: error('Unknown name ' + name); } return null; }; ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) { if (isName(cs)) { var colorSpaces = res.get('ColorSpace'); if (isDict(colorSpaces)) { var refcs = colorSpaces.get(cs.name); if (refcs) { cs = refcs; } } } cs = xref.fetchIfRef(cs); var mode; if (isName(cs)) { mode = cs.name; this.mode = mode; switch (mode) { case 'DeviceGray': case 'G': return 'DeviceGrayCS'; case 'DeviceRGB': case 'RGB': return 'DeviceRgbCS'; case 'DeviceCMYK': case 'CMYK': return 'DeviceCmykCS'; case 'Pattern': return ['PatternCS', null]; default: error('unrecognized colorspace ' + mode); } } else if (isArray(cs)) { mode = xref.fetchIfRef(cs[0]).name; this.mode = mode; var numComps, params, alt, whitePoint, blackPoint, gamma; switch (mode) { case 'DeviceGray': case 'G': return 'DeviceGrayCS'; case 'DeviceRGB': case 'RGB': return 'DeviceRgbCS'; case 'DeviceCMYK': case 'CMYK': return 'DeviceCmykCS'; case 'CalGray': params = xref.fetchIfRef(cs[1]); whitePoint = params.get('WhitePoint'); blackPoint = params.get('BlackPoint'); gamma = params.get('Gamma'); return ['CalGrayCS', whitePoint, blackPoint, gamma]; case 'CalRGB': params = xref.fetchIfRef(cs[1]); whitePoint = params.get('WhitePoint'); blackPoint = params.get('BlackPoint'); gamma = params.get('Gamma'); var matrix = params.get('Matrix'); return ['CalRGBCS', whitePoint, blackPoint, gamma, matrix]; case 'ICCBased': var stream = xref.fetchIfRef(cs[1]); var dict = stream.dict; numComps = dict.get('N'); alt = dict.get('Alternate'); if (alt) { var altIR = ColorSpace.parseToIR(alt, xref, res); // Parse the /Alternate CS to ensure that the number of components // are correct, and also (indirectly) that it is not a PatternCS. var altCS = ColorSpace.fromIR(altIR); if (altCS.numComps === numComps) { return altIR; } warn('ICCBased color space: Ignoring incorrect /Alternate entry.'); } if (numComps === 1) { return 'DeviceGrayCS'; } else if (numComps === 3) { return 'DeviceRgbCS'; } else if (numComps === 4) { return 'DeviceCmykCS'; } break; case 'Pattern': var basePatternCS = cs[1] || null; if (basePatternCS) { basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res); } return ['PatternCS', basePatternCS]; case 'Indexed': case 'I': var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res); var hiVal = xref.fetchIfRef(cs[2]) + 1; var lookup = xref.fetchIfRef(cs[3]); if (isStream(lookup)) { lookup = lookup.getBytes(); } return ['IndexedCS', baseIndexedCS, hiVal, lookup]; case 'Separation': case 'DeviceN': var name = xref.fetchIfRef(cs[1]); numComps = 1; if (isName(name)) { numComps = 1; } else if (isArray(name)) { numComps = name.length; } alt = ColorSpace.parseToIR(cs[2], xref, res); var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3])); return ['AlternateCS', numComps, alt, tintFnIR]; case 'Lab': params = xref.fetchIfRef(cs[1]); whitePoint = params.get('WhitePoint'); blackPoint = params.get('BlackPoint'); var range = params.get('Range'); return ['LabCS', whitePoint, blackPoint, range]; default: error('unimplemented color space object "' + mode + '"'); } } else { error('unrecognized color space object: "' + cs + '"'); } return null; }; /** * Checks if a decode map matches the default decode map for a color space. * This handles the general decode maps where there are two values per * component. e.g. [0, 1, 0, 1, 0, 1] for a RGB color. * This does not handle Lab, Indexed, or Pattern decode maps since they are * slightly different. * @param {Array} decode Decode map (usually from an image). * @param {Number} n Number of components the color space has. */ ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) { if (!isArray(decode)) { return true; } if (n * 2 !== decode.length) { warn('The decode map is not the correct length'); return true; } for (var i = 0, ii = decode.length; i < ii; i += 2) { if (decode[i] !== 0 || decode[i + 1] !== 1) { return false; } } return true; }; ColorSpace.singletons = { get gray() { return shadow(this, 'gray', new DeviceGrayCS()); }, get rgb() { return shadow(this, 'rgb', new DeviceRgbCS()); }, get cmyk() { return shadow(this, 'cmyk', new DeviceCmykCS()); } }; return ColorSpace; })(); /** * Alternate color space handles both Separation and DeviceN color spaces. A * Separation color space is actually just a DeviceN with one color component. * Both color spaces use a tinting function to convert colors to a base color * space. */ var AlternateCS = (function AlternateCSClosure() { function AlternateCS(numComps, base, tintFn) { this.name = 'Alternate'; this.numComps = numComps; this.defaultColor = new Float32Array(numComps); for (var i = 0; i < numComps; ++i) { this.defaultColor[i] = 1; } this.base = base; this.tintFn = tintFn; this.tmpBuf = new Float32Array(base.numComps); } AlternateCS.prototype = { getRgb: ColorSpace.prototype.getRgb, getRgbItem: function AlternateCS_getRgbItem(src, srcOffset, dest, destOffset) { var tmpBuf = this.tmpBuf; this.tintFn(src, srcOffset, tmpBuf, 0); this.base.getRgbItem(tmpBuf, 0, dest, destOffset); }, getRgbBuffer: function AlternateCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { var tintFn = this.tintFn; var base = this.base; var scale = 1 / ((1 << bits) - 1); var baseNumComps = base.numComps; var usesZeroToOneRange = base.usesZeroToOneRange; var isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) && alpha01 === 0; var pos = isPassthrough ? destOffset : 0; var baseBuf = isPassthrough ? dest : new Uint8Array(baseNumComps * count); var numComps = this.numComps; var scaled = new Float32Array(numComps); var tinted = new Float32Array(baseNumComps); var i, j; if (usesZeroToOneRange) { for (i = 0; i < count; i++) { for (j = 0; j < numComps; j++) { scaled[j] = src[srcOffset++] * scale; } tintFn(scaled, 0, tinted, 0); for (j = 0; j < baseNumComps; j++) { baseBuf[pos++] = tinted[j] * 255; } } } else { for (i = 0; i < count; i++) { for (j = 0; j < numComps; j++) { scaled[j] = src[srcOffset++] * scale; } tintFn(scaled, 0, tinted, 0); base.getRgbItem(tinted, 0, baseBuf, pos); pos += baseNumComps; } } if (!isPassthrough) { base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01); } }, getOutputLength: function AlternateCS_getOutputLength(inputLength, alpha01) { return this.base.getOutputLength(inputLength * this.base.numComps / this.numComps, alpha01); }, isPassthrough: ColorSpace.prototype.isPassthrough, fillRgb: ColorSpace.prototype.fillRgb, isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) { return ColorSpace.isDefaultDecode(decodeMap, this.numComps); }, usesZeroToOneRange: true }; return AlternateCS; })(); var PatternCS = (function PatternCSClosure() { function PatternCS(baseCS) { this.name = 'Pattern'; this.base = baseCS; } PatternCS.prototype = {}; return PatternCS; })(); var IndexedCS = (function IndexedCSClosure() { function IndexedCS(base, highVal, lookup) { this.name = 'Indexed'; this.numComps = 1; this.defaultColor = new Uint8Array([0]); this.base = base; this.highVal = highVal; var baseNumComps = base.numComps; var length = baseNumComps * highVal; var lookupArray; if (isStream(lookup)) { lookupArray = new Uint8Array(length); var bytes = lookup.getBytes(length); lookupArray.set(bytes); } else if (isString(lookup)) { lookupArray = new Uint8Array(length); for (var i = 0; i < length; ++i) { lookupArray[i] = lookup.charCodeAt(i); } } else if (lookup instanceof Uint8Array || lookup instanceof Array) { lookupArray = lookup; } else { error('Unrecognized lookup table: ' + lookup); } this.lookup = lookupArray; } IndexedCS.prototype = { getRgb: ColorSpace.prototype.getRgb, getRgbItem: function IndexedCS_getRgbItem(src, srcOffset, dest, destOffset) { var numComps = this.base.numComps; var start = src[srcOffset] * numComps; this.base.getRgbItem(this.lookup, start, dest, destOffset); }, getRgbBuffer: function IndexedCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { var base = this.base; var numComps = base.numComps; var outputDelta = base.getOutputLength(numComps, alpha01); var lookup = this.lookup; for (var i = 0; i < count; ++i) { var lookupPos = src[srcOffset++] * numComps; base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01); destOffset += outputDelta; } }, getOutputLength: function IndexedCS_getOutputLength(inputLength, alpha01) { return this.base.getOutputLength(inputLength * this.base.numComps, alpha01); }, isPassthrough: ColorSpace.prototype.isPassthrough, fillRgb: ColorSpace.prototype.fillRgb, isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) { // indexed color maps shouldn't be changed return true; }, usesZeroToOneRange: true }; return IndexedCS; })(); var DeviceGrayCS = (function DeviceGrayCSClosure() { function DeviceGrayCS() { this.name = 'DeviceGray'; this.numComps = 1; this.defaultColor = new Float32Array([0]); } DeviceGrayCS.prototype = { getRgb: ColorSpace.prototype.getRgb, getRgbItem: function DeviceGrayCS_getRgbItem(src, srcOffset, dest, destOffset) { var c = (src[srcOffset] * 255) | 0; c = c < 0 ? 0 : c > 255 ? 255 : c; dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c; }, getRgbBuffer: function DeviceGrayCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { var scale = 255 / ((1 << bits) - 1); var j = srcOffset, q = destOffset; for (var i = 0; i < count; ++i) { var c = (scale * src[j++]) | 0; dest[q++] = c; dest[q++] = c; dest[q++] = c; q += alpha01; } }, getOutputLength: function DeviceGrayCS_getOutputLength(inputLength, alpha01) { return inputLength * (3 + alpha01); }, isPassthrough: ColorSpace.prototype.isPassthrough, fillRgb: ColorSpace.prototype.fillRgb, isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) { return ColorSpace.isDefaultDecode(decodeMap, this.numComps); }, usesZeroToOneRange: true }; return DeviceGrayCS; })(); var DeviceRgbCS = (function DeviceRgbCSClosure() { function DeviceRgbCS() { this.name = 'DeviceRGB'; this.numComps = 3; this.defaultColor = new Float32Array([0, 0, 0]); } DeviceRgbCS.prototype = { getRgb: ColorSpace.prototype.getRgb, getRgbItem: function DeviceRgbCS_getRgbItem(src, srcOffset, dest, destOffset) { var r = (src[srcOffset] * 255) | 0; var g = (src[srcOffset + 1] * 255) | 0; var b = (src[srcOffset + 2] * 255) | 0; dest[destOffset] = r < 0 ? 0 : r > 255 ? 255 : r; dest[destOffset + 1] = g < 0 ? 0 : g > 255 ? 255 : g; dest[destOffset + 2] = b < 0 ? 0 : b > 255 ? 255 : b; }, getRgbBuffer: function DeviceRgbCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { if (bits === 8 && alpha01 === 0) { dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset); return; } var scale = 255 / ((1 << bits) - 1); var j = srcOffset, q = destOffset; for (var i = 0; i < count; ++i) { dest[q++] = (scale * src[j++]) | 0; dest[q++] = (scale * src[j++]) | 0; dest[q++] = (scale * src[j++]) | 0; q += alpha01; } }, getOutputLength: function DeviceRgbCS_getOutputLength(inputLength, alpha01) { return (inputLength * (3 + alpha01) / 3) | 0; }, isPassthrough: function DeviceRgbCS_isPassthrough(bits) { return bits === 8; }, fillRgb: ColorSpace.prototype.fillRgb, isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) { return ColorSpace.isDefaultDecode(decodeMap, this.numComps); }, usesZeroToOneRange: true }; return DeviceRgbCS; })(); var DeviceCmykCS = (function DeviceCmykCSClosure() { // The coefficients below was found using numerical analysis: the method of // steepest descent for the sum((f_i - color_value_i)^2) for r/g/b colors, // where color_value is the tabular value from the table of sampled RGB colors // from CMYK US Web Coated (SWOP) colorspace, and f_i is the corresponding // CMYK color conversion using the estimation below: // f(A, B,.. N) = Acc+Bcm+Ccy+Dck+c+Fmm+Gmy+Hmk+Im+Jyy+Kyk+Ly+Mkk+Nk+255 function convertToRgb(src, srcOffset, srcScale, dest, destOffset) { var c = src[srcOffset + 0] * srcScale; var m = src[srcOffset + 1] * srcScale; var y = src[srcOffset + 2] * srcScale; var k = src[srcOffset + 3] * srcScale; var r = (c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k + -285.2331026137004) + m * (1.7149763477362134 * m - 5.6096736904047315 * y + -17.873870861415444 * k - 5.497006427196366) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 17.5119270841813) + k * (-21.86122147463605 * k - 189.48180835922747) + 255) | 0; var g = (c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k + -79.2970844816548) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 190.9453302588951) + y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) + k * (-20.737325471181034 * k - 187.80453709719578) + 255) | 0; var b = (c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k + -14.183576799673286) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 112.23884253719248) + y * (0.03296041114873217 * y + 115.60384449646641 * k + -193.58209356861505) + k * (-22.33816807309886 * k - 180.12613974708367) + 255) | 0; dest[destOffset] = r > 255 ? 255 : r < 0 ? 0 : r; dest[destOffset + 1] = g > 255 ? 255 : g < 0 ? 0 : g; dest[destOffset + 2] = b > 255 ? 255 : b < 0 ? 0 : b; } function DeviceCmykCS() { this.name = 'DeviceCMYK'; this.numComps = 4; this.defaultColor = new Float32Array([0, 0, 0, 1]); } DeviceCmykCS.prototype = { getRgb: ColorSpace.prototype.getRgb, getRgbItem: function DeviceCmykCS_getRgbItem(src, srcOffset, dest, destOffset) { convertToRgb(src, srcOffset, 1, dest, destOffset); }, getRgbBuffer: function DeviceCmykCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { var scale = 1 / ((1 << bits) - 1); for (var i = 0; i < count; i++) { convertToRgb(src, srcOffset, scale, dest, destOffset); srcOffset += 4; destOffset += 3 + alpha01; } }, getOutputLength: function DeviceCmykCS_getOutputLength(inputLength, alpha01) { return (inputLength / 4 * (3 + alpha01)) | 0; }, isPassthrough: ColorSpace.prototype.isPassthrough, fillRgb: ColorSpace.prototype.fillRgb, isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) { return ColorSpace.isDefaultDecode(decodeMap, this.numComps); }, usesZeroToOneRange: true }; return DeviceCmykCS; })(); // // CalGrayCS: Based on "PDF Reference, Sixth Ed", p.245 // var CalGrayCS = (function CalGrayCSClosure() { function CalGrayCS(whitePoint, blackPoint, gamma) { this.name = 'CalGray'; this.numComps = 1; this.defaultColor = new Float32Array([0]); if (!whitePoint) { error('WhitePoint missing - required for color space CalGray'); } blackPoint = blackPoint || [0, 0, 0]; gamma = gamma || 1; // Translate arguments to spec variables. this.XW = whitePoint[0]; this.YW = whitePoint[1]; this.ZW = whitePoint[2]; this.XB = blackPoint[0]; this.YB = blackPoint[1]; this.ZB = blackPoint[2]; this.G = gamma; // Validate variables as per spec. if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { error('Invalid WhitePoint components for ' + this.name + ', no fallback available'); } if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { info('Invalid BlackPoint for ' + this.name + ', falling back to default'); this.XB = this.YB = this.ZB = 0; } if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) { warn(this.name + ', BlackPoint: XB: ' + this.XB + ', YB: ' + this.YB + ', ZB: ' + this.ZB + ', only default values are supported.'); } if (this.G < 1) { info('Invalid Gamma: ' + this.G + ' for ' + this.name + ', falling back to default'); this.G = 1; } } function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) { // A represents a gray component of a calibrated gray space. // A <---> AG in the spec var A = src[srcOffset] * scale; var AG = Math.pow(A, cs.G); // Computes L as per spec. ( = cs.YW * AG ) // Except if other than default BlackPoint values are used. var L = cs.YW * AG; // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html, Ch 4. // Convert values to rgb range [0, 255]. var val = Math.max(295.8 * Math.pow(L, 0.333333333333333333) - 40.8, 0) | 0; dest[destOffset] = val; dest[destOffset + 1] = val; dest[destOffset + 2] = val; } CalGrayCS.prototype = { getRgb: ColorSpace.prototype.getRgb, getRgbItem: function CalGrayCS_getRgbItem(src, srcOffset, dest, destOffset) { convertToRgb(this, src, srcOffset, dest, destOffset, 1); }, getRgbBuffer: function CalGrayCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { var scale = 1 / ((1 << bits) - 1); for (var i = 0; i < count; ++i) { convertToRgb(this, src, srcOffset, dest, destOffset, scale); srcOffset += 1; destOffset += 3 + alpha01; } }, getOutputLength: function CalGrayCS_getOutputLength(inputLength, alpha01) { return inputLength * (3 + alpha01); }, isPassthrough: ColorSpace.prototype.isPassthrough, fillRgb: ColorSpace.prototype.fillRgb, isDefaultDecode: function CalGrayCS_isDefaultDecode(decodeMap) { return ColorSpace.isDefaultDecode(decodeMap, this.numComps); }, usesZeroToOneRange: true }; return CalGrayCS; })(); // // CalRGBCS: Based on "PDF Reference, Sixth Ed", p.247 // var CalRGBCS = (function CalRGBCSClosure() { // See http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html for these // matrices. var BRADFORD_SCALE_MATRIX = new Float32Array([ 0.8951, 0.2664, -0.1614, -0.7502, 1.7135, 0.0367, 0.0389, -0.0685, 1.0296]); var BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([ 0.9869929, -0.1470543, 0.1599627, 0.4323053, 0.5183603, 0.0492912, -0.0085287, 0.0400428, 0.9684867]); // See http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html. var SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([ 3.2404542, -1.5371385, -0.4985314, -0.9692660, 1.8760108, 0.0415560, 0.0556434, -0.2040259, 1.0572252]); var FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]); var tempNormalizeMatrix = new Float32Array(3); var tempConvertMatrix1 = new Float32Array(3); var tempConvertMatrix2 = new Float32Array(3); var DECODE_L_CONSTANT = Math.pow(((8 + 16) / 116), 3) / 8.0; function CalRGBCS(whitePoint, blackPoint, gamma, matrix) { this.name = 'CalRGB'; this.numComps = 3; this.defaultColor = new Float32Array(3); if (!whitePoint) { error('WhitePoint missing - required for color space CalRGB'); } blackPoint = blackPoint || new Float32Array(3); gamma = gamma || new Float32Array([1, 1, 1]); matrix = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); // Translate arguments to spec variables. var XW = whitePoint[0]; var YW = whitePoint[1]; var ZW = whitePoint[2]; this.whitePoint = whitePoint; var XB = blackPoint[0]; var YB = blackPoint[1]; var ZB = blackPoint[2]; this.blackPoint = blackPoint; this.GR = gamma[0]; this.GG = gamma[1]; this.GB = gamma[2]; this.MXA = matrix[0]; this.MYA = matrix[1]; this.MZA = matrix[2]; this.MXB = matrix[3]; this.MYB = matrix[4]; this.MZB = matrix[5]; this.MXC = matrix[6]; this.MYC = matrix[7]; this.MZC = matrix[8]; // Validate variables as per spec. if (XW < 0 || ZW < 0 || YW !== 1) { error('Invalid WhitePoint components for ' + this.name + ', no fallback available'); } if (XB < 0 || YB < 0 || ZB < 0) { info('Invalid BlackPoint for ' + this.name + ' [' + XB + ', ' + YB + ', ' + ZB + '], falling back to default'); this.blackPoint = new Float32Array(3); } if (this.GR < 0 || this.GG < 0 || this.GB < 0) { info('Invalid Gamma [' + this.GR + ', ' + this.GG + ', ' + this.GB + '] for ' + this.name + ', falling back to default'); this.GR = this.GG = this.GB = 1; } if (this.MXA < 0 || this.MYA < 0 || this.MZA < 0 || this.MXB < 0 || this.MYB < 0 || this.MZB < 0 || this.MXC < 0 || this.MYC < 0 || this.MZC < 0) { info('Invalid Matrix for ' + this.name + ' [' + this.MXA + ', ' + this.MYA + ', ' + this.MZA + this.MXB + ', ' + this.MYB + ', ' + this.MZB + this.MXC + ', ' + this.MYC + ', ' + this.MZC + '], falling back to default'); this.MXA = this.MYB = this.MZC = 1; this.MXB = this.MYA = this.MZA = this.MXC = this.MYC = this.MZB = 0; } } function matrixProduct(a, b, result) { result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2]; result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2]; } function convertToFlat(sourceWhitePoint, LMS, result) { result[0] = LMS[0] * 1 / sourceWhitePoint[0]; result[1] = LMS[1] * 1 / sourceWhitePoint[1]; result[2] = LMS[2] * 1 / sourceWhitePoint[2]; } function convertToD65(sourceWhitePoint, LMS, result) { var D65X = 0.95047; var D65Y = 1; var D65Z = 1.08883; result[0] = LMS[0] * D65X / sourceWhitePoint[0]; result[1] = LMS[1] * D65Y / sourceWhitePoint[1]; result[2] = LMS[2] * D65Z / sourceWhitePoint[2]; } function sRGBTransferFunction(color) { // See http://en.wikipedia.org/wiki/SRGB. if (color <= 0.0031308){ return adjustToRange(0, 1, 12.92 * color); } return adjustToRange(0, 1, (1 + 0.055) * Math.pow(color, 1 / 2.4) - 0.055); } function adjustToRange(min, max, value) { return Math.max(min, Math.min(max, value)); } function decodeL(L) { if (L < 0) { return -decodeL(-L); } if (L > 8.0) { return Math.pow(((L + 16) / 116), 3); } return L * DECODE_L_CONSTANT; } function compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) { // In case the blackPoint is already the default blackPoint then there is // no need to do compensation. if (sourceBlackPoint[0] === 0 && sourceBlackPoint[1] === 0 && sourceBlackPoint[2] === 0) { result[0] = XYZ_Flat[0]; result[1] = XYZ_Flat[1]; result[2] = XYZ_Flat[2]; return; } // For the blackPoint calculation details, please see // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/ // AdobeBPC.pdf. // The destination blackPoint is the default blackPoint [0, 0, 0]. var zeroDecodeL = decodeL(0); var X_DST = zeroDecodeL; var X_SRC = decodeL(sourceBlackPoint[0]); var Y_DST = zeroDecodeL; var Y_SRC = decodeL(sourceBlackPoint[1]); var Z_DST = zeroDecodeL; var Z_SRC = decodeL(sourceBlackPoint[2]); var X_Scale = (1 - X_DST) / (1 - X_SRC); var X_Offset = 1 - X_Scale; var Y_Scale = (1 - Y_DST) / (1 - Y_SRC); var Y_Offset = 1 - Y_Scale; var Z_Scale = (1 - Z_DST) / (1 - Z_SRC); var Z_Offset = 1 - Z_Scale; result[0] = XYZ_Flat[0] * X_Scale + X_Offset; result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset; result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset; } function normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) { // In case the whitePoint is already flat then there is no need to do // normalization. if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) { result[0] = XYZ_In[0]; result[1] = XYZ_In[1]; result[2] = XYZ_In[2]; return; } var LMS = result; matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS); var LMS_Flat = tempNormalizeMatrix; convertToFlat(sourceWhitePoint, LMS, LMS_Flat); matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result); } function normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) { var LMS = result; matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS); var LMS_D65 = tempNormalizeMatrix; convertToD65(sourceWhitePoint, LMS, LMS_D65); matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result); } function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) { // A, B and C represent a red, green and blue components of a calibrated // rgb space. var A = adjustToRange(0, 1, src[srcOffset] * scale); var B = adjustToRange(0, 1, src[srcOffset + 1] * scale); var C = adjustToRange(0, 1, src[srcOffset + 2] * scale); // A <---> AGR in the spec // B <---> BGG in the spec // C <---> CGB in the spec var AGR = Math.pow(A, cs.GR); var BGG = Math.pow(B, cs.GG); var CGB = Math.pow(C, cs.GB); // Computes intermediate variables L, M, N as per spec. // To decode X, Y, Z values map L, M, N directly to them. var X = cs.MXA * AGR + cs.MXB * BGG + cs.MXC * CGB; var Y = cs.MYA * AGR + cs.MYB * BGG + cs.MYC * CGB; var Z = cs.MZA * AGR + cs.MZB * BGG + cs.MZC * CGB; // The following calculations are based on this document: // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/ // AdobeBPC.pdf. var XYZ = tempConvertMatrix1; XYZ[0] = X; XYZ[1] = Y; XYZ[2] = Z; var XYZ_Flat = tempConvertMatrix2; normalizeWhitePointToFlat(cs.whitePoint, XYZ, XYZ_Flat); var XYZ_Black = tempConvertMatrix1; compensateBlackPoint(cs.blackPoint, XYZ_Flat, XYZ_Black); var XYZ_D65 = tempConvertMatrix2; normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65); var SRGB = tempConvertMatrix1; matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB); var sR = sRGBTransferFunction(SRGB[0]); var sG = sRGBTransferFunction(SRGB[1]); var sB = sRGBTransferFunction(SRGB[2]); // Convert the values to rgb range [0, 255]. dest[destOffset] = Math.round(sR * 255); dest[destOffset + 1] = Math.round(sG * 255); dest[destOffset + 2] = Math.round(sB * 255); } CalRGBCS.prototype = { getRgb: function CalRGBCS_getRgb(src, srcOffset) { var rgb = new Uint8Array(3); this.getRgbItem(src, srcOffset, rgb, 0); return rgb; }, getRgbItem: function CalRGBCS_getRgbItem(src, srcOffset, dest, destOffset) { convertToRgb(this, src, srcOffset, dest, destOffset, 1); }, getRgbBuffer: function CalRGBCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { var scale = 1 / ((1 << bits) - 1); for (var i = 0; i < count; ++i) { convertToRgb(this, src, srcOffset, dest, destOffset, scale); srcOffset += 3; destOffset += 3 + alpha01; } }, getOutputLength: function CalRGBCS_getOutputLength(inputLength, alpha01) { return (inputLength * (3 + alpha01) / 3) | 0; }, isPassthrough: ColorSpace.prototype.isPassthrough, fillRgb: ColorSpace.prototype.fillRgb, isDefaultDecode: function CalRGBCS_isDefaultDecode(decodeMap) { return ColorSpace.isDefaultDecode(decodeMap, this.numComps); }, usesZeroToOneRange: true }; return CalRGBCS; })(); // // LabCS: Based on "PDF Reference, Sixth Ed", p.250 // var LabCS = (function LabCSClosure() { function LabCS(whitePoint, blackPoint, range) { this.name = 'Lab'; this.numComps = 3; this.defaultColor = new Float32Array([0, 0, 0]); if (!whitePoint) { error('WhitePoint missing - required for color space Lab'); } blackPoint = blackPoint || [0, 0, 0]; range = range || [-100, 100, -100, 100]; // Translate args to spec variables this.XW = whitePoint[0]; this.YW = whitePoint[1]; this.ZW = whitePoint[2]; this.amin = range[0]; this.amax = range[1]; this.bmin = range[2]; this.bmax = range[3]; // These are here just for completeness - the spec doesn't offer any // formulas that use BlackPoint in Lab this.XB = blackPoint[0]; this.YB = blackPoint[1]; this.ZB = blackPoint[2]; // Validate vars as per spec if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { error('Invalid WhitePoint components, no fallback available'); } if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { info('Invalid BlackPoint, falling back to default'); this.XB = this.YB = this.ZB = 0; } if (this.amin > this.amax || this.bmin > this.bmax) { info('Invalid Range, falling back to defaults'); this.amin = -100; this.amax = 100; this.bmin = -100; this.bmax = 100; } } // Function g(x) from spec function fn_g(x) { if (x >= 6 / 29) { return x * x * x; } else { return (108 / 841) * (x - 4 / 29); } } function decode(value, high1, low2, high2) { return low2 + (value) * (high2 - low2) / (high1); } // If decoding is needed maxVal should be 2^bits per component - 1. function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) { // XXX: Lab input is in the range of [0, 100], [amin, amax], [bmin, bmax] // not the usual [0, 1]. If a command like setFillColor is used the src // values will already be within the correct range. However, if we are // converting an image we have to map the values to the correct range given // above. // Ls,as,bs <---> L*,a*,b* in the spec var Ls = src[srcOffset]; var as = src[srcOffset + 1]; var bs = src[srcOffset + 2]; if (maxVal !== false) { Ls = decode(Ls, maxVal, 0, 100); as = decode(as, maxVal, cs.amin, cs.amax); bs = decode(bs, maxVal, cs.bmin, cs.bmax); } // Adjust limits of 'as' and 'bs' as = as > cs.amax ? cs.amax : as < cs.amin ? cs.amin : as; bs = bs > cs.bmax ? cs.bmax : bs < cs.bmin ? cs.bmin : bs; // Computes intermediate variables X,Y,Z as per spec var M = (Ls + 16) / 116; var L = M + (as / 500); var N = M - (bs / 200); var X = cs.XW * fn_g(L); var Y = cs.YW * fn_g(M); var Z = cs.ZW * fn_g(N); var r, g, b; // Using different conversions for D50 and D65 white points, // per http://www.color.org/srgb.pdf if (cs.ZW < 1) { // Assuming D50 (X=0.9642, Y=1.00, Z=0.8249) r = X * 3.1339 + Y * -1.6170 + Z * -0.4906; g = X * -0.9785 + Y * 1.9160 + Z * 0.0333; b = X * 0.0720 + Y * -0.2290 + Z * 1.4057; } else { // Assuming D65 (X=0.9505, Y=1.00, Z=1.0888) r = X * 3.2406 + Y * -1.5372 + Z * -0.4986; g = X * -0.9689 + Y * 1.8758 + Z * 0.0415; b = X * 0.0557 + Y * -0.2040 + Z * 1.0570; } // clamp color values to [0,1] range then convert to [0,255] range. dest[destOffset] = r <= 0 ? 0 : r >= 1 ? 255 : Math.sqrt(r) * 255 | 0; dest[destOffset + 1] = g <= 0 ? 0 : g >= 1 ? 255 : Math.sqrt(g) * 255 | 0; dest[destOffset + 2] = b <= 0 ? 0 : b >= 1 ? 255 : Math.sqrt(b) * 255 | 0; } LabCS.prototype = { getRgb: ColorSpace.prototype.getRgb, getRgbItem: function LabCS_getRgbItem(src, srcOffset, dest, destOffset) { convertToRgb(this, src, srcOffset, false, dest, destOffset); }, getRgbBuffer: function LabCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { var maxVal = (1 << bits) - 1; for (var i = 0; i < count; i++) { convertToRgb(this, src, srcOffset, maxVal, dest, destOffset); srcOffset += 3; destOffset += 3 + alpha01; } }, getOutputLength: function LabCS_getOutputLength(inputLength, alpha01) { return (inputLength * (3 + alpha01) / 3) | 0; }, isPassthrough: ColorSpace.prototype.isPassthrough, fillRgb: ColorSpace.prototype.fillRgb, isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) { // XXX: Decoding is handled with the lab conversion because of the strange // ranges that are used. return true; }, usesZeroToOneRange: false }; return LabCS; })(); // TODO refactor to remove dependency on image.js function _setCoreImage(coreImage_) { coreImage = coreImage_; PDFImage = coreImage_.PDFImage; } exports._setCoreImage = _setCoreImage; exports.ColorSpace = ColorSpace; })); (function (root, factory) { { factory((root.pdfjsCoreImage = {}), root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreColorSpace, root.pdfjsCoreStream, root.pdfjsCoreJpx); } }(this, function (exports, sharedUtil, corePrimitives, coreColorSpace, coreStream, coreJpx) { var ImageKind = sharedUtil.ImageKind; var assert = sharedUtil.assert; var error = sharedUtil.error; var info = sharedUtil.info; var isArray = sharedUtil.isArray; var warn = sharedUtil.warn; var Name = corePrimitives.Name; var isStream = corePrimitives.isStream; var ColorSpace = coreColorSpace.ColorSpace; var DecodeStream = coreStream.DecodeStream; var JpegStream = coreStream.JpegStream; var JpxImage = coreJpx.JpxImage; var PDFImage = (function PDFImageClosure() { /** * Decodes the image using native decoder if possible. Resolves the promise * when the image data is ready. */ function handleImageData(image, nativeDecoder) { if (nativeDecoder && nativeDecoder.canDecode(image)) { return nativeDecoder.decode(image); } else { return Promise.resolve(image); } } /** * Decode and clamp a value. The formula is different from the spec because we * don't decode to float range [0,1], we decode it in the [0,max] range. */ function decodeAndClamp(value, addend, coefficient, max) { value = addend + value * coefficient; // Clamp the value to the range return (value < 0 ? 0 : (value > max ? max : value)); } function PDFImage(xref, res, image, inline, smask, mask, isMask) { this.image = image; var dict = image.dict; if (dict.has('Filter')) { var filter = dict.get('Filter').name; if (filter === 'JPXDecode') { var jpxImage = new JpxImage(); jpxImage.parseImageProperties(image.stream); image.stream.reset(); image.bitsPerComponent = jpxImage.bitsPerComponent; image.numComps = jpxImage.componentsCount; } else if (filter === 'JBIG2Decode') { image.bitsPerComponent = 1; image.numComps = 1; } } // TODO cache rendered images? this.width = dict.get('Width', 'W'); this.height = dict.get('Height', 'H'); if (this.width < 1 || this.height < 1) { error('Invalid image width: ' + this.width + ' or height: ' + this.height); } this.interpolate = dict.get('Interpolate', 'I') || false; this.imageMask = dict.get('ImageMask', 'IM') || false; this.matte = dict.get('Matte') || false; var bitsPerComponent = image.bitsPerComponent; if (!bitsPerComponent) { bitsPerComponent = dict.get('BitsPerComponent', 'BPC'); if (!bitsPerComponent) { if (this.imageMask) { bitsPerComponent = 1; } else { error('Bits per component missing in image: ' + this.imageMask); } } } this.bpc = bitsPerComponent; if (!this.imageMask) { var colorSpace = dict.get('ColorSpace', 'CS'); if (!colorSpace) { info('JPX images (which do not require color spaces)'); switch (image.numComps) { case 1: colorSpace = Name.get('DeviceGray'); break; case 3: colorSpace = Name.get('DeviceRGB'); break; case 4: colorSpace = Name.get('DeviceCMYK'); break; default: error('JPX images with ' + this.numComps + ' color components not supported.'); } } this.colorSpace = ColorSpace.parse(colorSpace, xref, res); this.numComps = this.colorSpace.numComps; } this.decode = dict.get('Decode', 'D'); this.needsDecode = false; if (this.decode && ((this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode)) || (isMask && !ColorSpace.isDefaultDecode(this.decode, 1)))) { this.needsDecode = true; // Do some preprocessing to avoid more math. var max = (1 << bitsPerComponent) - 1; this.decodeCoefficients = []; this.decodeAddends = []; for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) { var dmin = this.decode[i]; var dmax = this.decode[i + 1]; this.decodeCoefficients[j] = dmax - dmin; this.decodeAddends[j] = max * dmin; } } if (smask) { this.smask = new PDFImage(xref, res, smask, false); } else if (mask) { if (isStream(mask)) { var maskDict = mask.dict, imageMask = maskDict.get('ImageMask', 'IM'); if (!imageMask) { warn('Ignoring /Mask in image without /ImageMask.'); } else { this.mask = new PDFImage(xref, res, mask, false, null, null, true); } } else { // Color key mask (just an array). this.mask = mask; } } } /** * Handles processing of image data and returns the Promise that is resolved * with a PDFImage when the image is ready to be used. */ PDFImage.buildImage = function PDFImage_buildImage(handler, xref, res, image, inline, nativeDecoder) { var imagePromise = handleImageData(image, nativeDecoder); var smaskPromise; var maskPromise; var smask = image.dict.get('SMask'); var mask = image.dict.get('Mask'); if (smask) { smaskPromise = handleImageData(smask, nativeDecoder); maskPromise = Promise.resolve(null); } else { smaskPromise = Promise.resolve(null); if (mask) { if (isStream(mask)) { maskPromise = handleImageData(mask, nativeDecoder); } else if (isArray(mask)) { maskPromise = Promise.resolve(mask); } else { warn('Unsupported mask format.'); maskPromise = Promise.resolve(null); } } else { maskPromise = Promise.resolve(null); } } return Promise.all([imagePromise, smaskPromise, maskPromise]).then( function(results) { var imageData = results[0]; var smaskData = results[1]; var maskData = results[2]; return new PDFImage(xref, res, imageData, inline, smaskData, maskData); }); }; /** * Resize an image using the nearest neighbor algorithm. Currently only * supports one and three component images. * @param {TypedArray} pixels The original image with one component. * @param {Number} bpc Number of bits per component. * @param {Number} components Number of color components, 1 or 3 is supported. * @param {Number} w1 Original width. * @param {Number} h1 Original height. * @param {Number} w2 New width. * @param {Number} h2 New height. * @param {TypedArray} dest (Optional) The destination buffer. * @param {Number} alpha01 (Optional) Size reserved for the alpha channel. * @return {TypedArray} Resized image data. */ PDFImage.resize = function PDFImage_resize(pixels, bpc, components, w1, h1, w2, h2, dest, alpha01) { if (components !== 1 && components !== 3) { error('Unsupported component count for resizing.'); } var length = w2 * h2 * components; var temp = dest ? dest : (bpc <= 8 ? new Uint8Array(length) : (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length))); var xRatio = w1 / w2; var yRatio = h1 / h2; var i, j, py, newIndex = 0, oldIndex; var xScaled = new Uint16Array(w2); var w1Scanline = w1 * components; if (alpha01 !== 1) { alpha01 = 0; } for (j = 0; j < w2; j++) { xScaled[j] = Math.floor(j * xRatio) * components; } if (components === 1) { for (i = 0; i < h2; i++) { py = Math.floor(i * yRatio) * w1Scanline; for (j = 0; j < w2; j++) { oldIndex = py + xScaled[j]; temp[newIndex++] = pixels[oldIndex]; } } } else if (components === 3) { for (i = 0; i < h2; i++) { py = Math.floor(i * yRatio) * w1Scanline; for (j = 0; j < w2; j++) { oldIndex = py + xScaled[j]; temp[newIndex++] = pixels[oldIndex++]; temp[newIndex++] = pixels[oldIndex++]; temp[newIndex++] = pixels[oldIndex++]; newIndex += alpha01; } } } return temp; }; PDFImage.createMask = function PDFImage_createMask(imgArray, width, height, imageIsFromDecodeStream, inverseDecode) { // |imgArray| might not contain full data for every pixel of the mask, so // we need to distinguish between |computedLength| and |actualLength|. // In particular, if inverseDecode is true, then the array we return must // have a length of |computedLength|. var computedLength = ((width + 7) >> 3) * height; var actualLength = imgArray.byteLength; var haveFullData = computedLength === actualLength; var data, i; if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) { // imgArray came from a DecodeStream and its data is in an appropriate // form, so we can just transfer it. data = imgArray; } else if (!inverseDecode) { data = new Uint8Array(actualLength); data.set(imgArray); } else { data = new Uint8Array(computedLength); data.set(imgArray); for (i = actualLength; i < computedLength; i++) { data[i] = 0xff; } } // If necessary, invert the original mask data (but not any extra we might // have added above). It's safe to modify the array -- whether it's the // original or a copy, we're about to transfer it anyway, so nothing else // in this thread can be relying on its contents. if (inverseDecode) { for (i = 0; i < actualLength; i++) { data[i] = ~data[i]; } } return {data: data, width: width, height: height}; }; PDFImage.prototype = { get drawWidth() { return Math.max(this.width, this.smask && this.smask.width || 0, this.mask && this.mask.width || 0); }, get drawHeight() { return Math.max(this.height, this.smask && this.smask.height || 0, this.mask && this.mask.height || 0); }, decodeBuffer: function PDFImage_decodeBuffer(buffer) { var bpc = this.bpc; var numComps = this.numComps; var decodeAddends = this.decodeAddends; var decodeCoefficients = this.decodeCoefficients; var max = (1 << bpc) - 1; var i, ii; if (bpc === 1) { // If the buffer needed decode that means it just needs to be inverted. for (i = 0, ii = buffer.length; i < ii; i++) { buffer[i] = +!(buffer[i]); } return; } var index = 0; for (i = 0, ii = this.width * this.height; i < ii; i++) { for (var j = 0; j < numComps; j++) { buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], decodeCoefficients[j], max); index++; } } }, getComponents: function PDFImage_getComponents(buffer) { var bpc = this.bpc; // This image doesn't require any extra work. if (bpc === 8) { return buffer; } var width = this.width; var height = this.height; var numComps = this.numComps; var length = width * height * numComps; var bufferPos = 0; var output = (bpc <= 8 ? new Uint8Array(length) : (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length))); var rowComps = width * numComps; var max = (1 << bpc) - 1; var i = 0, ii, buf; if (bpc === 1) { // Optimization for reading 1 bpc images. var mask, loop1End, loop2End; for (var j = 0; j < height; j++) { loop1End = i + (rowComps & ~7); loop2End = i + rowComps; // unroll loop for all full bytes while (i < loop1End) { buf = buffer[bufferPos++]; output[i] = (buf >> 7) & 1; output[i + 1] = (buf >> 6) & 1; output[i + 2] = (buf >> 5) & 1; output[i + 3] = (buf >> 4) & 1; output[i + 4] = (buf >> 3) & 1; output[i + 5] = (buf >> 2) & 1; output[i + 6] = (buf >> 1) & 1; output[i + 7] = buf & 1; i += 8; } // handle remaing bits if (i < loop2End) { buf = buffer[bufferPos++]; mask = 128; while (i < loop2End) { output[i++] = +!!(buf & mask); mask >>= 1; } } } } else { // The general case that handles all other bpc values. var bits = 0; buf = 0; for (i = 0, ii = length; i < ii; ++i) { if (i % rowComps === 0) { buf = 0; bits = 0; } while (bits < bpc) { buf = (buf << 8) | buffer[bufferPos++]; bits += 8; } var remainingBits = bits - bpc; var value = buf >> remainingBits; output[i] = (value < 0 ? 0 : (value > max ? max : value)); buf = buf & ((1 << remainingBits) - 1); bits = remainingBits; } } return output; }, fillOpacity: function PDFImage_fillOpacity(rgbaBuf, width, height, actualHeight, image) { var smask = this.smask; var mask = this.mask; var alphaBuf, sw, sh, i, ii, j; if (smask) { sw = smask.width; sh = smask.height; alphaBuf = new Uint8Array(sw * sh); smask.fillGrayBuffer(alphaBuf); if (sw !== width || sh !== height) { alphaBuf = PDFImage.resize(alphaBuf, smask.bpc, 1, sw, sh, width, height); } } else if (mask) { if (mask instanceof PDFImage) { sw = mask.width; sh = mask.height; alphaBuf = new Uint8Array(sw * sh); mask.numComps = 1; mask.fillGrayBuffer(alphaBuf); // Need to invert values in rgbaBuf for (i = 0, ii = sw * sh; i < ii; ++i) { alphaBuf[i] = 255 - alphaBuf[i]; } if (sw !== width || sh !== height) { alphaBuf = PDFImage.resize(alphaBuf, mask.bpc, 1, sw, sh, width, height); } } else if (isArray(mask)) { // Color key mask: if any of the compontents are outside the range // then they should be painted. alphaBuf = new Uint8Array(width * height); var numComps = this.numComps; for (i = 0, ii = width * height; i < ii; ++i) { var opacity = 0; var imageOffset = i * numComps; for (j = 0; j < numComps; ++j) { var color = image[imageOffset + j]; var maskOffset = j * 2; if (color < mask[maskOffset] || color > mask[maskOffset + 1]) { opacity = 255; break; } } alphaBuf[i] = opacity; } } else { error('Unknown mask format.'); } } if (alphaBuf) { for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { rgbaBuf[j] = alphaBuf[i]; } } else { // No mask. for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { rgbaBuf[j] = 255; } } }, undoPreblend: function PDFImage_undoPreblend(buffer, width, height) { var matte = this.smask && this.smask.matte; if (!matte) { return; } var matteRgb = this.colorSpace.getRgb(matte, 0); var matteR = matteRgb[0]; var matteG = matteRgb[1]; var matteB = matteRgb[2]; var length = width * height * 4; var r, g, b; for (var i = 0; i < length; i += 4) { var alpha = buffer[i + 3]; if (alpha === 0) { // according formula we have to get Infinity in all components // making it white (typical paper color) should be okay buffer[i] = 255; buffer[i + 1] = 255; buffer[i + 2] = 255; continue; } var k = 255 / alpha; r = (buffer[i] - matteR) * k + matteR; g = (buffer[i + 1] - matteG) * k + matteG; b = (buffer[i + 2] - matteB) * k + matteB; buffer[i] = r <= 0 ? 0 : r >= 255 ? 255 : r | 0; buffer[i + 1] = g <= 0 ? 0 : g >= 255 ? 255 : g | 0; buffer[i + 2] = b <= 0 ? 0 : b >= 255 ? 255 : b | 0; } }, createImageData: function PDFImage_createImageData(forceRGBA) { var drawWidth = this.drawWidth; var drawHeight = this.drawHeight; var imgData = { // other fields are filled in below width: drawWidth, height: drawHeight }; var numComps = this.numComps; var originalWidth = this.width; var originalHeight = this.height; var bpc = this.bpc; // Rows start at byte boundary. var rowBytes = (originalWidth * numComps * bpc + 7) >> 3; var imgArray; if (!forceRGBA) { // If it is a 1-bit-per-pixel grayscale (i.e. black-and-white) image // without any complications, we pass a same-sized copy to the main // thread rather than expanding by 32x to RGBA form. This saves *lots* // of memory for many scanned documents. It's also much faster. // // Similarly, if it is a 24-bit-per pixel RGB image without any // complications, we avoid expanding by 1.333x to RGBA form. var kind; if (this.colorSpace.name === 'DeviceGray' && bpc === 1) { kind = ImageKind.GRAYSCALE_1BPP; } else if (this.colorSpace.name === 'DeviceRGB' && bpc === 8 && !this.needsDecode) { kind = ImageKind.RGB_24BPP; } if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) { imgData.kind = kind; imgArray = this.getImageBytes(originalHeight * rowBytes); // If imgArray came from a DecodeStream, we're safe to transfer it // (and thus detach its underlying buffer) because it will constitute // the entire DecodeStream's data. But if it came from a Stream, we // need to copy it because it'll only be a portion of the Stream's // data, and the rest will be read later on. if (this.image instanceof DecodeStream) { imgData.data = imgArray; } else { var newArray = new Uint8Array(imgArray.length); newArray.set(imgArray); imgData.data = newArray; } if (this.needsDecode) { // Invert the buffer (which must be grayscale if we reached here). assert(kind === ImageKind.GRAYSCALE_1BPP); var buffer = imgData.data; for (var i = 0, ii = buffer.length; i < ii; i++) { buffer[i] ^= 0xff; } } return imgData; } if (this.image instanceof JpegStream && !this.smask && !this.mask && (this.colorSpace.name === 'DeviceGray' || this.colorSpace.name === 'DeviceRGB' || this.colorSpace.name === 'DeviceCMYK')) { imgData.kind = ImageKind.RGB_24BPP; imgData.data = this.getImageBytes(originalHeight * rowBytes, drawWidth, drawHeight, true); return imgData; } } imgArray = this.getImageBytes(originalHeight * rowBytes); // imgArray can be incomplete (e.g. after CCITT fax encoding). var actualHeight = 0 | (imgArray.length / rowBytes * drawHeight / originalHeight); var comps = this.getComponents(imgArray); // If opacity data is present, use RGBA_32BPP form. Otherwise, use the // more compact RGB_24BPP form if allowable. var alpha01, maybeUndoPreblend; if (!forceRGBA && !this.smask && !this.mask) { imgData.kind = ImageKind.RGB_24BPP; imgData.data = new Uint8Array(drawWidth * drawHeight * 3); alpha01 = 0; maybeUndoPreblend = false; } else { imgData.kind = ImageKind.RGBA_32BPP; imgData.data = new Uint8Array(drawWidth * drawHeight * 4); alpha01 = 1; maybeUndoPreblend = true; // Color key masking (opacity) must be performed before decoding. this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, comps); } if (this.needsDecode) { this.decodeBuffer(comps); } this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01); if (maybeUndoPreblend) { this.undoPreblend(imgData.data, drawWidth, actualHeight); } return imgData; }, fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) { var numComps = this.numComps; if (numComps !== 1) { error('Reading gray scale from a color image: ' + numComps); } var width = this.width; var height = this.height; var bpc = this.bpc; // rows start at byte boundary var rowBytes = (width * numComps * bpc + 7) >> 3; var imgArray = this.getImageBytes(height * rowBytes); var comps = this.getComponents(imgArray); var i, length; if (bpc === 1) { // inline decoding (= inversion) for 1 bpc images length = width * height; if (this.needsDecode) { // invert and scale to {0, 255} for (i = 0; i < length; ++i) { buffer[i] = (comps[i] - 1) & 255; } } else { // scale to {0, 255} for (i = 0; i < length; ++i) { buffer[i] = (-comps[i]) & 255; } } return; } if (this.needsDecode) { this.decodeBuffer(comps); } length = width * height; // we aren't using a colorspace so we need to scale the value var scale = 255 / ((1 << bpc) - 1); for (i = 0; i < length; ++i) { buffer[i] = (scale * comps[i]) | 0; } }, getImageBytes: function PDFImage_getImageBytes(length, drawWidth, drawHeight, forceRGB) { this.image.reset(); this.image.drawWidth = drawWidth || this.width; this.image.drawHeight = drawHeight || this.height; this.image.forceRGB = !!forceRGB; return this.image.getBytes(length); } }; return PDFImage; })(); exports.PDFImage = PDFImage; // TODO refactor to remove dependency on colorspace.js coreColorSpace._setCoreImage(exports); })); (function (root, factory) { { factory((root.pdfjsCoreObj = {}), root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreCrypto, root.pdfjsCoreParser, root.pdfjsCoreChunkedStream, root.pdfjsCoreColorSpace); } }(this, function (exports, sharedUtil, corePrimitives, coreCrypto, coreParser, coreChunkedStream, coreColorSpace) { var InvalidPDFException = sharedUtil.InvalidPDFException; var MissingDataException = sharedUtil.MissingDataException; var XRefParseException = sharedUtil.XRefParseException; var assert = sharedUtil.assert; var bytesToString = sharedUtil.bytesToString; var createPromiseCapability = sharedUtil.createPromiseCapability; var error = sharedUtil.error; var info = sharedUtil.info; var isArray = sharedUtil.isArray; var isInt = sharedUtil.isInt; var isString = sharedUtil.isString; var shadow = sharedUtil.shadow; var stringToPDFString = sharedUtil.stringToPDFString; var stringToUTF8String = sharedUtil.stringToUTF8String; var warn = sharedUtil.warn; var isValidUrl = sharedUtil.isValidUrl; var Util = sharedUtil.Util; var Ref = corePrimitives.Ref; var RefSet = corePrimitives.RefSet; var RefSetCache = corePrimitives.RefSetCache; var isName = corePrimitives.isName; var isCmd = corePrimitives.isCmd; var isDict = corePrimitives.isDict; var isRef = corePrimitives.isRef; var isStream = corePrimitives.isStream; var CipherTransformFactory = coreCrypto.CipherTransformFactory; var Lexer = coreParser.Lexer; var Parser = coreParser.Parser; var ChunkedStream = coreChunkedStream.ChunkedStream; var ColorSpace = coreColorSpace.ColorSpace; var Catalog = (function CatalogClosure() { function Catalog(pdfManager, xref, pageFactory) { this.pdfManager = pdfManager; this.xref = xref; this.catDict = xref.getCatalogObj(); this.fontCache = new RefSetCache(); assert(isDict(this.catDict), 'catalog object is not a dictionary'); // TODO refactor to move getPage() to the PDFDocument. this.pageFactory = pageFactory; this.pagePromises = []; } Catalog.prototype = { get metadata() { var streamRef = this.catDict.getRaw('Metadata'); if (!isRef(streamRef)) { return shadow(this, 'metadata', null); } var encryptMetadata = (!this.xref.encrypt ? false : this.xref.encrypt.encryptMetadata); var stream = this.xref.fetch(streamRef, !encryptMetadata); var metadata; if (stream && isDict(stream.dict)) { var type = stream.dict.get('Type'); var subtype = stream.dict.get('Subtype'); if (isName(type) && isName(subtype) && type.name === 'Metadata' && subtype.name === 'XML') { // XXX: This should examine the charset the XML document defines, // however since there are currently no real means to decode // arbitrary charsets, let's just hope that the author of the PDF // was reasonable enough to stick with the XML default charset, // which is UTF-8. try { metadata = stringToUTF8String(bytesToString(stream.getBytes())); } catch (e) { info('Skipping invalid metadata.'); } } } return shadow(this, 'metadata', metadata); }, get toplevelPagesDict() { var pagesObj = this.catDict.get('Pages'); assert(isDict(pagesObj), 'invalid top-level pages dictionary'); // shadow the prototype getter return shadow(this, 'toplevelPagesDict', pagesObj); }, get documentOutline() { var obj = null; try { obj = this.readDocumentOutline(); } catch (ex) { if (ex instanceof MissingDataException) { throw ex; } warn('Unable to read document outline'); } return shadow(this, 'documentOutline', obj); }, readDocumentOutline: function Catalog_readDocumentOutline() { var obj = this.catDict.get('Outlines'); if (!isDict(obj)) { return null; } obj = obj.getRaw('First'); if (!isRef(obj)) { return null; } var root = { items: [] }; var queue = [{obj: obj, parent: root}]; // To avoid recursion, keep track of the already processed items. var processed = new RefSet(); processed.put(obj); var xref = this.xref, blackColor = new Uint8Array(3); while (queue.length > 0) { var i = queue.shift(); var outlineDict = xref.fetchIfRef(i.obj); if (outlineDict === null) { continue; } assert(outlineDict.has('Title'), 'Invalid outline item'); var actionDict = outlineDict.get('A'), dest = null, url = null; if (actionDict) { var destEntry = actionDict.get('D'); if (destEntry) { dest = destEntry; } else { var uriEntry = actionDict.get('URI'); if (isString(uriEntry) && isValidUrl(uriEntry, false)) { url = uriEntry; } } } else if (outlineDict.has('Dest')) { dest = outlineDict.getRaw('Dest'); if (isName(dest)) { dest = dest.name; } } var title = outlineDict.get('Title'); var flags = outlineDict.get('F') || 0; var color = outlineDict.get('C'), rgbColor = blackColor; // We only need to parse the color when it's valid, and non-default. if (isArray(color) && color.length === 3 && (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)) { rgbColor = ColorSpace.singletons.rgb.getRgb(color, 0); } var outlineItem = { dest: dest, url: url, title: stringToPDFString(title), color: rgbColor, count: outlineDict.get('Count'), bold: !!(flags & 2), italic: !!(flags & 1), items: [] }; i.parent.items.push(outlineItem); obj = outlineDict.getRaw('First'); if (isRef(obj) && !processed.has(obj)) { queue.push({obj: obj, parent: outlineItem}); processed.put(obj); } obj = outlineDict.getRaw('Next'); if (isRef(obj) && !processed.has(obj)) { queue.push({obj: obj, parent: i.parent}); processed.put(obj); } } return (root.items.length > 0 ? root.items : null); }, get numPages() { var obj = this.toplevelPagesDict.get('Count'); assert( isInt(obj), 'page count in top level pages object is not an integer' ); // shadow the prototype getter return shadow(this, 'num', obj); }, get destinations() { function fetchDestination(dest) { return isDict(dest) ? dest.get('D') : dest; } var xref = this.xref; var dests = {}, nameTreeRef, nameDictionaryRef; var obj = this.catDict.get('Names'); if (obj && obj.has('Dests')) { nameTreeRef = obj.getRaw('Dests'); } else if (this.catDict.has('Dests')) { nameDictionaryRef = this.catDict.get('Dests'); } if (nameDictionaryRef) { // reading simple destination dictionary obj = nameDictionaryRef; obj.forEach(function catalogForEach(key, value) { if (!value) { return; } dests[key] = fetchDestination(value); }); } if (nameTreeRef) { var nameTree = new NameTree(nameTreeRef, xref); var names = nameTree.getAll(); for (var name in names) { dests[name] = fetchDestination(names[name]); } } return shadow(this, 'destinations', dests); }, getDestination: function Catalog_getDestination(destinationId) { function fetchDestination(dest) { return isDict(dest) ? dest.get('D') : dest; } var xref = this.xref; var dest = null, nameTreeRef, nameDictionaryRef; var obj = this.catDict.get('Names'); if (obj && obj.has('Dests')) { nameTreeRef = obj.getRaw('Dests'); } else if (this.catDict.has('Dests')) { nameDictionaryRef = this.catDict.get('Dests'); } if (nameDictionaryRef) { // Simple destination dictionary. var value = nameDictionaryRef.get(destinationId); if (value) { dest = fetchDestination(value); } } if (nameTreeRef) { var nameTree = new NameTree(nameTreeRef, xref); dest = fetchDestination(nameTree.get(destinationId)); } return dest; }, get pageLabels() { var obj = null; try { obj = this.readPageLabels(); } catch (ex) { if (ex instanceof MissingDataException) { throw ex; } warn('Unable to read page labels.'); } return shadow(this, 'pageLabels', obj); }, readPageLabels: function Catalog_readPageLabels() { var obj = this.catDict.getRaw('PageLabels'); if (!obj) { return null; } var pageLabels = new Array(this.numPages); var style = null; var prefix = ''; var start = 1; var numberTree = new NumberTree(obj, this.xref); var nums = numberTree.getAll(); var currentLabel = '', currentIndex = 1; for (var i = 0, ii = this.numPages; i < ii; i++) { if (i in nums) { var labelDict = nums[i]; assert(isDict(labelDict), 'The PageLabel is not a dictionary.'); var type = labelDict.get('Type'); assert(!type || (isName(type) && type.name === 'PageLabel'), 'Invalid type in PageLabel dictionary.'); var s = labelDict.get('S'); assert(!s || isName(s), 'Invalid style in PageLabel dictionary.'); style = (s ? s.name : null); prefix = labelDict.get('P') || ''; assert(isString(prefix), 'Invalid prefix in PageLabel dictionary.'); start = labelDict.get('St') || 1; assert(isInt(start), 'Invalid start in PageLabel dictionary.'); currentIndex = start; } switch (style) { case 'D': currentLabel = currentIndex; break; case 'R': case 'r': currentLabel = Util.toRoman(currentIndex, style === 'r'); break; case 'A': case 'a': var LIMIT = 26; // Use only the characters A--Z, or a--z. var A_UPPER_CASE = 0x41, A_LOWER_CASE = 0x61; var baseCharCode = (style === 'a' ? A_LOWER_CASE : A_UPPER_CASE); var letterIndex = currentIndex - 1; var character = String.fromCharCode(baseCharCode + (letterIndex % LIMIT)); var charBuf = []; for (var j = 0, jj = (letterIndex / LIMIT) | 0; j <= jj; j++) { charBuf.push(character); } currentLabel = charBuf.join(''); break; default: assert(!style, 'Invalid style "' + style + '" in PageLabel dictionary.'); } pageLabels[i] = prefix + currentLabel; currentLabel = ''; currentIndex++; } return pageLabels; }, get attachments() { var xref = this.xref; var attachments = null, nameTreeRef; var obj = this.catDict.get('Names'); if (obj) { nameTreeRef = obj.getRaw('EmbeddedFiles'); } if (nameTreeRef) { var nameTree = new NameTree(nameTreeRef, xref); var names = nameTree.getAll(); for (var name in names) { var fs = new FileSpec(names[name], xref); if (!attachments) { attachments = Object.create(null); } attachments[stringToPDFString(name)] = fs.serializable; } } return shadow(this, 'attachments', attachments); }, get javaScript() { var xref = this.xref; var obj = this.catDict.get('Names'); var javaScript = []; function appendIfJavaScriptDict(jsDict) { var type = jsDict.get('S'); if (!isName(type) || type.name !== 'JavaScript') { return; } var js = jsDict.get('JS'); if (isStream(js)) { js = bytesToString(js.getBytes()); } else if (!isString(js)) { return; } javaScript.push(stringToPDFString(js)); } if (obj && obj.has('JavaScript')) { var nameTree = new NameTree(obj.getRaw('JavaScript'), xref); var names = nameTree.getAll(); for (var name in names) { // We don't really use the JavaScript right now. This code is // defensive so we don't cause errors on document load. var jsDict = names[name]; if (isDict(jsDict)) { appendIfJavaScriptDict(jsDict); } } } // Append OpenAction actions to javaScript array var openactionDict = this.catDict.get('OpenAction'); if (isDict(openactionDict, 'Action')) { var actionType = openactionDict.get('S'); if (isName(actionType) && actionType.name === 'Named') { // The named Print action is not a part of the PDF 1.7 specification, // but is supported by many PDF readers/writers (including Adobe's). var action = openactionDict.get('N'); if (isName(action) && action.name === 'Print') { javaScript.push('print({});'); } } else { appendIfJavaScriptDict(openactionDict); } } return shadow(this, 'javaScript', javaScript); }, cleanup: function Catalog_cleanup() { var promises = []; this.fontCache.forEach(function (promise) { promises.push(promise); }); return Promise.all(promises).then(function (translatedFonts) { for (var i = 0, ii = translatedFonts.length; i < ii; i++) { var font = translatedFonts[i].dict; delete font.translated; } this.fontCache.clear(); }.bind(this)); }, getPage: function Catalog_getPage(pageIndex) { if (!(pageIndex in this.pagePromises)) { this.pagePromises[pageIndex] = this.getPageDict(pageIndex).then( function (a) { var dict = a[0]; var ref = a[1]; return this.pageFactory.createPage(pageIndex, dict, ref, this.fontCache); }.bind(this) ); } return this.pagePromises[pageIndex]; }, getPageDict: function Catalog_getPageDict(pageIndex) { var capability = createPromiseCapability(); var nodesToVisit = [this.catDict.getRaw('Pages')]; var currentPageIndex = 0; var xref = this.xref; var checkAllKids = false; function next() { while (nodesToVisit.length) { var currentNode = nodesToVisit.pop(); if (isRef(currentNode)) { xref.fetchAsync(currentNode).then(function (obj) { if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) { if (pageIndex === currentPageIndex) { capability.resolve([obj, currentNode]); } else { currentPageIndex++; next(); } return; } nodesToVisit.push(obj); next(); }, capability.reject); return; } // Must be a child page dictionary. assert( isDict(currentNode), 'page dictionary kid reference points to wrong type of object' ); var count = currentNode.get('Count'); // If the current node doesn't have any children, avoid getting stuck // in an empty node further down in the tree (see issue5644.pdf). if (count === 0) { checkAllKids = true; } // Skip nodes where the page can't be. if (currentPageIndex + count <= pageIndex) { currentPageIndex += count; continue; } var kids = currentNode.get('Kids'); assert(isArray(kids), 'page dictionary kids object is not an array'); if (!checkAllKids && count === kids.length) { // Nodes that don't have the page have been skipped and this is the // bottom of the tree which means the page requested must be a // descendant of this pages node. Ideally we would just resolve the // promise with the page ref here, but there is the case where more // pages nodes could link to single a page (see issue 3666 pdf). To // handle this push it back on the queue so if it is a pages node it // will be descended into. nodesToVisit = [kids[pageIndex - currentPageIndex]]; currentPageIndex = pageIndex; continue; } else { for (var last = kids.length - 1; last >= 0; last--) { nodesToVisit.push(kids[last]); } } } capability.reject('Page index ' + pageIndex + ' not found.'); } next(); return capability.promise; }, getPageIndex: function Catalog_getPageIndex(ref) { // The page tree nodes have the count of all the leaves below them. To get // how many pages are before we just have to walk up the tree and keep // adding the count of siblings to the left of the node. var xref = this.xref; function pagesBeforeRef(kidRef) { var total = 0; var parentRef; return xref.fetchAsync(kidRef).then(function (node) { if (!node) { return null; } parentRef = node.getRaw('Parent'); return node.getAsync('Parent'); }).then(function (parent) { if (!parent) { return null; } return parent.getAsync('Kids'); }).then(function (kids) { if (!kids) { return null; } var kidPromises = []; var found = false; for (var i = 0; i < kids.length; i++) { var kid = kids[i]; assert(isRef(kid), 'kids must be a ref'); if (kid.num === kidRef.num) { found = true; break; } kidPromises.push(xref.fetchAsync(kid).then(function (kid) { if (kid.has('Count')) { var count = kid.get('Count'); total += count; } else { // page leaf node total++; } })); } if (!found) { error('kid ref not found in parents kids'); } return Promise.all(kidPromises).then(function () { return [total, parentRef]; }); }); } var total = 0; function next(ref) { return pagesBeforeRef(ref).then(function (args) { if (!args) { return total; } var count = args[0]; var parentRef = args[1]; total += count; return next(parentRef); }); } return next(ref); } }; return Catalog; })(); var XRef = (function XRefClosure() { function XRef(stream, password) { this.stream = stream; this.entries = []; this.xrefstms = Object.create(null); // prepare the XRef cache this.cache = []; this.password = password; this.stats = { streamTypes: [], fontTypes: [] }; } XRef.prototype = { setStartXRef: function XRef_setStartXRef(startXRef) { // Store the starting positions of xref tables as we process them // so we can recover from missing data errors this.startXRefQueue = [startXRef]; }, parse: function XRef_parse(recoveryMode) { var trailerDict; if (!recoveryMode) { trailerDict = this.readXRef(); } else { warn('Indexing all PDF objects'); trailerDict = this.indexObjects(); } trailerDict.assignXref(this); this.trailer = trailerDict; var encrypt = trailerDict.get('Encrypt'); if (encrypt) { var ids = trailerDict.get('ID'); var fileId = (ids && ids.length) ? ids[0] : ''; this.encrypt = new CipherTransformFactory(encrypt, fileId, this.password); } // get the root dictionary (catalog) object if (!(this.root = trailerDict.get('Root'))) { error('Invalid root reference'); } }, processXRefTable: function XRef_processXRefTable(parser) { if (!('tableState' in this)) { // Stores state of the table as we process it so we can resume // from middle of table in case of missing data error this.tableState = { entryNum: 0, streamPos: parser.lexer.stream.pos, parserBuf1: parser.buf1, parserBuf2: parser.buf2 }; } var obj = this.readXRefTable(parser); // Sanity check if (!isCmd(obj, 'trailer')) { error('Invalid XRef table: could not find trailer dictionary'); } // Read trailer dictionary, e.g. // trailer // << /Size 22 // /Root 20R // /Info 10R // /ID [ <81b14aafa313db63dbd6f981e49f94f4> ] // >> // The parser goes through the entire stream << ... >> and provides // a getter interface for the key-value table var dict = parser.getObj(); // The pdflib PDF generator can generate a nested trailer dictionary if (!isDict(dict) && dict.dict) { dict = dict.dict; } if (!isDict(dict)) { error('Invalid XRef table: could not parse trailer dictionary'); } delete this.tableState; return dict; }, readXRefTable: function XRef_readXRefTable(parser) { // Example of cross-reference table: // xref // 0 1 <-- subsection header (first obj #, obj count) // 0000000000 65535 f <-- actual object (offset, generation #, f/n) // 23 2 <-- subsection header ... and so on ... // 0000025518 00002 n // 0000025635 00000 n // trailer // ... var stream = parser.lexer.stream; var tableState = this.tableState; stream.pos = tableState.streamPos; parser.buf1 = tableState.parserBuf1; parser.buf2 = tableState.parserBuf2; // Outer loop is over subsection headers var obj; while (true) { if (!('firstEntryNum' in tableState) || !('entryCount' in tableState)) { if (isCmd(obj = parser.getObj(), 'trailer')) { break; } tableState.firstEntryNum = obj; tableState.entryCount = parser.getObj(); } var first = tableState.firstEntryNum; var count = tableState.entryCount; if (!isInt(first) || !isInt(count)) { error('Invalid XRef table: wrong types in subsection header'); } // Inner loop is over objects themselves for (var i = tableState.entryNum; i < count; i++) { tableState.streamPos = stream.pos; tableState.entryNum = i; tableState.parserBuf1 = parser.buf1; tableState.parserBuf2 = parser.buf2; var entry = {}; entry.offset = parser.getObj(); entry.gen = parser.getObj(); var type = parser.getObj(); if (isCmd(type, 'f')) { entry.free = true; } else if (isCmd(type, 'n')) { entry.uncompressed = true; } // Validate entry obj if (!isInt(entry.offset) || !isInt(entry.gen) || !(entry.free || entry.uncompressed)) { error('Invalid entry in XRef subsection: ' + first + ', ' + count); } if (!this.entries[i + first]) { this.entries[i + first] = entry; } } tableState.entryNum = 0; tableState.streamPos = stream.pos; tableState.parserBuf1 = parser.buf1; tableState.parserBuf2 = parser.buf2; delete tableState.firstEntryNum; delete tableState.entryCount; } // Per issue 3248: hp scanners generate bad XRef if (first === 1 && this.entries[1] && this.entries[1].free) { // shifting the entries this.entries.shift(); } // Sanity check: as per spec, first object must be free if (this.entries[0] && !this.entries[0].free) { error('Invalid XRef table: unexpected first object'); } return obj; }, processXRefStream: function XRef_processXRefStream(stream) { if (!('streamState' in this)) { // Stores state of the stream as we process it so we can resume // from middle of stream in case of missing data error var streamParameters = stream.dict; var byteWidths = streamParameters.get('W'); var range = streamParameters.get('Index'); if (!range) { range = [0, streamParameters.get('Size')]; } this.streamState = { entryRanges: range, byteWidths: byteWidths, entryNum: 0, streamPos: stream.pos }; } this.readXRefStream(stream); delete this.streamState; return stream.dict; }, readXRefStream: function XRef_readXRefStream(stream) { var i, j; var streamState = this.streamState; stream.pos = streamState.streamPos; var byteWidths = streamState.byteWidths; var typeFieldWidth = byteWidths[0]; var offsetFieldWidth = byteWidths[1]; var generationFieldWidth = byteWidths[2]; var entryRanges = streamState.entryRanges; while (entryRanges.length > 0) { var first = entryRanges[0]; var n = entryRanges[1]; if (!isInt(first) || !isInt(n)) { error('Invalid XRef range fields: ' + first + ', ' + n); } if (!isInt(typeFieldWidth) || !isInt(offsetFieldWidth) || !isInt(generationFieldWidth)) { error('Invalid XRef entry fields length: ' + first + ', ' + n); } for (i = streamState.entryNum; i < n; ++i) { streamState.entryNum = i; streamState.streamPos = stream.pos; var type = 0, offset = 0, generation = 0; for (j = 0; j < typeFieldWidth; ++j) { type = (type << 8) | stream.getByte(); } // if type field is absent, its default value is 1 if (typeFieldWidth === 0) { type = 1; } for (j = 0; j < offsetFieldWidth; ++j) { offset = (offset << 8) | stream.getByte(); } for (j = 0; j < generationFieldWidth; ++j) { generation = (generation << 8) | stream.getByte(); } var entry = {}; entry.offset = offset; entry.gen = generation; switch (type) { case 0: entry.free = true; break; case 1: entry.uncompressed = true; break; case 2: break; default: error('Invalid XRef entry type: ' + type); } if (!this.entries[first + i]) { this.entries[first + i] = entry; } } streamState.entryNum = 0; streamState.streamPos = stream.pos; entryRanges.splice(0, 2); } }, indexObjects: function XRef_indexObjects() { // Simple scan through the PDF content to find objects, // trailers and XRef streams. var TAB = 0x9, LF = 0xA, CR = 0xD, SPACE = 0x20; var PERCENT = 0x25, LT = 0x3C; function readToken(data, offset) { var token = '', ch = data[offset]; while (ch !== LF && ch !== CR && ch !== LT) { if (++offset >= data.length) { break; } token += String.fromCharCode(ch); ch = data[offset]; } return token; } function skipUntil(data, offset, what) { var length = what.length, dataLength = data.length; var skipped = 0; // finding byte sequence while (offset < dataLength) { var i = 0; while (i < length && data[offset + i] === what[i]) { ++i; } if (i >= length) { break; // sequence found } offset++; skipped++; } return skipped; } var objRegExp = /^(\d+)\s+(\d+)\s+obj\b/; var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]); var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114, 101, 102]); var endobjBytes = new Uint8Array([101, 110, 100, 111, 98, 106]); var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]); // Clear out any existing entries, since they may be bogus. this.entries.length = 0; var stream = this.stream; stream.pos = 0; var buffer = stream.getBytes(); var position = stream.start, length = buffer.length; var trailers = [], xrefStms = []; while (position < length) { var ch = buffer[position]; if (ch === TAB || ch === LF || ch === CR || ch === SPACE) { ++position; continue; } if (ch === PERCENT) { // %-comment do { ++position; if (position >= length) { break; } ch = buffer[position]; } while (ch !== LF && ch !== CR); continue; } var token = readToken(buffer, position); var m; if (token.indexOf('xref') === 0 && (token.length === 4 || /\s/.test(token[4]))) { position += skipUntil(buffer, position, trailerBytes); trailers.push(position); position += skipUntil(buffer, position, startxrefBytes); } else if ((m = objRegExp.exec(token))) { if (typeof this.entries[m[1]] === 'undefined') { this.entries[m[1]] = { offset: position - stream.start, gen: m[2] | 0, uncompressed: true }; } var contentLength = skipUntil(buffer, position, endobjBytes) + 7; var content = buffer.subarray(position, position + contentLength); // checking XRef stream suspect // (it shall have '/XRef' and next char is not a letter) var xrefTagOffset = skipUntil(content, 0, xrefBytes); if (xrefTagOffset < contentLength && content[xrefTagOffset + 5] < 64) { xrefStms.push(position - stream.start); this.xrefstms[position - stream.start] = 1; // Avoid recursion } position += contentLength; } else if (token.indexOf('trailer') === 0 && (token.length === 7 || /\s/.test(token[7]))) { trailers.push(position); position += skipUntil(buffer, position, startxrefBytes); } else { position += token.length + 1; } } // reading XRef streams var i, ii; for (i = 0, ii = xrefStms.length; i < ii; ++i) { this.startXRefQueue.push(xrefStms[i]); this.readXRef(/* recoveryMode */ true); } // finding main trailer var dict; for (i = 0, ii = trailers.length; i < ii; ++i) { stream.pos = trailers[i]; var parser = new Parser(new Lexer(stream), true, this); var obj = parser.getObj(); if (!isCmd(obj, 'trailer')) { continue; } // read the trailer dictionary if (!isDict(dict = parser.getObj())) { continue; } // taking the first one with 'ID' if (dict.has('ID')) { return dict; } } // no tailer with 'ID', taking last one (if exists) if (dict) { return dict; } // nothing helps // calling error() would reject worker with an UnknownErrorException. throw new InvalidPDFException('Invalid PDF structure'); }, readXRef: function XRef_readXRef(recoveryMode) { var stream = this.stream; try { while (this.startXRefQueue.length) { var startXRef = this.startXRefQueue[0]; stream.pos = startXRef + stream.start; var parser = new Parser(new Lexer(stream), true, this); var obj = parser.getObj(); var dict; // Get dictionary if (isCmd(obj, 'xref')) { // Parse end-of-file XRef dict = this.processXRefTable(parser); if (!this.topDict) { this.topDict = dict; } // Recursively get other XRefs 'XRefStm', if any obj = dict.get('XRefStm'); if (isInt(obj)) { var pos = obj; // ignore previously loaded xref streams // (possible infinite recursion) if (!(pos in this.xrefstms)) { this.xrefstms[pos] = 1; this.startXRefQueue.push(pos); } } } else if (isInt(obj)) { // Parse in-stream XRef if (!isInt(parser.getObj()) || !isCmd(parser.getObj(), 'obj') || !isStream(obj = parser.getObj())) { error('Invalid XRef stream'); } dict = this.processXRefStream(obj); if (!this.topDict) { this.topDict = dict; } if (!dict) { error('Failed to read XRef stream'); } } else { error('Invalid XRef stream header'); } // Recursively get previous dictionary, if any obj = dict.get('Prev'); if (isInt(obj)) { this.startXRefQueue.push(obj); } else if (isRef(obj)) { // The spec says Prev must not be a reference, i.e. "/Prev NNN" // This is a fallback for non-compliant PDFs, i.e. "/Prev NNN 0 R" this.startXRefQueue.push(obj.num); } this.startXRefQueue.shift(); } return this.topDict; } catch (e) { if (e instanceof MissingDataException) { throw e; } info('(while reading XRef): ' + e); } if (recoveryMode) { return; } throw new XRefParseException(); }, getEntry: function XRef_getEntry(i) { var xrefEntry = this.entries[i]; if (xrefEntry && !xrefEntry.free && xrefEntry.offset) { return xrefEntry; } return null; }, fetchIfRef: function XRef_fetchIfRef(obj) { if (!isRef(obj)) { return obj; } return this.fetch(obj); }, fetch: function XRef_fetch(ref, suppressEncryption) { assert(isRef(ref), 'ref object is not a reference'); var num = ref.num; if (num in this.cache) { var cacheEntry = this.cache[num]; return cacheEntry; } var xrefEntry = this.getEntry(num); // the referenced entry can be free if (xrefEntry === null) { return (this.cache[num] = null); } if (xrefEntry.uncompressed) { xrefEntry = this.fetchUncompressed(ref, xrefEntry, suppressEncryption); } else { xrefEntry = this.fetchCompressed(xrefEntry, suppressEncryption); } if (isDict(xrefEntry)){ xrefEntry.objId = ref.toString(); } else if (isStream(xrefEntry)) { xrefEntry.dict.objId = ref.toString(); } return xrefEntry; }, fetchUncompressed: function XRef_fetchUncompressed(ref, xrefEntry, suppressEncryption) { var gen = ref.gen; var num = ref.num; if (xrefEntry.gen !== gen) { error('inconsistent generation in XRef'); } var stream = this.stream.makeSubStream(xrefEntry.offset + this.stream.start); var parser = new Parser(new Lexer(stream), true, this); var obj1 = parser.getObj(); var obj2 = parser.getObj(); var obj3 = parser.getObj(); if (!isInt(obj1) || parseInt(obj1, 10) !== num || !isInt(obj2) || parseInt(obj2, 10) !== gen || !isCmd(obj3)) { error('bad XRef entry'); } if (!isCmd(obj3, 'obj')) { // some bad PDFs use "obj1234" and really mean 1234 if (obj3.cmd.indexOf('obj') === 0) { num = parseInt(obj3.cmd.substring(3), 10); if (!isNaN(num)) { return num; } } error('bad XRef entry'); } if (this.encrypt && !suppressEncryption) { xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, gen)); } else { xrefEntry = parser.getObj(); } if (!isStream(xrefEntry)) { this.cache[num] = xrefEntry; } return xrefEntry; }, fetchCompressed: function XRef_fetchCompressed(xrefEntry, suppressEncryption) { var tableOffset = xrefEntry.offset; var stream = this.fetch(new Ref(tableOffset, 0)); if (!isStream(stream)) { error('bad ObjStm stream'); } var first = stream.dict.get('First'); var n = stream.dict.get('N'); if (!isInt(first) || !isInt(n)) { error('invalid first and n parameters for ObjStm stream'); } var parser = new Parser(new Lexer(stream), false, this); parser.allowStreams = true; var i, entries = [], num, nums = []; // read the object numbers to populate cache for (i = 0; i < n; ++i) { num = parser.getObj(); if (!isInt(num)) { error('invalid object number in the ObjStm stream: ' + num); } nums.push(num); var offset = parser.getObj(); if (!isInt(offset)) { error('invalid object offset in the ObjStm stream: ' + offset); } } // read stream objects for cache for (i = 0; i < n; ++i) { entries.push(parser.getObj()); num = nums[i]; var entry = this.entries[num]; if (entry && entry.offset === tableOffset && entry.gen === i) { this.cache[num] = entries[i]; } } xrefEntry = entries[xrefEntry.gen]; if (xrefEntry === undefined) { error('bad XRef entry for compressed object'); } return xrefEntry; }, fetchIfRefAsync: function XRef_fetchIfRefAsync(obj) { if (!isRef(obj)) { return Promise.resolve(obj); } return this.fetchAsync(obj); }, fetchAsync: function XRef_fetchAsync(ref, suppressEncryption) { var streamManager = this.stream.manager; var xref = this; return new Promise(function tryFetch(resolve, reject) { try { resolve(xref.fetch(ref, suppressEncryption)); } catch (e) { if (e instanceof MissingDataException) { streamManager.requestRange(e.begin, e.end).then(function () { tryFetch(resolve, reject); }, reject); return; } reject(e); } }); }, getCatalogObj: function XRef_getCatalogObj() { return this.root; } }; return XRef; })(); /** * A NameTree/NumberTree is like a Dict but has some advantageous properties, * see the specification (7.9.6 and 7.9.7) for additional details. * TODO: implement all the Dict functions and make this more efficient. */ var NameOrNumberTree = (function NameOrNumberTreeClosure() { function NameOrNumberTree(root, xref) { throw new Error('Cannot initialize NameOrNumberTree.'); } NameOrNumberTree.prototype = { getAll: function NameOrNumberTree_getAll() { var dict = Object.create(null); if (!this.root) { return dict; } var xref = this.xref; // Reading Name/Number tree. var processed = new RefSet(); processed.put(this.root); var queue = [this.root]; while (queue.length > 0) { var i, n; var obj = xref.fetchIfRef(queue.shift()); if (!isDict(obj)) { continue; } if (obj.has('Kids')) { var kids = obj.get('Kids'); for (i = 0, n = kids.length; i < n; i++) { var kid = kids[i]; assert(!processed.has(kid), 'Duplicate entry in "' + this._type + '" tree.'); queue.push(kid); processed.put(kid); } continue; } var entries = obj.get(this._type); if (isArray(entries)) { for (i = 0, n = entries.length; i < n; i += 2) { dict[xref.fetchIfRef(entries[i])] = xref.fetchIfRef(entries[i + 1]); } } } return dict; }, get: function NameOrNumberTree_get(key) { if (!this.root) { return null; } var xref = this.xref; var kidsOrEntries = xref.fetchIfRef(this.root); var loopCount = 0; var MAX_LEVELS = 10; var l, r, m; // Perform a binary search to quickly find the entry that // contains the key we are looking for. while (kidsOrEntries.has('Kids')) { if (++loopCount > MAX_LEVELS) { warn('Search depth limit reached for "' + this._type + '" tree.'); return null; } var kids = kidsOrEntries.get('Kids'); if (!isArray(kids)) { return null; } l = 0; r = kids.length - 1; while (l <= r) { m = (l + r) >> 1; var kid = xref.fetchIfRef(kids[m]); var limits = kid.get('Limits'); if (key < xref.fetchIfRef(limits[0])) { r = m - 1; } else if (key > xref.fetchIfRef(limits[1])) { l = m + 1; } else { kidsOrEntries = xref.fetchIfRef(kids[m]); break; } } if (l > r) { return null; } } // If we get here, then we have found the right entry. Now go through the // entries in the dictionary until we find the key we're looking for. var entries = kidsOrEntries.get(this._type); if (isArray(entries)) { // Perform a binary search to reduce the lookup time. l = 0; r = entries.length - 2; while (l <= r) { // Check only even indices (0, 2, 4, ...) because the // odd indices contain the actual data. m = (l + r) & ~1; var currentKey = xref.fetchIfRef(entries[m]); if (key < currentKey) { r = m - 2; } else if (key > currentKey) { l = m + 2; } else { return xref.fetchIfRef(entries[m + 1]); } } } return null; } }; return NameOrNumberTree; })(); var NameTree = (function NameTreeClosure() { function NameTree(root, xref) { this.root = root; this.xref = xref; this._type = 'Names'; } Util.inherit(NameTree, NameOrNumberTree, {}); return NameTree; })(); var NumberTree = (function NumberTreeClosure() { function NumberTree(root, xref) { this.root = root; this.xref = xref; this._type = 'Nums'; } Util.inherit(NumberTree, NameOrNumberTree, {}); return NumberTree; })(); /** * "A PDF file can refer to the contents of another file by using a File * Specification (PDF 1.1)", see the spec (7.11) for more details. * NOTE: Only embedded files are supported (as part of the attachments support) * TODO: support the 'URL' file system (with caching if !/V), portable * collections attributes and related files (/RF) */ var FileSpec = (function FileSpecClosure() { function FileSpec(root, xref) { if (!root || !isDict(root)) { return; } this.xref = xref; this.root = root; if (root.has('FS')) { this.fs = root.get('FS'); } this.description = root.has('Desc') ? stringToPDFString(root.get('Desc')) : ''; if (root.has('RF')) { warn('Related file specifications are not supported'); } this.contentAvailable = true; if (!root.has('EF')) { this.contentAvailable = false; warn('Non-embedded file specifications are not supported'); } } function pickPlatformItem(dict) { // Look for the filename in this order: // UF, F, Unix, Mac, DOS if (dict.has('UF')) { return dict.get('UF'); } else if (dict.has('F')) { return dict.get('F'); } else if (dict.has('Unix')) { return dict.get('Unix'); } else if (dict.has('Mac')) { return dict.get('Mac'); } else if (dict.has('DOS')) { return dict.get('DOS'); } else { return null; } } FileSpec.prototype = { get filename() { if (!this._filename && this.root) { var filename = pickPlatformItem(this.root) || 'unnamed'; this._filename = stringToPDFString(filename). replace(/\\\\/g, '\\'). replace(/\\\//g, '/'). replace(/\\/g, '/'); } return this._filename; }, get content() { if (!this.contentAvailable) { return null; } if (!this.contentRef && this.root) { this.contentRef = pickPlatformItem(this.root.get('EF')); } var content = null; if (this.contentRef) { var xref = this.xref; var fileObj = xref.fetchIfRef(this.contentRef); if (fileObj && isStream(fileObj)) { content = fileObj.getBytes(); } else { warn('Embedded file specification points to non-existing/invalid ' + 'content'); } } else { warn('Embedded file specification does not have a content'); } return content; }, get serializable() { return { filename: this.filename, content: this.content }; } }; return FileSpec; })(); /** * A helper for loading missing data in object graphs. It traverses the graph * depth first and queues up any objects that have missing data. Once it has * has traversed as many objects that are available it attempts to bundle the * missing data requests and then resume from the nodes that weren't ready. * * NOTE: It provides protection from circular references by keeping track of * of loaded references. However, you must be careful not to load any graphs * that have references to the catalog or other pages since that will cause the * entire PDF document object graph to be traversed. */ var ObjectLoader = (function() { function mayHaveChildren(value) { return isRef(value) || isDict(value) || isArray(value) || isStream(value); } function addChildren(node, nodesToVisit) { var value; if (isDict(node) || isStream(node)) { var map; if (isDict(node)) { map = node.map; } else { map = node.dict.map; } for (var key in map) { value = map[key]; if (mayHaveChildren(value)) { nodesToVisit.push(value); } } } else if (isArray(node)) { for (var i = 0, ii = node.length; i < ii; i++) { value = node[i]; if (mayHaveChildren(value)) { nodesToVisit.push(value); } } } } function ObjectLoader(obj, keys, xref) { this.obj = obj; this.keys = keys; this.xref = xref; this.refSet = null; this.capability = null; } ObjectLoader.prototype = { load: function ObjectLoader_load() { var keys = this.keys; this.capability = createPromiseCapability(); // Don't walk the graph if all the data is already loaded. if (!(this.xref.stream instanceof ChunkedStream) || this.xref.stream.getMissingChunks().length === 0) { this.capability.resolve(); return this.capability.promise; } this.refSet = new RefSet(); // Setup the initial nodes to visit. var nodesToVisit = []; for (var i = 0; i < keys.length; i++) { nodesToVisit.push(this.obj[keys[i]]); } this._walk(nodesToVisit); return this.capability.promise; }, _walk: function ObjectLoader_walk(nodesToVisit) { var nodesToRevisit = []; var pendingRequests = []; // DFS walk of the object graph. while (nodesToVisit.length) { var currentNode = nodesToVisit.pop(); // Only references or chunked streams can cause missing data exceptions. if (isRef(currentNode)) { // Skip nodes that have already been visited. if (this.refSet.has(currentNode)) { continue; } try { var ref = currentNode; this.refSet.put(ref); currentNode = this.xref.fetch(currentNode); } catch (e) { if (!(e instanceof MissingDataException)) { throw e; } nodesToRevisit.push(currentNode); pendingRequests.push({ begin: e.begin, end: e.end }); } } if (currentNode && currentNode.getBaseStreams) { var baseStreams = currentNode.getBaseStreams(); var foundMissingData = false; for (var i = 0; i < baseStreams.length; i++) { var stream = baseStreams[i]; if (stream.getMissingChunks && stream.getMissingChunks().length) { foundMissingData = true; pendingRequests.push({ begin: stream.start, end: stream.end }); } } if (foundMissingData) { nodesToRevisit.push(currentNode); } } addChildren(currentNode, nodesToVisit); } if (pendingRequests.length) { this.xref.stream.manager.requestRanges(pendingRequests).then( function pendingRequestCallback() { nodesToVisit = nodesToRevisit; for (var i = 0; i < nodesToRevisit.length; i++) { var node = nodesToRevisit[i]; // Remove any reference nodes from the currrent refset so they // aren't skipped when we revist them. if (isRef(node)) { this.refSet.remove(node); } } this._walk(nodesToVisit); }.bind(this), this.capability.reject); return; } // Everything is loaded. this.refSet = null; this.capability.resolve(); } }; return ObjectLoader; })(); exports.Catalog = Catalog; exports.ObjectLoader = ObjectLoader; exports.XRef = XRef; exports.FileSpec = FileSpec; })); (function (root, factory) { { factory((root.pdfjsCorePattern = {}), root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreFunction, root.pdfjsCoreColorSpace); } }(this, function (exports, sharedUtil, corePrimitives, coreFunction, coreColorSpace) { var UNSUPPORTED_FEATURES = sharedUtil.UNSUPPORTED_FEATURES; var MissingDataException = sharedUtil.MissingDataException; var Util = sharedUtil.Util; var assert = sharedUtil.assert; var error = sharedUtil.error; var info = sharedUtil.info; var warn = sharedUtil.warn; var isStream = corePrimitives.isStream; var PDFFunction = coreFunction.PDFFunction; var ColorSpace = coreColorSpace.ColorSpace; var ShadingType = { FUNCTION_BASED: 1, AXIAL: 2, RADIAL: 3, FREE_FORM_MESH: 4, LATTICE_FORM_MESH: 5, COONS_PATCH_MESH: 6, TENSOR_PATCH_MESH: 7 }; var Pattern = (function PatternClosure() { // Constructor should define this.getPattern function Pattern() { error('should not call Pattern constructor'); } Pattern.prototype = { // Input: current Canvas context // Output: the appropriate fillStyle or strokeStyle getPattern: function Pattern_getPattern(ctx) { error('Should not call Pattern.getStyle: ' + ctx); } }; Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref, res, handler) { var dict = isStream(shading) ? shading.dict : shading; var type = dict.get('ShadingType'); try { switch (type) { case ShadingType.AXIAL: case ShadingType.RADIAL: // Both radial and axial shadings are handled by RadialAxial shading. return new Shadings.RadialAxial(dict, matrix, xref, res); case ShadingType.FREE_FORM_MESH: case ShadingType.LATTICE_FORM_MESH: case ShadingType.COONS_PATCH_MESH: case ShadingType.TENSOR_PATCH_MESH: return new Shadings.Mesh(shading, matrix, xref, res); default: throw new Error('Unsupported ShadingType: ' + type); } } catch (ex) { if (ex instanceof MissingDataException) { throw ex; } handler.send('UnsupportedFeature', {featureId: UNSUPPORTED_FEATURES.shadingPattern}); warn(ex); return new Shadings.Dummy(); } }; return Pattern; })(); var Shadings = {}; // A small number to offset the first/last color stops so we can insert ones to // support extend. Number.MIN_VALUE is too small and breaks the extend. Shadings.SMALL_NUMBER = 1e-6; // Radial and axial shading have very similar implementations // If needed, the implementations can be broken into two classes Shadings.RadialAxial = (function RadialAxialClosure() { function RadialAxial(dict, matrix, xref, res) { this.matrix = matrix; this.coordsArr = dict.get('Coords'); this.shadingType = dict.get('ShadingType'); this.type = 'Pattern'; var cs = dict.get('ColorSpace', 'CS'); cs = ColorSpace.parse(cs, xref, res); this.cs = cs; var t0 = 0.0, t1 = 1.0; if (dict.has('Domain')) { var domainArr = dict.get('Domain'); t0 = domainArr[0]; t1 = domainArr[1]; } var extendStart = false, extendEnd = false; if (dict.has('Extend')) { var extendArr = dict.get('Extend'); extendStart = extendArr[0]; extendEnd = extendArr[1]; } if (this.shadingType === ShadingType.RADIAL && (!extendStart || !extendEnd)) { // Radial gradient only currently works if either circle is fully within // the other circle. var x1 = this.coordsArr[0]; var y1 = this.coordsArr[1]; var r1 = this.coordsArr[2]; var x2 = this.coordsArr[3]; var y2 = this.coordsArr[4]; var r2 = this.coordsArr[5]; var distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); if (r1 <= r2 + distance && r2 <= r1 + distance) { warn('Unsupported radial gradient.'); } } this.extendStart = extendStart; this.extendEnd = extendEnd; var fnObj = dict.get('Function'); var fn = PDFFunction.parseArray(xref, fnObj); // 10 samples seems good enough for now, but probably won't work // if there are sharp color changes. Ideally, we would implement // the spec faithfully and add lossless optimizations. var diff = t1 - t0; var step = diff / 10; var colorStops = this.colorStops = []; // Protect against bad domains so we don't end up in an infinte loop below. if (t0 >= t1 || step <= 0) { // Acrobat doesn't seem to handle these cases so we'll ignore for // now. info('Bad shading domain.'); return; } var color = new Float32Array(cs.numComps), ratio = new Float32Array(1); var rgbColor; for (var i = t0; i <= t1; i += step) { ratio[0] = i; fn(ratio, 0, color, 0); rgbColor = cs.getRgb(color, 0); var cssColor = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); colorStops.push([(i - t0) / diff, cssColor]); } var background = 'transparent'; if (dict.has('Background')) { rgbColor = cs.getRgb(dict.get('Background'), 0); background = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); } if (!extendStart) { // Insert a color stop at the front and offset the first real color stop // so it doesn't conflict with the one we insert. colorStops.unshift([0, background]); colorStops[1][0] += Shadings.SMALL_NUMBER; } if (!extendEnd) { // Same idea as above in extendStart but for the end. colorStops[colorStops.length - 1][0] -= Shadings.SMALL_NUMBER; colorStops.push([1, background]); } this.colorStops = colorStops; } RadialAxial.prototype = { getIR: function RadialAxial_getIR() { var coordsArr = this.coordsArr; var shadingType = this.shadingType; var type, p0, p1, r0, r1; if (shadingType === ShadingType.AXIAL) { p0 = [coordsArr[0], coordsArr[1]]; p1 = [coordsArr[2], coordsArr[3]]; r0 = null; r1 = null; type = 'axial'; } else if (shadingType === ShadingType.RADIAL) { p0 = [coordsArr[0], coordsArr[1]]; p1 = [coordsArr[3], coordsArr[4]]; r0 = coordsArr[2]; r1 = coordsArr[5]; type = 'radial'; } else { error('getPattern type unknown: ' + shadingType); } var matrix = this.matrix; if (matrix) { p0 = Util.applyTransform(p0, matrix); p1 = Util.applyTransform(p1, matrix); if (shadingType === ShadingType.RADIAL) { var scale = Util.singularValueDecompose2dScale(matrix); r0 *= scale[0]; r1 *= scale[1]; } } return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1]; } }; return RadialAxial; })(); // All mesh shading. For now, they will be presented as set of the triangles // to be drawn on the canvas and rgb color for each vertex. Shadings.Mesh = (function MeshClosure() { function MeshStreamReader(stream, context) { this.stream = stream; this.context = context; this.buffer = 0; this.bufferLength = 0; var numComps = context.numComps; this.tmpCompsBuf = new Float32Array(numComps); var csNumComps = context.colorSpace.numComps; this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : this.tmpCompsBuf; } MeshStreamReader.prototype = { get hasData() { if (this.stream.end) { return this.stream.pos < this.stream.end; } if (this.bufferLength > 0) { return true; } var nextByte = this.stream.getByte(); if (nextByte < 0) { return false; } this.buffer = nextByte; this.bufferLength = 8; return true; }, readBits: function MeshStreamReader_readBits(n) { var buffer = this.buffer; var bufferLength = this.bufferLength; if (n === 32) { if (bufferLength === 0) { return ((this.stream.getByte() << 24) | (this.stream.getByte() << 16) | (this.stream.getByte() << 8) | this.stream.getByte()) >>> 0; } buffer = (buffer << 24) | (this.stream.getByte() << 16) | (this.stream.getByte() << 8) | this.stream.getByte(); var nextByte = this.stream.getByte(); this.buffer = nextByte & ((1 << bufferLength) - 1); return ((buffer << (8 - bufferLength)) | ((nextByte & 0xFF) >> bufferLength)) >>> 0; } if (n === 8 && bufferLength === 0) { return this.stream.getByte(); } while (bufferLength < n) { buffer = (buffer << 8) | this.stream.getByte(); bufferLength += 8; } bufferLength -= n; this.bufferLength = bufferLength; this.buffer = buffer & ((1 << bufferLength) - 1); return buffer >> bufferLength; }, align: function MeshStreamReader_align() { this.buffer = 0; this.bufferLength = 0; }, readFlag: function MeshStreamReader_readFlag() { return this.readBits(this.context.bitsPerFlag); }, readCoordinate: function MeshStreamReader_readCoordinate() { var bitsPerCoordinate = this.context.bitsPerCoordinate; var xi = this.readBits(bitsPerCoordinate); var yi = this.readBits(bitsPerCoordinate); var decode = this.context.decode; var scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : 2.3283064365386963e-10; // 2 ^ -32 return [ xi * scale * (decode[1] - decode[0]) + decode[0], yi * scale * (decode[3] - decode[2]) + decode[2] ]; }, readComponents: function MeshStreamReader_readComponents() { var numComps = this.context.numComps; var bitsPerComponent = this.context.bitsPerComponent; var scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : 2.3283064365386963e-10; // 2 ^ -32 var decode = this.context.decode; var components = this.tmpCompsBuf; for (var i = 0, j = 4; i < numComps; i++, j += 2) { var ci = this.readBits(bitsPerComponent); components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j]; } var color = this.tmpCsCompsBuf; if (this.context.colorFn) { this.context.colorFn(components, 0, color, 0); } return this.context.colorSpace.getRgb(color, 0); } }; function decodeType4Shading(mesh, reader) { var coords = mesh.coords; var colors = mesh.colors; var operators = []; var ps = []; // not maintaining cs since that will match ps var verticesLeft = 0; // assuming we have all data to start a new triangle while (reader.hasData) { var f = reader.readFlag(); var coord = reader.readCoordinate(); var color = reader.readComponents(); if (verticesLeft === 0) { // ignoring flags if we started a triangle assert(0 <= f && f <= 2, 'Unknown type4 flag'); switch (f) { case 0: verticesLeft = 3; break; case 1: ps.push(ps[ps.length - 2], ps[ps.length - 1]); verticesLeft = 1; break; case 2: ps.push(ps[ps.length - 3], ps[ps.length - 1]); verticesLeft = 1; break; } operators.push(f); } ps.push(coords.length); coords.push(coord); colors.push(color); verticesLeft--; reader.align(); } mesh.figures.push({ type: 'triangles', coords: new Int32Array(ps), colors: new Int32Array(ps), }); } function decodeType5Shading(mesh, reader, verticesPerRow) { var coords = mesh.coords; var colors = mesh.colors; var ps = []; // not maintaining cs since that will match ps while (reader.hasData) { var coord = reader.readCoordinate(); var color = reader.readComponents(); ps.push(coords.length); coords.push(coord); colors.push(color); } mesh.figures.push({ type: 'lattice', coords: new Int32Array(ps), colors: new Int32Array(ps), verticesPerRow: verticesPerRow }); } var MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3; var MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20; var TRIANGLE_DENSITY = 20; // count of triangles per entire mesh bounds var getB = (function getBClosure() { function buildB(count) { var lut = []; for (var i = 0; i <= count; i++) { var t = i / count, t_ = 1 - t; lut.push(new Float32Array([t_ * t_ * t_, 3 * t * t_ * t_, 3 * t * t * t_, t * t * t])); } return lut; } var cache = []; return function getB(count) { if (!cache[count]) { cache[count] = buildB(count); } return cache[count]; }; })(); function buildFigureFromPatch(mesh, index) { var figure = mesh.figures[index]; assert(figure.type === 'patch', 'Unexpected patch mesh figure'); var coords = mesh.coords, colors = mesh.colors; var pi = figure.coords; var ci = figure.colors; var figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]); var figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]); var figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]); var figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]); var splitXBy = Math.ceil((figureMaxX - figureMinX) * TRIANGLE_DENSITY / (mesh.bounds[2] - mesh.bounds[0])); splitXBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy)); var splitYBy = Math.ceil((figureMaxY - figureMinY) * TRIANGLE_DENSITY / (mesh.bounds[3] - mesh.bounds[1])); splitYBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy)); var verticesPerRow = splitXBy + 1; var figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow); var figureColors = new Int32Array((splitYBy + 1) * verticesPerRow); var k = 0; var cl = new Uint8Array(3), cr = new Uint8Array(3); var c0 = colors[ci[0]], c1 = colors[ci[1]], c2 = colors[ci[2]], c3 = colors[ci[3]]; var bRow = getB(splitYBy), bCol = getB(splitXBy); for (var row = 0; row <= splitYBy; row++) { cl[0] = ((c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy) | 0; cl[1] = ((c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy) | 0; cl[2] = ((c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy) | 0; cr[0] = ((c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy) | 0; cr[1] = ((c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy) | 0; cr[2] = ((c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy) | 0; for (var col = 0; col <= splitXBy; col++, k++) { if ((row === 0 || row === splitYBy) && (col === 0 || col === splitXBy)) { continue; } var x = 0, y = 0; var q = 0; for (var i = 0; i <= 3; i++) { for (var j = 0; j <= 3; j++, q++) { var m = bRow[row][i] * bCol[col][j]; x += coords[pi[q]][0] * m; y += coords[pi[q]][1] * m; } } figureCoords[k] = coords.length; coords.push([x, y]); figureColors[k] = colors.length; var newColor = new Uint8Array(3); newColor[0] = ((cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy) | 0; newColor[1] = ((cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy) | 0; newColor[2] = ((cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy) | 0; colors.push(newColor); } } figureCoords[0] = pi[0]; figureColors[0] = ci[0]; figureCoords[splitXBy] = pi[3]; figureColors[splitXBy] = ci[1]; figureCoords[verticesPerRow * splitYBy] = pi[12]; figureColors[verticesPerRow * splitYBy] = ci[2]; figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15]; figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3]; mesh.figures[index] = { type: 'lattice', coords: figureCoords, colors: figureColors, verticesPerRow: verticesPerRow }; } function decodeType6Shading(mesh, reader) { // A special case of Type 7. The p11, p12, p21, p22 automatically filled var coords = mesh.coords; var colors = mesh.colors; var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33 var cs = new Int32Array(4); // c00, c30, c03, c33 while (reader.hasData) { var f = reader.readFlag(); assert(0 <= f && f <= 3, 'Unknown type6 flag'); var i, ii; var pi = coords.length; for (i = 0, ii = (f !== 0 ? 8 : 12); i < ii; i++) { coords.push(reader.readCoordinate()); } var ci = colors.length; for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) { colors.push(reader.readComponents()); } var tmp1, tmp2, tmp3, tmp4; switch (f) { case 0: ps[12] = pi + 3; ps[13] = pi + 4; ps[14] = pi + 5; ps[15] = pi + 6; ps[ 8] = pi + 2; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 7; ps[ 4] = pi + 1; /* calculated below */ ps[ 7] = pi + 8; ps[ 0] = pi; ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9; cs[2] = ci + 1; cs[3] = ci + 2; cs[0] = ci; cs[1] = ci + 3; break; case 1: tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15]; ps[12] = tmp4; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; ps[ 8] = tmp3; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; ps[ 4] = tmp2; /* calculated below */ ps[ 7] = pi + 4; ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; tmp1 = cs[2]; tmp2 = cs[3]; cs[2] = tmp2; cs[3] = ci; cs[0] = tmp1; cs[1] = ci + 1; break; case 2: tmp1 = ps[15]; tmp2 = ps[11]; ps[12] = ps[3]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; ps[ 8] = ps[7]; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; ps[ 4] = tmp2; /* calculated below */ ps[ 7] = pi + 4; ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; tmp1 = cs[3]; cs[2] = cs[1]; cs[3] = ci; cs[0] = tmp1; cs[1] = ci + 1; break; case 3: ps[12] = ps[0]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; ps[ 8] = ps[1]; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; ps[ 4] = ps[2]; /* calculated below */ ps[ 7] = pi + 4; ps[ 0] = ps[3]; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; cs[2] = cs[0]; cs[3] = ci; cs[0] = cs[1]; cs[1] = ci + 1; break; } // set p11, p12, p21, p22 ps[5] = coords.length; coords.push([ (-4 * coords[ps[0]][0] - coords[ps[15]][0] + 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, (-4 * coords[ps[0]][1] - coords[ps[15]][1] + 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9 ]); ps[6] = coords.length; coords.push([ (-4 * coords[ps[3]][0] - coords[ps[12]][0] + 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, (-4 * coords[ps[3]][1] - coords[ps[12]][1] + 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9 ]); ps[9] = coords.length; coords.push([ (-4 * coords[ps[12]][0] - coords[ps[3]][0] + 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, (-4 * coords[ps[12]][1] - coords[ps[3]][1] + 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9 ]); ps[10] = coords.length; coords.push([ (-4 * coords[ps[15]][0] - coords[ps[0]][0] + 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, (-4 * coords[ps[15]][1] - coords[ps[0]][1] + 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9 ]); mesh.figures.push({ type: 'patch', coords: new Int32Array(ps), // making copies of ps and cs colors: new Int32Array(cs) }); } } function decodeType7Shading(mesh, reader) { var coords = mesh.coords; var colors = mesh.colors; var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33 var cs = new Int32Array(4); // c00, c30, c03, c33 while (reader.hasData) { var f = reader.readFlag(); assert(0 <= f && f <= 3, 'Unknown type7 flag'); var i, ii; var pi = coords.length; for (i = 0, ii = (f !== 0 ? 12 : 16); i < ii; i++) { coords.push(reader.readCoordinate()); } var ci = colors.length; for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) { colors.push(reader.readComponents()); } var tmp1, tmp2, tmp3, tmp4; switch (f) { case 0: ps[12] = pi + 3; ps[13] = pi + 4; ps[14] = pi + 5; ps[15] = pi + 6; ps[ 8] = pi + 2; ps[ 9] = pi + 13; ps[10] = pi + 14; ps[11] = pi + 7; ps[ 4] = pi + 1; ps[ 5] = pi + 12; ps[ 6] = pi + 15; ps[ 7] = pi + 8; ps[ 0] = pi; ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9; cs[2] = ci + 1; cs[3] = ci + 2; cs[0] = ci; cs[1] = ci + 3; break; case 1: tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15]; ps[12] = tmp4; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; ps[ 8] = tmp3; ps[ 9] = pi + 9; ps[10] = pi + 10; ps[11] = pi + 3; ps[ 4] = tmp2; ps[ 5] = pi + 8; ps[ 6] = pi + 11; ps[ 7] = pi + 4; ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; tmp1 = cs[2]; tmp2 = cs[3]; cs[2] = tmp2; cs[3] = ci; cs[0] = tmp1; cs[1] = ci + 1; break; case 2: tmp1 = ps[15]; tmp2 = ps[11]; ps[12] = ps[3]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; ps[ 8] = ps[7]; ps[ 9] = pi + 9; ps[10] = pi + 10; ps[11] = pi + 3; ps[ 4] = tmp2; ps[ 5] = pi + 8; ps[ 6] = pi + 11; ps[ 7] = pi + 4; ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; tmp1 = cs[3]; cs[2] = cs[1]; cs[3] = ci; cs[0] = tmp1; cs[1] = ci + 1; break; case 3: ps[12] = ps[0]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; ps[ 8] = ps[1]; ps[ 9] = pi + 9; ps[10] = pi + 10; ps[11] = pi + 3; ps[ 4] = ps[2]; ps[ 5] = pi + 8; ps[ 6] = pi + 11; ps[ 7] = pi + 4; ps[ 0] = ps[3]; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; cs[2] = cs[0]; cs[3] = ci; cs[0] = cs[1]; cs[1] = ci + 1; break; } mesh.figures.push({ type: 'patch', coords: new Int32Array(ps), // making copies of ps and cs colors: new Int32Array(cs) }); } } function updateBounds(mesh) { var minX = mesh.coords[0][0], minY = mesh.coords[0][1], maxX = minX, maxY = minY; for (var i = 1, ii = mesh.coords.length; i < ii; i++) { var x = mesh.coords[i][0], y = mesh.coords[i][1]; minX = minX > x ? x : minX; minY = minY > y ? y : minY; maxX = maxX < x ? x : maxX; maxY = maxY < y ? y : maxY; } mesh.bounds = [minX, minY, maxX, maxY]; } function packData(mesh) { var i, ii, j, jj; var coords = mesh.coords; var coordsPacked = new Float32Array(coords.length * 2); for (i = 0, j = 0, ii = coords.length; i < ii; i++) { var xy = coords[i]; coordsPacked[j++] = xy[0]; coordsPacked[j++] = xy[1]; } mesh.coords = coordsPacked; var colors = mesh.colors; var colorsPacked = new Uint8Array(colors.length * 3); for (i = 0, j = 0, ii = colors.length; i < ii; i++) { var c = colors[i]; colorsPacked[j++] = c[0]; colorsPacked[j++] = c[1]; colorsPacked[j++] = c[2]; } mesh.colors = colorsPacked; var figures = mesh.figures; for (i = 0, ii = figures.length; i < ii; i++) { var figure = figures[i], ps = figure.coords, cs = figure.colors; for (j = 0, jj = ps.length; j < jj; j++) { ps[j] *= 2; cs[j] *= 3; } } } function Mesh(stream, matrix, xref, res) { assert(isStream(stream), 'Mesh data is not a stream'); var dict = stream.dict; this.matrix = matrix; this.shadingType = dict.get('ShadingType'); this.type = 'Pattern'; this.bbox = dict.get('BBox'); var cs = dict.get('ColorSpace', 'CS'); cs = ColorSpace.parse(cs, xref, res); this.cs = cs; this.background = dict.has('Background') ? cs.getRgb(dict.get('Background'), 0) : null; var fnObj = dict.get('Function'); var fn = fnObj ? PDFFunction.parseArray(xref, fnObj) : null; this.coords = []; this.colors = []; this.figures = []; var decodeContext = { bitsPerCoordinate: dict.get('BitsPerCoordinate'), bitsPerComponent: dict.get('BitsPerComponent'), bitsPerFlag: dict.get('BitsPerFlag'), decode: dict.get('Decode'), colorFn: fn, colorSpace: cs, numComps: fn ? 1 : cs.numComps }; var reader = new MeshStreamReader(stream, decodeContext); var patchMesh = false; switch (this.shadingType) { case ShadingType.FREE_FORM_MESH: decodeType4Shading(this, reader); break; case ShadingType.LATTICE_FORM_MESH: var verticesPerRow = dict.get('VerticesPerRow') | 0; assert(verticesPerRow >= 2, 'Invalid VerticesPerRow'); decodeType5Shading(this, reader, verticesPerRow); break; case ShadingType.COONS_PATCH_MESH: decodeType6Shading(this, reader); patchMesh = true; break; case ShadingType.TENSOR_PATCH_MESH: decodeType7Shading(this, reader); patchMesh = true; break; default: error('Unsupported mesh type.'); break; } if (patchMesh) { // dirty bounds calculation for determining, how dense shall be triangles updateBounds(this); for (var i = 0, ii = this.figures.length; i < ii; i++) { buildFigureFromPatch(this, i); } } // calculate bounds updateBounds(this); packData(this); } Mesh.prototype = { getIR: function Mesh_getIR() { return ['Mesh', this.shadingType, this.coords, this.colors, this.figures, this.bounds, this.matrix, this.bbox, this.background]; } }; return Mesh; })(); Shadings.Dummy = (function DummyClosure() { function Dummy() { this.type = 'Pattern'; } Dummy.prototype = { getIR: function Dummy_getIR() { return ['Dummy']; } }; return Dummy; })(); function getTilingPatternIR(operatorList, dict, args) { var matrix = dict.get('Matrix'); var bbox = dict.get('BBox'); var xstep = dict.get('XStep'); var ystep = dict.get('YStep'); var paintType = dict.get('PaintType'); var tilingType = dict.get('TilingType'); return [ 'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep, paintType, tilingType ]; } exports.Pattern = Pattern; exports.getTilingPatternIR = getTilingPatternIR; })); (function (root, factory) { { factory((root.pdfjsCoreEvaluator = {}), root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreStream, root.pdfjsCoreParser, root.pdfjsCoreImage, root.pdfjsCoreColorSpace, root.pdfjsCoreMurmurHash3, root.pdfjsCoreFonts, root.pdfjsCoreFunction, root.pdfjsCorePattern, root.pdfjsCoreCMap, root.pdfjsCoreMetrics, root.pdfjsCoreBidi, root.pdfjsCoreEncodings, root.pdfjsCoreStandardFonts, root.pdfjsCoreUnicode, root.pdfjsCoreGlyphList); } }(this, function (exports, sharedUtil, corePrimitives, coreStream, coreParser, coreImage, coreColorSpace, coreMurmurHash3, coreFonts, coreFunction, corePattern, coreCMap, coreMetrics, coreBidi, coreEncodings, coreStandardFonts, coreUnicode, coreGlyphList) { var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX; var IDENTITY_MATRIX = sharedUtil.IDENTITY_MATRIX; var UNSUPPORTED_FEATURES = sharedUtil.UNSUPPORTED_FEATURES; var ImageKind = sharedUtil.ImageKind; var OPS = sharedUtil.OPS; var TextRenderingMode = sharedUtil.TextRenderingMode; var Util = sharedUtil.Util; var assert = sharedUtil.assert; var createPromiseCapability = sharedUtil.createPromiseCapability; var error = sharedUtil.error; var info = sharedUtil.info; var isArray = sharedUtil.isArray; var isNum = sharedUtil.isNum; var isString = sharedUtil.isString; var getLookupTableFactory = sharedUtil.getLookupTableFactory; var warn = sharedUtil.warn; var Dict = corePrimitives.Dict; var Name = corePrimitives.Name; var isCmd = corePrimitives.isCmd; var isDict = corePrimitives.isDict; var isName = corePrimitives.isName; var isRef = corePrimitives.isRef; var isStream = corePrimitives.isStream; var DecodeStream = coreStream.DecodeStream; var JpegStream = coreStream.JpegStream; var Stream = coreStream.Stream; var Lexer = coreParser.Lexer; var Parser = coreParser.Parser; var isEOF = coreParser.isEOF; var PDFImage = coreImage.PDFImage; var ColorSpace = coreColorSpace.ColorSpace; var MurmurHash3_64 = coreMurmurHash3.MurmurHash3_64; var ErrorFont = coreFonts.ErrorFont; var FontFlags = coreFonts.FontFlags; var Font = coreFonts.Font; var IdentityToUnicodeMap = coreFonts.IdentityToUnicodeMap; var ToUnicodeMap = coreFonts.ToUnicodeMap; var getFontType = coreFonts.getFontType; var isPDFFunction = coreFunction.isPDFFunction; var PDFFunction = coreFunction.PDFFunction; var Pattern = corePattern.Pattern; var getTilingPatternIR = corePattern.getTilingPatternIR; var CMapFactory = coreCMap.CMapFactory; var IdentityCMap = coreCMap.IdentityCMap; var getMetrics = coreMetrics.getMetrics; var bidi = coreBidi.bidi; var WinAnsiEncoding = coreEncodings.WinAnsiEncoding; var StandardEncoding = coreEncodings.StandardEncoding; var MacRomanEncoding = coreEncodings.MacRomanEncoding; var SymbolSetEncoding = coreEncodings.SymbolSetEncoding; var ZapfDingbatsEncoding = coreEncodings.ZapfDingbatsEncoding; var getEncoding = coreEncodings.getEncoding; var getStdFontMap = coreStandardFonts.getStdFontMap; var getSerifFonts = coreStandardFonts.getSerifFonts; var getSymbolsFonts = coreStandardFonts.getSymbolsFonts; var getNormalizedUnicodes = coreUnicode.getNormalizedUnicodes; var reverseIfRtl = coreUnicode.reverseIfRtl; var getUnicodeForGlyph = coreUnicode.getUnicodeForGlyph; var getGlyphsUnicode = coreGlyphList.getGlyphsUnicode; var PartialEvaluator = (function PartialEvaluatorClosure() { var DefaultPartialEvaluatorOptions = { forceDataSchema: false, maxImageSize: -1, disableFontFace: false, cMapOptions: { url: null, packed: false } }; function NativeImageDecoder(xref, resources, handler, forceDataSchema) { this.xref = xref; this.resources = resources; this.handler = handler; this.forceDataSchema = forceDataSchema; } NativeImageDecoder.prototype = { canDecode: function (image) { return image instanceof JpegStream && NativeImageDecoder.isDecodable(image, this.xref, this.resources); }, decode: function (image) { // For natively supported JPEGs send them to the main thread for decoding. var dict = image.dict; var colorSpace = dict.get('ColorSpace', 'CS'); colorSpace = ColorSpace.parse(colorSpace, this.xref, this.resources); var numComps = colorSpace.numComps; var decodePromise = this.handler.sendWithPromise('JpegDecode', [image.getIR(this.forceDataSchema), numComps]); return decodePromise.then(function (message) { var data = message.data; return new Stream(data, 0, data.length, image.dict); }); } }; /** * Checks if the image can be decoded and displayed by the browser without any * further processing such as color space conversions. */ NativeImageDecoder.isSupported = function NativeImageDecoder_isSupported(image, xref, res) { var cs = ColorSpace.parse(image.dict.get('ColorSpace', 'CS'), xref, res); return (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB') && cs.isDefaultDecode(image.dict.get('Decode', 'D')); }; /** * Checks if the image can be decoded by the browser. */ NativeImageDecoder.isDecodable = function NativeImageDecoder_isDecodable(image, xref, res) { var cs = ColorSpace.parse(image.dict.get('ColorSpace', 'CS'), xref, res); return (cs.numComps === 1 || cs.numComps === 3) && cs.isDefaultDecode(image.dict.get('Decode', 'D')); }; function PartialEvaluator(pdfManager, xref, handler, pageIndex, uniquePrefix, idCounters, fontCache, options) { this.pdfManager = pdfManager; this.xref = xref; this.handler = handler; this.pageIndex = pageIndex; this.uniquePrefix = uniquePrefix; this.idCounters = idCounters; this.fontCache = fontCache; this.options = options || DefaultPartialEvaluatorOptions; } // Trying to minimize Date.now() usage and check every 100 time var TIME_SLOT_DURATION_MS = 20; var CHECK_TIME_EVERY = 100; function TimeSlotManager() { this.reset(); } TimeSlotManager.prototype = { check: function TimeSlotManager_check() { if (++this.checked < CHECK_TIME_EVERY) { return false; } this.checked = 0; return this.endTime <= Date.now(); }, reset: function TimeSlotManager_reset() { this.endTime = Date.now() + TIME_SLOT_DURATION_MS; this.checked = 0; } }; var deferred = Promise.resolve(); var TILING_PATTERN = 1, SHADING_PATTERN = 2; PartialEvaluator.prototype = { hasBlendModes: function PartialEvaluator_hasBlendModes(resources) { if (!isDict(resources)) { return false; } var processed = Object.create(null); if (resources.objId) { processed[resources.objId] = true; } var nodes = [resources], xref = this.xref; while (nodes.length) { var key, i, ii; var node = nodes.shift(); // First check the current resources for blend modes. var graphicStates = node.get('ExtGState'); if (isDict(graphicStates)) { var graphicStatesKeys = graphicStates.getKeys(); for (i = 0, ii = graphicStatesKeys.length; i < ii; i++) { key = graphicStatesKeys[i]; var graphicState = graphicStates.get(key); var bm = graphicState.get('BM'); if (isName(bm) && bm.name !== 'Normal') { return true; } } } // Descend into the XObjects to look for more resources and blend modes. var xObjects = node.get('XObject'); if (!isDict(xObjects)) { continue; } var xObjectsKeys = xObjects.getKeys(); for (i = 0, ii = xObjectsKeys.length; i < ii; i++) { key = xObjectsKeys[i]; var xObject = xObjects.getRaw(key); if (isRef(xObject)) { if (processed[xObject.toString()]) { // The XObject has already been processed, and by avoiding a // redundant `xref.fetch` we can *significantly* reduce the load // time for badly generated PDF files (fixes issue6961.pdf). continue; } xObject = xref.fetch(xObject); } if (!isStream(xObject)) { continue; } if (xObject.dict.objId) { if (processed[xObject.dict.objId]) { // stream has objId and is processed already continue; } processed[xObject.dict.objId] = true; } var xResources = xObject.dict.get('Resources'); // Checking objId to detect an infinite loop. if (isDict(xResources) && (!xResources.objId || !processed[xResources.objId])) { nodes.push(xResources); if (xResources.objId) { processed[xResources.objId] = true; } } } } return false; }, buildFormXObject: function PartialEvaluator_buildFormXObject(resources, xobj, smask, operatorList, task, initialState) { var matrix = xobj.dict.getArray('Matrix'); var bbox = xobj.dict.getArray('BBox'); var group = xobj.dict.get('Group'); if (group) { var groupOptions = { matrix: matrix, bbox: bbox, smask: smask, isolated: false, knockout: false }; var groupSubtype = group.get('S'); var colorSpace; if (isName(groupSubtype) && groupSubtype.name === 'Transparency') { groupOptions.isolated = (group.get('I') || false); groupOptions.knockout = (group.get('K') || false); colorSpace = (group.has('CS') ? ColorSpace.parse(group.get('CS'), this.xref, resources) : null); } if (smask && smask.backdrop) { colorSpace = colorSpace || ColorSpace.singletons.rgb; smask.backdrop = colorSpace.getRgb(smask.backdrop, 0); } operatorList.addOp(OPS.beginGroup, [groupOptions]); } operatorList.addOp(OPS.paintFormXObjectBegin, [matrix, bbox]); return this.getOperatorList(xobj, task, (xobj.dict.get('Resources') || resources), operatorList, initialState). then(function () { operatorList.addOp(OPS.paintFormXObjectEnd, []); if (group) { operatorList.addOp(OPS.endGroup, [groupOptions]); } }); }, buildPaintImageXObject: function PartialEvaluator_buildPaintImageXObject(resources, image, inline, operatorList, cacheKey, imageCache) { var self = this; var dict = image.dict; var w = dict.get('Width', 'W'); var h = dict.get('Height', 'H'); if (!(w && isNum(w)) || !(h && isNum(h))) { warn('Image dimensions are missing, or not numbers.'); return; } var maxImageSize = this.options.maxImageSize; if (maxImageSize !== -1 && w * h > maxImageSize) { warn('Image exceeded maximum allowed size and was removed.'); return; } var imageMask = (dict.get('ImageMask', 'IM') || false); var imgData, args; if (imageMask) { // This depends on a tmpCanvas being filled with the // current fillStyle, such that processing the pixel // data can't be done here. Instead of creating a // complete PDFImage, only read the information needed // for later. var width = dict.get('Width', 'W'); var height = dict.get('Height', 'H'); var bitStrideLength = (width + 7) >> 3; var imgArray = image.getBytes(bitStrideLength * height); var decode = dict.get('Decode', 'D'); var inverseDecode = (!!decode && decode[0] > 0); imgData = PDFImage.createMask(imgArray, width, height, image instanceof DecodeStream, inverseDecode); imgData.cached = true; args = [imgData]; operatorList.addOp(OPS.paintImageMaskXObject, args); if (cacheKey) { imageCache[cacheKey] = { fn: OPS.paintImageMaskXObject, args: args }; } return; } var softMask = (dict.get('SMask', 'SM') || false); var mask = (dict.get('Mask') || false); var SMALL_IMAGE_DIMENSIONS = 200; // Inlining small images into the queue as RGB data if (inline && !softMask && !mask && !(image instanceof JpegStream) && (w + h) < SMALL_IMAGE_DIMENSIONS) { var imageObj = new PDFImage(this.xref, resources, image, inline, null, null); // We force the use of RGBA_32BPP images here, because we can't handle // any other kind. imgData = imageObj.createImageData(/* forceRGBA = */ true); operatorList.addOp(OPS.paintInlineImageXObject, [imgData]); return; } // If there is no imageMask, create the PDFImage and a lot // of image processing can be done here. var uniquePrefix = (this.uniquePrefix || ''); var objId = 'img_' + uniquePrefix + (++this.idCounters.obj); operatorList.addDependency(objId); args = [objId, w, h]; if (!softMask && !mask && image instanceof JpegStream && NativeImageDecoder.isSupported(image, this.xref, resources)) { // These JPEGs don't need any more processing so we can just send it. operatorList.addOp(OPS.paintJpegXObject, args); this.handler.send('obj', [objId, this.pageIndex, 'JpegStream', image.getIR(this.options.forceDataSchema)]); return; } // Creates native image decoder only if a JPEG image or mask is present. var nativeImageDecoder = null; if (image instanceof JpegStream || mask instanceof JpegStream || softMask instanceof JpegStream) { nativeImageDecoder = new NativeImageDecoder(self.xref, resources, self.handler, self.options.forceDataSchema); } PDFImage.buildImage(self.handler, self.xref, resources, image, inline, nativeImageDecoder). then(function(imageObj) { var imgData = imageObj.createImageData(/* forceRGBA = */ false); self.handler.send('obj', [objId, self.pageIndex, 'Image', imgData], [imgData.data.buffer]); }).then(undefined, function (reason) { warn('Unable to decode image: ' + reason); self.handler.send('obj', [objId, self.pageIndex, 'Image', null]); }); operatorList.addOp(OPS.paintImageXObject, args); if (cacheKey) { imageCache[cacheKey] = { fn: OPS.paintImageXObject, args: args }; } }, handleSMask: function PartialEvaluator_handleSmask(smask, resources, operatorList, task, stateManager) { var smaskContent = smask.get('G'); var smaskOptions = { subtype: smask.get('S').name, backdrop: smask.get('BC') }; // The SMask might have a alpha/luminosity value transfer function -- // we will build a map of integer values in range 0..255 to be fast. var transferObj = smask.get('TR'); if (isPDFFunction(transferObj)) { var transferFn = PDFFunction.parse(this.xref, transferObj); var transferMap = new Uint8Array(256); var tmp = new Float32Array(1); for (var i = 0; i < 256; i++) { tmp[0] = i / 255; transferFn(tmp, 0, tmp, 0); transferMap[i] = (tmp[0] * 255) | 0; } smaskOptions.transferMap = transferMap; } return this.buildFormXObject(resources, smaskContent, smaskOptions, operatorList, task, stateManager.state.clone()); }, handleTilingType: function PartialEvaluator_handleTilingType(fn, args, resources, pattern, patternDict, operatorList, task) { // Create an IR of the pattern code. var tilingOpList = new OperatorList(); // Merge the available resources, to prevent issues when the patternDict // is missing some /Resources entries (fixes issue6541.pdf). var resourcesArray = [patternDict.get('Resources'), resources]; var patternResources = Dict.merge(this.xref, resourcesArray); return this.getOperatorList(pattern, task, patternResources, tilingOpList).then(function () { // Add the dependencies to the parent operator list so they are // resolved before sub operator list is executed synchronously. operatorList.addDependencies(tilingOpList.dependencies); operatorList.addOp(fn, getTilingPatternIR({ fnArray: tilingOpList.fnArray, argsArray: tilingOpList.argsArray }, patternDict, args)); }); }, handleSetFont: function PartialEvaluator_handleSetFont(resources, fontArgs, fontRef, operatorList, task, state) { // TODO(mack): Not needed? var fontName; if (fontArgs) { fontArgs = fontArgs.slice(); fontName = fontArgs[0].name; } var self = this; return this.loadFont(fontName, fontRef, this.xref, resources).then( function (translated) { if (!translated.font.isType3Font) { return translated; } return translated.loadType3Data(self, resources, operatorList, task). then(function () { return translated; }, function (reason) { // Error in the font data -- sending unsupported feature notification. self.handler.send('UnsupportedFeature', {featureId: UNSUPPORTED_FEATURES.font}); return new TranslatedFont('g_font_error', new ErrorFont('Type3 font load error: ' + reason), translated.font); }); }).then(function (translated) { state.font = translated.font; translated.send(self.handler); return translated.loadedName; }); }, handleText: function PartialEvaluator_handleText(chars, state) { var font = state.font; var glyphs = font.charsToGlyphs(chars); var isAddToPathSet = !!(state.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG); if (font.data && (isAddToPathSet || this.options.disableFontFace)) { var buildPath = function (fontChar) { if (!font.renderer.hasBuiltPath(fontChar)) { var path = font.renderer.getPathJs(fontChar); this.handler.send('commonobj', [ font.loadedName + '_path_' + fontChar, 'FontPath', path ]); } }.bind(this); for (var i = 0, ii = glyphs.length; i < ii; i++) { var glyph = glyphs[i]; buildPath(glyph.fontChar); // If the glyph has an accent we need to build a path for its // fontChar too, otherwise CanvasGraphics_paintChar will fail. var accent = glyph.accent; if (accent && accent.fontChar) { buildPath(accent.fontChar); } } } return glyphs; }, setGState: function PartialEvaluator_setGState(resources, gState, operatorList, task, xref, stateManager) { // This array holds the converted/processed state data. var gStateObj = []; var gStateKeys = gState.getKeys(); var self = this; var promise = Promise.resolve(); for (var i = 0, ii = gStateKeys.length; i < ii; i++) { var key = gStateKeys[i]; var value = gState.get(key); switch (key) { case 'Type': break; case 'LW': case 'LC': case 'LJ': case 'ML': case 'D': case 'RI': case 'FL': case 'CA': case 'ca': gStateObj.push([key, value]); break; case 'Font': promise = promise.then(function () { return self.handleSetFont(resources, null, value[0], operatorList, task, stateManager.state). then(function (loadedName) { operatorList.addDependency(loadedName); gStateObj.push([key, [loadedName, value[1]]]); }); }); break; case 'BM': gStateObj.push([key, value]); break; case 'SMask': if (isName(value) && value.name === 'None') { gStateObj.push([key, false]); break; } if (isDict(value)) { promise = promise.then(function (dict) { return self.handleSMask(dict, resources, operatorList, task, stateManager); }.bind(this, value)); gStateObj.push([key, true]); } else { warn('Unsupported SMask type'); } break; // Only generate info log messages for the following since // they are unlikely to have a big impact on the rendering. case 'OP': case 'op': case 'OPM': case 'BG': case 'BG2': case 'UCR': case 'UCR2': case 'TR': case 'TR2': case 'HT': case 'SM': case 'SA': case 'AIS': case 'TK': // TODO implement these operators. info('graphic state operator ' + key); break; default: info('Unknown graphic state operator ' + key); break; } } return promise.then(function () { if (gStateObj.length > 0) { operatorList.addOp(OPS.setGState, [gStateObj]); } }); }, loadFont: function PartialEvaluator_loadFont(fontName, font, xref, resources) { function errorFont() { return Promise.resolve(new TranslatedFont('g_font_error', new ErrorFont('Font ' + fontName + ' is not available'), font)); } var fontRef; if (font) { // Loading by ref. assert(isRef(font)); fontRef = font; } else { // Loading by name. var fontRes = resources.get('Font'); if (fontRes) { fontRef = fontRes.getRaw(fontName); } else { warn('fontRes not available'); return errorFont(); } } if (!fontRef) { warn('fontRef not available'); return errorFont(); } if (this.fontCache.has(fontRef)) { return this.fontCache.get(fontRef); } font = xref.fetchIfRef(fontRef); if (!isDict(font)) { return errorFont(); } // We are holding font.translated references just for fontRef that are not // dictionaries (Dict). See explanation below. if (font.translated) { return font.translated; } var fontCapability = createPromiseCapability(); var preEvaluatedFont = this.preEvaluateFont(font, xref); var descriptor = preEvaluatedFont.descriptor; var fontID = fontRef.num + '_' + fontRef.gen; if (isDict(descriptor)) { if (!descriptor.fontAliases) { descriptor.fontAliases = Object.create(null); } var fontAliases = descriptor.fontAliases; var hash = preEvaluatedFont.hash; if (fontAliases[hash]) { var aliasFontRef = fontAliases[hash].aliasRef; if (aliasFontRef && this.fontCache.has(aliasFontRef)) { this.fontCache.putAlias(fontRef, aliasFontRef); return this.fontCache.get(fontRef); } } if (!fontAliases[hash]) { fontAliases[hash] = { fontID: Font.getFontID() }; } fontAliases[hash].aliasRef = fontRef; fontID = fontAliases[hash].fontID; } // Workaround for bad PDF generators that don't reference fonts // properly, i.e. by not using an object identifier. // Check if the fontRef is a Dict (as opposed to a standard object), // in which case we don't cache the font and instead reference it by // fontName in font.loadedName below. var fontRefIsDict = isDict(fontRef); if (!fontRefIsDict) { this.fontCache.put(fontRef, fontCapability.promise); } // Keep track of each font we translated so the caller can // load them asynchronously before calling display on a page. font.loadedName = 'g_' + this.pdfManager.docId + '_f' + (fontRefIsDict ? fontName.replace(/\W/g, '') : fontID); font.translated = fontCapability.promise; // TODO move promises into translate font var translatedPromise; try { translatedPromise = this.translateFont(preEvaluatedFont, xref); } catch (e) { translatedPromise = Promise.reject(e); } var self = this; translatedPromise.then(function (translatedFont) { if (translatedFont.fontType !== undefined) { var xrefFontStats = xref.stats.fontTypes; xrefFontStats[translatedFont.fontType] = true; } fontCapability.resolve(new TranslatedFont(font.loadedName, translatedFont, font)); }, function (reason) { // TODO fontCapability.reject? // Error in the font data -- sending unsupported feature notification. self.handler.send('UnsupportedFeature', {featureId: UNSUPPORTED_FEATURES.font}); try { // error, but it's still nice to have font type reported var descriptor = preEvaluatedFont.descriptor; var fontFile3 = descriptor && descriptor.get('FontFile3'); var subtype = fontFile3 && fontFile3.get('Subtype'); var fontType = getFontType(preEvaluatedFont.type, subtype && subtype.name); var xrefFontStats = xref.stats.fontTypes; xrefFontStats[fontType] = true; } catch (ex) { } fontCapability.resolve(new TranslatedFont(font.loadedName, new ErrorFont(reason instanceof Error ? reason.message : reason), font)); }); return fontCapability.promise; }, buildPath: function PartialEvaluator_buildPath(operatorList, fn, args) { var lastIndex = operatorList.length - 1; if (!args) { args = []; } if (lastIndex < 0 || operatorList.fnArray[lastIndex] !== OPS.constructPath) { operatorList.addOp(OPS.constructPath, [[fn], args]); } else { var opArgs = operatorList.argsArray[lastIndex]; opArgs[0].push(fn); Array.prototype.push.apply(opArgs[1], args); } }, handleColorN: function PartialEvaluator_handleColorN(operatorList, fn, args, cs, patterns, resources, task, xref) { // compile tiling patterns var patternName = args[args.length - 1]; // SCN/scn applies patterns along with normal colors var pattern; if (isName(patternName) && (pattern = patterns.get(patternName.name))) { var dict = (isStream(pattern) ? pattern.dict : pattern); var typeNum = dict.get('PatternType'); if (typeNum === TILING_PATTERN) { var color = cs.base ? cs.base.getRgb(args, 0) : null; return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task); } else if (typeNum === SHADING_PATTERN) { var shading = dict.get('Shading'); var matrix = dict.get('Matrix'); pattern = Pattern.parseShading(shading, matrix, xref, resources, this.handler); operatorList.addOp(fn, pattern.getIR()); return Promise.resolve(); } else { return Promise.reject('Unknown PatternType: ' + typeNum); } } // TODO shall we fail here? operatorList.addOp(fn, args); return Promise.resolve(); }, getOperatorList: function PartialEvaluator_getOperatorList(stream, task, resources, operatorList, initialState) { var self = this; var xref = this.xref; var imageCache = Object.create(null); assert(operatorList); resources = (resources || Dict.empty); var xobjs = (resources.get('XObject') || Dict.empty); var patterns = (resources.get('Pattern') || Dict.empty); var stateManager = new StateManager(initialState || new EvalState()); var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); var timeSlotManager = new TimeSlotManager(); return new Promise(function promiseBody(resolve, reject) { var next = function (promise) { promise.then(function () { try { promiseBody(resolve, reject); } catch (ex) { reject(ex); } }, reject); }; task.ensureNotTerminated(); timeSlotManager.reset(); var stop, operation = {}, i, ii, cs; while (!(stop = timeSlotManager.check())) { // The arguments parsed by read() are used beyond this loop, so we // cannot reuse the same array on each iteration. Therefore we pass // in |null| as the initial value (see the comment on // EvaluatorPreprocessor_read() for why). operation.args = null; if (!(preprocessor.read(operation))) { break; } var args = operation.args; var fn = operation.fn; switch (fn | 0) { case OPS.paintXObject: if (args[0].code) { break; } // eagerly compile XForm objects var name = args[0].name; if (!name) { warn('XObject must be referred to by name.'); continue; } if (imageCache[name] !== undefined) { operatorList.addOp(imageCache[name].fn, imageCache[name].args); args = null; continue; } var xobj = xobjs.get(name); if (xobj) { assert(isStream(xobj), 'XObject should be a stream'); var type = xobj.dict.get('Subtype'); assert(isName(type), 'XObject should have a Name subtype'); if (type.name === 'Form') { stateManager.save(); next(self.buildFormXObject(resources, xobj, null, operatorList, task, stateManager.state.clone()). then(function () { stateManager.restore(); })); return; } else if (type.name === 'Image') { self.buildPaintImageXObject(resources, xobj, false, operatorList, name, imageCache); args = null; continue; } else if (type.name === 'PS') { // PostScript XObjects are unused when viewing documents. // See section 4.7.1 of Adobe's PDF reference. info('Ignored XObject subtype PS'); continue; } else { error('Unhandled XObject subtype ' + type.name); } } break; case OPS.setFont: var fontSize = args[1]; // eagerly collect all fonts next(self.handleSetFont(resources, args, null, operatorList, task, stateManager.state). then(function (loadedName) { operatorList.addDependency(loadedName); operatorList.addOp(OPS.setFont, [loadedName, fontSize]); })); return; case OPS.endInlineImage: var cacheKey = args[0].cacheKey; if (cacheKey) { var cacheEntry = imageCache[cacheKey]; if (cacheEntry !== undefined) { operatorList.addOp(cacheEntry.fn, cacheEntry.args); args = null; continue; } } self.buildPaintImageXObject(resources, args[0], true, operatorList, cacheKey, imageCache); args = null; continue; case OPS.showText: args[0] = self.handleText(args[0], stateManager.state); break; case OPS.showSpacedText: var arr = args[0]; var combinedGlyphs = []; var arrLength = arr.length; var state = stateManager.state; for (i = 0; i < arrLength; ++i) { var arrItem = arr[i]; if (isString(arrItem)) { Array.prototype.push.apply(combinedGlyphs, self.handleText(arrItem, state)); } else if (isNum(arrItem)) { combinedGlyphs.push(arrItem); } } args[0] = combinedGlyphs; fn = OPS.showText; break; case OPS.nextLineShowText: operatorList.addOp(OPS.nextLine); args[0] = self.handleText(args[0], stateManager.state); fn = OPS.showText; break; case OPS.nextLineSetSpacingShowText: operatorList.addOp(OPS.nextLine); operatorList.addOp(OPS.setWordSpacing, [args.shift()]); operatorList.addOp(OPS.setCharSpacing, [args.shift()]); args[0] = self.handleText(args[0], stateManager.state); fn = OPS.showText; break; case OPS.setTextRenderingMode: stateManager.state.textRenderingMode = args[0]; break; case OPS.setFillColorSpace: stateManager.state.fillColorSpace = ColorSpace.parse(args[0], xref, resources); continue; case OPS.setStrokeColorSpace: stateManager.state.strokeColorSpace = ColorSpace.parse(args[0], xref, resources); continue; case OPS.setFillColor: cs = stateManager.state.fillColorSpace; args = cs.getRgb(args, 0); fn = OPS.setFillRGBColor; break; case OPS.setStrokeColor: cs = stateManager.state.strokeColorSpace; args = cs.getRgb(args, 0); fn = OPS.setStrokeRGBColor; break; case OPS.setFillGray: stateManager.state.fillColorSpace = ColorSpace.singletons.gray; args = ColorSpace.singletons.gray.getRgb(args, 0); fn = OPS.setFillRGBColor; break; case OPS.setStrokeGray: stateManager.state.strokeColorSpace = ColorSpace.singletons.gray; args = ColorSpace.singletons.gray.getRgb(args, 0); fn = OPS.setStrokeRGBColor; break; case OPS.setFillCMYKColor: stateManager.state.fillColorSpace = ColorSpace.singletons.cmyk; args = ColorSpace.singletons.cmyk.getRgb(args, 0); fn = OPS.setFillRGBColor; break; case OPS.setStrokeCMYKColor: stateManager.state.strokeColorSpace = ColorSpace.singletons.cmyk; args = ColorSpace.singletons.cmyk.getRgb(args, 0); fn = OPS.setStrokeRGBColor; break; case OPS.setFillRGBColor: stateManager.state.fillColorSpace = ColorSpace.singletons.rgb; args = ColorSpace.singletons.rgb.getRgb(args, 0); break; case OPS.setStrokeRGBColor: stateManager.state.strokeColorSpace = ColorSpace.singletons.rgb; args = ColorSpace.singletons.rgb.getRgb(args, 0); break; case OPS.setFillColorN: cs = stateManager.state.fillColorSpace; if (cs.name === 'Pattern') { next(self.handleColorN(operatorList, OPS.setFillColorN, args, cs, patterns, resources, task, xref)); return; } args = cs.getRgb(args, 0); fn = OPS.setFillRGBColor; break; case OPS.setStrokeColorN: cs = stateManager.state.strokeColorSpace; if (cs.name === 'Pattern') { next(self.handleColorN(operatorList, OPS.setStrokeColorN, args, cs, patterns, resources, task, xref)); return; } args = cs.getRgb(args, 0); fn = OPS.setStrokeRGBColor; break; case OPS.shadingFill: var shadingRes = resources.get('Shading'); if (!shadingRes) { error('No shading resource found'); } var shading = shadingRes.get(args[0].name); if (!shading) { error('No shading object found'); } var shadingFill = Pattern.parseShading(shading, null, xref, resources, self.handler); var patternIR = shadingFill.getIR(); args = [patternIR]; fn = OPS.shadingFill; break; case OPS.setGState: var dictName = args[0]; var extGState = resources.get('ExtGState'); if (!isDict(extGState) || !extGState.has(dictName.name)) { break; } var gState = extGState.get(dictName.name); next(self.setGState(resources, gState, operatorList, task, xref, stateManager)); return; case OPS.moveTo: case OPS.lineTo: case OPS.curveTo: case OPS.curveTo2: case OPS.curveTo3: case OPS.closePath: self.buildPath(operatorList, fn, args); continue; case OPS.rectangle: self.buildPath(operatorList, fn, args); continue; case OPS.markPoint: case OPS.markPointProps: case OPS.beginMarkedContent: case OPS.beginMarkedContentProps: case OPS.endMarkedContent: case OPS.beginCompat: case OPS.endCompat: // Ignore operators where the corresponding handlers are known to // be no-op in CanvasGraphics (display/canvas.js). This prevents // serialization errors and is also a bit more efficient. // We could also try to serialize all objects in a general way, // e.g. as done in https://github.com/mozilla/pdf.js/pull/6266, // but doing so is meaningless without knowing the semantics. continue; default: // Note: Ignore the operator if it has `Dict` arguments, since // those are non-serializable, otherwise postMessage will throw // "An object could not be cloned.". if (args !== null) { for (i = 0, ii = args.length; i < ii; i++) { if (args[i] instanceof Dict) { break; } } if (i < ii) { warn('getOperatorList - ignoring operator: ' + fn); continue; } } } operatorList.addOp(fn, args); } if (stop) { next(deferred); return; } // Some PDFs don't close all restores inside object/form. // Closing those for them. for (i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) { operatorList.addOp(OPS.restore, []); } resolve(); }); }, getTextContent: function PartialEvaluator_getTextContent(stream, task, resources, stateManager, normalizeWhitespace) { stateManager = (stateManager || new StateManager(new TextState())); var WhitespaceRegexp = /\s/g; var textContent = { items: [], styles: Object.create(null) }; var textContentItem = { initialized: false, str: [], width: 0, height: 0, vertical: false, lastAdvanceWidth: 0, lastAdvanceHeight: 0, textAdvanceScale: 0, spaceWidth: 0, fakeSpaceMin: Infinity, fakeMultiSpaceMin: Infinity, fakeMultiSpaceMax: -0, textRunBreakAllowed: false, transform: null, fontName: null }; var SPACE_FACTOR = 0.3; var MULTI_SPACE_FACTOR = 1.5; var MULTI_SPACE_FACTOR_MAX = 4; var self = this; var xref = this.xref; resources = (xref.fetchIfRef(resources) || Dict.empty); // The xobj is parsed iff it's needed, e.g. if there is a `DO` cmd. var xobjs = null; var xobjsCache = Object.create(null); var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); var textState; function ensureTextContentItem() { if (textContentItem.initialized) { return textContentItem; } var font = textState.font; if (!(font.loadedName in textContent.styles)) { textContent.styles[font.loadedName] = { fontFamily: font.fallbackName, ascent: font.ascent, descent: font.descent, vertical: font.vertical }; } textContentItem.fontName = font.loadedName; // 9.4.4 Text Space Details var tsm = [textState.fontSize * textState.textHScale, 0, 0, textState.fontSize, 0, textState.textRise]; if (font.isType3Font && textState.fontMatrix !== FONT_IDENTITY_MATRIX && textState.fontSize === 1) { var glyphHeight = font.bbox[3] - font.bbox[1]; if (glyphHeight > 0) { glyphHeight = glyphHeight * textState.fontMatrix[3]; tsm[3] *= glyphHeight; } } var trm = Util.transform(textState.ctm, Util.transform(textState.textMatrix, tsm)); textContentItem.transform = trm; if (!font.vertical) { textContentItem.width = 0; textContentItem.height = Math.sqrt(trm[2] * trm[2] + trm[3] * trm[3]); textContentItem.vertical = false; } else { textContentItem.width = Math.sqrt(trm[0] * trm[0] + trm[1] * trm[1]); textContentItem.height = 0; textContentItem.vertical = true; } var a = textState.textLineMatrix[0]; var b = textState.textLineMatrix[1]; var scaleLineX = Math.sqrt(a * a + b * b); a = textState.ctm[0]; b = textState.ctm[1]; var scaleCtmX = Math.sqrt(a * a + b * b); textContentItem.textAdvanceScale = scaleCtmX * scaleLineX; textContentItem.lastAdvanceWidth = 0; textContentItem.lastAdvanceHeight = 0; var spaceWidth = font.spaceWidth / 1000 * textState.fontSize; if (spaceWidth) { textContentItem.spaceWidth = spaceWidth; textContentItem.fakeSpaceMin = spaceWidth * SPACE_FACTOR; textContentItem.fakeMultiSpaceMin = spaceWidth * MULTI_SPACE_FACTOR; textContentItem.fakeMultiSpaceMax = spaceWidth * MULTI_SPACE_FACTOR_MAX; // It's okay for monospace fonts to fake as much space as needed. textContentItem.textRunBreakAllowed = !font.isMonospace; } else { textContentItem.spaceWidth = 0; textContentItem.fakeSpaceMin = Infinity; textContentItem.fakeMultiSpaceMin = Infinity; textContentItem.fakeMultiSpaceMax = 0; textContentItem.textRunBreakAllowed = false; } textContentItem.initialized = true; return textContentItem; } function replaceWhitespace(str) { // Replaces all whitespaces with standard spaces (0x20), to avoid // alignment issues between the textLayer and the canvas if the text // contains e.g. tabs (fixes issue6612.pdf). var i = 0, ii = str.length, code; while (i < ii && (code = str.charCodeAt(i)) >= 0x20 && code <= 0x7F) { i++; } return (i < ii ? str.replace(WhitespaceRegexp, ' ') : str); } function runBidiTransform(textChunk) { var str = textChunk.str.join(''); var bidiResult = bidi(str, -1, textChunk.vertical); return { str: (normalizeWhitespace ? replaceWhitespace(bidiResult.str) : bidiResult.str), dir: bidiResult.dir, width: textChunk.width, height: textChunk.height, transform: textChunk.transform, fontName: textChunk.fontName }; } function handleSetFont(fontName, fontRef) { return self.loadFont(fontName, fontRef, xref, resources). then(function (translated) { textState.font = translated.font; textState.fontMatrix = translated.font.fontMatrix || FONT_IDENTITY_MATRIX; }); } function buildTextContentItem(chars) { var font = textState.font; var textChunk = ensureTextContentItem(); var width = 0; var height = 0; var glyphs = font.charsToGlyphs(chars); var defaultVMetrics = font.defaultVMetrics; for (var i = 0; i < glyphs.length; i++) { var glyph = glyphs[i]; var vMetricX = null; var vMetricY = null; var glyphWidth = null; if (font.vertical) { if (glyph.vmetric) { glyphWidth = glyph.vmetric[0]; vMetricX = glyph.vmetric[1]; vMetricY = glyph.vmetric[2]; } else { glyphWidth = glyph.width; vMetricX = glyph.width * 0.5; vMetricY = defaultVMetrics[2]; } } else { glyphWidth = glyph.width; } var glyphUnicode = glyph.unicode; var NormalizedUnicodes = getNormalizedUnicodes(); if (NormalizedUnicodes[glyphUnicode] !== undefined) { glyphUnicode = NormalizedUnicodes[glyphUnicode]; } glyphUnicode = reverseIfRtl(glyphUnicode); // The following will calculate the x and y of the individual glyphs. // if (font.vertical) { // tsm[4] -= vMetricX * Math.abs(textState.fontSize) * // textState.fontMatrix[0]; // tsm[5] -= vMetricY * textState.fontSize * // textState.fontMatrix[0]; // } // var trm = Util.transform(textState.textMatrix, tsm); // var pt = Util.applyTransform([trm[4], trm[5]], textState.ctm); // var x = pt[0]; // var y = pt[1]; var charSpacing = textState.charSpacing; if (glyph.isSpace) { var wordSpacing = textState.wordSpacing; charSpacing += wordSpacing; if (wordSpacing > 0) { addFakeSpaces(wordSpacing, textChunk.str); } } var tx = 0; var ty = 0; if (!font.vertical) { var w0 = glyphWidth * textState.fontMatrix[0]; tx = (w0 * textState.fontSize + charSpacing) * textState.textHScale; width += tx; } else { var w1 = glyphWidth * textState.fontMatrix[0]; ty = w1 * textState.fontSize + charSpacing; height += ty; } textState.translateTextMatrix(tx, ty); textChunk.str.push(glyphUnicode); } if (!font.vertical) { textChunk.lastAdvanceWidth = width; textChunk.width += width * textChunk.textAdvanceScale; } else { textChunk.lastAdvanceHeight = height; textChunk.height += Math.abs(height * textChunk.textAdvanceScale); } return textChunk; } function addFakeSpaces(width, strBuf) { if (width < textContentItem.fakeSpaceMin) { return; } if (width < textContentItem.fakeMultiSpaceMin) { strBuf.push(' '); return; } var fakeSpaces = Math.round(width / textContentItem.spaceWidth); while (fakeSpaces-- > 0) { strBuf.push(' '); } } function flushTextContentItem() { if (!textContentItem.initialized) { return; } textContent.items.push(runBidiTransform(textContentItem)); textContentItem.initialized = false; textContentItem.str.length = 0; } var timeSlotManager = new TimeSlotManager(); return new Promise(function promiseBody(resolve, reject) { var next = function (promise) { promise.then(function () { try { promiseBody(resolve, reject); } catch (ex) { reject(ex); } }, reject); }; task.ensureNotTerminated(); timeSlotManager.reset(); var stop, operation = {}, args = []; while (!(stop = timeSlotManager.check())) { // The arguments parsed by read() are not used beyond this loop, so // we can reuse the same array on every iteration, thus avoiding // unnecessary allocations. args.length = 0; operation.args = args; if (!(preprocessor.read(operation))) { break; } textState = stateManager.state; var fn = operation.fn; args = operation.args; var advance; switch (fn | 0) { case OPS.setFont: flushTextContentItem(); textState.fontSize = args[1]; next(handleSetFont(args[0].name)); return; case OPS.setTextRise: flushTextContentItem(); textState.textRise = args[0]; break; case OPS.setHScale: flushTextContentItem(); textState.textHScale = args[0] / 100; break; case OPS.setLeading: flushTextContentItem(); textState.leading = args[0]; break; case OPS.moveText: // Optimization to treat same line movement as advance var isSameTextLine = !textState.font ? false : ((textState.font.vertical ? args[0] : args[1]) === 0); advance = args[0] - args[1]; if (isSameTextLine && textContentItem.initialized && advance > 0 && advance <= textContentItem.fakeMultiSpaceMax) { textState.translateTextLineMatrix(args[0], args[1]); textContentItem.width += (args[0] - textContentItem.lastAdvanceWidth); textContentItem.height += (args[1] - textContentItem.lastAdvanceHeight); var diff = (args[0] - textContentItem.lastAdvanceWidth) - (args[1] - textContentItem.lastAdvanceHeight); addFakeSpaces(diff, textContentItem.str); break; } flushTextContentItem(); textState.translateTextLineMatrix(args[0], args[1]); textState.textMatrix = textState.textLineMatrix.slice(); break; case OPS.setLeadingMoveText: flushTextContentItem(); textState.leading = -args[1]; textState.translateTextLineMatrix(args[0], args[1]); textState.textMatrix = textState.textLineMatrix.slice(); break; case OPS.nextLine: flushTextContentItem(); textState.carriageReturn(); break; case OPS.setTextMatrix: flushTextContentItem(); textState.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]); textState.setTextLineMatrix(args[0], args[1], args[2], args[3], args[4], args[5]); break; case OPS.setCharSpacing: textState.charSpacing = args[0]; break; case OPS.setWordSpacing: textState.wordSpacing = args[0]; break; case OPS.beginText: flushTextContentItem(); textState.textMatrix = IDENTITY_MATRIX.slice(); textState.textLineMatrix = IDENTITY_MATRIX.slice(); break; case OPS.showSpacedText: var items = args[0]; var offset; for (var j = 0, jj = items.length; j < jj; j++) { if (typeof items[j] === 'string') { buildTextContentItem(items[j]); } else { ensureTextContentItem(); // PDF Specification 5.3.2 states: // The number is expressed in thousandths of a unit of text // space. // This amount is subtracted from the current horizontal or // vertical coordinate, depending on the writing mode. // In the default coordinate system, a positive adjustment // has the effect of moving the next glyph painted either to // the left or down by the given amount. advance = items[j] * textState.fontSize / 1000; var breakTextRun = false; if (textState.font.vertical) { offset = advance * (textState.textHScale * textState.textMatrix[2] + textState.textMatrix[3]); textState.translateTextMatrix(0, advance); breakTextRun = textContentItem.textRunBreakAllowed && advance > textContentItem.fakeMultiSpaceMax; if (!breakTextRun) { // Value needs to be added to height to paint down. textContentItem.height += offset; } } else { advance = -advance; offset = advance * ( textState.textHScale * textState.textMatrix[0] + textState.textMatrix[1]); textState.translateTextMatrix(advance, 0); breakTextRun = textContentItem.textRunBreakAllowed && advance > textContentItem.fakeMultiSpaceMax; if (!breakTextRun) { // Value needs to be subtracted from width to paint left. textContentItem.width += offset; } } if (breakTextRun) { flushTextContentItem(); } else if (advance > 0) { addFakeSpaces(advance, textContentItem.str); } } } break; case OPS.showText: buildTextContentItem(args[0]); break; case OPS.nextLineShowText: flushTextContentItem(); textState.carriageReturn(); buildTextContentItem(args[0]); break; case OPS.nextLineSetSpacingShowText: flushTextContentItem(); textState.wordSpacing = args[0]; textState.charSpacing = args[1]; textState.carriageReturn(); buildTextContentItem(args[2]); break; case OPS.paintXObject: flushTextContentItem(); if (args[0].code) { break; } if (!xobjs) { xobjs = (resources.get('XObject') || Dict.empty); } var name = args[0].name; if (xobjsCache.key === name) { if (xobjsCache.texts) { Util.appendToArray(textContent.items, xobjsCache.texts.items); Util.extendObj(textContent.styles, xobjsCache.texts.styles); } break; } var xobj = xobjs.get(name); if (!xobj) { break; } assert(isStream(xobj), 'XObject should be a stream'); var type = xobj.dict.get('Subtype'); assert(isName(type), 'XObject should have a Name subtype'); if ('Form' !== type.name) { xobjsCache.key = name; xobjsCache.texts = null; break; } stateManager.save(); var matrix = xobj.dict.get('Matrix'); if (isArray(matrix) && matrix.length === 6) { stateManager.transform(matrix); } next(self.getTextContent(xobj, task, xobj.dict.get('Resources') || resources, stateManager, normalizeWhitespace).then(function (formTextContent) { Util.appendToArray(textContent.items, formTextContent.items); Util.extendObj(textContent.styles, formTextContent.styles); stateManager.restore(); xobjsCache.key = name; xobjsCache.texts = formTextContent; })); return; case OPS.setGState: flushTextContentItem(); var dictName = args[0]; var extGState = resources.get('ExtGState'); if (!isDict(extGState) || !extGState.has(dictName.name)) { break; } var gsStateMap = extGState.get(dictName.name); var gsStateFont = null; for (var key in gsStateMap) { if (key === 'Font') { assert(!gsStateFont); gsStateFont = gsStateMap[key]; } } if (gsStateFont) { textState.fontSize = gsStateFont[1]; next(handleSetFont(gsStateFont[0])); return; } break; } // switch } // while if (stop) { next(deferred); return; } flushTextContentItem(); resolve(textContent); }); }, extractDataStructures: function PartialEvaluator_extractDataStructures(dict, baseDict, xref, properties) { // 9.10.2 var toUnicode = (dict.get('ToUnicode') || baseDict.get('ToUnicode')); var toUnicodePromise = toUnicode ? this.readToUnicode(toUnicode) : Promise.resolve(undefined); if (properties.composite) { // CIDSystemInfo helps to match CID to glyphs var cidSystemInfo = dict.get('CIDSystemInfo'); if (isDict(cidSystemInfo)) { properties.cidSystemInfo = { registry: cidSystemInfo.get('Registry'), ordering: cidSystemInfo.get('Ordering'), supplement: cidSystemInfo.get('Supplement') }; } var cidToGidMap = dict.get('CIDToGIDMap'); if (isStream(cidToGidMap)) { properties.cidToGidMap = this.readCidToGidMap(cidToGidMap); } } // Based on 9.6.6 of the spec the encoding can come from multiple places // and depends on the font type. The base encoding and differences are // read here, but the encoding that is actually used is chosen during // glyph mapping in the font. // TODO: Loading the built in encoding in the font would allow the // differences to be merged in here not require us to hold on to it. var differences = []; var baseEncodingName = null; var encoding; if (dict.has('Encoding')) { encoding = dict.get('Encoding'); if (isDict(encoding)) { baseEncodingName = encoding.get('BaseEncoding'); baseEncodingName = (isName(baseEncodingName) ? baseEncodingName.name : null); // Load the differences between the base and original if (encoding.has('Differences')) { var diffEncoding = encoding.get('Differences'); var index = 0; for (var j = 0, jj = diffEncoding.length; j < jj; j++) { var data = xref.fetchIfRef(diffEncoding[j]); if (isNum(data)) { index = data; } else if (isName(data)) { differences[index++] = data.name; } else { error('Invalid entry in \'Differences\' array: ' + data); } } } } else if (isName(encoding)) { baseEncodingName = encoding.name; } else { error('Encoding is not a Name nor a Dict'); } // According to table 114 if the encoding is a named encoding it must be // one of these predefined encodings. if ((baseEncodingName !== 'MacRomanEncoding' && baseEncodingName !== 'MacExpertEncoding' && baseEncodingName !== 'WinAnsiEncoding')) { baseEncodingName = null; } } if (baseEncodingName) { properties.defaultEncoding = getEncoding(baseEncodingName).slice(); } else { encoding = (properties.type === 'TrueType' ? WinAnsiEncoding : StandardEncoding); // The Symbolic attribute can be misused for regular fonts // Heuristic: we have to check if the font is a standard one also if (!!(properties.flags & FontFlags.Symbolic)) { encoding = MacRomanEncoding; if (!properties.file) { if (/Symbol/i.test(properties.name)) { encoding = SymbolSetEncoding; } else if (/Dingbats/i.test(properties.name)) { encoding = ZapfDingbatsEncoding; } } } properties.defaultEncoding = encoding; } properties.differences = differences; properties.baseEncodingName = baseEncodingName; properties.dict = dict; return toUnicodePromise.then(function(toUnicode) { properties.toUnicode = toUnicode; return this.buildToUnicode(properties); }.bind(this)).then(function (toUnicode) { properties.toUnicode = toUnicode; return properties; }); }, /** * Builds a char code to unicode map based on section 9.10 of the spec. * @param {Object} properties Font properties object. * @return {Promise} A Promise that is resolved with a * {ToUnicodeMap|IdentityToUnicodeMap} object. */ buildToUnicode: function PartialEvaluator_buildToUnicode(properties) { // Section 9.10.2 Mapping Character Codes to Unicode Values if (properties.toUnicode && properties.toUnicode.length !== 0) { return Promise.resolve(properties.toUnicode); } // According to the spec if the font is a simple font we should only map // to unicode if the base encoding is MacRoman, MacExpert, or WinAnsi or // the differences array only contains adobe standard or symbol set names, // in pratice it seems better to always try to create a toUnicode // map based of the default encoding. var toUnicode, charcode; if (!properties.composite /* is simple font */) { toUnicode = []; var encoding = properties.defaultEncoding.slice(); var baseEncodingName = properties.baseEncodingName; // Merge in the differences array. var differences = properties.differences; for (charcode in differences) { encoding[charcode] = differences[charcode]; } var glyphsUnicodeMap = getGlyphsUnicode(); for (charcode in encoding) { // a) Map the character code to a character name. var glyphName = encoding[charcode]; // b) Look up the character name in the Adobe Glyph List (see the // Bibliography) to obtain the corresponding Unicode value. if (glyphName === '') { continue; } else if (glyphsUnicodeMap[glyphName] === undefined) { // (undocumented) c) Few heuristics to recognize unknown glyphs // NOTE: Adobe Reader does not do this step, but OSX Preview does var code = 0; switch (glyphName[0]) { case 'G': // Gxx glyph if (glyphName.length === 3) { code = parseInt(glyphName.substr(1), 16); } break; case 'g': // g00xx glyph if (glyphName.length === 5) { code = parseInt(glyphName.substr(1), 16); } break; case 'C': // Cddd glyph case 'c': // cddd glyph if (glyphName.length >= 3) { code = +glyphName.substr(1); } break; default: // 'uniXXXX'/'uXXXX{XX}' glyphs var unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); if (unicode !== -1) { code = unicode; } } if (code) { // If |baseEncodingName| is one the predefined encodings, // and |code| equals |charcode|, using the glyph defined in the // baseEncoding seems to yield a better |toUnicode| mapping // (fixes issue 5070). if (baseEncodingName && code === +charcode) { var baseEncoding = getEncoding(baseEncodingName); if (baseEncoding && (glyphName = baseEncoding[charcode])) { toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]); continue; } } toUnicode[charcode] = String.fromCharCode(code); } continue; } toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]); } return Promise.resolve(new ToUnicodeMap(toUnicode)); } // If the font is a composite font that uses one of the predefined CMaps // listed in Table 118 (except Identity–H and Identity–V) or whose // descendant CIDFont uses the Adobe-GB1, Adobe-CNS1, Adobe-Japan1, or // Adobe-Korea1 character collection: if (properties.composite && ( (properties.cMap.builtInCMap && !(properties.cMap instanceof IdentityCMap)) || (properties.cidSystemInfo.registry === 'Adobe' && (properties.cidSystemInfo.ordering === 'GB1' || properties.cidSystemInfo.ordering === 'CNS1' || properties.cidSystemInfo.ordering === 'Japan1' || properties.cidSystemInfo.ordering === 'Korea1')))) { // Then: // a) Map the character code to a character identifier (CID) according // to the font’s CMap. // b) Obtain the registry and ordering of the character collection used // by the font’s CMap (for example, Adobe and Japan1) from its // CIDSystemInfo dictionary. var registry = properties.cidSystemInfo.registry; var ordering = properties.cidSystemInfo.ordering; // c) Construct a second CMap name by concatenating the registry and // ordering obtained in step (b) in the format registry–ordering–UCS2 // (for example, Adobe–Japan1–UCS2). var ucs2CMapName = Name.get(registry + '-' + ordering + '-UCS2'); // d) Obtain the CMap with the name constructed in step (c) (available // from the ASN Web site; see the Bibliography). return CMapFactory.create(ucs2CMapName, this.options.cMapOptions, null).then( function (ucs2CMap) { var cMap = properties.cMap; toUnicode = []; cMap.forEach(function(charcode, cid) { assert(cid <= 0xffff, 'Max size of CID is 65,535'); // e) Map the CID obtained in step (a) according to the CMap // obtained in step (d), producing a Unicode value. var ucs2 = ucs2CMap.lookup(cid); if (ucs2) { toUnicode[charcode] = String.fromCharCode((ucs2.charCodeAt(0) << 8) + ucs2.charCodeAt(1)); } }); return new ToUnicodeMap(toUnicode); }); } // The viewer's choice, just use an identity map. return Promise.resolve(new IdentityToUnicodeMap(properties.firstChar, properties.lastChar)); }, readToUnicode: function PartialEvaluator_readToUnicode(toUnicode) { var cmapObj = toUnicode; if (isName(cmapObj)) { return CMapFactory.create(cmapObj, this.options.cMapOptions, null).then( function (cmap) { if (cmap instanceof IdentityCMap) { return new IdentityToUnicodeMap(0, 0xFFFF); } return new ToUnicodeMap(cmap.getMap()); }); } else if (isStream(cmapObj)) { return CMapFactory.create(cmapObj, this.options.cMapOptions, null).then( function (cmap) { if (cmap instanceof IdentityCMap) { return new IdentityToUnicodeMap(0, 0xFFFF); } var map = new Array(cmap.length); // Convert UTF-16BE // NOTE: cmap can be a sparse array, so use forEach instead of for(;;) // to iterate over all keys. cmap.forEach(function(charCode, token) { var str = []; for (var k = 0; k < token.length; k += 2) { var w1 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); if ((w1 & 0xF800) !== 0xD800) { // w1 < 0xD800 || w1 > 0xDFFF str.push(w1); continue; } k += 2; var w2 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000); } map[charCode] = String.fromCharCode.apply(String, str); }); return new ToUnicodeMap(map); }); } return Promise.resolve(null); }, readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) { // Extract the encoding from the CIDToGIDMap var glyphsData = cidToGidStream.getBytes(); // Set encoding 0 to later verify the font has an encoding var result = []; for (var j = 0, jj = glyphsData.length; j < jj; j++) { var glyphID = (glyphsData[j++] << 8) | glyphsData[j]; if (glyphID === 0) { continue; } var code = j >> 1; result[code] = glyphID; } return result; }, extractWidths: function PartialEvaluator_extractWidths(dict, xref, descriptor, properties) { var glyphsWidths = []; var defaultWidth = 0; var glyphsVMetrics = []; var defaultVMetrics; var i, ii, j, jj, start, code, widths; if (properties.composite) { defaultWidth = dict.get('DW') || 1000; widths = dict.get('W'); if (widths) { for (i = 0, ii = widths.length; i < ii; i++) { start = widths[i++]; code = xref.fetchIfRef(widths[i]); if (isArray(code)) { for (j = 0, jj = code.length; j < jj; j++) { glyphsWidths[start++] = code[j]; } } else { var width = widths[++i]; for (j = start; j <= code; j++) { glyphsWidths[j] = width; } } } } if (properties.vertical) { var vmetrics = (dict.get('DW2') || [880, -1000]); defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]]; vmetrics = dict.get('W2'); if (vmetrics) { for (i = 0, ii = vmetrics.length; i < ii; i++) { start = vmetrics[i++]; code = xref.fetchIfRef(vmetrics[i]); if (isArray(code)) { for (j = 0, jj = code.length; j < jj; j++) { glyphsVMetrics[start++] = [code[j++], code[j++], code[j]]; } } else { var vmetric = [vmetrics[++i], vmetrics[++i], vmetrics[++i]]; for (j = start; j <= code; j++) { glyphsVMetrics[j] = vmetric; } } } } } } else { var firstChar = properties.firstChar; widths = dict.get('Widths'); if (widths) { j = firstChar; for (i = 0, ii = widths.length; i < ii; i++) { glyphsWidths[j++] = widths[i]; } defaultWidth = (parseFloat(descriptor.get('MissingWidth')) || 0); } else { // Trying get the BaseFont metrics (see comment above). var baseFontName = dict.get('BaseFont'); if (isName(baseFontName)) { var metrics = this.getBaseFontMetrics(baseFontName.name); glyphsWidths = this.buildCharCodeToWidth(metrics.widths, properties); defaultWidth = metrics.defaultWidth; } } } // Heuristic: detection of monospace font by checking all non-zero widths var isMonospace = true; var firstWidth = defaultWidth; for (var glyph in glyphsWidths) { var glyphWidth = glyphsWidths[glyph]; if (!glyphWidth) { continue; } if (!firstWidth) { firstWidth = glyphWidth; continue; } if (firstWidth !== glyphWidth) { isMonospace = false; break; } } if (isMonospace) { properties.flags |= FontFlags.FixedPitch; } properties.defaultWidth = defaultWidth; properties.widths = glyphsWidths; properties.defaultVMetrics = defaultVMetrics; properties.vmetrics = glyphsVMetrics; }, isSerifFont: function PartialEvaluator_isSerifFont(baseFontName) { // Simulating descriptor flags attribute var fontNameWoStyle = baseFontName.split('-')[0]; return (fontNameWoStyle in getSerifFonts()) || (fontNameWoStyle.search(/serif/gi) !== -1); }, getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) { var defaultWidth = 0; var widths = []; var monospace = false; var stdFontMap = getStdFontMap(); var lookupName = (stdFontMap[name] || name); var Metrics = getMetrics(); if (!(lookupName in Metrics)) { // Use default fonts for looking up font metrics if the passed // font is not a base font if (this.isSerifFont(name)) { lookupName = 'Times-Roman'; } else { lookupName = 'Helvetica'; } } var glyphWidths = Metrics[lookupName]; if (isNum(glyphWidths)) { defaultWidth = glyphWidths; monospace = true; } else { widths = glyphWidths(); // expand lazy widths array } return { defaultWidth: defaultWidth, monospace: monospace, widths: widths }; }, buildCharCodeToWidth: function PartialEvaluator_bulildCharCodeToWidth(widthsByGlyphName, properties) { var widths = Object.create(null); var differences = properties.differences; var encoding = properties.defaultEncoding; for (var charCode = 0; charCode < 256; charCode++) { if (charCode in differences && widthsByGlyphName[differences[charCode]]) { widths[charCode] = widthsByGlyphName[differences[charCode]]; continue; } if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) { widths[charCode] = widthsByGlyphName[encoding[charCode]]; continue; } } return widths; }, preEvaluateFont: function PartialEvaluator_preEvaluateFont(dict, xref) { var baseDict = dict; var type = dict.get('Subtype'); assert(isName(type), 'invalid font Subtype'); var composite = false; var uint8array; if (type.name === 'Type0') { // If font is a composite // - get the descendant font // - set the type according to the descendant font // - get the FontDescriptor from the descendant font var df = dict.get('DescendantFonts'); if (!df) { error('Descendant fonts are not specified'); } dict = (isArray(df) ? xref.fetchIfRef(df[0]) : df); type = dict.get('Subtype'); assert(isName(type), 'invalid font Subtype'); composite = true; } var descriptor = dict.get('FontDescriptor'); if (descriptor) { var hash = new MurmurHash3_64(); var encoding = baseDict.getRaw('Encoding'); if (isName(encoding)) { hash.update(encoding.name); } else if (isRef(encoding)) { hash.update(encoding.num + '_' + encoding.gen); } else if (isDict(encoding)) { var keys = encoding.getKeys(); for (var i = 0, ii = keys.length; i < ii; i++) { var entry = encoding.getRaw(keys[i]); if (isName(entry)) { hash.update(entry.name); } else if (isRef(entry)) { hash.update(entry.num + '_' + entry.gen); } else if (isArray(entry)) { // 'Differences' entry. // Ideally we should check the contents of the array, but to avoid // parsing it here and then again in |extractDataStructures|, // we only use the array length for now (fixes bug1157493.pdf). hash.update(entry.length.toString()); } } } var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode'); if (isStream(toUnicode)) { var stream = toUnicode.str || toUnicode; uint8array = stream.buffer ? new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : new Uint8Array(stream.bytes.buffer, stream.start, stream.end - stream.start); hash.update(uint8array); } else if (isName(toUnicode)) { hash.update(toUnicode.name); } var widths = dict.get('Widths') || baseDict.get('Widths'); if (widths) { uint8array = new Uint8Array(new Uint32Array(widths).buffer); hash.update(uint8array); } } return { descriptor: descriptor, dict: dict, baseDict: baseDict, composite: composite, type: type.name, hash: hash ? hash.hexdigest() : '' }; }, translateFont: function PartialEvaluator_translateFont(preEvaluatedFont, xref) { var baseDict = preEvaluatedFont.baseDict; var dict = preEvaluatedFont.dict; var composite = preEvaluatedFont.composite; var descriptor = preEvaluatedFont.descriptor; var type = preEvaluatedFont.type; var maxCharIndex = (composite ? 0xFFFF : 0xFF); var cMapOptions = this.options.cMapOptions; var properties; if (!descriptor) { if (type === 'Type3') { // FontDescriptor is only required for Type3 fonts when the document // is a tagged pdf. Create a barbebones one to get by. descriptor = new Dict(null); descriptor.set('FontName', Name.get(type)); descriptor.set('FontBBox', dict.get('FontBBox')); } else { // Before PDF 1.5 if the font was one of the base 14 fonts, having a // FontDescriptor was not required. // This case is here for compatibility. var baseFontName = dict.get('BaseFont'); if (!isName(baseFontName)) { error('Base font is not specified'); } // Using base font name as a font name. baseFontName = baseFontName.name.replace(/[,_]/g, '-'); var metrics = this.getBaseFontMetrics(baseFontName); // Simulating descriptor flags attribute var fontNameWoStyle = baseFontName.split('-')[0]; var flags = (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) | (metrics.monospace ? FontFlags.FixedPitch : 0) | (getSymbolsFonts()[fontNameWoStyle] ? FontFlags.Symbolic : FontFlags.Nonsymbolic); properties = { type: type, name: baseFontName, widths: metrics.widths, defaultWidth: metrics.defaultWidth, flags: flags, firstChar: 0, lastChar: maxCharIndex }; return this.extractDataStructures(dict, dict, xref, properties).then( function (properties) { properties.widths = this.buildCharCodeToWidth(metrics.widths, properties); return new Font(baseFontName, null, properties); }.bind(this)); } } // According to the spec if 'FontDescriptor' is declared, 'FirstChar', // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem // to ignore this rule when a variant of a standart font is used. // TODO Fill the width array depending on which of the base font this is // a variant. var firstChar = (dict.get('FirstChar') || 0); var lastChar = (dict.get('LastChar') || maxCharIndex); var fontName = descriptor.get('FontName'); var baseFont = dict.get('BaseFont'); // Some bad PDFs have a string as the font name. if (isString(fontName)) { fontName = Name.get(fontName); } if (isString(baseFont)) { baseFont = Name.get(baseFont); } if (type !== 'Type3') { var fontNameStr = fontName && fontName.name; var baseFontStr = baseFont && baseFont.name; if (fontNameStr !== baseFontStr) { info('The FontDescriptor\'s FontName is "' + fontNameStr + '" but should be the same as the Font\'s BaseFont "' + baseFontStr + '"'); // Workaround for cases where e.g. fontNameStr = 'Arial' and // baseFontStr = 'Arial,Bold' (needed when no font file is embedded). if (fontNameStr && baseFontStr && baseFontStr.indexOf(fontNameStr) === 0) { fontName = baseFont; } } } fontName = (fontName || baseFont); assert(isName(fontName), 'invalid font name'); var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3'); if (fontFile) { if (fontFile.dict) { var subtype = fontFile.dict.get('Subtype'); if (subtype) { subtype = subtype.name; } var length1 = fontFile.dict.get('Length1'); var length2 = fontFile.dict.get('Length2'); var length3 = fontFile.dict.get('Length3'); } } properties = { type: type, name: fontName.name, subtype: subtype, file: fontFile, length1: length1, length2: length2, length3: length3, loadedName: baseDict.loadedName, composite: composite, wideChars: composite, fixedPitch: false, fontMatrix: (dict.get('FontMatrix') || FONT_IDENTITY_MATRIX), firstChar: firstChar || 0, lastChar: (lastChar || maxCharIndex), bbox: descriptor.get('FontBBox'), ascent: descriptor.get('Ascent'), descent: descriptor.get('Descent'), xHeight: descriptor.get('XHeight'), capHeight: descriptor.get('CapHeight'), flags: descriptor.get('Flags'), italicAngle: descriptor.get('ItalicAngle'), coded: false }; var cMapPromise; if (composite) { var cidEncoding = baseDict.get('Encoding'); if (isName(cidEncoding)) { properties.cidEncoding = cidEncoding.name; } cMapPromise = CMapFactory.create(cidEncoding, cMapOptions, null).then( function (cMap) { properties.cMap = cMap; properties.vertical = properties.cMap.vertical; }); } else { cMapPromise = Promise.resolve(undefined); } return cMapPromise.then(function () { return this.extractDataStructures(dict, baseDict, xref, properties); }.bind(this)).then(function (properties) { this.extractWidths(dict, xref, descriptor, properties); if (type === 'Type3') { properties.isType3Font = true; } return new Font(fontName.name, fontFile, properties); }.bind(this)); } }; return PartialEvaluator; })(); var TranslatedFont = (function TranslatedFontClosure() { function TranslatedFont(loadedName, font, dict) { this.loadedName = loadedName; this.font = font; this.dict = dict; this.type3Loaded = null; this.sent = false; } TranslatedFont.prototype = { send: function (handler) { if (this.sent) { return; } var fontData = this.font.exportData(); handler.send('commonobj', [ this.loadedName, 'Font', fontData ]); this.sent = true; }, loadType3Data: function (evaluator, resources, parentOperatorList, task) { assert(this.font.isType3Font); if (this.type3Loaded) { return this.type3Loaded; } var translatedFont = this.font; var loadCharProcsPromise = Promise.resolve(); var charProcs = this.dict.get('CharProcs'); var fontResources = this.dict.get('Resources') || resources; var charProcKeys = charProcs.getKeys(); var charProcOperatorList = Object.create(null); for (var i = 0, n = charProcKeys.length; i < n; ++i) { loadCharProcsPromise = loadCharProcsPromise.then(function (key) { var glyphStream = charProcs.get(key); var operatorList = new OperatorList(); return evaluator.getOperatorList(glyphStream, task, fontResources, operatorList).then(function () { charProcOperatorList[key] = operatorList.getIR(); // Add the dependencies to the parent operator list so they are // resolved before sub operator list is executed synchronously. parentOperatorList.addDependencies(operatorList.dependencies); }, function (reason) { warn('Type3 font resource \"' + key + '\" is not available'); var operatorList = new OperatorList(); charProcOperatorList[key] = operatorList.getIR(); }); }.bind(this, charProcKeys[i])); } this.type3Loaded = loadCharProcsPromise.then(function () { translatedFont.charProcOperatorList = charProcOperatorList; }); return this.type3Loaded; } }; return TranslatedFont; })(); var OperatorList = (function OperatorListClosure() { var CHUNK_SIZE = 1000; var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5; // close to chunk size function getTransfers(queue) { var transfers = []; var fnArray = queue.fnArray, argsArray = queue.argsArray; for (var i = 0, ii = queue.length; i < ii; i++) { switch (fnArray[i]) { case OPS.paintInlineImageXObject: case OPS.paintInlineImageXObjectGroup: case OPS.paintImageMaskXObject: var arg = argsArray[i][0]; // first param in imgData if (!arg.cached) { transfers.push(arg.data.buffer); } break; } } return transfers; } function OperatorList(intent, messageHandler, pageIndex) { this.messageHandler = messageHandler; this.fnArray = []; this.argsArray = []; this.dependencies = Object.create(null); this._totalLength = 0; this.pageIndex = pageIndex; this.intent = intent; } OperatorList.prototype = { get length() { return this.argsArray.length; }, /** * @returns {number} The total length of the entire operator list, * since `this.length === 0` after flushing. */ get totalLength() { return (this._totalLength + this.length); }, addOp: function(fn, args) { this.fnArray.push(fn); this.argsArray.push(args); if (this.messageHandler) { if (this.fnArray.length >= CHUNK_SIZE) { this.flush(); } else if (this.fnArray.length >= CHUNK_SIZE_ABOUT && (fn === OPS.restore || fn === OPS.endText)) { // heuristic to flush on boundary of restore or endText this.flush(); } } }, addDependency: function(dependency) { if (dependency in this.dependencies) { return; } this.dependencies[dependency] = true; this.addOp(OPS.dependency, [dependency]); }, addDependencies: function(dependencies) { for (var key in dependencies) { this.addDependency(key); } }, addOpList: function(opList) { Util.extendObj(this.dependencies, opList.dependencies); for (var i = 0, ii = opList.length; i < ii; i++) { this.addOp(opList.fnArray[i], opList.argsArray[i]); } }, getIR: function() { return { fnArray: this.fnArray, argsArray: this.argsArray, length: this.length }; }, flush: function(lastChunk) { if (this.intent !== 'oplist') { new QueueOptimizer().optimize(this); } var transfers = getTransfers(this); var length = this.length; this._totalLength += length; this.messageHandler.send('RenderPageChunk', { operatorList: { fnArray: this.fnArray, argsArray: this.argsArray, lastChunk: lastChunk, length: length }, pageIndex: this.pageIndex, intent: this.intent }, transfers); this.dependencies = Object.create(null); this.fnArray.length = 0; this.argsArray.length = 0; } }; return OperatorList; })(); var StateManager = (function StateManagerClosure() { function StateManager(initialState) { this.state = initialState; this.stateStack = []; } StateManager.prototype = { save: function () { var old = this.state; this.stateStack.push(this.state); this.state = old.clone(); }, restore: function () { var prev = this.stateStack.pop(); if (prev) { this.state = prev; } }, transform: function (args) { this.state.ctm = Util.transform(this.state.ctm, args); } }; return StateManager; })(); var TextState = (function TextStateClosure() { function TextState() { this.ctm = new Float32Array(IDENTITY_MATRIX); this.fontSize = 0; this.font = null; this.fontMatrix = FONT_IDENTITY_MATRIX; this.textMatrix = IDENTITY_MATRIX.slice(); this.textLineMatrix = IDENTITY_MATRIX.slice(); this.charSpacing = 0; this.wordSpacing = 0; this.leading = 0; this.textHScale = 1; this.textRise = 0; } TextState.prototype = { setTextMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) { var m = this.textMatrix; m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f; }, setTextLineMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) { var m = this.textLineMatrix; m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f; }, translateTextMatrix: function TextState_translateTextMatrix(x, y) { var m = this.textMatrix; m[4] = m[0] * x + m[2] * y + m[4]; m[5] = m[1] * x + m[3] * y + m[5]; }, translateTextLineMatrix: function TextState_translateTextMatrix(x, y) { var m = this.textLineMatrix; m[4] = m[0] * x + m[2] * y + m[4]; m[5] = m[1] * x + m[3] * y + m[5]; }, calcRenderMatrix: function TextState_calcRendeMatrix(ctm) { // 9.4.4 Text Space Details var tsm = [this.fontSize * this.textHScale, 0, 0, this.fontSize, 0, this.textRise]; return Util.transform(ctm, Util.transform(this.textMatrix, tsm)); }, carriageReturn: function TextState_carriageReturn() { this.translateTextLineMatrix(0, -this.leading); this.textMatrix = this.textLineMatrix.slice(); }, clone: function TextState_clone() { var clone = Object.create(this); clone.textMatrix = this.textMatrix.slice(); clone.textLineMatrix = this.textLineMatrix.slice(); clone.fontMatrix = this.fontMatrix.slice(); return clone; } }; return TextState; })(); var EvalState = (function EvalStateClosure() { function EvalState() { this.ctm = new Float32Array(IDENTITY_MATRIX); this.font = null; this.textRenderingMode = TextRenderingMode.FILL; this.fillColorSpace = ColorSpace.singletons.gray; this.strokeColorSpace = ColorSpace.singletons.gray; } EvalState.prototype = { clone: function CanvasExtraState_clone() { return Object.create(this); }, }; return EvalState; })(); var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() { // Specifies properties for each command // // If variableArgs === true: [0, `numArgs`] expected // If variableArgs === false: exactly `numArgs` expected var getOPMap = getLookupTableFactory(function (t) { // Graphic state t['w'] = { id: OPS.setLineWidth, numArgs: 1, variableArgs: false }; t['J'] = { id: OPS.setLineCap, numArgs: 1, variableArgs: false }; t['j'] = { id: OPS.setLineJoin, numArgs: 1, variableArgs: false }; t['M'] = { id: OPS.setMiterLimit, numArgs: 1, variableArgs: false }; t['d'] = { id: OPS.setDash, numArgs: 2, variableArgs: false }; t['ri'] = { id: OPS.setRenderingIntent, numArgs: 1, variableArgs: false }; t['i'] = { id: OPS.setFlatness, numArgs: 1, variableArgs: false }; t['gs'] = { id: OPS.setGState, numArgs: 1, variableArgs: false }; t['q'] = { id: OPS.save, numArgs: 0, variableArgs: false }; t['Q'] = { id: OPS.restore, numArgs: 0, variableArgs: false }; t['cm'] = { id: OPS.transform, numArgs: 6, variableArgs: false }; // Path t['m'] = { id: OPS.moveTo, numArgs: 2, variableArgs: false }; t['l'] = { id: OPS.lineTo, numArgs: 2, variableArgs: false }; t['c'] = { id: OPS.curveTo, numArgs: 6, variableArgs: false }; t['v'] = { id: OPS.curveTo2, numArgs: 4, variableArgs: false }; t['y'] = { id: OPS.curveTo3, numArgs: 4, variableArgs: false }; t['h'] = { id: OPS.closePath, numArgs: 0, variableArgs: false }; t['re'] = { id: OPS.rectangle, numArgs: 4, variableArgs: false }; t['S'] = { id: OPS.stroke, numArgs: 0, variableArgs: false }; t['s'] = { id: OPS.closeStroke, numArgs: 0, variableArgs: false }; t['f'] = { id: OPS.fill, numArgs: 0, variableArgs: false }; t['F'] = { id: OPS.fill, numArgs: 0, variableArgs: false }; t['f*'] = { id: OPS.eoFill, numArgs: 0, variableArgs: false }; t['B'] = { id: OPS.fillStroke, numArgs: 0, variableArgs: false }; t['B*'] = { id: OPS.eoFillStroke, numArgs: 0, variableArgs: false }; t['b'] = { id: OPS.closeFillStroke, numArgs: 0, variableArgs: false }; t['b*'] = { id: OPS.closeEOFillStroke, numArgs: 0, variableArgs: false }; t['n'] = { id: OPS.endPath, numArgs: 0, variableArgs: false }; // Clipping t['W'] = { id: OPS.clip, numArgs: 0, variableArgs: false }; t['W*'] = { id: OPS.eoClip, numArgs: 0, variableArgs: false }; // Text t['BT'] = { id: OPS.beginText, numArgs: 0, variableArgs: false }; t['ET'] = { id: OPS.endText, numArgs: 0, variableArgs: false }; t['Tc'] = { id: OPS.setCharSpacing, numArgs: 1, variableArgs: false }; t['Tw'] = { id: OPS.setWordSpacing, numArgs: 1, variableArgs: false }; t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false }; t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false }; t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false }; t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false }; t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false }; t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false }; t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false }; t['Tm'] = { id: OPS.setTextMatrix, numArgs: 6, variableArgs: false }; t['T*'] = { id: OPS.nextLine, numArgs: 0, variableArgs: false }; t['Tj'] = { id: OPS.showText, numArgs: 1, variableArgs: false }; t['TJ'] = { id: OPS.showSpacedText, numArgs: 1, variableArgs: false }; t['\''] = { id: OPS.nextLineShowText, numArgs: 1, variableArgs: false }; t['"'] = { id: OPS.nextLineSetSpacingShowText, numArgs: 3, variableArgs: false }; // Type3 fonts t['d0'] = { id: OPS.setCharWidth, numArgs: 2, variableArgs: false }; t['d1'] = { id: OPS.setCharWidthAndBounds, numArgs: 6, variableArgs: false }; // Color t['CS'] = { id: OPS.setStrokeColorSpace, numArgs: 1, variableArgs: false }; t['cs'] = { id: OPS.setFillColorSpace, numArgs: 1, variableArgs: false }; t['SC'] = { id: OPS.setStrokeColor, numArgs: 4, variableArgs: true }; t['SCN'] = { id: OPS.setStrokeColorN, numArgs: 33, variableArgs: true }; t['sc'] = { id: OPS.setFillColor, numArgs: 4, variableArgs: true }; t['scn'] = { id: OPS.setFillColorN, numArgs: 33, variableArgs: true }; t['G'] = { id: OPS.setStrokeGray, numArgs: 1, variableArgs: false }; t['g'] = { id: OPS.setFillGray, numArgs: 1, variableArgs: false }; t['RG'] = { id: OPS.setStrokeRGBColor, numArgs: 3, variableArgs: false }; t['rg'] = { id: OPS.setFillRGBColor, numArgs: 3, variableArgs: false }; t['K'] = { id: OPS.setStrokeCMYKColor, numArgs: 4, variableArgs: false }; t['k'] = { id: OPS.setFillCMYKColor, numArgs: 4, variableArgs: false }; // Shading t['sh'] = { id: OPS.shadingFill, numArgs: 1, variableArgs: false }; // Images t['BI'] = { id: OPS.beginInlineImage, numArgs: 0, variableArgs: false }; t['ID'] = { id: OPS.beginImageData, numArgs: 0, variableArgs: false }; t['EI'] = { id: OPS.endInlineImage, numArgs: 1, variableArgs: false }; // XObjects t['Do'] = { id: OPS.paintXObject, numArgs: 1, variableArgs: false }; t['MP'] = { id: OPS.markPoint, numArgs: 1, variableArgs: false }; t['DP'] = { id: OPS.markPointProps, numArgs: 2, variableArgs: false }; t['BMC'] = { id: OPS.beginMarkedContent, numArgs: 1, variableArgs: false }; t['BDC'] = { id: OPS.beginMarkedContentProps, numArgs: 2, variableArgs: false }; t['EMC'] = { id: OPS.endMarkedContent, numArgs: 0, variableArgs: false }; // Compatibility t['BX'] = { id: OPS.beginCompat, numArgs: 0, variableArgs: false }; t['EX'] = { id: OPS.endCompat, numArgs: 0, variableArgs: false }; // (reserved partial commands for the lexer) t['BM'] = null; t['BD'] = null; t['true'] = null; t['fa'] = null; t['fal'] = null; t['fals'] = null; t['false'] = null; t['nu'] = null; t['nul'] = null; t['null'] = null; }); function EvaluatorPreprocessor(stream, xref, stateManager) { this.opMap = getOPMap(); // TODO(mduan): pass array of knownCommands rather than this.opMap // dictionary this.parser = new Parser(new Lexer(stream, this.opMap), false, xref); this.stateManager = stateManager; this.nonProcessedArgs = []; } EvaluatorPreprocessor.prototype = { get savedStatesDepth() { return this.stateManager.stateStack.length; }, // |operation| is an object with two fields: // // - |fn| is an out param. // // - |args| is an inout param. On entry, it should have one of two values. // // - An empty array. This indicates that the caller is providing the // array in which the args will be stored in. The caller should use // this value if it can reuse a single array for each call to read(). // // - |null|. This indicates that the caller needs this function to create // the array in which any args are stored in. If there are zero args, // this function will leave |operation.args| as |null| (thus avoiding // allocations that would occur if we used an empty array to represent // zero arguments). Otherwise, it will replace |null| with a new array // containing the arguments. The caller should use this value if it // cannot reuse an array for each call to read(). // // These two modes are present because this function is very hot and so // avoiding allocations where possible is worthwhile. // read: function EvaluatorPreprocessor_read(operation) { var args = operation.args; while (true) { var obj = this.parser.getObj(); if (isCmd(obj)) { var cmd = obj.cmd; // Check that the command is valid var opSpec = this.opMap[cmd]; if (!opSpec) { warn('Unknown command "' + cmd + '"'); continue; } var fn = opSpec.id; var numArgs = opSpec.numArgs; var argsLength = args !== null ? args.length : 0; if (!opSpec.variableArgs) { // Postscript commands can be nested, e.g. /F2 /GS2 gs 5.711 Tf if (argsLength !== numArgs) { var nonProcessedArgs = this.nonProcessedArgs; while (argsLength > numArgs) { nonProcessedArgs.push(args.shift()); argsLength--; } while (argsLength < numArgs && nonProcessedArgs.length !== 0) { if (!args) { args = []; } args.unshift(nonProcessedArgs.pop()); argsLength++; } } if (argsLength < numArgs) { // If we receive too few args, it's not possible to possible // to execute the command, so skip the command info('Command ' + fn + ': because expected ' + numArgs + ' args, but received ' + argsLength + ' args; skipping'); args = null; continue; } } else if (argsLength > numArgs) { info('Command ' + fn + ': expected [0,' + numArgs + '] args, but received ' + argsLength + ' args'); } // TODO figure out how to type-check vararg functions this.preprocessCommand(fn, args); operation.fn = fn; operation.args = args; return true; } else { if (isEOF(obj)) { return false; // no more commands } // argument if (obj !== null) { if (!args) { args = []; } args.push(obj); assert(args.length <= 33, 'Too many arguments'); } } } }, preprocessCommand: function EvaluatorPreprocessor_preprocessCommand(fn, args) { switch (fn | 0) { case OPS.save: this.stateManager.save(); break; case OPS.restore: this.stateManager.restore(); break; case OPS.transform: this.stateManager.transform(args); break; } } }; return EvaluatorPreprocessor; })(); var QueueOptimizer = (function QueueOptimizerClosure() { function addState(parentState, pattern, fn) { var state = parentState; for (var i = 0, ii = pattern.length - 1; i < ii; i++) { var item = pattern[i]; state = (state[item] || (state[item] = [])); } state[pattern[pattern.length - 1]] = fn; } function handlePaintSolidColorImageMask(iFirstSave, count, fnArray, argsArray) { // Handles special case of mainly LaTeX documents which use image masks to // draw lines with the current fill style. // 'count' groups of (save, transform, paintImageMaskXObject, restore)+ // have been found at iFirstSave. var iFirstPIMXO = iFirstSave + 2; for (var i = 0; i < count; i++) { var arg = argsArray[iFirstPIMXO + 4 * i]; var imageMask = arg.length === 1 && arg[0]; if (imageMask && imageMask.width === 1 && imageMask.height === 1 && (!imageMask.data.length || (imageMask.data.length === 1 && imageMask.data[0] === 0))) { fnArray[iFirstPIMXO + 4 * i] = OPS.paintSolidColorImageMask; continue; } break; } return count - i; } var InitialState = []; // This replaces (save, transform, paintInlineImageXObject, restore)+ // sequences with one |paintInlineImageXObjectGroup| operation. addState(InitialState, [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore], function foundInlineImageGroup(context) { var MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10; var MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200; var MAX_WIDTH = 1000; var IMAGE_PADDING = 1; var fnArray = context.fnArray, argsArray = context.argsArray; var curr = context.iCurr; var iFirstSave = curr - 3; var iFirstTransform = curr - 2; var iFirstPIIXO = curr - 1; // Look for the quartets. var i = iFirstSave + 4; var ii = fnArray.length; while (i + 3 < ii) { if (fnArray[i] !== OPS.save || fnArray[i + 1] !== OPS.transform || fnArray[i + 2] !== OPS.paintInlineImageXObject || fnArray[i + 3] !== OPS.restore) { break; // ops don't match } i += 4; } // At this point, i is the index of the first op past the last valid // quartet. var count = Math.min((i - iFirstSave) / 4, MAX_IMAGES_IN_INLINE_IMAGES_BLOCK); if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) { return i; } // assuming that heights of those image is too small (~1 pixel) // packing as much as possible by lines var maxX = 0; var map = [], maxLineHeight = 0; var currentX = IMAGE_PADDING, currentY = IMAGE_PADDING; var q; for (q = 0; q < count; q++) { var transform = argsArray[iFirstTransform + (q << 2)]; var img = argsArray[iFirstPIIXO + (q << 2)][0]; if (currentX + img.width > MAX_WIDTH) { // starting new line maxX = Math.max(maxX, currentX); currentY += maxLineHeight + 2 * IMAGE_PADDING; currentX = 0; maxLineHeight = 0; } map.push({ transform: transform, x: currentX, y: currentY, w: img.width, h: img.height }); currentX += img.width + 2 * IMAGE_PADDING; maxLineHeight = Math.max(maxLineHeight, img.height); } var imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING; var imgHeight = currentY + maxLineHeight + IMAGE_PADDING; var imgData = new Uint8Array(imgWidth * imgHeight * 4); var imgRowSize = imgWidth << 2; for (q = 0; q < count; q++) { var data = argsArray[iFirstPIIXO + (q << 2)][0].data; // Copy image by lines and extends pixels into padding. var rowSize = map[q].w << 2; var dataOffset = 0; var offset = (map[q].x + map[q].y * imgWidth) << 2; imgData.set(data.subarray(0, rowSize), offset - imgRowSize); for (var k = 0, kk = map[q].h; k < kk; k++) { imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset); dataOffset += rowSize; offset += imgRowSize; } imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset); while (offset >= 0) { data[offset - 4] = data[offset]; data[offset - 3] = data[offset + 1]; data[offset - 2] = data[offset + 2]; data[offset - 1] = data[offset + 3]; data[offset + rowSize] = data[offset + rowSize - 4]; data[offset + rowSize + 1] = data[offset + rowSize - 3]; data[offset + rowSize + 2] = data[offset + rowSize - 2]; data[offset + rowSize + 3] = data[offset + rowSize - 1]; offset -= imgRowSize; } } // Replace queue items. fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup); argsArray.splice(iFirstSave, count * 4, [{ width: imgWidth, height: imgHeight, kind: ImageKind.RGBA_32BPP, data: imgData }, map]); return iFirstSave + 1; }); // This replaces (save, transform, paintImageMaskXObject, restore)+ // sequences with one |paintImageMaskXObjectGroup| or one // |paintImageMaskXObjectRepeat| operation. addState(InitialState, [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore], function foundImageMaskGroup(context) { var MIN_IMAGES_IN_MASKS_BLOCK = 10; var MAX_IMAGES_IN_MASKS_BLOCK = 100; var MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000; var fnArray = context.fnArray, argsArray = context.argsArray; var curr = context.iCurr; var iFirstSave = curr - 3; var iFirstTransform = curr - 2; var iFirstPIMXO = curr - 1; // Look for the quartets. var i = iFirstSave + 4; var ii = fnArray.length; while (i + 3 < ii) { if (fnArray[i] !== OPS.save || fnArray[i + 1] !== OPS.transform || fnArray[i + 2] !== OPS.paintImageMaskXObject || fnArray[i + 3] !== OPS.restore) { break; // ops don't match } i += 4; } // At this point, i is the index of the first op past the last valid // quartet. var count = (i - iFirstSave) / 4; count = handlePaintSolidColorImageMask(iFirstSave, count, fnArray, argsArray); if (count < MIN_IMAGES_IN_MASKS_BLOCK) { return i; } var q; var isSameImage = false; var iTransform, transformArgs; var firstPIMXOArg0 = argsArray[iFirstPIMXO][0]; if (argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0) { isSameImage = true; var firstTransformArg0 = argsArray[iFirstTransform][0]; var firstTransformArg3 = argsArray[iFirstTransform][3]; iTransform = iFirstTransform + 4; var iPIMXO = iFirstPIMXO + 4; for (q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) { transformArgs = argsArray[iTransform]; if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || transformArgs[0] !== firstTransformArg0 || transformArgs[1] !== 0 || transformArgs[2] !== 0 || transformArgs[3] !== firstTransformArg3) { if (q < MIN_IMAGES_IN_MASKS_BLOCK) { isSameImage = false; } else { count = q; } break; // different image or transform } } } if (isSameImage) { count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK); var positions = new Float32Array(count * 2); iTransform = iFirstTransform; for (q = 0; q < count; q++, iTransform += 4) { transformArgs = argsArray[iTransform]; positions[(q << 1)] = transformArgs[4]; positions[(q << 1) + 1] = transformArgs[5]; } // Replace queue items. fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat); argsArray.splice(iFirstSave, count * 4, [firstPIMXOArg0, firstTransformArg0, firstTransformArg3, positions]); } else { count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK); var images = []; for (q = 0; q < count; q++) { transformArgs = argsArray[iFirstTransform + (q << 2)]; var maskParams = argsArray[iFirstPIMXO + (q << 2)][0]; images.push({ data: maskParams.data, width: maskParams.width, height: maskParams.height, transform: transformArgs }); } // Replace queue items. fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup); argsArray.splice(iFirstSave, count * 4, [images]); } return iFirstSave + 1; }); // This replaces (save, transform, paintImageXObject, restore)+ sequences // with one paintImageXObjectRepeat operation, if the |transform| and // |paintImageXObjectRepeat| ops are appropriate. addState(InitialState, [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore], function (context) { var MIN_IMAGES_IN_BLOCK = 3; var MAX_IMAGES_IN_BLOCK = 1000; var fnArray = context.fnArray, argsArray = context.argsArray; var curr = context.iCurr; var iFirstSave = curr - 3; var iFirstTransform = curr - 2; var iFirstPIXO = curr - 1; var iFirstRestore = curr; if (argsArray[iFirstTransform][1] !== 0 || argsArray[iFirstTransform][2] !== 0) { return iFirstRestore + 1; // transform has the wrong form } // Look for the quartets. var firstPIXOArg0 = argsArray[iFirstPIXO][0]; var firstTransformArg0 = argsArray[iFirstTransform][0]; var firstTransformArg3 = argsArray[iFirstTransform][3]; var i = iFirstSave + 4; var ii = fnArray.length; while (i + 3 < ii) { if (fnArray[i] !== OPS.save || fnArray[i + 1] !== OPS.transform || fnArray[i + 2] !== OPS.paintImageXObject || fnArray[i + 3] !== OPS.restore) { break; // ops don't match } if (argsArray[i + 1][0] !== firstTransformArg0 || argsArray[i + 1][1] !== 0 || argsArray[i + 1][2] !== 0 || argsArray[i + 1][3] !== firstTransformArg3) { break; // transforms don't match } if (argsArray[i + 2][0] !== firstPIXOArg0) { break; // images don't match } i += 4; } // At this point, i is the index of the first op past the last valid // quartet. var count = Math.min((i - iFirstSave) / 4, MAX_IMAGES_IN_BLOCK); if (count < MIN_IMAGES_IN_BLOCK) { return i; } // Extract the (x,y) positions from all of the matching transforms. var positions = new Float32Array(count * 2); var iTransform = iFirstTransform; for (var q = 0; q < count; q++, iTransform += 4) { var transformArgs = argsArray[iTransform]; positions[(q << 1)] = transformArgs[4]; positions[(q << 1) + 1] = transformArgs[5]; } // Replace queue items. var args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, positions]; fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat); argsArray.splice(iFirstSave, count * 4, args); return iFirstSave + 1; }); // This replaces (beginText, setFont, setTextMatrix, showText, endText)+ // sequences with (beginText, setFont, (setTextMatrix, showText)+, endText)+ // sequences, if the font for each one is the same. addState(InitialState, [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText], function (context) { var MIN_CHARS_IN_BLOCK = 3; var MAX_CHARS_IN_BLOCK = 1000; var fnArray = context.fnArray, argsArray = context.argsArray; var curr = context.iCurr; var iFirstBeginText = curr - 4; var iFirstSetFont = curr - 3; var iFirstSetTextMatrix = curr - 2; var iFirstShowText = curr - 1; var iFirstEndText = curr; // Look for the quintets. var firstSetFontArg0 = argsArray[iFirstSetFont][0]; var firstSetFontArg1 = argsArray[iFirstSetFont][1]; var i = iFirstBeginText + 5; var ii = fnArray.length; while (i + 4 < ii) { if (fnArray[i] !== OPS.beginText || fnArray[i + 1] !== OPS.setFont || fnArray[i + 2] !== OPS.setTextMatrix || fnArray[i + 3] !== OPS.showText || fnArray[i + 4] !== OPS.endText) { break; // ops don't match } if (argsArray[i + 1][0] !== firstSetFontArg0 || argsArray[i + 1][1] !== firstSetFontArg1) { break; // fonts don't match } i += 5; } // At this point, i is the index of the first op past the last valid // quintet. var count = Math.min(((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK); if (count < MIN_CHARS_IN_BLOCK) { return i; } // If the preceding quintet is (, setFont, setTextMatrix, // showText, endText), include that as well. (E.g. might be // |dependency|.) var iFirst = iFirstBeginText; if (iFirstBeginText >= 4 && fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) { count++; iFirst -= 5; } // Remove (endText, beginText, setFont) trios. var iEndText = iFirst + 4; for (var q = 1; q < count; q++) { fnArray.splice(iEndText, 3); argsArray.splice(iEndText, 3); iEndText += 2; } return iEndText + 1; }); function QueueOptimizer() {} QueueOptimizer.prototype = { optimize: function QueueOptimizer_optimize(queue) { var fnArray = queue.fnArray, argsArray = queue.argsArray; var context = { iCurr: 0, fnArray: fnArray, argsArray: argsArray }; var state; var i = 0, ii = fnArray.length; while (i < ii) { state = (state || InitialState)[fnArray[i]]; if (typeof state === 'function') { // we found some handler context.iCurr = i; // state() returns the index of the first non-matching op (if we // didn't match) or the first op past the modified ops (if we did // match and replace). i = state(context); state = undefined; // reset the state machine ii = context.fnArray.length; } else { i++; } } } }; return QueueOptimizer; })(); exports.OperatorList = OperatorList; exports.PartialEvaluator = PartialEvaluator; })); (function (root, factory) { { factory((root.pdfjsCoreAnnotation = {}), root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreStream, root.pdfjsCoreColorSpace, root.pdfjsCoreObj, root.pdfjsCoreEvaluator); } }(this, function (exports, sharedUtil, corePrimitives, coreStream, coreColorSpace, coreObj, coreEvaluator) { var AnnotationBorderStyleType = sharedUtil.AnnotationBorderStyleType; var AnnotationFlag = sharedUtil.AnnotationFlag; var AnnotationType = sharedUtil.AnnotationType; var OPS = sharedUtil.OPS; var Util = sharedUtil.Util; var isArray = sharedUtil.isArray; var isInt = sharedUtil.isInt; var isValidUrl = sharedUtil.isValidUrl; var stringToBytes = sharedUtil.stringToBytes; var stringToPDFString = sharedUtil.stringToPDFString; var stringToUTF8String = sharedUtil.stringToUTF8String; var warn = sharedUtil.warn; var Dict = corePrimitives.Dict; var isDict = corePrimitives.isDict; var isName = corePrimitives.isName; var Stream = coreStream.Stream; var ColorSpace = coreColorSpace.ColorSpace; var ObjectLoader = coreObj.ObjectLoader; var FileSpec = coreObj.FileSpec; var OperatorList = coreEvaluator.OperatorList; /** * @class * @alias AnnotationFactory */ function AnnotationFactory() {} AnnotationFactory.prototype = /** @lends AnnotationFactory.prototype */ { /** * @param {XRef} xref * @param {Object} ref * @returns {Annotation} */ create: function AnnotationFactory_create(xref, ref) { var dict = xref.fetchIfRef(ref); if (!isDict(dict)) { return; } // Determine the annotation's subtype. var subtype = dict.get('Subtype'); subtype = isName(subtype) ? subtype.name : ''; // Return the right annotation object based on the subtype and field type. var parameters = { xref: xref, dict: dict, ref: ref }; switch (subtype) { case 'Link': return new LinkAnnotation(parameters); case 'Text': return new TextAnnotation(parameters); case 'Widget': var fieldType = Util.getInheritableProperty(dict, 'FT'); if (isName(fieldType) && fieldType.name === 'Tx') { return new TextWidgetAnnotation(parameters); } return new WidgetAnnotation(parameters); case 'Popup': return new PopupAnnotation(parameters); case 'Highlight': return new HighlightAnnotation(parameters); case 'Underline': return new UnderlineAnnotation(parameters); case 'Squiggly': return new SquigglyAnnotation(parameters); case 'StrikeOut': return new StrikeOutAnnotation(parameters); case 'FileAttachment': return new FileAttachmentAnnotation(parameters); default: warn('Unimplemented annotation type "' + subtype + '", ' + 'falling back to base annotation'); return new Annotation(parameters); } } }; var Annotation = (function AnnotationClosure() { // 12.5.5: Algorithm: Appearance streams function getTransformMatrix(rect, bbox, matrix) { var bounds = Util.getAxialAlignedBoundingBox(bbox, matrix); var minX = bounds[0]; var minY = bounds[1]; var maxX = bounds[2]; var maxY = bounds[3]; if (minX === maxX || minY === maxY) { // From real-life file, bbox was [0, 0, 0, 0]. In this case, // just apply the transform for rect return [1, 0, 0, 1, rect[0], rect[1]]; } var xRatio = (rect[2] - rect[0]) / (maxX - minX); var yRatio = (rect[3] - rect[1]) / (maxY - minY); return [ xRatio, 0, 0, yRatio, rect[0] - minX * xRatio, rect[1] - minY * yRatio ]; } function getDefaultAppearance(dict) { var appearanceState = dict.get('AP'); if (!isDict(appearanceState)) { return; } var appearance; var appearances = appearanceState.get('N'); if (isDict(appearances)) { var as = dict.get('AS'); if (as && appearances.has(as.name)) { appearance = appearances.get(as.name); } } else { appearance = appearances; } return appearance; } function Annotation(params) { var dict = params.dict; this.setFlags(dict.get('F')); this.setRectangle(dict.getArray('Rect')); this.setColor(dict.get('C')); this.setBorderStyle(dict); this.appearance = getDefaultAppearance(dict); // Expose public properties using a data object. this.data = {}; this.data.id = params.ref.toString(); this.data.subtype = dict.get('Subtype').name; this.data.annotationFlags = this.flags; this.data.rect = this.rectangle; this.data.color = this.color; this.data.borderStyle = this.borderStyle; this.data.hasAppearance = !!this.appearance; } Annotation.prototype = { /** * @return {boolean} */ get viewable() { if (this.flags) { return !this.hasFlag(AnnotationFlag.INVISIBLE) && !this.hasFlag(AnnotationFlag.HIDDEN) && !this.hasFlag(AnnotationFlag.NOVIEW); } return true; }, /** * @return {boolean} */ get printable() { if (this.flags) { return this.hasFlag(AnnotationFlag.PRINT) && !this.hasFlag(AnnotationFlag.INVISIBLE) && !this.hasFlag(AnnotationFlag.HIDDEN); } return false; }, /** * Set the flags. * * @public * @memberof Annotation * @param {number} flags - Unsigned 32-bit integer specifying annotation * characteristics * @see {@link shared/util.js} */ setFlags: function Annotation_setFlags(flags) { if (isInt(flags)) { this.flags = flags; } else { this.flags = 0; } }, /** * Check if a provided flag is set. * * @public * @memberof Annotation * @param {number} flag - Hexadecimal representation for an annotation * characteristic * @return {boolean} * @see {@link shared/util.js} */ hasFlag: function Annotation_hasFlag(flag) { if (this.flags) { return (this.flags & flag) > 0; } return false; }, /** * Set the rectangle. * * @public * @memberof Annotation * @param {Array} rectangle - The rectangle array with exactly four entries */ setRectangle: function Annotation_setRectangle(rectangle) { if (isArray(rectangle) && rectangle.length === 4) { this.rectangle = Util.normalizeRect(rectangle); } else { this.rectangle = [0, 0, 0, 0]; } }, /** * Set the color and take care of color space conversion. * * @public * @memberof Annotation * @param {Array} color - The color array containing either 0 * (transparent), 1 (grayscale), 3 (RGB) or * 4 (CMYK) elements */ setColor: function Annotation_setColor(color) { var rgbColor = new Uint8Array(3); // Black in RGB color space (default) if (!isArray(color)) { this.color = rgbColor; return; } switch (color.length) { case 0: // Transparent, which we indicate with a null value this.color = null; break; case 1: // Convert grayscale to RGB ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0); this.color = rgbColor; break; case 3: // Convert RGB percentages to RGB ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0); this.color = rgbColor; break; case 4: // Convert CMYK to RGB ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0); this.color = rgbColor; break; default: this.color = rgbColor; break; } }, /** * Set the border style (as AnnotationBorderStyle object). * * @public * @memberof Annotation * @param {Dict} borderStyle - The border style dictionary */ setBorderStyle: function Annotation_setBorderStyle(borderStyle) { this.borderStyle = new AnnotationBorderStyle(); if (!isDict(borderStyle)) { return; } if (borderStyle.has('BS')) { var dict = borderStyle.get('BS'); var dictType; if (!dict.has('Type') || (isName(dictType = dict.get('Type')) && dictType.name === 'Border')) { this.borderStyle.setWidth(dict.get('W')); this.borderStyle.setStyle(dict.get('S')); this.borderStyle.setDashArray(dict.get('D')); } } else if (borderStyle.has('Border')) { var array = borderStyle.get('Border'); if (isArray(array) && array.length >= 3) { this.borderStyle.setHorizontalCornerRadius(array[0]); this.borderStyle.setVerticalCornerRadius(array[1]); this.borderStyle.setWidth(array[2]); if (array.length === 4) { // Dash array available this.borderStyle.setDashArray(array[3]); } } } else { // There are no border entries in the dictionary. According to the // specification, we should draw a solid border of width 1 in that // case, but Adobe Reader did not implement that part of the // specification and instead draws no border at all, so we do the same. // See also https://github.com/mozilla/pdf.js/issues/6179. this.borderStyle.setWidth(0); } }, /** * Prepare the annotation for working with a popup in the display layer. * * @private * @memberof Annotation * @param {Dict} dict - The annotation's data dictionary */ _preparePopup: function Annotation_preparePopup(dict) { if (!dict.has('C')) { // Fall back to the default background color. this.data.color = null; } this.data.hasPopup = dict.has('Popup'); this.data.title = stringToPDFString(dict.get('T') || ''); this.data.contents = stringToPDFString(dict.get('Contents') || ''); }, loadResources: function Annotation_loadResources(keys) { return new Promise(function (resolve, reject) { this.appearance.dict.getAsync('Resources').then(function (resources) { if (!resources) { resolve(); return; } var objectLoader = new ObjectLoader(resources.map, keys, resources.xref); objectLoader.load().then(function() { resolve(resources); }, reject); }, reject); }.bind(this)); }, getOperatorList: function Annotation_getOperatorList(evaluator, task) { if (!this.appearance) { return Promise.resolve(new OperatorList()); } var data = this.data; var appearanceDict = this.appearance.dict; var resourcesPromise = this.loadResources([ 'ExtGState', 'ColorSpace', 'Pattern', 'Shading', 'XObject', 'Font' // ProcSet // Properties ]); var bbox = appearanceDict.get('BBox') || [0, 0, 1, 1]; var matrix = appearanceDict.get('Matrix') || [1, 0, 0, 1, 0 ,0]; var transform = getTransformMatrix(data.rect, bbox, matrix); var self = this; return resourcesPromise.then(function(resources) { var opList = new OperatorList(); opList.addOp(OPS.beginAnnotation, [data.rect, transform, matrix]); return evaluator.getOperatorList(self.appearance, task, resources, opList). then(function () { opList.addOp(OPS.endAnnotation, []); self.appearance.reset(); return opList; }); }); } }; Annotation.appendToOperatorList = function Annotation_appendToOperatorList( annotations, opList, partialEvaluator, task, intent) { var annotationPromises = []; for (var i = 0, n = annotations.length; i < n; ++i) { if ((intent === 'display' && annotations[i].viewable) || (intent === 'print' && annotations[i].printable)) { annotationPromises.push( annotations[i].getOperatorList(partialEvaluator, task)); } } return Promise.all(annotationPromises).then(function(operatorLists) { opList.addOp(OPS.beginAnnotations, []); for (var i = 0, n = operatorLists.length; i < n; ++i) { opList.addOpList(operatorLists[i]); } opList.addOp(OPS.endAnnotations, []); }); }; return Annotation; })(); /** * Contains all data regarding an annotation's border style. * * @class */ var AnnotationBorderStyle = (function AnnotationBorderStyleClosure() { /** * @constructor * @private */ function AnnotationBorderStyle() { this.width = 1; this.style = AnnotationBorderStyleType.SOLID; this.dashArray = [3]; this.horizontalCornerRadius = 0; this.verticalCornerRadius = 0; } AnnotationBorderStyle.prototype = { /** * Set the width. * * @public * @memberof AnnotationBorderStyle * @param {integer} width - The width */ setWidth: function AnnotationBorderStyle_setWidth(width) { if (width === (width | 0)) { this.width = width; } }, /** * Set the style. * * @public * @memberof AnnotationBorderStyle * @param {Object} style - The style object * @see {@link shared/util.js} */ setStyle: function AnnotationBorderStyle_setStyle(style) { if (!style) { return; } switch (style.name) { case 'S': this.style = AnnotationBorderStyleType.SOLID; break; case 'D': this.style = AnnotationBorderStyleType.DASHED; break; case 'B': this.style = AnnotationBorderStyleType.BEVELED; break; case 'I': this.style = AnnotationBorderStyleType.INSET; break; case 'U': this.style = AnnotationBorderStyleType.UNDERLINE; break; default: break; } }, /** * Set the dash array. * * @public * @memberof AnnotationBorderStyle * @param {Array} dashArray - The dash array with at least one element */ setDashArray: function AnnotationBorderStyle_setDashArray(dashArray) { // We validate the dash array, but we do not use it because CSS does not // allow us to change spacing of dashes. For more information, visit // http://www.w3.org/TR/css3-background/#the-border-style. if (isArray(dashArray) && dashArray.length > 0) { // According to the PDF specification: the elements in a dashArray // shall be numbers that are nonnegative and not all equal to zero. var isValid = true; var allZeros = true; for (var i = 0, len = dashArray.length; i < len; i++) { var element = dashArray[i]; var validNumber = (+element >= 0); if (!validNumber) { isValid = false; break; } else if (element > 0) { allZeros = false; } } if (isValid && !allZeros) { this.dashArray = dashArray; } else { this.width = 0; // Adobe behavior when the array is invalid. } } else if (dashArray) { this.width = 0; // Adobe behavior when the array is invalid. } }, /** * Set the horizontal corner radius (from a Border dictionary). * * @public * @memberof AnnotationBorderStyle * @param {integer} radius - The horizontal corner radius */ setHorizontalCornerRadius: function AnnotationBorderStyle_setHorizontalCornerRadius(radius) { if (radius === (radius | 0)) { this.horizontalCornerRadius = radius; } }, /** * Set the vertical corner radius (from a Border dictionary). * * @public * @memberof AnnotationBorderStyle * @param {integer} radius - The vertical corner radius */ setVerticalCornerRadius: function AnnotationBorderStyle_setVerticalCornerRadius(radius) { if (radius === (radius | 0)) { this.verticalCornerRadius = radius; } } }; return AnnotationBorderStyle; })(); var WidgetAnnotation = (function WidgetAnnotationClosure() { function WidgetAnnotation(params) { Annotation.call(this, params); var dict = params.dict; var data = this.data; data.annotationType = AnnotationType.WIDGET; data.fieldValue = stringToPDFString( Util.getInheritableProperty(dict, 'V') || ''); data.alternativeText = stringToPDFString(dict.get('TU') || ''); data.defaultAppearance = Util.getInheritableProperty(dict, 'DA') || ''; var fieldType = Util.getInheritableProperty(dict, 'FT'); data.fieldType = isName(fieldType) ? fieldType.name : ''; data.fieldFlags = Util.getInheritableProperty(dict, 'Ff') || 0; this.fieldResources = Util.getInheritableProperty(dict, 'DR') || Dict.empty; // Hide unsupported Widget signatures. if (data.fieldType === 'Sig') { warn('unimplemented annotation type: Widget signature'); this.setFlags(AnnotationFlag.HIDDEN); } // Building the full field name by collecting the field and // its ancestors 'T' data and joining them using '.'. var fieldName = []; var namedItem = dict; var ref = params.ref; while (namedItem) { var parent = namedItem.get('Parent'); var parentRef = namedItem.getRaw('Parent'); var name = namedItem.get('T'); if (name) { fieldName.unshift(stringToPDFString(name)); } else if (parent && ref) { // The field name is absent, that means more than one field // with the same name may exist. Replacing the empty name // with the '`' plus index in the parent's 'Kids' array. // This is not in the PDF spec but necessary to id the // the input controls. var kids = parent.get('Kids'); var j, jj; for (j = 0, jj = kids.length; j < jj; j++) { var kidRef = kids[j]; if (kidRef.num === ref.num && kidRef.gen === ref.gen) { break; } } fieldName.unshift('`' + j); } namedItem = parent; ref = parentRef; } data.fullName = fieldName.join('.'); } Util.inherit(WidgetAnnotation, Annotation, {}); return WidgetAnnotation; })(); var TextWidgetAnnotation = (function TextWidgetAnnotationClosure() { function TextWidgetAnnotation(params) { WidgetAnnotation.call(this, params); this.data.textAlignment = Util.getInheritableProperty(params.dict, 'Q'); } Util.inherit(TextWidgetAnnotation, WidgetAnnotation, { getOperatorList: function TextWidgetAnnotation_getOperatorList(evaluator, task) { if (this.appearance) { return Annotation.prototype.getOperatorList.call(this, evaluator, task); } var opList = new OperatorList(); var data = this.data; // Even if there is an appearance stream, ignore it. This is the // behaviour used by Adobe Reader. if (!data.defaultAppearance) { return Promise.resolve(opList); } var stream = new Stream(stringToBytes(data.defaultAppearance)); return evaluator.getOperatorList(stream, task, this.fieldResources, opList). then(function () { return opList; }); } }); return TextWidgetAnnotation; })(); var TextAnnotation = (function TextAnnotationClosure() { var DEFAULT_ICON_SIZE = 22; // px function TextAnnotation(parameters) { Annotation.call(this, parameters); this.data.annotationType = AnnotationType.TEXT; if (this.data.hasAppearance) { this.data.name = 'NoIcon'; } else { this.data.rect[1] = this.data.rect[3] - DEFAULT_ICON_SIZE; this.data.rect[2] = this.data.rect[0] + DEFAULT_ICON_SIZE; this.data.name = parameters.dict.has('Name') ? parameters.dict.get('Name').name : 'Note'; } this._preparePopup(parameters.dict); } Util.inherit(TextAnnotation, Annotation, {}); return TextAnnotation; })(); var LinkAnnotation = (function LinkAnnotationClosure() { function LinkAnnotation(params) { Annotation.call(this, params); var dict = params.dict; var data = this.data; data.annotationType = AnnotationType.LINK; var action = dict.get('A'); if (action && isDict(action)) { var linkType = action.get('S').name; if (linkType === 'URI') { var url = action.get('URI'); if (isName(url)) { // Some bad PDFs do not put parentheses around relative URLs. url = '/' + url.name; } else if (url) { url = addDefaultProtocolToUrl(url); } // TODO: pdf spec mentions urls can be relative to a Base // entry in the dictionary. if (!isValidUrl(url, false)) { url = ''; } // According to ISO 32000-1:2008, section 12.6.4.7, // URI should to be encoded in 7-bit ASCII. // Some bad PDFs may have URIs in UTF-8 encoding, see Bugzilla 1122280. try { data.url = stringToUTF8String(url); } catch (e) { // Fall back to a simple copy. data.url = url; } } else if (linkType === 'GoTo') { data.dest = action.get('D'); } else if (linkType === 'GoToR') { var urlDict = action.get('F'); if (isDict(urlDict)) { // We assume that the 'url' is a Filspec dictionary // and fetch the url without checking any further url = urlDict.get('F') || ''; } // TODO: pdf reference says that GoToR // can also have 'NewWindow' attribute if (!isValidUrl(url, false)) { url = ''; } data.url = url; data.dest = action.get('D'); } else if (linkType === 'Named') { data.action = action.get('N').name; } else { warn('unrecognized link type: ' + linkType); } } else if (dict.has('Dest')) { // simple destination link var dest = dict.get('Dest'); data.dest = isName(dest) ? dest.name : dest; } } // Lets URLs beginning with 'www.' default to using the 'http://' protocol. function addDefaultProtocolToUrl(url) { if (url && url.indexOf('www.') === 0) { return ('http://' + url); } return url; } Util.inherit(LinkAnnotation, Annotation, {}); return LinkAnnotation; })(); var PopupAnnotation = (function PopupAnnotationClosure() { function PopupAnnotation(parameters) { Annotation.call(this, parameters); this.data.annotationType = AnnotationType.POPUP; var dict = parameters.dict; var parentItem = dict.get('Parent'); if (!parentItem) { warn('Popup annotation has a missing or invalid parent annotation.'); return; } this.data.parentId = dict.getRaw('Parent').toString(); this.data.title = stringToPDFString(parentItem.get('T') || ''); this.data.contents = stringToPDFString(parentItem.get('Contents') || ''); if (!parentItem.has('C')) { // Fall back to the default background color. this.data.color = null; } else { this.setColor(parentItem.get('C')); this.data.color = this.color; } } Util.inherit(PopupAnnotation, Annotation, {}); return PopupAnnotation; })(); var HighlightAnnotation = (function HighlightAnnotationClosure() { function HighlightAnnotation(parameters) { Annotation.call(this, parameters); this.data.annotationType = AnnotationType.HIGHLIGHT; this._preparePopup(parameters.dict); // PDF viewers completely ignore any border styles. this.data.borderStyle.setWidth(0); } Util.inherit(HighlightAnnotation, Annotation, {}); return HighlightAnnotation; })(); var UnderlineAnnotation = (function UnderlineAnnotationClosure() { function UnderlineAnnotation(parameters) { Annotation.call(this, parameters); this.data.annotationType = AnnotationType.UNDERLINE; this._preparePopup(parameters.dict); // PDF viewers completely ignore any border styles. this.data.borderStyle.setWidth(0); } Util.inherit(UnderlineAnnotation, Annotation, {}); return UnderlineAnnotation; })(); var SquigglyAnnotation = (function SquigglyAnnotationClosure() { function SquigglyAnnotation(parameters) { Annotation.call(this, parameters); this.data.annotationType = AnnotationType.SQUIGGLY; this._preparePopup(parameters.dict); // PDF viewers completely ignore any border styles. this.data.borderStyle.setWidth(0); } Util.inherit(SquigglyAnnotation, Annotation, {}); return SquigglyAnnotation; })(); var StrikeOutAnnotation = (function StrikeOutAnnotationClosure() { function StrikeOutAnnotation(parameters) { Annotation.call(this, parameters); this.data.annotationType = AnnotationType.STRIKEOUT; this._preparePopup(parameters.dict); // PDF viewers completely ignore any border styles. this.data.borderStyle.setWidth(0); } Util.inherit(StrikeOutAnnotation, Annotation, {}); return StrikeOutAnnotation; })(); var FileAttachmentAnnotation = (function FileAttachmentAnnotationClosure() { function FileAttachmentAnnotation(parameters) { Annotation.call(this, parameters); var file = new FileSpec(parameters.dict.get('FS'), parameters.xref); this.data.annotationType = AnnotationType.FILEATTACHMENT; this.data.file = file.serializable; this._preparePopup(parameters.dict); } Util.inherit(FileAttachmentAnnotation, Annotation, {}); return FileAttachmentAnnotation; })(); exports.Annotation = Annotation; exports.AnnotationBorderStyle = AnnotationBorderStyle; exports.AnnotationFactory = AnnotationFactory; })); (function (root, factory) { { factory((root.pdfjsCoreDocument = {}), root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreStream, root.pdfjsCoreObj, root.pdfjsCoreParser, root.pdfjsCoreCrypto, root.pdfjsCoreEvaluator, root.pdfjsCoreAnnotation); } }(this, function (exports, sharedUtil, corePrimitives, coreStream, coreObj, coreParser, coreCrypto, coreEvaluator, coreAnnotation) { var MissingDataException = sharedUtil.MissingDataException; var Util = sharedUtil.Util; var assert = sharedUtil.assert; var error = sharedUtil.error; var info = sharedUtil.info; var isArray = sharedUtil.isArray; var isArrayBuffer = sharedUtil.isArrayBuffer; var isString = sharedUtil.isString; var shadow = sharedUtil.shadow; var stringToBytes = sharedUtil.stringToBytes; var stringToPDFString = sharedUtil.stringToPDFString; var warn = sharedUtil.warn; var Dict = corePrimitives.Dict; var isDict = corePrimitives.isDict; var isName = corePrimitives.isName; var isStream = corePrimitives.isStream; var NullStream = coreStream.NullStream; var Stream = coreStream.Stream; var StreamsSequenceStream = coreStream.StreamsSequenceStream; var Catalog = coreObj.Catalog; var ObjectLoader = coreObj.ObjectLoader; var XRef = coreObj.XRef; var Lexer = coreParser.Lexer; var Linearization = coreParser.Linearization; var calculateMD5 = coreCrypto.calculateMD5; var OperatorList = coreEvaluator.OperatorList; var PartialEvaluator = coreEvaluator.PartialEvaluator; var Annotation = coreAnnotation.Annotation; var AnnotationFactory = coreAnnotation.AnnotationFactory; var Page = (function PageClosure() { var LETTER_SIZE_MEDIABOX = [0, 0, 612, 792]; function Page(pdfManager, xref, pageIndex, pageDict, ref, fontCache) { this.pdfManager = pdfManager; this.pageIndex = pageIndex; this.pageDict = pageDict; this.xref = xref; this.ref = ref; this.fontCache = fontCache; this.idCounters = { obj: 0 }; this.evaluatorOptions = pdfManager.evaluatorOptions; this.resourcesPromise = null; } Page.prototype = { getPageProp: function Page_getPageProp(key) { return this.pageDict.get(key); }, getInheritedPageProp: function Page_getInheritedPageProp(key) { var dict = this.pageDict, valueArray = null, loopCount = 0; var MAX_LOOP_COUNT = 100; // Always walk up the entire parent chain, to be able to find // e.g. \Resources placed on multiple levels of the tree. while (dict) { var value = dict.get(key); if (value) { if (!valueArray) { valueArray = []; } valueArray.push(value); } if (++loopCount > MAX_LOOP_COUNT) { warn('Page_getInheritedPageProp: maximum loop count exceeded.'); break; } dict = dict.get('Parent'); } if (!valueArray) { return Dict.empty; } if (valueArray.length === 1 || !isDict(valueArray[0]) || loopCount > MAX_LOOP_COUNT) { return valueArray[0]; } return Dict.merge(this.xref, valueArray); }, get content() { return this.getPageProp('Contents'); }, get resources() { // For robustness: The spec states that a \Resources entry has to be // present, but can be empty. Some document omit it still, in this case // we return an empty dictionary. return shadow(this, 'resources', this.getInheritedPageProp('Resources')); }, get mediaBox() { var obj = this.getInheritedPageProp('MediaBox'); // Reset invalid media box to letter size. if (!isArray(obj) || obj.length !== 4) { obj = LETTER_SIZE_MEDIABOX; } return shadow(this, 'mediaBox', obj); }, get view() { var mediaBox = this.mediaBox; var cropBox = this.getInheritedPageProp('CropBox'); if (!isArray(cropBox) || cropBox.length !== 4) { return shadow(this, 'view', mediaBox); } // From the spec, 6th ed., p.963: // "The crop, bleed, trim, and art boxes should not ordinarily // extend beyond the boundaries of the media box. If they do, they are // effectively reduced to their intersection with the media box." cropBox = Util.intersect(cropBox, mediaBox); if (!cropBox) { return shadow(this, 'view', mediaBox); } return shadow(this, 'view', cropBox); }, get rotate() { var rotate = this.getInheritedPageProp('Rotate') || 0; // Normalize rotation so it's a multiple of 90 and between 0 and 270 if (rotate % 90 !== 0) { rotate = 0; } else if (rotate >= 360) { rotate = rotate % 360; } else if (rotate < 0) { // The spec doesn't cover negatives, assume its counterclockwise // rotation. The following is the other implementation of modulo. rotate = ((rotate % 360) + 360) % 360; } return shadow(this, 'rotate', rotate); }, getContentStream: function Page_getContentStream() { var content = this.content; var stream; if (isArray(content)) { // fetching items var xref = this.xref; var i, n = content.length; var streams = []; for (i = 0; i < n; ++i) { streams.push(xref.fetchIfRef(content[i])); } stream = new StreamsSequenceStream(streams); } else if (isStream(content)) { stream = content; } else { // replacing non-existent page content with empty one stream = new NullStream(); } return stream; }, loadResources: function Page_loadResources(keys) { if (!this.resourcesPromise) { // TODO: add async getInheritedPageProp and remove this. this.resourcesPromise = this.pdfManager.ensure(this, 'resources'); } return this.resourcesPromise.then(function resourceSuccess() { var objectLoader = new ObjectLoader(this.resources.map, keys, this.xref); return objectLoader.load(); }.bind(this)); }, getOperatorList: function Page_getOperatorList(handler, task, intent) { var self = this; var pdfManager = this.pdfManager; var contentStreamPromise = pdfManager.ensure(this, 'getContentStream', []); var resourcesPromise = this.loadResources([ 'ExtGState', 'ColorSpace', 'Pattern', 'Shading', 'XObject', 'Font' // ProcSet // Properties ]); var partialEvaluator = new PartialEvaluator(pdfManager, this.xref, handler, this.pageIndex, 'p' + this.pageIndex + '_', this.idCounters, this.fontCache, this.evaluatorOptions); var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]); var pageListPromise = dataPromises.then(function(data) { var contentStream = data[0]; var opList = new OperatorList(intent, handler, self.pageIndex); handler.send('StartRenderPage', { transparency: partialEvaluator.hasBlendModes(self.resources), pageIndex: self.pageIndex, intent: intent }); return partialEvaluator.getOperatorList(contentStream, task, self.resources, opList).then(function () { return opList; }); }); var annotationsPromise = pdfManager.ensure(this, 'annotations'); return Promise.all([pageListPromise, annotationsPromise]).then( function(datas) { var pageOpList = datas[0]; var annotations = datas[1]; if (annotations.length === 0) { pageOpList.flush(true); return pageOpList; } var annotationsReadyPromise = Annotation.appendToOperatorList( annotations, pageOpList, partialEvaluator, task, intent); return annotationsReadyPromise.then(function () { pageOpList.flush(true); return pageOpList; }); }); }, extractTextContent: function Page_extractTextContent(task, normalizeWhitespace) { var handler = { on: function nullHandlerOn() {}, send: function nullHandlerSend() {} }; var self = this; var pdfManager = this.pdfManager; var contentStreamPromise = pdfManager.ensure(this, 'getContentStream', []); var resourcesPromise = this.loadResources([ 'ExtGState', 'XObject', 'Font' ]); var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]); return dataPromises.then(function(data) { var contentStream = data[0]; var partialEvaluator = new PartialEvaluator(pdfManager, self.xref, handler, self.pageIndex, 'p' + self.pageIndex + '_', self.idCounters, self.fontCache, self.evaluatorOptions); return partialEvaluator.getTextContent(contentStream, task, self.resources, /* stateManager = */ null, normalizeWhitespace); }); }, getAnnotationsData: function Page_getAnnotationsData(intent) { var annotations = this.annotations; var annotationsData = []; for (var i = 0, n = annotations.length; i < n; ++i) { if (intent) { if (!(intent === 'display' && annotations[i].viewable) && !(intent === 'print' && annotations[i].printable)) { continue; } } annotationsData.push(annotations[i].data); } return annotationsData; }, get annotations() { var annotations = []; var annotationRefs = this.getInheritedPageProp('Annots') || []; var annotationFactory = new AnnotationFactory(); for (var i = 0, n = annotationRefs.length; i < n; ++i) { var annotationRef = annotationRefs[i]; var annotation = annotationFactory.create(this.xref, annotationRef); if (annotation) { annotations.push(annotation); } } return shadow(this, 'annotations', annotations); } }; return Page; })(); /** * The `PDFDocument` holds all the data of the PDF file. Compared to the * `PDFDoc`, this one doesn't have any job management code. * Right now there exists one PDFDocument on the main thread + one object * for each worker. If there is no worker support enabled, there are two * `PDFDocument` objects on the main thread created. */ var PDFDocument = (function PDFDocumentClosure() { var FINGERPRINT_FIRST_BYTES = 1024; var EMPTY_FINGERPRINT = '\x00\x00\x00\x00\x00\x00\x00' + '\x00\x00\x00\x00\x00\x00\x00\x00\x00'; function PDFDocument(pdfManager, arg, password) { if (isStream(arg)) { init.call(this, pdfManager, arg, password); } else if (isArrayBuffer(arg)) { init.call(this, pdfManager, new Stream(arg), password); } else { error('PDFDocument: Unknown argument type'); } } function init(pdfManager, stream, password) { assert(stream.length > 0, 'stream must have data'); this.pdfManager = pdfManager; this.stream = stream; var xref = new XRef(this.stream, password, pdfManager); this.xref = xref; } function find(stream, needle, limit, backwards) { var pos = stream.pos; var end = stream.end; var strBuf = []; if (pos + limit > end) { limit = end - pos; } for (var n = 0; n < limit; ++n) { strBuf.push(String.fromCharCode(stream.getByte())); } var str = strBuf.join(''); stream.pos = pos; var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle); if (index === -1) { return false; /* not found */ } stream.pos += index; return true; /* found */ } var DocumentInfoValidators = { get entries() { // Lazily build this since all the validation functions below are not // defined until after this file loads. return shadow(this, 'entries', { Title: isString, Author: isString, Subject: isString, Keywords: isString, Creator: isString, Producer: isString, CreationDate: isString, ModDate: isString, Trapped: isName }); } }; PDFDocument.prototype = { parse: function PDFDocument_parse(recoveryMode) { this.setup(recoveryMode); var version = this.catalog.catDict.get('Version'); if (isName(version)) { this.pdfFormatVersion = version.name; } try { // checking if AcroForm is present this.acroForm = this.catalog.catDict.get('AcroForm'); if (this.acroForm) { this.xfa = this.acroForm.get('XFA'); var fields = this.acroForm.get('Fields'); if ((!fields || !isArray(fields) || fields.length === 0) && !this.xfa) { // no fields and no XFA -- not a form (?) this.acroForm = null; } } } catch (ex) { info('Something wrong with AcroForm entry'); this.acroForm = null; } }, get linearization() { var linearization = null; if (this.stream.length) { try { linearization = Linearization.create(this.stream); } catch (err) { if (err instanceof MissingDataException) { throw err; } info(err); } } // shadow the prototype getter with a data property return shadow(this, 'linearization', linearization); }, get startXRef() { var stream = this.stream; var startXRef = 0; var linearization = this.linearization; if (linearization) { // Find end of first obj. stream.reset(); if (find(stream, 'endobj', 1024)) { startXRef = stream.pos + 6; } } else { // Find startxref by jumping backward from the end of the file. var step = 1024; var found = false, pos = stream.end; while (!found && pos > 0) { pos -= step - 'startxref'.length; if (pos < 0) { pos = 0; } stream.pos = pos; found = find(stream, 'startxref', step, true); } if (found) { stream.skip(9); var ch; do { ch = stream.getByte(); } while (Lexer.isSpace(ch)); var str = ''; while (ch >= 0x20 && ch <= 0x39) { // < '9' str += String.fromCharCode(ch); ch = stream.getByte(); } startXRef = parseInt(str, 10); if (isNaN(startXRef)) { startXRef = 0; } } } // shadow the prototype getter with a data property return shadow(this, 'startXRef', startXRef); }, get mainXRefEntriesOffset() { var mainXRefEntriesOffset = 0; var linearization = this.linearization; if (linearization) { mainXRefEntriesOffset = linearization.mainXRefEntriesOffset; } // shadow the prototype getter with a data property return shadow(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset); }, // Find the header, remove leading garbage and setup the stream // starting from the header. checkHeader: function PDFDocument_checkHeader() { var stream = this.stream; stream.reset(); if (find(stream, '%PDF-', 1024)) { // Found the header, trim off any garbage before it. stream.moveStart(); // Reading file format version var MAX_VERSION_LENGTH = 12; var version = '', ch; while ((ch = stream.getByte()) > 0x20) { // SPACE if (version.length >= MAX_VERSION_LENGTH) { break; } version += String.fromCharCode(ch); } if (!this.pdfFormatVersion) { // removing "%PDF-"-prefix this.pdfFormatVersion = version.substring(5); } return; } // May not be a PDF file, continue anyway. }, parseStartXRef: function PDFDocument_parseStartXRef() { var startXRef = this.startXRef; this.xref.setStartXRef(startXRef); }, setup: function PDFDocument_setup(recoveryMode) { this.xref.parse(recoveryMode); var self = this; var pageFactory = { createPage: function (pageIndex, dict, ref, fontCache) { return new Page(self.pdfManager, self.xref, pageIndex, dict, ref, fontCache); } }; this.catalog = new Catalog(this.pdfManager, this.xref, pageFactory); }, get numPages() { var linearization = this.linearization; var num = linearization ? linearization.numPages : this.catalog.numPages; // shadow the prototype getter return shadow(this, 'numPages', num); }, get documentInfo() { var docInfo = { PDFFormatVersion: this.pdfFormatVersion, IsAcroFormPresent: !!this.acroForm, IsXFAPresent: !!this.xfa }; var infoDict; try { infoDict = this.xref.trailer.get('Info'); } catch (err) { info('The document information dictionary is invalid.'); } if (infoDict) { var validEntries = DocumentInfoValidators.entries; // Only fill the document info with valid entries from the spec. for (var key in validEntries) { if (infoDict.has(key)) { var value = infoDict.get(key); // Make sure the value conforms to the spec. if (validEntries[key](value)) { docInfo[key] = (typeof value !== 'string' ? value : stringToPDFString(value)); } else { info('Bad value in document info for "' + key + '"'); } } } } return shadow(this, 'documentInfo', docInfo); }, get fingerprint() { var xref = this.xref, hash, fileID = ''; var idArray = xref.trailer.get('ID'); if (idArray && isArray(idArray) && idArray[0] && isString(idArray[0]) && idArray[0] !== EMPTY_FINGERPRINT) { hash = stringToBytes(idArray[0]); } else { if (this.stream.ensureRange) { this.stream.ensureRange(0, Math.min(FINGERPRINT_FIRST_BYTES, this.stream.end)); } hash = calculateMD5(this.stream.bytes.subarray(0, FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES); } for (var i = 0, n = hash.length; i < n; i++) { var hex = hash[i].toString(16); fileID += hex.length === 1 ? '0' + hex : hex; } return shadow(this, 'fingerprint', fileID); }, getPage: function PDFDocument_getPage(pageIndex) { return this.catalog.getPage(pageIndex); }, cleanup: function PDFDocument_cleanup() { return this.catalog.cleanup(); } }; return PDFDocument; })(); exports.Page = Page; exports.PDFDocument = PDFDocument; })); (function (root, factory) { { factory((root.pdfjsCorePdfManager = {}), root.pdfjsSharedUtil, root.pdfjsCoreStream, root.pdfjsCoreChunkedStream, root.pdfjsCoreDocument); } }(this, function (exports, sharedUtil, coreStream, coreChunkedStream, coreDocument) { var NotImplementedException = sharedUtil.NotImplementedException; var MissingDataException = sharedUtil.MissingDataException; var createPromiseCapability = sharedUtil.createPromiseCapability; var Util = sharedUtil.Util; var Stream = coreStream.Stream; var ChunkedStreamManager = coreChunkedStream.ChunkedStreamManager; var PDFDocument = coreDocument.PDFDocument; var BasePdfManager = (function BasePdfManagerClosure() { function BasePdfManager() { throw new Error('Cannot initialize BaseManagerManager'); } BasePdfManager.prototype = { get docId() { return this._docId; }, onLoadedStream: function BasePdfManager_onLoadedStream() { throw new NotImplementedException(); }, ensureDoc: function BasePdfManager_ensureDoc(prop, args) { return this.ensure(this.pdfDocument, prop, args); }, ensureXRef: function BasePdfManager_ensureXRef(prop, args) { return this.ensure(this.pdfDocument.xref, prop, args); }, ensureCatalog: function BasePdfManager_ensureCatalog(prop, args) { return this.ensure(this.pdfDocument.catalog, prop, args); }, getPage: function BasePdfManager_getPage(pageIndex) { return this.pdfDocument.getPage(pageIndex); }, cleanup: function BasePdfManager_cleanup() { return this.pdfDocument.cleanup(); }, ensure: function BasePdfManager_ensure(obj, prop, args) { return new NotImplementedException(); }, requestRange: function BasePdfManager_requestRange(begin, end) { return new NotImplementedException(); }, requestLoadedStream: function BasePdfManager_requestLoadedStream() { return new NotImplementedException(); }, sendProgressiveData: function BasePdfManager_sendProgressiveData(chunk) { return new NotImplementedException(); }, updatePassword: function BasePdfManager_updatePassword(password) { this.pdfDocument.xref.password = this.password = password; if (this._passwordChangedCapability) { this._passwordChangedCapability.resolve(); } }, passwordChanged: function BasePdfManager_passwordChanged() { this._passwordChangedCapability = createPromiseCapability(); return this._passwordChangedCapability.promise; }, terminate: function BasePdfManager_terminate() { return new NotImplementedException(); } }; return BasePdfManager; })(); var LocalPdfManager = (function LocalPdfManagerClosure() { function LocalPdfManager(docId, data, password, evaluatorOptions) { this._docId = docId; this.evaluatorOptions = evaluatorOptions; var stream = new Stream(data); this.pdfDocument = new PDFDocument(this, stream, password); this._loadedStreamCapability = createPromiseCapability(); this._loadedStreamCapability.resolve(stream); } Util.inherit(LocalPdfManager, BasePdfManager, { ensure: function LocalPdfManager_ensure(obj, prop, args) { return new Promise(function (resolve, reject) { try { var value = obj[prop]; var result; if (typeof value === 'function') { result = value.apply(obj, args); } else { result = value; } resolve(result); } catch (e) { reject(e); } }); }, requestRange: function LocalPdfManager_requestRange(begin, end) { return Promise.resolve(); }, requestLoadedStream: function LocalPdfManager_requestLoadedStream() { return; }, onLoadedStream: function LocalPdfManager_onLoadedStream() { return this._loadedStreamCapability.promise; }, terminate: function LocalPdfManager_terminate() { return; } }); return LocalPdfManager; })(); var NetworkPdfManager = (function NetworkPdfManagerClosure() { function NetworkPdfManager(docId, pdfNetworkStream, args, evaluatorOptions) { this._docId = docId; this.msgHandler = args.msgHandler; this.evaluatorOptions = evaluatorOptions; var params = { msgHandler: args.msgHandler, url: args.url, length: args.length, disableAutoFetch: args.disableAutoFetch, rangeChunkSize: args.rangeChunkSize }; this.streamManager = new ChunkedStreamManager(pdfNetworkStream, params); this.pdfDocument = new PDFDocument(this, this.streamManager.getStream(), args.password); } Util.inherit(NetworkPdfManager, BasePdfManager, { ensure: function NetworkPdfManager_ensure(obj, prop, args) { var pdfManager = this; return new Promise(function (resolve, reject) { function ensureHelper() { try { var result; var value = obj[prop]; if (typeof value === 'function') { result = value.apply(obj, args); } else { result = value; } resolve(result); } catch(e) { if (!(e instanceof MissingDataException)) { reject(e); return; } pdfManager.streamManager.requestRange(e.begin, e.end). then(ensureHelper, reject); } } ensureHelper(); }); }, requestRange: function NetworkPdfManager_requestRange(begin, end) { return this.streamManager.requestRange(begin, end); }, requestLoadedStream: function NetworkPdfManager_requestLoadedStream() { this.streamManager.requestAllChunks(); }, sendProgressiveData: function NetworkPdfManager_sendProgressiveData(chunk) { this.streamManager.onReceiveData({ chunk: chunk }); }, onLoadedStream: function NetworkPdfManager_onLoadedStream() { return this.streamManager.onLoadedStream(); }, terminate: function NetworkPdfManager_terminate() { this.streamManager.abort(); } }); return NetworkPdfManager; })(); exports.LocalPdfManager = LocalPdfManager; exports.NetworkPdfManager = NetworkPdfManager; })); (function (root, factory) { { factory((root.pdfjsCoreWorker = {}), root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCorePdfManager); } }(this, function (exports, sharedUtil, corePrimitives, corePdfManager) { var UNSUPPORTED_FEATURES = sharedUtil.UNSUPPORTED_FEATURES; var InvalidPDFException = sharedUtil.InvalidPDFException; var MessageHandler = sharedUtil.MessageHandler; var MissingPDFException = sharedUtil.MissingPDFException; var UnexpectedResponseException = sharedUtil.UnexpectedResponseException; var PasswordException = sharedUtil.PasswordException; var PasswordResponses = sharedUtil.PasswordResponses; var UnknownErrorException = sharedUtil.UnknownErrorException; var XRefParseException = sharedUtil.XRefParseException; var arrayByteLength = sharedUtil.arrayByteLength; var arraysToBytes = sharedUtil.arraysToBytes; var assert = sharedUtil.assert; var createPromiseCapability = sharedUtil.createPromiseCapability; var error = sharedUtil.error; var info = sharedUtil.info; var warn = sharedUtil.warn; var setVerbosityLevel = sharedUtil.setVerbosityLevel; var Ref = corePrimitives.Ref; var LocalPdfManager = corePdfManager.LocalPdfManager; var NetworkPdfManager = corePdfManager.NetworkPdfManager; var globalScope = sharedUtil.globalScope; var WorkerTask = (function WorkerTaskClosure() { function WorkerTask(name) { this.name = name; this.terminated = false; this._capability = createPromiseCapability(); } WorkerTask.prototype = { get finished() { return this._capability.promise; }, finish: function () { this._capability.resolve(); }, terminate: function () { this.terminated = true; }, ensureNotTerminated: function () { if (this.terminated) { throw new Error('Worker task was terminated'); } } }; return WorkerTask; })(); /** @implements {IPDFStream} */ var PDFWorkerStream = (function PDFWorkerStreamClosure() { function PDFWorkerStream(params, msgHandler) { this._queuedChunks = []; var initialData = params.initialData; if (initialData && initialData.length > 0) { this._queuedChunks.push(initialData); } this._msgHandler = msgHandler; this._isRangeSupported = !(params.disableRange); this._isStreamingSupported = !(params.disableStream); this._contentLength = params.length; this._fullRequestReader = null; this._rangeReaders = []; msgHandler.on('OnDataRange', this._onReceiveData.bind(this)); msgHandler.on('OnDataProgress', this._onProgress.bind(this)); } PDFWorkerStream.prototype = { _onReceiveData: function PDFWorkerStream_onReceiveData(args) { if (args.begin === undefined) { if (this._fullRequestReader) { this._fullRequestReader._enqueue(args.chunk); } else { this._queuedChunks.push(args.chunk); } } else { var found = this._rangeReaders.some(function (rangeReader) { if (rangeReader._begin !== args.begin) { return false; } rangeReader._enqueue(args.chunk); return true; }); assert(found); } }, _onProgress: function PDFWorkerStream_onProgress(evt) { if (this._rangeReaders.length > 0) { // Reporting to first range reader. var firstReader = this._rangeReaders[0]; if (firstReader.onProgress) { firstReader.onProgress({loaded: evt.loaded}); } } }, _removeRangeReader: function PDFWorkerStream_removeRangeReader(reader) { var i = this._rangeReaders.indexOf(reader); if (i >= 0) { this._rangeReaders.splice(i, 1); } }, getFullReader: function PDFWorkerStream_getFullReader() { assert(!this._fullRequestReader); var queuedChunks = this._queuedChunks; this._queuedChunks = null; return new PDFWorkerStreamReader(this, queuedChunks); }, getRangeReader: function PDFWorkerStream_getRangeReader(begin, end) { var reader = new PDFWorkerStreamRangeReader(this, begin, end); this._msgHandler.send('RequestDataRange', { begin: begin, end: end }); this._rangeReaders.push(reader); return reader; }, cancelAllRequests: function PDFWorkerStream_cancelAllRequests(reason) { if (this._fullRequestReader) { this._fullRequestReader.cancel(reason); } var readers = this._rangeReaders.slice(0); readers.forEach(function (rangeReader) { rangeReader.cancel(reason); }); } }; /** @implements {IPDFStreamReader} */ function PDFWorkerStreamReader(stream, queuedChunks) { this._stream = stream; this._done = false; this._queuedChunks = queuedChunks || []; this._requests = []; this._headersReady = Promise.resolve(); stream._fullRequestReader = this; this.onProgress = null; // not used } PDFWorkerStreamReader.prototype = { _enqueue: function PDFWorkerStreamReader_enqueue(chunk) { if (this._done) { return; // ignore new data } if (this._requests.length > 0) { var requestCapability = this._requests.shift(); requestCapability.resolve({value: chunk, done: false}); return; } this._queuedChunks.push(chunk); }, get headersReady() { return this._headersReady; }, get isRangeSupported() { return this._stream._isRangeSupported; }, get isStreamingSupported() { return this._stream._isStreamingSupported; }, get contentLength() { return this._stream._contentLength; }, read: function PDFWorkerStreamReader_read() { if (this._queuedChunks.length > 0) { var chunk = this._queuedChunks.shift(); return Promise.resolve({value: chunk, done: false}); } if (this._done) { return Promise.resolve({value: undefined, done: true}); } var requestCapability = createPromiseCapability(); this._requests.push(requestCapability); return requestCapability.promise; }, cancel: function PDFWorkerStreamReader_cancel(reason) { this._done = true; this._requests.forEach(function (requestCapability) { requestCapability.resolve({value: undefined, done: true}); }); this._requests = []; } }; /** @implements {IPDFStreamRangeReader} */ function PDFWorkerStreamRangeReader(stream, begin, end) { this._stream = stream; this._begin = begin; this._end = end; this._queuedChunk = null; this._requests = []; this._done = false; this.onProgress = null; } PDFWorkerStreamRangeReader.prototype = { _enqueue: function PDFWorkerStreamRangeReader_enqueue(chunk) { if (this._done) { return; // ignore new data } if (this._requests.length === 0) { this._queuedChunk = chunk; } else { var requestsCapability = this._requests.shift(); requestsCapability.resolve({value: chunk, done: false}); this._requests.forEach(function (requestCapability) { requestCapability.resolve({value: undefined, done: true}); }); this._requests = []; } this._done = true; this._stream._removeRangeReader(this); }, get isStreamingSupported() { return false; }, read: function PDFWorkerStreamRangeReader_read() { if (this._queuedChunk) { return Promise.resolve({value: this._queuedChunk, done: false}); } if (this._done) { return Promise.resolve({value: undefined, done: true}); } var requestCapability = createPromiseCapability(); this._requests.push(requestCapability); return requestCapability.promise; }, cancel: function PDFWorkerStreamRangeReader_cancel(reason) { this._done = true; this._requests.forEach(function (requestCapability) { requestCapability.resolve({value: undefined, done: true}); }); this._requests = []; this._stream._removeRangeReader(this); } }; return PDFWorkerStream; })(); /** @type IPDFStream */ var PDFNetworkStream; /** * Sets PDFNetworkStream class to be used as alternative PDF data transport. * @param {IPDFStream} cls - the PDF data transport. */ function setPDFNetworkStreamClass(cls) { PDFNetworkStream = cls; } var WorkerMessageHandler = { setup: function wphSetup(handler, port) { var testMessageProcessed = false; handler.on('test', function wphSetupTest(data) { if (testMessageProcessed) { return; // we already processed 'test' message once } testMessageProcessed = true; // check if Uint8Array can be sent to worker if (!(data instanceof Uint8Array)) { handler.send('test', 'main', false); return; } // making sure postMessage transfers are working var supportTransfers = data[0] === 255; handler.postMessageTransfers = supportTransfers; // check if the response property is supported by xhr var xhr = new XMLHttpRequest(); var responseExists = 'response' in xhr; // check if the property is actually implemented try { var dummy = xhr.responseType; } catch (e) { responseExists = false; } if (!responseExists) { handler.send('test', false); return; } handler.send('test', { supportTypedArray: true, supportTransfers: supportTransfers }); }); handler.on('configure', function wphConfigure(data) { setVerbosityLevel(data.verbosity); }); handler.on('GetDocRequest', function wphSetupDoc(data) { return WorkerMessageHandler.createDocumentHandler(data, port); }); }, createDocumentHandler: function wphCreateDocumentHandler(docParams, port) { // This context is actually holds references on pdfManager and handler, // until the latter is destroyed. var pdfManager; var terminated = false; var cancelXHRs = null; var WorkerTasks = []; var docId = docParams.docId; var workerHandlerName = docParams.docId + '_worker'; var handler = new MessageHandler(workerHandlerName, docId, port); // Ensure that postMessage transfers are correctly enabled/disabled, // to prevent "DataCloneError" in older versions of IE (see issue 6957). handler.postMessageTransfers = docParams.postMessageTransfers; function ensureNotTerminated() { if (terminated) { throw new Error('Worker was terminated'); } } function startWorkerTask(task) { WorkerTasks.push(task); } function finishWorkerTask(task) { task.finish(); var i = WorkerTasks.indexOf(task); WorkerTasks.splice(i, 1); } function loadDocument(recoveryMode) { var loadDocumentCapability = createPromiseCapability(); var parseSuccess = function parseSuccess() { var numPagesPromise = pdfManager.ensureDoc('numPages'); var fingerprintPromise = pdfManager.ensureDoc('fingerprint'); var encryptedPromise = pdfManager.ensureXRef('encrypt'); Promise.all([numPagesPromise, fingerprintPromise, encryptedPromise]).then(function onDocReady(results) { var doc = { numPages: results[0], fingerprint: results[1], encrypted: !!results[2], }; loadDocumentCapability.resolve(doc); }, parseFailure); }; var parseFailure = function parseFailure(e) { loadDocumentCapability.reject(e); }; pdfManager.ensureDoc('checkHeader', []).then(function() { pdfManager.ensureDoc('parseStartXRef', []).then(function() { pdfManager.ensureDoc('parse', [recoveryMode]).then( parseSuccess, parseFailure); }, parseFailure); }, parseFailure); return loadDocumentCapability.promise; } function getPdfManager(data, evaluatorOptions) { var pdfManagerCapability = createPromiseCapability(); var pdfManager; var source = data.source; if (source.data) { try { pdfManager = new LocalPdfManager(docId, source.data, source.password, evaluatorOptions); pdfManagerCapability.resolve(pdfManager); } catch (ex) { pdfManagerCapability.reject(ex); } return pdfManagerCapability.promise; } var pdfStream; try { if (source.chunkedViewerLoading) { pdfStream = new PDFWorkerStream(source, handler); } else { assert(PDFNetworkStream, 'pdfjs/core/network module is not loaded'); pdfStream = new PDFNetworkStream(data); } } catch (ex) { pdfManagerCapability.reject(ex); return pdfManagerCapability.promise; } var fullRequest = pdfStream.getFullReader(); fullRequest.headersReady.then(function () { if (!fullRequest.isStreamingSupported || !fullRequest.isRangeSupported) { // If stream or range are disabled, it's our only way to report // loading progress. fullRequest.onProgress = function (evt) { handler.send('DocProgress', { loaded: evt.loaded, total: evt.total }); }; } if (!fullRequest.isRangeSupported) { return; } // We don't need auto-fetch when streaming is enabled. var disableAutoFetch = source.disableAutoFetch || fullRequest.isStreamingSupported; pdfManager = new NetworkPdfManager(docId, pdfStream, { msgHandler: handler, url: source.url, password: source.password, length: fullRequest.contentLength, disableAutoFetch: disableAutoFetch, rangeChunkSize: source.rangeChunkSize }, evaluatorOptions); pdfManagerCapability.resolve(pdfManager); cancelXHRs = null; }).catch(function (reason) { pdfManagerCapability.reject(reason); cancelXHRs = null; }); var cachedChunks = [], loaded = 0; var flushChunks = function () { var pdfFile = arraysToBytes(cachedChunks); if (source.length && pdfFile.length !== source.length) { warn('reported HTTP length is different from actual'); } // the data is array, instantiating directly from it try { pdfManager = new LocalPdfManager(docId, pdfFile, source.password, evaluatorOptions); pdfManagerCapability.resolve(pdfManager); } catch (ex) { pdfManagerCapability.reject(ex); } cachedChunks = []; }; var readPromise = new Promise(function (resolve, reject) { var readChunk = function (chunk) { try { ensureNotTerminated(); if (chunk.done) { if (!pdfManager) { flushChunks(); } cancelXHRs = null; return; } var data = chunk.value; loaded += arrayByteLength(data); if (!fullRequest.isStreamingSupported) { handler.send('DocProgress', { loaded: loaded, total: Math.max(loaded, fullRequest.contentLength || 0) }); } if (pdfManager) { pdfManager.sendProgressiveData(data); } else { cachedChunks.push(data); } fullRequest.read().then(readChunk, reject); } catch (e) { reject(e); } }; fullRequest.read().then(readChunk, reject); }); readPromise.catch(function (e) { pdfManagerCapability.reject(e); cancelXHRs = null; }); cancelXHRs = function () { pdfStream.cancelAllRequests('abort'); }; return pdfManagerCapability.promise; } var setupDoc = function(data) { var onSuccess = function(doc) { ensureNotTerminated(); handler.send('GetDoc', { pdfInfo: doc }); }; var onFailure = function(e) { if (e instanceof PasswordException) { if (e.code === PasswordResponses.NEED_PASSWORD) { handler.send('NeedPassword', e); } else if (e.code === PasswordResponses.INCORRECT_PASSWORD) { handler.send('IncorrectPassword', e); } } else if (e instanceof InvalidPDFException) { handler.send('InvalidPDF', e); } else if (e instanceof MissingPDFException) { handler.send('MissingPDF', e); } else if (e instanceof UnexpectedResponseException) { handler.send('UnexpectedResponse', e); } else { handler.send('UnknownError', new UnknownErrorException(e.message, e.toString())); } }; ensureNotTerminated(); var cMapOptions = { url: data.cMapUrl === undefined ? null : data.cMapUrl, packed: data.cMapPacked === true }; var evaluatorOptions = { forceDataSchema: data.disableCreateObjectURL, maxImageSize: data.maxImageSize === undefined ? -1 : data.maxImageSize, disableFontFace: data.disableFontFace, cMapOptions: cMapOptions }; getPdfManager(data, evaluatorOptions).then(function (newPdfManager) { if (terminated) { // We were in a process of setting up the manager, but it got // terminated in the middle. newPdfManager.terminate(); throw new Error('Worker was terminated'); } pdfManager = newPdfManager; handler.send('PDFManagerReady', null); pdfManager.onLoadedStream().then(function(stream) { handler.send('DataLoaded', { length: stream.bytes.byteLength }); }); }).then(function pdfManagerReady() { ensureNotTerminated(); loadDocument(false).then(onSuccess, function loadFailure(ex) { ensureNotTerminated(); // Try again with recoveryMode == true if (!(ex instanceof XRefParseException)) { if (ex instanceof PasswordException) { // after password exception prepare to receive a new password // to repeat loading pdfManager.passwordChanged().then(pdfManagerReady); } onFailure(ex); return; } pdfManager.requestLoadedStream(); pdfManager.onLoadedStream().then(function() { ensureNotTerminated(); loadDocument(true).then(onSuccess, onFailure); }); }, onFailure); }, onFailure); }; handler.on('GetPage', function wphSetupGetPage(data) { return pdfManager.getPage(data.pageIndex).then(function(page) { var rotatePromise = pdfManager.ensure(page, 'rotate'); var refPromise = pdfManager.ensure(page, 'ref'); var viewPromise = pdfManager.ensure(page, 'view'); return Promise.all([rotatePromise, refPromise, viewPromise]).then( function(results) { return { rotate: results[0], ref: results[1], view: results[2] }; }); }); }); handler.on('GetPageIndex', function wphSetupGetPageIndex(data) { var ref = new Ref(data.ref.num, data.ref.gen); var catalog = pdfManager.pdfDocument.catalog; return catalog.getPageIndex(ref); }); handler.on('GetDestinations', function wphSetupGetDestinations(data) { return pdfManager.ensureCatalog('destinations'); } ); handler.on('GetDestination', function wphSetupGetDestination(data) { return pdfManager.ensureCatalog('getDestination', [data.id]); } ); handler.on('GetPageLabels', function wphSetupGetPageLabels(data) { return pdfManager.ensureCatalog('pageLabels'); } ); handler.on('GetAttachments', function wphSetupGetAttachments(data) { return pdfManager.ensureCatalog('attachments'); } ); handler.on('GetJavaScript', function wphSetupGetJavaScript(data) { return pdfManager.ensureCatalog('javaScript'); } ); handler.on('GetOutline', function wphSetupGetOutline(data) { return pdfManager.ensureCatalog('documentOutline'); } ); handler.on('GetMetadata', function wphSetupGetMetadata(data) { return Promise.all([pdfManager.ensureDoc('documentInfo'), pdfManager.ensureCatalog('metadata')]); } ); handler.on('GetData', function wphSetupGetData(data) { pdfManager.requestLoadedStream(); return pdfManager.onLoadedStream().then(function(stream) { return stream.bytes; }); }); handler.on('GetStats', function wphSetupGetStats(data) { return pdfManager.pdfDocument.xref.stats; } ); handler.on('UpdatePassword', function wphSetupUpdatePassword(data) { pdfManager.updatePassword(data); }); handler.on('GetAnnotations', function wphSetupGetAnnotations(data) { return pdfManager.getPage(data.pageIndex).then(function(page) { return pdfManager.ensure(page, 'getAnnotationsData', [data.intent]); }); }); handler.on('RenderPageRequest', function wphSetupRenderPage(data) { var pageIndex = data.pageIndex; pdfManager.getPage(pageIndex).then(function(page) { var task = new WorkerTask('RenderPageRequest: page ' + pageIndex); startWorkerTask(task); var pageNum = pageIndex + 1; var start = Date.now(); // Pre compile the pdf page and fetch the fonts/images. page.getOperatorList(handler, task, data.intent).then( function(operatorList) { finishWorkerTask(task); info('page=' + pageNum + ' - getOperatorList: time=' + (Date.now() - start) + 'ms, len=' + operatorList.totalLength); }, function(e) { finishWorkerTask(task); if (task.terminated) { return; // ignoring errors from the terminated thread } // For compatibility with older behavior, generating unknown // unsupported feature notification on errors. handler.send('UnsupportedFeature', {featureId: UNSUPPORTED_FEATURES.unknown}); var minimumStackMessage = 'worker.js: while trying to getPage() and getOperatorList()'; var wrappedException; // Turn the error into an obj that can be serialized if (typeof e === 'string') { wrappedException = { message: e, stack: minimumStackMessage }; } else if (typeof e === 'object') { wrappedException = { message: e.message || e.toString(), stack: e.stack || minimumStackMessage }; } else { wrappedException = { message: 'Unknown exception type: ' + (typeof e), stack: minimumStackMessage }; } handler.send('PageError', { pageNum: pageNum, error: wrappedException, intent: data.intent }); }); }); }, this); handler.on('GetTextContent', function wphExtractText(data) { var pageIndex = data.pageIndex; var normalizeWhitespace = data.normalizeWhitespace; return pdfManager.getPage(pageIndex).then(function(page) { var task = new WorkerTask('GetTextContent: page ' + pageIndex); startWorkerTask(task); var pageNum = pageIndex + 1; var start = Date.now(); return page.extractTextContent(task, normalizeWhitespace).then( function(textContent) { finishWorkerTask(task); info('text indexing: page=' + pageNum + ' - time=' + (Date.now() - start) + 'ms'); return textContent; }, function (reason) { finishWorkerTask(task); if (task.terminated) { return; // ignoring errors from the terminated thread } throw reason; }); }); }); handler.on('Cleanup', function wphCleanup(data) { return pdfManager.cleanup(); }); handler.on('Terminate', function wphTerminate(data) { terminated = true; if (pdfManager) { pdfManager.terminate(); pdfManager = null; } if (cancelXHRs) { cancelXHRs(); } var waitOn = []; WorkerTasks.forEach(function (task) { waitOn.push(task.finished); task.terminate(); }); return Promise.all(waitOn).then(function () { // Notice that even if we destroying handler, resolved response promise // must be sent back. handler.destroy(); handler = null; }); }); handler.on('Ready', function wphReady(data) { setupDoc(docParams); docParams = null; // we don't need docParams anymore -- saving memory. }); return workerHandlerName; } }; function initializeWorker() { if (!('console' in globalScope)) { var consoleTimer = {}; var workerConsole = { log: function log() { var args = Array.prototype.slice.call(arguments); globalScope.postMessage({ targetName: 'main', action: 'console_log', data: args }); }, error: function error() { var args = Array.prototype.slice.call(arguments); globalScope.postMessage({ targetName: 'main', action: 'console_error', data: args }); throw 'pdf.js execution error'; }, time: function time(name) { consoleTimer[name] = Date.now(); }, timeEnd: function timeEnd(name) { var time = consoleTimer[name]; if (!time) { error('Unknown timer name ' + name); } this.log('Timer:', name, Date.now() - time); } }; globalScope.console = workerConsole; } var handler = new MessageHandler('worker', 'main', self); WorkerMessageHandler.setup(handler, self); handler.send('ready', null); } // Worker thread (and not node.js)? if (typeof window === 'undefined' && !(typeof module !== 'undefined' && module.require)) { initializeWorker(); } exports.setPDFNetworkStreamClass = setPDFNetworkStreamClass; exports.WorkerTask = WorkerTask; exports.WorkerMessageHandler = WorkerMessageHandler; })); var NetworkManager = (function NetworkManagerClosure() { var OK_RESPONSE = 200; var PARTIAL_CONTENT_RESPONSE = 206; function NetworkManager(url, args) { this.url = url; args = args || {}; this.isHttp = /^https?:/i.test(url); this.httpHeaders = (this.isHttp && args.httpHeaders) || {}; this.withCredentials = args.withCredentials || false; this.getXhr = args.getXhr || function NetworkManager_getXhr() { return new XMLHttpRequest(); }; this.currXhrId = 0; this.pendingRequests = Object.create(null); this.loadedRequests = Object.create(null); } function getArrayBuffer(xhr) { var data = xhr.response; if (typeof data !== 'string') { return data; } var length = data.length; var array = new Uint8Array(length); for (var i = 0; i < length; i++) { array[i] = data.charCodeAt(i) & 0xFF; } return array.buffer; } var supportsMozChunked = (function supportsMozChunkedClosure() { try { var x = new XMLHttpRequest(); // Firefox 37- required .open() to be called before setting responseType. // https://bugzilla.mozilla.org/show_bug.cgi?id=707484 // Even though the URL is not visited, .open() could fail if the URL is // blocked, e.g. via the connect-src CSP directive or the NoScript addon. // When this error occurs, this feature detection method will mistakenly // report that moz-chunked-arraybuffer is not supported in Firefox 37-. x.open('GET', 'https://example.com'); x.responseType = 'moz-chunked-arraybuffer'; return x.responseType === 'moz-chunked-arraybuffer'; } catch (e) { return false; } })(); NetworkManager.prototype = { requestRange: function NetworkManager_requestRange(begin, end, listeners) { var args = { begin: begin, end: end }; for (var prop in listeners) { args[prop] = listeners[prop]; } return this.request(args); }, requestFull: function NetworkManager_requestFull(listeners) { return this.request(listeners); }, request: function NetworkManager_request(args) { var xhr = this.getXhr(); var xhrId = this.currXhrId++; var pendingRequest = this.pendingRequests[xhrId] = { xhr: xhr }; xhr.open('GET', this.url); xhr.withCredentials = this.withCredentials; for (var property in this.httpHeaders) { var value = this.httpHeaders[property]; if (typeof value === 'undefined') { continue; } xhr.setRequestHeader(property, value); } if (this.isHttp && 'begin' in args && 'end' in args) { var rangeStr = args.begin + '-' + (args.end - 1); xhr.setRequestHeader('Range', 'bytes=' + rangeStr); pendingRequest.expectedStatus = 206; } else { pendingRequest.expectedStatus = 200; } var useMozChunkedLoading = supportsMozChunked && !!args.onProgressiveData; if (useMozChunkedLoading) { xhr.responseType = 'moz-chunked-arraybuffer'; pendingRequest.onProgressiveData = args.onProgressiveData; pendingRequest.mozChunked = true; } else { xhr.responseType = 'arraybuffer'; } if (args.onError) { xhr.onerror = function(evt) { args.onError(xhr.status); }; } xhr.onreadystatechange = this.onStateChange.bind(this, xhrId); xhr.onprogress = this.onProgress.bind(this, xhrId); pendingRequest.onHeadersReceived = args.onHeadersReceived; pendingRequest.onDone = args.onDone; pendingRequest.onError = args.onError; pendingRequest.onProgress = args.onProgress; xhr.send(null); return xhrId; }, onProgress: function NetworkManager_onProgress(xhrId, evt) { var pendingRequest = this.pendingRequests[xhrId]; if (!pendingRequest) { // Maybe abortRequest was called... return; } if (pendingRequest.mozChunked) { var chunk = getArrayBuffer(pendingRequest.xhr); pendingRequest.onProgressiveData(chunk); } var onProgress = pendingRequest.onProgress; if (onProgress) { onProgress(evt); } }, onStateChange: function NetworkManager_onStateChange(xhrId, evt) { var pendingRequest = this.pendingRequests[xhrId]; if (!pendingRequest) { // Maybe abortRequest was called... return; } var xhr = pendingRequest.xhr; if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) { pendingRequest.onHeadersReceived(); delete pendingRequest.onHeadersReceived; } if (xhr.readyState !== 4) { return; } if (!(xhrId in this.pendingRequests)) { // The XHR request might have been aborted in onHeadersReceived() // callback, in which case we should abort request return; } delete this.pendingRequests[xhrId]; // success status == 0 can be on ftp, file and other protocols if (xhr.status === 0 && this.isHttp) { if (pendingRequest.onError) { pendingRequest.onError(xhr.status); } return; } var xhrStatus = xhr.status || OK_RESPONSE; // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2: // "A server MAY ignore the Range header". This means it's possible to // get a 200 rather than a 206 response from a range request. var ok_response_on_range_request = xhrStatus === OK_RESPONSE && pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE; if (!ok_response_on_range_request && xhrStatus !== pendingRequest.expectedStatus) { if (pendingRequest.onError) { pendingRequest.onError(xhr.status); } return; } this.loadedRequests[xhrId] = true; var chunk = getArrayBuffer(xhr); if (xhrStatus === PARTIAL_CONTENT_RESPONSE) { var rangeHeader = xhr.getResponseHeader('Content-Range'); var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader); var begin = parseInt(matches[1], 10); pendingRequest.onDone({ begin: begin, chunk: chunk }); } else if (pendingRequest.onProgressiveData) { pendingRequest.onDone(null); } else if (chunk) { pendingRequest.onDone({ begin: 0, chunk: chunk }); } else if (pendingRequest.onError) { pendingRequest.onError(xhr.status); } }, hasPendingRequests: function NetworkManager_hasPendingRequests() { for (var xhrId in this.pendingRequests) { return true; } return false; }, getRequestXhr: function NetworkManager_getXhr(xhrId) { return this.pendingRequests[xhrId].xhr; }, isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) { return !!(this.pendingRequests[xhrId].onProgressiveData); }, isPendingRequest: function NetworkManager_isPendingRequest(xhrId) { return xhrId in this.pendingRequests; }, isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) { return xhrId in this.loadedRequests; }, abortAllRequests: function NetworkManager_abortAllRequests() { for (var xhrId in this.pendingRequests) { this.abortRequest(xhrId | 0); } }, abortRequest: function NetworkManager_abortRequest(xhrId) { var xhr = this.pendingRequests[xhrId].xhr; delete this.pendingRequests[xhrId]; xhr.abort(); } }; return NetworkManager; })(); (function (root, factory) { { factory((root.pdfjsCoreNetwork = {}), root.pdfjsSharedUtil, root.pdfjsCoreWorker); } }(this, function (exports, sharedUtil, coreWorker) { var assert = sharedUtil.assert; var createPromiseCapability = sharedUtil.createPromiseCapability; var isInt = sharedUtil.isInt; var MissingPDFException = sharedUtil.MissingPDFException; var UnexpectedResponseException = sharedUtil.UnexpectedResponseException; /** @implements {IPDFStream} */ function PDFNetworkStream(options) { this._options = options; var source = options.source; this._manager = new NetworkManager(source.url, { httpHeaders: source.httpHeaders, withCredentials: source.withCredentials }); this._rangeChunkSize = source.rangeChunkSize; this._fullRequestReader = null; this._rangeRequestReaders = []; } PDFNetworkStream.prototype = { _onRangeRequestReaderClosed: function PDFNetworkStream_onRangeRequestReaderClosed(reader) { var i = this._rangeRequestReaders.indexOf(reader); if (i >= 0) { this._rangeRequestReaders.splice(i, 1); } }, getFullReader: function PDFNetworkStream_getFullReader() { assert(!this._fullRequestReader); this._fullRequestReader = new PDFNetworkStreamFullRequestReader(this._manager, this._options); return this._fullRequestReader; }, getRangeReader: function PDFNetworkStream_getRangeReader(begin, end) { var reader = new PDFNetworkStreamRangeRequestReader(this._manager, begin, end); reader.onClosed = this._onRangeRequestReaderClosed.bind(this); this._rangeRequestReaders.push(reader); return reader; }, cancelAllRequests: function PDFNetworkStream_cancelAllRequests(reason) { if (this._fullRequestReader) { this._fullRequestReader.cancel(reason); } var readers = this._rangeRequestReaders.slice(0); readers.forEach(function (reader) { reader.cancel(reason); }); } }; /** @implements {IPDFStreamReader} */ function PDFNetworkStreamFullRequestReader(manager, options) { this._manager = manager; var source = options.source; var args = { onHeadersReceived: this._onHeadersReceived.bind(this), onProgressiveData: source.disableStream ? null : this._onProgressiveData.bind(this), onDone: this._onDone.bind(this), onError: this._onError.bind(this), onProgress: this._onProgress.bind(this) }; this._url = source.url; this._fullRequestId = manager.requestFull(args); this._headersReceivedCapability = createPromiseCapability(); this._disableRange = options.disableRange || false; this._contentLength = source.length; // optional this._rangeChunkSize = source.rangeChunkSize; if (!this._rangeChunkSize && !this._disableRange) { this._disableRange = true; } this._isStreamingSupported = false; this._isRangeSupported = false; this._cachedChunks = []; this._requests = []; this._done = false; this._storedError = undefined; this.onProgress = null; } PDFNetworkStreamFullRequestReader.prototype = { _validateRangeRequestCapabilities: function PDFNetworkStreamFullRequestReader_validateRangeRequestCapabilities() { if (this._disableRange) { return false; } var networkManager = this._manager; var fullRequestXhrId = this._fullRequestId; var fullRequestXhr = networkManager.getRequestXhr(fullRequestXhrId); if (fullRequestXhr.getResponseHeader('Accept-Ranges') !== 'bytes') { return false; } var contentEncoding = fullRequestXhr.getResponseHeader('Content-Encoding') || 'identity'; if (contentEncoding !== 'identity') { return false; } var length = fullRequestXhr.getResponseHeader('Content-Length'); length = parseInt(length, 10); if (!isInt(length)) { return false; } this._contentLength = length; // setting right content length if (length <= 2 * this._rangeChunkSize) { // The file size is smaller than the size of two chunks, so it does // not make any sense to abort the request and retry with a range // request. return false; } return true; }, _onHeadersReceived: function PDFNetworkStreamFullRequestReader_onHeadersReceived() { if (this._validateRangeRequestCapabilities()) { this._isRangeSupported = true; } var networkManager = this._manager; var fullRequestXhrId = this._fullRequestId; if (networkManager.isStreamingRequest(fullRequestXhrId)) { // We can continue fetching when progressive loading is enabled, // and we don't need the autoFetch feature. this._isStreamingSupported = true; } else if (this._isRangeSupported) { // NOTE: by cancelling the full request, and then issuing range // requests, there will be an issue for sites where you can only // request the pdf once. However, if this is the case, then the // server should not be returning that it can support range // requests. networkManager.abortRequest(fullRequestXhrId); } this._headersReceivedCapability.resolve(); }, _onProgressiveData: function PDFNetworkStreamFullRequestReader_onProgressiveData(chunk) { if (this._requests.length > 0) { var requestCapability = this._requests.shift(); requestCapability.resolve({value: chunk, done: false}); } else { this._cachedChunks.push(chunk); } }, _onDone: function PDFNetworkStreamFullRequestReader_onDone(args) { if (args) { this._onProgressiveData(args.chunk); } this._done = true; if (this._cachedChunks.length > 0) { return; } this._requests.forEach(function (requestCapability) { requestCapability.resolve({value: undefined, done: true}); }); this._requests = []; }, _onError: function PDFNetworkStreamFullRequestReader_onError(status) { var url = this._url; var exception; if (status === 404 || status === 0 && /^file:/.test(url)) { exception = new MissingPDFException('Missing PDF "' + url + '".'); } else { exception = new UnexpectedResponseException( 'Unexpected server response (' + status + ') while retrieving PDF "' + url + '".', status); } this._storedError = exception; this._headersReceivedCapability.reject(exception); this._requests.forEach(function (requestCapability) { requestCapability.reject(exception); }); this._requests = []; this._cachedChunks = []; }, _onProgress: function PDFNetworkStreamFullRequestReader_onProgress(data) { if (this.onProgress) { this.onProgress({ loaded: data.loaded, total: data.lengthComputable ? data.total : this._contentLength }); } }, get isRangeSupported() { return this._isRangeSupported; }, get isStreamingSupported() { return this._isStreamingSupported; }, get contentLength() { return this._contentLength; }, get headersReady() { return this._headersReceivedCapability.promise; }, read: function PDFNetworkStreamFullRequestReader_read() { if (this._storedError) { return Promise.reject(this._storedError); } if (this._cachedChunks.length > 0) { var chunk = this._cachedChunks.shift(); return Promise.resolve(chunk); } if (this._done) { return Promise.resolve({value: undefined, done: true}); } var requestCapability = createPromiseCapability(); this._requests.push(requestCapability); return requestCapability.promise; }, cancel: function PDFNetworkStreamFullRequestReader_cancel(reason) { this._done = true; this._headersReceivedCapability.reject(reason); this._requests.forEach(function (requestCapability) { requestCapability.resolve({value: undefined, done: true}); }); this._requests = []; if (this._manager.isPendingRequest(this._fullRequestId)) { this._manager.abortRequest(this._fullRequestId); } this._fullRequestReader = null; } }; /** @implements {IPDFStreamRangeReader} */ function PDFNetworkStreamRangeRequestReader(manager, begin, end) { this._manager = manager; var args = { onDone: this._onDone.bind(this), onProgress: this._onProgress.bind(this) }; this._requestId = manager.requestRange(begin, end, args); this._requests = []; this._queuedChunk = null; this._done = false; this.onProgress = null; this.onClosed = null; } PDFNetworkStreamRangeRequestReader.prototype = { _close: function PDFNetworkStreamRangeRequestReader_close() { if (this.onClosed) { this.onClosed(this); } }, _onDone: function PDFNetworkStreamRangeRequestReader_onDone(data) { var chunk = data.chunk; if (this._requests.length > 0) { var requestCapability = this._requests.shift(); requestCapability.resolve({value: chunk, done: false}); } else { this._queuedChunk = chunk; } this._done = true; this._requests.forEach(function (requestCapability) { requestCapability.resolve({value: undefined, done: true}); }); this._requests = []; this._close(); }, _onProgress: function PDFNetworkStreamRangeRequestReader_onProgress(evt) { if (!this.isStreamingSupported && this.onProgress) { this.onProgress({ loaded: evt.loaded }); } }, get isStreamingSupported() { return false; // TODO allow progressive range bytes loading }, read: function PDFNetworkStreamRangeRequestReader_read() { if (this._queuedChunk !== null) { var chunk = this._queuedChunk; this._queuedChunk = null; return Promise.resolve({value: chunk, done: false}); } if (this._done) { return Promise.resolve({value: undefined, done: true}); } var requestCapability = createPromiseCapability(); this._requests.push(requestCapability); return requestCapability.promise; }, cancel: function PDFNetworkStreamRangeRequestReader_cancel(reason) { this._done = true; this._requests.forEach(function (requestCapability) { requestCapability.resolve({value: undefined, done: true}); }); this._requests = []; if (this._manager.isPendingRequest(this._requestId)) { this._manager.abortRequest(this._requestId); } this._close(); } }; coreWorker.setPDFNetworkStreamClass(PDFNetworkStream); exports.PDFNetworkStream = PDFNetworkStream; exports.NetworkManager = NetworkManager; })); }).call(pdfjsLibs); exports.WorkerMessageHandler = pdfjsLibs.pdfjsCoreWorker.WorkerMessageHandler; })); manuskript-0.10.0/libs/pdf.js/web/000077500000000000000000000000001354442177200166705ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/cmaps/000077500000000000000000000000001354442177200177735ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/cmaps/78-EUC-H.bcmap000066400000000000000000000045441354442177200220430ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE?A] g` ^ga ?FA]y" W 0&RJ-U*s H # DqeQgJn"xR1S3T8UAq CV MWXX\Z`['e\q !]I^4+_a`{a~qba!(cDdJeR1UfYq ]grh i"a ;jFk=[qlm#2?nHofpmqtrvqws{t uv%w)x, 2y ;zH{P|aU} i~ JU]o a1D X eq ov y { Da&M ) v q + 64Ax ~q    (>HMq g-q ' 0q E!G""g# $&q#(n+)<*O+R,b-lq¡./ .0=1 D2P3W5^qá_6f7i9 m;1|</=4>;qġ=? Z@eAgBjClKq5"xqšDE"F)G1H:ICJFKM_ RM_Pi6nNsqơyOPQ.S5U:V@X CmOq ǡWY`Zp[\ ] ^$q ȡ5_9`Ca"Eb icwd qɡe g;#h%i (j 3kAl,Dq ʡ!qmn o+pJqˡOqQr Xsz3t,/(q̡+-u Zvfwlxo5yz {q ͡ |};~?4 ETa Ρ)i-D#HX]`M4z''0a϶wa.%q ѡXu 0aҡ]6q ӡ $ ". R_a'aԡ"rw6"P$m".[0"] "jYn">H   "&?0Sa x%>; Lq ۡ#) ."<OhQ Xa޹m;aܡ]b"]@"7#Ns"]|"Z7`0" 8CLIaU8 54!"q $;!n^Q`%ea(t&'(T2q R( k\x)* au7 aa0+I, K-7V"$.74"Bl/0051 >"J2^37e4 "( **6#bq  6 70#8Uq d9)v!:*;:a*a +Bo  ", Nln"~&5"]\a< =Y>?@:ABCq #:F _GkHq1Ia]q vJ KwL$$) Ja/TM*N1manuskript-0.10.0/libs/pdf.js/web/cmaps/78-EUC-V.bcmap000066400000000000000000000002551354442177200220540ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE78-EUC-HaO Q SV[Am?2amanuskript-0.10.0/libs/pdf.js/web/cmaps/78-H.bcmap000066400000000000000000000045131354442177200214250ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE!!]a !!]y" W 0&RJ-U*s H # Dq0!eQgJn"xR1S3T8UAq 1!CV MWXX\Z`['e\q 2!!]I^4+_a`{a~q3!ba!(cDdJeR1UfYq 4! ]grh i"a5! ;jFk=[q6!lm#2?nHofpmqtrvq7!ws{t uv%w)x, 2y ;zH{P|a8!U} i~ JU]o a:!1D X eq ;!ov y { Da!   (>HMq ?!g-q ' 0q @!E!G""g# $&qA!#(n+)<*O+R,b-lqB!./ .0=1 D2P3W5^qC!_6f7i9 m;1|</=4>;qD!=? Z@eAgBjClKq5"xqE!DE"F)G1H:ICJFKM_ RM_Pi6nNsqF!yOPQ.S5U:V@X CmOq G!WY`Zp[\ ] ^$q H!5_9`Ca"Eb icwd qI!e g;#h%i (j 3kAl,Dq J!!qmn o+pJqK!OqQr Xsz3t,/(qL!+-u Zvfwlxo5yz {q M! |};~?4 ETa N!)i-D#HX]`M4z''0aO6waNK.%q Q!Xu 0aR!]6q S! $ ". R_aYx'aT!"rw6"P$m".[0"] "jYn">H   "&?0Sa TDx%>; Lq [!#) ."<OhQ Xa^9m;a\!]b"]@"7#Ns"]|"Z7`0" 8CLIa^PU8 54!"q b! $;!n^Q`%eac!(t&'(T2q d!R( k\x)* ai"u7 ai.ae!0+I, K-7V"$.74"Bl/0051 >"J2^37e4 "( **6#bq j! 6 70#8Uq k!d9)v!:*;:alM*a l!+Bo  ", Nln"~&5"]\ali< =Y>?@:ABCq p!#:F _GkHq1Iaq!]q r! vJ KwL$$) Jas!/TM*N1manuskript-0.10.0/libs/pdf.js/web/cmaps/78-RKSJ-H.bcmap000066400000000000000000000045361354442177200222010ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@<?@< g` ^ga @>y,8" 0RJN>\s i #DSqeQgJn"xR1S3T8UAq @CV MWXX\Z`[eq \]I^4+_a`{a~a@ba!(q>cDdJeR1Uf$Ygrh i"a@ ;jFk[qzlm#2?nHofpmqtrvq@ws{t uv%w)x, 2q 6y ;zH{P|U} i~ JU]oq r6 D X eq @ov y { %aE. v C + 6(Aa)a m q jx~  (>HMa@g-q q' 0!G""g# $&q @#(n+)<*O+R,qb-0l./ .0=1 D2P3W5^q @_6f7i9 m;!|q</=4>;? Z@eAgBjClKq5"xq@DE"F)G1H:ICJFKM_RqZM_Pi6nN"sOPQ.S5U:V@X CmOa@WY`Zp[q\ ] ^$_9`Ca"Eb icwd q@e g;#h%i (j 3kAl Dq @Rmn o+pJa@OqQr Xszq 3t,/0(u Zvfwlxo5yz {q @ |};~?4Ea J>T-DDHX]`,4z''0aUwa?.Fq @Xu awa|C$".R S5_6CP!m[0C> !KYnC>Ha O # 6&q   ' ?0Saa@#) ."< COhQgXC>@6m7#Nsad!9`?Fa@>|#;7`0C 8C-Ia5a8 l!"q (w$;!n^Q`%ea@(t&'(T2q 63( k\x)* a @0+I, K-VCo.74C>lq +/0051>2^37e4 a@(u **6 bq !g 6 70#8Ua@d9)v!q #:*;3:*o< = a@, >Nq _?l@nABC&5a@>\q BF _GkHq1Ia@>q *WJ KwL$$) Ja@/TM N1manuskript-0.10.0/libs/pdf.js/web/cmaps/78-RKSJ-V.bcmap000066400000000000000000000002551354442177200222110ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE 78-RKSJ-HaAO Q SV[AmS amanuskript-0.10.0/libs/pdf.js/web/cmaps/78-V.bcmap000066400000000000000000000002511354442177200214360ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE78-Ha!"O Q SV[A!am?2a%umanuskript-0.10.0/libs/pdf.js/web/cmaps/78ms-RKSJ-H.bcmap000066400000000000000000000051331354442177200225330ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@<?@< g` ]gwa@>y,8 em t R 0RJN>\s i #DSQ 7 w WE$$a@q _!f$h&j(l+k.o1a~q 8w =zyHOqeQgJn"xR1S3T8UAq @CV MWXX\Z`[eq \]I^4+_a`{a~a@ba!(q>cDdJeR1Uf$Ygrh i"a@ ;jFk[qzlm#2?nHofpmqtrvq@ws{t uv%w)x, 2q 6y ;zH{P|U} i~ JU]oq r6 D X eq @ov y { %aE. v C + 6(Aa)a m q jx~  (>HMa@g-q q' 0!G""g# $&q @#(n+)<*O+R,qb-0l./ .0=1 D2P3W5^q @_6f7i9 m;!|q</=4>;? Z@eAgBjClKq5"xq@DE"F)G1H:ICJFKM_RqZM_Pi6nN"sOPQ.S5U:V@X CmOa@WY`Zp[q\ ] ^$_9`Ca"Eb icwd q@e g;#h%i (j 3kAl Dq @Rmn o+pJa@OqQr Xszq 3t,/0(u Zvfwlxo5yz {q @ |};~?4Ea J>T-DDHX]`,4z''0aUwa?.Fq @Xu awa|C$".R S5_6CP!m[0C> !KYnC>Ha O # 6&q   ' ?0Saa@#) ."< COhQgXC>@6m7#Nsad!9`?Fa@>|#;7`0C 8C-Ia5a8 l!"q (w$;!n^Q`%ea@(t&'(T2q 63( k\x)* a @0+I, K-VCo.74C>lq +/0051>2^37e4 a@(u **6 bq !g 6 70#8Ua@d9)v!q #:*;3:*o< = a@, >Nq _?l@nABC&5a@>\q BF _GkHq1Ia@>q *WJ KwL$$) JaoaIa@/TM N1\>'3fGC>bl! Eq @  oEB:w"'aOJI+C>F|C manuskript-0.10.0/libs/pdf.js/web/cmaps/78ms-RKSJ-V.bcmap000066400000000000000000000004421354442177200225470ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE 78ms-RKSJ-Hacb`aAO Q SV[maCLRANrAS aQ 9 >1>s" F1N9/B%$7Bq _   amanuskript-0.10.0/libs/pdf.js/web/cmaps/83pv-RKSJ-H.bcmap000066400000000000000000000016111354442177200225320ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@<?@< ` ^aa@>y,8 em t R 0RJN>\s i #DSQ 7 w WE$$a @>h(>GC>&e' wqzya/]eC>C|C>|>C>;|zC>w|6C>3|rC>o|.C>+|jC>g|&C>#|bC>_|C>|ZC>W|C>|RC>O|C> |JC2G,]zC>X|C>|SC>P|C> |KC>H|C>|CC>@|aK7R! 8HO`?Fa@>||;a@>8|wC>t|3C>0|oC>l|+C>(|gC>d|#C> |_C>\|C>|WC>T"a\q @yO |Q SV[4a 8m*: em t R 0Q 쟽nGFEDCBA@q Ssmt uvwQ @x543210/.aI&}@q \~`bdkas 9zya@1 :HOa_`d|manuskript-0.10.0/libs/pdf.js/web/cmaps/90ms-RKSJ-H.bcmap000066400000000000000000000013211354442177200225200ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@<?@< g` ]gwa@>y,8 em t R 0RJN>\s i #DSQ 7 w WE$$a@q _!f$h&j(l+k.o1a~q 8w =zyHOa]eC>C|a*@>|>C>;|zC>w|6C>3|rC>o|.C>+|jC>g|&C>#|bC>_|C>|ZC>W|C>|RC>O|C> |JC2G,]zC>X|C>|SC>P|C> |KC>H|C>|Ca@>@|`?FaoaIa@>||;C>8|wC>t|3C>0|oC>l|+C>(|gC>d|#C> |_C>\|C>|WC>T"\>'3fGC>bl! Eq @  oEB:w"'aOJI+C>F|C manuskript-0.10.0/libs/pdf.js/web/cmaps/90ms-RKSJ-V.bcmap000066400000000000000000000004421354442177200225410ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE 90ms-RKSJ-Hacb`aAO Q SV[maCLRANrAS aQ 9 >1>s" F1N9/B%$7Bq _   amanuskript-0.10.0/libs/pdf.js/web/cmaps/90msp-RKSJ-H.bcmap000066400000000000000000000013131354442177200227010ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@<?@< ` ^a@>y,8 em t R 0RJN>\s i #DSQ 7 w WE$$a@q _!f$h&j(l+k.o1a~q 8w =zyHOa]eC>C|a*@>|>C>;|zC>w|6C>3|rC>o|.C>+|jC>g|&C>#|bC>_|C>|ZC>W|C>|RC>O|C> |JC2G,]zC>X|C>|SC>P|C> |KC>H|C>|Ca@>@|`?FaoaIa@>||;C>8|wC>t|3C>0|oC>l|+C>(|gC>d|#C> |_C>\|C>|WC>T"\>'3fGC>bl! Eq @  oEB:w"'aOJI+C>F|C manuskript-0.10.0/libs/pdf.js/web/cmaps/90msp-RKSJ-V.bcmap000066400000000000000000000004431354442177200227220ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE 90msp-RKSJ-Hacb`aAO Q SV[maCLRANrAS aQ 9 >1>s" F1N9/B%$7Bq _   amanuskript-0.10.0/libs/pdf.js/web/cmaps/90pv-RKSJ-H.bcmap000066400000000000000000000017261354442177200225370ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@<?@< ` ^aa@>y,8 em t R 0RJN>\s i #DSQ 7 w WE$$a@K a^ } 0a|^a#!gjQ @1B0q>IBCvaL5eXqdb_rq :sRPSa zxtuNMLKiQGVjw $+ "  aVKN8}=Q Z2C@C}aj(hQ & |Apa/]eC>C|C>|>C>;|zC>w|6C>3|rC>o|.C>+|jC>g|&C>#|bC>_|C>|ZC>W|C>|RC>O|C> |JC2G,]zC>X|C>|SC>P|C> |KC>H|C>|CC>@|aEXHM8asq&vky`?Fa@>||;C>8|wC>t|3C>0|oC>l|+C>(|gC>d|#C> |_C>\|C>|WC>T"aAO Q SV[a\A끽mS a`d|manuskript-0.10.0/libs/pdf.js/web/cmaps/90pv-RKSJ-V.bcmap000066400000000000000000000004041354442177200225450ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE 90pv-RKSJ-HaAO Q SV[AmS aq     a!$&%8manuskript-0.10.0/libs/pdf.js/web/cmaps/Add-H.bcmap000066400000000000000000000045631354442177200216640ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE!!]a!!]y" W em t 1 0&RJ*U*s H # DQ (!7 w WE$$A0!eVq 0#gwR1S36T8UAq1!CVMVWX\Z`['e\q 2!!])^4+_ah`{q 3!bGdJeRfYa4! ]g h i"q 5! ;jFk [}q6!lm# ;nHofpmqtrvq 7!wtw)z H!|a8!U} i~ a:!1D X eq ;!ov y { "<a!   >HMa?!g-q# 'q @!E!BG# $&$%"q A!#(*)<*O+R,b-lqB!'./ .0=1 D2 P5^qC!_6f7h9 m;1|</=4>;q D!=? Z@eAgC.lqE!DE"F)G1H:ICJF(LMM_Nsq F! yPQ-S 4V@X C@OqG!WY) aZp[\] ^$q H!5_9`CaE*Ubid q I!e g"h%i (j 3k/Aq J!!qmn+$o+pJq K!Or Xs#zt,'q L!+-u Zvfwlxoyz q M! |};~?Ta N!XiE#HX`M]z"XZu0"6ENaNz% aN|-%./q S! $ .0< R1`a*T!"r%>"P$m(".Y0$] "jYn"H6P "&??"#$)O"]b"?@".NTt"Q| O"Z7`" 8RC"Me"(t($-aTDx%>; L %d"28 K!C%Z& 'a TE2&3 45)7Q8f9t:;b"Je0w"\(#0#U"d2v*"GB ", /N"~@"]\"/:,k"7$Q" v /$"/T)1"2ae9+, ->/01H3?0@=A18B93:ZABGCSJKLMD*N'\zEH Iq w<1T7U4 XbcawWeqwY$!f"g&j(,k.+l/nawtu:{|* } "0 JDLCOBT Xfq }!OLR QZSXU[nHa}m`vmanuskript-0.10.0/libs/pdf.js/web/cmaps/Add-RKSJ-H.bcmap000066400000000000000000000045551354442177200224340ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@<?@< g` ^ga@>y,8 em t R 0RJK>\s i #DSQ 7 w WE$$AeVq gwR1S36T8UAq @CVMVWX\Z`[eq \])^4+_ah`{a@b<q >dJeRf$Yg h i"a@ ;jFk[qz}lm# ;nHofpmqtrva@wtw )q 6z H!|U} i~q r6 D X eq @ov y { "a E. u C + 6(Aq jw~  >HMa@g-q# q '!BG# $&$%"q @#(*)<*O+R,qb-*l'./ .0=1 D2 P5^q @_6f7h9 m;!|q</=4>;? Z@eAgC.lq@DE"F)G1H:ICJF(L MqZM_N&sPQ-S 4V@X C@Oa@WY) aZp[q\] ^$_9`CaE*Ubid q @e g"h%i (j 3kAq @Rmn+$o+pJa@Or Xszqt,1'u Zvfwlxoyz a@ ; ?JmTEDHX`,]zCXZu5ENa Q|}~nF a-F.t/q @ $ .0< Rq S14`2%3>a@P!m(Y0E> !KYnCH6P )??C#) CpOC>@a \&] *,&a4b5J708q 9KN:T;t`?Fa @>|;O7`C 83ClweC(t(-a8 l!"%{& 'ax P}"`fK" >$M [fq !)X[Xq@X4D [ 3ā)PH*%n)$@%p? & CN( 4B&(|`z4<h6 $VbF|R$!<01~2P ZJ hbRrV4V@P9,^$<l 2vR"[SH,$*pV]fry>"Zc< N|JT<SD0J n," fHl|" v.6DLRH0T   * Y [`6DHN^4znb$:d g fV,4 lP pp\@trz&d @ X(,6B_jH UL K"O= 18c<1D+"bN9R%ARlN>1NO<!( O@#%ZT 6 z  < # !")f<*,#4n[8$2\<@X4(<F Nd$-$98 XYDR07D7<2f|Z\-, H  LB^d"_@84 ?&+ !tR| 0a bA(&% 1HSLb5B^P(z2   B:ITS* g"7H/%` k&40e)lJoR7'P%Ve J #=' hGr8<,0 .>Yvz^`.Bbyb*nrh+!j0J- &=2 +,D)D F J6F l\RaOY @5B +SB.O>tZ  ~ F< &1J #%& ',3 %.~(VA7  L94=!4 Zr6 \MHJ :D &HnD__/2HD 9P 84r&'- "8x J"H !$Y:; 6m  W;J[,(P .0\8RL,93H'F}m67M%  O8~hs$4L$B>vxvv (J"yFy˂fz~ b*` H>((  ,Z6E:?8 o2K,P$:*$f &0F  Bh &b BB Ldl45P#il[`'!j; / &&o^-K |YXEd$UQT   (>Njw/&2WN7 A"{W" NYZl  Of 3BXQ  8# r|~ @+. (4   `V(!J' *'c(H eNx   lg,5"W9h)6! 34ePZV4 l&rTC"=rO87)2D#A\j# R~ L67jH  ;u$H2

/ ;,&  } < lb ΍whJ B  8 ^  R. a   8Lv^}vC+ #6 Q >Q>\p4rD t? S>pmF E2= 3H MhYZala*`*J M*d}L&8U J)J, 0 ^] #.+!*% r^l>(V  DF5,D/bS LA60OB', bH. kF]!`"snA .axI 5 %"D q^ D" e΂4EJZBmt!0[/O?^( l+DZl5O\+.,}9BG^4|aKH '"  E5[L$ p~4  Zz$ )u ~@ ٖl&R ZJ*3+&#*J& Rih|*LW$ -2-^ Cf1@gB%fB ! X!  "Y`,D7$@  1\149$jt ?^n`# D_P_Rv S4Kfo81$"R2/PA  '  icvzlq1~ &g 4Jd$ l,6g h;U~ib.w0',M@ah(?Z q&(n%^n j# !# t4 ) ukn , v@Nd:^:  .J! p.'U# _4  d + @:2([7 ZD56`QZUQTgv &3 )p; T"$HHE$ % >@X " % +h>" &HR #5(#  v 7"xT2 <  *T P%.n B  S/^+$1+ U+ 94 X^  ,?@G.!62!l 8X $VpSYNE 5` dTA#;P*dJd LQ2f%&j O'8/@ "q:JS VT&RHF;eRAFJw NU2 7: 501B%F.H `+ ;2 uv! w[ *! >Bx()tT_< {wA:5.!i$rl bZX'؁f<tuED#?V O.22  /  f ,3x_&1{RrN=!% 6  !  ($0#"10 ' (>Z>?8!0';( 4z~`V>:8 ^#uX0s ,' >G4p \v 4 5,!U</5B<#~N n%"P [  Z(B&|fvRVna_ 8h8_ Y34S*gpl\j |'V'Ha6!6AG!,T *0=}(MT89 V&Z& ,*5@=>E Fy@pb-B  Pch[})`}R-18H7Gq߁| X^H$Xz W&-\'$V(hG<39x=+bWl5"-& !D &kZ L.x  z ,fY$7.Y( ╣h` Zv`" nH |  Q,RJvR 8}!X<(/"  6-, J96] NP  #X  $P/4;:%!2~t H&U>%&/6#"' qfb o08 9F/1F|*(o?xg(%b3%8>)d2~Zd"B |@v>RR ~ ,3&\ f|$!{CVz*& G& t0 vnrx큠 |JGY"QpM v- "! db*_jX ,J/B`:f5.b7'26D  p * d G*P}t$e ,X",,   :>}':d, J(MR TRdf>J"! &&P\,n:vNC.?/N( :d- $-j"! <"'?:- %R/ :x#!B?85! & 9(shf  "Xt" | zF \H  d~H, k_0l2, q |b.* T y>b  .~^  \`v,tMF3j %JVf Hh& Tr  >Ї 1x   | &L`=lPdxfk ~h,sb)zX$4I  Z *0F0J".r|8 T ~s"`> +)BD4  ˋF$\b(# > <ۑd!9I+ f.\ rt`XnPQj~8"0~4_|8bGT4e RYa20HNwt ,Ins>H\ F^LDPF\B"0TV b$^DY."Pp v ~ @ d2Z"&!&o uH9 #( W[^C.!$U^:lRF+$S<*d ;3 L=nk$j    2AWb (p^(92 $K)$4Z\L (  `Pv_TZ @ 0OPU63+:7 $nP^ 8')&9 % T$&J&t3B98%!0%H- Gg 4>|j0+G:Ora0LASU$;:=^G /U21')./LV$ $ ~5u>, d~rn2<(d~>+#2 =6 0=<):HVv 4 mC,$=N)9 d.lt|4B3R-NA Ta56V]2W1  <0 ")8 %9+:tF #\ 0^ BLN^`4:)3"8w>& bz-01*)b45 L(l+ 3 ;,#g`UBCxA1J U.5C(0}mLC=n< :gL?82b>%Fm(8[a0_(@A#8H,gEf o , : k %m r!& *hFP$x4T  > !  V,8Lva` "(U2#.^2LPF Z9 |4N2\t]U< 9L Y BsJd/+7|f0e&5.'!$1In3 X%&S27 8."Mn; 3 )2,' !)$FE)2* $0'" )670-@= x _6D T n9`(+/RI$bdH ~?! &;?.EuL_eNSFO  ;Dr.  j@"hTOfizG14-# nU8 (/4Y* p?kCk:*+xW|EVq.1L(Ym0U^m4' B?RM*Q|$->G.9) '(^ r: ! RZ  /&6Tu| Jw41* $M<&yc2|$z H 7"&  =`" 3. }J'tb bM *V ""\L 6$7'`a4&I<(Y  ?LO0cL?LqDP. &1 LÑ ORl$ ! A f& 44 o}N.  ,  $3 !(  ԑ X,)(V  f T2@by '.Akf!.hz$R,mG JiB#"O2O*'z8= g$G.J7KN MZUP /0o ):];zF NU6 E .+N/#|, :!$*)E.#!:7{(# |8:, Y2US**C8VC<1& #N30h L1!veBR!s`Q} :s@"8;%JwvNy8ES9QX)D !hGhe(V=b. Nd!l0DR|%!nE8o&6*/,. -qT^an e/D"} )$EFO&A!nZ  id'"?^Z H "SB +  "f~t z"1wDf4"=x\ ""(J.'8 l,! 7:#3(1#"uhr "|U\ 'V"Y"?j &RRGNRW. 2DIIL=-3%"RBr     #%R'7#  ,JQ   : @4E,/"'DK2% H"l#R Zv0Bt$#cN  1* -& % 2'#zU. $;&!HU$  RK/"|( + J5 =J # -,)S #\&z34  < r  p\#a+2 ./>M,> @V H,I@-#d 20 KJ79If$'@Dd   9N O*&e Hc(@#$&i5lsNk hS\Wb=/dQ#)H?>G 2$KkBts`CE$Vn +GT%8OP;0  ,:8 g,F ?6 ?*+H#hzZ  t$tR /$tN :>6iV> .+ 66Nn$wR'&dL$  $x=>3*7 ..$z$ t ,' 0  &'!(4%lr`%! ,7 #x.W8vV Ve,>*Q)# ?o8^G4-RSO oh $9!b9$+b o( 8*o'#h*u3h2=t(%I<.+* , #%{h*  =En 4>% %:!=0 "% '$#%ђHEVgbH+6 L; sTD'BIIX % lV z8&jn^ 0x/% 1 #0nM&%Rvt% -$7"#D3 &% ,#1 0 \X`"!(!$#  .P~< $ ) &t^S ^V j 08$&ar &AJ?U\$~B,D&d}~1fI#!\X%"vXJ:$SZq2 W056(3^7 ah9A,tb!@ &kL "B[|ydK;&o'DSK8Vxu|$!6 h};Az7% -0J) *X^ *  "!'5u}$  F )"#\ UX f'Xy4<5!'iz2&%  $)(EpX? ,Q` '}GJ;  NRO' pX 4&- G!, &# :~  .b  ,1NP0n3"6.)OrJ7" , o3:s(f  e$8IvC'p?Pk J;!0qE("##: &-3^?'Bt&4|7.|i U'jWvA*[8A xm;@"-P{nE**e& l)(! 1 Hz )ms] H)vt lL   )vb %& h)xɃ  Kp&%B? +V9!B) ,j~ vv |p$,YP7 "+8C^c1jqD=*QX1R Y @Qt *<K*df"*wR]7 5 "%-V '`T *7  0 D4"*I63$+6H* p  3  *m  " *|s  6 =*0G0B% % #D[J= .3,-=V?%^f`b .^  *,*љ '*י Lp(F  |6+Q*X!)0HX     "  x   (+8^frJ`B%\#" %Y  ir..52JJ#+bf%", b;:kjU<7Sb?P )4 IB+jF '+kxL:QF" UJ?VE6?H!-L=B=(: +q%49+si+sl (4 Rh\Tf  +w  +x+y>\ L K* ' d,~,~ /  <,)zlzt  !0,?V#J= 1 :G@=6K8*G> A"VM l~ (?6= ,q3#( ,|' "\ ,la Q* ,!,Hpl ,A#zp  fp,,,.-,3TC##3?"G05xeBKR - 4J C,VTl 6x b h "  tv -418( % P-3 -7.T/ <-DV ( 4 H-[]h& T 0jFnt+F9* / %H '%L+ "6GA &+ p -t472-uh|-vG8 -x$ Lf  F-|; $5,1 n-| : (!< =D9 rlr XbL.%+.QPO.OCl! 9@A B*).+  4 +( -@Y 7T8.[   ,' * h@JHj<  vrB  =VhI2[0.`B:EB 53Z l f n8  B.Ǚ*N@ .ۙ t~ " =6Jc.1 (.>n8D."@Hb_ /V  ,. /"a +$* . /3fXF7'`Tv  "/KoTU $l  p ",\*" /oy 6dx! ! V  B/u5/Ђ*"   )6"Y Tz  &!2+Nj ,/ˉI@ "1"#,dFL 6   +/K8/>R S H9):36# ?FA@#0уBF18    bB0: (  r6V-0M)(v 4;< ! f$B* F 0|R@xlZl#0]ÂXv j2)&49 6( 0p)%^  0rR $ 0wXV "0|3` Dp`0x<j0 ) ( A <#:  1  >1W  \\~2$ VfF15 D  1ES@``/.PAax92#"[*1e 1q\ N 1~    ZT1  9(!!8 /1}%1p6% ' ?V\v`1ßM-t^Bf:  1p<   * 1r(z`&\<Hd2y$v2 z"PrrB 2"G87 62. $zP  . (2DUdjj!2N 1H#-, .1  1#e-4.2qH92{P< 2 r#5s  *  ' 6-'2X n/<V 2[HB:L 2pJ2rH0$J8H<.%2~ ~ZhXt"   zn,33 j  x  *~ 3ď`H 3ДFpF B d=3ۚL~"4`  H !XF$\, b x&|0J 4N*4TR  X )"+( 4u*6B4V <~4k n^D|fXbF*h*4@P4@~:pl B  4  6zNe2<^FD>4鎥*PX :&&z`7jf8`T <D&2y"d&5)(p 5/$``,H62 5;i`&FjzjD5Ir)t2kD_4p||~/y *26@́6NZ6@܊6Rc<QP6]Z6\; \7>nU),([M""14")*-7SN7+Oׁ7,W7-[Ӂ7.q>7/U70i71b72[t(74Vn76ze.78Vݬ79z?7>Y܍7?Aw7EW7F{ Y7IT^7K{gX7NVߴ7P{ +7TW 7UW1{n7ZW7[|D|7]R܂7^|7_Qx7`|<Sjb7h[D7i}]7j[ց7k}BmzD7pPW"7r}#B7uE7v}7w`m7x7yX!p7{~ncZ >#7XЁ77XQ77Eas7E\7Mf&77Y܉7['(>7h܇ 7a7I7I7Y&ЁЄ7g%7bH7$U7I7l7Yܘ7d7E܊77F^7jS7Re^7Dz\7ZR؃)7O7E77~ݏQo{77~ݔ7A^w7C:767L}87Ȃ{Lj7Oދ.="7=:c0u7[ݥ7փ U7[ԁ7jW 7[B7ބX7V7q= De77Zߖ@i7<Ycd 7Wܑ7B@7W 7EC`;P,7a%*77\܈88E݂H8EjzA8Fܢ8S8 \ߚ8 ~|8 h8 8K'8Ph]-8]OT8^zR8!]8"j-(8(b%8)8*^$08,T]80^Y81z82^:83G84^885q|$88U0h8:?zaI8>Rz8?Y8BE߁8CFr8F_Tt8I7%8J_S8Kփ8L_ݘH8N8PF8Qh8U~ׁ8V8W`]j8Z;|8[`ݼa8]z  w&8d`eX8f:8hhޟ8j8lbC8o^8pLb8q8sH%8t98u[ׁ8v78wa<}8ya8zal<8|8}a8~ă8a8n418b3U8_B@8UݹW`cU8,|8b8ZÃ8b8Ie<8bu 8sN?@rU{8a9b8Ix<4Ul8[Ձ8a[q8b8cW8[ܸ 6؂<j)yh81_fO%8R8pui2B8dՁ8̗W8d8ϗ_u+8Lܷ8ԗ*""8Ul8ܗ%8e388eG8JD.418\u8=Q8A0VR8' 8[')8U` i8R)8Kr8fWZ8,\W9U%96ă9dܱF99 f9 M 09a9P4~c9L}9P!9g>9ZE9Fc9f9gh9ԃ9g߷40v9%~9'h49(9*hݓKn9.99/hܹt91]j98Pd99Cwn(i9?c+9@ e9D[ݢ9E9F~9G95+t9Ld܋9Mgz)bq19URu 9Wqw9XRa9[s9\bA9^y9_b~n9ai9cbD9d(9gblg9irY g9nQsw9pq~9qE9rp9sFܾ49u>ǃ9vF܅Ro9y7"9zEz9|69}Et8r97#9E9W[9R%O-:^99Mަ9Q9Rݔ iTC,9D9M\o9g B"9F"9hs9M?B-"9T$9Yޱ9V9CoH99b9Id%9Q69N9Ae9|9UQ9Zh9@ݫ>999@ 945f9@d}9Šڃ9@ 9Nh~W?9R 9OBVz(k0dFr9MݕF 9mr9F܄Ȉ9Q49A9D݃9Aܣ#9z9bޜ9RY9Bs9RIx"9PߌY9iу9C9@t }9R޼_9S9PɁ9U9@E:T̓:BƑ :W~,/!: bFh?:Z,i {:VF'%Јf:6zE:Wރ:Z:b : ):"D:#q'*:&b:';z~~-:-Fݖ5b:0^}:5Fܠ:66݃:7E:86,::bG؂nj:>_ :@F'y:BZk:CE;:D[D:E]:F`E:HJ`k:J_G:LIݯ+:Pa:Q@>ȇ(:TaG:WKܛVp:[dq:\Qew:^:):_J"ZȂ2e:cc7| >:gRy:ib:jKܡ:kd;^ }:oL܎<6=:sU :tLJ:wf΃:xLމ-:z::{U݄:''<m:x:L3:4d:L :f:[$:fk18:^p :fc:L:f:Vr:8у:N:}:;:MߢI:tu:Q*:hs r:Mb:j3<lv:F:e fkD8:OM:]:b?::`z:gJ:O:=h:P<:Z=8::PI:p<l:QߏU:Qy:Rޤs:tz:O3Tg:?+:R]:`i0!!1:[:EQbA:SX:?Xx::iƁ:T:bC;::":RN:>:R%::b:P߃:T!u;wx;L2;w{;Qޗ-;:^;R; t8D9; R޺;@ȃ;Rޖ.;;U݁;x\ ;]A=;A#Nq; O;!z: ;$E;%A2 ;(CL~g@;-5&wr;1@p;3z;5Ir';8Z ;9@[;:x ;j]M;C;eH;_M:;Pބ;e(K;FE;m;_܁;YP'9*x;S ;02-FD;H!;H:];Eځ;i;R/;ĐxWh;bK;@b;b;͔';c:;Є Z!;c4;tE;R1;>;L%;ޖ;c;>̃;R;t0_;dܰ;hGU;dܓi;+;b݉8oc;S.[x;P;B ;C&;]<b'<<eځ<<eׁ<K<bPSx< ܃< bE< ?R \L"<^<=btb<be;<j"G`<f< K)*wx?#=$[&T6=(=+E:=,=-[܀$q=0Yp=2E߳=3Za=5FЃl=77-=9E<=:6 m=>Pޥ=?Zn=APޓ=Bj+=COx7#=Gq=HPY=JO=K[(=L\ƒ=MQ|!=Pj =QPV%=Sj=UP=V=r=X~%=YY`=[L=\|Ӄ=]^}ȀB =`lmUUKVnY m.=mN!.[:jMV9Ok*t}Hz>0>RЁ>l9>C>'> J&> n> R*>9Ol>gܭ>CI>E >9>M/pG>qp>dݨ> r>"\ܯvc>%{C >(h߁>)j>*`>+S>,[>-L>0`ou>4]>5c0>6W>8bI>9]>:R݈>;e,>>RޥI>@<H>BGߡ >C5^{G'0w>Me>N#qjSK>U^ܝ>V7:{>X`$M>Z=>[OܷȆ@>]VC`Cd'>egݘ>fL}H T)>kO@>lp3 ;oT'*\%J7'n?[>Cޝ>5l)~>`>6- mG4>CA(>^Ѓ>CvV>#;>Du >b3p/~u+>JC>r>K޳>Qw>Cݧ>QJ $ >Z܊ >upm#Ja. !h.>C>rf1>_>@D}Y>Q6>>]ݣ>+>XH>qT3t>Q>Ђ-EB>gެ>M F:>gށ>ۄ\>\޲>c.lw:y1u\>A܎>v@!>C޶>xz>_.>XQx/>>i4>IIz:>P>sR>g >R4aMD7h~?e7??C(? b? G? ]h?Gё2?k[Dc"wa4Y3fVO 4MZ`*#@4jDg v%^n 5>?AEm?BOUaNK`y?Jcޗ?Kcsx)k@?SW!?T g?XCԑ ?YBJjB*OD?d@?eO9D?8N j{6RPS ZIaZn:A2?~iJ?w6not7?`} ?(E+M]xA<1'?h޲?xSpUvW\r?R޻?/kJS?[?2i?I%?5R^X-@5~ h56Wpc+"3a"l[y< qr:a?c9?^tX) ?C;?@eQRM?W ?|ڊ[p-'Bu*?]܆?[W$?H?Y̑?uS*H xFU1gBQfJG&v?P ?t4%n)r;S@~"@ `W@ AG@ ۃ@ AJ@L/ruY@RBB@D@Fہ@@Oȁ@x<qK@R3lЄ$]@"O@#I@$P@%[)4 `Ȇ=@*@+@~@,_@-@߀s@/nۃ@0A@1PD&:S$@8Rݤ;@:Q`@;Lߴ@@WM- @X_{a4*p=xHXEX@eZ*@hUI@jO߀Y.@mS3m@oB@pl˃@qE&@rhrA=@wE@xqw @|aޫ@}S~@~~29x@w'@bޛ@Sp@Ur @?Y7hK]@Bߏ@S@O@S@Cw@TJV]@ZS?@U](}@E a@=@CM\I@UG5N#DY@FD@ER@Q5@f@Dܴ@V7*@Lފ @fOB*#@bf@6#@DO@WF@Pݥ@ln8#@[~@W@E@X@ET،@X&@R@X| @D<@Xy@hP1@ez G*@E>@Z$O@Eޒ@y@CNdP@Yك@Ef@mq@F('@Y@[E@Z{@Rݩ@%A[ߡA72AE޸A^gJ"A ^A@0A@A[ՃAF4.OA[-hAFDA\tuAGܥA\IYNF 6A%GzA']ZA*GޤA+\8HA/RЂqRA2#V6A9QܼSA;S_uTA?EqA@^ #ABa܂AC^768AJ@$AL:ރAMD:AN_:AOZ܈q@AR_cAS[nAT_rAVb6AW_c/AZTPM!A^փA_@ޞAa`1&EF,AgIߴAhyqc:CXAmR݂Apt|EAu~ܦ)AwaAyAVAza;A|O߷1A~aӃAbߝ~Aa=AJ݀A`#p'A@AbŃAEpAbՃAK AclAR߁A:@ADߎZAoAK6AAUAd*+&GjAR( Ae1EnAR@AK72sAF)A AMAfV ACuAfgATAfsCAL1YAwŃAJAÙEAPߜAiAM0Agg AP>Ag]pZVwALrAh]AMoAiRAb߁AisaAḾAiAM<A;VhAbJABrBoA@ɁAc'PAMY_AjEAMAjUz,AdݜA< AB#A`,|AÍAnANہBBFXB7@@BNZBkBOBk4B I܋ȁJ>B lZ[BOݼBDŃBOݽLNoB6 BC2BBLQB1B[%vB!mu>B%Ru؇XB(3B)[tB*QB.b!L3B1tSB2O߂B3y{}B6LKB7oWB:O0B;nBEU4Y.JBDdpBE=;FBGPDBHoӃBIPܑ9yBOQ߃BRP@8 BTpKdPU$79=B`PwBaq+2{BfPeBgqO$BiPBjq,BkQZ BnqBobBpp f[ b?8BxUByr."B{RtB|h.BLDBh ^ ZBR#BHBbBs( @KBC:fBs~BPwxBf#=BRݷUZBs:%BR&Bt9EB~/Bt`Bc޲ BtGG"x *_BRތ[2*B[FBcKBtȃBF݈BuBcB[׃BcެBq8 BS߂B?BS Buc*RH>FBXBv<oBZBv"(B[ߟBڄbBTܝ>CBw2#BT BwXBLެBwBbdOBwoH."oBUBx8B] BiBIByr}zBVWByB^9Cy<XC\&C>:Cd Cy/NQC CB$*CUCKƁC9C@ACFCSݸXCC`ܾCwzCK8C:4@C`]WCd݃CC|n?C"`C%CޖC&C'CdXC+C,CF IC/GC0SާKC2C4eC5?OC7TC9C:KDC;n3N69l#MCCJʁCDz}CGYvCJdCKTRCMh(CObL7CQCS@ݩCT?pCVKݍCWCXQ4C\vyx{lCbJfCdCfCݜCgcywCiIuCj?4s Coiq CrCtDЃrCv9fCx`ޛCy5xCzWIC|C~KܲЉZC4CS;C C]tS$' ЈWC:CDTA C$C]^ Cq@01*dv{B"C~( C5S\GE4wI,CD{CCDӁCCDCv&=vSH,l6,' $zCQCs929CSޥC?ׁ5I m"J4c}A$ {HZd"Ptb|DRDR/z2DXjD4DXKDzDY|ES] 8E^ܲExNd PE cE 0EfE|DH+Q^E@܇EMT= E#.  E0.E4hߩIE6e >`_E;]5E,nF Ekn;T #+EuBEvNuvE|g؇QE~ Eh3 E50FK4D%EalEuȄ*(EN$6 nVW`kt N>U@g ,AB1af)Bbr%r0qt5 s -XOp4%hF 8F|bF}nLH7]FOA Fox)=B7|4F@%FC!FC؁F6N<FWeFf}lOFS߸WxF4~FK FFqaj$FOߏFLFSɁFI*Fh1wF:<FIzZ;FhFH[Fb9F@Ff/wFi[FA|wFRF;xFRbF9:%R]RF\ FpFROF~emyFR]}F}CFNMFW~FByF?FGߞ.FpFd[F]p<FbY FO</N1FRFs/ #F> 0 24#L1:eK8GJUx]T(BGU5Gy3Sh?xk$,e2@!VI|'G4CϑG5} Xl+DAV,by<'8GODP/nm"D^ L&QL"I!\F rD,.N2/ GmSt>8* , HXGy^g#Gz86>8:R T-M?},&L dk^$  F-G PQ  )RHfhw||6x=(A.[(:Je(Q<$2f&dcGF‘G͝Ih]X| tU  G@ܔDPGߔÃGAׁGGA~@GWW6GBbvaGTGB~.", NN*vpGu>L"H6GHDܿ^H SdH D"BRHp HF-x.H v6~HqHHEHiCH!H|4D^ :.V$J`v\،`؋AHEXb.Ldp|LvH@X HANާRN>(4D2HtFr@>TVP4:Hc HbVBhvLFVH=Hd^)HГ Her/hiED2HN-C 1hIRnIWIVޕ9V0bhQЇx',%cIWIRcnIIR>I>I[#O6I"WzA> I%RwDJ :I؉yI.65I/b-I0R I2O|K[|O ЁB1.qI@EbxIBXLICPUIEXk IFQ>T#4eIOFwIP``^ISP܌IV;+ IX@ߵIYpKI[AÁI\70I]Dv60ЊQ;Ia" %sz[0/0mlAX]`}Ubg}DI@5=~J@^JA[ۃJBG^JCZJEgްJFZJbHJKfEJLtavJNBoJOf^dtJTLVJVC6<JYNJZMJ]MQJ^]xr7JbPJdLw]Jg@ݤ8Ji1Jk@9JlYXRJofJp_;JqBߟBVJtApJvdyJw?VJyhݵJz@E@J}[FJ~A|Ja޲gJEm3JUܚJEa ZtEJRJ6axC!^ 0 PT57090;0 =0?0 A0CY  0?IMK_ "fb")! i33 %%m%%q  !`0!!A$1$`$f $t !p$R[P]NNQmRR_*NNQQS*^bSg*u(u0 NNR ORSpYY7[W[b ef l_lMOPQR)RT5%[Z\@\2gNlp| u7:N,Sw$YG\E^_&_"b bgo kf lr,uy@BNa\N__m=ruuvx yy(K P Q$WYWNc*eH gl'4uvwP* b.S??\\^%b,e"k(q tueuR{QvRt&X0X \ ^_#c eb f l.$qt5u% v{,4;P R UUW4b! dfQt[ vxziyr=#V ![abny|}G& A QRV/\d9ewk(v!{,5>d:qu wzM | Xh.[OeoQqJd j q wzaz~T. >X)|>~i NI|'Q778fQ=/Z vq|}w8W"D\z&lKr RSQblsu-R2S $Ws2_"PgxGu?5m:T W2\^!bB cg#g l %prI uGwwx{|x|^O QR^TWZ-4cDegh2'mc/psttwy zqCu  NPcUut^ `9hm"k7km(r{ uw1yiy$}>M\  Ve1hknFn<%n5AwFwKxd4>eO [aId"-iH#kknEtJtOw_x z.g`#hn#w RM^XaRdrDkk o;u!yz!} O&hD>`QQ Rjess^tv xh c""& )='6^g(f#jMk'q qrsfw xx|~{U0 -  <5,C V[Hsn uvHxz{n8P0+.BQ-\i^mafjp o"y 5P,F:P-Q4V[=#p! r w zg ZO+ t@V]^_fjry'zlh V!.b9V pCpHpE~%z D$([KkpUr zp 4JH S=bk, nfhtkwFy>sf  pi^ 000>0A0U06!d%zC@;}E:2F;wgALLݤBPQpՃ%^ ^ 011118<.. ..[fEC~&DDFnqtWYo0HbI#rmanuskript-0.10.0/libs/pdf.js/web/cmaps/Adobe-GB1-0.bcmap000066400000000000000000000003311354442177200225120ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEq$manuskript-0.10.0/libs/pdf.js/web/cmaps/Adobe-GB1-1.bcmap000066400000000000000000000003721354442177200225200ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEq'(manuskript-0.10.0/libs/pdf.js/web/cmaps/Adobe-GB1-2.bcmap000066400000000000000000000007211354442177200225170ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEqWnmanuskript-0.10.0/libs/pdf.js/web/cmaps/Adobe-GB1-3.bcmap000066400000000000000000000007261354442177200225250ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEqXPmanuskript-0.10.0/libs/pdf.js/web/cmaps/Adobe-GB1-4.bcmap000066400000000000000000000011311354442177200225150ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEqrmanuskript-0.10.0/libs/pdf.js/web/cmaps/Adobe-GB1-5.bcmap000066400000000000000000000011611354442177200225210ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEqwKmanuskript-0.10.0/libs/pdf.js/web/cmaps/Adobe-GB1-UCS2.bcmap000066400000000000000000001022661354442177200231010ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE c"?4cmn0J>|"4C\; bs]d+ A ",!$> 0\^uK$o, !~K]YY/j:]hK  AX]dUbg}DI@5lTYy4-U]\q-ht 6sp(5:1\3YV6q.*F_d  , 3[ UU't&W^d"Hg '/d]KV4AfM5P=s:T 'jB2P%jHc(mx:=d\$= ,9=&N9 i_H|T7D#o=h2pCZ u io"P&19D4 @=6L)!F2Wv[8&ohQV#1o.|+7$;7SZY UW-YCd- >G&Y P8q6DAQNdxK"q }GDHm6w,yAAXN{?o>_-Jj=/At}&AK"-d}= ?DaehC >0j!'J,lA[?Z4X.C' lC5Di&aDr7 H5#nB $aFMit8 @kM!07p?u&>?,{ i\7P-80I) en$dx-Df?@ KF?`Wt0GF cf&#A3 #Juz%#Pu`WdS~ yfV{xsw$;270Zcb+`1t9}H u R,%4?eHgZ>iKX_2 /h@vHB5&#T-XkBkfF ,}[MJ',@{$JQ,Y,/J%Z:0/LI7"UDS7.pwob#k4Lsh5Ol?N8$Q2(AJC5n,p py40*: R3Z?D+c0 ZUk Pp=>%j|)~P vkdZXvSFY > = S^L6YDEIUy${~9Nb I Y>2s1>];\ypM+JOdC6?B-v-# 2/0{`sgHSDCV&gmf ;>cNeo$W\<+p#yL_iH`^!#sXO@0;sQdqz.Qk 51q;C{"P [ 7N5T:V"O$8 g` +Kn^zB#!,9@axS./Av@TuKTH9>[d +kT 47o7Xs-v ,(Av>68h}1CnI9%~aA_ mA^\ atiT7b~^[hZY2q8 u43mj$ n<+5{,;'d2c> i*`+xGiAd 6;nzFJlx]c*oN!N?Drck )zc@?Zu/~@SriT }.~n)QalDPVw+= <aSBCt>*;IbIR WC|%Bt`;QDLbGX=g2vkHG TKqn-> C:S(MU, .&5 k]4Z3-tPi~4q=>cTn)fe4Iy?qix3( >|1~s`5kIDZBtIV^rJ7AnNlz? Q*GM =\Gt&P?pg:{NHb]@'&|`YVW=z xa4&Dcfe!(OTAF /3I oJvWbcjtYg0]Q` #)xOP#>(QQ|i@~*u(Kx%nGZ}YX _S8$wL>.mRpxn@E1#8Z|T!6]_ L9]B0#)|MJ'vKSQWNs fEnh~ qdu#HO-OWFFaO\ gWVeMedsH/xc.?pabknmH^~KED?#Sf"Q:t }B]$i9p":~W:#BTM77\)SVa ~% A"!)aNkQpW#L,7_~$:wOq_c I:C4/z&%EypW T)*(*E U}0kZZ+.";sDje)j;T& |W58va%W@UN#r@)x@{h1# ^K$L$ uk&Z^O6f>JL fm@f}n,F>'#rmvurB19(C(vkS,K%Zu*#@^Vf5U=z7\[+kPO #Gx& N+ 5^yP$/ F:lq^7tME4PyXNA_qYV!;tIQ5bTs_tIoO#-&DQ$Yod_gMER%uLuFh8q' g eh=0sV xy4^Ho,qcvlL#0w8SnWkqEFM y_ 8r,~- 5,Q)ba`us8^Cq*g XfMDWNi$}&=q_Tvv_Az)"]&\"!EN,1/*?y6x._*ep}44)'0X3>9# ?MihNvO.3}(Sz1urbi3 Z j{Qk6sra}Lj,vs9,MPk6tA{v9& 0g> Y5/HU >w!(#UF0)sq@WKsx"| }NEn1Sf =-fy. V[>zg&`{Pl5`reJaiUVj \lLR|,+C\3 SMC>:E(@Q+Zp_%/rejFpBe`9E<[*ONO9P>Aq4mtiha4o@^67i8Av1un8/j=\zu!F|]a^^B%7^mrr,!GD;}Tad |Z$5.C5 MZU1DaQn}B=a'V6%*PN"_zpG7-MzP)"f]~7D&DRE\F x1.Z{+:\O> fI1>!I]}Lgx>mv1O_Wqv 46)zC8On%G\`tmG,K.K|Q_wb7Hoj&2O9}<1DN m`Up;h/=$UHqm6M,ZO0h:Q,[U*yR);K.aQ,QKq> a p*<v e#\6 Q/PU2;mV]('HrCz"&Cx \jols(RAT- }f,5fa\uau& "w*JBcd T0CP`iRh[_D l4:mC < RL" $e#"3 JxQ\_^=Bd =Kp8 #\]^1"K(0`D3p;<_:!0*w" :R 6^3 0]>KP"5Z c/$7&roKZ kjGtj_ 6?Sgd4q"8//rYt{8 "~9# ]>O 6Oe^ \K Jmt2iz#yD*;v&*S* J. ;PT5467y8#> 61@\PC-h%/fD%4DNEF'J}jE$ .:h6,fY"R &J|ECj 1 ^7 +%$ \0'4# :"32,]' 1(x5\#&%A<,*yZ Jr* s /&,) <8mE@$t 1^  0 >mf+*G2N_@66Ch=+^`{qN$0$!5  cV %&MV #_8<%0=ltDLO#l5KZF{B6t%7l(8B? 7hC:E\m\63l'0^@`W xW@=xA8 'Ln2<4]3{* >G4dGD o$9j (PC>>) ,E"<!T: 2= "$l\U!,\88 4+ Q-("VP.!Et w ;!HQb*% q|[ zYd? ZAN34YTK@$PG"!XL;3J$lIXs>9N7X6( E$"z   B/ 15wID,8^5 8DeCIn84`k#L4 : :Et$,T1%QgL -@v=;HedE)f0cbCs6gIHORD{RVvzhN&=>4@*f %3`Ir Rz0V5 al! {>*BMbPed   ~3( OxI1)2* @q#m 5N$ y BMF 7$$Ց9kg`G}PR6 : l= 0/GXQZ:4~$"FyV$w y; (yS $EV@M.4 Z hrYD r (xM8/  H<:x&R:` '( )\!D $#< *LE Xv$)@& gwG , 2!uw $, (PAc.(*  (   *   &  ":'8i.4v6H2zUkQ   f <2    ]q C1iu'$&* 6% ! 4@5>' 2  (4I5z    `>F0)(P=)*` #RH(a2gNj Ԁ)MR ,"h 昏M . X7@ /*0=2 7h Gk*+b 2.; )F)A/1{7IB8q01Z6R}N-)Nrs.-&# N+ . b-h{@9n#(#Ar+^S 3<{GH 8! {B$ & "z 1./> *  | mg| "|" ,  w|\0&8  > M d $0 KP d2&i#+J,*/H,  .+DJJ   M $ st  NXU , 6u)|'@%>2jV>w\X&z#N8!fM̗4 x @EߚсfSH@L  ~;  y   dcD{Snx :J0'py rQRI`P[I?AJEYH+^UIBI*Ax#^K=d=}*G!tIYn %=`byzo;>101b# z }Z@<)ILV{+4 Gy\!eubV3ofhsx4H rE/0AQtjrb{|*;Dv3@!P]{l;;h,`1%6uu @5(w9Qa4Z [Vc%`jsZ9N V/Fi9?U`U4J<5cx$i<6mx QZu3&7@9\3E?` }sfj7(Zh CQr+uEsP?yFQn6G`= E3(2y|B18W,Y3R3 MG!nFa\ 5::!+^Yv /6CfpmHA("H/!8_:yk1P[N#bi5(liV ({Fr 9\ 7y*Wb ZOa\?_,S JaGUP `7 ejrr7PK{jiJ4eP|h=$4y |T}b!r&7dL):[&:Jk-n^HC%:Zp? FdH$[^ RC?($ IHEJ+&:/uX!IX"Bh'PZ:GLy|R7zKB#V )XJ5z9YYGVy*!$kj+MxGrH_;: wnNx \y\,] #e VaYn'+)9u Kn+DFxy kd3x@Iu6;rw&h0=jC?7NiXdU[q+&FrQ~X}U%rq0|)>[4 7rlBWX.R-K"ix 8]{,2!q=LL0Uh?\uc*9~pW2a&O$_bs BdQSt52:UL5`e'fS*59H'@[ WX_ ]3;B@d9|_0 s3#$'PRkLBYl o3 89ad^7NOibyW )6Br|Uut=3bdridmfabmaUpd9).dBL03 B$[p$8ZMgcbxn)D~9|/B&'O<"{>Q`FK8Jz~t-$*e"uDo xpg>+XCw|QfhGHIkDAU'wP-)x4|d};Og1X:(w "\s$] S.]T 7^@@o/pm]4f;=u1i*|'"N MpWRcT.Lc7@ :KS6 f <(p$"" +~P';!f 4PgT=M>+,a|M sZsvk NsD>Nty7,j7 rbIdy%]"^?R29z6 B PYLI5^cfP, "?Vc\D;Za%$Θ  u,5R4BbE6w|FB  b 0- b{u:$B!B#:Ci> 3,UE%j 7MZ%20>`1(K; 8Fq mRS"6{@/bS2J70 : ( &%@oK%vIW8%vi(#R[R-VYj "s%Ș! 7H ,># D8[yhW-$Q{mk }  /up&r\X8DLix zD KbxCVm"n  4(  &  @ ,  V    &  ,v2F   B  :      $, F    F " & (      40"     @ $ $ *  0  & 2!l >  $ $ \ 6,>   *   B<*  " %^=<> 0<& .    p   ( (L 0 %f 0(<   2 (  ( ( !h&  "        , *: , J 8 (  B ":F 4,J& "   :( ,,04 * (       3d b3d     * (6   &> @>B",        0  X . 2  * #X@F & >>  R $\ "'b)f0. 282 ( 4 $   & &   L  b  $  6"X $     @    D0  $<:  *8 6'f  2<  6 <  4F> 2  D " 0 ..   6D *B  )j 0   J0 04 "    0@ (   B&rJ6  ( .<  $$j&b. 2'j0  $$  V ,44    ( \>  ">PPD0D . * " ,B  ,08 , C~ 0:CC    $  6 (4 $  2,  *" (  "  4     $ .h &  F3 4   &> ( 6@"d > 6 ,2" ($ P ,  (B 4 2  ,L &<>"Z ((& $  " " , &  "     $^*p K*2<(8Kr&"  F "l  3 > $T  $jR ^ M^* M , 8 4    ( 0 " 2 $ n "  ,(LD  .2 <.& ( ($0D "  0\O(@   [P   &$: " * " , .& "6 *,0, $ .,:0$  "b   F@ >#V   $ (    * *#P 86    ( $$04v$&58 N 5   D: &  , ,!H PV @܇V#.\YP-v,-8M&GV7;N>bsV;EׁV<Vc VEJݏVFC cBp+X- $ xdVZI 6V_P V`LYT_'py;W0AX]dUbg}DI@5DNSV^adq(9AFKZf u1zx5%}/D{{{!3 ||"N}AQ+ =c$HjC}}-%l.& EvFvmsl !p!"f#%P%%%%00!333000 IT Yh /NNN.N@NZNbNgNj NtNNNNNNNNNNNNOO OOO(O,O>ODOGOaOjOmOqOwOOOOOOOOOOOOOOOPPPPP" P/P?PDPJPPPV ({P]PfPmPxP|PPPPD(PPPPPPPPPPPPPPPPPQ QQQ"Q%Q+Q3Q8Q=QNQWQ]QcQfQ~QQQQQQQQQQQQQQQRR RRRR!R%R1R4RERHRNRRRWR_RbRkRpRvRRRRR RRRRR RRRRSS SSSS$S'S+S2S<SKSXSlS{SSSSSSSSSSSSSSTT$T6TATDTLT]TiTyT~TTTTTTTTTTUU UUUU%U(U4U8UGUKUQUWU_UbUhUoUyUUUUUUUUUUUUUUUVV VVV V%V*V< VBVOVUVZV^VmV}VVVVVVVVVVVVVVVVVVVVVWWWWWW W%W1W4W<WCWHWRWXWbWpWtWxW}WWWWWWWWWWWWWWWWWWXXXXXXX"X%X+X2 X6XEXUXYX_XfXmXvXzXXXXXXXXXXXXXXXXXXYYYYYY Y2Y5Y?YEYLYRY[YcYfYoYzY~YYYYYYYYYYYYYYYYY YYZ Z ZZZZ!Z&Z*Z7Z=ZBZG ZKZVZ[Zc .ZhZkZnZxZ{ZZ ZZZ+.?ZZZZZZZZZZZZZZ[[ [["[+[5[9 [A[M[`[g[m[v[{[[[[[[[[[[[[\\\ / \(\-\2\5\C\F\L\R\V\Z|/+\i\r\{\\\\\\\\\\\\\\\\\\\]]]]]]]*]/]5]?]H]M]Q]Y ]^]m]p ]u]]]]]]]]]]]]]]]]^ ^ ^^^(^/^4^9^>^F^M^Y^\^d^m^^^^^^^ ^^^^^^^^^__ ___!_+_6_=_A_I_Z_^_g_n_t_}____________________`` ````"`,`0`6`=`D`N`S`V`[`^`e`q`t`````````````````aa aaaa!a(a,a5a8a<a@aOaRaVa[a`aealaq axaaaaaaaaaaaaaaaaabbb(b5b8bDbObUbYb\bdbqbtbwbzbbbbbbbbbbbbbbcc cccc&c,c0c3c;c?cGcQcVcdcocscxc|cccccccccccccccdddddd"d'd.d7d;dBdKdUdYd`djdpdtd|ddddd dddddddeee eee&e0e<e@eFeJeMeRe_edegemeyeeeeeeeeeeeeeeeeeffffff!f)f2f7f?fDfMfPfXf[fbfifqfxf{ffffffffffffff fffffffffgggggg g2g6g;g>gDgJgTgWgbgfgkgxggggggg ggggggghhhhh"h+h4h: hVhlhxhhhhhhhh hhhhhhhhhhhii ii!i%i.i1i5i:i@iCiKiUiXi[iaidiiioirizi}iiii iiiiiiiiiiiiiijjj jjj$j+j2j6j;j?jEjIjLjQj\jc jfjrjzj}jjjjjjjjjjjjjjjj 7jjjjkk kkkM7k% k(k3k?kDkJkMkQkZkhkkksk}kkkkkkkkkkkkkkkkkkkll ll6l9l>lClKlQlXlblelklwlzlllllllllllllllllmmmmmmm m(m,m/m6m?mU 9mamdmgmkmpmumzm}m98mmm 9FmmmmmmmmmҡE9cmmmmmnnnnnn'n0n5n;n?nEnOnYn\ n`nl npnnnnnnnnnnnnnnnnnnnooo oooo%o4o9oBoHoNoRoUoZo_ogouo}ooooooooo :ooooooooooooo7:opp ppp!p$p)p3p6p:p?pEpMpRpVpYp_pephpqpypppppp ppppppppppp pq qqq"q'q2 q7qFqOqSq_qjqoqtq{q~qqqqqqqqqqqqqqqqqqqqqqqrr r rr-r3r@rIrNrSrcrjrprsrvr{rrrrrrrrrrrrrrrrrrss ssss#s&s/s2s<sBsFsNsSsXsassssssssssssssssssssss sstt ttt#t1t7t=tBtLt`tdtktntqtxtt tttttt tttttttuuuuu u&u<uAuFuIuPuUu^ucuguluzuuuuuuuuuuuuuuuuuuvvvvv.v1v6v9vDvJvNvYv`vsvyvvvvvvvvvvvvvvvvvvvvww www#w*w0w=wDwHwRw\w_wi wmwzwwwwwwwwwwwwwwwwwxx xx x*x.x1x5xAxHxSxXx^xexpxxx}xxxxxxxx @xxxxxxxxxxx @DxxxxyyyyyyV@ky'y-y2y5yByJyTyXycyiypy{yyy y yyyyyyyyyyyyyyzzzzzzzz! z$z/z4zAzGzOzRzXzczlzqz{zzzzzzzzzz zzzzzzzzz{{ {{{{!{/{4{?{M{^{c{h{o{s{|{{{{{{{{{{{{{{{{{{{{{{|||||$|( |,|9|D |N|]|a|e|o|u |~||||||||||||||||}}}}#}(},}4}=}G}J }Q}_}c}i}o}t}z}}}}}}}}}}}}}}}}}} }~ ~~ ~$~(~/~?~B ~H~V~[~_~c~q~t~z~~~~~~ ;FR[ckuz#/9@DGN[ _kz  -3:?W[bru$<?ELP[`ilu{  )=ADKUpy~ Fe)-269>GJS7F]g{    $'.>DKOZ_eknu| G #"G* .= @RV`chor  HT&*/258<@J#HpOZagqy $,37=AGNU^fsz "&,9<BE HWagmps| &+.27;?BIVY\_dgvz} ").4: ?JP J]cgmqux~K% K48BJMQV[clt{KsQh KnqxK  $26;>EMSVZdgjw} L|ϡL L '+049<@ALGJOU $'039?EHYfjo $(7;DSX[_fz M\N  (15;AFJNRX\_cgnu|  #),049DHNUY\fmqw{  !)/6;@EM Uafnsztx#+/7NQVYemy~  (+.3:?EITW\cfjw}"'.19>GOU\_chm Q")+/48^R@FMX_x    19FKPX\`f  *3=JRU[pux    !&*.<?FJY`h n} T0JTK  $) 1<@ CT^bmps    ;R_nv#-0?ELUZ]dg UmsxV #' .IILM^ -!/O;003081*1 W... .. ...... .'.˱3XF4*4H 4t5b5 6 6h6789T9_9o 9(9i: :tC; ;;Ob< p ? H@ 6@WPA.A`B'CsC8C*C4CށBDL.IIb 3:0   5  9#G | X9=diNU~2 0O XBnu;:  FJ>5 "*!$=C* <uK$,!~< JV8X!2 "DA.w|ip] TeNrXv4eV[3MlqpEYra-Tp%6q.]V&`| }UHVP8X*^@Dbh(@b&(<$HMr$%_``* j;F]\F|428ph^4a1&ZJsXESP-)0x@-yxjdcrLGxW(r\$ ftjbX JRwpz^x,j(*=jGhHo T!T@z`~JFQQL1F]X2 bhT^(2*Ln,`zRRPdn9$|zN) FPBR. V~`^|ReZzP7 p6r\^&"cY.G~D"2X:z4h vm6~. l`\n0.Rj`(\ck&,][T$vhfaHH<5L\R^c DV;x?Q8b&CvJ, Rv48 \L(h%TNNfB~rXn(0<0 Z(!Ad&8D^'>j/DT"tvbBGxV4_("JK8~"6( VZyx$$ VJ`jB"f :*/ NP.e.3Znjj]XpZjH"VV^`(dn2"9NfADRp r,V4oHfeOO`j\ :g:V,:*$H@8brbjT PR:.UX&V[b&s`y2.~e@G0\W8|$x,7D] 8fz'P- @'oAz W0?4uPN_P&wBv$2x? B`b$ $,z b>Dvt4,8h/*2C.Fx01a22>6^D7%'|,vTNj Zn t|R&\J4[8B^ "4zHk6&Thhfrfr*x0.z,$rv RLrrR'~:p@>Vtt`8(zLL8 $0eTK.dRdDd26Zt 4,b*,8@rr& `pfjf&| Z((H$@H$ $F%VDt4Nr(r 2TvexNPn&|DA BPh2]^dlPbwL?)8@1mJtz `n>j xhPV RN'$Th0&jnl@"l>`DJB0(^^I`  Dpul^26~[NzLHv:+J *zp R *,`+@Fx* F->r6FF^`*"8~hz&*V8.,LDtfp6mPY"0x2@4DX8p J|^t~`^,TR bl<; vt:RpM_\=D*,R(""vlcJ{B b d[4V"/uE*`]WbV`ZJP\hT(z9BXXvD.M@n"h~ !nh\z\vD2~`BnxzmE"8U(UxVzi*xa\t8<& @PD@(v] b\efZX^:"@:X>Lj9bTClfz8:K,&8|j~nFX 5|s,*3@@Ze0 PL v"6-R^.9>4^gN&|T VRjlB$.;`$Vv2* V VwAW$<  @',DZfATF+dn"?z*4TP`Z^`(lXZ6 ql@|X9)`$ hdh@ox # GI iX(K8do<8N$r"~t  qFl\PRhGkT(J&J& FXZU[8.dOPF+<'L 8|hl$H8sx^.]~R@8$@jz< t FN~r|z8PZL8DA"8?djTbz`8|N qP)D+e>+` h~A0 @04-6jn.NXP*< x(LtF:HhTjS$|,N/ TP>,dzVF&g>JpE9Bb|[HB(fb2FLPQ(!v(:"@d|z@(`0."pDn,)&0k<"4d tRjf8l1lj0l~(bbKL.6P8R6H%2U:SUVMWMl.)d*_<.^JTJHZ|rLzLXTx~K;P8eVrVdT L(8hj,^bHnJvD dVZ ^ ~^R| NN-xtnzO"(]8>rIR|#=zDS2Php|`VY4(x(S, 6~D,r=,"Q ( ~Vorz~@"2p>.V!r$O"&`n%GfhF
*.>6VTjp;"Vf:(1jb?hLhz.d|f%+ d|>>G:7 q.5H;|VLaZZdfK^ (Y&koxH`b~0/~"q4:TNAl4%BSM*% {f_fy|zvr-OgN^ .@6d1qvjXj.P@}4v~,~HOj`WG C,bCL(hE,J:v.Sx=hN 2GtH`04=082.DB&d 7ou1<b Foq tj GMD|B> 4ZdT:& 4j~n>P4.$@ `.^yhz' 9 6Xs4fLB>r}J*P2:x [L  * w^D; ^z{@N  ^  &# $ ?B>_Y , 2H/&)*iB|07D- * /T>3P1+ *A@ER%N2I,-,`(9*SN? #Dhqa :M aG-D!\(ak %BFH1 ! 2:Z_  ZY0$  Db   ObA& T\bz#  -&^s&!YZ=jK 3 4% TkX) **(TS 85Fe":]$L 3. Q6+"Cf:8-\Bblxm 4/< e7$ ( Ӌ_  eQn f41d8 f_$ &F: CL .  8 .!g3p[%B4 9bnwnsjcV k(@h}N;,76HZ&>!:31Tk +2(oza T $%@I[Y3p!7d76/R!kto6S`F/ B#"+MB$E9 ;  14  $DG\@t  "+& ^ut*" < 6  wu#  * * vgvv iH wwG$!2 ( "  <w   & K5":,"B-B D$$(> L$FCy"H z ?`&&zif[$<1  y  @z " XM{,2Rm^!^{l\ % evb7",N]tA A>/X."   & *  0 2t ; X;F ?&^]f%:<""%"7XI3 N 8#F0<%-,F>W  X ~y$]N`_ ~  Rg  p 1 D- 4@ ,     * $;6\3* d5R 6~ (+hvt: f*  !", $ 0 ."~06h B 0!7NUXa6=6,- F׃(gTpT/<Sn( 6++,Ȉԑˈ6 "^K ۉA &_  ڑ$  2fDF!0@. Di(3` $sh $n $-0  LO:  a16w$"DDv zw  .P ( !0FD *  mp@    *+ 0!$   2 ⏜D.' ) 61t.  bm  0 X9$L 020>  5  @*??(./ %49- h-bJ+-+, @612kH*o+26j !J)0 ,   GB ) | B V7  @$ǖ̖`qF   D $-0  B;',2V)*  >tlD. ,$ &  ,D  JGl" ,  o   "}%" 6<!,#7!0H  R',+&6 \0;.F  H_\֝d'0,Fy>" , H% ,  T    v:" *l < c."kE3IkTkId4 0<3G lY 29; >U^*% ,KicݑVB9Jc Z*a7PWB ]OiiHC jW[1yXBD$(7GVpt~Q~wU9 `dJdF \[d"86@D&@>P/s΄jzPhV l:X$h2< "BLnH\D0\,8_!pr3v dP4nb  >xO  u[F2> $2> 3IkTkId4 0<=+U^O*I8GaZU6{Vx i&TNb~ 4T plhy &l; J0r zX3 4b3w}i%>f+w`*SD=XN-o}0.2Q$2C     j 7*%$301[_hg 8&Dseck%2R7 A1,r_5^c3?+ J"O FDSI W  0Px gXIII hXIV iXV lxiii mxiv nxv o!k rTB s!;} x!! }Y'Ne g POy>˗v 3{ g POy>˗vw 334Y#Z4(F:+?.w:8-0"VY'b,`}m;p4j8v pd=G9b2p@ZP 24H 8@}beh!A>#d 3:0   5  9Gv!#0 #`b#rIC#0M$0r$0"$1[heL" rM $R~1rR~1r$ pGg$E $[$I $(P$O $K Jg$e $[$1 $)P$o $ԁK N>g/Z$Z $swYR, % S *{v9 eWncL %XVETc%d%h %$89Ra9,Sr1V 4iev% %`.IIvr% %R~1rR~1r% pGg%E %[%I %(P%O %K Jg&e &[&1 &)P&o &K ##h&40/3&7 &>1/7~~~~~}~~~~~ &N1/10~~~~~~~~~~~&[10/11&\1/12~~&_11/12&a0/3|~~~~~~~~~~~~~~~~~~~ &}1/10~~~~~~~~~~~&10/11&1/12~~&11/12&0dY&00nlllllll&100'xiii'xiv'xv'XIII'XIV'XV'.0B'40M 'H0r 6'd0'x0 'SAN"0UN˧9'U]D9='0cR p"0UNFup"0UNFup"0UNsP"0UNFup"0UNF!>5'() D(32llllll(H100(}0B(0M(0r:X 8\AV M (2D=dc^_d)00lllllllll)l100)0B)0M )0r 6)0)0 *0bDDoPe!y?* 00*1*01*2*02*3*03*4*04*5*05*6*06*7*07*8*08*9[*09lllllllll*z100*0B*0M *0r 6*0*0+eDDoPeb[c+00+1+ 01+!2+"02+#3+$03+%4+&04+'5+(05+)6+*06++7+,07+-8+.08+/9[+009lllllllll+100+0B+0M +0r 6+0, 0 , eDDoPe!Wa,,00,-1,.01,/2,002,13,203,34,404,55,605,76,806,97,:07,;8,<08,=9[,>09lllllllll,100,0B,0M ,0r 6-0-0 -.eDDoPe!7-900-:1-;01-<2-=02->3-?03-@4-A04-B5-C05-D6-E06-F7-G07-H8-I08-J9[-K09lllllllll-100-0B-0M -0r 6.0.%0.;eDDoPe!WBo.IPH.J3.NVS.O!.Qc/c .R3"ML r .[m/m~._0U0X^.d3.f000.g3.h000.i3.k00000000.l3 .m0000.n3 .o000ׁ.p3 .w000000.x3.y0000.z3.{00000Ɂ.3$.00.3%.00.0000ޅ.000ā.3-.0000.000.32.0000|.3<.000ȍ.0000000.000.37.00.38 .000.00Ɂ.3R.000P.3S.00ȁ.3.000.3.000.3.00000000.3 .0000.3 .000ׁ.3 .000000.3.0000.3.00000Ɂ.3$.00.3%.00.0000ޅ.000ā.3-.0000.000.32.0000|.3<.000ȍ.0000000.000.37.00.38 /000/00Ɂ/3R/000P/3ST/ S;vBlN~e~ڝjʶvxߡ{~e~ڝjʶvx /- x W /8JAS/9!5Krw5> /At/D&l%Q4/U\\/V";.p/'tWZ 4 [!3y/!w/%RSPSPSPSPSp= /%^'/% 4/[f/0S> =GJ UCDN Kc` -!D 10A "> 10C+ 2>0> Vyr2J 2MR~1rR~1r2] pGg2pE 2q[2sI 2t(P2vO 2wK Jg2|e 2}[21 2)P2o 2ԁK N)/Z2Z 2[c@R, 2S *{v9 eWncL 3VETc3 3$ %$89Ra9,Sr1V 4iev3> 3~`.IIvr3 3R~1rR~1r3 pGg3E 3[3I 3(P3O 3K Jg3e 3[31 3)P3o 3K ## x 4' w >13+V)3gk\8wI8&34'Q,\le4-~E%4.V ?LGJ. N*k%HMN$I(K*0G#y bW(;_e|MFj`Ar.ZO3JJYDcK65v%h2p3?C6=OmD(xSUXbHp -dWd,&9@7.^[c@/V0Rd.)&lU"% a?fr|  ~ Y,yHA, tZZciZ^H"(g}NY~v5~ܬ5gCJ^5Bd 5 >iNLpBF5~ 5n/J|z@{n?Te_n RQzQ.U ~\0M5~ 5s5Bߟ5chf5~(5r55~!5L7m6`5~?5}BfTE8&kn -P\6~s6 \\(p6@ 6[6~R 6`ţ#cs\N=@6~G62o6!@ݢ 6"R|t+"G6+~ܲ$6,vۥtR>T /h]R~+ .|UK4f\ V-(+K6PO 6QZ6 i~"e(6\~ 6]eK7D|?lN6h~ܚ6i_xT6l~6m?s@8ap7(ZHye[ 536D=8+6U?>|@Ek-{^JvW2v#ts6~b"6UyV? lb'p[, 0VpuF2LpdZ2,\6!6b?6,"5 VLEyk"ou .giBH9hy'sq6~6RX6U6J]K}^rPN jz$fILZmxT7Yް7Pr 7@܊B 75>@8`TpDJf7)~m7*\eZ4f71~ܶ72b-B76Zݙ77c"7<~ۑ'7=h!Pa=$ u]` 0^ZH lB;p|,$n;(aaVZ7d~l7e~"J'7nXp7q.]@ 7xU@ GlBX7@ܰ+77p.l:D60Jg*H.F,4p7b݇7<7c7R8b. v x, P R8Lv07iY7ˉ)m 7~7js7Oܾ[7׊g7ND*HD,8KJ7OL Z7P P_& ^2 04B 8Rj.XhN8S>*|\bJ00 8(8:U r\, J,.& J8F66Z 8`W,"PH D.b88vZ,F > X>0&t8[0d $ B^8 n." 8^*R@ h 8_" H$.40Z:< 488a> "28j&2 Zn@8ce dX "b "8d""Z>2xZr>9faXFF0>(Rh E,v 9%h[,@: "92h(B 6f  $  N 9Rjb BvD $fX"P " 9s$ 9t$ 9t9  9t"^T:u^(  : v2:v >nJ :wr.(v"6:*x0djR*j :>y>P  N:VzƁ$* "<:Nb 4 :t| :{} :" 8:}< L42 V:a^Z :&&F P:Bh^4R: "|> n`  :ӃHpVb ZNR`N,CH,P $ : *d, :@(&rf";T;'x0* V`hT.$;+TP<`h, 8. >*fT@.6:H:<^;Q2"R. "D ,D($ R;of @ B&;Z>$Z<#..."H** Z8F,V>P;~ ; L ;**$;Y$84".p&"D8<;s Z2 6" ~6 $F"@ t B*" 4eW<~<V TmL=v=u1&78 (m*;8VQ (DCQ%lg h.%lg d.j#&NG&N2%e8+$T[ 5Z]b- XI(@c<4M%tQxv/'r3Za=y=% ;@) # !&> > j >" 6 >!" e >p9>/1p8 (mp8 (Q%lg h.%lg d.7&NG&N>l0jA>0K0~~~~V~~~~~~~~ ~ ??0S>5&1p ?Q0K0~~~~~~~~~~~~?^ \?v10? >&w+UX 8<2 ?10 ?0K0~~~~~~~~~~~~?10 ?0K0~~~~~~~~~~~~@10@)3 @0K0~~~~~~~~~~~~@510@@0S>@L10&@S0S>'*c<A gV8G2qDA.X?i|=M.pv@1&78 (m*;8VQ (DCQ%lg h.%lg d.j#&NG&N2%e8+$T[ 5Z]b- XI(@c<4M%tQxv/'r3ZaAyA% ;@) # !&> A0j A?" 6 AD" e >p^AR1p8 (mp8 (Q%lg h.%lg d.7&NG&N4,BP`Ejb>E(.hhH@ rhX`V@XDADAW(~HAEn AX@m `&~AFܽA[}*|-AE޴A\z( JAG4*A] rrDF$4 @2,P 8"*l Pn(LJP&0f81(ALđAfZ>j.K6f 686. "0Biwz &BmU܎BnxCTBqUBrx$6" "dBzUqB{y.BVāBz\(4f"bBWݡB|m*h6TLD6J\2$*$XBmy&BZBB**NBjRN>0 "06B[@ B…2) h*"*PB"BΆB\ BІ>< .;> zB]ބBމ2 &B *&4j$fV< B 2zB`wBHDjFLB`́B 2HR6NH0Z..CvH\,08 (GZ < 0 "t `TzV c*`: &^,$TCAe:nR)CKhݐCL>, NCQ@܉CRN,0CX@ܢCYNQC[@ܤC\Nifc D#,@[ 2Ck@CnO@i$ Q@b~7CP(C@+CP$VC@߁CP΃C@qCPC@CQCAJCQ`CA CQs6MCAցCQ<CAOCRU CBCRCB:CRJ CBܹCRzCB|@CSg$RCBӁCSCBCSe ^u(<P CCE CT*d7@?vCCCU}CCޕQCUCCdCU|CC_CV>y ,Q $"DD&DW)D D{D WMD DtDWh DDDW\DDDW̃DD6 DW"MZ 2"D)DāD*XI4J  D6EmD7X(T D@EׁDA6VIXaDF[)DGY_DHEG DKY|D  DTEv DV6ρz n( DaZ4 $8. * "DuFÁDv[* Dz[U JDGVD\_ DG-.d-D\DGݡ D\DGݒD\DGݷD\ɃDG$ D]4 #pmvDGD7,0DGvD] DG D]u <<[rkDH{D^ $DHD^DH߭ D_P6 $H D_ 9b$DID` ( 46"2DJ[DaDJܫDa.DJݏ Db#\, JvEJ޸Eb BEJFEcYEKoEclXEK$EcPD EcV  T*E,dE.KE/d4#@CT&", N }D04IENLbEQfj ETf{ <7 R EaLrEbgEcLEegM EhL&EkgtElLځEmgEnL߁Eoc'6EvMJ Eyh E|MeE}h3 Af  SEh. ~EMj Eh $EMݔ E;pD.]b2 EM9EiML$EMEj?`Y"EM Ej7`EMdEj" EM1EjEN$Ek EN= Ekc4& 2$ENޘEk8&&NEOElM", *(aFO FmF{<2 FO@rM Fm & ,~1@F+nOF.nW h&b F?O~ F@oRN N? FMoFNPܖFOo0FSP FTp:c F_PƁF`p"FbPFcpE b\@-4FwP߼ FxqT\(FQ)Frx FQޥ Fr CVM F>j (},FRܖFsq& * "23 "'F FRM Ft6$FRVFtFRoFu  'FSFu@>"/XWp  "(#CFSFvFS7Fv%&FSjF?nFSދFvI},LGTJGvɃGTUGvG T"G w$GTݩG@9GT1GwXGTGw|GTL G@X~ G!U.G"x$4DG)Uف G*x62 .G5UݧG6yH'BDGFyGHUߩGJAOt q( 6G\VԁG]A6GdVGg{=' GkA}'LF+GuV߲GvBL G~WK0G{ $l  GW.NG|GWbjG|ăGWG|̓GWtG|GW\G|{GWG}@ GX #GB 'BGXG}GX` G},IGX GX 0^GC+\/pGXp*GmD+GOG GYG&.*$D(: GY~ G L1  /]fGY G=k@%PGj2$H Z݁H HZH HZoHHZ݁HHZH< HZXHDv8HZތH \ H"Z޷ H#DV < J  H4 s$$3*C HAV &6HJ[sHKB*HS[ݑ HTe$i.mH_ӃH`[e Ha@F>YHp[ߔHq{Hy[H| H H\ H9H\9H@$@H]   HrH\H=H\HE0H]H H]IH HćP( [tH]HψiH]1Hшo`6H]ޓHֈ%~H]Hۉ7H]#H݉BH]RHbL  @$"!BH^݅ H!& *=L>HH^ބ H  C.I 9I ^߳I =I ^߾IE"I_ܸI kltI_ݠII_I r d~I'`܊I( I-`ܻ I.H>4P , I9`ނI:HNI;`I<D(IBa ICIEaU IF:5 6 TIRakISC2 IW  Yt I`aׁIaIcaId +0" 0:4ZI{bII}(IbkIBIb݈ I  &,VIbIbIbq]IQ ZIbޙfI,IbIU(BlIbZImIc@IĕȃIcFIǖ,Ic6I˖<HIcމIΖIcIЖIc2II Ic Iؖ3u Idޠ I痖 I뗾$ 5IeܐI%B<Jeρ J* (JePlJ1 JA", J'fƑJ(  $-XKXKLJ9frJ:D ";T.JP JRgۑ JS h7J\ghJ_  JfgāJg1 ,Jkg JoT$V0JgׁJJh/JLăJhJ2Cp(JhoJsJ(: 9<JHJ*JhߌJJi7 J>lJiJ]JiJiJi޲ J.N0<B"ZrPTJNyr0"$20~$(,@H JQ3vf  JQ J@ : JR("N*  KSd, KTL4 $6""4(P  K;V,& `2 (*KOWDKTW_&,L"J0L",FDj>:.V" r bH,|>|D ^Fd6Hb\JN&.K_MT$R:HB6Dj0"zLknLk <:Hd:4xl(Zd L0o& ,* *$P.L>qEXDF LFrZ 6$3LTsMx^ 4:P,0 >2 >B~6t:z N$Rr&F: M6  z"  &MI$7MN&HP 0f,>$ f4 2VN|2&"D D"M4MM" t, #M<,&8(""L(>h$ 4t2$.@MҒ<BL` 2$M.:v0: $Mz ,>  .(. j 2 &$.<N x>$T$:N$N)6$$. $l20" X R NHf,  NT4J(\ NY@ZB`$|pNc5CNhh޲NiN.Nk@XNlOsD,zNpAݱNqQ<NsANtRd4(VNzCXN{U:H">NL6jn~0lNV̑ N^CFv(Pv )&NKBNd 5NKNeN^ݴ"Ne * $4/t@Dzt@L,Sp b"Ng,R0 ~NPK%Nr>}?Pd><8\6<\ PB^pPD`HDH<tr@N[ܞ NQ"V|&Nnh( {N_< Nj 8HBO H6*\$8Z.,j 6,r`2jO&N=0O'{3Aw*Qb, Gh&E+l ~5r7) 2U6PH jk@k0JOWXLOXNRO[g=82O_!V *6g:;  6H CW:-  6l.O%ʑ2O!V *6g:;  6H CW:-  6l.O% F=89tut7: 6uPCLPKCLPAS PkT _ P+0ׇ~~~~~~~~~ PI^tM49D^aG|joOPU0{0K PVR`TsXXyP_PVPaS̃PbSSEPf0ǃPgHVPh (OT" $SoX:  H, SY?  "  T  SZH8(B Z$.S[0 S[.H S\{(D,S] 6  S] .Z $TS^\&:&4 4$T _.,$ 8 T_ $T-`q  {"T?`, D TSa f  Taa"0 ,@Tqb -Twb6" *8 8 & >,J4B (Td"$TeC:4D Tf Tf  ( Tf<Tf 0(6 L.Tg$:,Uhy0D U h  4&.Ui{"&,j8$:(,U*j0.F U8k <,("UHkl\ *UUl.6. 4*$ lT> Dl, H Un*Uo>B,$(D(2.|0  Bb*Uq: Ur * Ur(^ < <@Usi $0  Ut6@&Ut(V u :. ,(V2B*":V.w(D* @ 1VBxcV0  & ." > 2 VuzH0 T"F  V{j2  $ V|  V|F $R&(JF   (V~=B  ^V?82,>L!V. >&n6" 6*,8 W 4 &Wr f W3p( "W(`Y*  (WRJ WW    Wgy(Ws. 84> >  W ?v>WE&W, " WÈK  <"WЈ*W։  Wꉠ&@"H X  X$" **P $  X/f.X9 J2  iXXB4:B.  (" (&  Xen4  42X?D B,LX'j  2 X02* J   X& 0 YY  :  * *t Y&<|(4Y4n$ F4(PYF{@ "YX<  0:2 ."~ : Y $ "YT  Y:( Yx  &P*( 8vD$YΝ:>: ( &`*$ Y0" ZG " ?; ] 9  "9 ]?`0000000K%0000J0j0~000p0s0v0y0| 00000   0 0 "f 2!"""' "j"+  !AR0AU0 '*6TM\NO_؁1s6oN)OP Q Q?Qi QQQRKR R/T,"TUVOW7W%XY,Y Z5 Z [Z\\8K^6 ^u^^^_V>``a aX(b b2 bTde4 e ef5 fgg& gcj$kxkklgnxr;r?r sN1tuuuv vGvavhvvw%w7w<yz zazz{{p~Y ~~~LP_h 4ejw"F8D%*0Fb OQ1**.=o=Q "'.M7]   _f K%$` !`33221 ")0L0 0G 0000=33$$t !p 2R$$## 32*+&&!j%%%m%%q0   'v!z !0]\qF% $ w'*; ] 9  !1* ]?`0000000J0j0~000p0s0v0y0|000K% 2 ![!S t "YZ  <] 9   2 ![!S t  0(.: 0(.:!S!U![H 0\ !p!z !`A0J0j0~0000000 2  0 0?$`$eE$$0J0j0~00.2 222uaA0J0j0~0000000{aA0J0j0~00000000}aA0J0j0~0000000zaA0J0j0~0000000yaA0J0j0~0000000!!33 3333(3.34 3>3C3K3O3U3 3333(3.34 3>3C3K3O3U0 000   &h03 /Y"r0 00_0 00_3/p###0  !!!!% %000 0 0A0K0M0QA0S0 000A000 0A0K0Q@0S0 000A00E0000 0 0A0LB0R 00 0600  2 ![!S t "YZ ; ] 9   2 ![!S t  0(.: 0(.:0 000  [b.F_&s6pP.`NN/N@O}PRS U`VVqVW3WY[~^^k^_acBdf[h0 hiijPjl!op]prUsss tt/ tuv vw_ x-xy[z|} }R C$2 R2-3t`00"f""""#"'""%"j"+"vU0A0M0 110">v:b "r >900U0A30!0 1100)4) $& 11#% G1"v"""# &r00 11# 11 11 110 11"f""""#"'""%"j"+"v">v:b "r >'fwlwM5g !4"d.O(OwPP%R5]U.VWEWsWXXXY YuZ7a \g6^m__aEJO/E c; cc d&fl9hh hij2jkkkm&mnHnKnSo(q rns sn-u=u}uu vvwxy#{.(|}=!~ c}Q  QY $aHz[HdD !IUaȡIhF|IbݺI 3 2:1kv Iim v5N#Q QR1RxST4 VWW=D^.cc df jk}n prO s:3wy'!|R|[} &7@# $b  *!Rq)e]gR2"d2"d  R^0000A 1 0 0"$t2"d2"d NtOKOO P2PQPPPPQQ'Q,RRS'S+SSTm U UZUVCVa VWW$!XXYY5ZD[[[[ \t \]_]y^P_+_t__ `V``aaaaa bbb-dee<eefffghph ipjjjjk kkkkl&*nn*qr r{rs]stgtu{v9vvwwVwsx`1z4{?{{{ |9}}~!  M \_  X`<H +vzcu7] R] (3$.5\n%9Vw"J9Vm3S Cmanuskript-0.10.0/libs/pdf.js/web/cmaps/Adobe-Korea1-0.bcmap000066400000000000000000000003611354442177200232660ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEq%tmanuskript-0.10.0/libs/pdf.js/web/cmaps/Adobe-Korea1-1.bcmap000066400000000000000000000006021354442177200232650ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEqGjmanuskript-0.10.0/libs/pdf.js/web/cmaps/Adobe-Korea1-2.bcmap000066400000000000000000000006071354442177200232730ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEqH/manuskript-0.10.0/libs/pdf.js/web/cmaps/Adobe-Korea1-UCS2.bcmap000066400000000000000000000553751354442177200236620ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE_V3Opq4[5~J>P* $N偙8AX!2W&uK$U 0sDA.[<⁇^VN+ CDu:l;WH3 Z&e \K# %|3Q!( &l$G `K>*oC!(% w WE$$a N!V E^#*3! $-MvSr1F9TCl4i    6f.  > P  >.&>D ( .T ..6F &66 . ,&v &&6  1&&?+>Gc &(  ?Z  > 6. .&&N &6nD6L& ..L.& o  46  &>P  6L.F   8T6&*  *   T  66 &&6  * 5P*FV( |6( z4( 3 > . @ .&  &L.PL"f6 &&> &6X"L. D  .. ..  *  *. . &>  6  &>L (& L&( &N&P n66L..&L.   g D ro  |ͧ &."  LPL 6 &> t ( &,   ( L 6&(L* 6 =ѳ.6 . J0 &>  .  . &  (D. |  ԋ (D , P &(L&   '֐  3  @ jכ>j&bL ^Fnh M zg8j~r. A frZ p J$.lxR$lBv rNQb2x\Zh2!j6B$XN42$z4^^2@ ryV&J:N R `L&@`:J6FB#B v$DR6Vp\<dun\0v 2DdZjd<o2&SU@8bv0dn\.hfvBP\Z`2vRPO$vzhAL>tb`$,lHjB:pD^zVZ H$~d,R6t\~BhBM L,"Db2^ZnBV*\z^ 0:jA@L,$,^~XZ"v|&Z(\:Z,,d ^`l"0>`tMZ,8`lPafXhT6`Rj y~ Zh T8j&:@P|X;\L&~hfTjJxtg(,Zn&l,DP\htT`u\*q|.nx.BN&r@Rkh+R&xP~`e0ZwX4~>& F$R*X@\4LZ Fvp"*'X.RR DP @XH~V6pL`BjJ*44<|XvRd(  >d"6dFZ#h*3xhf&C cHJh>: "~| T|.pf%b <7Xx<|)v#@nh\4hpl2Fd[~0V" ~v.p8F)<~<@( |Zb .nt|xJvV"щ_ 7|4Nr$]N6$|.d`zDf,g^X44P2 .@( Z" yz4TrzL<lp\Rz\>eX)$HJxMcBP^FKQ~)TGn $*HQ+F@N>;J^+l6d)![hP nvdhO-vU(XPMtA6{xNR\@\2h.>\~X >PAvz6}lX2d2r"l$r$~tb*H,*>8h H5pJF\X" X" -bvCZ^JDS\d6rtz,iz6X _dV8"`%,'( R(.0`,0i +$"R$61 $R'Po.D>n8jDf3zR (FVb hXlgT`Jl>e^D~J~Tt|nxL2PvrspV&v#"~B*tXfn.*"-6 3Rvrn,2*$*XxtSd@Ptt&{oHD~N :; rNn.2c&&NhfT8b~TJkP@` hVfL2VL@4dr,p bcE(Z b?p$\ip_!"zBd7\l|,L2(lx<| "T"LY@"B^pffNhZU<(bSVNL;lv8 6Pv&4V$VntLN.bj?8b~:@3DF\g,Bz0"@tZ0z,dT( V:{fH f,'XEP f~^6" T8\6e)FLl.FfB V>lDvHtNFIN, n>DU$adUF ^H| `V~ "8|xFhpH**JP.FNp6Nrs^xX&n\^Vj\a*&mLFBvX0R4p PR${|,:Fh l:^R.d*fgxdD"j:j \VL*`>& bTR(L.&T`2Jffz8Y |XTJ`(ARx:~<^|t J6*TZT:X:5 <j8&*R w F8wTf$eDGP^@M,* 0lRtf4,2^ l ^0l>J028 (p Zf~N(!#D|@2 HBZ6V(x (\+vN3BB P/v(LbX$Plx.|T*0^N d:x>z>LvX(FrVNUJ@PizrH>>d 8nl\2\nZf$ b:zJvxv>@NZ4& j.`|| x"Dz'y" bbh0rr6ns4NFA~HPp$i 8KX.LFXP0 ."*B`:lH~nXD<|Zxz}<~m2X f)j$L2xX<:6:~N6dX8& P$.~\n<8~h2&j8>%`zv .FlLnXz^t$"p @"Z(0&N@ P^H@>bx~x .pFNj2VHA0t$*~BJTR6dtbyHZfl~ BF2 : 0 L^Z&Pnh0d2X0&&|A(dbX~i"d65yF> 4+2xMLSPJ8Nt D(H6zx&2 RH.jTft<,$*8hx<V2>NPRD"_Rx R4,".n9JD.RJ8FjVz^4Z@ pFf\|B,NZQ 8h=>jz'/&Fv)rjRnB60#8(0&*hbrb$vjN .pnfH >t>z> NJ@< >2H.fn&lT(4(h"Fh @^R)dDABnz^2( m.cJ PFX&4B j&'P 8f@D8"rL]\ pf }>`fX Z:"v4c~V~ JtB~ 6PR.sx}Xp\ZTht0&@ Tpf :\Zr /N:0"r8~hD\H"2Z>xypvP*jL.XftTPHd068JT6(yn`rrVhvXL4 &n ]~|ׁf4n8C,Crr6b nP|H,h fp:>.r^4j'&#v($6 XL>80F&.0>vxR$j9:.r T ^B|Hf  <Z Plt\(@4 r8""v~HKjPcRTxDn!cH[:^ `1 t1ZiV`|9xJ6d^X0~" tTVN0ft?0HX`P~ 8L8Z L 8^V&X.+$~^:A XD4n@v:r>o2FtVx*n}`:N$tf=>NCBz' F>~pP,V| $txb":>F&."<* yL,@*8|~b`@6^<2xz^Nlph(8l4FN ~(DVP8"0@2|B0<j&< d/DZJjj-:0@T2Pz8b/V7lL:F8v*>Df||&*f})& !:a*p9^^ZfjJ |{<,R N~p"D*\zr"p~F>`R2@fnrf}H:8Da@rdLBZP@64pr:NxX4D&:fND,2tj&Xp<hnnTP xB@j=> " #x"a R*|dL\FKhTTu|lbR^!J^d$v'J *j.abXp.&vFRZRVTlZFbJ>xJtNnLJZWT@*Ql.snJ8p>L(I>.@4n@`>*? 'v*2` ^joBPV^, ^48&lFtB8f~p8PDW6RPn:t, n4\8<8dh:+NVI@TJRJ ^ZJ0((p f4,y8,nH*(4.W2fZ/4j6T2_Dtt0*rVLjJ*$}a64`96~h \Lr*>Xp\zfd hdXR<zNOf#Xdd^Dj<>`VcL`n6bFZd*<@Oh>B"f(2WJhX-0Mv:r;FrjTtR~Z^ bRU8'dm\_,HlVGx8kj|Npl"'xlf~$*FV \ 4p<$&\Pfh#XP~ P> ~ |:F$: e\ vx& ~*Ptn<Xc PpNBB\2l L.>E*HFJlt4hߖPC"ZTL`rDj4c~"~^uLHn 4*&PD4A^:> (\~V*Rh4TurEB,nCJ8n\R v*,DXTTz+>b"D~0hTFj<&4LJ=DkYfR|t~4X@6r,>l&6\9(0-.,Tx*Zphp.=RfZvr`PlNU.`RjVhD>8 LQNQF`4zRV@[P 4RRc\"Z0yhx%jm8n.dezB<80Xdsr~0bzqN h%Xb|E~ (( [@9jq  [B+BKuKBz5X[ Z4 i1 އ~~~~~~~~ r[10]~~~~~~~~~~ }pq 1 އ~~~~~~~~ [10]~~~~~~~~~~ (A)~~~~~~~~~~~~~~~~~~~~~~~~~ 1 އ~~~~~~~~ [10]~~~~~~~~~~ 1 އ~~~~~~~~ [10]~~~~~~~~~~ !" %1F6 !:0 އ~~~~~~~~~4!NA)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!! "!(27)~~~! ! ! ! .1.1n!% ~!&!% ~ !' OGG `!(21)~~~~~!&B3We?T2p<}" ݁"#eZqbO"'"8 "+"w\KVE"92E"<!?~"?"Č7 74/%H/_"S%L" "\(21)~~~~~~~~~"f!x ~  :SS   d[ "A.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!~縀~~~Ȁ~~~ˀ~~؀~~Ȁ~Lj~~~~~~~~؀~È~~~Ѐ~~~~~|~~ɿ~ɿ~~ɿ~~~~Ѐ~~~~Ȁ~~ק~~~з~#W(21)~~~~~#]p ݃ϗ~ԧ~~~~~~~~~~~~~~~~~#x2#yS ݕ~~~~~~#20#N ݍ~~~Ȁ~~~ɿ~~~~ɿ~ɿ~~ɿ~~~~~~~~~~~~~~~~~~~ɿ~~ɿ~~#(27)~~~#'wf$ ݃~~~~~~~~~~~ $[10]~~~~~~~~~~ $%N ވ~~~Ѐ~Ο~ $/[SAN]~~~Ѐ~ $9N ވ~~~Ѐ~Ο~ $C[SAN]~~~Ѐ~$Me ~~ø~$T2$[e ~~ø~$f!xO-@A~k* * *:#X6 6 $  (j26A"+n%X  6; :9pfx-j  8 68E"62r J 6=  $; B/nH"!X,j66C6T6,n26:.j6266G"22I&22+j &>2>F H"2 & <*2=26P r ZP2)\ 6vR6366X $6P ?"62JH62,j ala^v.2 $6 F  $ H ( .:222;"2( j 6/r2;2,j(jG",n&X  6G&b^y*76 ,^ $6D"G",j H&X)j,j22F&02-nwD"[Z26A6E" F-jk+n 6H&6*j6dZ $b^20n22A22)n6622:@"6'je3Op^cE!^ 0 %   0 0"d 2!!"j"+"""'&`%%  &i : =211)1e !p !`ñ /%%!%&%)%-%1%5%9%=%@%C37Q3 3333 333333332`$$`!S![2$$t R0AU06,/8pw ,4Dls{07@EL\_hx{,<AH\dDS| #47@PTx htT[^dp (P`$'0@CK\_(/8Tp|$47\l <Xht8HMSdgp 4;DO $0@CLHX  DTY`ps{@P h#&,/8HKTdg (1Pl|ˆ¤¬´ $(hx|<dt(8DHLSW]`ps|ŌŗŴŸŻ$,3@PS\xƔƤưƸ 0<LQt|ǃLJǐǖǠǣǬǼǿ,HLpȀȅȋȼ P`Ɉɘ L\_ʼ HXx !'8;DTW̴̨̘̫ l͔ͤ  0X_ht΄ΐΠΣά,/Tdp 4Dl|Фд0@CL\ѠѰ ,<ҀҐҸҿ (8;D|ӌӏӘӨ xԈ<LXhtՄՇ8HTp֌  (4PV`|׈טgMQ~"gyG>_FdxF} eh v}e\#P>kփ$_z|X^|aias6laX.hxfCq00 0[] 00 0((00 < }")0! 00(00/ '$$>"""p"v"$`V09 'v$"%"f""n-$ !!R!ā$!k20 !  !%2:= ANUY]ru{ %%!*.69=%OJQUYdnqw %v ɡ'%*25;GQWbfjmq~.   .5&DJ Q^fwz'F   )F'OZ^~! &)- (V:BEIRVY]az}( "  )!5=Y]a jv})z 6Y`lruy * ɡ*Uѱ *\!*,5RUY *fm++259FNQU=bű+ " &-5Ie2i!-!*-1<EIM Vaeiv~ !  &)-:AEHT^aery}!>AEMRZ]anvy} !:=COVY]jru y !!,9?JQUY0ndm#0 *.259FJN Q%^1 %-AJMQZbei2' 2+  2# FIO\bekv~ 2 & 3c!BEIR=Vݱ 4Y=RY]a%j#4 !(2:=ANVY]jqu y5t 5!5IRUZafnqu‚Š‘™ž¦©®!º 6{ &*!Fjm 6sz~ÅÉÍ"Ýݱ7? %-15 >IfimvzāĕĝĹĽ)Ŀ 86   *-158j>FOZbeiv~ŁŅňŒřŝš ŪŶſ  &)1<BEIV^ amrz}ƁƎƖƙƝƪƲƵƻ9d  &9"%)8>AEY]ailvyNjǒǛǧǮDZǵ !% :\29=AJNUru<:{ȈȎȕȢȩȾ-5RUYdmqu }Ɋɍɑ!ɞ* BNQUbi~ʅ"ʙʾű<|  "BJMQZ^e l!z˝˹=v!#*1?FIMZaiq v̶̡̝̮̹̽̚ >"  >h%) -!:]aery ͉͖͙ͪ͝ͱ ?(  "%)?S!6Z]bnvy}ΊΒΕΙΦή! !%29VY]@FjruyρφύϢϩϱ @ .69=A AJQUY anqu~!ЂЦЩЭAbк!25;FNQU Abim}тхщѢѥѩ B*Ѷѽ  .15BBI]e҂҅҉ҒҖҝҡҥҪҭҲҺҽ3C "&*-1>5F~ӁӅӒӚӝӡӮӵӹӽ !AE]aepz}ԃ D~Ԏԕ!Ԫ D   #>AERZ]afnvy}ՊՑ!զ E!% .:=AFENRVY ]jmr uֆ֎ֱּ֑֢֭֕֩ձ FT !F.69=EJRZ Ffjmqu~ׂ׊׍בFמ I5] manuskript-0.10.0/libs/pdf.js/web/cmaps/B5-H.bcmap000066400000000000000000000020761354442177200214370ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@> P` ^Pas@c/!"T"xwyA>"]?A>"\w>S"]A>p"]/A> "]LA>*"]iA>G"]A>d"]#A>"]@A>"]]A>;"\zA>W"]A>t"]3A>".P.A>/"]nA>L"] A>i"](A>"]EA>#"]bA>@"]A>]"]A>z"]9A>"]VA>4"]sA>Q"]A>n"&-6UA> "]KA>)"]hAFT+X"]A>b"]!A>"]>A>" [SfA>:")ye2#A Vx"/.C0Atw' "]2A>"]OA>-A lt v"+-HwA> "UHvA>%"]dA>B"]A>_"]A>|"];A>"]XA>6"]uA>S"]A>p"]/A> "]LA>*"]iA>G"]A>d"*#T1OA99;"]?A>"]\A>:"]yA>W"=NUA>t"3W:A>"]QA>/"ZnIA>K"] A>h"]'A>"]DA>""]aA>?"]~A>\"]A>y"]8A>"]UA>3"]rA>P"]A>m",[/A5 B"]KA>)"]hAF#b"O. VA>c"<"A_A>">THA>"I\&A>9"]xAVG'l")a2>A"q`"]0A'o6"!L;oA4+ a"]kA%Ip" nFeA>g"]&A"d'"]BA> "]_A>="]|A6Z""=I >Jmanuskript-0.10.0/libs/pdf.js/web/cmaps/B5-V.bcmap000066400000000000000000000002161354442177200214470ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEB5-Ha KN/1 hOmanuskript-0.10.0/libs/pdf.js/web/cmaps/B5pc-H.bcmap000066400000000000000000000021131354442177200217520ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@> ` ^=at@c/!"T"xwyA>"]?A>"\w 2_>S"]A>p"]/A> "]LA>*"]iA>G"]A>d"]#A>"]@A>"]]A>;"\zA>W"]A>t"]3A>".P.A>/"]nA>L"] A>i"](A>"]EA>#"]bA>@"]A>]"]A>z"]9A>"]VA>4"]sA>Q"]A>n"&-6UA> "]KA>)"]hAFT+X"]A>b"]!A>"]>A>" [SfA>:")ye2#A Vx"/.C0Atw' "]2A>"]OA>-A lt v"+-HwA> "UHvA>%"]dA>B"]A>_"]A>|"];A>"]XA>6"]uA>S"]A>p"]/A> "]LA>*"]iA>G"]A>d"*#T1OA99;"]?A>"]\A>:"]yA>W"=NUA>t"3W:A>"]QA>/"ZnIA>K"] A>h"]'A>"]DA>""]aA>?"]~A>\"]A>y"]8A>"]UA>3"]rA>P"]A>m",[/A5 B"]KA>)"]hAF#b"O. VA>c"<"A_A>">THA>"I\&A>9"]xAVG'l")a2>A"q`"]0A'o6"!L;oA4+ a"]kA%Ip" nFeA>g"]&A"d'"]BA> "]_A>="]|A6Z""=I >J``manuskript-0.10.0/libs/pdf.js/web/cmaps/B5pc-V.bcmap000066400000000000000000000002201354442177200217650ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEB5pc-Ha KN/1 hOmanuskript-0.10.0/libs/pdf.js/web/cmaps/CNS-EUC-H.bcmap000066400000000000000000000033641354442177200222270ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE]"]"]] P` ^Pc]c"]A"-R]M"K+w0zs2STZ[_n`b co!d"p#fyuz$|%v& '*wPU,V-Z a e jVsW^b.c2kvz~g0 1 &us 3x4ya;`{ 2 c ¡ 2_]S"]1"]"]m"]K"])"]"]e"]C"]!"]"]]"];"]"]w"]U"]3"]"]o"]M"]+"] "]g"]E"]#"]"]_"]="]"]y"]W"]5"]"]q"]O"]-"] "]i"]G"]%"]"]a"]?"]"]{"]Y"]7"]"]s"]Q"]/"] "]k"]I"]'"]"]c"*AU]l"]J"]("]"]d"]B"] "]~"]\"]:"]"]v"]T"]2"]"]n"]L"]*"]"]f"]D"]""]"]^"]<"]"]x"]V"]4"]"]p"]N"],"] "]h"]F"]$"]"]`"]>"]"]z"]X"]6"]"]r"]P"]."] "]j"]H"]&"]"]b"]@"]"]|"]Z"]8"]"]t"]R"]0"]"]l"]J"]("]"]d"]B"] "]~"]\"]:"]"]v"]T"]2"]"]n"]L"#*a]c"]A"-R]M"K+w0zq2STZ[_n`b co!d"p#fyuz$|%v& '*wPU,V-Z a e jVqW^b.c2kvz~g0 1 &uq 3x4ya;`{ 2 a;¡ 2_]S"]1"]"]m"]K"])"]"]e"]C"]!"]"]]"];"]"]w"]U"]3"]"]o"]M"]+"] "]g"]E"]#"]"]_"]="]"]y"]W"]5"]"]q"]O"]-"] "]i"]G"]%"]"]a"]?"]"]{"]Y"]7"]"]s"]Q"]/"] "]k"]I"]'"]"]c"*Amanuskript-0.10.0/libs/pdf.js/web/cmaps/CNS-EUC-V.bcmap000066400000000000000000000036001354442177200222360ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE]"]"]] P` ^Ps cN o|~~  "c"AO9e"-R]M"K+w0zs2STZ[_n`b co!d"p#fyuz$|%v& '*wPU,V-Z a e jVsW^b.c2kvz~g0 1 &us 3x4ya;`{ 2 c ¡ 2_]S"]1"]"]m"]K"])"]"]e"]C"]!"]"]]"];"]"]w"]U"]3"]"]o"]M"]+"] "]g"]E"]#"]"]_"]="]"]y"]W"]5"]"]q"]O"]-"] "]i"]G"]%"]"]a"]?"]"]{"]Y"]7"]"]s"]Q"]/"] "]k"]I"]'"]"]c"*AU]l"]J"]("]"]d"]B"] "]~"]\"]:"]"]v"]T"]2"]"]n"]L"]*"]"]f"]D"]""]"]^"]<"]"]x"]V"]4"]"]p"]N"],"] "]h"]F"]$"]"]`"]>"]"]z"]X"]6"]"]r"]P"]."] "]j"]H"]&"]"]b"]@"]"]|"]Z"]8"]"]t"]R"]0"]"]l"]J"]("]"]d"]B"] "]~"]\"]:"]"]v"]T"]2"]"]n"]L"#*q cN o|~~  "a"AO9e"-R]M"K+w0zq2STZ[_n`b co!d"p#fyuz$|%v& '*wPU,V-Z a e jVqW^b.c2kvz~g0 1 &uq 3x4ya;`{ 2 a;¡ 2_]S"]1"]"]m"]K"])"]"]e"]C"]!"]"]]"];"]"]w"]U"]3"]"]o"]M"]+"] "]g"]E"]#"]"]_"]="]"]y"]W"]5"]"]q"]O"]-"] "]i"]G"]%"]"]a"]?"]"]{"]Y"]7"]"]s"]Q"]/"] "]k"]I"]'"]"]c"*Amanuskript-0.10.0/libs/pdf.js/web/cmaps/CNS1-H.bcmap000066400000000000000000000013021354442177200216640ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE!!]a!!]c"]A"-R]M"K+w0zq2'!STZ[_n`b co!d"p#fyuz$|%v& '*wPU,V-Z a e jVq(!W^b.c2kvz~g0 1 &uq )!3x4ya;`{ 2 a;B! 2_]S"]1"]"]m"]K"])"]"]e"]C"]!"]"]]"];"]"]w"]U"]3"]"]o"]M"]+"] "]g"]E"]#"]"]_"]="]"]y"]W"]5"]"]q"]O"]-"] "]i"]G"]%"]"]a"]?"]"]{"]Y"]7"]"]s"]Q"]/"] "]k"]I"]'"]"]c"*Amanuskript-0.10.0/libs/pdf.js/web/cmaps/CNS1-V.bcmap000066400000000000000000000002171354442177200217060ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSECNS1-Ha !,N|~ hOmanuskript-0.10.0/libs/pdf.js/web/cmaps/CNS2-H.bcmap000066400000000000000000000007701354442177200216750ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE!!]aR!!]l"]J"]("]"]d"]B"] "]~"]\"]:"]"]v"]T"]2"]"]n"]L"]*"]"]f"]D"]""]"]^"]<"]"]x"]V"]4"]"]p"]N"],"] "]h"]F"]$"]"]`"]>"]"]z"]X"]6"]"]r"]P"]."] "]j"]H"]&"]"]b"]@"]"]|"]Z"]8"]"]t"]R"]0"]"]l"]J"]("]"]d"]B"] "]~"]\"]:"]"]v"]T"]2"]"]n"]L"#*manuskript-0.10.0/libs/pdf.js/web/cmaps/CNS2-V.bcmap000066400000000000000000000001351354442177200217060ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSECNS2-Hmanuskript-0.10.0/libs/pdf.js/web/cmaps/ETHK-B5-H.bcmap000066400000000000000000000105121354442177200221620ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@> A~!2 A iUA*twss,2}npn$UBWAohyM+PmxH1A C6qST m Atsrsts EY X wvqpon) EDCBSX~  !V;yBxwc8!o78xy( 2 6`J<$ * a6c b3W2Y^ +,"%{cbZ uA"Z2Q f}7 6i/2o( Q J>?]edA_sdMm~uK VaEh;8GAx%e\W\tAYw"rM "x mo8^8<@':E (MT15P}jmFA h$'XqNoslS-HdWdR%AvP8J){((vtLGl$ $jtM||L-j`XVAfEqp [q8KAra F ) 'U  3  J "   T    &#6-DH + "+ (>A*`j&0rde#A)ҁMCHI ?/ . iv&oz - {+_:-SZ ?Vu{3A Áq  FZ^=dc<" /"uR$$   H  ,  O E6 )F %  G'D F  & |\a14 | V Z xz ` ^aZc!"T"yA>"]?A>"\w>S"]A>p"]/A> "]LA>*"]iA>G"]A>d"]#A>"]@A>"]]A>;"\zB>W"]A>t"]3A>".P.A>/"]nA>L"] A>i"](A>"]EA>#"]bA>@"]A>]"]A>z"]9A>"]VA>4"]sA>Q"]A>n"&-6UA> "]KA>)"]hAF+X"]A>b"]!A>"]>A>" [SfA>:")y2#A Vx"C0At' "]2A>"]OA>-"zh l v"+-HwA> "UHA>%"]dA>B"]A>_"]A>|"];A>"]XA>6"]uA>S"]A>p"]/A> "]LA>*"]iA>G"]A>d"*#1OA9;"]?A>"]\A>:"]yA>W"=UA>t"3W:A>"]QA>/"ZnIA>K"] A>h"]'A>"]DA>""]aA>?"]~A>\"]A>y"]8A>"]UA>3"]rA>P"]A>m",[/A5 B"]KA>)"]hAF#b"O VA>c"<"_A>">THA>"I\&A>9"]xAV'l")2>A"q"]0A'6"!L;oA4+ a"]kA%Ip" FeA>g"]&A"'"]BA> "]_A>="]|A6Z"" >Ja%W  #' ,:@'GORX aot~[ o+"0VY_d#fkpy} (18A@Y^g lw"| ! &3"]FA$(*TH_cNUc/#%+4 =AIMQSCUX]emsw{$~ !$ '14 6RFWPU\^bej!mA14:(?AFHLPRTZ]_uwzE# *"8LQU`h lw B  #1:DG$KO lv{ r/{3:A>Y"]A>v"25(hA +2"JTgo(A( 1<W"gj $8>A CMQScmt"} ' =G JAW`"-&0 X fAr!)"/18 kxa:@%;">`I(a" 47<,?"l s v  #1WB ERD\ beint" _|B!!C"_d PXCr)+03:>"@D F R5^lo/eN/QSU"Y [f n s}  D '+29>AGI(RY\_bqsxz  A  &28>F#NQT[bktz A' .<>*BEGI N VX\ adhLmrz. "D#')0C#G MOSXZ] ` hkr0y }  R~07 :UF%- *FR ] _manuskript-0.10.0/libs/pdf.js/web/cmaps/ETHK-B5-V.bcmap000066400000000000000000000002361354442177200222020ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE ETHK-B5-Ha] aKN/1Oamanuskript-0.10.0/libs/pdf.js/web/cmaps/ETen-B5-H.bcmap000066400000000000000000000021451354442177200222650ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@> P` ^Pa}@c/!"T"xwyA>"]?A>"\w>S"]A>p"]/A> "]LA>*"]iA>G"]A>d"]#A>"]@A>"]]A>;"\zA>W"]A>t"]3A>".P.A>/"]nA>L"] A>i"](A>"]EA>#"]bA>@"]A>]"]A>z"]9A>"]VA>4"]sA>Q"]A>n"&-6UA> "]KA>)"]hAFT+X"]A>b"]!A>"]>A>" [SfA>:")ye2#A Vx"/.C0Atw' "]2A>"]OA>-"z3:A>Y"]A>v"25l lt v"+-HwA> "UHvA>%"]dA>B"]A>_"]A>|"];A>"]XA>6"]uA>S"]A>p"]/A> "]LA>*"]iA>G"]A>d"*#T1OA99;"]?A>"]\A>:"]yA>W"=NUA>t"3W:A>"]QA>/"ZnIA>K"] A>h"]'A>"]DA>""]aA>?"]~A>\"]A>y"]8A>"]UA>3"]rA>P"]A>m",[/A5 B"]KA>)"]hAF#b"O. VA>c"<"A_A>">THA>"I\&A>9"]xAVG'l")a2>A"q`"]0A'o6"!L;oA4+ a"]kA%Ip" nFeA>g"]&A"d'"]BA> "]_A>="]|A6Z""=I >J(hmanuskript-0.10.0/libs/pdf.js/web/cmaps/ETen-B5-V.bcmap000066400000000000000000000002361354442177200223020ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE ETen-B5-Ha] aKN/1Oamanuskript-0.10.0/libs/pdf.js/web/cmaps/ETenms-B5-H.bcmap000066400000000000000000000001451354442177200226230ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE ETen-B5-H` ^manuskript-0.10.0/libs/pdf.js/web/cmaps/ETenms-B5-V.bcmap000066400000000000000000000002541354442177200226420ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE ETenms-B5-HAKNC }ha ] " ?manuskript-0.10.0/libs/pdf.js/web/cmaps/EUC-H.bcmap000066400000000000000000000011021354442177200215720ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE?A] g` ^ga?FA]y" W em t 1 0&RJ-U*s H # DQ 7 w WE$$aF]e"]C"]!"]"]]"];"]"]w"]U"]3"]"]o"]M"]+"] "]g"]E"]#"]"]_"]="]"]y"]W"]5"]"]q"]O"]-"] "]i"2GM]z"]X"]6"]"]r"]P"]."] "]j"]H"]&"]"]b"]@"]"]|"]Z"]8"]"]t"]R"]0"]"]l"]J"]("]"]d"]B"] "]~"]\"]:"]"]v"]T"2\manuskript-0.10.0/libs/pdf.js/web/cmaps/EUC-V.bcmap000066400000000000000000000002521354442177200216150ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEEUC-HaO Q SV[Am?2amanuskript-0.10.0/libs/pdf.js/web/cmaps/Ext-H.bcmap000066400000000000000000000047501354442177200217320ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE!!]a!!GyB" W 0&RJ-U*s H # D/>h(">G"P&' wqzya!i6:K71! 8HOa-_q 0!eQg"xR1S3T8UAq 1!CV MWXX\Y`['e\q 2!!]I^4+_a`{a~q3!ba!(cDdJeR1UfYq 4! ]grh i"a5! ;jFk=[q6!lm#2?nHofpmqtrvq7!ws{t uv%w)x, 2y ;zH{P|a8!U} i~ JU]o a:!1D X eq ;!ov y { Dq !   (>HMq ?!g-q ' 0q @!E!G""g# $&qA!#(n+)<*O+R,b-lqB!./ .0=1 D2P3W5^qC!_6f7i9 m;1|</=4>;q D!=? Z@eAgBjC l5"xqE!DE"F)G1H:ICJFKM_ RM_Pi6nNsqF!yOPQ.S5U:V@X CmOq G!WY`Zp[\ ] ^$q H!5_9`Ca"Eb icwd qI!e g;#h%i (j 3kAl,Dq J!!qmn o+pJq K!OqQr Xsz3t/(qL!+-u Zvfwlxo5yz {q M! |};~?4 ETa N!)i-D#HX]`M4z''0aO6waNK.%q Q!Xu 0aR!]6q S! $ . D R_aYx'aT!"rw6"P$m".N0 "] "jYn">H   "&?0Sa TDx%>O1; Lq [!#) ."<OhQ Xa^9m;a\!]b"]@"7#Ns"Q| O"Z7`0" 8CLIa^P"28 54!"q b! $;!n^Q`%eac!(t&'(T2q d!R( k\x)* ae!0+I, K-7V"$.74"Bl/0051 >"J2^37e4 q i!(u * 65D #bq j! 6 70#8Uq k!d9)v!:*;:alM*al!+Bo  ", Nln"~&5"C\!a li< =Y>?@:ABC Dq p!:EMF _GkHq1Iaq!]q r! vJ KwL$$) Ja|{oaz6Ia s!/TM*N1"]'"G"]b"M@ Emanuskript-0.10.0/libs/pdf.js/web/cmaps/Ext-RKSJ-H.bcmap000066400000000000000000000047561354442177200225070ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@<?@< g` ^ga@>y8"B" 0RJN>\s i #DS.>h(>GC>&e' wqzya6K7R! 8HOa~q eQg"xR1S3T8UAq @CV MWXX\Y`[eq \]I^4+_a`{a~a@ba!(q>cDdJeR1Uf$Ygrh i"a@ ;jFk[qzlm#2?nHofpmqtrvq@ws{t uv%w)x, 2q 6y ;zH{P|U} i~ JU]oq r6 D X eq @ov y { %q 5. e ) v a@ + 6(Aq jx~  (>HMa@g-q q' 0!G""g# $&q @#(n+)<*O+R,qb-0l./ .0=1 D2P3W5^q @_6f7i9 m;!|q</=4>;? Z@eAgBjC l5"xq@DE"F)G1H:ICJFKM_RqZM_Pi6nN"sOPQ.S5U:V@X CmOa@WY`Zp[q\ ] ^$_9`Ca"Eb icwd q@e g;#h%i (j 3kAl Dq @Rmn o+pJa@OqQr Xszq 3t/0(u Zvfwlxo5yz {q @ |};~?4Ea J>T-DDHX]`,4z''0aUwa?.Fq @Xu a|q @ $ . D Rawa S5_6CP!mN0 C> !KYnC>Ha6&O1q   ' ?0Saa@#) ."< COhQgXC>@6m7#Nsad!9`?Fa@>|q ;O7` 50a@ 8!C"-Iq (w$;!n^Q`%ea@(t&'(T2q 63( k\x)* a @0+I, K-VCo.74C>lq +/0051>2^37e4 q @(u * 65D bq !g 6 70#8Ua@d9)v!q #:*;3:*o< = a@, >Nq _?l@nABC&5a@>\qD*!EMF _GkHq1Ia@>q *WJ KwL$$) JaoaIa @/TM N1!>'3fGC>bl! Emanuskript-0.10.0/libs/pdf.js/web/cmaps/Ext-RKSJ-V.bcmap000066400000000000000000000003321354442177200225070ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE Ext-RKSJ-Ha AOLRPOSVYTWV[AMrAS aHmanuskript-0.10.0/libs/pdf.js/web/cmaps/Ext-V.bcmap000066400000000000000000000003271354442177200217440ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEExt-Ha !"OLRPOSVYTWV[A!kM@rA2a%uImanuskript-0.10.0/libs/pdf.js/web/cmaps/GB-EUC-H.bcmap000066400000000000000000000010451354442177200220660ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE] $` $].aX]`21> p z$]"Rd-U7* 4%+ Z {/%<9Kb1]." `],"] "]h"]F"]$"]"]`"]>"]"]z"]X"]6"]"]r"]P"]."] "]j"]H"]&"]"]b"]@"]"]|"]Z"]8"]"]t"]R"]0"]"]l"]J"]("]"]d"]B"] "X~']W"]5"]"]q"]O"]-"] "]i"]G"]%"]"]a"]?"]"]{"]Y"]7"]"]s"]Q"]/"] "]k"]I"]'"]"]c"]A"]"]}"]["]9manuskript-0.10.0/libs/pdf.js/web/cmaps/GB-EUC-V.bcmap000066400000000000000000000002631354442177200221050ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEGB-EUC-Ha?>VW F>"BD= @CXTUmanuskript-0.10.0/libs/pdf.js/web/cmaps/GB-H.bcmap000066400000000000000000000010201354442177200214450ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE!!]aX!!]`21> p z$]"Rd-U7* 4%+ Z {/%<9Kb1]." `],"] "]h"]F"]$"]"]`"]>"]"]z"]X"]6"]"]r"]P"]."] "]j"]H"]&"]"]b"]@"]"]|"]Z"]8"]"]t"]R"]0"]"]l"]J"]("]"]d"]B"] "X~']W"]5"]"]q"]O"]-"] "]i"]G"]%"]"]a"]?"]"]{"]Y"]7"]"]s"]Q"]/"] "]k"]I"]'"]"]c"]A"]"]}"]["]9manuskript-0.10.0/libs/pdf.js/web/cmaps/GB-V.bcmap000066400000000000000000000002571354442177200214760ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEGB-Ha!"?>VW F>"BD= @CXTUmanuskript-0.10.0/libs/pdf.js/web/cmaps/GBK-EUC-H.bcmap000066400000000000000000000345441354442177200222130ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@> $` $].a @8XYqer] q @ %53LDIbKq L N\Z!neM' >(0.4Kl89q@<h=T@9BXE_KBNT,S ZejOkldqmVrPNtvv|1 RWUQe %+)OUq @]YmH cq& +%J(O1O6:4I5u7> RM_)`fa'b2 d#psu uq @E^FoP$q<ACdFyLOBPZY"Kha@ 4m>GGlZqpIp' 7^8*9, ;X@EoH!NySr Xq@jb|e0iztjwlLsxOhuqviwt|opq4vst5[rn7"u&+ .k99:?}uBC{~LJ[Lj NO!S=opa@FHt~v7wq9/*i z%, . 8sq@ %c90+1-25'=/ >}KV NBXq# Z2 e_ryvY}]~g m&)R;('+.I"8$ .Ma@2R 74 q  * 'Dlqmo~ q@  3< i(U- .q$<CV)Yw]'_c drvDw2~s`q @+x.v1=ECxIqcuiu jnv0wz{|~E! &|%0a@>Vq4~2cM;R9U(=j5z:|3q@ b ^]7/_2NR<!k "2,?3<>6q8.<{D G1HDK N^#6 [ ^i`l8oxQ п~[0[Z={q }a#$ s0 a@>q 5\Q)]* - Z7 q @T dXp[6q [`+a2@ 3?_B^DjEMU_\,T_c@beQ `)L,:02C@wAtJ] Lq@Xh[\r|5x  q-!8%4n:{q;pBiCDoJN PuXt]}ayc~fz mq@ wc - KSY$3(q/\7:> C EG[J/$P@umzA}JgBa@>P]\ .[!8q @Z^mDbrTs fqc] /k<5Z&^ct=xA yKq@$ H` w:1#A)8-v/27J8q- 9>C4EWHOalVjZc^& blesdubx^|D ~6) +% vmq!@ %P'/Z0S1id7U9f:_=OAYCElkFXnKqMRmSz\Vh `j mfoos Xwg p z$]"Rd-U7* 4%+ Z {/%<9Kbaa )>3r* "#Bq @ 6=!&5HIL?*Nq QRkl"m].q @dn+p9q_Ar0ta aF@*` \]%ja %F)L v  q @ a)[=b?T E_ Pq Zl\]`ccdha@w% pq 4B8N=1 E a@#PFt. q   2+ 3$(&q @'/(1 ),3N7Q WPKd 1q `4/e7<iC%SaT@kl],q @ sn~=2C+a-D] q @Mo$Nnstx ~a]h"]Fap  (+,(ieza  &+) Ucknoq @Hdfwk'1la9k<cAj J]$q @WX' afkglnhraf\+]q @."@]BE[8!Fa h]`q@ w $i+*[:a@}A]>q@_ bmc9ijl$at8`ubvA a]"]zaGMAd!3oa3CSlo q@$hc"$f*g3A |1},5 +/hd!|J-Tq Q!3(/).+0[,X1B4]ra@99<6=9@Q QEbKfCddqZG_82tJ1K5O;Q73ST^X4Y= l]Pq@& mNFKDy'L}GIHB n J\Q v;( LK q:mRQ U& 'T+].q'@{.@1&a7 VYX8.:?zMWASI J_KnL$pO:PZQSaUbpq] q@tj, bqrr$&a,. A]jq @ L`ZBpAq(a€ Q “oN+OX/a¡]H"]&a y8U7RGya!6 WZ^tq@y#EI w*%,qĀ01-H(@DEEJF]q@JpNFO]^S, Xad;YKIgaŀao]bq @p x"" =6 Kaƀ W]@q @%x+?&},30aǀ 3]q @TM U4bqd wI~ q Ȁ F G!#b&]|q @)MH8`UEV\aɀc5 r<}]Zq@ oQ 8 B*O-=1D14Kq ʀ5;6P=4&AKCUJ]8q@P>StT0UXZZJbg h?rtCq ˀ YT2]q@&W XBS'; *Z6V97<y DSOaRq ̀ SaIfBghm]ta͡]Ra͐ZWN. 2a@>p/?F&N u q ΀  \l$&&]0q@ (`6{<^>aAUPkV[W YY\q π^_)Vf]_nowX]q@ x)[v ?  -aЀ .]lq @Oqd gX,n'vaрa;%]Jq@>'])= 2*@<:F?IMkNP-Rq Ҁ [e2hk6m8n:](q@v<zd}9~=>?R} ;- $ %&aӀ(_K -Q Ӌwp ! 'q Ӕ4j6bK7x8b:r]q%@;P<S?e@rDF]ITKgLOfThXd^j_k`i=ajc=eaԀgvgi7kQ Ԋ, wvt?nL}aԗppunw]dq@xmlb{~~y/6wQ Z= f$K OpUqe GE\uFaՀ4Q ՄilGFon]\QPQ+q Ր%`(~G+ ,u/]Bq@0 S14 5_7 8QR}08~gf! _l]LLab?WBEFQ ou5(s|[NkayLOqրQ T Vc[:`xd] q@knkrx0hyD z U J@Sq׀I!mx${%*+X~a@ 4HA}*Fq؀q; Y$:epd0a]WQ@K83 NB=k|l:!mH?9+*6+qQa]2Q4Ql3JutOti; %Vaz5xqـTs%)7( G*.1/f1[D2]5q @3*14=9\#=azdaڡ]"]qaڅnxQ0 } ,a ڀkpx *AGK Q]ejQ O|aj`MLa q Xuz~#pq܀{g6V` ! '*]Oq @.4:?@1DEFXGN fO&YTq݀X;Y:[[p_ b;fhp7jRl3]-q@E!m(o|0r" wF 0KJ* aހ{ /r;] q@~< =; GSU>&VlY>ZJ[3_eA wO$10~m=q ߁jqlFmcsp]iq@ 3 " -G/<78Q9q>;EJ-+KLMO]Gq @X! ZU{ ~ $ qXzy4sxwHvE{#]%q!@$z%m &}1y2~M38:=]%@Az&CUKOqPVW 1Y  [4]]q"@acfVi lSmzNoqUt w|*- 2 {q /,( /<5! &"]aq'@4*1#%&M+Z,r>-O1C2W3<4)7!9 ;?EDF#:EI=qJAK <;8M@QMRUKYGO]]?q)@^0dFeLgR0IiQJlRm8pyq+sM%uLwmy7zJ8N|Tq<UV hVWSH]q@\Y!U%}(~+|.Z/^14 3^=`>"TGA怾Aycy R+@A{IqM OePaRbXl[m ^_j]{q@`nc9\ghkojDgk[l o+{q|w}"3 q*6soxpuA]]Yq@$z'w(*$+{.#2y7f8=| >I}KrLtRqNTFUYvZd?^\]7q @ muy}?@Q ]E~[V }vq i i Cyk5 qGIFOKs!wONJM"P%l'A(nQ]q@x)S,RT/,4U5q7E$9q^aci~MjnY]sq@w2xR{y }W? =% VDW "a'P,C0]Qq@F(L [ ^_2 b oCva~# ]/q@$^5]:<_> }?@EeJgLfMaRQI25>t5 |S/.Ca] q @GA /\h?4kInHrtKu}{~}LC9ZsaqMNvKQ@P R"*#rS&]kq@>TD(Os)/L45x6N8O=8DPEQ FtPR~SqUW!XqY["\K65c-gSh]Iq"@j#kgl$dn8r%tvCx.~& 5'(u)q+k,jyfgl - #]'q@-mB?Ai BW N%J\]A~Q 4]\98=+e;dA9aBJVZ\]q@` e! f"p'9%q)x.+ z*-(9 q608 7E&:'C]}q@+@,=A/>0?@2;3B7D:9BLCGKKINHPJQq XM]4_Q`PRbOeQ 26(#"ihon+a][q@lTnXtUMv[~ZY./F&\ , #1a ]9q@=?B\D JKZn [fCklmqop}ros yG q@ P` (6)+v-q <ABKOPq@XZ]LbDf` lopl q". #q  % $&'")q@#(,4!*89R{U tVaW gqrwtq@uy}Z A3j  i"$a*-s3q@IFk[S^_ce0gqhjmnrswqx73"m4S a@Y= Nmanuskript-0.10.0/libs/pdf.js/web/cmaps/GBK-EUC-V.bcmap000066400000000000000000000002641354442177200222210ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE GBK-EUC-Ha?>VW F>"BD= @CXTUmanuskript-0.10.0/libs/pdf.js/web/cmaps/GBK2K-H.bcmap000066400000000000000000000463161354442177200217760ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE00 @> C 06R:x]@r- S 90&]a l IZS 90o-:*+& S 90;)VC9 5;pS 900z g`}<1S 90- u/6(a6S 90n#UXKpDm;S 90@M${ I$S 90=|j=z!S 90if%: H~]NS 90EZhMM<;@S 90"c:jMS 90\kbr7&%S 90C9c>|}S 90dzeKqZ$ }S 90}9S8tTml5S 90{_U`i(F}3fS 90}vU4 DS 90qUFB8S 90Z"Fkw5d;VQS 90qCj{qgnXC900C91F`C90W"~A>yY .fTk.,miz< Gn"_6 ^1h?+E_V7<s;$SL %|y_)   1 t=| Y~,-Y \K  &<c j~LyaI c6xI\ `%F_ON /@ `;(Sb Q MH-!'L(K[i )N#b.K" WVS0  5$ozI e  eB "ElsR? >  StT^*]N e0 )^ '2>y M</PXyK\oL <{Qdj]_cT0'  - 0?S0 C.zd_7'L}CDSmQyd%x 4k`( A, G; 'Vx]C5!:|m%$e>XeLjqt&d!x $Ib Dnm7bJ#(J# 2IyR# g6@!N[ m$ oAU_eA S;in',X-?S A~Kc6 E8ZA4/TzbCvA7|`4*B $@K rH~,xb.AzDl.R4nLsX$=j$Bd(HAL/JQ п~[0[Z={Aa}cC@k!gQb OKHC _|i. g1fnBAA]0V"Q `C g6" Ew4Mc= XS T"f 9L[\7 k = w4l    g` B k<; MCtN[| b7& $ =ALA m'l C`m< $,|RA [r `0-JLT A nc62V\"(D#AAのQQ WPKd 1A;b/y h1YcsZ_`,V(kJEe #vK+ W |VM?rQ apCByxEDyQ mH$A@~# &Ax4*Q # '&/9sPAs z#$ rR  pv>tem=N-'lWA&& 4 A Dw " 4 Q QEbKfCddA/]_0 }1(Y^  v?*id-3 ynu^X 9< -an;H {n )W ]A@&A aJ @2Q v;( LK A:6g'7 T PFVAHcjUwS+} jdO8.`AR &)8  gH+-!nBS~oaA &7 "#>D@<*Q “oN+OX/A  y87xL--?<fYtJ)+Xe h2E,Q l%!^R&sYjEM L2z}t ic1T QHg 8 9(c.; L% '2!(9bH(/v-^sj n c" :!`- 1 < ?} 2efJI )er6(!:.u. 4@ 10![i&:%vg8Z/I"b2%%T!3)AÄGG= ) P# AŜo$W`4e| DMnF     ?nt?jc w! VEAĀ0&)W"A@TR[l <C:$>j`h&jHs 0ML2o '>22Q Ӌwp ! 'Aӛx-&`C1)AӖjn/L E( z$KF uYX[p\?A ӗ6 $Q Ԋ, wvt?nL}AFb6AԜp#mAԠw/Q Z= f$K OpUAn\O_AhGvSNAmQ ՄilGFon]\QPQ+AՓ`33.A Ք/ o^A՚+ QR}08~gf! _l]LLAeWTiQ ou5(s|[NkA+|  aSz)WPIH[I &j[ F{:5<gg*+kfi`AׇAQx7T {, Q@K83 NB=k|l:!mH?9+*6+qQAc2/AQl3JutOti; %VA|3I<j@z-P_ ([Q $J Z56A }5*K u ,Aٜ1 Q O|aj`MLa A'f# kVc> =7, QL 8=@WiPs "DYUr!X%>, iK =.+1N:]/_$XM=6W8E+ W X3h> -5b * ! xQlxIYnw$N>{gWV# > i/Ux3&s(zE fG^ /QG7 _` mk2.-^5b Lf n yO $%.  J R b sNG3c(/JPs#)` V !tOw4C3 :N>EQ %g  z;Hm AOR!{HA xy":H &s1WohgAv 2=h0 i >QI25>t5 |S/.CA:AAo7XD 2#jO0%((=q"u\gn X '+|5#^9^g&=P+ ~ ?(}F %7A(@G " AU  mDC3 ru`2  AVt ( *  ".DFB 4Q 4]\98=C0G[HNE;GH Av#se gASAW~,T\ bj0F>"cj!8!:OTh| !i` ^c!88v v(x 1v ;v Ev Ov Yv cv mv wy{~|{v vx v v v v *v 4v >v Hv Rv \v fv pv zv v v a@8Xe cx00 "v ,v 6v @v Jv Tv ^v hv rv |v v v v $v .v 8v Bv Lv Vv `v jv tv ~v v v v &v 0v :v Dv Nv Xv bv lv vv v v v v (v 2v v Hv Rv \v fv pv zv v v v "v ,v 6v @v Jv Tv ^v hv rv |v v v v $v .v 8v Bv Lv Vv `v jv tv ~v v v v &v 0v :v Dv Nv Xv bv lv vv v v v v (v 2v v Hv Rv \v fv pv zv v v v "v ,v 6v @v Jv Tv ^v hv rv |v v v v $v .v 8v Bv Lv Vv `v jv tv ~v v v v &v 0v :v Dv Nv Xv bv lv vv v v v v (v 2v v Hv Rv \v fv pv zv v v v "v ,v 6v @v Jv Tv ^v hv rv |v v v v $v .v 8v Bv Lv Vv `v jv tv ~v v v v &v 0v :v Dv Nv Xv bv lv vv v v v v (v 2v v Hv Rv \v fv pv zv v v v "v ,v 6v @v Jv Tv ^v hv rv |v v v v $v .v 8v Bv Lv Vv `v jv tv ~v v v v &v 0v :v Dv Nv Xv bv lv vv v v v v (v 2v v Hv Rv \v fv pv zv v v v "v ,v 6v @v Jv Tv ^v hv rv |v v v v $v .v 8v Bv Lv Vv `v jv tv ~v v v v &v 0v :v Dv Nv Xv bv lv vv v v v v (v 2v v Hv Rv \v fv pv zv v v v "v ,v 6v @v Jv Tv ^v hv rv |v v v v $v .v 8v Bv Lv Vv `v jv tv ~v v v v &v 0v :v Dv Nv Xv bv lv vv v v v v (v 2v v Hv Rv \v fv pv zv v v v "v ,v 6v @v Jv Tv ^v hv rv |v v v v $v .v 8v Bv Lv Vv `v jv tv ~v v v v &v 0v :v Dv Nv Xv bv lv vv v v v v (v 2v v Hv Rv \v fv pv zv v v v "v ,v 6v @v Jv Tv ^v hv rv |v v v v $v .v 8v Bv Lv Vv `v jv tv ~v v v v &v 0v :v Dv Nv Xv bv lv vv v v v v (v 2v v Hv Rv \v fv pv zv v v v "v ,v 6v @v Jv Tv ^v hv rv |v v v v $v .v 8v Bv Lv Vv `v jv tv ~v v v v &v 0v :v Dv Nv Xv bv lv vv v v v v (v 2v v Hv Rv \v fv pvzzv v v #v -v 7v Av Kv Uv _v iv sv }v v v v %v /v 9v Cv Mv Wv av kv uv v v v v 'v 1v ;v Ev Ov Yv cv mv wv v v v v )v 3v =v Gv Qv [v ev ov yv v v v !v +v 5v ?v Iv Sv ]v gv qv {v v v v #v -v 7v Av Kv Uv _v iv sv }v v v v %v /v 9v Cv Mv Wv av kv uv v v v v 'v 1v ;v Ev Ov Yv cv mv wv v v v v )v 3v =v Gv Qv [v ev ov yv v yv v (v 2v  p z$]"Rd-U7* 4%+ Z {/%<9Kb1]." `],"] "]h"]F"]$"]"]`"]>"]"]z"]X"]6"]"]r"]P"]."] "]j"]H"]&"]"]b"]@"]"]|"]Z"]8"]"]t"]R"]0"]"]l"]J"]("]"]d"]B"] "X~']W"]5"]"]q"]O"]-"] "]i"]G"]%"]"]a"]?"]"]{"]Y"]7"]"]s"]Q"]/"] "]k"]I"]'"]"]c"]A"]"]}"]["]9aNyax)ava A/4sU6O-hIA8LaN;'a )>3r* #Ba @ %3DIL NZ!n(049C=@BEKNT Ze mrtv|  +)UA]m  %(157 Rb dps uA$<CFLPYKhA 4>GZp'9 ;EHNS XBbejlsw|"&+ .:?CJLOSpCt7w9/iz  A %25 >K NX Z erv~ "$ V2MRUjz|A   ",368<DHK N [ilox }  A>5\* -7BT dp + 3?BEMU\_ce kmqBtx  #;M V alsA1 CORl ',5;B@$V{~}a @&|#(8NSX-s!)A058 = _kt  ),02AJ LAX\|  %4;DJNPX]acf mA w  $(/7:>CEGJ$Puz}A>P] .!8AZms  /<Z^t yB  #)-/2 9CEHOVZ^ blsux| ~ C %'17:=ACFKMS\ `jmoswp/?F&N u  $& (6<>APWY\_fn" x   .Odgn% ') 2@FINPR [ehkn vz~ &(- 48$<@DFILOTXacegik pu!x{~   %(,%158?BF LOQTV[`dknr z  !%+ 4A*FqC%*/(49#=adkpx *AGK Q]ej uz~!'* .4:@GOTY[_bfhj$mor w   /$ = GV[_e jmp  "-/9>EMOX Z{ ~  & &38:=ACKPWY[] acfimoqtw|  )#&-479 ;F KMRUY#^egimqsuwz "!%(+/1 3>G MPRX[^!`cg l o}  $(+.28 >ILRUZ\ my   "%&),/57$9^acjn"x{ } "',0FL[_ bov~ $5:<?EJMR4hknru{} #&%)/68= FPSUY\ch$lnrtvx~   #-? B N] cmpx~#(.25;!=@CGWj o{  &+;BVZ\` fqx z '",037:CKNQX]`be*lntv   =?BDK [fmps y  )+-<BKPXZ]bfl q  #,49RW gr!uy}  "$*-3I[_cehjnsx$= Nmanuskript-0.10.0/libs/pdf.js/web/cmaps/GBK2K-V.bcmap000066400000000000000000000003331354442177200220010ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEGBK2K-Ha ?>VW F>"BD= @AC( A AW2  qmanuskript-0.10.0/libs/pdf.js/web/cmaps/GBKp-EUC-H.bcmap000066400000000000000000000345361354442177200223740ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@> ` ^a @8XYqer] q @ %53LDIbKq L N\Z!neM' >(0.4Kl89q@<h=T@9BXE_KBNT,S ZejOkldqmVrPNtvv|1 RWUQe %+)OUq @]YmH cq& +%J(O1O6:4I5u7> RM_)`fa'b2 d#psu uq @E^FoP$q<ACdFyLOBPZY"Kha@ 4m>GGlZqpIp' 7^8*9, ;X@EoH!NySr Xq@jb|e0iztjwlLsxOhuqviwt|opq4vst5[rn7"u&+ .k99:?}uBC{~LJ[Lj NO!S=opa@FHt~v7wq9/*i z%, . 8sq@ %c90+1-25'=/ >}KV NBXq# Z2 e_ryvY}]~g m&)R;('+.I"8$ .Ma@2R 74 q  * 'Dlqmo~ q@  3< i(U- .q$<CV)Yw]'_c drvDw2~s`q @+x.v1=ECxIqcuiu jnv0wz{|~E! &|%0a@>Vq4~2cM;R9U(=j5z:|3q@ b ^]7/_2NR<!k "2,?3<>6q8.<{D G1HDK N^#6 [ ^i`l8oxQ п~[0[Z={q }a#$ s0 a@>q 5\Q)]* - Z7 q @T dXp[6q [`+a2@ 3?_B^DjEMU_\,T_c@beQ `)L,:02C@wAtJ] Lq@Xh[\r|5x  q-!8%4n:{q;pBiCDoJN PuXt]}ayc~fz mq@ wc - KSY$3(q/\7:> C EG[J/$P@umzA}JgBa@>P]\ .[!8q @Z^mDbrTs fqc] /k<5Z&^ct=xA yKq@$ H` w:1#A)8-v/27J8q- 9>C4EWHOalVjZc^& blesdubx^|D ~6) +% vmq!@ %P'/Z0S1id7U9f:_=OAYCElkFXnKqMRmSz\Vh `j mfoos Xwg p z$]"Rd-U7* 4%+ Z {/%<9Kbaa )>3r* "#Bq @ 6=!&5HIL?*Nq QRkl"m].q @dn+p9q_Ar0ta aF@*` \]%ja %F)L v  q @ a)[=b?T E_ Pq Zl\]`ccdha@w% pq 4B8N=1 E a@#PFt. q   2+ 3$(&q @'/(1 ),3N7Q WPKd 1q `4/e7<iC%SaT@kl],q @ sn~=2C+a-D] q @Mo$Nnstx ~a]h"]Fap  (+,(ieza  &+) Ucknoq @Hdfwk'1la9k<cAj J]$q @WX' afkglnhraf\+]q @."@]BE[8!Fa h]`q@ w $i+*[:a@}A]>q@_ bmc9ijl$at8`ubvA a]"]zaGMAd!3oa3CSlo q@$hc"$f*g3A |1},5 +/hd!|J-Tq Q!3(/).+0[,X1B4]ra@99<6=9@Q QEbKfCddqZG_82tJ1K5O;Q73ST^X4Y= l]Pq@& mNFKDy'L}GIHB n J\Q v;( LK q:mRQ U& 'T+].q'@{.@1&a7 VYX8.:?zMWASI J_KnL$pO:PZQSaUbpq] q@tj, bqrr$&a,. A]jq @ L`ZBpAq(a€ Q “oN+OX/a¡]H"]&a y8U7RGya!6 WZ^tq@y#EI w*%,qĀ01-H(@DEEJF]q@JpNFO]^S, Xad;YKIgaŀao]bq @p x"" =6 Kaƀ W]@q @%x+?&},30aǀ 3]q @TM U4bqd wI~ q Ȁ F G!#b&]|q @)MH8`UEV\aɀc5 r<}]Zq@ oQ 8 B*O-=1D14Kq ʀ5;6P=4&AKCUJ]8q@P>StT0UXZZJbg h?rtCq ˀ YT2]q@&W XBS'; *Z6V97<y DSOaRq ̀ SaIfBghm]ta͡]Ra͐ZWN. 2a@>p/?F&N u q ΀  \l$&&]0q@ (`6{<^>aAUPkV[W YY\q π^_)Vf]_nowX]q@ x)[v ?  -aЀ .]lq @Oqd gX,n'vaрa;%]Jq@>'])= 2*@<:F?IMkNP-Rq Ҁ [e2hk6m8n:](q@v<zd}9~=>?R} ;- $ %&aӀ(_K -Q Ӌwp ! 'q Ӕ4j6bK7x8b:r]q%@;P<S?e@rDF]ITKgLOfThXd^j_k`i=ajc=eaԀgvgi7kQ Ԋ, wvt?nL}aԗppunw]dq@xmlb{~~y/6wQ Z= f$K OpUqe GE\uFaՀ4Q ՄilGFon]\QPQ+q Ր%`(~G+ ,u/]Bq@0 S14 5_7 8QR}08~gf! _l]LLab?WBEFQ ou5(s|[NkayLOqրQ T Vc[:`xd] q@knkrx0hyD z U J@Sq׀I!mx${%*+X~a@ 4HA}*Fq؀q; Y$:epd0a]WQ@K83 NB=k|l:!mH?9+*6+qQa]2Q4Ql3JutOti; %Vaz5xqـTs%)7( G*.1/f1[D2]5q @3*14=9\#=azdaڡ]"]qaڅnxQ0 } ,a ڀkpx *AGK Q]ejQ O|aj`MLa q Xuz~#pq܀{g6V` ! '*]Oq @.4:?@1DEFXGN fO&YTq݀X;Y:[[p_ b;fhp7jRl3]-q@E!m(o|0r" wF 0KJ* aހ{ /r;] q@~< =; GSU>&VlY>ZJ[3_eA wO$10~m=q ߁jqlFmcsp]iq@ 3 " -G/<78Q9q>;EJ-+KLMO]Gq @X! ZU{ ~ $ qXzy4sxwHvE{#]%q!@$z%m &}1y2~M38:=]%@Az&CUKOqPVW 1Y  [4]]q"@acfVi lSmzNoqUt w|*- 2 {q /,( /<5! &"]aq'@4*1#%&M+Z,r>-O1C2W3<4)7!9 ;?EDF#:EI=qJAK <;8M@QMRUKYGO]]?q)@^0dFeLgR0IiQJlRm8pyq+sM%uLwmy7zJ8N|Tq<UV hVWSH]q@\Y!U%}(~+|.Z/^14 3^=`>"TGA怾Aycy R+@A{IqM OePaRbXl[m ^_j]{q@`nc9\ghkojDgk[l o+{q|w}"3 q*6soxpuA]]Yq@$z'w(*$+{.#2y7f8=| >I}KrLtRqNTFUYvZd?^\]7q @ muy}?@Q ]E~[V }vq i i Cyk5 qGIFOKs!wONJM"P%l'A(nQ]q@x)S,RT/,4U5q7E$9q^aci~MjnY]sq@w2xR{y }W? =% VDW "a'P,C0]Qq@F(L [ ^_2 b oCva~# ]/q@$^5]:<_> }?@EeJgLfMaRQI25>t5 |S/.Ca] q @GA /\h?4kInHrtKu}{~}LC9ZsaqMNvKQ@P R"*#rS&]kq@>TD(Os)/L45x6N8O=8DPEQ FtPR~SqUW!XqY["\K65c-gSh]Iq"@j#kgl$dn8r%tvCx.~& 5'(u)q+k,jyfgl - #]'q@-mB?Ai BW N%J\]A~Q 4]\98=+e;dA9aBJVZ\]q@` e! f"p'9%q)x.+ z*-(9 q608 7E&:'C]}q@+@,=A/>0?@2;3B7D:9BLCGKKINHPJQq XM]4_Q`PRbOeQ 26(#"ihon+a][q@lTnXtUMv[~ZY./F&\ , #1a ]9q@=?B\D JKZn [fCklmqop}ros yG q@ P` (6)+v-q <ABKOPq@XZ]LbDf` lopl q". #q  % $&'")q@#(,4!*89R{U tVaW gqrwtq@uy}Z A3j  i"$a*-s3q@IFk[S^_ce0gqhjmnrswqx73"m4S a@Y= Nmanuskript-0.10.0/libs/pdf.js/web/cmaps/GBKp-EUC-V.bcmap000066400000000000000000000002651354442177200224020ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE GBKp-EUC-Ha?>VW F>"BD= @CXTUmanuskript-0.10.0/libs/pdf.js/web/cmaps/GBT-EUC-H.bcmap000066400000000000000000000161721354442177200222210ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE] $` $].a]`21> p z$]"Rd-U7* 4%+ Z {/%<9Kb1]." q,%4&6' :)E*L+_,a-f.h/p0y2{345q' 689:;=#@+A4B:D<E?FKINJRLTMXN[OaSgqhToVtW}X Y Zd&e(f +h7 iDq0sHuMyOzT{[|_}d~hjlsux    !q&&*/38<CFKNQ S!X#^$`%q&s'|(q#)* ./167:(;-<2=5>AAEBIDOEYG_q1`HeJgKiLkMpOsPwQTUV WY[\]^!_)`,a/c1d6e9fWqX?_@ cA rB }C D FG H$e+I0q!6J:K<L@NDPFQIRMUPWgX jZ}cde hiq/jkmop!q,t/u5v7w;y>zA|D}JLOQUX\ ` gpqry~ $% &)-0!2)3,436=7J<Oq*=R?U@XAZB]CaDgGjHpI yJK L MNOPQR%S(U,q!.W3X8Y;ZS[U\\]`_g`rcwdye{fghiq"k lmnoq" u09@BDIL U X ]fq#jow %' ()*+,%/(0/23365=6?7Gq!¡H;PB[K`LeNgOiPoSxYzZb gjopt"q#áx'y0z3{y:|D}MRT\_fksv |  qġ*-5:=FIPUX\!`#qš$d&k+s,w-{0}1 23 4$5 )6 6qơ @7N9V;[<^=`>d@mCsDwE GHIJKq-ǡL!M$O'Q)R-T3W8Y<[>\@]C^F`JaMbSdUe\failnvpyq{q#ȡ|rsu vw x"|$})~+.5 :IOTV Xq/ɡ [ _ bfkns|~" *!.#0$3&q'ʡ8'>*@+C-I.N1 S2^3b4f6l8q9v:x;|<> @ABq'ˡCD!E#F)G,I.J5K=LBPFRISKTVVZW]Y`Zf\l^nq%̡_va|bch jk l m"n$o*p.q0r4s6t9uIvNxq͡ R{_|e}i~nqw y  $ *q&Ρ0 57=ACMPVXZa!j$l% o'{(})*+q0ϡ -./!0&2(3+4/738599;<=>>FCHDJEMFPGUHXIZJ\KbLhNqСlOqPzRUW XYZ.[1\7]9^EaHq(ѡbLdNeQfUg[jamcnfprsutyvxy {}~#q,ҡ(*-17 ; > E GKMOW]bmswy}q$ӡ *+,/0!1+2-326;7F9I:L;R=U>Z?b@q(ԡdAhBlEvIzK|LMOP R SWXY$^(_*`2a8f=gq*աhDjKkMlPmSnZr]s_tbugviwmyozv{}~kq'֡ $ 0 4 ; =@DJMSWZ_aehor v"qס~%&) *.01 6%7 (839<=E>Hqء"W@{A~BCEG HIK(L.q١ 5NBODPHS\T eXrYvZy[{\] q ڡ:_ R ]jlqۡqtw {" #$ %"&,'/(3)5*<+?,B-HqܡO0k1n2q3y6789;= >%?(@qݡB.C4H8J?KBLHN`OhPkQqRxS~TV Wqޡ XYZ %[1\:]=_C`MaSbWc^dgq'ߡielg nh}ikl nopq"s%t)u+v/w2x4y8z>{BqG|^~fou zq" %0 2 5 9 @ BFN U`*glt{}q E%1.3/<0G2I3 N6[7`qa;c<f=l>u?V$W.X3Z9[q?\D^J_Pb Udaedfhgxh{i}jk m nqo-p 6qDrFs Ktmuovzq{x~y{ |~$(q 9![] ^(_/q)7b?cCdMeQhWj\k`neogpjqtrvszu|v~wxyz{q} ~"* ,9; >KOY\ ^ ` qx#{% & '( )&*BqQ@XA[BcCjD|F~GH IJ(q/K2L=R@SDUNWPXVYZZq[\]q^_`b!c#d%e'f,g0i:k@lDmUn [ogakqr :s"P. q' **`+d-f.p/s0v1~23q"4 5678!9%:.;2<5>??A@IAQBTC\D^Eq HpUuW|XY Z\]^(_1`:a@qAb`cgd iewf zgi j kl mqn$o.p 4q@rFsOuUviwnxtq}y{}!~%,/69DLO Yq[ ^ a c fk y/qNH]L_N`Va\b_ddf ihw9zi jq9kL qNsvtS~vDw<yC{+Ni qZz Z]jlr >{p#=Y"{ $a!%:&U(}manuskript-0.10.0/libs/pdf.js/web/cmaps/GBT-EUC-V.bcmap000066400000000000000000000002641354442177200222320ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE GBT-EUC-Ha?>VW F>"BD= @CXTUmanuskript-0.10.0/libs/pdf.js/web/cmaps/GBT-H.bcmap000066400000000000000000000161451354442177200216070ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE!!]a!!]`21> p z$]"Rd-U7* 4%+ Z {/%<9Kb1]." q0!,%4&6' :)E*L+_,a-f.h/p0y2{345q'1! 689:;=#@+A4B:D<E?FKINJRLTMXN[OaSgq2!hToVtW}X Y Zd&e(f +h7 iDq03!sHuMyOzT{[|_}d~hjlsux    !q&4!&*/38<CFKNQ S!X#^$`%q&s'|(q#5!)* ./167:(;-<2=5>AAEBIDOEYG_q16!`HeJgKiLkMpOsPwQTUV WY[\]^!_)`,a/c1d6e9fWq:!X?_@ cA rB }C D FG H$e+I0q!;!6J:K<L@NDPFQIRMUPWgX jZ}cde hiq/zA|D}JLOQUX\ ` gpq=!ry~ $% &)-0!2)3,436=7J<Oq*>!=R?U@XAZB]CaDgGjHpI yJK L MNOPQR%S(U,q!?!.W3X8Y;ZS[U\\]`_g`rcwdye{fghiq"@!k lmnoq" u09@BDIL U X ]fq#A!jow %' ()*+,%/(0/23365=6?7Gq!B!H;PB[K`LeNgOiPoSxYzZb gjopt"q#C!x'y0z3{y:|D}MRT\_fksv |  qD!*-5:=FIPUX\!`#qE!$d&k+s,w-{0}1 23 4$5 )6 6qF! @7N9V;[<^=`>d@mCsDwE GHIJKq-G!L!M$O'Q)R-T3W8Y<[>\@]C^F`JaMbSdUe\failnvpyq{q#H!|rsu vw x"|$})~+.5 :IOTV Xq/I! [ _ bfkns|~" *!.#0$3&q'J!8'>*@+C-I.N1 S2^3b4f6l8q9v:x;|<> @ABq'K!CD!E#F)G,I.J5K=LBPFRISKTVVZW]Y`Zf\l^nq%L!_va|bch jk l m"n$o*p.q0r4s6t9uIvNxqM! R{_|e}i~nqw y  $ *q&N!0 57=ACMPVXZa!j$l% o'{(})*+q0O! -./!0&2(3+4/738599;<=>>FCHDJEMFPGUHXIZJ\KbLhNqP!lOqPzRUW XYZ.[1\7]9^EaHq(Q!bLdNeQfUg[jamcnfprsutyvxy {}~#q,R!(*-17 ; > E GKMOW]bmswy}q$S! *+,/0!1+2-326;7F9I:L;R=U>Z?b@q(T!dAhBlEvIzK|LMOP R SWXY$^(_*`2a8f=gq*U!hDjKkMlPmSnZr]s_tbugviwmyozv{}~kq'V! $ 0 4 ; =@DJMSWZ_aehor v"qW!~%&) *.01 6%7 (839<=E>HqX!"W@{A~BCEG HIK(L.qY! 5NBODPHS\T eXrYvZy[{\] q Z!:_ R ]jlq[!qtw {" #$ %"&,'/(3)5*<+?,B-Hq\!O0k1n2q3y6789;= >%?(@q]!B.C4H8J?KBLHN`OhPkQqRxS~TV Wq^! XYZ %[1\:]=_C`MaSbWc^dgq'_!ielg nh}ikl nopq"s%t)u+v/w2x4y8z>{Bq`!G|^~fou zq"a! %0 2 5 9 @ BFN U`*glt{}qb! E%1.3/<0G2I3 N6[7`qc!a;c<f=l>u?V$W.X3Z9[qd!?\D^J_Pb Udaedfhgxh{i}jk m nqe!o-p 6qDrFs Ktmuovzqf!{x~y{ |~$(q g!9![] ^(_/q)h!7b?cCdMeQhWj\k`neogpjqtrvszu|v~wxyz{qi!} ~"* ,9; >KOY\ ^ ` qj!x#{% & '( )&*Bqk!Q@XA[BcCjD|F~GH IJ(ql!/K2L=R@SDUNWPXVYZZq[\]qm!^_`b!c#d%e'f,g0i:k@lDmUn [ogan!kqr :s"P. qp!' **`+d-f.p/s0v1~23q"q!4 5678!9%:.;2<5>??A@IAQBTC\D^Eqr! HpUuW|XY Z\]^(_1`:a@qs!Ab`cgd iewf zgi j kl mqt!n$o.p 4q@rFsOuUviwnxtqu!}y{}!~%,/69DLO Yqv![ ^ a c fk y/qw!NH]L_N`Va\b_ddf ihw9zi jq9x!kL qNsvtS~vDw<yC{+Ni qZz Z]jlr >{p#=Y"{ $ay!!%:&U(}manuskript-0.10.0/libs/pdf.js/web/cmaps/GBT-V.bcmap000066400000000000000000000002601354442177200216140ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEGBT-Ha!"?>VW F>"BD= @CXTUmanuskript-0.10.0/libs/pdf.js/web/cmaps/GBTpc-EUC-H.bcmap000066400000000000000000000162021354442177200225360ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE] ` ^ a]`21> p z$]"Rd-U7* 4%+ Z {/%<9Kb1]." q,%4&6' :)E*L+_,a-f.h/p0y2{345q' 689:;=#@+A4B:D<E?FKINJRLTMXN[OaSgqhToVtW}X Y Zd&e(f +h7 iDq0sHuMyOzT{[|_}d~hjlsux    !q&&*/38<CFKNQ S!X#^$`%q&s'|(q#)* ./167:(;-<2=5>AAEBIDOEYG_q1`HeJgKiLkMpOsPwQTUV WY[\]^!_)`,a/c1d6e9fWqX?_@ cA rB }C D FG H$e+I0q!6J:K<L@NDPFQIRMUPWgX jZ}cde hiq/jkmop!q,t/u5v7w;y>zA|D}JLOQUX\ ` gpqry~ $% &)-0!2)3,436=7J<Oq*=R?U@XAZB]CaDgGjHpI yJK L MNOPQR%S(U,q!.W3X8Y;ZS[U\\]`_g`rcwdye{fghiq"k lmnoq" u09@BDIL U X ]fq#jow %' ()*+,%/(0/23365=6?7Gq!¡H;PB[K`LeNgOiPoSxYzZb gjopt"q#áx'y0z3{y:|D}MRT\_fksv |  qġ*-5:=FIPUX\!`#qš$d&k+s,w-{0}1 23 4$5 )6 6qơ @7N9V;[<^=`>d@mCsDwE GHIJKq-ǡL!M$O'Q)R-T3W8Y<[>\@]C^F`JaMbSdUe\failnvpyq{q#ȡ|rsu vw x"|$})~+.5 :IOTV Xq/ɡ [ _ bfkns|~" *!.#0$3&q'ʡ8'>*@+C-I.N1 S2^3b4f6l8q9v:x;|<> @ABq'ˡCD!E#F)G,I.J5K=LBPFRISKTVVZW]Y`Zf\l^nq%̡_va|bch jk l m"n$o*p.q0r4s6t9uIvNxq͡ R{_|e}i~nqw y  $ *q&Ρ0 57=ACMPVXZa!j$l% o'{(})*+q0ϡ -./!0&2(3+4/738599;<=>>FCHDJEMFPGUHXIZJ\KbLhNqСlOqPzRUW XYZ.[1\7]9^EaHq(ѡbLdNeQfUg[jamcnfprsutyvxy {}~#q,ҡ(*-17 ; > E GKMOW]bmswy}q$ӡ *+,/0!1+2-326;7F9I:L;R=U>Z?b@q(ԡdAhBlEvIzK|LMOP R SWXY$^(_*`2a8f=gq*աhDjKkMlPmSnZr]s_tbugviwmyozv{}~kq'֡ $ 0 4 ; =@DJMSWZ_aehor v"qס~%&) *.01 6%7 (839<=E>Hqء"W@{A~BCEG HIK(L.q١ 5NBODPHS\T eXrYvZy[{\] q ڡ:_ R ]jlqۡqtw {" #$ %"&,'/(3)5*<+?,B-HqܡO0k1n2q3y6789;= >%?(@qݡB.C4H8J?KBLHN`OhPkQqRxS~TV Wqޡ XYZ %[1\:]=_C`MaSbWc^dgq'ߡielg nh}ikl nopq"s%t)u+v/w2x4y8z>{BqG|^~fou zq" %0 2 5 9 @ BFN U`*glt{}q E%1.3/<0G2I3 N6[7`qa;c<f=l>u?V$W.X3Z9[q?\D^J_Pb Udaedfhgxh{i}jk m nqo-p 6qDrFs Ktmuovzq{x~y{ |~$(q 9![] ^(_/q)7b?cCdMeQhWj\k`neogpjqtrvszu|v~wxyz{q} ~"* ,9; >KOY\ ^ ` qx#{% & '( )&*BqQ@XA[BcCjD|F~GH IJ(q/K2L=R@SDUNWPXVYZZq[\]q^_`b!c#d%e'f,g0i:k@lDmUn [ogakqr :s"P. q' **`+d-f.p/s0v1~23q"4 5678!9%:.;2<5>??A@IAQBTC\D^Eq HpUuW|XY Z\]^(_1`:a@qAb`cgd iewf zgi j kl mqn$o.p 4q@rFsOuUviwnxtq}y{}!~%,/69DLO Yq[ ^ a c fk y/qNH]L_N`Va\b_ddf ihw9zi jq9kL qNsvtS~vDw<yC{+Ni qZz Z]jlr >{p#=Y"{ $a!%:&U(}`!manuskript-0.10.0/libs/pdf.js/web/cmaps/GBTpc-EUC-V.bcmap000066400000000000000000000002661354442177200225570ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE GBTpc-EUC-Ha?>VW F>"BD= @CXTUmanuskript-0.10.0/libs/pdf.js/web/cmaps/GBpc-EUC-H.bcmap000066400000000000000000000010551354442177200224120ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE] ` ^ aX]`21> p z$]"Rd-U7* 4%+ Z {/%<9Kb1]." `],"] "]h"]F"]$"]"]`"]>"]"]z"]X"]6"]"]r"]P"]."] "]j"]H"]&"]"]b"]@"]"]|"]Z"]8"]"]t"]R"]0"]"]l"]J"]("]"]d"]B"] "X~']W"]5"]"]q"]O"]-"] "]i"]G"]%"]"]a"]?"]"]{"]Y"]7"]"]s"]Q"]/"] "]k"]I"]'"]"]c"]A"]"]}"]["]9`!manuskript-0.10.0/libs/pdf.js/web/cmaps/GBpc-EUC-V.bcmap000066400000000000000000000002651354442177200224320ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE GBpc-EUC-Ha?>VW F>"BD= @CXTUmanuskript-0.10.0/libs/pdf.js/web/cmaps/H.bcmap000066400000000000000000000010511354442177200211630ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE!!]a!!]y" W em t 1 0&RJ-U*s H # DQ (!7 w WE$$aF0!]e"]C"]!"]"]]"];"]"]w"]U"]3"]"]o"]M"]+"] "]g"]E"]#"]"]_"]="]"]y"]W"]5"]"]q"]O"]-"] "]i"2GM]z"]X"]6"]"]r"]P"]."] "]j"]H"]&"]"]b"]@"]"]|"]Z"]8"]"]t"]R"]0"]"]l"]J"]("]"]d"]B"] "]~"]\"]:"]"]v"]T"2\manuskript-0.10.0/libs/pdf.js/web/cmaps/HKdla-B5-H.bcmap000066400000000000000000000051361354442177200224200ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@> ` ^as@c/!"T"xwyA>"]?A>"\w>S"]A>p"]/A> "]LA>*"]iA>G"]A>d"]#A>"]@A>"]]A>;"\zA>W"]A>t"]3A>".P.A>/"]nA>L"] A>i"](A>"]EA>#"]bA>@"]A>]"]A>z"]9A>"]VA>4"]sA>Q"]A>n"&-6UA> "]KA>)"]hAFT+X"]A>b"]!A>"]>A>" [SfA>:")ye2#A Vx"/.C0Atw' "]2A>"]OA>-A lt v"+-HwA> "UHvA>%"]dA>B"]A>_"]A>|"];A>"]XA>6"]uA>S"]A>p"]/A> "]LA>*"]iA>G"]A>d"*#T1OA99;"]?A>"]\A>:"]yA>W"=NUA>t"3W:A>"]QA>/"ZnIA>K"] A>h"]'A>"]DA>""]aA>?"]~A>\"]A>y"]8A>"]UA>3"]rA>P"]A>m",[/A5 B"]KA>)"]hAF#b"O. VA>c"<"A_A>">THA>"I\&A>9"]xAVG'l")a2>A"q`"]0A'o6"!L;oA4+ a"]kA%Ip" nFeA>g"]&A"d'"]BA> "]_A>="]|A6Z""=I >JQ>AIM? %P"TLUJWlK-qt/y|#0e GxTQTc]j{ e30VFkQn)gt3sQuU3%|t~qCXNQ+aQJlS#-`pv R[ &;z# \o|+#8WOhca%\b[JqfC=&+0>gV6& e"WV9;Q6@:~?o p/5|\>grA:vcDM8Ja5( >G}j(a E%R?:zPs Y]avdAx=P-"m 9Q^&3buJ-&BF1of5Hnmpyc2m-~- m 5l.rk~i_ ;GbXedU&1s* \ ?,O a,Sis8x2o\ [1V^yu,$kQ?@1<;*/F{~ < =ZYl$A21 Tq?L: MP_,G)3cx]  !j$e`&/[tjt cnQK"}H(>aZYK PxbU2qa^QkK(;.G3SfCm l+MV&jeS2sa@Q)} &w0IW` % V0UfgN?`\as  XybIQ;Q?@~G 0&:j $VAB0 Q816]$PirfC1, ?0/lF /I tiQ^87B$qPIjU:1 { a'~u/Jg~6_@UlA,%6;P_ )e6MNKA"L< DS~,G&)|=.B^5afQH54)( ,DOn'b;$#  >/4`)x416?VNcqJSx 4kL:Ehi}P\!|kj;'Zmanuskript-0.10.0/libs/pdf.js/web/cmaps/HKdla-B5-V.bcmap000066400000000000000000000002241354442177200224270ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE HKdla-B5-Ha KN/1 hOmanuskript-0.10.0/libs/pdf.js/web/cmaps/HKdlb-B5-H.bcmap000066400000000000000000000045561354442177200224260ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@> ` ^Q?@wX,=8S(x; :zX3sC*CPa > ,<1Vtcvii${&EQ{*=hkHY6SYQ'Q$~&to$pxyLc1fkE>p==j$%up0 cH M katQ8ǁtQ%kF}0Iij;iHI+HUpWn}t?mV2w /'(M$/MiQ?@dKsPlUXEPGUTz^AH ,W (Jn 6j#9V\ h;7"DV&9JX6wB5pQ{^/Q^29Ds)\0t @[*#Gbc }n&fQ> !oDQop5SM&+Hd!Zq_2 z>iP/(| L1:em|=;^Y3h g{J{3Z)oHgmWQ?@}d m ?:Y:+?CZHees,mov52|+M.Zfi4s$c x? &nKS`{UV1Q^zLAf/?iF_>'PN)e~Y_,60 "-;I]%Xy)d ?<5bfFO );7f)M\5>=.='^9_U7 sfW4n'Q?@9ngx&fSLk@\ j;' %+x[X4-BU6Y$^Ph58QP ;5i~uD)M)s}"]?A>"\w>S"]A>p"]/A> "]LA>*"]iA>G"]A>d"]#A>"]@A>"]]A>;"\zA>W"]A>t"]3A>".P.A>/"]nA>L"] A>i"](A>"]EA>#"]bA>@"]A>]"]A>z"]9A>"]VA>4"]sA>Q"]A>n"&-6UA> "]KA>)"]hAFT+X"]A>b"]!A>"]>A>" [SfA>:")ye2#A Vx"/.C0Atw' "]2A>"]OA>-A lt v"+-HwA> "UHvA>%"]dA>B"]A>_"]A>|"];A>"]XA>6"]uA>S"]A>p"]/A> "]LA>*"]iA>G"]A>d"*#T1OA99;"]?A>"]\A>:"]yA>W"=NUA>t"3W:A>"]QA>/"ZnIA>K"] A>h"]'A>"]DA>""]aA>?"]~A>\"]A>y"]8A>"]UA>3"]rA>P"]A>m",[/A5 B"]KA>)"]hAF#b"O. VA>c"<"A_A>">THA>"I\&A>9"]xAVG'l")a2>A"q`"]0A'o6"!L;oA4+ a"]kA%Ip" nFeA>g"]&A"d'"]BA> "]_A>="]|A6Z""=I >Jmanuskript-0.10.0/libs/pdf.js/web/cmaps/HKdlb-B5-V.bcmap000066400000000000000000000002241354442177200224300ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE HKdlb-B5-Ha KN/1 hOmanuskript-0.10.0/libs/pdf.js/web/cmaps/HKgccs-B5-H.bcmap000066400000000000000000000043641354442177200226010ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@> ` ^a~!0aC@+$0 U_#f!k (1A@Y^e"#| ! 3TAVr i "E'A$m#)[*A>" E1S  A'E"[d!{"A57;"]sA Q ^#j"$73A>k"2*)]A>"]FA4$YZ([ \]^_abca @>"DG[ A!e F ) 'U  3 aA  JaakjaC^!""#%)*+34;<=?@ADEFGHIMOPQSCUX[\]dejklmpqrswz{}"~ $ '14 6BHCDFA OHau@c!"T"xwyA>"]?A>"\w>S"]A>p"]/A> "]LA>*"]iA>G"]A>d"]#A>"]@A>"]]A>;"\zA>W"]A>t"]3A>".P.A>/"]nA>L"] A>i"](A>"]EA>#"]bA>@"]A>]"]A>z"]9A>"]VA>4"]sA>Q"]A>n"&-6UA> "]KA>)"]hAFT+X"]A>b"]!A>"]>A>" [SfA>:")ye2#A Vx"/.C0Atw' "]2A>"]OA>-A lt v"+-HwA> "UHvA>%"]dA>B"]A>_"]A>|"];A>"]XA>6"]uA>S"]A>p"]/A> "]LA>*"]iA>G"]A>d"*#T1OA99;"]?A>"]\A>:"]yA>W"=NUA>t"3W:A>"]QA>/"ZnIA>K"] A>h"]'A>"]DA>""]aA>?"]~A>\"]A>y"]8A>"]UA>3"]rA>P"]A>m",[/A5 B"]KA>)"]hAF#b"O. VA>c"<"A_A>">THA>"I\&A>9"]xAVG'l")a2>A"q`"]0A'o6"!L;oA4+ a"]kA%Ip" nFeA>g"]&A"d'"]BA> "]_A>="]|A6Z""=I >Jy/i_p aY/abPTUXYZ[\^`bdej!mA"46789:<=>"?ADFHKLNOPRTXZ\]_wz|A# *"8LQT!Uw B # :G"JKO lvY> "]JA>("g 0A CMQSct"}% =GAW4`"P fA,r )"/28 kxmanuskript-0.10.0/libs/pdf.js/web/cmaps/HKgccs-B5-V.bcmap000066400000000000000000000002251354442177200226070ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE HKgccs-B5-Ha KN/1 hOmanuskript-0.10.0/libs/pdf.js/web/cmaps/HKm314-B5-H.bcmap000066400000000000000000000033541354442177200223440ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@> ` ^a_@c/!"T"xwyA>"]?A>"\w>S"]A>p"]/A> "]LA>*"]iA>G"]A>d"]#A>"]@A>"]]A>;"\zA>W"]A>t"]3A>".P.A>/"]nA>L"] A>i"](A>"]EA>#"]bA>@"]A>]"]A>z"]9A>"]VA>4"]sA>Q"]A>n"&-6UA> "]KA>)"]hAFT+X"]A>b"]!A>"]>A>" [SfA>:")ye2#A Vx"/.C0Atw' "]2A>"]OA>-Q@mS()7::stSTyTaOHQ!QK$mO8S +:4' 3^;(C;R4!9aar(Q t..&xCG9 |Qǡ$#D54aQ !7t@az32bqjx+~aǾ1QL lG?w&w^1Q`lacQlw 0' AVp7&a] &NOqo*qf"~9!r0)<6:a@ lt v"+-HwA> "UHvA>%"]dA>B"]A>_"]A>|"];A>"]XA>6"]uA>S"]A>p"]/A> "]LA>*"]iA>G"]A>d"*#T1OA99;"]?A>"]\A>:"]yA>W"=NUA>t"3W:A>"]QA>/"ZnIA>K"] A>h"]'A>"]DA>""]aA>?"]~A>\"]A>y"]8A>"]UA>3"]rA>P"]A>m",[/A5 B"]KA>)"]hAF#b"O. VA>c"<"A_A>">THA>"I\&A>9"]xAVG'l")a2>A"q`"]0A'o6"!L;oA4+ a"]kA%Ip" nFeA>g"]&A"d'"]BA> "]_A>="]|A6Z""=I >Jmanuskript-0.10.0/libs/pdf.js/web/cmaps/HKm314-B5-V.bcmap000066400000000000000000000002251354442177200223540ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE HKm314-B5-Ha KN/1 hOmanuskript-0.10.0/libs/pdf.js/web/cmaps/HKm471-B5-H.bcmap000066400000000000000000000041731354442177200223500ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@> ` ^as@c/!"T"xwyA>"]?A>"\w>S"]A>p"]/A> "]LA>*"]iA>G"]A>d"]#A>"]@A>"]]A>;"\zA>W"]A>t"]3A>".P.A>/"]nA>L"] A>i"](A>"]EA>#"]bA>@"]A>]"]A>z"]9A>"]VA>4"]sA>Q"]A>n"&-6UA> "]KA>)"]hAFT+X"]A>b"]!A>"]>A>" [SfA>:")ye2#A Vx"/.C0Atw' "]2A>"]OA>-A lt v"+-HwA> "UHvA>%"]dA>B"]A>_"]A>|"];A>"]XA>6"]uA>S"]A>p"]/A> "]LA>*"]iA>G"]A>d"*#T1OA99;"]?A>"]\A>:"]yA>W"=NUA>t"3W:A>"]QA>/"ZnIA>K"] A>h"]'A>"]DA>""]aA>?"]~A>\"]A>y"]8A>"]UA>3"]rA>P"]A>m",[/A5 B"]KA>)"]hAF#b"O. VA>c"<"A_A>">THA>"I\&A>9"]xAVG'l")a2>A"q`"]0A'o6"!L;oA4+ a"]kA%Ip" nFeA>g"]&A"d'"]BA> "]_A>="]|A6Z""=I >JQ @mS((I::sqLLE4#& QHKOTx !Z$=#?\_c$zQm}+n54[2 3^6eQ (=;R4!9J-a(Q...&xCG9 |$*OD54a*} !7t@az32bgzjx 7~a1Q߁L lG?B]w\5}^w^1Q`lH9,=a7A#Q0@'"! K2K`! _=&IbL;kzMzukuRmebCjs`YjdapBQ rV]j %Kx1Ra|t""rymDQ.2&5:R$oMf>%D/do~W|uu$;@#fW8'n-*FGK0 aI5K2 QhcZ7@~;>MLQq RXs`-sUUAYMQ4@lg23 WS}4= rY8YL(yk L5('&mjCB 0Hy cQlw\]\gm0 I AVp7&a]|nIN<+( am}Q߁oUx2& ?.kE>?vIdqNarQ 0$ z{0Hwmanuskript-0.10.0/libs/pdf.js/web/cmaps/HKm471-B5-V.bcmap000066400000000000000000000002251354442177200223600ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE HKm471-B5-Ha KN/1 hOmanuskript-0.10.0/libs/pdf.js/web/cmaps/HKscs-B5-H.bcmap000066400000000000000000000105251354442177200224460ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@> A~!2 A iUA*twss,2}npn$UBWAohyM+PmxH1A C6qST m Atsrsts EY X wvqpon) EDCBSX~  !V;yBxwc8!o78xy( 2 6`J<$ * a6c b3W2Y^ +,"%{cbZ uA"Z2Q f}7 6i/2o( Q J>?]edA_sdMm~uU#s VaEh;8GAx%e\W\tAYw"rM "x mog>8<@':E (MT15P}jmFA h$'XqNoslS-HdWdR%AvP8J){((vtLGl$ $jtM||L-j`XVAfEqp [q8KAra F ) 'U  3  J "   T    &#6-DH + "+ (>A*`j&0rde#A)ҁMCHI ?/ . iv&oz - {+_:-SZ ?Vu{3A Áq  FZ^=dc<" /"uR$$   H  ,  O E6 )F %  G'D F  & |\a14 | V Z xz ` ^a[c!"T"yA>"]?A>"\w>S"]A>p"]/A> "]LA>*"]iA>G"]A>d"]#A>"]@A>"]]A>;"\zB>W"]A>t"]3A>".P.A>/"]nA>L"] A>i"](A>"]EA>#"]bA>@"]A>]"]A>z"]9A>"]VA>4"]sA>Q"]A>n"&-6UA> "]KA>)"]hAF+X"]A>b"]!A>"]>A>" [SfA>:")y2#A Vx"C0At' "]2A>"]OA>-"z*m l v"+-HwA> "UHA>%"]dA>B"]A>_"]A>|"];A>"]XA>6"]uA>S"]A>p"]/A> "]LA>*"]iA>G"]A>d"*#1OA9;"]?A>"]\A>:"]yA>W"=UA>t"3W:A>"]QA>/"ZnIA>K"] A>h"]'A>"]DA>""]aA>?"]~A>\"]A>y"]8A>"]UA>3"]rA>P"]A>m",[/A5 B"]KA>)"]hAF#b"O VA>c"<"_A>">THA>"I\&A>9"]xAV'l")2>A"q"]0A'6"!L;oA4+ a"]kA%Ip" FeA>g"]&A"'"]BA> "]_A>="]|A6Z"" >Ja%W  #' ,:@'GORX aot~[ o+"0VY_d#fkpy} (18A@Y^g lw"| ! &3"]FA$(*TH_cNUc/#%+4 =AIMQSCUX]emsw{$~ !$ '14 6RFWPU\^bej!mA14:(?AFHLPRTZ]_uwzE# *"8LQU`h lw B  #1:DG$KO lv{ r/{3:A>Y"]A>v"5(a(hA +2"JTgo(A( 1<W"gj $8>A CMQScmt"} ' =G JAW`"-&0 X fAr!)"/18 kxa:@%;">`I(a" 47<,?"l s v  #1WB ERD\ beint" _|B!!C"_d PXCr)+03:>"@D F R5^lo/eN/QSU"Y [f n s}  D '+29>AGI(RY\_bqsxz  A  &28>F#NQT[bktz A' .<>*BEGI N VX\ adhLmrz. "D#')0C#G MOSXZ] ` hkr0y }  R~07 :UF%- *FR ] _manuskript-0.10.0/libs/pdf.js/web/cmaps/HKscs-B5-V.bcmap000066400000000000000000000002371354442177200224630ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE HKscs-B5-Ha] aKN/1Oamanuskript-0.10.0/libs/pdf.js/web/cmaps/Hankaku.bcmap000066400000000000000000000002041354442177200223550ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE` ?gg(G V>Gmanuskript-0.10.0/libs/pdf.js/web/cmaps/Hiragana.bcmap000066400000000000000000000001741354442177200225130ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE` G V,;>manuskript-0.10.0/libs/pdf.js/web/cmaps/KSC-EUC-H.bcmap000066400000000000000000000034701354442177200222220ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE] ` ^a?]e"DC;]"2f)" C MWo(C"]"]z"]X"]6"]"]r"]P"]."] "]j"]H"]&"]"]b"]@"]"]|"]Z"]8"]"]t"]R"]0"]"]l".Jy^~"]%"-1I" _ZPk"Y<>a a\q Сjj/| F# Rqѡ2s<&(*("+#,'-*.,//23569q'ҡ6:7<C:D;H ?J!%M&,N-07O=PASCFTTV[`U|YZa>ӡ]`"D>^("(+#`O%"uG L0 ")Q0{"]-"] "]i"#Gk: "#X'"W.u3 Q"Z[P6w"7,Irvm|"Oq b" oT>{E:"]K"S)}#.T aaܥ^N7>+Aa+Jq broIqKwMxOST U W" Z?0\q6_1a3b5e:g;j<k?oB@IqJALtSuVvXBZw\x]zy{_|`~/acTdCFfgq#lp rG s ug    %/q E6G|ITK( L Mq  PQS)54_q fk"a )W7c9e=fq>hAjClXDnSpTqsWtZw^x0`{%eq%  > [ #\ %/ 6"8$:% <'J*Ka - _B7C* tNfC"]"]z"]X"]6"]"]r"]P"]."] "]j"]H"]&"]"]b"]@"]"]|"]Z"]8"]"]t"]R"]0"]"]l".Jy^~"]%"-1I" _ZPk"Y<>aKg aMh\q P!jj/| F# RqQ!2s<&(*("+#,'-*.,//23569q'R!6:7<C:D;H ?J!%M&,N-07O=PASCFTTV[`U|YZa>S!]`"D>^("(+#`O%"uG L0 ")Q0{"]-"] "]i"#Gk: "#X'"W.u3 Q"Z[P6w"7,Irvm|"Oq b" oT>{E:"]K"S)}#.T aWda\%^N7>+Aa+Jqe! broIqKwMxOST U W" Z?0\q6f!_1a3b5e:g;j<k?oB@IqJALtSuVvXBZw\x]zy{_|`~/acTdCFfgq#g!lp rG s ug    %/q h!E6G|ITK( L Mq i! PQS)54_q j!fk"a )W7c9e=fqk!>hAjClXDnSpTqsWtZw^x0`{%eq%l!  > [ #\ %/ 6"8$:% <'J*Ka m!- _B7C* tNfCu@wAyEF~MPRSTU V Y[\]!^"_(`+a. 6q bAdCeEgFha'iKjLnCqNrQsTtu[v\yb|c}elmprux q     aq ad#$% +!."1#9$;C&A(C)F*+M,N-O.U/X0[1c2d3l5n6p:<t=u>v@{B}CD F!G#H+J-K0LM7N8CO@PCQF NRYT[U]XYcZd[e\k {q ]_` b ca defhgq ailmnoa;sp q!t$u&w(x+yz2{3~9? GR cnoryzC   $&*, 68D9E:F<K=RZ>]@cBeChDEoFqGxH{I~JK CL q aM*O,P-Q.R/SaAiasUVWX%Y[\]^_`)adeijkpqrtuvwx {}~at3458: KVX[bcd&jkmrstuwz   /q :;>?a" C D CIKNUV\^ahjl o! r ~q " $ %&'af()*+-./ (0+2 CC1N2Q3T45[6\7d9f:i;q<r=s>y@{A}CDEFG HI& 6JAKDLGMN NCOXQ^RSeThUnWpXs[\x]y^z`}a~bc q dfghiaAlajklm$nqrwyz a"#$(&)*,/0358?@F Va rq  } ~q  aA  !"!#$,$/&5' 8 Dq (O*Q+S-T.UA/Q 0NONONONOaH\5^6a7d l8w9 C:;<=>?@' 7ABCDDGEFNGOHPIVfJiKpLM N OPQRCS T#U&V-W1q aX7Z9[;]<^aAmas_`a bcefhij(npqrstwxz{|}~atABCI Ydfhop%uwz   +6 Gq RTWXaAnva  C  *  _ !;"$%&())*+,-./i023567 89:;< =>?@ABC)DFGHIJNPRSTUV Y[\])^`abcdgChjklmno prstuv yz {| } J          !#$%&'I(*+,-./ 02345679$;=>?@AB)CEFKa!\]Fbdgnou +-08<BI Q\ lDw z  "-/28<B S^ ny| C +-/67?BE LVY\cde%kmpwx{} % 6ACFMNFSUX_`agilstz }   & )59?PSDZ]`ghioru}~ ),3 CNPSZ\]Ecehopqwy| $&)012%8:;q sL@MANBPDQaRETGUJVWQXR\W^]e_io q ` b cdea fghjCkmn!op(q)t/v1w4<x>{?|C Sq }^_bca,hijp s  C $ ' *234:=@HIQRTq Y Z!["^#a*$_%b&e'm(n)v *+, C-*.-/007192A3D4G5N6PX iq 7t9v:x<y=aAwa>?BC%DINOPQRSUVWXY\]_ `a~(    " $ 0: Kq aVcXdZf[gah`iajbClgniokqrrssvyx{y~z{~   &'*12 3 9 <H K RbeClnq x   % &!'"*$+%2:&='D T(_*a+dl,pC-v.y/|0123 56789! 2q :=<?=B>C?a@HAIBJxq aENGPHSITJaAzacsKLOPRSTUV Y[/\^_abIef gijk)npqrst uvw xz{|}~) -     ) !" %'()*+, -./01 279;<=@DACDEFG JLMNOP STU ValtYZ_adkl r   ')+24D:JN Tbci z  +6 GDR bm}   -8 IT eDp   ! 2=?BIJK%QRTYZ]_adklrtw~   $%)E*,/67=?BIJPSV^bq WhZi[l\m]a9^r_s`tawbyd{e~f ghijkCm&n)o,pq3r4s<u>vAwxHyIzJ{P}R~TA 2323232aA{a1      I  "#$%)&()+-./0$135678:;=>?@ACa2_`psz| E$*134:<?EFGM ^ikmstuy%z{~  15; Lq DWFYG\H]IaJbKdCMjNmOp x P # /q Q:S<T>V?Wa8XDYGZM\ O[]^^eu_xC`abcd e &f1h3i6jk=l@mFVnYo` pp{q ~ C&r*q as0u2v5w6xaA|asz {|}~)  at :DGJ Q\^ahij%prswx{|~ q  "#$%q &'()*a"+ ,#-&. ./81:3;78@>A?BC@CBECHDEOFPGQq aHWKXL[M\OasP`UXcYfZi[\p]qq _xazb}e~favhijkln o pqruw x'y)z*C{0}2~5<=>DFIP Q R X Z]bcdjlovx~ !" # $&'()* +!C,'.)/,013243546q a5:7<8?9D:aA}as;<=DEFGH IKLOQRVa tEF GJMTV^`cghkq aWlYnZo]p^as_u`vd{f}ghijq mopqra st#u&v) 1q w<y>zA{B|a!}G~HICNPSZ[\ b e h  oqw q aa"( 0!1"2#8H$KC&Q'T(W)*^+_,`-f/ ht0x1~34789 : ; <#=* :>E@GAJBCQDRCEZF]G`H gIrKtLwMN~OP q Q"S$T&V'Wa X,Y-Z.\0~q a^1`3a4b5c7daAa=sef iklmno rst)uwxyz{I~ *     J#  )!_"#$%&)')*+,-/aHt;<BDGNOU Xdhn   D-17GJQ bmoryz{|(+D258 ?IZ^dfipsy   #. >DI Ydsuv| $'q a0+2-3.4/5as6677;<=>>A?@HAIq DOERFSGTHaAa4I)JLMNOPISUVWXYZ [\] ^_` acdefgh ijk limnopqrs tuvxyz{|} ~ I     )) "#$%&' (*+,-. 13)4679:;I>@ABCDE FGHIJK NOQRSTUV WYZ[\ ]^I_`abdefghi jkl m no prstuvwIxyz{|~)  )    a:[_e v E !"( +7:A DPTZ\_fghnqt| D"%(/017 FQSV]^_eux  &'(D.14;?EGJQRSY juwy%   '(.=AG XcegnoEuwz   -8:=DEFLNQX\brvD|  &136=>?EHKSW]mqwy|D  #%(/28 ITVY`ab%hjmstz| !' 8q  C"E#H$I%aj&N'OC*U,W-Z./a0b1c2i3 lx4{56  79:!;<(=)>*?.@/A 2 >BI YCCdD gsEuFvG| HJKLM#N$O%P+;Q>RE US`UbVeWXlYoCZu[x\{]^q a_ abdeaAasfg hijkl mopqrsta t"% ,68;BCDq auJxKyNzO{ads|T}UXZ\_fg m |  #%(/0C68;BCDJMP !W"Y$_%f&n'o(w*y+|,-./0 1% 6C2A3 D P4[5^6a7i8jq ΁9r;t<v>w?aAaΓ@AB CD)EFGHIKJKLMNO PQRSTU+VXYZ[\]a Δ|}~ /:=@GIDQTW^`agjmtu} %&'q a^-`/a2b6casd8e9f:g@iBjEklLmMpScqgm ~q r t uvwa&xyzC{}~!()*025< = C FI Qq ѡ[]`da2ѳfghkmorz|} " #$C%'()'*(+),/-2.5/=0>q ҁ1F3H4K5O6aVҕ78 9:;<= >@A B CEFGHIJIKMNOPQ RTUYZ[\]^_`abc dfghijkyMeT3KMV4)2 C MW o }CLMKM'2MubC=M&t | ?Ml>:y^~2M%=s1I2 _Z@ki,>a \a+ғQSTZ]`gkqsv~  E!(*+134:;<?ADGNQWY\cdeq 1jj/| F#RqBc<&(*("+#,'-*.,//23569q"16:7<C:D;H ?J!%M&,N-07O=PASCFTTV[`Ua X|YcZ2D>^q ((+#`O%a1uG L 9A0{2M-m{2Mi37k: 2#H'pW.u3 Q2M[aa5^>7q )P6w7+,Irvm|a1M`qbT>{E:2MKc}3.D aaa1JqRroIqKwMxOST U W" Z?0\q+1_1a3b5e:g;j<k?oB@IqJALtSuVvXBZw\x]zy{_|`~/aq.cTdCFfglp rG s ug    %/a1E6G|qITK( L M PQS)54_a1fk"a)q 2W7c9e=f>hAjClXDnSpTqsWtZw^x0`{%eq!1  > [ #\ %/ 6"8$:%"]"]z"]X"]6"]"]r"]P"]."] "]j"]H"]&"]"]b"]@"]"]|"]Z"]8"]"]t"]R"]0"]"]l".Jy^~"]%"-1I" _ZPk"Y<>a a\aAu})a]A'A}[BYs} B %}?B=W}qBo }#B!;}UBSm}B}9B7Q}kBi}B5}OBMg}B}3B1K}eBc}}B/}IBGa}{By}-B+E}_B]w}B)}CBA[}uBs }'B%?}YBWq} B #}=B;U}oBm}!B9}SBQk}B}7apA5Oi  #= ]w 1Ke 9 Ys -Ga 5 Uo )C] }1 Qk %?Y y- Mg !;U u) Ic} 7Q q % E_y 3M m! A[u /I i =Wq +E e 9Sm  'A a{ 5Oi  #= ]w 1Ke 9 Yq Сjj/| F# Rqѡ2s<&(*("+#,'-*.,//23569q'ҡ6:7<C:D;H ?J!%M&,N-07O=PASCFTTV[`U|YZa>ӡ]`"D>^("(+#`O%"uG L0 ")Q0{"]-"] "]i"#Gk: "#X'"W.u3 Q"Z[P6w"7,Irvm|"Oq b" oT>{E:"]K"S)}#.T aaܥ^N7>+Aa+Jq broIqKwMxOST U W" Z?0\q6_1a3b5e:g;j<k?oB@IqJALtSuVvXBZw\x]zy{_|`~/acTdCFfgq#lp rG s ug    %/q E6G|ITK( L Mq  PQS)54_q fk"a )W7c9e=fq>hAjClXDnSpTqsWtZw^x0`{%eq%  > [ #\ %/ 6"8$:% <'J*Ka - _B7C* tNfC"]"]z"]X"]6"]"]r"]P"]."] "]j"]H"]&"]"]b"]@"]"]|"]Z"]8"]"]t"]R"]0"]"]l".Jy^~"]%"-1I" _ZPk"Y<>a a\aAu})a]A'A}[BYs} B %}?B=W}qBo }#B!;}UBSm}B}9B7Q}kBi}B5}OBMg}B}3B1K}eBc}}B/}IBGa}{By}-B+E}_B]w}B)}CBA[}uBs }'B%?}YBWq} B #}=B;U}oBm}!B9}SBQk}B}7apA5Oi  #= ]w 1Ke 9 Ys -Ga 5 Uo )C] }1 Qk %?Y y- Mg !;U u) Ic} 7Q q % E_y 3M m! A[u /I i =Wq +E e 9Sm  'A a{ 5Oi  #= ]w 1Ke 9 Yq Сjj/| F# Rqѡ2s<&(*("+#,'-*.,//23569q'ҡ6:7<C:D;H ?J!%M&,N-07O=PASCFTTV[`U|YZa>ӡ]`"D>^("(+#`O%"uG L0 ")Q0{"]-"] "]i"#Gk: "#X'"W.u3 Q"Z[P6w"7,Irvm|"Oq b" oT>{E:"]K"S)}#.T aaܥ^N7>+Aa+Jq broIqKwMxOST U W" Z?0\q6_1a3b5e:g;j<k?oB@IqJALtSuVvXBZw\x]zy{_|`~/acTdCFfgq#lp rG s ug    %/q E6G|ITK( L Mq  PQS)54_q fk"a )W7c9e=fq>hAjClXDnSpTqsWtZw^x0`{%eq%  > [ #\ %/ 6"8$:% <'J*Ka - _B7C* tNfC"]"]z"]X"]6"]"]r"]P"]."] "]j"]H"]&"]"]b"]@"]"]|"]Z"]8"]"]t"]R"]0"]"]l".Jy^~"]%"-1I" _ZPk"Y<>a a(A<<V[ ]iB<?!<^!<: wND<  HRY_EaB<{8PWBӡ]`"D>^("(+#`O%"uG L0 ")Q0{"]-"] "]i"#Gk: "#X'"W.u3 Q"Z[P6w"7,Irvm|"Oq b" oT>{E:"]K"S)}#.T aaܥ^N7>+Aa+Jq broIqKwMxOST U W" Z?0\q6_1a3b5e:g;j<k?oB@IqJALtSuVvXBZw\x]zy{_|`~/acTdCFfgq#lp rG s ug    %/q E6G|ITK( L Mq  PQS)54_q fk"a )W7c9e=fq>hAjClXDnSpTqsWtZw^x0`{%eq%  > [ #\ %/ 6"8$:% <'J*Ka - _B7C* tNfCh(">G"P&' wa!!GyB" W em t 1 0&RJ-U*s H # D~zya!i6:K71! 8HOq!.!!HKM"N4|5} ;9<O&G' 0() a/!{.Q/$z^#rIWa/5&Q/7)q/EFNQTWZ`bdkoljqQ/epa/uLORUXq 0!eQg"xR1S3T8UAq 1!CV MWXX\Y`['e\q 2!!]I^4+_a`{a~q3!ba!(cDdJeR1UfYq 4! ]grh i"a5! ;jFk=[q6!lm#2?nHofpmqtrvq7!ws{t uv%w)x, 2y ;zH{P|a8!U} i~ JU]o a:!1D X eq ;!ov y { Dq !   (>HMq ?!g-q ' 0q @!E!G""g# $&qA!#(n+)<*O+R,b-lqB!./ .0=1 D2P3W5^qC!_6f7i9 m;1|</=4>;q D!=? Z@eAgBjC l5"xqE!DE"F)G1H:ICJFKM_ RM_Pi6nNsqF!yOPQ.S5U:V@X CmOq G!WY`Zp[\ ] ^$q H!5_9`Ca"Eb icwd qI!e g;#h%i (j 3kAl,Dq J!!qmn o+pJq K!OqQr Xsz3t/(qL!+-u Zvfwlxo5yz {q M! |};~?4 ETa N!)i-D#HX]`M4z''0aO6waNK.%q Q!Xu 0aR!]6q S! $ . D R_aYx'aT!"rw6"P$m".N0 "] "jYn">H   "&?0Sa TDx%>O1; Lq [!#) ."<OhQ Xa^9m;a\!]b"]@"7#Ns"Q| O"Z7`0" 8CLIa^P"28 54!"q b! $;!n^Q`%eac!(t&'(T2q d!R( k\x)* ae!0+I, K-7V"$.74"Bl/0051 >"J2^37e4 q i!(u * 65D #bq j! 6 70#8Uq k!d9)v!:*;:alM*al!+Bo  ", Nln"~&5"C\!a li< =Y>?@:ABC Dq p!:EMF _GkHq1Iaq!]q r! vJ KwL$$) Jas!/TM*N1manuskript-0.10.0/libs/pdf.js/web/cmaps/NWP-V.bcmap000066400000000000000000000003741354442177200216520ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSENWP-Ha !"OLRPOSVYTWV[A!kM@rA2a %uI?PgOx~}S-POmanuskript-0.10.0/libs/pdf.js/web/cmaps/RKSJ-H.bcmap000066400000000000000000000010261354442177200217340ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE@<?@< g` ^ga@>y,8 em t R 0RJN>\s i #DSQ 7 w WE$$a]eC>C|a*@>|>C>;|zC>w|6C>3|rC>o|.C>+|jC>g|&C>#|bC>_|C>|ZC>W|C>|RC>O|C> |JC2G,]zC>X|C>|SC>P|C> |KC>H|C>|Ca@>@|`?Fa@>||;a@>8|wC>t|3C>0|oC>l|+C>(|gC>d|#C> |_C>\|C>|WC>T"a\manuskript-0.10.0/libs/pdf.js/web/cmaps/RKSJ-V.bcmap000066400000000000000000000002521354442177200217520ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSERKSJ-HaAO Q SV[AmS amanuskript-0.10.0/libs/pdf.js/web/cmaps/Roman.bcmap000066400000000000000000000001401354442177200220460ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE` ^gmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniCNS-UCS2-H.bcmap000066400000000000000000001362301354442177200230020ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE!a ^#A %J C<OH A3Z[AA3d    .% .% U "!":a*.)aA %*s;< a!29JIy{&(apjqan pA "h  |"D A!f A Aa!` W&xuwvy|{U\ih~}emnpod] [^Y=gja!p 2R> z a!--,A %7 Q%PB%%%%%i%[%%%e%a%m>A@J "A %> A %0A%a%FA%It6A'=@A.H&a. !A.\A.Ɗ A .# a.vO'Lce3 *a[$QyAj a0:9RA 7U=52ea..013<FA3" OFANSAW45= R#E~ZTD F! VL\ S6Z }b h Msz)l $6  <; A^e\Zxu>A 9 t0-u@p5I 6UDu oT_|V=s3D`; |gm"gFCBP 0?_ fypJ7|'(hD,O|c r 5{(,CE2t%nQ"A   </) oQ>Nx7:,'I 5,1 \w" e0 -&ky%: M B(];3B1 ~GX0b;!judg.jYQ"> G\P9 < Rc ZBS=8)L0w #9oh#'=w|B&$#6 ;.) GK%2PM&po waX#BB%# },, bA`.  D(gHlK#b -0K!M6](?!> YO(`)M+^a R{6 &*%TK6Puvb  M<* <=!< .45C@, .6h( NgrQ Nq=JKANr ;aNnAN&(!$R|y$T85x,P8AN.{$JKG AN!m>m6 F> V  f APNa[aPAAP@  | zAPj   T  VAPEixDifQ Pu\WlyaQAQ RA QzAQ FZ aQ-7uzhAQ?\.j2VjAQ;<AQ9FQ QY01hgBx;XYAQe]@th=aQm,AQq P$kAQRAQt?c SaQAQ^$e *AQ3gAQ#8aQSAQLAQjAQ& Z+*aQ7I4K[6QQƐX"e$-9D$utAB#A Qܢ eF>2D}0AQuXDAQہ{\[FaQL`u1 aR HaQ 3!YAR t#ARGZAR`-aR);RQAR6S  X 6AR52/. AR4{>saR^=ARiuGA8ARVhnsD,AR, ,AR\ N?pyaRPAR *zARO F nAR%JhxaR5y :AS Kk&.T8dv[,HA SBz!Pd <Y*AS'Q28,aS?ASAd$2fX),0 shASLd\sASBG  5D{XaSpCD\M`=aSr< rpM=aSt{}ASN&AS,H/AS 3Q SAsvB5|;3lAS_>W q" >Z&J!@ AS~,oA S"/45-o/2Q S  A S"fO@C QT(JS  \CATQ TG>'f. PQT##/ {~s\G5 ([E.OaT5XA T8V '&AT7@ ATKQUQT`.ux {z_?hQ To,0-2O  Q Tz%{^qpATj\[bQTu riRgdmveJ7ATrf QT@ QI% !P AVUD["QTS(g+FYZG)D?aTATǍX ATϴ{AT#QT nQ TWO(voC&I6ATor5QAV%x!!aV/Q V2ne07AV?pAV=    rAVC~ z"'mOQ Vh  Z WPU` ]AVv"\oZbjQ V~GAV(?aVBAV9VAVA"AV& 9DGaVAVwYAV  AVw^aVJA Vچ-~p *ZAVk nP*4HAV])^    7:a W[yt68s7YdAWzAW!FAWH/f^{aW"A W(/  AW*R zAW2y 6"-Q WIT_^W ^AWa}AWbAAWT@Ix)aWs?AWwz L]\ AWu= &   AWz_x+!k> BaW A Wi #AW2 H3A Wd^ \^Q Wܼyv%AWQW LSmxy j*"QX{$ {5 vAX z)J |Q X  `m AX,m%aX0Q X2^1L AX=q4pQ XGBAhQ P AXQg@OZQ XWifefT]kpAXbp fAXc : AXie\Q Xy'2 ! 4;6EAX(~ >C ~8A#X<  ! J  j lrA XT 1Vg6%: aXxAX{ ZAXz&" tAXY pC]aX AX"q@: @"g>.YXcbZAYAX\Z /aY4A YN]RAY,,AYcPaY76TpXEA YITwX/PaYWAYZ<;ZvtzAY\2 8AYeRQ YpF,)dpqNCQ Y{X7: /; x AYSQYòOh].5tyru AY؍u AYֲP4 #AYفqQYxfc:N%. ! >Z)KLuTG)A Z  AZ u A Z #KMcaZ-pA Z3wH-lE$Ef)Q Z@K Z!\DEAZL/QZP( @W6!8M4!8MZ1/: OnC BAZp0Q Zw#$T] YA Z&aBIQ Z+8Z|D1Q Z M>+~-QAZy4lQZ|rYn  ify 4eQ Z.ov_z&XAZӁQZP9L OJAo=AZ]W< 0Q ZuA*}vA [/ r85HA!Z,`g V&+da>c  A[ a[= A [@pqfqJKa[PF3?a[V\a[K|1A[\~2N A[bW>~A[fN}Q [pQ0w$WkA[zF\7pUT9A[{XA[| a[AA [Dz,A[chA[i 'a[OA [( A[y A[{Q [VFI# A[̘,A[PA[ՁRa [88@`:>a?;A [9h01n{a[YA[(|A[{, RA[ qta\ /Q \ #TS0r/A\ 9* EX*&^.Y$A\:ONA\j>) aakkw^1@Q ], !  A]LA]5Z~PA]X*_a]MA]ɬ6$j#@4/ G^,4:A]N^*A]ׁ,a ] Ka I6 9A ^IB<A^$x6A^ @mFa^!JA^%4A ^$Np B6XA^.5Tia^XrQ ^[EJeeA^f8a^g6D]M\A^o9&Z05Q ^x13H^(R'xA^A^&|"A^a^5A^3:2A ^RfuA^Na ^QOsrpP=t=Q ^Ę? $DqQ^Ё= ed_V !w!A^>{a^OA^)K |^*l{xlgA^BF$6A ^P^\&a _N?>gMzs08A_):6.  A _(rFl xZA_:NQ _HA?"c,E$Y|A_Tv@AnWITl+fh`&KFGJtwA_oA_\Znya _;w1XA _& A_V2A_,Ta_BA_zi~A _2@t~:^A_ a_QA_ÅP^2` AHGBA_ɯ'&' mju  A_ājAHQ`  M? ]XtA`~ maJQ` !-xx= 4c./ p A`5G D  A`2.Z[ L]XeA`1a b?Q`b( jLU fe'A `   A`r\ p{sr  A`uV\}DSKQ`\=HIt<'>/# ,Q `ýj[ CZ/A`јEa`^A`ՕQ`ׁ5K" 1(Psj^|)A` tQ`NN_wZU~)gbLM enQaDK8MuJxa h|AaWr~  xzAa?  xITOpeFYAav |aaIUR^2AaT Q aXXBGpj}x_jqaabTAadsE1k zQ anGpir iVeA a|K L?<3 AayP |a Z_XSAa}=r 5ZQaOf'T~ G`L2[ [dkAaa[,oQ aEk927/ RAcUI.& A cT3, j" "AcdG Q cu~+J@c#AcK3*16Q cz 0[\%3AcL_0)Q c(,"W&!vPIQ c & AcWVQc] # l  Zg QcYg{f e6= J7ggxacgAcj t AcR,z  $$ ? Ac^MHa d(r$pluAd*Ad$m& Ad+Q d2YW.+8=ReAd=! k^Ad@ Ad?.  Q dX\( OAdgcjihAde2}bAdq[adrQ dt ()vu A d[ Ad-|\U '0Ad#>Q dht%$Addad;Q dS (/ A dǥ?0= *)(9AdRAd 4QdZ|uZ}w @?Adhh  $adVAdTZ[Z&Ad.  L .%Ae 6Q eR?(}i*1A e/USTBtA e*{LmT>xAe)R .&aeHVA eO=   pAeJ>FAeM aebrAefqrv<1Aedo 4TxAeklna ewosrt[ZonaA eV8}*-;RAeOXAe#H{aetA e,v!ZZ~dlAe"@Ae5L MaeuAeY6(AeY@|Ae'o4^aeAZ@EAe; d$Cy6 WX"Aeq|NAeс* aeZAe:v A exL AeJQf{\ g L ITedab_Af1Q f zAf+ Q f-GrAfAb RVAf9 n ` A fD47:&a P]^Q fvz(-zB;Af|\-af0A f/ sj p A f JAf ! xQfH/ t61_6A fc vw+"+af[\;OcNa fdcZu| 1af`f8wbr31ZYAgp 5HAgpAgD EagHdAgfRd0|{Ag0VAgO Yag*JA g,I 0JAg3  H Ag6A 2agN=A gSG  ")AgU& AgafHq go <7 FA gz?CXeh _ Q gp]ZAbA g V[fr,]Qg4;  }'A gz;(?"5ag8Q g˶</Q gXjeo.;e ~Agf*QgYB78&9g";t?AgPVAg0XAgUi=V+KQ hKL=Jq4}PA h%d c6 ah2MQ h4[ 0\kl)/ $Qh@w #@?#D =^7AhSkBy]ahmA hoAQh{6"1*7(nil@  AhT%A h%>!/2'(Ah*QhdzxiNAhNQ hÁ\ '*&3"Q h9fRQ AhڙXah'A hߙ x49&M Qh  Es.? * Qi_8?1wD1kA]f  t$Ai0>A i$ Up+$C Ai"Et \Q i;71Xu$)pQ)"aiH$AiJ@n;BQ+iQ<uS"#S`g &9P%$c)|)X!9H_?,3"ZMqhqbO:8A i>^Z/ZW*1Q iWAp 4E?QiZ;2,aE34A2 rA;JEAiRQ iw YX?AiaQ i>(?(7hAiӟsA iQZ & # &Ai<B QiTMc;  P5zB 94sAj7Qj}$>G6EF):;%Aj#uFAj%'L  Aj+BPwQ j8N Li@IHAjDT6S_'&ajMQ jO|bs_ ,HAj_Z  4Aj]o$ #" $  Aje` ij[Q j+8[( /0Qje?!o%,:EAjg@ajbSK\=h:Aj`(5,TQ j4pJ[Aj$ )>Q j*-=l5< IAj&wajbAjxA j] rmf "Ajja kF }CNLAk ^lA k%IfP$% AkOP  ak7=A k92-,10$Q kECqv @E@=Akb_Z,HAkP.&fDA kQ$KFIhNakfAkjiA" J]Xf)()[Akv"Ako3bxakAA k@l5.32ake'&%(  A kqh$ =&Ln2[Ak 8AklakhAk˅aR{vD@Y<'&!Pl\Akb@Ak܁Naki!;<LKyIQ kO4HefAldVqAls 0:,Al hNHQ l3= 8ofTA l=[05p@*alKpAlPl  HAlOAlX:"al_jAlan"3>K3BAAlx0:uXQ l}[-,,E4alOA lW/A lb]0%JAl 2Q lo 2GPMtAlSSRGal'Q l6^kNYNQlɎpmjPK)*eLQ"Q lٳRv+Db1Al%Q lVk>{+%PyAlVQmU0-0)-9g*!Amy AmY*AmQm$Cze!&01 Oa 881"1am={AmAt4A m?K" H AmNXKP amcvAmeAmg#Amqu=Q%mtAU6@ BQsRs nsR+v3 W'.3Am'&AmFAmv{ zQ mMx9}\ hAm¾aQ mĖ +2"G lQ mϾbUF/ &C1*&amWQ mޕ|,C4:oD Qm ~'n6+6oV5Am} }VAm?1/ Anzy\QnB- ne ZavcJ/an5lq n8&_:SE>JQKanC<DG@AnIC1HQ nM9bG.wkQnX1hq}N(# DX#Ann4 (A nk^! :KN50AnvS .yanTQn_&3.g] .=H)}Anc Q)ntG0WXiy@E~;" p&g>'vnhAnh*!  anAnW>a6QnF@[t: jS>j3sjCxQyAo{i"Z+aovAoQ o X)|mQo) "j5Tc#~};r/xq|rRAoC jQ oNukf}^&!SQ oZ9Q^y({T#4uAof  AogJAotCQ ov;,VS||5>'Q o XS@-2@1?AoK3"-EQo99P7)ezo r\S # t}Q o(t.IVC pQ o1H pC)A oӁHq!~w2 aovAo~    jAo */ KJ Ao7 Tap CApH7Q pGq: G2;TONW@ap!/Ap(   Ap$4Q< xnAp,apLzHapCX][Z  apKTApXIQpZ#^QJ -\5apiGApkffApq pAplq@"ap|gA pC Apw    Z A p~Uz A]N!6apkA pe/4AsSap'ApȒ!Q pʒre# apYApؒ  lA p׺!!  "Ap߁['Qpt ^IS2 yCp/Aq~^Wa q }qmuyoHQ q|[n/GTAq%vY^\nQ q.sMP6-#AAqFrAq:{~  )Aq;E/RmQ qIjr?-6K?8[ %AqVt9HQq\l* ! .1AqnN( A qp<  A qq@Lu$S_t *9 Qq_}vwn t>sQAq!$ A qd ,AqX;aq51wAqȥq  A q0  Aq=aq@A qܥv   LAq  fAq݁x o X)aqnAqp@A qTPMLAr ;jka rtsSia`{_ A r"$NRKFDEar,EAr0tI<6"ZJ@|AG:ArD"Ar.yarIoArK}[xv'XQrU}76WQ$%ZM,1p4ArgIArjzlxArf;ar{A r}NcsRe`arQrlqQzHMytArg arB:?>=;A r|r0K 54 ar ArK; <ArK hls   rAŕJarA r7  EHzQ r5%,5 BAsAsv  x r As5 hQ s%Tp~i2('M|Q s0iryFf?mAs>z`eVsrAs@$"~AsAleSashyas^joraseHEDJIG#Q sp$bCBGDQsz.TZ 6#L'h\o2As,)asOAsoDAsMz Asv&_Q scf|mxun As A s As=Q sŷofE|`kAsҺB\oasGAsٺ:+Q s.IJU|y#,As+FQs+PE() ahQ t"^ebchrkAt`At Atl eL] -attAt { Q t(bt v ef at5\At7aN(Q t?)(;Auǒ8au#4 "&%!0Qu+t{JMyxypAu',Qu0QZUX O ~/Av 6 lAv8  Avav!1A v$/{r ( Av#   6Av,J5javH4Q vLV!2SN%TA vVwF6A vWe HI`$Avf*|Favq#kC/q vx*ncuSVtavY+Av@hvAv( "AvT av A vd8`h*&A v7^&6T|<&MAvUa vC7)6U.8s@Av8v .3dCQ vi&/BwrsvAvQTK aw956Fa w]a_^bc\[aw b^Aw(HAw"e " Aw$hlYaw1-Q w30qXYhqjoAw@`R3awF/46AwOt : AwM2 AwXcaw_BAwa=AQ wefYT_ bnAwrkQww)SS~'   Aw7A w<AwawadAw "FO@?Q weH GJ Awsaw|z{ %a wjHF~e)Saw1AA wڮSY$z&ILFawAwIQ w9 P~Dp3~Aw^8A w   AwU ax ='&%"Ax<  Ax*  AxQx%PTa@ /6CP?8G6Ax7O f hA xE< A x9VyaMLRQPUaxd;AxfQ xhDn A xyW"mNK`% axSAx$  AxMAxax!A x?E@vAxXyz  AxlaxAxţQ {l(qo$+ CR A{{)aE8=&Q {l;B?2HA {S ~ zs=2 A {o  b  A{Ka{OA {ɦ* +.X Q{ mZU^A%ZMRMDSVa{iA{Z Q {+tA uq{bA|XQ | cih ")$A|aSQ |YG ib_hmQ |%ona 7A |0" e^]a|>#A|swA|@((`HrA|BN*ID)VPsa|x;:-IL=A |jJv X4A|  vst>~A |\+ J !c. Ja|YA|΂!A|ʣTA |{6O`a\[$a|\A|٨3   2A|"kVtA|Ya|-Q |!mp K~A|{bQ#}Odkd] ^c:rcR iX e\mhUP k A }+{    A }(r A}%^a}>nA }@Y$-2Q }M][/:5"A}[Ci   ~H A}X`  F  A}ZU+ NQ }]PK\af]4*Q}':#RN a A}-FQfa}^A }g8;Pia} A}́nOZDNQ }oo? ,,cBYFA }](u 7*9Q }@SN7He:oA}d,G>S+Q~MW| qb A~unka~A ~!u4 sQ~-nsh{ ncp texg bo`m~kdA~Ly qta~T A~YA ~V   @A~eRa~i,A~k) 9Q~ragfchfGHvuIA~pa~mA~lYZ.Q ~"v7LQ A6y4HNA9A ~;A &0a>qAC&ApQG_* c|8Y{VF#YA XCR a`aesEAnDRO:Ak  VLAqa{'A}JQ /nx{Z7^6a A DTVAp .G&aubvAu$}QC,k8JFTY;nmL4_a6kfAŒ|adef qoaxz~{xa^Q `<=G>3za+GHaiaQ Kq)$A A2aHA W5HO2AJP#0e|0A9FRA <a ;4ihzARVL2AQy F^@AT@7aqIA sMx#T=]XLe`Au2\A~aA~` Y^A (   JAv-(#oa^Ȁ`A ŷS  AtQ }K{~qfaAaZ 2 lAN  4(   t PKA過D7 k  $ 9*~du ~Q J9 4?6#6-TaYMA eR SJA [   AmDayVAz nA  \A|PajAm AP B     AS_ eQ2Ej q nyxD3fAataA msPOJ2^#a]Q  A4jAd-i>raA}hU\<4NHhH#\<($A^< q"^A n vQ a/DvSkD`oA%?g*a*A,h%Q 2K@?@a< AGZLA ?: ^ A>(aU<4Af6AZ 4AbzahAk& Pn(Q tjWH7iaeAjA `x[A2Qz|w` }t}`{ za ti Q y u t=6wA0BlQ ρdG \mLuAۏmQ ޏzr6;  vQt<7j}pQc& v7avqa  $JV=A 6 gQ SS>|i iA UQ $T,gTe;A/WQ 1, 07Xk ~N0A?G98=&.QGY}|  O BMz{AwAVF0&9AW] Oh a{A}) ' QSb e^ OV"]LSpyX&>CkAQ z@ a( c0A9bQ|8s?vP01WLU.[/A6B%X*7RQ B}:O+f2CQO38`a  dub!A0&ABKR= A_Q ,e  T%&3B.A 7{sb= }zsQ+coJ4;+;X&1Cn3 &*ocQ BQ0-Cbtm+72QPga@H1J5qH?5l3 {depW-2JoQka v d%C$-Z/(A[ dA}=FQ JO0#AN>f .Qo:}\m\cB:?$DoQ 9 <=$-]A1&Q H Wx.CJ Aġ(-pQ ɡf4Or{vA CXU<tar@aA{A/Aw &- Q h?; yBA}Qk[NJ?azj.5Ag&7H!Q #xFA 9&5 a,tA .| LifY:Q@F0O + Q QL8M. -F=FA ]Z7.'  &ah9>A]=SkA~\A qQ6'AsxQ.7m$ wd#<)A_jQ 1u ,;'Aep ~AA& Q HG   Aͪ0A":3 Ama8AQ wv B%Q %W 0MQ  A4#2 A,*In>Ya4'A8A6, NABAHaF_A Mj^0~Hn/ARc2A K>Q~(p`hamFAq j\A oEpd Aro KQ x!}  A7AwA zQ `e5wbaJMQ =ehfe rcA˗nswQ m;u|y~wAN F AE >    AqavQ i} s\ ApA A n() 4a&hA(Qm 0 !q ! QLL` {j& ?,$acQ e(KRQP!"CQ s)TU L A}EQ hSb  AbgW(Q ?$&Jg$A !&a,/?A04 Q v{~P.3UVMD:)E>YXA@A6(:lA5^.paCzAHSbvwPrH1Zij{n  AZ/AJ PSTv ]a u}9=<:A xA!     AwOi (aA \   joaR 1bx~yAjWwQ ԝ| fA1~}tA  E0 #(aqQR#&+$y3 A 0 UZUB]Xa284A#LAw A$wa-zA2GTA/"  d ACa PISDBQ \30 6a"CAj Ai FAwjaybA4{e b:T3t 7( 8yl|c25T>_n&cH3JWr{>Ai A^/kDagAEQ z >OA~aYA )n$cH=HR9aAv  L  |A  BA# )Q 8z hC#aDpAF`  AHsAIpaWnA[^ v   AYl@AgarAy 0 TM/2At   r A~%mQ ( !*AAI D9Q DG\o| _^A¤  AOAaGQ ֤V^A^n AM    A   AYaA [j szaVA~@Q {H*!_TG< ?0KFGbc\Y:6wA(*A"aX  A-Q 9+fH+CN AE 98aL;IQ P" Q A\EbaX<7Q e:ih|[ lAoGazA} bBA ~6 A a-gA7 ATVM8)Tb%>AB#Q EAkx:bk`a}ATc-tEa\mxe A j4PqpFH96A{ FAopda 65UA_$Q d$E+vDEaLA.xA F AqQ"s  " pa  8Aӡ7 e|{Q XlGXi^cq ,)V(\Y./*A`JTA  2bA Ea3AMxA 5@x oHA s;a YoB/F0/!A k:lCx LAl(]FBAzaa%*#+(A <$)HYTYQ ,-3?4A xF  AH0 NA @.Q zq %#Aߞ'     Q =, Ri A Q Mf w LM Ta&kA)9 ZA.e A()l 0a<(A># Q DaV1_\ASw|nQY0 ulsv{z81AlS zAm:Aqg=HQ @e^[Zg  AAMHIBaBC?!AIQ k@T}'xA /p GrBAѼP A ig$>wD a~  A \o `Q #$'A2! a 13?A>@a>Aa zQ vVWq nA %F HLA #y t A-c&aFw78zq M8WCBAEVDBQ XE *() ZON~afiA nk$ =Xd>%FuQX,NzBhI-D-$akAŠl    A i Bt AFs< GQYx &3r{~}A 6 A A` %Q 5~   A .jA-JA35QIE2~*A XD   AgAay\nQrpUF  BTYa^a :9;Y a}8GAA A|Q ]xAA r}AD aAݓ`FAۼ%  Aa F  A Q( !?2 EJ ;A M   QK 41,  A&qXa)Q +?-r kjha5;|~HGIq CHF^ dc*ARbJ vA P)R < bAQI FSanOAp8Q r,98A|oCaSPQRa   @A>alNAtQ OTYR QAa<J\I[LAƊ!fhQzPq JAP.2"',.XAKFK,L8Lp26iaAN A AxQ?\a UDODA ;OfKJ*aAA IoA(QQ 0S$3 1tA 3EAZ[Q ]WLG+AksNGQv1d#N5LQVQ>Gb^]%xA^Q Z4UFKd#/fQ 4" $_b1MA_   A0 1 A_TraQŤT4% do 4jyA  pc# Q く  qA?:n6aQYC>"YFw1UA@? A F@!  ;AQT#!"[]I|I* A3x@ S$()Q@UB{JEKz&ejyaPARQ T)d!.RQ^#.M 3U4/r]`"Ap'nQ s b0?%0',Q  V.I{AAkHK#Q? ~FG:S 2 # tQ E8= +./Aë`A,!!ALQQ QW'[l!eoX abA߫_AK(   A?TQ Z %#,'~"pASjQk/2&# ' AH:+Q $Cg[RmvA0'  Q 5   ABr-Z aHNIGeKH`A`A UHJ#- ,MAT*ah&Qj1f0#EDIH6sn:A{ya}]d9AwJA 8v?PL`|A zU  6M$0oQ b[ fe AUqj?Q rf |`a`A E%&)|alA PAi A) a *jLJMKcA  "pAܫkR;&X HA l6 H(-,?)haK#AP" AN 0AVgabkAdp@  ' Ak&Ai^avWA xT.XdiWa#!% ^aNPvta^A]Aw4FA- ~aALxw|#&znVYArz`A5a+UbA˞a .QҡitUN^+"#,)"A N<v"pnA XH2LAe6acA eN A:A tzQI/|)*wrqa +goV@#1B!2bAB2 % AXULA ?QB hx/a[A ^"VzS Aj*\JA]oA 7aw~Q zWcT cA @(/+,+QxKF|6Cp929AVA,TW PIHIHA5 01aLAː( AƮ5@ CvA ,@0;panA)R4A ZM:4\E[KtA恊 q s$N+_+0\2a nq pkomR<bnA l^_X A H n Ah tQ CC >IJaP7A S\.z{vabvAe&TH,Ad5b'^AEwAA;~ A@4 OQ P{EN*_$'"yA/A\vFYA[WLl@3G@ Y4fa|AZQ Ym'"'$AvxA k  NAK,(aUQ դwBC8AAߤtZ A   A>Q SVQ aYA:.JQ @ =4A  Qz  FO,1 bYQ )UP *LQ4INSVb ~#,1*-(-(A H]e\aUh7WXaSYOP.,-aXgA h<)8"!*awAq)`Q pmRPLIWburILA l/j]aA֮O1ZA߼3A /tC|/Xa{A&|A c^A  aKAfQ J*')$jmA aEckQA%x A"8.'TA $/EkR{yv^q8a>tzACeMJzQ JOOXM4AT-r[lVTa`vAoA dn   AiEQ z @K4+xA )&d & A,&'  P  ~   A nh&y71jq  aA v\kU\Q   8SypA_ A `  A:FxsNIa(OA-/zA+JH  A."7Q 9l"~ v',ADk Q Hi{T 0AAT>ART  2<AS7 =aw`A yAd2hax`/(ayA ~ T  A{p  f    ,A; k j wa.sA;?A 0w  A4J9aByAQoAExP AD+B)_Q Ve ]z sQ gq_TUN Kbat/Aw" Q{5#nY# $^)MFa+A$ Q3 #!Ta4A1A .pA0a`Q ]tmS9GPQW*C@' @ Z7!  Af cFWD a;^QA8@=A7 Q ?|^]62Q 1$14}9PAucza |=dz|vr1A0"XWRQ1iqhjm@cfmz-JrlQJK<pa`6BgA2DxQ f0*butm0A̮Q+t fAXkAƁV?a50FDAީC\`$A o`0A⁏XasQ>2mnu,n[v PAum2=a~A| AsA8r$+ Q" R8Sz50h,-(bA;pea@AQB ^@# tb2 ^^AR liXaVDQ YC>I943NSa f9Pt s~}|AFAw@pA x b*~As|-Z4aq #%+-08;=FPW egjoqw| $'1469 EGINPRU[_gjmrvy} %*/9?BJMOQSVZ_Ogmuy|   S!T(,0258:U=BEHLTWZ]aejnA q0/a2  %).026:<DGIP `fikox{ [!# .369<BD OSY[bdf]A+AqA_a48>EINTZ]_ hjpuwy    !%' )+-!14"8>CFKUY]$_%gpr&|   !(*02+48>BFJLP-W[dhlp/suwz}   4'048FKNR[^aiks{} 56'8*/8?DLUX\_cgnqsvz}  %'+02;68;?CI TX\^bfkpx}  "&-257:@CEHLQW\_?gjotx{ "(/36D<?FLORYcglotv{~  $(159<BFPTVY\G`dijmowy|~  A $   aeNVY]_cjmqrz~ !'),3=?CGMRW[]binx &).68<>ADFINPVY^bfloqtx}  $O+-259>ACHKMQUXQUZ[[]`cfA ]7#4Se$a>= #%)*+.02479<=ADFHKNOQSVXZ[]_bdfikn tx   "$(*,0158:>B%Ma02|PMha_\`bhknstz !'*+,- .<>ABDEGILMNQSTVXZ[\_`afghjklm prtuvwxyz|}~     !"#&'),/ 05  a ba t#mza ap147:BEKI mo T4 ;Cu|  15 7%8',0479::;C<=GK>OSVX?bfioAtxzC~DEINRXZ \^_`aehknprtv x $aduz| !| 4/247q 3/1 a IGKI2prt M_ qld./c0PdQg MjiVXWk m>?4EaAxq}abmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniCNS-UCS2-V.bcmap000066400000000000000000000002341354442177200230120ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE UniCNS-UCS2-Ha xzmb 918Qmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniCNS-UTF16-H.bcmap000066400000000000000000001423631354442177200230770ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE!AE%%D( C<OHg ^*gh '  "D Um, { Y *! 3( /y1F^7 A 3Z[AxxO@D( EwA8d    .% .% U "!":a*.)aA %*s;< 3Y<;A/gA/3A/`A/A/ A%t0H>A_%;Caj. R#E~ZTD F! VL\ S6Z }b h Msz)l g  <; A^e\Zxu>A 9 t0-u@p5I 6UDu oT_|V=s3D`; |gm"gFCBP 0?_ fypJ7|'(hD,O|c r 5{(,CE2t%nQ"A   </) oQ>Nx7:,'I 5,1 \w" e0 -&ky%: M B(];3B1 ~GX0b;!judg.jYQ"> G\P9 < Rc ZBS=8)L0w #9oh#'=>8B&^%/ 6 *`[.) GK%2PM##o wG%r ?#"L %#    )#R' bA`.  hc :; zyD(g4x KLk -0^B P5<-23 g8c)(`4&+^a  bwr!aB][lD 'T- & 6eI z  ; >7 HWTK6Puvb  M<T- <=!< nx?u+` C@,& 7P C 4DyDa( J$"n.[TgrQ Nq=JKANr p!AN!mAN};'Q N*WY=J,yns<;f /~%$1 Q N-j,V^7A N 6/   & 3A Nc M, A N< \k<]Pu7Q Nlu~ot`ANQ N*Ikp A O x dA O= nAOS/ Q O6.F]{ AOC%.5*+AOA-2AOBK7QOR+ &+ +  y|AOg*[32?QOrr~  nq '}n}AO2 %AO$    AOGl91>-Q OǴgYX^kCAOӴ\Q OִhkdWZ k A OL-%(AOln $AOf- ~Qkd^eQ PA<7\ADAP=ZK0WQ P%8jQ&,5|;A P3%TEtIQ PEF ~y~w|uAPQQ-iH9Q PZ~ | APeQ Ph8a#"~PA&Pt \  :   | zA2Pr> V  f     T  VA PNa["ixDifQ Pu\WlyAQ?\.j2VjA Q Rz AQ zZaz\_nQ QY01hgBx;XYAQe]@tS<P$k `^$e *mL vA QRrg jZ8AQj< c SX8 5Bi+*l ]QQƐX"e$-9D$utAB#A;Qܢ eF>2D}0/Bhg HUT{(    XV/!NYvADK@=6 G<0cRf(2KJOp[~sD, F S*z WF_lSN9&.(Ptgd8rv[,D*)s$2 defX),0LAs>WJsH%g,Oq@EAQu A Q"D%d#Jh;3('i^ ->I:m2 O N?p U"UQ28,  5D{X  3Q SAsvB5|;3lAS_>W q" >Z&J!@ AS~,oA S"/45-o/2Q S  A S"fO@C QT(JS  \CATQ TG>'f. PQT##/ {~s\G5 ([E.O A T8V '&AT7@ ATKQN%QT`.ux {z_?hQ To,0-2O  Q Tz%{^qpATj\[bQTu riRgdmveJ7ATrf QT@ QI% !P AVUD["QTS(g+FYZG)D?ATǍX ATϴ{AT#|ET nQ TWO(voC&I6ATo ATRAT,QUfJgM.;B 7A'TByA UFLE8 K rQU*apSzr}oX{ |AU;p'#8q{Q UC&yrA UO* ./ AUM^ 6AUSJ U c.0pQ U{{&3" $QU.Qq)f_ AU&QUW / TW jyAU  AUM n -AUuJ7 QUǛYdS6"o`GVcX N9c8GNH%AU_oh AU  AU|Uj Q U7 ds3 JK<AV5Y &Q V.!\C9(Q V8f@^ >AV%x!!Q V2ne07AV?pAV=    rAVC~ z"'mOQ Vh  Z WPU` ]AVv"\oZbjQ V~GA>V9VY: nP*~HMHYX]RY yZ<M+<C@? JK RSAWtJnA5V(?MK"9DG  loJ%)^    t-:/f^{f c"-Q WIT_^W ^AWa}  L]\  #A)WbA  &   2 H3AWT@Ix)l +!k> B6^bm\^Q Wܼyv%AWQW LSmxy j*"QX{$ {5 vAX z) AQXe |po `m AX,m%Q X2^1L AX=q4pQ XGBAhQ P AXQg@OZQ XWifefT]kpAXbp fAXc : AXie\Q Xy'2 ! 4;6EAX(~ >C ~AX<  ! J  j A XWT 1Vg6%:Q XΧB/A@XةMZ&"K ZV q@: @"g>.YXcbZ7N]RZ[ FIN'~TwX/P&"gUZv:GzAX )AX܁Z^C]BZ / 3P0Q YpF,)dpqNCQ Y{X7: /; x H3QYòOh].5tyru AY؍u AYֲP4 #AYفqQYxfc:N%. ! >Z)KLuTG)AZ   p A Z u H@E$A Z #K\OMc`Q Z@K Z!\DEAZL/QZP( @W6!8M4!8MZ1/: OnC BAZp0Q Zw#$T] YA Z&aBIQ Z+8Z|D1Q Z M>+~-QAZC4lQZ|rYn  ify 4eQ Z.ov_z&mAZсF QZP9L OJAo=AZ]W< 0Q ZuA*}vA [SX2N A[/ r85H t>~A1Z,`g V&+ 27da>c  ^vqJKu\\8}Q [pQ0w$WkA[zF\7pUT9zBA@hA[{XA[|  HQ [ZnqpA [( A[y A[{ Q [VFI# A%[C>G@I@P>MDE h01n{,!jC|A[ՁRM qtA[ہAQ \ #TS0r/A:\ 2m* EEi&^.Y$&wPRW(BC>WPAL>(_JY 87. =4IHA\mA \j><%5 7f uTwQ\Za~ u wt A\* J.  p   A)\`0    nwx  p A\+Y C+ <C"#cQ ].K4 UJ-$ A]G5A]<("), .M <[T A]>) aakkQ ]wih]J? A]C dA]f   A]4^1@Q ], !  AJ]L 6$j#@4/ G^,4:wv'Uv67PIH~ <xn9<A&'hidm"XWA ]5Z~P^*A ]X*_X<mF TiQ ^[EJeeA^r ZA^kM ,A^f8i0G&Q ^x13H^(R'xA^F:2 A^&|" 2fu|A^ #=Q ^Ę? $DqQ^1 ed_V !w!A.^>{3K |^P'J6l{xlg\P5XM:q6~l?:/:;:) ZcA^P^\A^CLEBQ _HA?"c,E$Y|Aj_Tv@AnWITl+|efh`&KFGJtwr=|y &L70) 2/bYZ[tx}ibc^}^L&'5`tujuCB WJ UNA _\Zny0 T  AHA_\Q`  M? ]XtA`~ maJQ` !-xx= 4c./ p A`5G D  A`2.Z[ L]XeA`1a b?Q`b( jLU fe'A `   A`r\ p{sr  A`uV\}DSKQ`\=t<'>/# ,Q `ýj[ CZ/A`јEiQ`ׁ5K" 1(,Oj^|)A` tDQ`NN_wZU~)gbLM enQaDK8MuJxa h|AaWr~  xzpAa?  xITOpeFY^ Aavn o | Q aXXBGpj}x_jqAadsE1k zQ anGpir iVeA a|K L?<3 AayP |a Z_XSAa}=r 5ZQaOf'T~ G`L2[ [dkAaa[,oQ aEk927/ RAcUI.& A cT3, j" "AcdG Q cu~+J@c#AcK3*16Q cz 0[\%3AcL_0)Q c(,"W&!vPIQ c & AcWVQc] # l  Zg QcYg{f e6= J7ggxA cj t  AcR,z  $$ ?  + 45&<' Ac^MHQ d2YW.+8=ReAd=! k^Ad@ Ad?.  Q dX\( OAdgcjihAde2}bAdq[Q dt ()vu A d[ Ad-|\U '0Ad#>Q dht%$AddQ dS (/ A dǥ?0= *)(9AdRAd 4QdZ|uZ}w @?A d[h  Z[Z&Adh#&  L .%Ae 6Q eR?(}i*1Ae)?LD k,X[T<{P]~x $ jsp|v:E]1L(N8}*HwN RTf ZZZ@~dl/be]~WRSJ d$C|NW6 WX">LILYd cAe0b snH{+[Y\ 6Ae^Qf{\ g L ITedab_Af1Q f zAf+ Q f-GrAfAb Af9 nAfD47:]aQfY nF5x X]A fj#tQ fvz(-zB;A f3  sj p Af| JAfb3! xQfH/ t61_6AZfĥJ 6lT(6 C>jE&T_  5&_ FRd0|{V 0<A0A2H=<IN G<I 8 UNM "6a"!dQD[hCXeh _ AgpK0A fc vw"+JjmL~ EZFQInB 2kHrHQ gp]ZAbA g V[fr,]Qg4;  }'A gz;(?"5Q g˶</Q gXjeo.;e ~Agf*QgYB78&9g";t?AgPVAg0XAgUi=V+KQ hKL=Jq4}PA h%d c6 Q h4[ 0\kl)/ $Qh@w #@?#D =^7AhSk!PA hk)AAhUyQh{6"1*7(nil@  AhT%A h%>!/2'(Ah*QhdzxiNAhNQ hÁ\ '*&3"Q h9fRQ AhڙXw x49&M Qh  Es.? * Qi_8?1wD1kA]f  t$Ai0>A i$ Up+$C Ai"zAt \Q i;71Xu$)pQ)"AiJ@n;BQ+iQ<uS"#S`g &9P%$c)|)X!9H_?,3"ZMqhqbO:8A i>^Z/ZW*1Q iWAp 4E?QiZ;2,aE34A2 rA;JEAiRQ iw YX?AiaQ i>(?(7hAiӟsA iQZ & # &Ai<B  QiTMc;  P5zB 94sAj7Qj}$>G6EF):;%Aj#uFAj%'L  Aj)*QPwQ j8N Li@IHA jCa6S_'&Q jO|bs_ ,HQj]o$QJUR Jo" QAj~lA jmp$  Ajqbij[Q j+8[( /0Qje?!o%,:EAj]Aj>Ajg)8Q j4pJ[Aj$ )>Q j*-=l5< IAk ^lhAj( 8l  fP$% l$Ajwr )mf "E4L P  Q kECqv @E@=AIkP.&fDQZ,H>A" J]Xf)()[l5.32 Th$ =&Ln2[ WR{vD@Y<'&!Pl\2AkQ$H~hN +wD~83b@A kRnL3bx?KNiQ kO4HefA ldVqp$JpAls 0:,LrAl hN<DnQ l3= 8ofTAl>Tp ?  H=R A l?-*v  Al= i'"Q lm:'C>3BAAlx0:uXQ l}[-,,E4A lW/A lb]0%JAl 2Q lo 2GPMtAlSSRGQ l6^kNYNQlɎpmjPK)*eLQ"Q lٳRv+Db1Al%Q lVk>{+%PyAlVQlc0-0)-9g*!Amy AmY*AmQm$Cze!&01 Oa 881"1A mAt4 Am?K" H #AmNXKP [=Q%mtAU6@ BQsRs nsR+v3 W'.3Am'&AmFAmv{ zQ mMx9}\ hAm¾aQ mĖ +2"G lQ mϾbUF/ &C1*&Q mޕ|,C4:oD Qm ~'n6+6oV5Am} }VAm?1/ Am"Qy\QnB- ne ZavcJ/An8&pK0+  1HQnM9bG.wk8?hq}N(# DX#Ann4 (A nk^! :KN50AnvS .yQn_&3.g] .=H)}Anc Q)ntG0WXiy@E~;" p&g>'vnhAnAnh>)Anفi*! QnF@[t: jS>j3sjCxQyAo{i"Z+*Q o X)|mQo) "j5Tc#~};r/xq|rRAoC jQ oNukf}^&!SQ oZ9Q^y({T#4uAof  AogJAotCQ ov;,VS||5>'Q o XS@-2@1?AoK3"-EQo99P7)ezo r\S # t}Q o(t.IVC pQ o1H pC)Aoը     jAo  | KJ AoӁH)" TQ pGq: G2;TONW@Ap(    :Ap$4Q< xn^bAp,udoQpZ#^QJ -\5Apkff2  .Apq pd    Z Aplq@@vz A]N!0u[PsSQ pʒre# Apؒ  lA p׺!!  "Ap߁['Qpt ^IS2 yCp/A q~^W "Q q|[n/GTAq%vY^\nQ q.sMP6-#AAqFrAq:{~  )Aq;E/RmQ qIjr?-6K?8[ %AqVtV;9HQq\l* ! .1AqnN( A qp<  A qq@Lu$S_t *9 lQq_}vwn t>sQAq!$      L@ 6A*qd ,  :  fPML TAqX;c t o X) SjklA*Q r"$NRzGFDEAr0tI<6"ZJ@|h+G:h[x/XArPIAr.yQrU}76WQ$%ZM,1p4A rgIfrsnA rjzlx"|Arf;sQrlqQzHMytA*r#`N54 4 w|927<hls oh  [\ahr  EHzArg.p0Ar: }&gQ r5%,5 BAsAsv  x r As5 hQ s%Tp~i2('M|Q s0iryFf?mAs>z`eVsr&As@$"~* AsAleSQ sp$bCBGDQsz.TZ 6#L'h\o2nAsoDAs z Ase_&_Q scf|mxun Q sLWfb5DAs UQs¶PeofE|`kAsޒ0A sҺBAsՁsQ s.IJU|y#,As+FQs+PE() ahN3^ebchrkAt`  At Atl eL] -Q t(bt v ef At7aN(Q t?)(;A uǒ8V Qu+t{JMyxypAu',Qu0QZUX O ~/Av 6 l{r ( Av8     6Av$t5jQ vLV!2SN%TAOvVwZ[R  PQ|}6H- 44)tTe"4 EH3hb yty0T^&6e^'`|P&/h*JKV1hbgnmtv .3dCAvskAvf*|Fje   jQ vi&/BwrsvA v4   "Av   " Aw bvmlYQ w30qXYhqjoAwOt : NAA wD1 Aw@`ROQ wefYT_ bnAwrkQww)SS~'   A w7"Aw<< AwQ weH GJ Awۆg$%LVAwzD BHZAwsJO Sp )FJ|-&hQ w9 P~Dp3~Aw^8  Aw     AwU Qx%PTa@ /6CP?8G6Ax7O f hA xE< A x9VyaMLRQPUVQ xhDn Ax|%    .E@vzAxyWbi  yz  A xziX!.Qxǁm+;0#$.//Axڦ Axo AxׁrM ZQ x H?.m C"Ay:jhA x 4 @ `A$xJ  A8n :fO9VgBoQ yD/_TQyOvAF ?dw.9Xpw yAyhC H 4A yg? .~Ayqh * Qy_zLAA z7G6z3 Q zClmt?Jv%AzW&6>kH/N{|$]XY6@ I<A zTS JYX Azr=Q zJ%NG p"Azlv9Q zJ`}1*A+z",%&IlH#6E:;8g^z3OP GV  ) Az9I R  !b-Y_ k^ o8& MAz! cf bQ{"R $-|e  A{8] AQ{Bmn! -' A{T fA{XZ: A{UG >Q {l(qo$+ CR A{{)aE8=&Q {l;B?2HA{S ~ zs=2  A{o  b   6 A{K ^Q +Q{ mZU^A%ZMRMDSVFA{Z Q {+tA uq{bA|XQ | cih ")$A|aSQ |YG ib_hmQ |%ona 7A|swZ-Av|0" e^]fc^M(l*ID]`PV%tuOr({} aZXc#v!"s+cL4H6O`a\<$o;JU  `/BVtA|t  ~)-Q |!mp K~A|{bQ#}Odkd] ^c:rcR iX e\mhUP k A}+{    A }(r  A}%^Q }M][/:5"A}[Ci   ~H A}X`  F  A}ZU+T HQQ }]PK\af]4*Q}':#RN a A}i A }A}́n SNQ }oo? ,,cBYFA }](u 7*9Q }@SN7He:oA}d,G>S+Q~MW| qb A~#,A~ & A~'Q~-nsh{ ncp texg bo`m~kdA~R 0A~Ly    @.9A~[ A[+ QC,k8JFTY;nmL4_a6kfAŒ|N Aǿ} rBA^Q `<=G>3zA{vvWrsQ Kq)$Ak A25ba~720e|0\i.`Rc^_|72; 5VLRU2@Eu(\#T=]XLe`h=49216=`v{v i Y^pH oxulA + @wgA <"+n#Q }K{~qfaAaZ 2 lAN  4(   t PKA過D7 k  $ 9*~du ~Q J9 4?6#6-TA [   Q kU.Sc$-"SA xQP n Av$  \ B     A|P_ eQ2Ej q nyxD3fAͪ2*hU\<4NHhH#\<($A f ;<D7"^AQa!oQ a/DvSkD`oA%?g*+h%Q 2K@?@AGZLhUn(A?: ^ n 4+ PA>(Q tjWH7iAjA `x[A2Qz|w` }t}`{ za ti Qy u t=6w3A´?BlQ ρdG \mLuAۏmQ ޏzr6;  vQ t<7j}pt& v7avqa  $JV=A 6 gQ SS>|i iA UQ $T,gTe;A/WQ 1, 07Xk ~N0A?G98=&.QGY}|  O BMz{AwA VF0&9 ' AW] Oh QSb e^ OV"]LSpyX&>CkAQ z@ a( c0A9bQ|8s?vP01WLU.[/A6B%X*7RQ B}:O+f2CQO38`a  dub!A0&ABKR= A_Q ,e  T%&3B.A 7{sb= }zsQ+coJ4;+;X&1Cn3 &*ocQ BQ0-Cbtm+72QPga@H1J5qH?5l3 {depW-2JoQka v d%C$-Z/(A}=FXt]MPQ5JOM|.eb.A:}\m\cB:?$DoQ 9 <=$-]A1&Q H Wx.CJ Aġ(-pQ ɡf4Or{vA{A C V &-~ Autar@Q h?; yBQ}A[NJ?azj.5Ag&7H!Q #xFA 9&5 A .| LifY:Q@F0O + Q QL8M. -F=FQ ]Z7tG'  &Aj>Y "UQQ~(p`hAroQ x!}  A7AwA zQ `e5wbQ =ehfe rcA˗nswQ m;u|y~wAN F AE >    AqQ i} s\ ApA    An() 45 0 !,  QLL` {j& ?,$Q e(KRQP!"tQ s)TU L A}EQ hSb nu ADA c '" AbgOQlm *I: -&E(wA Ȩo -"T Q) ?oPX8  &A$0A3"/ A.Q ?$&Jg$A =A  E4 AzQ v{~P.3UVMD:)E>YXA)6(:oZ(bvwPrH1Zij{n  ]rAZ/A5^.pPSTv ]POQ  ?}QQq  ~- AxZA^     * AuIc Q ԝ| fA1~}tA  E0 #(QR#&+$y3 A  [LTA%0  | "  d g`&A$wCQ \30 6a"CA@i |q6;JV b:T3t -( 8yl|c27T>_n&cH3JWr{>DEAwj| JA =/kDQ z >OA xv  L  |A~7n$cH=HRE  4sPQA)eQ 8z hC#A"F`    v     0 TM/2AHs @   r AIpE,mQ ( !*AAI D9Q DG\o| _^A¤  AOÁiQ ֤V^A^n AM    j XA   AYQ {H*!_TG< ?0KFGbc\Y:6wA(*A"aX  A-Q 9+fH+CN Q E 98aQ P" Q A\EbaX<7Q e:ih|[ lAoGQ }HGh+diA7 A@mh'LVM8)Tb%>A?uB#Q EAkx:bk`a}AU ATcHE'j~QPqpFH9F'l2RA opd72Q d$E+vDEA.xA F AqQ"s  " pA ʞp- e|{Q XlGXi^cA ) `JT:x8HA@lCx L lA2V (Z .}bNS@x oHd[RI(]FZ_NSBF AuQ ,-3?4A xF  AH0 NA @.Q zq %#Aߞ'     Q =, Ri A Q Mf w LM TA)9 ZA .e A()l 0Q DaV1_\ASw|nQY0 ulsv{z81AlS zAm:Aqg=HPQ @e^[Zg  A AMHIB  B1Q k@T}'xA /p GrBAѼP 4  Ai./g$>wD Q #$'A2A: A Q vVWq nA%F HLL<A#y t ||A-c&Q XE *() ZON~AAdRAnk$ =]QX,NzBhI-D-$AF;FoQɱhJ }T=py|A    A  AKQYx &3r{~}A 6 A A` %Q 5~   A .jA-JA35tQIE2~*A XD   AgAay\nQrpUF  BTYA A:MH $  A} hQ ]xA FA r}  V{zAD Q( !?2 EJ ;A M   QK 41,  A&qXQ +?-r kjhA9 }| J vA P)R < bA8|*N  FSjQ r,98ASBAj A|ox=Q OTYR QAƊ!fhQzPq J A\h.2"',.X A  FK,L8Lp26iTsQ?\a UDODA  A ;oA$UOQQ 0S$3 1tA 3EAZ[Q ]WLG+AksNGQv1d#N5LQVQ>Gb^]%xA^Q Z4UFKd#/fQ 4" $_b1MA_   A0 1 A_TrQŤT4% do 4jyA  pc# Q く  qA?:n6QYC>"YFw1UA@? A F@!  ;AQT#!"[]I|I* A3x@ S$()Q@UB{JEKz&ejyARQ T)d!.RQ^#.M 3U4/r]`*Ap'nQ s b0?%0',Q  V.I{AAkHK#Q? ~FG:S 2 # tQ E8= +./Aë`A,!!ALQQ QW'[l!eoX A߫_AK  A <TQbNa %#,'~"pASjQk/2&# ' AH:+Q$Cg[Rmvu  Q 5   AD_\ABrQ  :5~J#- ,MAT*Qj1f0#EDIH6sn:AwJA|_A{G zU  6M$0oOPL`LQQ b[ fe AUqj?Q rf |`A3%&)|QF r}rwx=$+>16+4X bytwtyx kjKz@('"' XWL_ *5VFvUN`iw|#&znVYVi .A{,  A8Q)-*< QA=h H(-,}#);_QҡitUN^+"#,)"AN<v"pnN Ae !H2LrzAQI/|)*wrqA0V %  VzS AXUL%\JA1@| !<B fxDuDA fQ zWcT cA @(/+,+QxKF|6Cp929Aː(! AV @O v R4bev|^_X AE,T< PI6oIH:@0;pLM:4<aE[Kt.G`H -5J ~w^gXkLQ Q CC >IJAS\.AWtAVnQ d5:_[AoH,6CvArr6+L Au >5Q 7nkz72~AĬWU |tpuLW\SN,A&7<&orb L MF \h~ Ax> 9+ ,D OQ P{EN*_$'"yA/A[W vHl5{@K4[nA]>_7vQ Ym'"'$AvxA k  NAK,(Q դwBC8AQ ߤt mGL<3A  IDKQ SVQ A:.JQ @ =4A  Qz  FO,1 bYQ )UP *LQ4INSVb ~#,1*-(-(AvAMiXB>AH]\fgUB,w"uJ)`Q g[RPLIWburILA ϭ,V]H1Z |A߼3A l<tC|/XRupobQ J*')$jmA%x A k.'TSA 6 EkR{yv^q8^azQ JOOXM4AT-1>AUgGTj   AiEQ z @K4+xA)&d & !A0&'  P  ~   tAnh&y71jq  *^ [Q   8SypA_ zA `  H  A :FxsNI 7Q 9l"~ v',ADk Q Hi{T 0AAT>1,  T  "\AORTD; F<Vdj3`Vp  3 &/  4+, 41 natgP REA|Lt)Q Ve ]z sQ gq_TUN KbAw" Q{5#nY# $^)MFA$ Q3 #!TA1A .pA0Q ]tmS9GPQW*C@' @ Z7!  AAf cFWD  D AQQ ?|^]62Q 1$14}9PAucz{* A zj3Tf"XWRA{xSL Q1iqhjm@cfmz-JrlQJK<pa`6BgA2DxQ f0*butm0A ̮Q+t f*\`$A XkP`0AƁV?@Q>2mnu,n[v PA{ A? A u2Cr$+ Q" R8Sz50h,-(bA;peQB ^@# tb2 ^^AR liXQ YC>I943"'AjtpAiP b b*~A>#|Q *fP >A =N0zC@܊2ACf@!uI /|7"3dVNj#Ph{G$~$ 6*%@6&w!nc)=G fE}! ) Xt;HFj$ 5@c f%:K=%7-"XG'2;Fu"` B0 cxZVU0ZKd  <{|3k7 !\E)5 m & | "K,~ aMXWStKK ,&x?f#Q)&iO*s4`x4![29 z WX),?+8MB ^4VS {U(^-&V] t ;-25S $k1DmzsON*L"=0@%8 L19 kB\9W%X-D Qj$+?z 6 N]#Ta\ 0FB# NjSN L OTF:Eze}VJ7$>U% 1 . Kh;U2{H)(#'(d DR@xNxC`j))$ *"noQ?Duf4Z63'ZP,(4{-`H}_HD>x n"[q% 2#8 !g\ H_<&/i\i!cUx m2f*kL0;5z.sD+el7r43@):AL00;r "7F*1  :)5{y&%r [`Mpb<m!k(>{/Ezv5G@p"Y.'[)"{@%i:4z! Y O3W L`G!j8WJ4 ZWd14#<% Qi'j` '3Wz-j 07="F E/X=)Z& 9y:,0 s2ULTCz/a!-[j7Z&w2 mo'xu6< #tM/hN0G Y8M V OpOe:1PqF0hMDXqg1 o\OxEVR ~]jz >  ObQ#la%Z$!C[@܆dfB:|YLPaH$;Q%Va7Cv}pOM+xb:q*@ (' ,!O2'%[b8'~GOFi$H<C[0T% ,ZiPS*IrDEuXj9>Me5,wn"s; W I5vM6|:k ?MHg+S>roQwg^Cg@ܔ\"h6}?`K q /?''B; dcUb+  (o 'R>! UTe<B|gE; ?/6Z"/F]+A%0 ;.P ! 1Wf28> &{i'_T&amQ:bhC_@=5R{'FsFv5)u W|Y,8@.bG>8='*S)E(QOBLHB,QD;LiH4;bz>#l H WSl@fBP#UJ x'=bn ;]6[k"QshWzi\[M_U|S_eVyHoca4Z/7OR%M[snniN*K_awbAYnE{p$ $dUS R!FLb#2cM"C>R>.) />8o[Q Ye^@ \" JON; K ( ! 6 ' ?L9m, 6$1PHiA4F%%7nJa bQchEw8DI.6v8F]l ;DnFa2a0/ )cje@$sK1<_wcT)Ll5^u:SU Md>e94O99TI?iZ;5oG.1=:4 Q`+} 2CXjz`F>C S끋td-d td60UL`)O38CROQ kQn|p/B4a'CSRw%7,s 6X,`^/WoJwY"n+iE K+w  ,'+R 7Nj_21j$kRf}@@_KZ^edCpY h*G=U8)Hfag~uVS '8:`55G9 ,oFGF6^$l3k^@2`& H7qA#V(]S [")&uc.2C]8CU[Q%N^7q {<mB7xo ?/a (2& TMDV, N>Lr2*^-<93r{84_&DA*2L)=EI%,6g'am@.<[T> %_ S7&D Wz%j, WUn%Lmy/i*T 8w5HW >+ p@ :$Bp<5^jJ[M<Bz)w$s'Wn2[&=rDFg57!;*,[E`Hn9.{r  _ )o|,+ Q,p&RZ "i@wc8swN`/n  gP\3H<75.=*2C#fLtPdMAFGf{6 e l6-c:9V(V -F'Ev} HZ}= z y*Wui.gj3daydxgV+W0Rb3G%p 5 #@e\IN#{k p?Y"R+ /,)1$ .Z> q L+3wL.EizC)S?]edA!.%#6-(3>YXU2 /XY:{<g~$~A_#s)mA^ jA랥i*4AB%C\3aF;"f'A$'|^)styAnY:(A@PA{a Khc_TUTU` H#dedWV]"#:'TUT S32=<;& XY hybb})gh8= k<=<=<U i\]lmHM  ,-,-,!ad>72 %*+*+*+()(),KJ#,! ! $  }Y ` #(_K83236 ;{DENOvoninonovovqt)cfgpqvsrsrgjcfe p_fcj54f ." K J / .   M TwzqS2  Atsrsts A X wvqpon EDCBS  !V;zt2  F378xy 2 6`}HK 5w!F+7q@2b3K#XZac ^#m!29JN&(B W ye;Y2@ z o>J "YF[dz| '*PVZaejV.ckvz~  &uya;{2,e *ajJ$Qd n2pW.$#&z ~+}> $(3UJMAT-h4,S7 63`1;*=s ?83P5 3/\=%X0U|[N`[( P[y dO?) ,x 46Tp!?+A\;#/4" \4` AA 9Jq5 p=QN s8X;B7T(Q lB9C_n;{Q&'g'(#;=VLVro a?AEZ0i\ HdJ"=FO8gMzb6]$i,.D"pj'O3'~{$vzvg6k'AH(w6n/Eoi *1OBG\\$JL'c\^r+-TW(& 9 0K1N#n +DC#cF}|*#="!'`LD)CE{`(4#:8DOv#8;=;Y-L^ ,~Ei o+HaI6^4V j ,4)ev/t:9z8Fv?-z0} :>ROnn VKIQL$8,*(YiY @s*[\OPtc~ct vya"jqh-K:9RA 7U5.zVBJ~ |$Yv[M6OPQ+ E`1Z^g:6bL `C/X][  GU5@7t  }B;7jE#t.54R d%FSispEm>Q NV.i^Mfmr'ziR ]s<}K'_+od ,4z!IbwY`Ggws3k(XBuz.wCBQ ;|;  > L vNI&97lcOgoLnsQ7v'LySOEy|+U(YTY-KEQI<Osy0/+4`E=1M5s~/AD~Faz;|yaEmawakapYa .!>.1CF#IRX]OOFian4t9Mka#acC~\V 25Q2]Pȁ"aa GKIpt M_  Mmaz*a3:nJaL+"0VY_dfkpy} (18Y^g lw ! &3<Vl s  "'K$` *G9P +4Si r} 3Ed!{ "0<n&u? ^jCo3(Fp r}F] vkara +2Tgo0 1<Wj $8>MQScm t ' =GJ`)-&0 Xf!)18 kxo6q(*T&_cNUA !#%+4 =AIMQSUX]emsw{} !$ '14 6F5PU\^bej!m14:>AFHLPRTZ]_uwz~#!*LQU`h lw   #1:DGKO lv{ %  #' ,:@GORX aot~ a2GFKRZ]J)/MN/QSU [f n s}   '+29>BGIRY\_bqsxz  &28>FNQT[bktz ' .<>BEGI N VX\ adh mrz  "#')0CG MOSXZ] `Khkry }  y07 :KI0aT47<1? s v  #1sB E R\ beinr4t_|#*5=@DLgl}  F)+03:>D F R5^mF%- manuskript-0.10.0/libs/pdf.js/web/cmaps/UniCNS-UTF16-V.bcmap000066400000000000000000000002341354442177200231030ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEUniCNS-UTF16-HA x) Wa0 rmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniCNS-UTF32-H.bcmap000066400000000000000000001467071354442177200231030ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE#CE%%D( C<OHg ^*gh '  "D Um, { Y *! 3( /y1F^7 C 3Z[AxxO@D( EwC8d    .% .% U "!":a*.)aA %*s;< 3Y<;C/gC/3C/`C/C/ C%t0H>C_%;Caj. R#E~ZTD F! VL\ S6Z }b h Msz)l g  <; A^e\Zxu>A 9 t0-u@p5I 6UDu oT_|V=s3D`; |gm"gFCBP 0?_ fypJ7|'(hD,O|c r 5{(,CE2t%nQ"A   </) oQ>Nx7:,'I 5,1 \w" e0 -&ky%: M B(];3B1 ~GX0b;!judg.jYQ"> G\P9 < Rc ZBS=8)L0w #9oh#'=>8B&^%/ 6 *`[.) GK%2PM##o wG%r ?#"L %#    )#R' bA`.  hc :; zyD(g4x KLk -0^B P5<-23 g8c)(`4&+^a  bwr!aB][lD 'T- & 6eI z  ; >7 HWTK6Puvb  M<T- <=!< nx?u+` C@,& 7P C 4DyDa( J$"n.[TgrS Nq=JKCNr p!CN!mCN};'S N*WY=J,yns<;f /~%$1 S N-j,V^7C N 6/   & 3C Nc M, C N< \k<]Pu7S Nlu~ot`CNS N*Ikp C O x dC O= nCOS/ S O6.F]{ COC%.5*+COA-2COBK7SOR+ &+ +  y|COg*[32?SOrr~  nq '}n}CO2 %CO$    COGl91>-S OǴgYX^kCCOӴ\S OִhkdWZ k C OL-%(COln $COf- ~Qkd^eS PA<7\ADCP=ZK0WS P%8jQ&,5|;C P3%TEtIS PEF ~y~w|uCPQQ-iH9S PZ~ | CPeS Ph8a#"~PC&Pt \  :   | zC2Pr> V  f     T  VC PNa["ixDifS Pu\WlyCQ?\.j2VjC Q Rz CQ zZaz\_nS QY01hgBx;XYCQe]@tS<P$k `^$e *mL vC QRrg jZ8CQj< c SX8 5Bi+*l ]SQƐX"e$-9D$utAB#C;Qܢ eF>2D}0/Bhg HUT{(    XV/!NYvADK@=6 G<0cRf(2KJOp[~sD, F S*z WF_lSN9&.(Ptgd8rv[,D*)s$2 defX),0LAs>WJsH%g,Oq@ECQu C Q"D%d#Jh;3('i^ ->I:m2 O N?p U"UQ28,  5D{X  3S SAsvB5|;3lCS_>W q" >Z&J!@ CS~,oC S"/45-o/2S S  C S"fO@C ST(JS  \CCTS TG>'f. PST##/ {~s\G5 ([E.O C T8V '&CT7@ CTKQN%ST`.ux {z_?hS To,0-2O  S Tz%{^qpCTj\[bSTu riRgdmveJ7CTrf ST@ QI% !P AVUD["STS(g+FYZG)D?CTǍX CTϴ{CT#|ET nS TWO(voC&I6CTo CTRCT,SUfJgM.;B 7A'TByC UFLE8 K rSU*apSzr}oX{ |CU;p'#8q{S UC&yrC UO* ./ CUM^ 6CUSJ U c.0pS U{{&3" $SU.Qq)f_ CU&SUW / TW jyCU  CUM n -CUuJ7 SUǛYdS6"o`GVcX N9c8GNH%CU_oh CU  CU|Uj S U7 ds3 JK<CV5Y &S V.!\C9(S V8f@^ >CV%x!!S V2ne07CV?pCV=    rCVC~ z"'mOS Vh  Z WPU` ]CVv"\oZbjS V~GC>V9VY: nP*~HMHYX]RY yZ<M+<C@? JK RSCWtJnC5V(?MK"9DG  loJ%)^    t-:/f^{f c"-S WIT_^W ^CWa}  L]\  #C)WbA  &   2 H3CWT@Ix)l +!k> B6^bm\^S Wܼyv%CWSW LSmxy j*"SX{$ {5 vCX z) ASXe |po `m CX,m%S X2^1L CX=q4pS XGBAhQ P CXQg@OZS XWifefT]kpCXbp fCXc : CXie\S Xy'2 ! 4;6ECX(~ >C ~CX<  ! J  j C XWT 1Vg6%:S XΧB/C@XةMZ&"K ZV q@: @"g>.YXcbZ7N]RZ[ FIN'~TwX/P&"gUZv:GzCX )CX܁Z^C]BZ / 3P0S YpF,)dpqNCS Y{X7: /; x H3SYòOh].5tyru CY؍u CYֲP4 #CYفqSYxfc:N%. ! >Z)KLuTG)CZ   p C Z u H@E$C Z #K\OMc`S Z@K Z!\DECZL/SZP( @W6!8M4!8MZ1/: OnC BCZp0S Zw#$T] YC Z&aBIS Z+8Z|D1S Z M>+~-QCZC4lSZ|rYn  ify 4eS Z.ov_z&mCZсF SZP9L OJAo=CZ]W< 0S ZuA*}vC [SX2N C[/ r85H t>~C1Z,`g V&+ 27da>c  ^vqJKu\\8}S [pQ0w$WkC[zF\7pUT9zBA@hC[{XC[|  HS [ZnqpC [( C[y C[{ S [VFI# C%[C>G@I@P>MDE h01n{,!jC|C[ՁRM qtC[ہAS \ #TS0r/C:\ 2m* EEi&^.Y$&wPRW(BC>WPAL>(_JY 87. =4IHC\mC \j><%5 7f uTwS\Za~ u wt C\* J.  p   C)\`0    nwx  p C\+Y C+ <C"#cS ].K4 UJ-$ C]G5C]<("), .M <[T C]>) aakkS ]wih]J? C]C dC]f   C]4^1@S ], !  CJ]L 6$j#@4/ G^,4:wv'Uv67PIH~ <xn9<A&'hidm"XWC ]5Z~P^*C ]X*_X<mF TiS ^[EJeeC^r ZC^kM ,C^f8i0G&S ^x13H^(R'xC^F:2 C^&|" 2fu|C^ #=S ^Ę? $DqS^1 ed_V !w!C.^>{3K |^P'J6l{xlg\P5XM:q6~l?:/:;:) ZcC^P^\C^CLEBS _HA?"c,E$Y|Cj_Tv@AnWITl+|efh`&KFGJtwr=|y &L70) 2/bYZ[tx}ibc^}^L&'5`tujuCB WJ UNC _\Zny0 T  AHC_\S`  M? ]XtC`~ maJS` !-xx= 4c./ p C`5G D  C`2.Z[ L]XeC`1a b?S`b( jLU fe'C `   C`r\ p{sr  C`uV\}DSKS`\=t<'>/# ,S `ýj[ CZ/C`јEiS`ׁ5K" 1(,Oj^|)C` tDS`NN_wZU~)gbLM enSaDK8MuJxa h|CaWr~  xzpCa?  xITOpeFY^ Cavn o | S aXXBGpj}x_jqCadsE1k zS anGpir iVeC a|K L?<3 CayP |a Z_XSCa}=r 5ZSaOf'T~ G`L2[ [dkCaa[,oS aEk927/ RCcUI.& C cT3, j" "CcdG S cu~+J@c#CcK3*16S cz 0[\%3CcL_0)S c(,"W&!vPIS c & CcWVSc] # l  Zg ScYg{f e6= J7ggxC cj t  CcR,z  $$ ?  + 45&<' Cc^MHS d2YW.+8=ReCd=! k^Cd@ Cd?.  S dX\( OCdgcjihCde2}bCdq[S dt ()vu C d[ Cd-|\U '0Cd#>S dht%$CddS dS (/ C dǥ?0= *)(9CdRCd 4SdZ|uZ}w @?C d[h  Z[Z&Cdh#&  L .%Ce 6S eR?(}i*1Ce)?LD k,X[T<{P]~x $ jsp|v:E]1L(N8}*HwN RTf ZZZ@~dl/be]~WRSJ d$C|NW6 WX">LILYd cCe0b snH{+[Y\ 6Ce^Sf{\ g L ITedab_Cf1S f zCf+ S f-GrCfAb Cf9 nCfD47:]aSfY nF5x X]C fj#tS fvz(-zB;C f3  sj p Cf| JCfb3! xSfH/ t61_6CZfĥJ 6lT(6 C>jE&T_  5&_ FRd0|{V 0<A0A2H=<IN G<I 8 UNM "6a"!dQD[hCXeh _ CgpK0C fc vw"+JjmL~ EZFQInB 2kHrHS gp]ZAbC g V[fr,]Sg4;  }'C gz;(?"5S g˶</S gXjeo.;e ~Cgf*SgYB78&9g";t?CgPVCg0XCgUi=V+KS hKL=Jq4}PC h%d c6 S h4[ 0\kl)/ $Sh@w #@?#D =^7ChSk!PC hk)AChUySh{6"1*7(nil@  ChT%C h%>!/2'(Ch*ShdzxiNChNS hÁ\ '*&3"S h9fRQ ChڙXw x49&M Sh  Es.? * Si_8?1wD1kA]f  t$Ci0>C i$ Up+$C Ci"zAt \S i;71Xu$)pQ)"CiJ@n;BS+iQ<uS"#S`g &9P%$c)|)X!9H_?,3"ZMqhqbO:8C i>^Z/ZW*1S iWAp 4E?SiZ;2,aE34A2 rA;JECiRS iw YX?CiaS i>(?(7hCiӟsC iQZ & # &Ci<B  SiTMc;  P5zB 94sCj7Sj}$>G6EF):;%Cj#uFCj%'L  Cj)*QPwS j8N Li@IHC jCa6S_'&S jO|bs_ ,HSj]o$QJUR Jo" QCj~lC jmp$  Cjqbij[S j+8[( /0Sje?!o%,:ECj]Cj>Cjg)8S j4pJ[Cj$ )>S j*-=l5< ICk ^lhCj( 8l  fP$% l$Cjwr )mf "E4L P  S kECqv @E@=CIkP.&fDQZ,H>A" J]Xf)()[l5.32 Th$ =&Ln2[ WR{vD@Y<'&!Pl\2CkQ$H~hN +wD~83b@C kRnL3bx?KNiS kO4HefC ldVqp$JpCls 0:,LrCl hN<DnS l3= 8ofTCl>Tp ?  H=R C l?-*v  Cl= i'"S lm:'C>3BAClx0:uXS l}[-,,E4C lW/C lb]0%JCl 2S lo 2GPMtClSSRGS l6^kNYNSlɎpmjPK)*eLQ"S lٳRv+Db1Cl%S lVk>{+%PyClVSlc0-0)-9g*!Cmy CmY*CmSm$Cze!&01 Oa 881"1C mAt4 Cm?K" H #CmNXKP [=S%mtAU6@ BQsRs nsR+v3 W'.3Cm'&CmFCmv{ zS mMx9}\ hCm¾aS mĖ +2"G lS mϾbUF/ &C1*&S mޕ|,C4:oD Sm ~'n6+6oV5Cm} }VCm?1/ Cm"Qy\SnB- ne ZavcJ/Cn8&pK0+  1HSnM9bG.wk8?hq}N(# DX#Cnn4 (C nk^! :KN50CnvS .ySn_&3.g] .=H)}Cnc S)ntG0WXiy@E~;" p&g>'vnhCnCnh>)Cnفi*! SnF@[t: jS>j3sjCxQyCo{i"Z+*S o X)|mSo) "j5Tc#~};r/xq|rRCoC jS oNukf}^&!SS oZ9Q^y({T#4uCof  CogJCotCS ov;,VS||5>'S o XS@-2@1?CoK3"-ESo99P7)ezo r\S # t}S o(t.IVC pS o1H pC)Coը     jCo  | KJ CoӁH)" TS pGq: G2;TONW@Cp(    :Cp$4Q< xn^bCp,udoSpZ#^QJ -\5Cpkff2  .Cpq pd    Z Cplq@@vz A]N!0u[PsSS pʒre# Cpؒ  lC p׺!!  "Cp߁['Spt ^IS2 yCp/C q~^W "S q|[n/GTCq%vY^\nS q.sMP6-#ACqFrCq:{~  )Cq;E/RmS qIjr?-6K?8[ %CqVtV;9HSq\l* ! .1CqnN( C qp<  C qq@Lu$S_t *9 lSq_}vwn t>sQCq!$      L@ 6C*qd ,  :  fPML TCqX;c t o X) SjklA*S r"$NRzGFDECr0tI<6"ZJ@|h+G:h[x/XCrPICr.ySrU}76WQ$%ZM,1p4C rgIfrsnC rjzlx"|Crf;sSrlqQzHMytC*r#`N54 4 w|927<hls oh  [\ahr  EHzCrg.p0Cr: }&gS r5%,5 BCsCsv  x r Cs5 hS s%Tp~i2('M|S s0iryFf?mCs>z`eVsr&Cs@$"~* CsAleSS sp$bCBGDSsz.TZ 6#L'h\o2nCsoDCs z Cse_&_S scf|mxun S sLWfb5DCs USs¶PeofE|`kCsޒ0C sҺBCsՁsS s.IJU|y#,Cs+FSs+PE() ahN3^ebchrkCt`  Ct Ctl eL] -S t(bt v ef Ct7aN(S t?)(;C uǒ8V Su+t{JMyxypCu',Su0QZUX O ~/Cv 6 l{r ( Cv8     6Cv$t5jS vLV!2SN%TCOvVwZ[R  PQ|}6H- 44)tTe"4 EH3hb yty0T^&6e^'`|P&/h*JKV1hbgnmtv .3dCCvskCvf*|Fje   jS vi&/BwrsvC v4   "Cv   " Cw bvmlYS w30qXYhqjoCwOt : NAC wD1 Cw@`ROS wefYT_ bnCwrkSww)SS~'   C w7"Cw<< CwS weH GJ Cwۆg$%LVCwzD BHZCwsJO Sp )FJ|-&hS w9 P~Dp3~Cw^8  Cw     CwU Sx%PTa@ /6CP?8G6Cx7O f hC xE< C x9VyaMLRQPUVS xhDn Cx|%    .E@vzCxyWbi  yz  C xziX!.Sxǁm+;0#$.//Cxڦ Cxo CxׁrM ZS x H?.m C"Cy:jhC x 4 @ `C$xJ  A8n :fO9VgBoS yD/_TSyOvAF ?dw.9Xpw yCyhC H 4C yg? .~Cyqh * Sy_zLAC z7G6z3 S zClmt?Jv%CzW&6>kH/N{|$]XY6@ I<C zTS JYX Czr=S zJ%NG p"Czlv9S zJ`}1*C+z",%&IlH#6E:;8g^z3OP GV  ) Cz9I R  !b-Y_ k^ o8& MCz! cf bS{"R $-|e  C{8] AS{Bmn! -' C{T fC{XZ: C{UG >S {l(qo$+ CR C{{)aE8=&S {l;B?2HC{S ~ zs=2  C{o  b   6 C{K ^Q +S{ mZU^A%ZMRMDSVFC{Z S {+tA uq{bC|XS | cih ")$C|aSS |YG ib_hmS |%ona 7C|swZ-Cv|0" e^]fc^M(l*ID]`PV%tuOr({} aZXc#v!"s+cL4H6O`a\<$o;JU  `/BVtC|t  ~)-S |!mp K~C|{bS#}Odkd] ^c:rcR iX e\mhUP k C}+{    C }(r  C}%^S }M][/:5"C}[Ci   ~H C}X`  F  C}ZU+T HQS }]PK\af]4*S}':#RN a C}i C }C}́n SNS }oo? ,,cBYFC }](u 7*9S }@SN7He:oC}d,G>S+S~MW| qb C~#,C~ & C~'S~-nsh{ ncp texg bo`m~kdC~R 0C~Ly    @.9C~[ C[+ SC,k8JFTY;nmL4_a6kfCŒ|N Cǿ} rBC^S `<=G>3zC{vvWrsS Kq)$Ck A25ba~720e|0\i.`Rc^_|72; 5VLRU2@Eu(\#T=]XLe`h=49216=`v{v i Y^pH oxulC + @wgC <"+n#S }K{~qfaCaZ 2 lCN  4(   t PKC過D7 k  $ 9*~du ~S J9 4?6#6-TC [   S kU.Sc$-"SC xQP n Cv$  \ B     C|P_ eS2Ej q nyxD3fCͪ2*hU\<4NHhH#\<($C f ;<D7"^CQa!oS a/DvSkD`oC%?g*+h%S 2K@?@CGZLhUn(C?: ^ n 4+ PC>(S tjWH7iCjC `x[C2Sz|w` }t}`{ za ti Sy u t=6w3C´?BlS ρdG \mLuCۏmS ޏzr6;  vS t<7j}pt& v7avqa  $JV=C 6 gS SS>|i iC US $T,gTe;C/WS 1, 07Xk ~N0C?G98=&.SGY}|  O BMz{CwC VF0&9 ' CW] Oh SSb e^ OV"]LSpyX&>CkCS z@ a( c0C9bS|8s?vP01WLU.[/C6B%X*7RS B}:O+f2CSO38`a  dub!C0&CBKR= C_S ,e  T%&3B.C 7{sb= }zsS+coJ4;+;X&1Cn3 &*ocS BQ0-Cbtm+72SPga@H1J5qH?5l3 {depW-2JoSka v d%C$-Z/(C}=FXt]MPS5JOM|.eb.A:}\m\cB:?$DoS 9 <=$-]C1&S H Wx.CJ Cġ(-pS ɡf4Or{vC{C C V &-~ Cutar@S h?; yBS}A[NJ?azj.5Cg&7H!S #xFA 9&5 C .| LifY:S@F0O + S QL8M. -F=FS ]Z7tG'  &Cj>Y "UQQ~(p`hCroS x!}  C7CwC zS `e5wbS =ehfe rcC˗nswS m;u|y~wCN F CE >    CqS i} s\ CpC    Cn() 45 0 !,  SLL` {j& ?,$S e(KRQP!"tS s)TU L C}ES hSb nu CDC c '" CbgOSlm *I: -&E(wC Ȩo -"T S) ?oPX8  &C$0C3"/ C.S ?$&Jg$C =C  E4 CzS v{~P.3UVMD:)E>YXC)6(:oZ(bvwPrH1Zij{n  ]rCZ/C5^.pPSTv ]POS  ?}SQq  ~- CxZC^     * CuIc S ԝ| fA1~}tC  E0 #(SR#&+$y3 C  [LTC%0  | "  d g`&C$wCS \30 6a"CC@i |q6;JV b:T3t -( 8yl|c27T>_n&cH3JWr{>DECwj| JC =/kDS z >OC xv  L  |C~7n$cH=HRE  4sPQC)eS 8z hC#C"F`    v     0 TM/2CHs @   r CIpE,mS ( !*CAI D9S DG\o| _^C¤  COĆiS ֤V^A^n CM    j XC   CYS {H*!_TG< ?0KFGbc\Y:6wC(*C"aX  C-S 9+fH+CN S E 98aS P" Q C\EbaX<7S e:ih|[ lCoGS }HGh+diC7 C@mh'LVM8)Tb%>C?uB#S EAkx:bk`a}CU CTcHE'j~QPqpFH9F'l2RC opd72S d$E+vDEC.xC F CqS"s  " pC ʞp- e|{S XlGXi^cC ) `JT:x8HA@lCx L lC2V (Z .}bNS@x oHd[RI(]FZ_NSBF CuS ,-3?4C xF  CH0 NC @.S zq %#Cߞ'     S =, Ri C S Mf w LM TC)9 ZC .e C()l 0S DaV1_\CSw|nSY0 ulsv{z81ClS zCm:Cqg=HPS @e^[Zg  C AMHIB  B1S k@T}'xC /p GrBCѼP 4  Ci./g$>wD S #$'C2C: C S vVWq nC%F HLL<C#y t ||C-c&S XE *() ZON~CCdRCnk$ =]SX,NzBhI-D-$CF;FoSɱhJ }T=py|C    C  CKSYx &3r{~}C 6 C C` %S 5~   C .jC-JC35tSIE2~*C XD   CgCay\nSrpUF  BTYC C:MH $  C} hS ]xC FC r}  V{zCD S( !?2 EJ ;C M   SK 41,  C&qXS +?-r kjhC9 }| J vC P)R < bC8|*N  FSjS r,98CSBCj C|ox=S OTYR QCƊ!fhQzPq J C\h.2"',.X C  FK,L8Lp26iTsS?\a UDODC  C ;oC$UOQS 0S$3 1tC 3ECZ[S ]WLG+CksNGSv1d#N5LQVQ>Gb^]%xC^S Z4UFKd#/fS 4" $_b1MC_   C0 1 C_TrSŤT4% do 4jyC  pc# S く  qC?:n6SYC>"YFw1UC@? C F@!  ;CST#!"[]I|I* C3x@ S$()S@UB{JEKz&ejyCRS T)d!.RS^#.M 3U4/r]`*Cp'nS s b0?%0',S  V.I{ACkHK#S? ~FG:S 2 # tS E8= +./Cë`C,!!CLQQ SW'[l!eoX C߫_CK  C <TSbNa %#,'~"pCSjSk/2&# ' CH:+S$Cg[Rmvu  S 5   CD_\CBrQ  :5~J#- ,MCT*Sj1f0#EDIH6sn:CwJC|_C{G zU  6M$0oOPL`LQS b[ fe CUqj?S rf |`C3%&)|QF r}rwx=$+>16+4X bytwtyx kjKz@('"' XWL_ *5VFvUN`iw|#&znVYVi .C{,  C8Q)-*< QC=h H(-,}#);_SҡitUN^+"#,)"CN<v"pnN Ce !H2LrzCSI/|)*wrqC0V %  VzS CXUL%\JC1@| !<B fxDuDA fS zWcT cC @(/+,+SxKF|6Cp929Cː(! CV @O v R4bev|^_X CE,T< PI6oIH:@0;pLM:4<aE[Kt.G`H -5J ~w^gXkLQ S CC >IJCS\.CWtCVnS d5:_[CoH,6CvCrr6+L Cu >5S 7nkz72~CĬWU |tpuLW\SN,C&7<&orb L MF \h~ Cx> 9+ ,D OS P{EN*_$'"yC/C[W vHl5{@K4[nC]>_7vS Ym'"'$CvxC k  NCK,(S դwBC8AS ߤt mGL<3C  IDKS SVQ C:.JS @ =4C  Sz  FO,1 bYS )UP *LS4INSVb ~#,1*-(-(CvCMiXB>CH]\fgUB,w"uJ)`S g[RPLIWburILC ϭ,V]H1Z |C߼3C l<tC|/XRupobS J*')$jmC%x C k.'TSC 6 EkR{yv^q8^azS JOOXM4CT-1>CUgGTj   CiES z @K4+xC)&d & !C0&'  P  ~   tCnh&y71jq  *^ [S   8SypC_ zC `  H  C :FxsNI 7S 9l"~ v',CDk S Hi{T 0ACT>1,  T  "\CORTD; F<Vdj3`Vp  3 &/  4+, 41 natgP REC|Lt)S Ve ]z sS gq_TUN KbCw" S{5#nY# $^)MFC$ S3 #!TC1C .pC0S ]tmS9GPSW*C@' @ Z7!  CCf cFWD  D CQS ?|^]62S 1$14}9PCucz{* C zj3Tf"XWRC{xSL S1iqhjm@cfmz-JrlSJK<pa`6BgC2DxS f0*butm0C ̮Q+t f*\`$C XkP`0CƁV?@S>2mnu,n[v PC{ C? C u2Cr$+ S" R8Sz50h,-(bC;peSB ^@# tb2 ^^CR liXS YC>I943"'CjtpCiP b b*~C>#|S *fP >C#:4aEh:G!(Mmbr15P?]edC0m6-(3>YXU2 /XY:{<g~$~C.%C즋f+C((C_C^ CC랥iCɨCB%>BC|C뺴dC놸CCC$=8Cn6)sC[ACnYC.C@PCEmCjCzx@kC4a T_ XH#VWV]$'TUT Shv&  hibcb fgh kh iHM    &#bW     #6-DJK |{NO  \"  (>(o7-I[O8K TS2!_ A A4h.-v V;378 2 6`e{w!F+7qkkZZ3HI !1AK07"3dVNj#Ph{G$~$ 6*%@6&w!nc)=G fE}! ) Xt;HFj$ 5@c f%:K=%7-"XG'2;Fu"` B0 cxZVU0ZKd  <{|3k7 !\E)5 m & | "K,~ aMXWStKK ,&x?f#Q)&iO*s4`x4![29 z WX),?+8MB ^4VS {U(^-&V] t ;-25S $k1DmzsON*L"=0@%8 L19 kB\9W%X-D Qj$+?z 6 N]#Ta\ 0FB# NjSN L OTF:Eze}VJ7$>U% 1 . Kh;U2{H)(#'(d DR@xNxC`j))$ *"noQ?Duf4Z63'ZP,(4{-`H}_HD>x n"[q% 2#8 !g\ H_<&/i\i!cUx m2f*kL0;5z.sD+el7r43@):AL00;r "7F*1  :)5{y&%r [`Mpb<m!k(>{/Ezv5G@p"Y.'[)"{@%i:4z! Y O3W L`G!j8WJ4 ZWd14#<% Qi'j` '3Wz-j 07="F E/X=)Z& 9y:,0 s2ULTCz/a!-[j7Z&w2 mo'xu6< #tM/hN0G Y8M V OpOe:1PqF0hMDXqg1 o\OxEVR ~]jz >  ObQ#la%Z$!CF锁q  (B=d"<"  ""8$         #6 )   '"    s=j*)2  2 |2  _-Z@K~ef 5 X_o$}mYL DrFsZkt !,? \ ^#Rm%07i ? =, /m/l"#}|YO%W&qp;~:q 1 (' B*qK!O1=%[bGb^-@*as   ~ (e"]i$: gC[0TQOB9R> HB!! U1bVwn6 }$;LiH4%EF,G>]+TgE18 9$ H WSX0 w ?yI\8T\#Euf:#Z"jHJ x-+9]$bsk`;Mem^ 9oHp m`6S,#"Wf24[b[,jk"Qw>AhWzCS7#PQ\z|S_[I RO|HoQ{4Z/7OR k[s0+=Ib-|N_,=4Db+,'os\.A&amQ.4n36(7bV3r>"$ #+d^i^%21S J!FLb#2cM"C>J>.) />8o[Q Ye^@ \" JON; K ( ! 6 ' ?L9m, 6$1PHiA4F%%7nJa bQchEw8DI.6v8F]l ;DnFa2a0/ )cje@$sK1<_wcT)Ll5^u:SU Md>e94O99TI?iZ;5oG.1=:4 Q`+} 2Cbjz`F>C M끋td-d td60UL`)O38CJOQ kQn|p/B4a'CSJw%7,s 6X,`^/WoJwY"n+iE K+w  ,'+R 7Nj_21j$kRf}@@_KZ^edCpY h*G=U8)Hfag~uVS '8:`55G9 ,oFGF6^$l3k^@2`& H7qA#V(]S m")&uc.2Cv8CUmQ%N^7q {<mB7xo ?/a (2& TMDV, N>Lr2*^-<93r{84_&DA*2L)=EI%,6g'am@.<[T> %_ S7&D Wz%j, WUn%Lmy/i*T 8w5HW >+ p@ :$Bp<5^jJ[M<Bz)w$s'Wn2[&=rDFg57!;*,[E`Hn9.{r  _ )o|,+ Q,p&RZ "i@wc8swN`/n  gP\3H<75.=*2C#fLtPdMAFGf{6 e l6-c:9V(V -F'Ev} HZ}= z y*Wui.gj3daydxgV+W0Rb3G%p 5 #@e\IN#{k p?Y"R+ /,)1$ .Z> q L+3wL.EizC)SJ "YF[dz| '*PVZaejV.ckvz~  &uya;{1e *ajJ$Qd n2pW.$#&z ~+}> :3$A9,S7A`1;Is3?7P5 8/\;X`[(ty dG 46w?+A\;#/4" \2 _ 95 p=QN8X;B7T(Q 0B~_nRQAg'(0VrgEZ0i\ dJ"=ui:"pj'O3'~{=g HE2S\$'-c\^r,+2W(& 9 0%n +DC?Fk= !'`wCEL4HEi56^4V/Ov}:>R?n-L$K5#kW # ^0+b7_0 kksS]z*R GKIpt M_  Mmc/2!(-h 6l*=' #8[=50U6P[O?) >xMp54`WALJ~slJ{/&u;=V{o a?AJHdFO8gMzbR.D)vzvSk'{w6nLoi ]OBGJL1KT 1N#c|*("{D[{`(7:8DOv#8;=;Y-L^ ,uo+HaI(j:4)e't:9z8F%?|mVKI8,*(YiY 'i$Te"h-<LI8lE@KTvm@!13B/6B;SV ag qq%s7v9kz&B hh%y"qgghpn b!$%(R>\OPtc~ct vyceucs^j(t $c.VBcYt6a`[ 5@ABGE# .54Xd;spECV.i^MZ'X<z+o4z%Gk(Xz ;J  >1tl[O;U11M58~cgQ-zpJ~ |[M%OPQ+ U1ZG:6bLrC/X][  G(t  ;"FS9m>Q mniR ]J'_- ,>IbwYgl3B%wCBb|lLvNI&9PcOgoLnsQ7v'LyhEy|UYTY-KEQI<Osy0/+4`E=psLAD~Fc_jqh-K:9RA 7U52;|ym[+"0VY_dfkpy} (18Y^g lw ! &3<Vl s  "'K$` *G9P +4Si r} 3Ed!{ "0<n&u? ^jCo3(Fp r}F] vkh3:nJ(arp2c#pYdkC +2Tgo0 1<Wj $8>MQScm t ' =GJ`)-&0 Xf!)18 kxo6q(*T&_cNUA !#%+4 =AIMQSUX]emsw{} !$ '14 6F5PU\^bej!m14:>AFHLPRTZ]_uwz~#!*LQU`h lw   #1:DGKO lv{ %  #' ,:@GORX aot~ 95Q2]PcH#*!>.1CF#IRX]OOH4t9Mkui 8FKRZ]J)/MN/QSU [f n s}   '+29>BGIRY\_bqsxz  &28>FNQT[bktz ' .<>BEGI N VX\ adh mrz  "#')0CG MOSXZ] `Khkry }  y07 :KI0aT47<1? s v  #1sB E R\ beinr4t_|#*5=@DLgl}  F)+03:>D F R5^mF%- 5\Vp"manuskript-0.10.0/libs/pdf.js/web/cmaps/UniCNS-UTF32-V.bcmap000066400000000000000000000002401354442177200230760ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEUniCNS-UTF32-HC x) Wc0 rmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniCNS-UTF8-H.bcmap000066400000000000000000001505751354442177200230240ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE??? A %%D( C_<OHg ^jghA¨3ZY[xx@A3Àd    .% .% CU "!"_:a*.)aA %*s;< M B4–y '  "D Um, { Y *!U s( oyqF^7 B№f wBẾn<@;<*R═B%%%%%i%[%%%e%B(╯AX! w H&_tv}" }$b OFB⼀Ss|}$+@AQ\S`zeUBB⾢B⾮"B⾾xB⿒ B⼐n R$H>QB⾘gB⾽3B⿋`B⿌B⿕ B╴0~B_▓{C!j.JR#E~ZXTD KF!JV \ S6ZK}b h M\sz)l ^g  <;IA^_e\ZxDu>A 9 t0-u@p5IK6UDu oT_|EV}ssD`;] |gmbgFCP p?\_ fypJw|'(hDB,O|c r] 5{(,Ert%nR"AC   </C) XoQ~Nx7:,gI P5,1 \w" Qe0 -G&ky%: M B(];sB1 ~BGX0b;!judg@.jY"> G\P9 Q Pu|-23Q g8#)h`4f+^Pa  bEwraaB][\lD 'Tm f 6XeI z  { ~7M WRK6Puvb  M<T-T |}!| nxuk` @l& 7AP C 4DEyDah Jd"..[QTgrR 万q=JKB且r p!B両mB业};'R 个WY=J,ynsC<;f /G~%$1 R 亞-j,V^7B 亨 6/E   & 3B 亶cKM, B 亷< \k-R 俇gYX^kCB俓\R 俖hkdWZ k B 修L-%A(B俬lnO $B俤f- ~QkdE^eR 們A<7\ADB倞=ZK0WR 倥8jQ&,5|;B 倳%TEtICR 偅F ~y~w|uB偑Q-iH9R 做~ | B健R 偨8a#"~PBH側 B\  :  F | zD  Rz ?@.j2VjBG偲> NV  f   A  T  V CvznB傁Na[fuixDif/D> YZ jVB傼QR 兙01hgBx;XYB入]@tS<P$Ek `^$e *mL vB 冀Rrg jZ8B兪< cL SX8 5Bi+*lJ]R准X"e$-9D$utAB#B=凜 eF>2D}0E/Bhg HUT{(   E XV/!NYvADK@=6 G<0BcRf(A2KJOp[~sD, F S*zKWF_lSN9&.(Ptgd8rv[,D*)@q$2 defX),0LAs>WJsH%Bg,Oq@EB凗u B 凘"De$#Jh{3R('i^ ->UI:m2 OKN?p`U"UQ28,F  5D{X T 3R 厤AsvB5|;3lB厲_>WG q" >Z&J!@ B厴~loB 厰"P/45-o/2R 叨  B 叵"fO@BC R吆(JS  \CB吖R 吘G>'f. PR吣#/ {~s\G5 ([E.O B 吸V 'A&B吷@C B呋QN%R呠.ux {z_?hR 呯,0-2O  B呻hBB呺%A B咅YR咋u riRgdmveJ7B咚rf R咠@ QI% !P AVUD["R 咶S(g+FYZGB哀Q B哃| B哋#|ET nR 哠WO(voC&I6B哭o B哱RB哯,R唁fJgM.;B 7A'TByB 唗FLE8 K rR唪apSzr}oX{ |B唻p'#8@q{R 啃&yrB問* ./ 2&A- $B 啍^ 6AB啓J U c.0pR喆.Qq)f_ B喘&R喡W / TW jyB喱  B喵M n@ -B喰uJ7 DR嗇YdS6"o`GVcX N9c8GNH%B嗡_oh  A B 嗢  R  A B嗪|Uj AIIR 嘏.!\C9(R 嘛8f@^ >B嘥x!!R 嘲ne07B嘿NpB嘽A    rB噃~ z"'mOR 器  Z WPU` ]BD噶"FD VYC: nP*~HMHYX]RY yZH<M+<C@? JKA RSB圇tJnB@噷fbjMAF?MK"9DG  loJ%C)^    t-B:/f^{f cB"-R 坉T_^W ^B坡}  EL]\  S#B)坢A B &   2A H3B坔@Ix)l +H!k> B6^bmE\^R 埜yv%B埩R埬 LSmxy j*"R堀{$ {5 vB堐 z) AR堛e |po `m B堬m%R 堲^1L B堽q@4pR 塇BAhQ P B塑g@OZR 塗ifefT]kpB塢p f Az{~ >C ~BB*塣 :  A  ! J  j BB塩e\^T 1Vg6%O:R 壎B/B@壘MZ&"K ZV q@:B @"g>.YXcbZ7N]RZ[ FIAN'~TwX/P&"gUZv:GzB壚 iB壜Z^C]BHZ / 3PpR 奰F,)dpqNCB 好;C B 奻X@  B妉0 /SR 妝qt) S8]B妬R妮 m >; x HB姀SR姃Oh].5tyru B姘u B姖P4 #B姙qR姨xfc:N%. ! >Z)KLuB威~ ,  p B娀! & H@E$B 娂 v#K\OMc`R 婀K Z!\DEB婌/R婐( @W6!8M4!8MZ1/: OnC BB婰0R 婷#$T] YB 媁&aBIR 媎+8Z|D1R 媙 M>+~-QB媤C4lR媮|rYn  ifB嫀0y 4eR 嫆.ov_z&mB嫑F R嫕P9L OJAo=B嫨]W< 0R 嫲uA*}vB 孓X2N B嬈/ r85HG t>~B1嫽,`gA V&+ 27da>c  D^vqJKu\\8}R 孰Q0w$WkB孺F\@7pUT9zBA@hB孻XB孼 E HR 宕ZnqpB>客l G x@FI zC>G@I@P>MDE h01n{,!FjC|B宪{X-VRM qEtB宷Gc R 尌#TS0r/B:尚 2m* EEi&^.Y$D&wPRW(BC>WPAL>(_JY 87.G =4IHB屭B 尜j>=:|24?>?8u|9:9B幦8i0G&B広 #=R 廄? $DqR廐1 ed_V !w!B.廥>{3K |A^P'J6l{xlg\P5XM:q6~l?:/:;:)C ZcB廱P^\SB廹CPLEBR 彈A?"c,E$Y|Bj彔v@AnWITl+|efh`&KFGJtwBr=|y &L70) 2/bYZ[tx}ibc^C}^L&'5`tujuCB WJ UN@B 彜ZnyG0 T  IAHB忂\R怉 M? ]XtB怙~ maJR怠!-xx= 4c./ p B怵GMD  B怲.FZ[ L]XeB怱a bN?R恢( jLU fe'B 恿D   B恲\Mp{sr  B恵V\}_DSKR悰\=t<'>/# B惀l,R 惃j[ CZ/B惑EiR惗5K" 1(,Oj^|)B惦 tDR惰NN_wZU~)gbLM B愀VnR愃DK8MuJxa h|B愒Wr~  xDzpB愓?  xITOpDeFY^ B愙vn o |D R 慘XBGpj}x_jqB慤sE1k zR 慮Gpir iVeB 慼KC L?<3 B慹PE |a Z_XSB慽=Cr 5ZR憧Of'T~ G`L2[ [dkB憼a[,@oR 懅Ek927/ RB捕I.& B 捔3, j" "B捤G R 捵~+J@c#B捿K@3*16R 掇z 0[\%3B掔L_0)R 掛(,"W&!vPIR 控 & B掹WVR揀] # l  Zg R揕Yg{f e6= J7ggxB 援jLt  B揯R,z  R$$ ?  + 45&<' B揸^MHHR 搲YW.+8=ReB搽! Rk^B摀 B搿.K  R 摘\( OB摧cjihB摥2}bB摱[R 摴 ()vu B 撇[ B摿-B|\U '0B撍#>R 撫ht%$B撾EA   0= *)(9B 撽SEB撶dI@ 4R擠Z|uZ}w @?B 擰[h  AZ[Z&B擯h#& A L .%B攊6R 攛R?(}i*1B攩?LD k,X[T<{P]A~x $ jsp|v:E]1L@(N8}*HwN RTf ZZZ@~dl/be]~AWRSJ d$C|NW6 WX">LILYd BcB攰bW snWH{+[YR\ 6B斋^R昂{\ g L ITedab_B昘1R 昜 zB昫 R 昭GrB晁b B昹LnB晄47:]aR晙 nF5x X]B 晪#tR 晶z(-zB;B 暄3  sj p B暀| JB暅b3! xR暭H/ t61_6BZ曄J 6lT(6 C>jE&T_C  5&_ FRd0|{V 0<A0A2EH=<IN G<I 8 UNM "6a"!dQD[hCXeAh _ B朁pK0B 暽c v@w"+JjmLP~ EZFQInBM2kHrSHR 枋p]ZAbB 林 V[fr,]R枮4;  }'B 枿z@;(?"5R 柋</R 柖Xjeo.;e ~B柢f*R柩YB78&9g";t?B柿PSVB柼0UXB柾UAi=V+KR 栚KL=Jq4}PB 栥d c6 R 栴[ 0\kl)/ $R桀w #@?#D =^7B桓k!PB 桫)A@"B桕yR 梀,7(nil@  B梓T%B 梏%>!/2'(B梘*R梦dzxiNB梹NR 棃\ '*&3"R 棐9fRQ B棚Xw x49&M R森  Es.? * R椀_8?1wD1kA]f  t$B椰>YB椗$ Up+$C .1@$) )4;BB 椘"zAt \#DUR+楑<uS"#S`g &9P%$c)|)X!9H_?,3"ZMqhqbO:8B 榀>^Z/ZW*1R 榓WAp 4E?R榞Z;2,aE34A2 rA;JEB榻wE B榹R B !$B槀]R 槉>(?(7hB槓sB 槔QZ & # &B槕<B  R 槶TMc; R樀~ P5zB 94sB樏7R樓}$>G6EF):;%B 樣uF F  B樥'L  '@IH;B権*QPwOxc R 橏|bs_ ,HR橝o$QJUR Jo" QB橾lAB 橭p$A  B橱biGj[R 檌+8[( /0R檙e?!o%,:EB檬]FB檭>B檫g)8R 櫅4pJ[B櫏$ )>R 櫘*-=l5< IB欠^lhB櫥( 8Hl  fP$% lA$B櫧wr )mfC "E4L P  R 歅Cqv @E@=B~歐>H]Z57AQZ,H>A,  J]@Xf)()[l5.32<A<D~5h_ =&Ln2[@b@R{vD@Y<'&!Pl\2y4@Hef?0hN<IVZ: 4EZ=$Z_|3p2B歗.B 歒nL3bFxKNiv-R 氳= 8ofTB氾TAp ?  H=R B 氿-C*v  B氽Ki'"R 汭:'C>3BAB決T B!,/B汸0 DDcL]0%JB汹Q_D2R 沪o 2GPMtB沶SSRG@^kNYNR泉pmjPK)*eLQ"R 泙Rv+Db1B泥%R 泧Vk>{+%PyB泵VnR洀U0-0)-9g*!B洗y B洘Y*B洖R洤Cze!&01 Oa 881"1B 流t4 B洿K@" H #B济XKP [=R 浴AU6@ R涀BQsRs nsR+v3 W'.3B涪'&B涫FB涤v{ zR 涷Mx9}\ B淀E6R 淄 +2"G lR 淏bUF/ &C1*&R 淞|,C4:oD R淨 ~'n6+6oV5B淹}I}VB淼?1B/ B淾"CQy\R渟B- ne ZavcJ/B游&pK0+@  1HR湍9bG.wk8?hq}N(# DX#B湮4V (B 湫^! :NKN50B湶SI.yR準_&3.g] .=H)}B溪c R溮tG0WXiy@E~R滀R" p&g>'vnhB滬B滘h>)B滙i*! R 滴F@[t: R漀FS>j3sjCxQyB漒{i"Z+*R 漞 X)|mR漩 "j5Tc#~};r/xq|B潀RGjR 潎ukf}^&!SR 潚9Q^y({T#4uB潦  B潧JB潴CR 潶;,VS||5>B澀|R 澄 XS@-2@1?B澐K3"-ER澝99P7)ezo r\S # t}B澹hF B澸( DB澻;R 濆1H pC)B濕     jGB濔  | @ KJ B濓H)"JTR 瀔Gq: G2;TONW@B瀨   M:B瀤4Q< xn@^bB瀬^udoR灚#^QJ -\5B火ffQ2  M.B灱 pGd    Z B灬q@@vzA A]N!0u[PsSBR 烊re# B烘  lB 烗!!  "B烟['R 烳t ^IS2 yCp/B 焀z^W "R 焛|[n/GTB焥vY^\nR 焮sMP6-#AB煆rB焺{F~  )B焻E/ARmR 煉jr?-6K?8[ %B煖tV;9HR煜l* ! .1B煮N(F B 煰sQB熨!$ I     LG@ 6B*熧d ,B  :  fAPML TB熭X;Vc t o X)ISjklA*R 爢$NRzGFDEB爰tI<6"ZJA@|h+G:h[x/XB牐IB爮yQR牕}76WQ$%ZM,1p4B 牧IfBrsnB 牪zlx"E|B牦;[sR犋lqQzHMytB*犛#`N54 4 @w|927<hls oh  [\ahr  EHzB犚g.p0B犟: }Z&gR 狶5%,B猓B猀1 v  x r B猂K hR 猥Tp~i2('M|R 猰iryFf?mB猾zD`eVsr&B獀$"~* B獁leSR 獰$bCBGDB獺.TZR 玀J6#L'h\o2nB玖oDB玎 z B玏e_&_R 玤cf|mxun R 玲LWfb5DB玾 @UR珂PeofE|`kB珞0B 珒BB珕sR 珠.IJU|y#,B班+FR 珳+PE() ahR琀N3^ebchrkB琛`  B琖 B琑l eL] -R 琨bt v ef B琷aN(=R 瑀 AFjxe|_6B瑕} B瑍& B瑌,wyR 瑝FFRC}(R瑧0zqpqmfzxwnB瑾)AB 瑹|$A) Z3B瑺QG4 vR 璗%SlOz!$R 璣{h 5BC0B環 EJDB璭* bLYD;AJB璴%L/R 瓓zy&+,+khR 瓠&S2bkHa]B甄1/s^Mtpo,HB(瓬 @(<ZQ<o= |@|A&</B瓰f(L-0 c$?F"|X xyx_HUR 疊LU^Xu- B 疝V  g CtB疘~x  @  B疞G54NkZR痗+t{JMyxypB痦',R痯0QZUX OB瘀X l{r (G B瘃2      E6B瘂Iu$t5DjR 癌V!2SN%TBO癖wZ[R  PQ|}6H- 44)tTe"4A EH3hb yty0T^&6e^'`|P&/Bh*JKV1hbgnmtv .3dCB癳kB癦*|FjEe  T jR 盬i&/BwrsvB 相4B   "B盷L   " B県bvmlYR 眳0qXYhqjoB睏t : NAB 睄1 B着`ROR 睥fYT_ bnB睲kR 睷)SS~' B 瞄:x"B瞀D  << B瞘R 瞯eH GJ B矛g$%LVB瞽zGD BHZB瞹sJCO Sp )FJ|-&hR 矬9 P~Dp3~B矽^D8  B矷 F    B矾UIR砥PTa@ /6CP?8G6B砷OJf hB 硅< B 砹VyaDMLRQPUVR 硨Dn B硼%I    .E@vBzB硹WbAi  yz  B 硺iFX!.R磇m+;0#$.//B磚 B磛o B磗rM ZR 磬 H?.m C"B示jhB 磷F 4 @ `BB$磹J B A8n :fO9VgBoR 祄/_TR祏vAF ?dw.9Xpw yB票C HA 4B 祧? .D~B祱h A* R禐_zLAB 稷G6z3 @R 穃lmt?Jv%B穗&6>kH/N{|$]@XY6@ I<B 穔S JYXE B穲=R 窏J%NG p"B窞lv9R 窮J`}1*B+窺"G,%&IlH#6E:;8g^z3DOP GV  ) B窻9IIR  !b-Y_ k^Lo8& MB窼!Lcf bR笢R $-|e  B笸] ADR筂mn! -' B答 fB筘Z: B筕G >R 筬(qo$+ CR B筻)FaE8=&R 箊l;B?2HB箔S ~ zsG=2  B箖o  b  K 6 B箢K ^QR +R篘 mZU^A%ZMRMDSVFB篲Z R 篷+tA uq{bB簀[R 簉cih ")$B簕aSR 簛YG ib_hmR 簥ona 7B米wZ-Bw簰" e^]Bfc^M(l*ID]`PV%tuOr({;C< aZXc#v!"s+cL4HB6O`a\<$o;JU  `/BVtB籴 `J~)-R 糱!mp K~B系{bR#紀Odkd] ^c:rcR iX e\mhUP k B紫{    CB 紨r C B紥^R 絍][/:5"B絛Ci   ~HG B絘`  F@  B絚UkT HQR 綜]PK\af]4*R綦':#RN a B綸i GB 綷CB緍n SNR 緖oo? ,,cBYFB 緣](u 7*9R 緮@SN7He:oB緹d,G>SD+R縇MW| qb B縛#,B縚 & B縧R縭nsh{ ncp texg R 繀vo`m~kdB繒 0B繌y    @.9B繛 B羓[+ R羬C,k8JFTY;nmL4_aB翁}N B 翀2 rBB翝^R 翥`<=G>3zB 翲{vvWrs R 耀4q)$Bk耋A25ba~720e|0\i.`Rc^_C|72; 5VLRU2@Eu(\#BT=]XLe`h=49216=`v{v i Y^pGH oxulB 耝k wgHB 耠<bkn#R 胔}K{~qfaB胡aZD 2 lGB胠N  4A(   tE PKB胩D7 kL $ 9*~duJ~R 腊9 4?6#6-TB 腛   R 腫U.Sc$-"SB腸QP@ n @B腶$K \ B     & B腼PG_ eR 臀R nyxD3fB臍2*hU\A<4NHhH#\<($B 臮f ;A<D7"^B臯QaaoR 舚a/DvSkD`oB舥?g*+h%R 舲K@?@B艇ZLhUn(B舿@: ^ n 4+ PB舾U(R 艴jWH7iB芋jB 芀x[B芇2R芝z|w` }t}`{ za ti R 芳y u t=6wB苀0BlR 苏dG \mLuB苛mR 苞zr6;  vR苪t<7j}pt& v7avR 茀fa  $JV=B茋6 gR 茖SS>|i iB茠UR 茤T,gTe;B茯WR 茱, 07Xk ~N0B茿G@98=&.R荇Y}|  O BMz{B荷B 荖F0&9 A' B荗] Oh R莅Sb e^ OV"]LSpyX&>CkB莠R 莢z@ a( c0B莮9bW8sR菀?vP01WLU.[/B菑6B%X*7RR 菛B}:O+f2CR菧O38`a  dub!B菸0E&B菹BKR=A B萅_R 萉,e  T%&3B.B 萖7{sb= }zsR萫coJ4;+;X&1Cn3 &*ocB葀8R 葂Q0-Cbtm+72R葐ga@H1J5qH?5l3 {depW-2JoR葫a v d%C$-Z/(B葽=FX@t]MPR蒍5JOM|.eb.A:}\m\cB:?$DoR 蒧9 <=$-]B蒸 @B 蒴1&+ E %DB蒽L.R 蓉f4Or{vB蓬{B 蓖C V &-~ B蓚utar@R 蓶h?; yB蔀_R蔂}A[NJ?azj.5B蔜g&7H!R 蔣xFA 9&5 B 蔮| LifY:R蕀F0O + R 蕑L8M. -F=FR 蕝Z7tG'  &B蕪>YA "UQQ~(p`hB虲oR 蚐x!}  B蚜7B蚝wB蚠 zR 蚯`e5wbB蚿=R 蛀 hfe rcB蛋nswR 蛖m;u|y~wB蛤N F AB蛢E >   F B蛯qR 蜄i} s\ B蜓pB 蜘   B蜑n() 45 0 !,  AR蝌L` {j& ?,$R 蝥(KRQP!"tR 蝳)TU L B蝽ER 螁hSb nu B融DB 螏c '" B螋bgOR螩lm *I: -&B蟀gB 蟂A  nB蟁| R蟖) ?oPX8  &B蟬$0FB蟪3"/ @&  E4 B蟵.NR蠟 v{~P.3UVMD:)E>YXB)蠶(:DoZ(bvwPrH1Zij{n  @]rB衚/B蠵^.BpPSTv ]UPOR 袋 ?}R袕Qq  ~- B被xXZB袤^     A* B袮uIEc R 裔| fA1~}tB 裡 E0 #(R 裳R#&+$B褂^ [LTFB&褁a  | "  Bd g`&B褀z#x^CR 襜30 6a"CB@襩 |q6;JV Ab:T3t -( 8yl|c27T>_n&cH3J@Wr{>DEB襷jQ| JB覀 =okDR 觟z >OBB觴)2&Cxv  L  |zB{    v    H 0 TM/2B)觫~R  BD@C  @ A  r B觶!$6H R\x ) P1KE,QmR 誣( !*B 誰  B  B誯A{ AB誴|WXR 論V^A^n B諦M    jA XB 諤   EB諪YR謊{H*!_TG< ?0KFGbc\Y:6wB謨* G0B謢aX   H@+ B謭U0R 譅 98aR 譐" Q B譜EbaX<7R 譥:ih|[ lB谷 B譯GB bBL "3AB譸HA"+di  =8 Bc{TbCR 豅Akx:bk`a}B豕 B豔cHE'j~QPqpFH9FB'l2RB 豯pdW72R 貗d$E+vDEB貧.xB貣 F B貭qR貲"s  "B賀mp0B賌 XB賍HgR 賙XlGXi^cB 賤) `JGT:x8A@lCxIL lB2賥V (Z .}bANS@x oHd[I(]FZ_BNSBF B賲XuR 趥 ,-3?4B 足xFG  B趵HA0 NB趲 M@.R 跓zq %#B 跟'  "B跠-   6 @ B踁R踍Mf w LM TB踩9 ZHB 踮e @B踨)l 0R 蹄aV1_\B蹓w|nR蹙0 ulsv{z81B蹬S DzB蹭:B蹱g=HAPR 躄@e^[Zg  B 躐AMHIB  B1R 躣k@T}'xB 躲/Ep GrBB軑P 4  B躰i./gD$>wD R 軴#$'B軾2DB軿:@ B輍 R 輘vVWq nB輥F HLBL<B輣y t F||B輭c&PR 轘E *() ZON~B辛B辜dRB轮kd =]R辭X,NzBhI-D-$B达F;AFoR迉hJ }T=py|B 迢   B迠  B迚KR 迴Yx &3rB 退W @ B适LB逈` %R 這5~   B 逮jBB逭JDB逳5NtR遉E2~*B 遘D   B遧B遡y\nR遲pUF  BTYB邑 B邀DMH $  B邅} hR 邮]xB 邸HFB邽 Er}  V{z< !B邻DH R 鄀+EJ ;B鄋M   R鄖K 41,  B鄦qXR 鄫?-r kjhB鄹N }| J vB 酐)R < bB鄸|@*N  FSjR 酲,98B醃SBB醀j B酼oOx=R 醙OTYR QB釆!fhQzPq J B醮\hE.2"',.X FB醥  FK,L8CLp26iTsR 鈀< UDODB鈍 B鈌;oB鈎$UOQR 鈰S$3 1tB 鈼R @tR鉈Qw4-&+z2 >3EB鉚[R 鉝WLG+B鉫sNGR 鉶1d#N5LR銀UVQ>Gb^]%xB銑^R 銓Z4UFKd#/fR 銠4" $_b1MB銲_   DB銴0 1IB銮_TrR鋅T4% do 4jyB 鋗 pc# R 鋣  qB鋮?:n6R 鋶YC>"YFwB錄} @? B錀f1)@!  ;B錃gRR錝T#!"[]I|I* B錳x@ S$()R鍀UB{JEKz&ejyB鍒R 鍔)d!.RR鍞#.M 3U4/r]`*B鍰'nR 鍳 b0?%0',R 鎀 V.I{AB鎌kHK#R鎔? ~FG:S 2 # tR 鎬E8= +./B鏃`B鎷H,!!B鎸LQQ FR鏊W'[l!eoX B鏟_B鏞K  B鏠 <TR 鏳bNa %#,'~"B鐀[pjR鐆k/2&# ' B鐛H:+R鐤Cg[Rmvu  R 鐵   B鑄_\B鑀, Q  :5~J#- ,MB鑔*R鑪1f0#EDIH6sn:B長HJB鑼_B鑻FG zU^  vMY$0oOPL`LEQR 開b[ fe B閖Uqj?R 閞rf |`B閫3%&)|QF @r}rwx=$+>1v+4X bytw@tyx kjKz@('"' XAWL_ *5VFvUN`iw|#&zn@VYVi .B陻,Z  B阸QH)-j< QB閪}h Hh-,Q}#){_R雒itUN^+"#,)"B離N<v"pDnN B雡e !H2BLrzB雴NR霛I/|)*wrqB青! B霰VO  z=z OHvB-霱@| !<@B fxDuoLdA K\zy`2  @ D(/tR鞗xKF|6Cp929B韋(!MB鞭VS @O v R4bHev|^_X BE鞨,T< PI6oI@H:@0;pLM:4<aE[KtE.G`H -5J ~w^gXkLQKR 顃C >IJB顓\.B顗tB顖nR 顤5:_[B顯H,vCvB顲rv+L B页 ~5R 颶7nkz72~B飄WU |tFpuLW\SNG,B'飀8<&orb L EMF \hD~ B飃x> 9+X ,DD OR 饐{EN*_$'"yB首/B饛W vHlu{@K4[nB饝>_wvR 馪Ym'"'$B駁vxB 馹kD  NB馸K,G(R 駕wBC8AR 駟t mGL<3B駩  IDKR 駴SVQ B駿:A.JR 騉@ =4B騔  R騙z  FO,1 bYR 騩UP *LR 騴INSVb ~#,B骨vB 驀*XB>B驁@>\fgUB,wbuJ)`R 骶g[RPLIWbuB 髁d V]H1Z G|B髟3B髀Hl<tC|/XRupAobR 鬈J*')$jmB鬥x B 鬚k.'TRSB鬔 6 EkR{yv^q8D^azR 魊OOXM4B魚aB魔-qYP&Qd & !BZ魕gGTj  .- j @@K4+x&'h&^c0#  ;A RG~   ReTMv\kBR 鰅  8SypB鰓_ z B鰒 `  H   @',B 鰐:FxsNI 7JdR 鱈i{T 0AB鱔>1, L T  "Q\BO鱒TD; F<Vdj3`Vp @ 3 &/  4+, 41 naAtgP REB鱼Lt)R 鵖e ]z sR 鵧q_TUN KbB鵷" #nYR 鶀( $^)MFB鶐$ R鶖3 #!TB鶯1IB鶨.pSAH B鶫0>B=R鷇W*C@' @ Z7!  B鷥B鷡f cFWD  DB B鷼QR 鸉?|^]62R 鸗1$14}9PB鹵cz{B* B 鹺jE3Tf"XWRB鹻xESL R麐1iqhjm@cfmz-JrlR麤JK<pa`6BgB麴2y0 D*+t f*\`$B麶xj@utYXkP`0B麽UF?@R 黴>2mnu,n[v B鼎{ B鼇? B鼀q2Cr$+ R鼢 R8Sz50h,-(bB鼻peR齂 ^@# tb2 ^^B齒 liXR 齙C>I943"'B齪tUpB齩P bO b*~B齿V>#|R 龤*fP >B#:taEhzZ!(MNm"r1uP|jIr 'Ti twEsnzCr}-pL$ypT WBhMm^.mrHkBh龯=N0Sz# ZM+}O|tJ_10^UTy x@$ K [ `Tc bX32Y^J kezcbx\ tW"Y2o D<7L6X/2oKR J>?]edB#.e# 6@'TX-(3>YXU2 /XY:{[<g~$~B_#simB jBij4B%\3aF;"&'B$'|^istyBYz(BPBa Khc_R@UTUTU` H#dedWV]"E#:'TUTD() S32=<;& XYLhybb})gh8= kD<=<=<U i\]lmHMB  ,-,-,V!ad>72 %*+*+*+G()(),KJ#,! ! $E  }NY `  B%(_K83236 ;{DENODvoninonovovqti[cfgpqvsrsrgjcfeIp_fcj5D*f .b KKJ />Hn I M TwzqSr M Atsrsts AKX wvqponG EDCBXmpS  !V;F:tG2 @  378dBexy 2 v`}HGy 5waF+wq@Zrb3KcXZC𠂊2Cf𠀡uIG o|7U"3dQVjcPh{@G$~d v*%@6A&wanc)]=G f}a ) t;Hj$ V5@c fe:K=ew-"X'r;ub` Bp|y~ #xZVU]0ZKdM <{F|3k7] !Z\E)5U m S& | "K,~_ aMXSt[KK ,fx?fcQ)&Pijst x4a[R29 z XR),?k8 BC ^4VS {Uh^-&V]T t ;m2uS $kqDmDzsON*Lb=p@%8G L19 kB\9W%NX-D QjZ$+?z v N]cTa\ 0FBc NjSFN L OTF^:Eze}VJQ7$>U% 1J. Kh;U2{H)\(#'F(d RxVNxC j))V$ *bnoQ?Duf4v3gZl(4{m`}_H>Rx Yn"qe 2cx !g\ H_|&oii!]cxKm2fX*k 0S;5zns+T%Pl7r4s@izALpp;rC "7*q  T:)5{yf%Zr [E`Mp"G<m!k(~{/EPzv5G@p"YP.'[)"{@ei:tz! Y O3WW L`G!jxWTJ4 @ZWd14#H<% Qi'j``'3WzYmj 0w=bF E/X@=iZW& 9^yz,0Ks2UL[TCz/a_!m[j7Zfw2 mCo'xu6| ctM/ShN0G QY8  OpezqP|Yfijs ^S-T' B@tK F ;CZ2o =@>qF0hMDXBqg1 o\OxEVR ~]jzI>  ObQ#la%Z$R!C[𠂆dfz|LPa${QeVa7v}pO +xbzq*@P (' l!Or'%[bx'~GOFi$Me5lwn"s;  5v v|zkK? H'+S>roQwg^Cg𠂔\"hv} K 1K/WP'gU{ $cb+R Q (o g~a UHT%|W|'{[ o6Z"o]ke0L{.P !J1W&rx~ f{i'_^&amzb(YC_𠃮=uR{'sFv5)u ZW|Yl8."G~8}'*S)(B BlQ{LiH4{"z~cl H SlfBP#U  xD'=]bn ;6[kbQ3hWz)\[MUV|S_eVyoca4Z/wOR%M[s.niNjKawbYnE{p$ ddVUS 𤨡FLb#2cM"C>𤨾.C) />8o[Q YeQ^@ \" JON; KJ( ! 6 ' S?Lyml 6$qHiAtFe%wn a bchEwxDIn6v8]l {DnFa2a[0/ )c[je@ds q<wOcT) l5^u:SU Md>%9_49yT ?iQZ;\5oGn1=@:4 Q`B+} 2C𦉪z`~C 𤷫td-d t$vpU `iOs8C𤩏Q kQ.|po4a'CS𤩷%[7ls 6Xl`oWoJwY"nX+)E[ +w  l'kR 7^j_2qjdkf}@_KZe]dp h*G=8)fag~u 'x:`u5y ,oFG\6R^dlskr`& HwqcV(S 𦴢)&uc.2C𧘇8CU𦵑%^7q {<m7xOo ?oa (2&LT DV, > r2j^-|93r{8t_&D]A*2SL)}EIe,6g'a-@n|[T>M%_ ]Sw&DJWze*l WneLmy/iT*TJ8wuHQWM>+ ]p z$^Bp<5j [HM<Bziw$s'WYn2[&}rgu7!;j,[TE HNn9n{r K_ )o|l+ Qlp&TRZJ"i@w_c8swNY`/n MgP\3H<7u.=*2CcfLtPdMAFGfO{6 e l\6-c:9VhV -FgEv} HZ}= z yC*Wui.gj3dN!ydxgVkWpRb3Gep 5`#@e\INN#{k _pY"Rk /l)q$ .HZ> q Lksw .izSC)XS<Yk@nwG}}X[=m(&{zAn mfth 12g J{fd;[nJjG4j)k VIjnQ z0BW'jK}.aRf' LlJO ._S  W`C𧀎} |oUh{ 8pI40Pb} %TLP/M &k?%C 𦺙&oPw=:CiRsq!bdEC𧥧yC吆kCs𦵴 ymrk3sz,BL!!rGc$z?eh12X3*XoYkD,0PuBuY L^ }|#%S)gv; JM"F][dz| '*PBVZaejV.ckvz~@  &uCya;{qe *ajJ$Qd nrp.$W#&z ~k}~ z3$Ay,ZS7E`1; ss?wP5E )\{XN`[hty d ^46Nw?kA;c/t" \r  N95 pH=N8X;BwThQ pB~_nQgg(pVrgEZY0)\ TdJb=uiz"]pjgO3'~{}gKHEr\d'mc\^rl+rW(& 9`0%nI+CFk= !g`7CVE 4Eiuv^4VoEv}:~R.mLd u#kWM# ^p+bw_0 k+sSz@ * BGKIpt M_ \ MmFb\⿐2s-hyS #8[=q?ix4`fsi+;}V{oIa4FtbU.pvbw6nw ]OwT 1#k|QD}aO6#}YV- ^U ,uo+Ihjz4ie'tz9z8n?|mV I8,*hYiY  HFb偣J[Lz0}bs*b庲Q_^=TA WN#$-v@ Hn\ulx{)JM]m~   vbF亃a.xC#  8~roUuit~'i$ebh-<LIxlEH@ Tvm!q3/6B;_SV ag^ 1qeswvykz& hhey"qgghpn Z"!d%(^>OXPt#~Tct`vyb斲ub獞jht db.嚌B#Yt6a` T5@BE#`.u4d{spECV.i^ 'X<zko4zeG[k(Xz ;J  >q4l[O{Uq1 5x~bg儭zpJ~ K|[M%OPQ+ T1Z:vbXLrC/_X][  Ght  ;bFSym~Q Um.iR ] 'P_- X,~IbwYXgl3BewCB"|H,L\vNI&V9cgoTLnsQ7v'Ly(Ey|YTY-\KEQ |OsRy0/U+4`E=0sLAD~Fb↸-K:y>A@ 7@635VYwr;|9H-kC +2@KTgo @$  1<@ KWj@ $8 >@IMQScmt@ '=@AGJ`B)-0@? Xf@~!)8@.; kBx+"0VAY_dfkpy} A(18@RY^g lw @! &3<@LVl s@ '@EK$`@ *@AG0P@ + 4@ASi r@} )@ ;Ed@y!{ "@60<n@&u@(5 ^jo@?sA3(Fp@ r}@*2]@q v+@?1@6q*@!1Tf_cNZUJ!#%+4 =FAIMQSUX]e@gmsw{} C!$ '14 6QFuPU\^bejm@qA14:>AFHLPCRTZ]_uwz~B#*@;LQU`h lAw   #B2:DGKOBmv{ %V  #' ,:@G@KORX aot~[ }3:@?J@? @?J@. harbI⏚j!~.1FcIRX]OttyMkui xXF R] i/ NoQSU [Af n s}  I '+29>BBGIRY\_bqsBxz &@,28>FNQT[@]bktz B' .BEGI N VCX\ adh mQrz R c#')0C@EG MOSXZ] `Khkry }B  Qy07 :KI&a@ 47< ?@#M s vB  #1sBP E R\ bein@r4t_@g|#D*5=@DL_l}  )+D13:>D F R ^@+hmF%-Ec𠵾\]L252]P"manuskript-0.10.0/libs/pdf.js/web/cmaps/UniCNS-UTF8-V.bcmap000066400000000000000000000002351354442177200230250ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE UniCNS-UTF8-HB–xi Wb〈 rmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniGB-UCS2-H.bcmap000066400000000000000000001245461354442177200226560ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE!a ^A ' vG%O9A &   1!b ARa %67`Zam7Tikmol *#8G%,I z$:9547632/105.-9! a%Kba "fD-)F#G kz&}$#q .#&"', $-.q. 0:<=>@ABECGH JR(XQV/B@r- ;]a l IZ.-:*+& C)VC9 5;pz g`}<1^ u/6(a6i#UXKpDm;M${ I$|j=z!jf%: H~]NZhMM<;@Rc:jM)kbr7&%HC9c>|}qzeKqZ$ }H9S8tTml5(_U`i(F}3fvU4 D9UFB8 "Fkw5d;VQ Cj{qgnX5*`a/ L`gq 0h(s}=q{a0ARd U7c $(I^r?Qq6qAs(GF* I!KUmJ(ClKlL8KL"jN OQPdQqtfFfS1-T_UaVeXf[zZ}]\G[[v[d&Rae`[yUfhm|aNB`X~YQN# %^LP-1m c.K$TaN_Q N"ip9bT gjhaN.eQN0~Pml on#)fxh38aN@lQNC.{z]d <9Sz`5 `\ PqNZuut9Tw{v}yD )YQN~ty921w"x/aN^ptQNq}9A(!aM*xq NT!"&&QNa1IxIkH/&?^w3aN+Q NєZ!xyaN.Q NݥnkrFq'N3#5N%L69X(:+qN;)>z?_@A.HHx2B(JY*v'OQ OZH#DQPN]\aO(S@/UQO/uF|CBKJWVmlEDExaO>^Ic eQOMJ9$3dgfONorWZM > _qOan*qp1q&r;tfvD:x9y@B}?P~QO=p 76CBq OD ]p  G-Q OiP{nM:"! 7)qOSL#\,H%.)rKiL,Q OכLe,QPOr NKDSqO4E6FrG7f)$9:Q;N?>@VCLDIQ P bPWsXsrKfYq PO)WRWS9UPVQ P%Y|2qlP/ ZOe4f`g\kL^nPp_Jq]vSzT{r` e}fa[J 0gM' >(y0b1c%d2b.4LKl89en;h=T@9BXE^J_KBfNQT,jgSZihk]PazbeFfQ Q27610 n)8qQ nVr@sPNtvv|G}1 RWUQQQ?8@ O1\8Au4}|aqQNett S%F'QQh<'Zzff9>uHkBk> 6q"Q~-0z/=1O3(559f:;<+j=3@AlBkGQ QMZ 4F hSaQJrMjOQQė$sr~#":: [Z}q QW&``a+Oc eQQTe5p&+o G&`i!xnCqRqsM s<t vCxn>5P7{|w~Q R(i:WVmQRqS'VhWTX\@]Q RսMuCTlutuIIq8Rb2dW e#psu|u  xU|$}}5fD| | ( hE^FDuDQ S>NU.srS~ waSK Q SN?pTNKf(,aSX$QSZpjQP3V;Q:ng=O /.7aSl+Q Snjo$)t N/j%HZ9qS{0a4L61Oe7b9b }:%APA(CQ S~ +fBq`!.W0q$SIyLOBPQUEXYZY;-#6 Q]?`|b|sM;cdQSߧm whDbU30OfH~[PbIl:0W]TaSkQTm'&kpx[ZU,4);-h&V@~2UaTsQ T,()D(E*.0FGGbw2q'JkeL}6OU4VW XlZi@[1\9:a5c1i3m7Rn;pQ U*%Y&^(0_+-V.E5 7^8*9Q UR2]xyx)(UTEDqU\@j,X@EbFooHdP]gJXKQU!X_Jihml3t RC3q-UeSkUmWrraXI{]|x^jbvAcw|={e0izt5jwlucmzyp}rLsQV, rS0gA>YN Sl[qV<x{t |4  oQ V`p@V>{i:YaVmQ Vo,PDED98},Nq6V{ n 7"u&v:'*+.f7k99:?}uBCG{~LJ[Lj 5NO!SUWQ Vژq> O|g6?FqV[asbTd6f%iSmkQ WsL&s4BbAq9WpFHt~vwzr|<')(@,9*+F/ 60(X ?JU`vT.^zuaQ Wd'&S 12ZSRUqWp#:&9M(65+<I240=4HB9!@QWCC#8MBIH~qTWH>KALIOz.X_l?aHcqDdEGFfNhW*iMkRsKtJx L!zQ|S~L%OP2(, U .TW -=8s V+Q XJc*f A6quXU35V:'=/X>AYC}KVN#R]ZSbTU[BX_:\d2e91fn_ryvY$}]~C%g& mu&)R;('+V$.2T/ CI"8$&())!+/011{57@8:QY"tCF_^/)Eq;Y2AhCKqC E/F|G0 IJ1 LyM =OP%2*4R3SMXYM[[^^"_z`old/e\rfziQ Yugfz=+*:qXYnwp >t&{vsw-~zz~^x}@H }  |S4 > -{ $<%S' * 6}7(:/;M < >BCRG+J(LN/OiRNYZ}[`?cdg" is~w~"y -  AB#I *|57!>$?$AiEQbG(M@O"T#U(w*V+Y%6\&])_>a b'gvj}oxsz,z~({.- !/ 0"1 ${/Q[P0 tu)\>tw} Aq[`5915P7YvZa9j<6=>e@AAQ[}XTYSD'zEneIe.a[G!IQ[1498- d}r`x<%V;7q [OIRV]iEX38Yz_S\8^7ai_6cGfeegQ[ݘ[?x tuM:' =_wvuq[u 7yj7Yzp|}Q\BB3~4.MC(_a\Q \:n;\CByx'Yq\6 -7 ) 8|9Q \7\3~BEi`Y!;q\Cy>=lQ`hZ"i%Q \^ :q FKvyzmqM\i+>.t~/v0`,7Q;_<0A+-D.3F4H/U145I7<M{R:94S;VW6X>AY8]^=_?aBg@mDs,zACt|*}]~J 7- 4  DK akLJ!I&GF')( YH*O/PN7"?WV3A DMKRMT NXYUQZS\Y `Zlqmo~[\   ^3<_#i(0)U-.4+\5[W7}PF 9f:5$-X=X<\>Q ]wsVIS)za^ GJk!LQ ^ =~)H{Yq0^OC{ V)YzZ"\w]'%H_#6acb&ddj'qr(t)v*4Dw2~Q^rD.j54OjwF'ohq ^ i< 53 Q^=Q86?6'vS;u.ON{Qq?^5V`V:8B7 9 $w3.=<46>:x.v1=?A@BECxI|SJyL-[7skO.R@vSQ _T;:#")(sq _Z\=f_[?6condQ _-pj#"/.gfiq _6j<mrn>qnv0wQ_Lled32uaT5,q_Z~Tn_T[. d ` ab^4Q _*Zb_K(e! ;PhqK_7Enf$gh!^ i V&j1(k.#/|0lj2BAk7C9<';E w<D=-+?BQIDJF,HNyJOGKeMQPPRQ _ O:!l q?`LUYXV8UZn\]Q_Tx1`[b$S|W/XePhRm9 rZt`hu~|e}ck? Q `gw?Ta$ }cq)`q_0\_^8b&gAinh!o"c#dj&f'+(Q*,]-Q`:kj+0mf{q`3l 5fp=Y @E;HQ `جo432o2:) `a`MQ`Lw0<_'hT#ZJG<4cq `S"9UxY]_I^yiaufC(=jKslv|nt ozr5z:|3{K {bZ 0  ^]7$/_p;2NRN<!|kC "2,?X3:5<>6~7.<>{D`F }G1HDKNmTmW^#N6[,_` ^i`ltn8oxQ av[0[Z=}ab}Qby8zE?dmdYA /d9J|abQ b|Mab( Q b*)FSR98AYjqb5<ts\nKuvm: =jRu."E$h+Q bf!"r3L5lggPqbq.m02;426su/7R: \>Q b]G;e jGjqbF<f|=I9J+L<zNR7U X=cYwZQbS_>hiJC*OsqbkSG&o{+p7N?tsxGz ~Q c>IQG\YYq@c&/soO DWQuFbEQk V}7e%dP&6P)]*M +I-:.0JP236A Z7Q c&9rR%$_W:kac<;?!@QczogTIHI"+6yrwacLWLNQ c?o+*~ml qcTWW[X;Z>Ym4],^EadXgUdh*i8mn#XpSsqtHuTv*zV:dN{}_b[r'm_6`F ^ ad clq6[z2 Q!^"]e(`$%`Z+,K/a2e@3`: ;g>?_B^DijEKfLQMjQU/hVlX_\,\T_Qd *59~l76IB-,adjQdgudmzA|I>EZadkQ dʾgkt~-,adqpRsLtQ dޛH\ eqd{R$me-Rfz  c  s<Q elA@gfy^ed{q$eYVct)|#u&$ fl(2?)~*b,#1rK315y7w8Q eUg?J=<}q e_>M[AChcGQ epj_>ybq eyMCVSYL\\Q eA/h98WV5aedfbgQ e@sB'& C:}w9<#;#=;9K>\@5s4DEG,J5K,NTOyPQ g&,.Gh'oK0,[q*g2Yr#[_+ajcdFfTugQiY hjRkimrSWHsvUXxQ gms I,<{mB?>7qgx}b>pW(`  Q getn/. pagQgwbZ{vGm2wvczqgmkOBqt'pc (cG<2Q gذeWF9F10 qg80:g=`?OcxAA8BuJXoKQhEyorL;!ZkqhS{`UZn]idvk"tnQh~!~s)+#- N/0-2,4u5"7 8:o=9%.>L@#C@D!EA(+F;I19O$Q/| S0F]h2^3_5a:ce1hvk6l7''W*tFu4xj~8:|> B!"<*lK!>)?L,:b012L67=;<H?C@wAKDCCH>tJ]LFPMmWGXh[]\A ^iJpNruxr|IPO5Rx E  QSO!8%4n:{q;pBiCDoJN PTuXt]}ayc~fzm4QK 1nx p`z2~3zc{45u5c - 6Q k_K75!\[q khY$3x(5R)VQ k &c6*%GE.'q-k0Z426\7]8:_<>` C E=z GzH[JOMn?Nj/PrTUDVQ kҋ}b} 0?>SqkZR_Txg jUmWnXqVt@uY[ZmzQ l AK@/k)X a"al^rQlVETO@SEJ4uFj@CBIvq0l6% oR,ptxq" p]!E~}j "(%%*&+*,+-%/w2Q l\hY! q l6'8%:&<l@'AQlj EK#$EN3e(l/Oq.lH;5 Jm2NMtUOsS{V_W.Z</E74\W_ca6obCceL9fQ l:lh {fal1Q ljegG&Xwq*mmEoDqAtGuRx!|FL }sC@ HJ <]P K ? QmA@$#"Ig h"cwX',/KJq-mU0XUY[!u#}6%R(d,ZO\.Z0p5\7[h8$:>;Q=V<>Qm!B &54kH]E o-^q,mFjmHAJdL NaNT*^j]W%Z~^:b'fce_fbg>idj^fmInQ m'_^[:C`y:)@qdmsvb{ki2`vcKg1\J{ ?zu Q kfKVtW3qc vum%r)5*S+`-]p /n:lk <AJMwqNCPwU5Zy[8&^_na}c~dfQ nR.evQPkqnmJop!sctBuQ nˤ)&to{hqp $san|O~Q nޣLT34ILq$nK$ / H`  w:NPW 1#(A )Q o)[${b?>3@#qo4/12#7J8 <?:@>C4E WH.JaKNOP ValVWXjZ[\c^sa&_b-dl(pe+sduwbx^|D~O 6!) ]+% $v%"m%#&P'/Z0S12id7U9f:_=x>OAQ pYR94a`3qIp!F(HXnKRmS+U*Xz\Vh`9g,ij mfoo-s Xwgyou|'g}21s#L V9 Y HNJMO Q pS}xoar#"qp'RID*P+Q-.Q-1V2#6>>q?uBQ pKtmz =Q#(HeqpIzMO,PSUro^WcXeUYfp#vg%m qZ[y }_ "abXV]p: ?!qv^n"U$r%`\(b,c-x/5':U>(@6AWdChHgOIR|VeWfXr[_Xab:fknj olrYt'iv2_kz]l< Z  IF $m %n/01l94Q r5#a+pZ?+q r@7Kq>iAjEQ rVk8 5>KJ mli?qOrcME$P~QBFU5W Y+ \LGR^I`~JeKfLgMi@lCtQv,z o~Upqr1/u~t3  wv3x_y{"Q r\_tCq4qEr$~U62=&()*037 E8R ; = ?l-BDCE&G5T HI@vKL?*NUWUX\dQ shR0+Cn-assnQ su+97n%B0.765qVstIwqyVz&{}p  :LC*! ,j" $#s%'F(&/+3h4%8*9):k=- A@LMoP0XQ9(S.kW87`fQ t%2lkjutihmlqqt1mV>ojt`v9w\Q tU< .q5t` ]%j?>'>@#C$p%E(a)F*B,J -A8G9[=bKH?TEMN_ Pl\]`LbccQ tdonon95H"9q"tm\tx^Ly%   Ex.C3p4Qu((~u$`QeVI0r+*WS(Omq1u< "y#N'|){8+zF,0=}>4B8{:IN=~CD1EFKN PFSQ u, lmlm'c(auZQ udnU`oFqu^fec2lkBgFdif.%hQ u¶n o@aulpnQ uҠ "Os8sZauuEwQ uj   QBq!u|xz=yz|d.w } ~{Qv2En!"5l\M5R,#q v. o  "Q v;3[:+6{5qvD&/(1)4+12,36N7Q vbo>Kd Kq:vm4/e7<HA(ibdC0F%G%_-HYJ.L3N/OQ0%S1\CedHgIh@klxp@rP)tumvQ v͵ ?I`gfoATavz9|Q vn=ZwZMf{qiv"aX)0 M[ 8Y\AAZ `^"d&_'b*DL+a.U/cd4J56"9h:g=eDiULoN$k|Pl#QjR/ T`opmpcnfqn&lrnnstsxyQ wRPqp$->qw~u\vQpw~ & 1J QwOyxA@) !+hqnw)F,".#/L$i3%9@;(9>y?&@ A+B0C4F2: G5H3*J*LeO"-1QdR$S(UAV<W=[6\;]^+8`beiken>;7zobv1 zBP\8^ @ C A?CQ x[h=<qxd7aF1fGwkNH!$KEk'+IQ.J'1l9k<L?cAMCOD F\HjJL MNPXP\'aReQjfkglnhrStUx\y zy {z {~ C |*c VP3  L#b%)f\ + 5" @]BE[8F GQ yR"je/?y6GqyOLQeSlTUUSpXZ]\?bQyOX!?>/Oq%yj&qMsutv$#w!yq} %~&iH%   WQ z7(hmlZy,qzA %%$i+*),`1[:@}A,EQHnkbIQ z,^a@yx~cbcqzPLT+NW"3lY_`\l!]Q z0}x56qFzc%g9ijlGp$at8`ubk v_ihc/` A 0 GpcdHfUeif k#q$3h&o)2*w,r-Q {$t7. _lq{/3q5u6m:V;F<v=zAlC)D?|EQ{OAv~5F)(ED#"#2q<{^L~NOdSY[{]w^_`&bec glmotrXs w5z  p}Q3 Q {Ľo<  WVQ+q{OX^ c"$%'T)f*2-12g3[9A<=CjJKlL!^N k P"\P$#`wa ! iiwn:y|em e#\uKJ. xLlhYT NMOO#P%_&}*-Q[/e4RZ6T8Y;UX<4=V>]ZE!FXu|&DH$[NQ |uJpCByxEDafxma|YQ |H$A@~# &q }X^_'aQ }# '&/9sPqL}eMslhEl,oF1&% r$w(x*)z{>|1},5 +/hd!@|J-Th Q!3(/).+0[,X1B49<6=9@iBQ }EbKQ6CddqN}G_82tJ1K5O;Q73ST^X4Y= <[nX^?E_I`AbGVcegC?h#iBj>l&mqNFKDy'L}GIHB n J\Q~1;( LK 549q8~?NRQk U& 'T+{.@1&a7 VYX8.:?zMWAHDSI J_KnL$pO:PZQlSQ ~SIHcb;:/-a~WQ~@X(,v'.[3.R9sOiq~Wg[L\F)%.T_x`Q~͚@5 It`nkS2./Oa~fQ ~$R} IPLLb1q~jEl7;eo*\p8arss]j-v]xnz^{QO!ZIf m*=q:! j  ^`Ra b_i`jbpq7)rhtu@vz`{wLBj,  Q b>?>on54qP\0D*E!H"r$F%&G+I,y1mU3^4[58<u=_>.AU`BID5gbJacMdOeSiJTfU`ZJt[2:^IS_W7cQ 0h545-,%Wq)gNiOlPmQUToBpAqVs9tX51?uwx{yWY{Z} D/[Q R\N#";:_^{a[ ]RQ oo N+OX/azy8Q U^?LGF/ma"q(QotK8OD{I,9Ua.Q Z4tug.*{' wa4y6Q k  LQcqppaa:x?Q ֗V C:aG1ImGKzQY\/2nK@WVq QS+URcW,Y Q #5%.O@"GF`q^ `m'ops|ytAxQFFpSRKF.R=<14WAV@aWI Q eeVa`sr_xYlq)rw4FH-y}&%y["'#U)*%,).003*1~9Q AX %4AS^W.q&@cB-D+EEJFpNFO]^SaU,X1Y)Z@_a yd%e/&Q f}]lE:q hbj}kEl)rwZs+tQ (0 x~y/:q834%w<2/{3|6~7X89: Ga;<o=p\[dq x"a\#b7c%+'g(Q xd &;0  q .jsk2n$4}5{6Q4J%$!{?HYJevA@q:tmX<"=hn>x@~B<pDqvQ ͉Fkt)4b5:aGQ ےNp %1"kEqKtN&QRTVZW XQ \{WCtAB$/q ] _T`ac&d. f^GpQ+(ur%$-,K T7q=w%z#|R"~$!iY^GQ] W%j/q^78snq,m20 5B=@<m]+h!:$?&C';)D*8+},3E?9 04t6Q 4mqtip\]7qe6^H8];<>)?AVEQFKGOJWkaKJNo\QM`+cUZZP]_I`Y$aU4bqNM[=XdTeMkRn_aSt wr{I~Sl m  cFwedkbnlGQindcf\! }|;Ldot{q{':.gj2p3q4MH8:N;W=~ ANpPQQ R.iQ85#qrV9X3z\u]vg_y`6b!h.}ikwl/q5 r<} ~ t"oDQ  8Kv; 57'B*+O-J.=1D14K 5;6:P=>4&AKCGHUJKDMQ *boD(?>IqwUWXZZO`Jbfgh#k"q!?r%x6tCo${& ,GYT2&W( '#X)BS';*/+3Z6V97<(@*Ay D[NSO,Pa Rp7Yqn_qa4eIfBBgmihm rpsqDsQ y,;SqZzRzyj| ~,}x{  z!$v% & (l* -j.0m4 8 ;~<!Z?)BCDWFHQ z0p%$_JSR_^]qHQ. S#T*W$[)](_+a!d&,f'<m4ovp7t.u]v;w2}8:<2532 \  19/-F\CB65=El}$&&?+GID->.K1J2`6N7P9{<A=^>QL?aAO@MCRJTNUPHQSUkVU[W YY\^_Xab e)VfYi]_nWo?VpZtow[CX x) [\ v] S*?;'lmI&"Q hV xW!v?>as(S, -Q })() v Mfq_2@467;/>C,HI$OPS.X/\ ` -b0qd2 g ihfjAlX,nBo13p4q8s:5z "{ U~7'9,v? =<6>;G{A Q 09T2wHGFQq@9'])C.R0= 2*@<CD:F?IDJMkNP-REZ]1^__-ae2hk6m8n:v<zd}9~=>?RQ }u,<q"; > WYZX3[(\]!@ $ %&}_K -Q ~pp ! 'q;4j6bK7x8b:r;P<S?e@rDF]ITKgLO^RfThXYd^j_k`i=ajc=egvgi7kQ i, wvt?nL}qvpSspunwmlb{c/|~~y[/6wQ = f$K OpUq GE\uF4Q ilGFon]\QPQ+q%`(~G+ ,u/0 S14 5_7 8Q}08~gf! _l]LLLa@WBEFQ u5(s|[Nkq8LO_S T Vc[:`x dnkrx0hyDz^H U J@SI!mx${%Q 6'&)=#d%aQ )v}"#KdUaQ qVK&VUu, xaQė_HoBKmv#(}q#k&B'tn)E*GXo,>W6-Q'ꁖ1k\P4[Zml4X {mfb2)(?>[@]L;J9({qU<L>>CABZD3E,H(IH&J L)vN1P!4=xvHwAC}FJN`TTwh[]bP9fQmSoRr7sUzT}; Y$:epd0aQ"83 NB=k|l:!mH?9+*6+qQa2Q4Q3JutOti; %Vq5xTs%)7( G*+.1/Q f-PZ;: a4=9Q Z-g{Js'E|k\]Ny\a2,Q4LBar@>qpO+xnq E264.7P>QS;1(1>WFaeb E> * xO0qphC FuG<Io+uJKhTpQVtZr_qazdilnpsx@xz{|9} (ZY%! #' $u,/tK)^Kl*-$.1$0 '(w*2-345277Q )L  q!2?0<A;9D=F:@H6I;?Dv}KBOQT]-_aQ l&wn7<98Aq wgjGk]m-nQJL'&maj`MLSl oqfuzN{O|~#&x"p{g6Vx` ! '*.4:?@A1DEFXGN fO&YT;Y:[[p_ b;fhp7jRl3E!m(o|0r" wQ_Ft(XedSLy|~G54K[q qc`fihj^lmnQ FR-7F&asQLpZ:onWod}a  0OQ }|g%Q@Lq#=Hr%=aV"M#>R?$N&Iy4u~'QI>OJI'lFT?q-E{/Y.14|Ba&HGI6Q J*P\YX! 6vK){K9|AM.@<"q'$=J?QRE;GOIdJ/LGMaOSP[RSUR>3VT!&VLXWQ [Z"X76! UXeaf]W3_%{bQr@./$10I<+hajq_lFamQc) 54avl*yy{Q{'&! "%34"!mhqHuYwtx  4sv"y}~|y1{z R`3"${()4+, -G/<78Q92;?B;EQ -JOH>]\[q 7MO W Y!4xr %zyZu[:_pa}c~}_|KeQiT32Ju|JKO<N^azkSnQ TihUT7Xqv xU{V~  $  Qxz98=<A+5xA_"3qxsxwHv%E{#z%m &}1y2~M38:=]%@Az&CUKOPVW 1Y  [4]acfVi lSmzNoqUt w|k*- 2 { /,( /<Q 5V)0v]"+ Eq$%&M+Z,r>-O1C2W3<4)7!9 ;?EDF#:EI=JAK <;8M@QMRUXKYGO]0dFeLgR0IiQJlRm8pyq+sM%uLwmy7zJ8N|T<UV hVWSH\Y!U%}(~+|.Z/^1437^=`>"TGQ cyB7Rb_^QqvM OePaRbXl[m ^__j`nc9\ghkojDgk[l o+{q|w}"3 *6soxpuA]$z'w(*$+{.#2y7f8=| >I}KrLQtRNTFUYvZd?^\ c"Q a)m~EaSR)QQ aQz9&wq #+%,&n'G,Q KD}G5tcbq;0e7f:>=h?^h@BC DiFIHJpKF@MP|QkjR}TgmVUQW-Y [L3^cp/dkeQ lA6C.Lslq=*ilfoQmnowp? sotCvpxq{Zr|[}_std u  CvvwOuyI}?@Q E~[V }vq5 i Cyk5 GIFOKs!wONJM"P%l'A(nQx)S,RT/,4U5q7E9Q Jth{4G,rca Q Knkl! ^qR4q% =tB&>?@2TABVUCXJIMW]|(OQ;E(rM,sr;L3Ihr aNWKY]{\^Q [F2W Eaec_ B$e`fQ p89_hBayjnQ L X%$;8'/RaxQ oDP-WP0a }bW?Q fpZp A@u9,Wq7z4 &n"&I| }RVDW! "OaR&c*Pb,,B. /C0|23e3c5df>6 hg9A<!>C)D(LiNjPkR]S_:X l[ ^_2b]`kgma FodqLWkrtCjvJN[HI w;#JLG~ O"$N(G)M*P,Q-^5]:<_> }?@EeJgLfM3(TbNqU{Z[QI25>t5 |S/.q5FA /\h?4kInHrtKu}{~}LC9ZsaMNvKQ@P R"*#rS&Qo>*!F39s-p g`ie"@w'?Z7@adQ * 9m,g\- Dnq|h~-j@l.Cn/L45x6N8O=8DPEQFK7M:NM;tPfJR~SgW!XqY["\K65cd-gSh#kghl$dn8r%tvCx.~i& 5'(u)k,jykjfgl -#$Q mVV^/ZPSF q x&(f&)5'<*Q (C#d;>[^eq,.nnyP /+:^<mB?Ai BW N%J\]Q  4]\98=@Q fudk_H 4q*K2EFMHLIO`J5M OgQPR Q)SRWVTX[W\X]ZY\`[b]gQ a,\!q4klqmrnvpzruo{sq 4 Ltzuv w!hx#P$%L&H*>`+sF3Q A Bwr,+q_J8eeI;f< >dA9BJVZ\ e! f"p'9%q)x.+ z*-(9608 7E&:'C+@,=A/>0?@2;3B7D:9BLCGKKINHPJ QM]4_Q`PRbOeQ 126(#"ihon+q:<lTnXtUMv[~ZY./F&\ , #1H Z   "$%&'7+[,$-%.'W//0U3577>WA9D$F;G=?B\D JKTZn [fCklmp}ros yG P` (6)+v-ABKO PZ]LbDf` lopl q". #  % $&'") (,4Q!Qu@98qtT*a(7Q -e*ML%$utqT9A>fC@DF+GKAM5BNCOFPUGQHTIUMV^N ]P_QR{U t`V|X}\^[dglmqrwtyn}my[x Z S* *A   3 j  i"U#Vv$-w.xe/t02s3q4_5 ;<EGNO0PQVFk[S B^_ce0gqhjmnrswm~n-o~u73"mCT4Cs a&X j(c a0 +5 9Gva (05;EM^nG`manuskript-0.10.0/libs/pdf.js/web/cmaps/UniGB-UCS2-V.bcmap000066400000000000000000000003011354442177200226520ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE UniGB-UCS2-Ha VW~[?>HRFPiBD= @A 32   manuskript-0.10.0/libs/pdf.js/web/cmaps/UniGB-UTF16-H.bcmap000066400000000000000000001260661354442177200227460ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE!A^J vG98< & QZ 1&#b W e-7vO@mjT  z !<%e {tg   9  7 IA"D J59A!/&6XYOH}r: .B)}IxARS{  QV/B@r- ;]a l IZ.-:*+& C)VC9 5;pz g`}<1^ u/6(a6i#UXKpDm;M${ I$|j=z!jf%: H~]NZhMM<;@Rc:jM)kbr7&%HC9c>|}qzeKqZ$ }H9S8tTml5(_U`i(F}3fvU4 D9UFB8 "Fkw5d;VQ Cj{qgnX5*`A0g~# Z* _AOpfAOc W:+j _AOfp QO=p 76CBAODY[" 5Q OiP{nM:"! 7)AOS 8EAOťHRMAOQ OכLe,QPOr NKDSAOrZ)AOE=NAO6omQ P bPWsXsrKfYAPeZtw=6 Q P%Y|2A+P:OH)v!"+$EZ GPt #7lIjP}|-0o^1 67-API*_6 ^1h?+_V7<s;$SL%A P;e ;X Q` "#,Q Q27610 n)8AQ@sA QV  1 t=| AQretQQ?8@ O1\8Au4}|aAQQDa><dAQReAQSQQh<'Zzff9>uHkBk> 6A Q0]a`&|o A Qz; n+*SRAQ;Q QMZ 4F hSAQr>OQQė$sr~#":: [Z}AQ۔&rk9xQQTe5p&+o G&`i!xnCARs2~#{o)*HlK3;8MARnAR sQ R(i:WVmQARQQ RսMuCTlutuIIARW x1Yb 0nm3EUBa!nV:=< `AR2`%F4ONARd#.   Q S>NU.srS~ wQ SN?pTNKf(,QSZpjQP3V;Q:ng=O /.7Q Snjo$)t N/j%HZ9A Sa+H:U~Nd1TQASAAS6Q S~ +fBq`!.W0AS49Y Jj$-%xlMZSASySbQASO QSߧm whDbU30OfH~[PbIl:0W]TQTm'&kpx[ZU,4);-h&V@~2UQ T,() -@s*w$A TC     A TG   Q TGJ_LO^;q8A TER/-qQ TgsV632G AT9QT%u1iFFGFEZkA'T̪'S|-UZ MV/o(t?Ejyr.po,:G ISA@  CPATG"HA TC"Q U*}t Q ,AUO' LAUT Q U{ZGLYB%AUta{N#4]\A,#AU [iAU%  Q UR2]xyx)(UTEDAUĪj}j)gAUXN#AUE QU!X_Jihml3t RC3AUk #1b kjuz ?<%,AUr"  WAUW   QV, rS0gA>YN Sl[AV?AVL & AV@{ Q V`p@V>{i:YQ Vo,PDED98},NAVvV FAV $AVnoz`QI JE e<omQ Vژq> O|g6?FAV} ZAVI{>WVAVaQ WsL&s4BbAA!WWm@Q`KPEPr!?kk*EbN!6 @kAWFAWv Q Wd'&S 12ZSRUAWwM #4b OAWAWs:QWCC#8MBIH~A*W> RY$/$o-W'{ v{=X>(A W*? > StAWK.  Q XJc*f A6A,XX}/.mrq^1O:BGGuCB cJteV==K&0gQZE@YAXW Ne0)^'2>y M</PXy K\AXc=(.    QY"tCF_^/)EAY4hD5]GI{)M%fS_aNM B{'*qAY>|*<{QA Y;E Q Yugfz=+*:AjYw]hN( oU<{sh UBS?1FAE ;e,s `TsA{nO%PErH~%2 _zd 12 e LY^; $    u.B _^WB  GFAY-#]$cT9'  - 0?0AYv!&$ " ~F* 0 (Q[P0 tu)\>tw} AA [b9-2Ko8T?NI\A[kZ A[r<Q[}XTYSD'zEneIe.A[!Q[1498- d}r`x<%V;7A[I ({dOId}7f7Aqg E~A[3A[X Q[ݘ[?x tuM:' =_wvuA[jPFBy$cA[ 'A[yQ\BB3~4.MC(_Q \:n;\CByx'YA \"6(=(GyxQ \7\3~BEi`Y!;A\E A\HyZ7cL$A\PhQ \^ :q FKvyzmAb\ntmR7e> t5<32|  qd{lely1(d' T :vO@;^\ &G 2    _ HU` J$s <cReT7KA\l>4QRd%x4 k`#0 A, ;'Vx]A\m.&:  3J $" 4 Q ]wsVIS)zA^ gjQ ^ =~)H{YA^&{H EN;ZV!mA ^%C5! :|m%$A^,Y  Q^rD.j54OjwF'ohA^ v?[pzQ^=Q86?6'vS;u.ON{QA"^5]FK#60  OL  Q9S5f%IJU5]]jA^`3Ljqt&dA^ 4B Q _T;:#")(sA _zPFXiQ _-pj#"/.gfiA_9V`w^ Q_Lled32uaT5,A_i{ UA _]T2+u\AjA_cQ _*Zb_K(e! ;PhA+_7nF<'&srHdR.T: )!.en=B+*EV|A_E IbA_Q _ O:!l A`8X1y`p_Bt8@ P#U3zv W&A` Y   tglcbA`\%( Q `gw?Ta$ }cA `s__ZKG "R5hSA `z_   A`wQ`:kj+0mf{A`l / 1dQ `جo432o2:) `Q`Lw0<_'hT#ZJG<4cA`"d-A 2q Za*%} yi$WB5*k:A9`98; d( t qL  >^[IyR\ g6@^+By0`f[):675 ]Q oAa] #6  &%.Q av[0[Z=}Qby8zE?dmdYA /d9J|Q b|MQ b*)FSR98AYjAb7<A"GjV]`'1Dp$yDAb=tAbBQ bf!"r3L5lggPA bsmJN{r; Ab~sAb}6Q b]G;e jGjAbf* Q2 zUL&.+PAb<AbIQbS_>hiJC*OsA bS`{CW^qf&AcNAcoQ c>IQG\YYA$c(/ Dx[ . I#Ti2@m5rZ)q:2xf6uDeAc>Q)kHkgAc)  Q c&9rR%$_W:kAc;=QczogTIHI"+6yrwAcWhQ c?o+*~ml AGcĩWA4Y 0$cu^E,UV9RRyah b5QSy<gqB.b2 P: ) d OL:p;gAcO KH C_|i . g1AcW       Qd *59~l76IB-,QdgudmzA|I>EZQ dʾgkt~-,AdשpB@OQ dޛH\ eAe Ad "dEnqH&YPOAd Q elA@gfy^ed{Ae%t+*u g|9xyAe"Yu$g8HAe-# Q eUg?J=<}AebM  Q epj_>ybAe7apaQ eA/h98WV5Ae> Q e@sB'& C:}7Ag~>Z*8Ag|b Ag}Q getn/. pQgwbZ{vGm2wvczA gO ? dr.DAgm  Ag Q gذeWF9F10 Ag0^\Po >Agg " AgA QhEyorL;!ZkA h{7<#2? AQhSA kR9(Ak@'Akm Q l AK@/k)X a"AlrQlVETO@SEJ4uFj@CBIvAl8%;2yyL1!X1{jX/"K5|GAlJ" AlH Q l\hY! Al'KDrsu&3Qlj EK#$EN3e(l/OAl ;435t){#"F5"t_V1vgA l;  AlNQ l:lh {fQ ljegG&XwA m +3GI@5_+A mE    Am t   QmA@$#"Ig h"cwX',/KJAmY)NMqp5j]hU)M$+Amy\ Am[&0Qm!B &54kH]E o-^Amj{&;L*'6fidqn? X| )^JI5DAm^AmbQ m'_^[:C`y:)@A2nbzoZUX16mT%gl tI2Ak:;6.Xnq: -+g/r]3OAn&sxre&An  &,DQ nR.evQPkAnJS@An 8HAnoQ nˤ)&to{hqp $sAnڎOQ nޣLT34ILA n/:b$s\ wrA nK ]9.Sa4An  ,Q o)[${b?>3@#A'o6Y X- ]BLkjg O)jS d     !]A'o8TD % 6kz+Q:Oz 5b J+lYz*  !Ao71   "* H` Q pYR94a`3Ap#(cd QRu~|}^bs{; Of  Ap'X*>C g6" Ew4McAp1R,$Q pS}xoar#"A pI toHDm}@dyApR Ap* Q pKtmz =Q#(HeA"p]M V Je$ & sij.clvu8"Z? u pPF#ZA6pzG,h h s8'Lk  \g(/( = <_Xe}jifc:# ' FApO*3N &* )60 Q r5#a+pZ?+ArGK5*BQ rVk8 5>KJ mli?A)rfEC2#+Bl  uJ54AAoj',Q^<BAr}Lf _4A rhP#(.Q r\_tCq4A#r~SG UN |e~s.@UZ j 6Ar6s8nB-+As(Q shR0+Cn-Q su+97n%B0.765A/sI1HabS@ ;>l3ln  a"./0 x}}N@\  3As@A sy. $Q t%2lkjutihmlqA t3n1uJj*{ DQ tU< .Atp>P oAtc]wW 67   & / " g`#,At# 5RQ tdonon95H"9At\LM%p{xd(!xyAu %Atx$ Qu((~u$`QeVI0r+*WS(OmA uENRm'@A} s~ \Au>D "!deWV Au?" %.Q u, lmlm'c(Q udnU`oFA ufi$xyC[9Aue AucQ u¶n o@AuͶpQ uҠ "Os8sZAuޗEQ uj   QBAu{LAux bo   Av Qv2En!"5l\M5R,#Av0 C:Q v;3[:+6{5AvL4AvI1A,1vAvH( Q vbo>Kd KAvxHA ~  MV9@ YOTOAvo."  yh i ,lMAvF 0 Q v͵ ?I`gfoATAvۚ9Q vn=ZwZMf{A9v"l_ Gi8@10 /Gt=q(EM5r: ) _^ wC fXx/2)lAwO+9uAv   !,9LQ wRPqp$->Aw\h cAwurs [-Aw QwOyxA@) !+hA#wF yf", )+p~w z?txdc8 9l O6 a CIJ3Aw"   lYZ Oq Aw. * Q x[h=<A!x7-Z= 8 5D{lQ X8s' l-pd ; /\~* A5xd=>?^ A 8?,-49,+(+Mv+7   <j ) 23&G]Ax5H $: 5NQ yR"je/?y6GAyƍLO P8'BAyնAyʁSQyOX!?>/OA y&L10 ;6.y<mAz$  R +Ays Q z7(hmlZy,AzF%t`GxA zL$w*I~B#Azj@ Q z,^a@yx~cbcA zL<DY_piAz Az\Q z0}x56AzG 9 Jmti`aM JQg }|Az%& x,1}N uI   A zƁt$  Q {$t7. _lA{:V^ ;*A{1q +A{25 Q{OAv~5F)(ED#"#2A {wwG" I< G$1@A{`~DK t   VCA{aN  Q {Ľo<  WVQ+A#{ӔOou \:/3 6%t0UD mfvt h4ESmh M /xslEA6{ѹ%s  NK^8 Zgs&U6i0]I6z 3  4sNA{ҁ& ((>(: "* Q |uJpCByxEDafxmQ |H$A@~# &A} O*Q }# '&/9sPA} M<OLM>rA'}!szh  +Rto jypv>teD3YP=v+-lxQT!A };w "  Q }EbKQ6CddA/}_0 }1(Y^  v?*id-3 ynu^X 9< an;H {n )W ]A}&A }J !2Q~1;( LK 549A~ANA!~ERM Rgz35 v'UVA$gJ/jm>]$A~S& "Q ~SIHcb;:/-Q~@X(,v'.[3.R9sOiA~ʇxA~gH ;vJA~[ Q~͚@5 It`nkS2./OQ ~$R} IPLLb1A~Eb-wVB/]Fu{#A~o A~\QO!ZIf m*=A( EQQnr$ Qbhm8vEH(NG|JIALbnA 7`  Q b>?>on54A\&rEgp+6u+\A)? ~Rqcl@ADXY 9`   r sxA !  " Q 0h545-,%WAN}~;<Gve}n6lTVA,BA!l Q R\N#";:_^{A^ yQ oo N+OX/A}y5Q U^?LGF/mAqQotK8OD{I,9UQ Z4tug.*{' wAyQ k  LQcqppaÄJQ ֗V C:A1v2QY\/2nK@WVA+L_rcQ #5%.O@"GF`A/'4 A  NA0oQFFpSRKF.R=<14WAV@A`VQ eeVa`sr_xYlAy4"}Hy vB # ? A t: #<<y P_A  Q AX %4AS^W.Aa n>AƠcve25*S9Rwn n/4mAˁD Q f}]lE:A}$_DAbAj Q (0 x~y/:A5%] P#UDR!  WVqvA82 LMd/7d)V^A:{ & Q xd &;0  A j{jonuQ4J%$!{?HYJevA@A t+  fA"A< Q ͉Fkt)4b5:Q ےNp %1"kEA tT $yxQ \{WCtAB$/ATm/A  ./<3A _Q+(ur%$-,K T7AFR]!/A@%AH~ Q] W%j/q^78snAo0ah  !b>K8 YL-*A+ Y jA&Q 4mqtip\]7A3^-(ZHQ(  sxYj/7Xk Xk`B4 6}<?0CB YZsliA ML!2z}tiA Ɓ; !( Gf Qindcf\! }|;Ldot{A :^U^gL OOAM A2 *Q R.iQ85#A1ğ9  "Tg .  !%>}m nT w/<   )A˾" 8 d =c.;L% '2! (9bH Á\   $  Q *boD(?>IA%  %*5<_/hSTuK@| IJ kB.  opA"M ^sjnc" :` - 1< ? } 2e cFf+tmA W$ 02D*Q y,;SAR#(& Bs4@8{ d:;q<A'z        |z{A Q z0p%$_JSR_^]A!%l+r3W-0qs>z  yR)'&IA[".    lg j{T[0*3 LrO  *%Tu8 (%.- %s X{()x _923Xp#0!EA$S(6!. "   $ Q hV xW!v?>AwS0AQ })() v MfA8b@=jGly+d xEz% I2Q1kS @ |fA@) 2,&U# ^]xo  A6" &2  Q 09T2wHGFQADRT A;]5r'"slwFYZQ2lI"b1([AeIQ }u,<Aґ4(AֺW;m)Á Q ~pp ! 'AHAjn/'-E{"gXz$KI uYX[?.\?A 6 Q i, wvt?nL}AySai)A |p6 A{ Q = f$K OpUA\O_AGvSNAQ ilGFon]\QPQ+A`3.A / o^A݁+Q}08~gf! _l]LLLA WTiQ u5(s|[NkAf^RA!OZ aSz WPIH[I&j[ "]{:A'S/H8TQ 6'&)=#d%Q )v}"#KdUQ qVK&VUu, xQė_HoBKmv#(}Aډt mnA՚kSA֦&qt#,x+Q'ꁖ1k\P4[Zml4X {mfb2)(?>[@]L;J9({A"La`QR}JQA@:6Ct! @6;`hJ\AGv"# Q ~  Lgg*+kfi`A3l|Q"83 NB=k|l:!mH?9+*6+qQA2/AQ3JutOti; %VA 3I<j@z-A5A*Q f-PZ;: A=Q Z-g{Js'E|k\]Ny\Q4LBar@>qpO+xnAG6?SWfmwmQS;1(1>WFaeb E> * xO0A k ^#W O/\R? pqO| 5|S$X?vJOBA"mu  DJw9  / 1,FEA lFLf Q )L  AD6;8A40ipM VWACHQ l&wn7<98AAzTGUQJL'&maj`MLSl oA&Gh-rA7gjEH/ kVc>=NV" knMP~%8p =@E@W^KiPs4?"6sYbA z5H)< /:Q_Ft(XedSLy|~G54K[A t`#"JQ FR-7F&QLpZ:onWod}A&:Q }|g%Q@LAHAd.K jvwvhu^ oA=AÁ QI>OJI'lFT?A YWNz1uC;AEA{Q J*P\YX! 6vK){K9|AM.@<"A&J ! ]=/.Wbq@DkTA2;.+1NA7I Q [Z"X76! UXeAhW6*Qr@./$10I<+hAq%MKQc) 54Al%acQ{'&! "%34"!mhA!u9:WL|),na p[ZALf !"AWX3h>-A Ɓ   Q -JOH>]\[A9 -Zwa>'=VA: SAGY QiT32Ju|JKO<N^ASQ TihUT7XAVZAA  zQ#Qxz98=<A+5xA_"3A܍% ADx_Zmwj  ct _g:V# j& 72#5<'*lu3&whAf!(ow\x 9Dg@Aց  &*"0 Q 5V)0v]"+ EA'MQG7u x_` mk.-^5b Lf {h yO $%%. J]. bA)% 05 :C,;6    E0 >m$%.    PIA+"    , Q cyB7Rb_^QA S|A>  72[nDy(D e  + x 9H1>i`F;f1*''P QPUVMO,%48} AO("*  Q a)m~EA|SdQ aQz9&wA+rsrq0Q KD}G5tcbAܜ^m2EaYd |x#]Rub6U }L#|Aص>  Aρe   Q lA6C.LslA-fB~Zgzsy; Bb 'd0 A,lBM>YXA 3n   Q E~[V }vAiMKg(xov1. 'D34y&PI&Ay!HA Q Jth{4G,rcQ Knkl! ^qR4A'{F!IBu~<.YAA= Q;E(rM,sr;L3Ihr APK"Eg6y  o8V ,A4ɶ>0%g 1cX]@= BC>9 %T w 2/ hg%!{HA$$$"  QI25>t5 |S/.AAo7XD 2#jO0%((=qA IA%t ( Qo>*!F39s-p g`ie"@w'?Z7@Q * 9m,g\- DnA ~#[{|&} OF0mTA7.AU/. /rLDIjaX/+|5A9vg&XP+ dSbgvw!A.     1D Q mVV^/ZPSF Az~ibWQ (C#d;>[^eA~SA +(}F %B{nAA 4Q  4]\98=TW,Aja Q $3B(FI/ j) Y 4 U^{i`CBE&  %6 gji8. 56'& EAS~,    ;4  Cj0'>"Q!Qu@98qtT*Q -e*ML%$utA=fpp[H7O" |kZm075Un X52.T wAp XZF ZYAU>C  P*G_N=JZ <Q@EXa,sNS6>C)ED Gt I  ^HN#E;GHU v#3>A%@@  ",(  $ Ht C@܇ B0m$g90 RaYyfwv-ASAlQ?Da, ^ %6FZaHmo#, z$:;p f R>dKb4`s}q{)Rd U7$EJLNPa>TRE +( (G7QIE\ oem ,xZ1hD7#HLq\Nvmj5 j(Uv,x=f(?hVZ]|^M( 1V>rq 6G7rAC&H gR\GeMsv&+-8| f!=URVZW\`f jlpsvx{  `iGtQ?z" J!&+4< /K;>`,24%!*H@Bcfjn s%OT{z-# U  #', 07:@DFKMRWY[^e imptx}    !zSJWNd hjln*7; #,.a;@FJMO']8 %'/37>ADJ7 ADGK Q V}4yV@Foaya\)a}:a vF/%4/2sOShHAfFLa;a;3$ )CKNUX_fnrv~ "$&)+158:ACGJMPSY[`fi nptwz~  %' *7 <>CGJLOR[`cg isw~  # *57?AEGMOVY]_bgjos{  $/579>AGIORVY\_cguz}   "% +07<ADF IMSY_agmsz~  !(*/7?ADK NZ\ `mo #).57:<> GJL OVZ]_adjrtw~    $.46:=CJLOS Z\_d jnqw~    &(0279<?BDFHKMPR UXZ]`behmru}  #(*-35=@EH MSUY^afjlorz|  ",37<>DHKNTW[`ilox }  "$+ .0247:> FJLNRUZacf kptxz~  &+-027 <@LN TXZ^adinpv{} "%,/3;?BEMVX\_k qt {   $*,1358 >ACG MVY\ dg mtvz $'*.39;ACJLNPTX]acfjlnrv{  '*,1359;>@EGKP Y[_adgkmsvx }   (2 8:=?BKSUZ]dkn v   #(*-2 5@HLOSUX_bfjm t  !)+-0258:>@ FIOQ S_acehlux~ !),27<?ACHJLPX\ ^iprux|  %4;DJNPTX]acfn pz   $) 048:<>CEHJNPV Z_gjnquz  "%-/2 68:<AHJOSWZ\_cfmoqux}  !#%(,.058;>FHJLNTWZ^cgjn sv{ %+- /: <JNPU[_adf mpu |~   #) /28<@CEHKPX\^bdlpsux| %'27:>A FHKSUX\`gjmoswy}    '+-26?B IMPSU^cgmqy } "%(-/5:>ACHORX[_bfkortvz   %14 7>AE MQUWY\^`giltvz  " $&*038;=?CEILNUX\d n tw{}   %(/4:= AMQSW`f motw  %* -9=?EN P\`c mty #'),048:=FKNPS Z ^ dfh ln uw |  " &)+37<ACHJLOQS\ehlprv z|    "'+/6:=DLNR T`cflnsy ~  ),/39;CHJLO SW^`ekov z  !$'+.19<?ADFHJMPX\aeknrt{  #%) + 5@BG OQUXZ\bjqtwy~    %*,1:AEI PTWY] cgilp v    $&*- 36=ELOSY[`cgmoswz}  "$'*-39=CLN P\a iwy|  #&*-/468 >FHN Y_a ehlorx} !),14=@B GKOQSY[`cejmqy}   '+.18:?ADLQSW~bjrv{  "&,158>BDJMOU[_c gim quy{}    "(. 46 :? GIQSUWY^ `mptx  #*,.19 @BFOSUZ_hl t|~  #%( .26:>@BG KNRTX ]ad fpwz| !$',068<?AGKNQUZ]bekntw{~  '.48;= ANQ VX]`bil r ~ '+.16:>ACHKM UXZ`bhkrx  #'*/369<A DP R_agimqs z !&(*.048<?DFH QTW[]_adfmpw} $&+.279?ACJNQWY\_bfipt x " (- 247;>CIPSX\`bdgjloqs{~  ').0 2@FJNPRZ_aehknvz~ !&- 48<@DFILORTYacegik psuw|~   %(,158@BF LOTV[` dnrz  !%4=ACFJNT[bfmosz}%+/ 496>CGIKTVZ_adilpx}  $(*-57 ?ADFIKOQT]_a gknu|~!'*.4:AGOTY[_bfhjmor wA  $'-/146=?EGJMPRW ]_bjmvy{  "$)-/9;?BE MOW [_acekn vx{~  # &38:=ACKPWY[]acfimoqtw|   $&-479 ;FKMRUY]egimqsuwz !%(+/137>G MPRX[`cg l o} $(+.28 >ILRUZ\Nfwy   "%),/579;CJMOWY\^ cf jn x }"&*,0369<>DLNPSX[_bkmortv  "$*-5:<?EJMU[hknru{} #&:/68=FKNPS Y\dhlnrtvx~  &* /:<? B N] cm p~#(.25;=@C#KMQW]`bg krv{  !&+3 8<>BVZ\ fqx z',037:CKN Q]`be lntv   " '$0579;=?BDKT [fmps y  )+-BK PZ]bfl q   ,4!>C I NRVX\^dgmrty}  $05<EGQV[_cehjnsw~  5/ K!O(  +5 9Ga." $. 0<>AEG J(X?{~osHF*H sa5a5` ~ da7|a8|a9|T_i IWrwa:t ja;Mv0Da<muasa?sa@Us(IaA^rQaBqaC6qs(aC* !KUmaD(ClaFKl8LaG"j QdqtaHfa IFf1-_afz}G[aK[aLv[aLx&R[yUhaM|Jaaaa a6manuskript-0.10.0/libs/pdf.js/web/cmaps/UniGB-UTF16-V.bcmap000066400000000000000000000002621354442177200227510ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE UniGB-UTF16-HA VZ16m1 :32   a0HRFPpD@manuskript-0.10.0/libs/pdf.js/web/cmaps/UniGB-UTF32-H.bcmap000066400000000000000000001312521354442177200227350ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE#C^J vG98< & QZ 1&#b W e-7vO@mjT  z !<%e {tg   9  7 IA"D J59C!/&6XYOH}r: .B)}IxCRS{  SV/B@r- ;]a l IZ.-:*+& C)VC9 5;pz g`}<1^ u/6(a6i#UXKpDm;M${ I$|j=z!jf%: H~]NZhMM<;@Rc:jM)kbr7&%HC9c>|}qzeKqZ$ }H9S8tTml5(_U`i(F}3fvU4 D9UFB8 "Fkw5d;VQ Cj{qgnX5*`C0g~# Z* _COpfCOc W:+j _COfp SO=p 76CBCODY[" 5S OiP{nM:"! 7)COS 8ECOťHRMCOS OכLe,QPOr NKDSCOrZ)COE=NCO6omS P bPWsXsrKfYCPeZtw=6 S P%Y|2C+P:OH)v!"+$EZ GPt #7lIjP}|-0o^1 67-CPI*_6 ^1h?+_V7<s;$SL%C P;e ;X Q` "#,S Q27610 n)8CQ@sC QV  1 t=| CQretSQ?8@ O1\8Au4}|aCQQDa><dCQReCQSSQh<'Zzff9>uHkBk> 6C Q0]a`&|o C Qz; n+*SRCQ;S QMZ 4F hSCQr>OSQė$sr~#":: [Z}CQ۔&rk9xSQTe5p&+o G&`i!xnCCRs2~#{o)*HlK3;8MCRnCR sS R(i:WVmQCRQS RսMuCTlutuIICRW x1Yb 0nm3EUBa!nV:=< `CR2`%F4ONCRd#.   S S>NU.srS~ wS SN?pTNKf(,SSZpjQP3V;Q:ng=O /.7S Snjo$)t N/j%HZ9C Sa+H:U~Nd1TQCSACS6S S~ +fBq`!.W0CS49Y Jj$-%xlMZSCSySbQCSO SSߧm whDbU30OfH~[PbIl:0W]TSTm'&kpx[ZU,4);-h&V@~2US T,() -@s*w$C TC     C TG   S TGJ_LO^;q8C TER/-qS TgsV632G CT9ST%u1iFFGFEZkC'T̪'S|-UZ MV/o(t?Ejyr.po,:G ISA@  CPCTG"HC TC"S U*}t Q ,CUO' LCUT S U{ZGLYB%CUta{N#4]\A,#CU [iCU%  S UR2]xyx)(UTEDCUĪj}j)gCUXN#CUE SU!X_Jihml3t RC3CUk #1b kjuz ?<%,CUr"  WCUW   SV, rS0gA>YN Sl[CV?CVL & CV@{ S V`p@V>{i:YS Vo,PDED98},NCVvV FCV $CVnoz`QI JE e<omS Vژq> O|g6?FCV} ZCVI{>WVCVaS WsL&s4BbAC!WWm@Q`KPEPr!?kk*EbN!6 @kCWFCWv S Wd'&S 12ZSRUCWwM #4b OCWCWs:SWCC#8MBIH~C*W> RY$/$o-W'{ v{=X>(C W*? > StCWK.  S XJc*f A6C,XX}/.mrq^1O:BGGuCB cJteV==K&0gQZE@YCXW Ne0)^'2>y M</PXy K\CXc=(.    SY"tCF_^/)ECY4hD5]GI{)M%fS_aNM B{'*qCY>|*<{QC Y;E S Yugfz=+*:CjYw]hN( oU<{sh UBS?1FAE ;e,s `TsA{nO%PErH~%2 _zd 12 e LY^; $    u.B _^WB  GFCY-#]$cT9'  - 0?0CYv!&$ " ~F* 0 (S[P0 tu)\>tw} AC [b9-2Ko8T?NI\C[kZ C[r<S[}XTYSD'zEneIe.C[!S[1498- d}r`x<%V;7C[I ({dOId}7f7Aqg E~C[3C[X S[ݘ[?x tuM:' =_wvuC[jPFBy$cC[ 'C[yS\BB3~4.MC(_S \:n;\CByx'YC \"6(=(GyxS \7\3~BEi`Y!;C\E C\HyZ7cL$C\PhS \^ :q FKvyzmCb\ntmR7e> t5<32|  qd{lely1(d' T :vO@;^\ &G 2    _ HU` J$s <cReT7KC\l>4QRd%x4 k`#0 A, ;'Vx]C\m.&:  3J $" 4 S ]wsVIS)zC^ gjS ^ =~)H{YC^&{H EN;ZV!mC ^%C5! :|m%$C^,Y  S^rD.j54OjwF'ohC^ v?[pzS^=Q86?6'vS;u.ON{QC"^5]FK#60  OL  Q9S5f%IJU5]]jC^`3Ljqt&dC^ 4B S _T;:#")(sC _zPFXiS _-pj#"/.gfiC_9V`w^ S_Lled32uaT5,C_i{ UC _]T2+u\AjC_cS _*Zb_K(e! ;PhC+_7nF<'&srHdR.T: )!.en=B+*EV|C_E IbC_S _ O:!l C`8X1y`p_Bt8@ P#U3zv W&C` Y   tglcbC`\%( S `gw?Ta$ }cC `s__ZKG "R5hSC `z_   C`wS`:kj+0mf{C`l / 1dS `جo432o2:) `S`Lw0<_'hT#ZJG<4cC`"d-A 2q Za*%} yi$WB5*k:C9`98; d( t qL  >^[IyR\ g6@^+By0`f[):675 ]Q oCa] #6  &%.S av[0[Z=}Sby8zE?dmdYA /d9J|S b|MS b*)FSR98AYjCb7<A"GjV]`'1Dp$yDCb=tCbBS bf!"r3L5lggPC bsmJN{r; Cb~sCb}6S b]G;e jGjCbf* Q2 zUL&.+PCb<CbISbS_>hiJC*OsC bS`{CW^qf&CcNCcoS c>IQG\YYC$c(/ Dx[ . I#Ti2@m5rZ)q:2xf6uDeCc>Q)kHkgCc)  S c&9rR%$_W:kCc;=SczogTIHI"+6yrwCcWhS c?o+*~ml CGcĩWA4Y 0$cu^E,UV9RRyah b5QSy<gqB.b2 P: ) d OL:p;gCcO KH C_|i . g1CcW       Sd *59~l76IB-,SdgudmzA|I>EZS dʾgkt~-,CdשpB@OS dޛH\ eCe Cd "dEnqH&YPOCd S elA@gfy^ed{Ce%t+*u g|9xyCe"Yu$g8HCe-# S eUg?J=<}CebM  S epj_>ybCe7apaS eA/h98WV5Ce> S e@sB'& C:}7Cg~>Z*8Cg|b Cg}S getn/. pSgwbZ{vGm2wvczC gO ? dr.DCgm  Cg S gذeWF9F10 Cg0^\Po >Cgg " CgA ShEyorL;!ZkC h{7<#2? AShSC kR9(Ck@'Ckm S l AK@/k)X a"ClrSlVETO@SEJ4uFj@CBIvCl8%;2yyL1!X1{jX/"K5|GClJ" ClH S l\hY! Cl'KDrsu&3Slj EK#$EN3e(l/OCl ;435t){#"F5"t_V1vgC l;  ClNS l:lh {fS ljegG&XwC m +3GI@5_+C mE    Cm t   SmA@$#"Ig h"cwX',/KJCmY)NMqp5j]hU)M$+Cmy\ Cm[&0Sm!B &54kH]E o-^Cmj{&;L*'6fidqn? X| )^JI5DCm^CmbS m'_^[:C`y:)@C2nbzoZUX16mT%gl tI2Ak:;6.Xnq: -+g/r]3OCn&sxre&Cn  &,DS nR.evQPkCnJS@Cn 8HCnoS nˤ)&to{hqp $sCnڎOS nޣLT34ILC n/:b$s\ wrC nK ]9.Sa4Cn  ,S o)[${b?>3@#C'o6Y X- ]BLkjg O)jS d     !]C'o8TD % 6kz+Q:Oz 5b J+lYz*  !Co71   "* H` S pYR94a`3Cp#(cd QRu~|}^bs{; Of  Cp'X*>C g6" Ew4McCp1R,$S pS}xoar#"C pI toHDm}@dyCpR Cp* S pKtmz =Q#(HeC"p]M V Je$ & sij.clvu8"Z? u pPF#ZC6pzG,h h s8'Lk  \g(/( = <_Xe}jifc:# ' FCpO*3N &* )60 S r5#a+pZ?+CrGK5*BS rVk8 5>KJ mli?C)rfEC2#+Bl  uJ54AAoj',Q^<BCr}Lf _4C rhP#(.S r\_tCq4C#r~SG UN |e~s.@UZ j 6Cr6s8nB-+Cs(S shR0+Cn-S su+97n%B0.765C/sI1HabS@ ;>l3ln  a"./0 x}}N@\  3Cs@C sy. $S t%2lkjutihmlqC t3n1uJj*{ DS tU< .Ctp>P oCtc]wW 67   & / " g`#,Ct# 5RS tdonon95H"9Ct\LM%p{xd(!xyCu %Ctx$ Su((~u$`QeVI0r+*WS(OmC uENRm'@A} s~ \Cu>D "!deWV Cu?" %.S u, lmlm'c(S udnU`oFC ufi$xyC[9Cue CucS u¶n o@CuͶpS uҠ "Os8sZCuޗES uj   QBCu{LCux bo   Cv Sv2En!"5l\M5R,#Cv0 C:S v;3[:+6{5CvL4CvI1A,1vCvH( S vbo>Kd KCvxHA ~  MV9@ YOTOCvo."  yh i ,lMCvF 0 S v͵ ?I`gfoATCvۚ9S vn=ZwZMf{C9v"l_ Gi8@10 /Gt=q(EM5r: ) _^ wC fXx/2)lCwO+9uCv   !,9LS wRPqp$->Cw\h cCwurs [-Cw SwOyxA@) !+hC#wF yf", )+p~w z?txdc8 9l O6 a CIJ3Cw"   lYZ Oq Cw. * S x[h=<C!x7-Z= 8 5D{lQ X8s' l-pd ; /\~* C5xd=>?^ A 8?,-49,+(+Mv+7   <j ) 23&G]Cx5H $: 5NS yR"je/?y6GCyƍLO P8'BCyնCyʁSSyOX!?>/OC y&L10 ;6.y<mCz$  R +Cys S z7(hmlZy,CzF%t`GxC zL$w*I~B#Czj@ S z,^a@yx~cbcC zL<DY_piCz Cz\S z0}x56CzG 9 Jmti`aM JQg }|Cz%& x,1}N uI   C zƁt$  S {$t7. _lC{:V^ ;*C{1q +C{25 S{OAv~5F)(ED#"#2C {wwG" I< G$1@C{`~DK t   VCC{aN  S {Ľo<  WVQ+C#{ӔOou \:/3 6%t0UD mfvt h4ESmh M /xslEC6{ѹ%s  NK^8 Zgs&U6i0]I6z 3  4sNC{ҁ& ((>(: "* S |uJpCByxEDafxmS |H$A@~# &C} O*S }# '&/9sPC} M<OLM>rC'}!szh  +Rto jypv>teD3YP=v+-lxQT!C };w "  S }EbKQ6CddC/}_0 }1(Y^  v?*id-3 ynu^X 9< an;H {n )W ]C}&C }J !2S~1;( LK 549C~ANC!~ERM Rgz35 v'UVA$gJ/jm>]$C~S& "S ~SIHcb;:/-S~@X(,v'.[3.R9sOiC~ʇxC~gH ;vJC~[ S~͚@5 It`nkS2./OS ~$R} IPLLb1C~Eb-wVB/]Fu{#C~o C~\SO!ZIf m*=C( EQQnr$ Qbhm8vEH(NG|JICLbnC 7`  S b>?>on54C\&rEgp+6u+\A)? ~Rqcl@CDXY 9`   r sxC !  " S 0h545-,%WCN}~;<Gve}n6lTVC,BC!l S R\N#";:_^{C^ yS oo N+OX/C}y5S U^?LGF/mCqSotK8OD{I,9US Z4tug.*{' wCyS k  LQcqppaC̈JS ֗V C:C1v2SY\/2nK@WVC+L_rcS #5%.O@"GF`C/'4 C  NC0oSFFpSRKF.R=<14WAV@C`VS eeVa`sr_xYlCy4"}Hy vB # ? C t: #<<y P_C  S AX %4AS^W.Ca n>CƠcve25*S9Rwn n/4mCˁD S f}]lE:C}$_DCbCj S (0 x~y/:C5%] P#UDR!  WVqvC82 LMd/7d)V^C:{ & S xd &;0  C j{jonuS4J%$!{?HYJevA@C t+  fC"C< S ͉Fkt)4b5:S ےNp %1"kEC tT $yxS \{WCtAB$/CTm/C  ./<3C _S+(ur%$-,K T7CFR]!/C@%CH~ S] W%j/q^78snCo0ah  !b>K8 YL-*C+ Y jC&S 4mqtip\]7C3^-(ZHQ(  sxYj/7Xk Xk`B4 6}<?0CB YZsliC ML!2z}tiC Ɓ; !( Gf Sindcf\! }|;Ldot{C :^U^gL OOCM C2 *S R.iQ85#C1ğ9  "Tg .  !%>}m nT w/<   )C˾" 8 d =c.;L% '2! (9bH Ć\   $  S *boD(?>IC%  %*5<_/hSTuK@| IJ kB.  opC"M ^sjnc" :` - 1< ? } 2e cFf+tmC W$ 02D*S y,;SCR#(& Bs4@8{ d:;q<C'z        |z{C S z0p%$_JSR_^]C!%l+r3W-0qs>z  yR)'&IC[".    lg j{T[0*3 LrO  *%Tu8 (%.- %s X{()x _923Xp#0!EC$S(6!. "   $ S hV xW!v?>CwS0AS })() v MfC8b@=jGly+d xEz% I2Q1kS @ |fC@) 2,&U# ^]xo  C6" &2  S 09T2wHGFQCDRT C;]5r'"slwFYZQ2lI"b1([CeIS }u,<Cґ4(CֺW;m)Ć S ~pp ! 'CHCjn/'-E{"gXz$KI uYX[?.\?C 6 S i, wvt?nL}CySai)C |p6 C{ S = f$K OpUC\O_CGvSNCS ilGFon]\QPQ+C`3.C / o^C݁+S}08~gf! _l]LLLC WTiS u5(s|[NkCf^RC!OZ aSz WPIH[I&j[ "]{:C'S/H8TS 6'&)=#d%S )v}"#KdUS qVK&VUu, xSė_HoBKmv#(}Cډt mnC՚kSC֦&qt#,x+S'ꁖ1k\P4[Zml4X {mfb2)(?>[@]L;J9({C"La`QR}JQA@:6Ct! @6;`hJ\CGv"# Q ~  Lgg*+kfi`C3l|S"83 NB=k|l:!mH?9+*6+qQC2/AS3JutOti; %VC 3I<j@z-C5C*S f-PZ;: C=S Z-g{Js'E|k\]Ny\S4LBar@>qpO+xnCG6?SWfmwmSS;1(1>WFaeb E> * xO0C k ^#W O/\R? pqO| 5|S$X?vJOBC"mu  DJw9  / 1,FEC lFLf S )L  CD6;8C40ipM VWCCHS l&wn7<98ACzTGUSJL'&maj`MLSl oC&Gh-rC7gjEH/ kVc>=NV" knMP~%8p =@E@W^KiPs4?"6sYbC z5H)< /:S_Ft(XedSLy|~G54K[C t`#"JS FR-7F&SLpZ:onWod}C&:S }|g%Q@LCHAd.K jvwvhu^ oC=CÁ SI>OJI'lFT?C YWNz1uC;CEC{S J*P\YX! 6vK){K9|AM.@<"C&J ! ]=/.Wbq@DkTC2;.+1NC7I S [Z"X76! UXeChW6*Sr@./$10I<+hCq%MKSc) 54Cl%acS{'&! "%34"!mhC!u9:WL|),na p[ZALf !"CWX3h>-C Ɓ   S -JOH>]\[C9 -Zwa>'=VC: SCGY SiT32Ju|JKO<N^CSS TihUT7XCVZCC  zQ#Sxz98=<A+5xA_"3C܍% CDx_Zmwj  ct _g:V# j& 72#5<'*lu3&whAf!(ow\x 9Dg@Cց  &*"0 S 5V)0v]"+ EC'MQG7u x_` mk.-^5b Lf {h yO $%%. J]. bC)% 05 :C,;6    E0 >m$%.    PIC+"    , S cyB7Rb_^QC S|C>  72[nDy(D e  + x 9H1>i`F;f1*''P QPUVMO,%48} CO("*  S a)m~EC|SdS aQz9&wC+rsrq0S KD}G5tcbCܜ^m2EaYd |x#]Rub6U }L#|Cص>  Cρe   S lA6C.LslC-fB~Zgzsy; Bb 'd0 C,lBM>YXC 3n   S E~[V }vCiMKg(xov1. 'D34y&PI&Cy!HC S Jth{4G,rcS Knkl! ^qR4C'{F!IBu~<.YCC= S;E(rM,sr;L3Ihr CPK"Eg6y  o8V ,C4ɶ>0%g 1cX]@= BC>9 %T w 2/ hg%!{HC$$$"  SI25>t5 |S/.CAo7XD 2#jO0%((=qC IC%t ( So>*!F39s-p g`ie"@w'?Z7@S * 9m,g\- DnC ~#[{|&} OF0mTC7.AU/. /rLDIjaX/+|5A9vg&XP+ dSbgvw!C.     1D S mVV^/ZPSF Cz~ibWS (C#d;>[^eC~SC +(}F %B{nCA 4S  4]\98=TW,Aja Q $3B(FI/ j) Y 4 U^{i`CBE&  %6 gji8. 56'& ECS~,    ;4  Cj0'>"S!Qu@98qtT*S -e*ML%$utC0=fpp[H7O vU |k8_m075U/&Z+52.T w^u90>0,90RaYyp5CY>C  P*G_N=JZ <Q@EXa,sNS6>C)ED Gt I  ^HN#E;GHU v#3>J.H 1CSC2@@  ",(  $ Ht 0D?DnBdKb4`s}q{)Rd U7$EJLNPc>TRE +( (G7QIE\ oem ,xZ1hD7#HLq\Nvmj5 j(Uv,x=f(?hVZ]|^M( 1V>rq 6G7rAC&H gR\GeMsv&+-8| f!=URVZW\`f jlpsvx{  `iGtQ?z" J!&+4< /K;>`,24%!*H@Bcfjn s%OT{z-# U  #', 07:@DFKMRWY[^e imptx}    !zSJWNd hjln*7; #,.a;@FJMO']8 %'/37>ADJ7 ADGK Q V}4yV@Focyc\)c}:c vF/%4/2sOShHAfFLc;c;3$ )CKNUX_fnrv~ "$&)+158:ACGJMPSY[`fi nptwz~  %' *7 <>CGJLOR[`cg isw~  # *57?AEGMOVY]_bgjos{  $/579>AGIORVY\_cguz}   "% +07<ADF IMSY_agmsz~  !(*/7?ADK NZ\ `mo #).57:<> GJL OVZ]_adjrtw~    $.46:=CJLOS Z\_d jnqw~    &(0279<?BDFHKMPR UXZ]`behmru}  #(*-35=@EH MSUY^afjlorz|  ",37<>DHKNTW[`ilox }  "$+ .0247:> FJLNRUZacf kptxz~  &+-027 <@LN TXZ^adinpv{} "%,/3;?BEMVX\_k qt {   $*,1358 >ACG MVY\ dg mtvz $'*.39;ACJLNPTX]acfjlnrv{  '*,1359;>@EGKP Y[_adgkmsvx }   (2 8:=?BKSUZ]dkn v   #(*-2 5@HLOSUX_bfjm t  !)+-0258:>@ FIOQ S_acehlux~ !),27<?ACHJLPX\ ^iprux|  %4;DJNPTX]acfn pz   $) 048:<>CEHJNPV Z_gjnquz  "%-/2 68:<AHJOSWZ\_cfmoqux}  !#%(,.058;>FHJLNTWZ^cgjn sv{ %+- /: <JNPU[_adf mpu |~   #) /28<@CEHKPX\^bdlpsux| %'27:>A FHKSUX\`gjmoswy}    '+-26?B IMPSU^cgmqy } "%(-/5:>ACHORX[_bfkortvz   %14 7>AE MQUWY\^`giltvz  " $&*038;=?CEILNUX\d n tw{}   %(/4:= AMQSW`f motw  %* -9=?EN P\`c mty #'),048:=FKNPS Z ^ dfh ln uw |  " &)+37<ACHJLOQS\ehlprv z|    "'+/6:=DLNR T`cflnsy ~  ),/39;CHJLO SW^`ekov z  !$'+.19<?ADFHJMPX\aeknrt{  #%) + 5@BG OQUXZ\bjqtwy~    %*,1:AEI PTWY] cgilp v    $&*- 36=ELOSY[`cgmoswz}  "$'*-39=CLN P\a iwy|  #&*-/468 >FHN Y_a ehlorx} !),14=@B GKOQSY[`cejmqy}   '+.18:?ADLQSW~bjrv{  "&,158>BDJMOU[_c gim quy{}    "(. 46 :? GIQSUWY^ `mptx  #*,.19 @BFOSUZ_hl t|~  #%( .26:>@BG KNRTX ]ad fpwz| !$',068<?AGKNQUZ]bekntw{~  '.48;= ANQ VX]`bil r ~ '+.16:>ACHKM UXZ`bhkrx  #'*/369<A DP R_agimqs z !&(*.048<?DFH QTW[]_adfmpw} $&+.279?ACJNQWY\_bfipt x " (- 247;>CIPSX\`bdgjloqs{~  ').0 2@FJNPRZ_aehknvz~ !&- 48<@DFILORTYacegik psuw|~   %(,158@BF LOTV[` dnrz  !%4=ACFJNT[bfmosz}%+/ 496>CGIKTVZ_adilpx}  $(*-57 ?ADFIKOQT]_a gknu|~!'*.4:AGOTY[_bfhjmor wA  $'-/146=?EGJMPRW ]_bjmvy{  "$)-/9;?BE MOW [_acekn vx{~  # &38:=ACKPWY[]acfimoqtw|   $&-479 ;FKMRUY]egimqsuwz !%(+/137>G MPRX[`cg l o} $(+.28 >ILRUZ\Nfwy   "%),/579;CJMOWY\^ cf jn x }"&*,0369<>DLNPSX[_bkmortv  "$*-5:<?EJMU[hknru{} #&:/68=FKNPS Y\dhlnrtvx~  &* /:<? B N] cm p~#(.25;=@C#KMQW]`bg krv{  !&+3 8<>BVZ\ fqx z',037:CKN Q]`be lntv   " '$0579;=?BDKT [fmps y  )+-BK PZ]bfl q   ,4!>C I NRVX\^dgmrty}  $05<EGQV[_cehjnsw~  5/ K!O(  +5 9Gc." $. 0<>AEG J(X?{~osHF*H sc5c5` ~ dc7|c8|c9|T_i IWrwc:t jc;Mv0Dc<mucsc?sc@Us(IcA^rQcBqcC6qs(cC* !KUmcD(ClcFKl8LcG"j QdqtcHfc IFf1-_afz}G[cK[cLv[cLx&R[yUhcM|Jcccc c6manuskript-0.10.0/libs/pdf.js/web/cmaps/UniGB-UTF32-V.bcmap000066400000000000000000000002661354442177200227530ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE UniGB-UTF32-HC VZ16m1 :32   c0HRFPpD@manuskript-0.10.0/libs/pdf.js/web/cmaps/UniGB-UTF8-H.bcmap000066400000000000000000001333651354442177200226670ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE??? A, J vG9_8< & QZ D1X&#b W e-wv@A©!o&A¥RB2ḿ7T  z a|}qzeKqZ$ }H9S8tTml5(_U`i(F}3fvU4 D9UFB8 "FkR⿀`5d;VQ Cj{qgnX5*`B〃g~# Z*|Q~tq!} b j5En5B.〿UT" 2L)+jo }`Zqut kxuPy2] j B䦄eR万# %^LP-1m c.K$TR 丢ip9bT gjhR丰~Pml on#)fxh38R乃.{z]d <9Sz`5 `\ PB 乜u8N9l)j;A 7B亂YB乲 R了~ty921w"x/B亘^tSyR亞q}9A(!aM*xB亲T`63Ep}R什IIxIkH/&?^w3R 仑Z!xyR 仝nkrFB 件qG)7N$3/B仨#+,3$pE/6M!^`_xB仩5AR 伞ZH#DQPN]\B伪@\R伯uF|CBKJWVmlEDExB佃I{R位J9$3dgfONorWZM > _B佰fB佣 W:+j _B佦p R侃=p 76CBB侔DY[" 5R 侣iP{nM:"! 7)B侵S C8EB俅HRMB係R 俗Le,QPOr NKDSB俩rZ)B俦E=NB俧6@omR 倉bPWsXsrKfYB倘eZtw=6 R 倥Y|2B+债OH)Dv!"+$EZ GPt #@7lIjP}|-0oS^1 67-B偉*_6`^1h?+_CV7<s;$SL%B倻eM {X Q` P#,R 儀27610 n)8B儒@sB 儐V  1 t=| B儑retR兀Y O1\8Au4}|aB兑Da><dB兒eB兓R全<'Zzff9>uHkBk> 6B 冀0]a`&|o B 冁z; n+*SRB冘;R 冯MZ 4F hSB冻r>BOR凄$sr~#":: [Z}B凛&rk9xR凫Te5p&+o G&`iB刀xnCq2~#{o)*HlK3;8MB刖nB刉sR 刨i:WVmQB勀QR 動MuCTlutuIIB勤W x1Yb@ 0nm3EUBa!nV:=< `B勢2`%FtONB勣dc.   R 區oU.srS~ wR 华?pTNKf(,R博pjQP3V;Q:ng=O /.7R 卮jo$)t N/j%HZ9B 卿aB+H:U~Nd1TQB厙AB厃6R 厝~ +fBq`!.W0B厮49AY Jj$-%xlMZSB厭ySbNQB厳OJR叟m whDbU30OfH~[PbIl:0W]TR吀m'&kpx[ZU,4);-h&V@~2UR 君,() -@s*Bw$B 呃    J B吺G  LR 咋GJ_LO^;q8B 咙ER/-qR 咫gsV632G B咸9Vu1R 哀2FFGFEZkB'哌'S|-UZ MV/o(t?Ejyr.po,:GA ISA@  CPB員GbHB 哖CA"R 唪}t Q ,RG>AIB%Mta{N#4]\A,#B問' L K[iB 唽|B P  R 喱R2]xyx)(UTEDB嗄j}j)gB嗆XN#B喿@H R嗚!X_Jihml3t RC3B嗯k #1bA kjuz ?<%,B嗶rO"  WB嗴W G  R嘬 rS0gA>YN Sl[B嘿B噌 & B噀{ R 噠p@V>{i:YR 噯,PDED98},NB嚎vVMFB嚅 dB嚀noz`QI JEI e<omR 囚q> O|g6?FB困} ZB囫I{>WVB囬aR 圃sL&s4BbAB!圜Wm@Q`KPEAPr!?kk*EbN!6 @kB園FB圗vA R 坤'&S 12ZSRUB坷MJ#4b OB型B坳:HR垠CC#8MBIH~B*垲>IRY$/$o-W'B{ v{=X>N(B 埡*?M > StB垳K_. R R 塊c*f A6B,塘}/.mArq^1O:BGGuDCB cJteV==K&H0gQZE@YB塗 Ne0P)^'2>yH M</PXy K\B塣=(B.@  U  R夢tCF_^/)EB头hR 夷K5]GH-,B奁0I{)M%fS_aNM B{'*qB奩[{QB 奀H R 妀kmgfz=+*:Bj妍w]hN( oU<{sh GUBS?1FAE ;e,s `TAsA{nO%PErH~%2C _zd 12 e LY^;R $   B u.B _^WB W GFHB妝-c]$cTy'Y D - 0?S0B妘v!&Y "E ~F @ _0 (R子0 tu)\>tw} AB孢9-2Ko8T?NI\SB孫Z B孲<R 宀.D'zEneIe.B宏!R宓1498- d}r`x<%V;7B宪I ({dOId}7fB7Aqg E~B宸3B宷XK R寝[?x tuM:' =_wvuB寸jPFBy$AcB寵 'B寷yHR射BB3~4.MC(_R 尔:n;\CByx'YB 尢6(=(GyxR 尷\3~BEi`YB层*B 局 l\7cL$B屐hR 属 :q FKvyzmBc屮tmR7Ae> t5<32|  qd{leAly1(d' TJ:vO@;^\ KG 2   MM_ HU` J$s <cReT7K4sB嵇"B屬>tQd%xO4 k`cp A, ;N'Vx]B屭.OA&: X \* U"" 4P R 帀DVIS)zB希gjR 帔 =~)H{YB带{H EN;ZDV!mB 帥C5!I:|m%$B帬YN  R干D.j54OjwF'oB庀1Kv?[pzR序=Q86?6'vS;u.ON{QB"庥5]FK#60J OL  Q9S5f%@IJU5]]jB庫`sLjqt&dB庬 i8 SR 式T;:#")(sB 弛zPFXiR 弭pj#"/.gfiB弹V`wC^ R彌led32uaT5,B彩{ UB 彝T2+u\AjB彣R 往*Zb_K(e! ;PhB\徐7nF<'&srEHdR.T: )!.en=B+*EV|C:!@l  =8OX1y9p_0o\i84QP3&gAlcqU3zvvGN)B徑E IbB 徖UVe( R 恧w?Ta$ }cB 恳__ZDKG "R5hSB 恺_E   B恷TR悫:kj+0mf{B悻lH / 1dR 惘o432o2:) `R惦Lw0<_'hT#ZJG<4cB惹"dF-A 2q ZHa*%} yi$SWB5C*k:B9惻9D8; d( tKqL  >^[IyR\K g6@^+By0`f[)O:675 ]Q oB愇] c6  Z&SR 懵v[0[Z=}B戀!R戆y8zE?dmdYA /d9J|R 戟|MR 截)FSR98AYjB户<A@"GjV]`'1Dp$yDB戽tDB扂R 扦!"r3L5lggPB 扳mJN{@r; B找sB扽6R 抑]G;e jGjB抠f* Q2 zUL&.+PB抟<B抣IR拂S_>hiJC*OsB 拼S`{CAW^qf&B挈NB挀oR 挚>IQG\YYB$挨/ Dx[ D. I#Ti2@m5rZ)q:2xf6uDDeB挾QikHPkgB挩D TR 掇&9rR%$_W:kB掖;=R掠zogTIHI"+6yrwB掳WhR 掷?o+*~mlBG揄WA4Y 0$cu^E,UV@9RRyah b5QSyybB斂7apaR 斐A/h98WV5B斟> R 斤@sB'& C:}7B松>AZ*8B杼bJB杽BR 枕etn/. pR枢wbZ{vGm2wvczB 架OL? dr.DB枳m H B枴KR 柘eWF9F10 B查0^\Po >B柩g "B B柲A R栅EyorL;!ZkB 栖{7 t ATB栝 B栿pR桀s6,mb]V+*sr5}0Q<&R 桢{KLw|heBH桶aJ=p q6=,L3@i#j- L c3{AJH6@|V  Th!T+$E !k  ,X F!LP,9]^U#^NT$'sHGr~' NMHr%BK桴 K ! L  D   H  %F+  E!   hE   Q  x:IB!條uyR#Fbi7x \3^%mMKpeZxQGk8q! **G57NHW|2#RmB梘jvxg ]!4M _ %+"'*!"V   B檯B/桵 J$L   D ,F`. J #.S.HA*Z&nH qN sR H R 歟K75!\[B 歪  Aw^gGC2R 殃 &c6*%GE.'B 殖2q[XWA<vq//B殘\VSNOR "iF9^B殗6I R 毒}b} 0?>SB 毡R9(GB毿@H'B毴m R 氌AK@/k)X a"B氛rR氟VETO@SEJ4uFj@CBIvB永%B;2yyL1!X1{jX/"K5|GB汊" B汈  R 沀3/hY! B沌'KDrsu&3R沟j EK#$EN3e(l/OB河 ;435t)D{#"F5"t_V1vgB 沱; ] B沺NPR 泮:lh {fB泻G&C T+3GI@5_+B泺8 E     B 泹j@    R浀%$#"Ig h"cwX',/KJB浙)NMqp5j]hEU)M$+B浹\MB浛f0R涛!B &54kH]E o-^B涮j{&;L*@'6fidqn? X| )^JI5DB淪^B淗bR 深'_^[:C`y:)@B2清bzoZUX16mT%gl tI2Ak:;6H.Xnq: -+Cg/r]3OB渦sx_refB渋 UlDR 溯R.evQPkB溺JFS@B溻D 8HB溼oCR 滋)&to{hqp $sB滚OR 滞LT34ILB 滴/:Hb$s\ wrB 滬K ]9.SAa4B滳 L ,R 漩[${b?>3@#B'漶YLX- ]BLkjg GO)jS d  F   a]B'漸ATD % 6kz@+Q:Oz 5Ob J+lYzF*  !B漷1H  I "* `JR 瀘YR94a`3B瀣(Rcd QRu~|}^@bs{; Of  B瀧X*>C gD6" Ew4McB瀱R P$UR 炫S}xoar#"B 炸I toCHDm}@dyB炷RD B為*N R 烤Ktmz =Q#(HeB"烷]MKV Je$ & sUij.clvuF8"Z? uV pPFW#ZB6烴z[G,h Sh s8'Lk  W\g(/(B = <_Xe}jifc:N# ' FB烸O[*sN Y&* @)6\0 R 爵#a+pZ?+B片K5*BR 牖k8 5>KJ mli?B)牦EC2#+BEl  uJ54AAGoj',Q^<BB牽LXf _4XB 牨Pc(.YR 独\_tCq4B#狷~SGD UN |e~s.@UZ jM6B狹6sxnBE-+B猀(ER 獨R0+Cn-R 獵+97n%B0.76B/玄I1HabS@ ;>l3lDn  a"./0 x}P}N@\  3B玀=3B 玈y.O $DR 琥2lkjutihmlqB 琳n1uJj@*{ DR 瑕< .B瑰>PLoB瑣]wW H67   & / "Lg`#,B瑿#B uRR 瓚donon95H"9B瓮\LM%pD{xd(!xyB甌%B瓵xX$ R用(~u$`QeVI0r+*WS(OmB 畅NRm'@A} s~M\B甾AD "!deWCV B甿"M%.R 疏, lmlm'c(R 疝dnU`oFB 疫fi$xyC[9B疬e B疭cR 痂n o@B痍pR 痒 "Os8sZB痞ER 痢j   QBB痰{GLB痱x @bo   B瘄 R瘞2En!"5l\M5R,#B瘴oCS5B瘰 J[@<5DA,1vB瘽$C R 癢o>Kd KB癸HA C~  MV9@ YBOTOB癯." Kyh i ,lMB癿CC 0MR 盍 ?I`gfoATB盛9R 盞n=ZwZMf{B9目"l_ GiB8@10 /Gt=q(EM5rC: ) _^ wC fXx@/2)lB睏+yuB盰 @  F!,yLR 瞥RPqp$->B瞳\hQ cB瞰urs G[-B瞴 R矢OyxA@) !+hB#石F yfA", )+p~w z?txdcA8 9l O6 aLCIJ3B矶"G   FlYZ OWq B矷.[D ^* R 碟[h=<B1碰7-Z= 8B 5D{lQ FX8sB' l-pd ; /\G~* )f"/ATyp?O P8'BB6碭d=>?^LA 8?,-4G9,+(+Mv+7D  J<j ) 23&G]a$B碻@2DL$:G uN BR秣OX!?>/OB 秸&L1B0 ;6.y<mB稂$  R +B秼sD R 稷(hmlZyB穆%t`GxmB 穀w 'w*I~B#B穪@ R 窀a@yx~cbcB 窍L<DY_piB窕 B窞\R 窥0}x56B窿GK9 Jmti`aM JQFg }|B窳%&I x,1}N uIJ  B 竆t$ F R 笤t7. _lB笺V^L;*B笱qF +B笲5H R筏Av~5F)(ED#"#2B 筷wG"A I< G$1@B筠~DKIt   GVCB筡NL R 範o<  WVQ+B#篓Oou \:O/3M6%t0UDKmfvt h4ESmhKM /xslEB6篑%sA  NK^8 ZgAs&U6i0]I6z 3T N 4sNB篒& N_((>h:  @ R 糯uJpCByxEDafxmB紊XB 糾HAB# &;4*B糿[AR 紓# '&/9sPB素M<OLM~rB'紡szh  @+Rto jypv>teD3YPG=v+-lxQT!B 紻wE "G  R 綫EbKQ6CddB/綸_0 }1(YD^  v?*id-3 ynu^X 9< Nan;H {n )W ]B緻&B 綼JV a2R縱;( LK 549RB繁NB!繅RM Rgz35 v'UVA$CgJ/jm>]$B 繀 IR 纟SIHcb;:/-R纪@X(,v'.[3.R9sOiB绊xB纽gHC ;vJB纾[JR绍@5 It`nkS2./OR 绢$R} IPLLb1B绰Eb-wVB/]@Fu{#B绶oN B绹\PR缓O!ZIf m*=B缨 EQQnrG$ Qbhm8vEH(NG|JIBB罌bnB 缷`I @R 羅b>?>on54B羔\&rEgp+6Cu+\A)? ~RCqcl@B羝DXY 9`J   rJsxB 羠! A " GR 耐0h545-,%WB耜N}~;<Gve}nB6lTVB耬BB耡l R 聒\N#";:_^{B聞 yR 聯o N+OX/B聽y5@R 肃U^?LGF/mB肓qR肖otK8OD{I,9UR 肩Z4tug.*{' wB 肺kL@Qcm}[6B肷yDB肻8IR 胖V C:B胡1v2R胫Y\/2nK@WVB脂+L_rcR 脏#5%.O@"GF`B脯'4 B脞  NB脰oR腆FpSRKF.R=<14WAV@B腠VR 腥eVa`sr_xYlB腹4"}H@y vB # ? Lw.s1 `#CjB腴:I#<<y P_SX|4AAs^e25*S9R nyB 膁  N R 舃f}]lE:B舒}$_DB舐bB舑j R 舨0 x~y/:B舵%]MP#UDR!  WVBqvB舸2E LMd/7d)V^B舺{H & JR 芈xd &;0  B 芗j{jonuR芤4J%$!{?HYJevA@R 芷t+F54+ B苀? f&'R 苍Fkt)4b5:R 苛Np %1"kEB 苫tT $yxR 茀\{WCtAB$/B茎Tm/B茌  ./<3B茍_R茫(ur%$-,K T7B荆R]!/B荀%B荈~ R荝 W%j/q^78snB药0ah G !b>K8 YL-*B莊+ Y jB莗&R 莵4mqtip\]7B3菀^-(ZHQ(  sxYj/7Xk XCk`B4 6}<?0CHB YZsliB 華MWL!2zS}tiB 菆; a( f R葩ndcf\! }|;Ldot{BC蒂:^U^gL OOWR Aw  "Tg . L!%>}m nT w/E<   )B蒓M 'QCH g" 8 Vd =c.;SL% '2! (9bH B蒊2 *M   S ]"  R 薄 *boD(?>IB.薛O Y/`K@UG&*UIB.  opMtA9|#(&[ Bs4@8{ d:;qA<B薏  G"EBM薑M ^sjnRc" :`I- 1< ? } 2eMcFf+tm K    I     |Hz{B薐WG  0rD_*f*Y AR 蜒z0p%$_JSR_^]B蜡el+r3W-V0qs~zI y]R)'&IB[蜢.   H lg j{T[E0*3 LrO  *%BTu8 (%.- %sF X{()x _923GXp#0!EB蜤Sh6L !.H " D  $P R 表V xW!v?>B衷SIIIf8b@=jGlyO+d xEz% I2Q1kHS @ |fB$衹 G()B&)I2,&U# ^]Hxo  B 衸,G" S  QR 褰9T2wHGFQB襄RAT B褻]E5r'"slwFYZQG2lI"b1([TzB襀-$6TR 觀-u,<B角4Y(B觖W;mH)B觍 R 訇~pp ! 'B詈B訓jn/'-E{"gXz$KIB uYX[?.\?B 訔6 @ R 詩, wvt?nL}B詹SOai)B 詼pD6 B誈{ R 語= f$K OpUB課\O_B説GvSENB誱QR 談ilGFon]\QPQ+B論`3.B 諗/ o^B諝+R 諶}08~gf! B謇 R 謔u5(s|[NkB警^RB謡OZ aSzJWPIH[I&jB[ "]{:B謧S W&xTR 讜6'&)=#d%R 讨)v}"#KdUR 讶qVK&VUu,B诀&xR评_HoBKmv#(}B诚t mnB试kSB诖&qt#,x+R诪1k\P4[Zml4X {mfb2R谀6)(?>[@]L;J9({B"谓La`QR}JQA@:6Ct!I@6;`hJN\B豇v"# Q ~I Lgg*+kfi`B谞3a jR貯"83 NB=k|l:!R 賀EH?9+*6+qQB賑2/AR賚3JutOti; %VB 質3I<j@zF-B賫5HB賿*R 贈f-PZ;: B贖=R贛 Z-g{Js'E|k\]Ny\R 贴LBar@>qpO+B赁'nnSWzwmB赃"B赀1R赓;1(1>WFaeb E> * xO0B 赫 ^#WIO/\R? pDqO| 5|S$X?OvJOBB"赭u P DJw9 D / G1,FEB赬FS8LG NR 踩L  B蹄6;8B踴0iBpM VWB蹃HR 蹬&wn7<98AB蹺TGU@R躅JL'&maj`MLSl oB身&Gh-rB7躚gjEHU/ kVc>=NV" knDMP~%8p =@E@W^KiPsB4?"6sYbB 躛zuH)<D o:R轟Ft(XedSLy|~G54K[B 轴`#"@JR 较 FR-7F&R辐LpZ:onWod}B辣&:R 辪}|g%Q@LB辶=kALR 迀k.:t B 迎vwvhu^ oB迓>B迏"R迢I>OJI'lFT?B 迷YWNzB1uC;B迳EPB迴{R选J*P\YX! 6vK){K9|AM.@<"B逦J ! ]=/.BWbq@DkTB進;X.+1NB逷I@ R 遛Z"X76! UXeB遨W6*R遲@./$10IB 邀$+h6%MKR邏c) 54B邡l%acR邪{'&! "%34"!mhB!邾uB9:WL|),na p[ZALf C!"B郟WPX3h>-B 邿@  C R 鄭JOH>]\[B鄹I-Zwa>'=VB鄺M SB酇Y R酩T32Ju|JKO<N^B酿SR 醅TihUT7XB醚VZB醒B 醐  zQ#R釀xz98=<A+5xA_"3B釜% BD釕x_Zmwj  cEt _g:V# j& 72#5<@'*lu3&whAf@!(ow\x 9Dg@B釖 V f*"0J R 銣5V)0v]"+ EB銱%1:#"uR 鋀0CB]\76ouB 鋒_` mkS.-^5b Lf {Bh yO $%%. JG]. bB&鋌) :C,;6J   E0 >mG$%.    PEIB鋞E H  B ,CR 鎦cyB7Rb_^QB针 S|B>鎳  C72[nDy(D e  I+ x 9H1>i`F;fD1*''P QPUVMO,%48}JB鎴OTX("*Q  R 钑a)m~EB钝|SdR 钥aQz9&wB$钱+}0yAHG5thcVm2EaYd |x#]ARub6U }L#|B钲% D  BB铇d  `R 锠lA6C.LslB锭fB~ZgDzsy; Bb 'd0 B锬lBME>HYXB 锳n E  RR 閉E~[V }vB閘iMKg(xov1. C'D34y&PI&B閤yaHB関L R 门Jth{4G,rcR 闷Knkl! ^B阀DR4z'{F!IBu~<.Y8(YB阆B阇=  R陀sr;L3Ihr B限K"EgT6y  oxV ,B5雉>0%g 1cX]@E= BCC>9 %T wH 2/ Ehg%!{H ;B隿HE C$V$$V"  R頀c5>t5 |S/.B預Ao7XD 2#jHO0%((=qB 頜IVB頥t ]( R顯>*!F39s-p g`iR 颀ae"@w'?Z7@R 颎* 9m,g\- DnB 颜~#[{|f} OFpmB7風.AUG/. /rLDIjaX/+|D5A9vg&XP+ dSbCgvw!B颣. R    D1DF R 饭VV^/ZPSF B饺~i@bWR 馄(C#d;>[^eB馒~SB 馥+(}FL%B{nB馲AMR 駘 4]\98="R鸚!Qu@98qtT*R 鸭e*ML%$utB2鸽fpCp[H7O vUS |Hk8_m07uU/&Z+5T2.DT w^u9p>0R,90 @Gyp5BY鸾CE  P*G_N=CJZ <Q@ESXa,sNS6>C)EDIGt I J^HN#E;GHHU v#3> . qB秊SB,鹀@  b,(P O $S t pD_C𠂇 |T yGw.2` ^a ˊ3 %@46Za @ b‘mo#l zd:{p f R@^>d`s}q{i>d@# 7@6Vi pW: @E(b =P}@PXDTFRJBLb─?b@ "y$EJLNPb>呒 +h (7I\Moem lxZ1hD7#HL1\Nv-ju j(vlx}f(?hVZ]|^ ( 1ZV~rq 6GwrDC&H gR\e sv&+-Z8|If!}RNVWV\`f jlpEsvx{  P`)GtQzb !C&+4| /K;> ,Q24%!*H@BcfjFn s%OZT{z-c U  #',J07:@DFKMRHWY[^e imptDx}   L !zSJN_d hjlnj7; c,.!;G@FJMOg]x %'/F37>AD 7 AFDGK Q VZ}4y\VFob誑yb飪\)b紇zb 癆/%4orsYOhAfFLb鯪;bIⅰ )\< Dh#GMkz&}dCx Laq$)&O roVXaqfjY_ ePluw{} B"&P+ . 36;GAHJO SU^@`cenrtvyE~  A#%), 47;@CDI OSV ZFhknqv{ C(249;B>@BEKNQTZ]bfLntv} O %'-C/1359=BG JMAOWaceYqtvx|~  O "%(G158 @D GFSX] b epsuCx}  M $+ 0A47:AC ILQUEY]`dkXs x}I !G& -09CKNHUX_fnrvG "$@&)+158:ACNJMPSY[`fiKnptwz~ B%' *7K<>CGJLOR[`Bcg isw~  A# *57?AFGMOVY]_bgjoAs{ A $/579>APGIORVYC\_cguzC}  L"% +07D<ADF IMSYE_agmsz~ @ !(*/C8?ADK NZ\ `Emo @#).57:<>LGJL OVZ]_aFdjrtw~O   B%.46:=CJLGOS Z\_d jnAqw~  M &(02@479<?BDFHKMPRLUXZ]`behmrEu} J#(*-35@8=@EH MSUBY^afjlorz|B "@*,37<>DHKNBUW[`iloxL}  G"$+ .024E7:> FJLNRUGZacf kGptxz~  C&+-02E7 <@LNJTXZ^adinpvF{} E"%,/3;?BE@IMVX\__k qt {G   $*B,1358 >ACG M@TVY\ dg mtvGz D$'*.39;HCJLNPTX]acBgjlnrv{ B '*,1359;E>@EGKP Y[_aDdgkmsvx }F  E (2 8:=?BDKSUZ]dknZ v  G #(*-2 5C@HLOSUX_bfBjm t  C!)+-0258:>@JFIOQ S_acehClux~ F!),27<?ACDHJLPX\ ^iprAux|  @"%4;DJNP@TX]acfn pzC   $)N048:<>CEHJDNPV Z_gjnqCuz C "%-/M68:<AHJHOSWZ\_cfTmoqux}  \!#%(,.0@358;>FHJLNBTWZ^cgjn s@v{ B%+- /: A FHKSUXB]`gjmoswy}E    '+D-26?B IMPS@U^cgmqy}@ "%(-/@15:>ACHORX[FbfkortvzD   %14K7>AE MQUWY\E^`giltvzE  " $&D*038;=?CEIDLNUX\d nLtw{}  C %(/4:= ABMQSW`f motCw  F%* -9=?ENP@ R\`c mtyA C#'),048:=FAKNPS Z ^ dfDi ln uw |G  "I&)+37<AEDHJLOQS\ehlAprv z|   F "'+/6D:=DLNR T`Dcflnsy ~E  ),/F39;CHJLOJSW^`ekovz@}  J!$'+.19<?ADFHJBMPX\aeknrtH{  B#%) + 5@BGKOQUXZ\bjqtDwy~  J %*,1:AEIJPTWY] cgilAp v  C  $&*- 36H>ELOSY[`Ccgmoswz}B  "$'*-E39=CLN P\Ga iwy| @  #&*-/4F8 >FHN YP_a ehlorxH} !D),14=@B GHKOQSY[`cejm@qy}  Q '+.18:?DBDLQSW~b@gjrv{D "&,1F58>BDJMOU[G_c gim quEy{}   D "(. 46M:? GIQ@SUWY^ `mptBy K#*,.19J@BFOSUZ_Thl t|B  #C%( .26:K@BG KNRTXJ]ad fpwAz| @!$',06B8<?AGKNQUZ]Hbekntw{~@  '@,.48;= ANQJVX]`bil rD ~ 'D+.16:>ACHKBN UXZ`bhkrBx  A#'*/369<A DPA R_agimqsJz A!&(*.048<?FDFH QTW[]_adBfmpw} E$&+.27A9?ACJNQWY\_Bbfipt x A" (-I247;>CIPSX\C`bdgjloqs{~D  ')B.0 2@FJNPRZE_aehknvz~V !&D- 48<@DFILODTYacegik psuAw|~  A %(,158R@BF LOTV[`Benrz  A!%4B=ACFJNT[bf@kmosz}\%F+/ 49v>CGIKBTVZ_adilpxH}  @$(*-57 ?ADFEIKOQT]_a gkCnu|~A!'*.4:HAGOTY[_bfhBjmor w  L$'-/14G6=?EGJJPRW ]_bSjmvy{D  "$C)-/9;?BE MO@TW [_acekCn vx{~  Z# &3B8:=ACKPWY[D]acfimoqtw|B   $&-I479 ;FKMRUBY]egimqsuwzF !%(B,/137>G MPRAX[`cg l o}@ $(+B.28 >ILRUZD\fwyE   G"%),/579{CJMOSWY\^ cf jn@p x }R"&*,0D369<>DLNPSXC\_bkmortv@  "$*-5@7:<?EJMU[Uhknru{}@ #&z/68=@@FKNPS Y\Ddhlnrtvx~ D &H* /:<? BB N] cm pC~#(H.25;=@CcKMQW]C`bg krv{@  !&+3J8<>BVZ\D fqx zB',037:CCKN Q]`be lBotv  D " '$0@2579;=?BDK@T [fmps yA  )+ -@:BK PZ]bflE q  @ ,4!>UC I NRGVX\^dgmrty}E  I$05<EGIRV[_cehjnswB~  5o Ka*@$Jh _ +5 9Gb3⺂" $. 0<>AEGJ@ N(X{~osH?@A*H s@?@??@?@??@ @?>@ ~ $@?<@?|@?<@?|@?<@?|@?<@?|@?<@?|@?<@|&@-;i@?z@: IW@?w@27 j@?v@?6@?v@ 60D@?u@?5@?u@-5c@?t@4T@?s@?3@?s@?3@?s@?3@?s@?3@?s@?3@?s@?3@?s@3(I@?r@?2@?r@2Q@?q@?1@?q@?1@?q@?1@6q(@?0@+p @.!K@?m@?-@?m@-(C@?l@?,@?l@?,@?l@ ,8L@?j@?*@"j @;(d@ g1t@?&@?f@?&@?f@?&@?f@&1-_a@cfz}@?@?[@?@?[@?@?[@?@?[@?@?[@6R@Zy@?@U%h@?@-N|J?@?H@?@?H@?@?H@?@?H@?@?H@?@?H@?@?H@?@?H@?@?H@ /@Emanuskript-0.10.0/libs/pdf.js/web/cmaps/UniGB-UTF8-V.bcmap000066400000000000000000000002651354442177200226750ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE UniGB-UTF8-HB—VZ16m1 :32 [  b〈HRFPpD@manuskript-0.10.0/libs/pdf.js/web/cmaps/UniJIS-UCS2-H.bcmap000066400000000000000000000615371354442177200230130ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE!a ;a!>"eQk]JX_?V3q u {!~$ *7;AG8XA 1  A?EA&  < [  Nc P]-( S  =A'=7:9E &43210/.5a$cIA %Y A%O A%O U  9a% RQa%?BA x a%^+A&@BA&aQA&@a&ja'v^"a &hBDQ;c,a  A .qhi N.:KA. jMA.a.aA.TA .MY_(AKA.U4=<a.uA . , d[ 5J|Or]A..y. {A. @7 Q/0i ww85Rt {v\a/MQ /Sh> cr/qa/!:Q/#&? CZccTc{i7&&So(_4uw$nBS^n}Ha$/7R4 w> .YO@4<{0PS_(VKpAX]X`-tGW-e"NOxe?Kj8]/8GUF ah(.\z($X[op%t:+T}Ra G6]C3!Y"o5n a/Q/N <7JarC8wza0y *_d$$RJ U~ a/~a/!0.t89z:Ly]by% BQ23O p}$ lya2 ]hQ2g  D5,=2 ^q 2v{z=Z]_cYd[Xa2.-pbQ 3jr[Z q3q"igxhz|sfk,&t.q 3- q(no m#r'!/($*).2/3la3|GFE4 17a 3{v_ceXZzTU{Va3qUX YA3Ļ6A 3| =LA&%A3Pa3]AN0+A3KA40! `vR#C1hN T (.eyjOViano`_.^xF&.jH9aNXAN*9!#D"Ut^iO2wliT3AN(3ANZ aN/\A N1~: (7XaN@^A$NB/uve RBgfN z3 iZj9{: ~WdQ }ANUPAND`ed$ aN b&+ APN~ I@GF5Kr#yw-F79zPA,gjYM' Lx2o=^ X'\uCRA_Dujb UQ0AN45A Ne   % aO}qA%OiuK>3 $[q/5lCp( CF{XAO;.!"%AOs&raO8A O..B0~cvaPwA P?i92ZsaH% iAPBAPG b QP!Bzidof IT;(A%P6^N yXqA(t'FeO?nR E$q)AP@? )#AP;$aPXAP͙G>@/.APHAP V WRaQeAQ/ ` NA Q d qt9UAQ aQ?pAQA8Q QCi1hd;^C:d?)AQPGT9 B?AAQdJAQ_ aQiwAQk@)h.7Zm[ M`sx##"AQ[AQyyaQA QQ3$QTwvsaQY  A!Q ot1jDYX/[~+*5Rp32sz4F}AQLa`AQDEaRAR=}A jC:yxQP)?I.-B;QARNAR5aRK%A#RM2` ]`9(y7>aR38&x}r3UUp{$7AR]^>` ARa,aR7AR-FPYZoYnO$ih/0mhi`on3 8|AR}YGFARedaREA R1tP?Kb aS AS J!xBg#SZA@{moZx AS$UAS>Q SEVm  A2!Q Ty/0i/^EATlC8jYCaT,vA,cd)t|:)_PG|AX/21(<>A W` I($aX7AY:32kj-1: o|qR#PAY iAY laY,@A:Y.6]\Pc^cdxOT[\yzYT&t32u4T|8izOaE"3.sA|$uAYSj@AY/n ' \aY[YstA YZ  B_?A YX]z/2gAY-mlaZ5fA Z<|!W dxg%;>1$AZ@c - ! A ZGy ,aZuA[ .  GJ #$ ABwA[VpA[ a[ZA[\(_otDA [_^NNOA[|a[~ AH[$[hOJk}p>,b/DORz5WC;Gt:eJOBWMoX+D)(GB/}L//LA[qA[ta\!A\ 1k'sutSZA\uA\*? a\8(Ad\:R2ebi/PCBk`o`snwEh#J [d   ;2 wG>[_:KFOJ  _h sr !wr  '>ed uH8  A \[ CP:1A\cNO N/Ga]~A#].n 5KlUXYeD W^ysje+x7.Tq4A]A][Z}|a^#A^== oA^rA^%a^6uA^8Wq0 ;"A ^@y A^X'a^k(oeA^x>v7C2231 -g wCg`o^A^z A^0ra^,A ^Ú&4GHLa^2 A^5A ^]\.`A_0Q _ ML+`&A_wFYia_2A_ ^$D 3^5z3B~wA_!!A_"4 =<a_V,A7_Y. 1;XOtd)ii-`F76-Rhe}FGF!2ei-L*whFWPH;A_gOA _X: # a_hAG_܊ J?6|c?:mv mtvC&#4 +2SJ 78g0>!!F#oA>o: (~  I2kA_~'A _D-a`lA#`i!pGmf"Z&?> z  [B/4+KF>SFA` A`M a`~A `R^ #& kaa  SAa|%"/elJQAa AaVaaXA=a] iqR56 veSP Qia  7Az5. yz in=PAaAa|WabBAb :wY*X,#"mlonAb [Ab]ab2MA!b47mVm4wBA3$SM) (3<y r=AbHAb6=_ .=abZACb_wn/xTKm JrQ{*| sd  zMF-5pAAyM <B =D khf3NYLUq<  "21AbAbd7  cbacBjAjcI #~  1w X#UV?<L,?w<G8sd y#khsDEjAz2ILgp 5I|q6{2+W 9 >q|  = 4cXq> 8 }t)V C:q7ElMFP/ AcO<, <Acel 2 1 N`1 ad|A d4n  AdAdad0Ad!"v1:E@MPABAe"Ad~ae4BAe6Es#  ?@/V#4(w\|AeNAeGaeQAe=&m`E!"H@h9&i ,Ed9A e  Ae<ae`Ae78A]Hn{eZ;6 Pe,p-YjheL5GDaZ_Af;<AfL af[ A f]q23V=afgsA-fiiRg,CcT#pcZ  {fqdQR^2  ! %21@Afs"% Afk ,!{z#Q f'Pm [pAgK$=<YnhwSK3Ag(Ag ag&Ag(fm5/FN J1'"X{cA g.Ag3A@agcALgeR$3|,yx}&L}b"9$ gN~ >t]X AVA: PNKF% mF#HP62%ud}noT}1v_gFYbAgf*T@OA gnqP4$2ah0#AJh2AU]di,~ 5 *gj{xX>9j5I ^?& !}u%&}~ [,EHw6J)"[]p=CNgfi IZAhD/ ;!9$A h[% ah0A9hW&exD|+2qtdM^C 8+& 5|,  (}hwrqt)\Lub==Aih2Ah2! ai:Aic1*}1,8=$ (}L Ai4.Ai< ai?A+i؞7?n i l  AJ  knd{d:-g2,W '+6Ai5MA io    ajPHAjXfuN  ij=8  Ajk7 AjT4U'ajO<>A:jK oj/0 {~3("cbadyz1S Hl)BLPGHmV nOrAj;A jR 1 ! akxd.fAk=! ,AkiAk[akoAkqDXu@Ary2o2(4 #Ak=Ak\ 1q alAJl>3~X ! <XE^vmlQK('](23z@c jP (4X 'HH&4 %BilAl?>SAl3`  ?%> almA^l O6Qh%'(gD(kr E@Ql5x2e\)j {pl|` \2  sX ;g{l AJ]^=6 "  ~3/2% 5'rT]U,*1^A mCj""Alo  (5vwQP-mQ nXtfUS@rA4n)96~w  E>/P2qtCF ?f =R{tnWG4{t aTyz ++Xg8An9LbAn4 HsYedanjA9nݖL% p )410E.e8 e+   c~ S7RDvbM  r $AoQ`6`An8 )E& %$aoA.o1"5>f9D 5B.1r +2 CPyzoM B  uv_AoR?_^  Ao#? ap]Apc/?:Wt CAHy| w; >v_ApW%WApd!ap"Ap٫; EV  _b{v{% AqZ  {Ap$*aqF\A>qICQFqj[P'hB@V  edSTOuDof | YG YR#WV KL1DAq\[<}'<A qJ)  ) ar=XP"[ Iar;dfhiarA678A&rXj>!J5 ?! (QR  32701, ih3@gAra Ar\:0 %$ar|A r{E _ +&Ias@As  CDsx)\ZAs$cAs(Bas6 D0 AscMEA sW"'AslEasHpD& JbKAs$L*t|4+ce>q Asf  AsN`a ON HI atZA t!:I w^]^]at/_At2# !F _ti`AtbqyA t9b atmAt1)(g D3432AtrA tp Wat>ABt=qv wz.8&])[^!0<Z ~EHc>>44q!h>lE#fWZu|~-(5@Aut-?Au"^+:|UVa u\`_DCYA uxq1 ?g"}Aub     Au/caua u{zwux}~au    Av$  wzAv&-Av-  avLavG   avKSAvl+sczfo? OPAvvAvmav}a v!ywxz #$%avAv|; `^P x] <2NpAv­( %&Avaw:K#aw%96 < |>?Baw4%Awa-\L|   [{Zz{zAwbEAwjU awPAwO '&76&{*>OJ[ ZT 0=Ax!~Aw# ax-(A)x2R#aGb[ Gy6T #&#GY6X=Vy9:  | AxNA x0*:!5)ax2AxtKF gh =: Q8g~cg3^XJ{rAy0A x1 5ay[ ayAyQ}W STmq.1.S -D SIAyɮ AyB(%$azAzviO >fVb A z AzH aza$Azc_e$XdC? tg k wt YA zi& AzmO 'azTA z6E@mnAz AzVaz>}@7AAza\d;:Q07y7 Az A{W a{KA {%SFj ; hMA{M   A{'Y Q {KR'k0NSA {Vff a{p\An{tZ g }U.  ;j5(pogL" Z.-<   {r uv#& /.yxKQp(!-05#EB''*s6BA{ %A{r`'1   C@Ba|rA |ʏfv/+l;CtKA |ү& A|t a}xA5} 3dqgI0cTQLx=Z_`5. .R  ,tSt/{r kYT A}HA }{  a}AQ}F9Vh1H S Psa2"(luX#P?Mk`  k;kr/*d2  cwZ %{  53N  wjtA}{A }yx &Oa~YuA~m(OA~]r8Q|  A~b a~5&a~'    a~+  A"jQQTdz4ML!GH! ?6?6AA-a/A̞L- p Aʰ1  Aa A  <}@W6'A7 A" a>A3VDy=R1A @A$&#Q oF6;>9IA~^KQ$O @%zZI$#iTlY4'A yQ  A-a0AޜT=~yn~elOevk,Aٰ_     A254aetAk%F,3 h . s v Ans    A7/aA ATk>8JaSA5rM%"7- W )voqf \AA<aj-!0m1A6 DMY#ui|E?Uh <kp? nW fmP A~3   (- Ayu7aUAo V S5W": J@A#]   mp ;4  *ACI 0aQA-ŔAChu@e dI^ ex v 3dy[4W |Ziv[ CWI(NDUBC^1\A;pTa  fW!   % *!     -4!   , C NA S$8+1- aAX 0_~ M_hwTs1P +A  ~w*#hi rCJv_ A4_)0Q 1y* rF?LAt +IJ Ip W%( +;J d/ J)HA>?@ m 56   A b%GH( Ka YlmU n VxoWAǒt'  `V #eX>,Y( _)d A1b                A q  2a|APA   A~ vaA&DJn)h G1x/jb SZyA++8  @=      A 93aK>w j40kaDFHIK Pa  A@ a;\SA Q.7Aa(aWXYAV(\F L<q;3dz d+A6^ ^[A0 <[ay/{|A-rvuDU\>k!r},/g`k@Y)f?Xm pn#Vq:[>s6>A~  HM@ A   49  A  GF +0aA4i!LOd K/$`&+ d ~H0o-, =0 7 A"+-,    A8IZ*aC)AI=CDKN'"MFGFw hAS0+AT+aJLMA 7i(8S[ -A:O A,( a_Aa1n.SQ AE/RVgnahAH 5 zBaY"OJbkd (ut_< )yR]AwrqPb c A 6MaOS+Ca a@AD;iS8q|0 J!1a4 PU E<A@]AG      `aj k  A A*    $ab_Am8'cAb MLANaOA%kA,72S7 Z<#bAg"AQqpapAeK #"GvdOlkN/4  ;Z]JO` Ao!  AU)aO~A5SeujpW@=YoVz Tm "SD/ *[xh-6i`Y,/eWiE#& j1+0B0M8A0VZ[de-jH%>G>? >=  ZAX "" ) a m.ao10b2p3A ƚdC<;T2utTAɶ5A@aDtBq=A 7-%"K >1Ts 7A<    z|}~ u A r  awRA~v5f K>wMA * 3  wATNa}AҜ]1Rs=8  p#1VStCxIe9e}@H e .T A&϶T  {0/  x  z z  tA$KJ YX- aiA_"Ah heA amA86"nUh#c:FWhA,ضqhe r _ VWL S,-A $ aA Cx2 gtC. A ;A  Ba.1A 2wUKf]w <%41c 16h%T>)}qT $z 6AB3  $^ YsnZUAA+aEHI4JA4mBAo(g|-8O]&IIyrKHK$A|+1Z C6 C5v54!A3rA$  a=bA Rh45: GRKS ABg!67AZ+ axA LDk3ga~1Aӌ=kd: A|`ee&Kk% Aø HGA 3 aM9aoA"s3ab 3`G*E0gQ6qzsr?ET,qpAA@a(.:>sCa*-),}./02436957:A;=>a2E G HIJQKLA3eVsA@ANaFHAc-^- AK  AO+ * a-SA0)M$A7R L#/AA6U a 7ta efghikmaYAE$A o A[ a"{}~T)N"1a-IA }|Aa A zA   /`6A  a_%8$(A~A j+n21)Ah qe{!13^d{ "$.68<X_o{~ apa 0ZTR[a]kecgaq!GLHKMF"N4|5} ;9<O&' 0()aa>G@Io EGCmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniJIS-UCS2-HW-H.bcmap000066400000000000000000000001671354442177200233170ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE UniJIS-UCS2-Ha ;g!$&#manuskript-0.10.0/libs/pdf.js/web/cmaps/UniJIS-UCS2-HW-V.bcmap000066400000000000000000000012501354442177200233270ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE UniJIS-UCS2-Ha ;g!$&# M_UTWYWA!bA %Z n6Y;m2A!6a%97=;A?Q% G(q%#jomlnqpr[]\`SUTXa%=wQ %@ua%I~a &_O cN]a'A0Vz!O 0/a0S6Q 3JWVmq3E LNP!T WY \$q 3-_b&eh npqjrtsw%{|~ a3[A L K manuskript-0.10.0/libs/pdf.js/web/cmaps/UniJIS-UCS2-V.bcmap000066400000000000000000000012301354442177200230110ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE UniJIS-UCS2-HaM_UTWYWA!bA %Z n6Y;m2A!6a%97=;A?Q% G(q%#jomlnqpr[]\`SUTXa%=wQ %@ua%I~a &_O cN]a'A0Vz!O 0/a0S6Q 3JWVmq3E LNP!T WY \$q 3-_b&eh npqjrtsw%{|~ a3[A L K manuskript-0.10.0/libs/pdf.js/web/cmaps/UniJIS-UTF16-H.bcmap000066400000000000000000001150231354442177200230720ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE!A\a !GQk]>d_?V3AMT+ 2!+VS LIQ tA ~$c Q n$cUP &%$)A$) f7![ Q .s"'A"} ";96"B; |,"m  Q/P' j>"kOL iOfO>_c 0 m("[<SAiP. Q2j Ak9Q PX""O( zA ^W-*'0#rQ l6B''$cbA x1TI67ZQ 94 M-|3)FAmb >M#=:B@; J:E+ 'ch W~92 |C l ; ls9' Vhi N.:K e, d[ 5J|Or]A3 ZZ+./? xvC F Q'  jw *"e4  ? ^(D@ 9zAAc, `2Hj &_;/1 !f PcZw 65 h6  4!;4/QfB.+T* U  9.536?C$<(#AaJ #"k l )@]VI b0# 8%  #  #'`p|k`-k]FI[-&3w;<; ye5@T K9G$ +CUptmZ$;M v3\7V=/jU_(AKv9y.@7 #A.eA.:AK  _!W:rQ/0i ww85Rt {v\Q /Sh> cr/qQ/#&? CZccTc{i7&&So(_4uw$nBS^n}Ha$/7R4 w> .YO@4<{0PS_(VKpAX]X`-tGW-e"NOxe?Kj8]/8GUF ah(.\z($X[op%t:+T}Ra G6]C3!Y"o5n Q/N <7JarC8wzA /Ӟ~/_H +<Dw*3`A00: aaA0M;:J =KA&wPy{A3x    5 & A4$&b9S6mhN T  `( 2n$Q@"QcA4lR#.g O8oxmjH9A'4Z%=,'0"kzpkH 7( pa 55F>5$LK&& . ? iGT4\#]r> K4## P\ 8 9 P" ZA8>F 2i5%" $09g  B^g6" \_ ,HBP &7J$(*V 8Cn !4 3< 5&Y1<& C$`j0Q_ \(pDG$% f@zy6d $.~.BdCD&r } v%Qo 3Q N*9!#}DR1UAVNL^iO2wli@m32M(7X/uve R\gfN z3 iZj9{: ~WdQ }xXSwhN I@GF5Kr#yA NZ  a ed$ "  AN)Uxy  tuT"yx wnQ N݅gN/F7AN9zPA,AN끆bFGAN聤]Q NZ4dlmgpSQ Oa 4?Q O%k! WVroAO.3 $[q/5lCAOwQ P*6mO ~z yQP!Bzidof IT;(A,P6^N yXqA(t'FeO?nR E$q)~G>@/.AP@? )#CA2P0 tu5{$yxy5{&'&} |76-05}01(;:) o 19lQ P၇ 4Lk+Q P_JRTjI APbEh qtED9UAQ AP+8  )(C(QQA8!1hd;^C:d?)rgAQRr9 B?A)h.7Zm[ M`sAQdJAQS;IF_T_ W>HSQ Q~#P367#"A!QQ3+Dwvsgfot1jDYX/[~+*5Rp32AQK a`AQ 1`j.-<='PgQ QpQusLEzATQ5F} =}A jC:yxQP)?I.-B;Q$` ]`9(y7>aR38&x}r3UUp{$7jFPYZoYnO$ih/0ARNGa>` XYGA1Ro #N 1 $g  Z'+P'C*+NMN#IP ON $!zg Z}QRR)hva`o*=3nA@AR|{1tKb ASSA R쁥a HBg#B,EDQ SM!xVuB0 KsSAS#OA@AS$UAS%iKTU)Q S8S{mo UQxTKQ SEVm  A SQp9r]J/h.< ASa!ASYq#J%Q Sl"JW+^X;^A#Sw`SN{|IHU pHJyxAnP{c8UN{<&ASWASy '(RILYU**UT-~WV( V{7QSYJ'L]ZEq5 6##wPHWE#p71R>ASr?Q Ty/0i/^E``A&TlC8C< b*t ;:W}]Vt /B'  vA T 4 O  0  AT"^_#]\ GTQ T%XmyYATH7%p7CQ Ttz <65ATQTL}B8 =82$0p{A%TǢ 5@=L+mnJo5}:+27.m=* AT^^A'T2DETn oonoE\aJK^j  ONspQ6qQ U{4HSZglnKA)U<zo t Of O`Mc~& 4p i MP1W ~owh YAU_A,U:Zrsr u  s}| jkibmz% Q V/U8XAX/21(<>A2Xayx ~ vo~ ~ }f ]p| |}|atze `z#Q Xhyz_zvA7Xܣ1)t|:)_PG|32kj-1: o|qR#PY6]\Pc^cdxOT[AY iGAX݁y""|/./w$%$;8 =<1Q YgMyzYJwB[ AsYs&t32u4T|8izOaE"3.sA|$u X] o B_r/2OJg% t#!D =< ;g* KL =V    GJ #$ ABwa_H9t! ]\NOAYnAYq  ml# , 4?>A;Yyj?%`?<?'&8963767=: ;:KJ aA)Yr  *   ! -IQ[HGHIJ[e[h*{Q [Cl5*}p>,bA[nDORz5WCA[w A[= Q [S:"gGt:A![ɤeJOBWMoX+D)(GB/}L//L}1k'sutSZIR2ebi/PCBk`o`snwEh#J [d   ;2 wG>[_:KFOJ  _h sr !wr  '>ed uH8  on 5KA [sEUA] }|)A] P}|U - z y&TM vRQ ^w)$/7C$)A&^?2231 -gngCg`o^ U&nKL9/l A^0r d_A^N}zU'&'xU'zQ^t 5j2WWVwQ _-,UML+`&A _wFYist}Q _!dF^$h%A_-$ 3^5z3B~wz 1;XOtd)iiA_4!! A_. -=<Bf+* C@A( ! H Q _|tLb1-`F76A_9-Rhe}FGA_<" #"!A_Q _>!f}9edA_-L*whFWPH; J?6|c?:mv A_&A_8 3 5,549 * Q `Vp*'zsCA5` 5&#4 +2SJ 78g0>!!F#oA>o: (~  I2k^!pA`]'A`&;(  )(  ED-,))Q `7 8R{f^_Q `O"Y"ZA`c&?> z A` A`!.1'"Q `إzR/Ef5c4GA`gKF>SF_^ #& k]D%"A` A`偨@7)\=<?>;z>;%$8ADCB?Q aDj;I}/elA aS!QLiqRAa^(utAalLQ an6\q vnA5a~GeSP Qia  7Az5. yz in=P wY*AazA%a{*'& Lw 2BO)vE3vE r4pqF~YVWVS Ra /Q bp,89#Z9:$A?b&lon+mVm4w IA3$SM) (3<y r=,wn/xTKm~5rQ{*| sd A b)^ C_ .=>q|  = 4cXq> 8 }t)V C:q7ElMFP/ cn   "v1:E@MPAB:s#  ?@/V#4(w\|E&m`E!107"H@ h9&2i ^5.uxOPO8A]Hn{eZ;6 Pe,A cO<, <0S+~1 Acs 1 N`1 N=@-<  Ac偃lJ XsA&c"+* 5   ' $AcꁗJ'  9*1 A-c %!  #    "4 Qfk6owY<+(W}RkeN+SOl!RAf4j*/>5GDaZ_BAf3v .'W~Af7L Q f]q63V=A-fiiRg,CcT#pcZ  {fqdQR^2  ! %21@Afs"% A fjQ SL} 54  ()?f7z[ZEDEDQ f'Pm [pNA.gK$=<YnhwSK3Zm5/B}N.I69J1'"-&#"P$Ag(WAg i 76fa`SOQ gli;HM,yx`;A g|$}b"9$ gAg{2k jYAgj Q g #LT1Zo>Agnt]x! Q g089][: Ag(PNKF% mF#HP6Ag+A g{h~~)&|Q g6hoe%$Ag*d}noT}1v_gFYbU]dAg 'AgJ%z~ih~}50~}Q h;~-,~x{ 5  A"hH j{xX>9j5I ^?& !}u%&}~ [,EAhR,;!AhIvwr3@C454wA& uh96Q hKvo6Q)A hQ[]p=CNAh/AhQ h0v654O |gA hߘi IZ-&exDAh.Ahꁪ A@]pQi sd] h2qtdt=A@i@c  e }S  L\'$=K1.//c(} ?!Y B /nd g2 V +6 } WNK UD\3 B JS Hel) YLuAqip+& 7,    8=$         & 18       oj/0    ad A ih2/.M$ cA i55 sv 2[ Z   XU'J 1A2iB 4;4 ? > EDI LQPUZ g hij      Ai" B5 X  =HR O7Ai 72#   Q k_bnomVpQnAki2nOrtE=! .A klc Akk?Q kI[oHGDA5kuu@Ary2o2(4 #3~X ! <XE^vmlQK('Ak=hA/kj 1q  #` ;'pu&LutONO+^ kpk&>srA@uy( "A3yjuwQ l ^)M4/P2qtCF ?f =R{tnWG4{t aTyz +An9LbA"n2&) &hv {[r % MB$+*)Q nC8eX A#nыH8 3% p )410E.e8 e+   c @CAn8 )" m lq pf[XY\A o  Q oWAoLUSj!SAHodk 8Xa| >.kB ~%T)sM +j_:Wt CAV ; >g)  h|%  (M  OhQ@ C x CuZ |KGF}#m _DA" AgofDM     AB+2   uv.    /         #  AoQ,?_^  \%WHX  {+|<}'<A(o} %$#?! *  nm) Ao~3  %]&.?9 "2 PA.ohC' *  "  !6*,Ao3U(0M1lA"#A(ol "  >E !  1   Q rW+<dQZ}'JJAErg ?~ XY ~ [ (I@g  _ p`V 1\nN8E~Y= v $?j* YeN E!#E_ Zqv,Q iHu.8AWrtk       7 4+     )("  Ara eRE  5w$xaA8r; %$3,(`a ON HI @=   WArI (; 85A6rx &  , # ArhH D *  </A/rkA /   @   QuJ]V*-]^dk/0A u0><Z ~EHAu/rAu6E!dQ uFS^gX=d'&AuT^JQ uYy4q!*H OA udVE#fWZDEQ uou-hk~dm-(D.AGu@@'U[jeVQPtk|?g"ON   wz[Vad +sczABu~ 23B 54   KD)(I(!+H CDEP]\SBoUBsYBihEwP h+Z[A u WQ vO7o`! AHvw ; `^P x] <2NpgY m\H>I{Z'fpa&{*'T= R#aG Gy61d{PY6;=#L0DA AVv  %&       $.        =:A vy=>o>p,5A v7%  ;  :!5) 5Av^  `Kb*>OA'v  ."#?  "  A)vr   E$! 8A4v!  = "   +   Q y:THy@Cc$A1yGZ3^XJ{r[`t?WpO T$*$Yk:(ih[\ y}W:;ST6%AyE;v NOJK TK ~|FG~DEm nAyDY  Q y݁gWk@)()mGAyf; -D$YIv SAyꁙ&SPE%$8C >Ayk Q z7 \ >tVAzB6T?@] b  stQPyAzEK A zD+7H K@E Q z}*1d)?2ZAz+Z>Q zZ>5gA zx niwtjGJAzQAz{ A&#"#Q zËT@B=^O A z n#-Q zd .61JdwAzzQ07y7  XN#AzcC\5 VWAz #Q {% jh9UvA{3JK VoMA{1Z TB 'A{0Q {KR'k0NSvA{]i!  g A {`](+LM&| -A{j Q{)2 . $) XW"_A{{5(pogLA{bA {30+*+.Q {Ěc0byF%AQ{Ϯn Z.-<  zq{r uv#& /.yxKQp(!-05#EB''*s6B;fA{c1   C@BA'{ԁ hifizlmlmlq nut w tun gfeA{ہ&   ) Q |ү&HHC3z,A|ܯ'E/+12utCVcK(A|vHI J A|遭1Q}2'KkI0cTHA} IL*nQ }*6z= 3_A}595XQ }?8ZQ.R X1A }K5,tSt/{r kYT 9Vh1Hx A}MN  T5! T WX>{zZ>A<BA}Q8 Q}6OS PsbE2TM{A!}N(luX#P?*yk`  k;kr/*d2  A}8I ; a9ihifA}G  Q ~12ZPY Ai~&N{  53N  w<St8Q|OjmbTI )  QTdz4ML!GH! b_?6?6K-x +1Z[A~GON + /- A#~'B[Z, 1)01010+ &%"    A~-L /) & Q >9IA+yQih9Q$O4;@xzZI$TuiTlYzG'N  8A{j  ~~ ~ /. /.Ap7Q큙t!5F }A%7n~elOevk,;%F,3 h . s v qAj>8A+ d      A6y  GFz  ?FC8 tutwNLO@uONvup(p,A y   Q MrX\&M0eA Q c-xpQ \]WA!=0veyxQ 2>76-q\wNA@$?@^<7@ {z9Ma#A<nm5016wv ^Wc\VYI Y A C   Q +R?k~u(-,Q E%?0kj 6JA ŋ_ Rkp$e^AGJAЁ Q ޱELShiP+W tA)m (yJUT=B;ZQA ꁚSML A큮%3Q+T,ut3HU>ES'hBA@OJ A<9a`A=/Q OcZpK,UAAwYWA bmp ;4A Zzh /Q~UQ ON?PlmmA7[O@*_2wh*!@bINkV!^ 0fW7>!3<# +6Y\%M\*=dy[A5Kdi +*KMf!ml"A 9 )0Q _;EP)g?$Q id5Aun$A4  CW, -]A s=Mz3 B54AtJQ `Zb[=X A8ėr/mv;>,)^( Y 9f ~SZ;~ B#wrShiPitrCJawTv_ AӁ_z G JKGun H J KTÁR%  Q ,terqpEAPA:Aa(bcbEQ -zwy* rF?LAO> 9: C& q '"?@rm W 6 ;D{ d/LON)Hb =R  56C'  3,Yt*  Ab%GH( KJaA-| knsrsronmlst/` 5 x'(%  A"m   " #  Q X*Vsmlm|A >,Y( _)d ,T>&A- r             +8AP#noano\ alZih] cbhkb Ul 3=tvhcb]t}|d[xzy\ed_^_^ihcba`] bonk*)f=+Q  |q,kCA=  UVg)z)AA<x}| mnojkjmjkjQUCwch9&! b.x?HA/h/x/jb SZy d dW tW a;\SCc\F L<q;3dz d+={vuDU\AIk3       .7$  ^[   A  *  <[SZ GFA,iOji0 h[r de$h a`iyx`a` e ` a`a`cA$qG#     Q |H=T CNAW!AQ XedAb]\A*Z/g`k@YA6@ AA /y#jI#Q P.fPbuXIIA5[ ! 6Gn8M#VJ9 :[>rg6>rudu-4i!LO9%K/y`&A]dj kjon KJM|NMLsrOA\ Q ڴ3 sA#+JUH0o-,\[bA&A 쁚chiS:7LQ87LQ ` .2ikaAF&57<heCDKN'"MFGFTUw h GJ%&onI["5 QPUX1n.SA+- 3 ~ 4J}z4 5~KJONO7|}KCzA@BIHG9HA0  (  Q AE/RVgnA HD%5r ]^Q u?a wXIRA"Ε*Jbkd (ut_<E 0CX.H) +>< )yR]yQ. 4MA+ʹ}   rqPb c   A8ҁv7Q 54 96 L     '& FG`&'b G  EDEDM Q^0= <9}Aρ<  e    !Q G DAVYA_|AU*  AT1V?>^a7Z D#"GF]\Q GUVB+E*A ʒq|0 J!1a4 PUA>`aj k AH\iD]\ C@ "GT f#E jO&S|Q %!(O:HW~uQ 3SJ+/X]#Q >X[&vI7A9IZ[^A9&$]^ML c`kA,72S7Z8}|!"A\1K \G&AJ@N_^QKR? j ]^ uN utu0c$A O|7 Q dJ#H]k APfN/4  ;Z]JO` beujpW@=YoVz Tm "SD/ *[xh-6i`Y,/eWiE#& j1+0B0M84 C<;T2uA@v   Z[de-jH%>G>? >=  Z[daA,VC "" )  A -~i '$NA8/0? :=< =<=:=898965 (/ $% !  A?"!& "   Q ֶ8G.m Kt^A| %-%"KA:    zA쁒}t67   a,b  i/ &Q B0'_tmA:NL}~ u{\  G 5f*wB wz G Nuz +{Qs=:/_bS:KNAOzRON$KJA2MM  zw{ )vQoB?r )#nL$GtA/hxIe9eA .[  zA3W454_m6'9^9o&Q ixc6AE$+~AudH e .T  "_6"nUh#c:FWhA5|e t } hehe r _ VWL S,-A5s% hede ED + $#HI YA  Y d#NO @G$YILM # LML LA"tz     yQ }'Cx2wxA?AD5.IH6 7BUK), <Dq41cLABup;h%f>)}R$kTA&Y  ~KJ4`"SRON)()VPUT10A &> Q 4rs *zHA)E6DsnZU+BAo(g|-8O]&IIyrKHK$A|+1A"|}0Scfi tuA8#Q )&QPQ $iA= R C5v54!B="!45~ED6]$qr! mlG@W ~Z36&A"\BCFG }lqono,?o*E>1p>1 0I HI A ?, " Q ƸJNP< A ӌ=kd: A|`AܸAЁRKHIyjTA.9H 9yD M61Q LyY?e~AEB&Kk% K$\1@02C3G h5Q6q4ETCP.D>HY/P[T ^eVs)f-^- .)M$i 8 $NDCwjpAܰ9?B (Ao! HGJc bK5 "   H     L#/A 0 '   pql k lmA93&7'BA8KZ Q8  " RAV*p*= +$0A<u!D (B  V   " A&< */ >A  AMYC ? L  Q P]H;C*O Aɏ% $  }bAc\c   H3    A%2?LMLM:!s/b3x-def ](~)$A.)8Q !4^M+*;qA-;hszU(> d.lONip E`Q 8aX1Fmf_ZSk6 l| fUzT_ S Z  )2MR `e |G](2/V ;:76;:xde 2dt-}6;D }MIA A6n   ?#  :A eA]7 &A?1g ! !  k xo n mheda L M]HIF E!@  E>A&=C {"  p Q \`auxc^ )N"s=2ZC<}C<i4LC~E-CBSCB@ ~%HqAQR{[_E:^Cltq0? or%?jW3JOGbE3 GNYODg/K V_[ *%)2).Ad tZ >28 tC&>eh $,I/^@ !W%X$ (}:CI St+;;I ooC@܉Q n,Ew P>Lx7 2~ B 5I'$'I!,S  [  WX (holQ;z)fV (Ri2W B9E.gO c( _v<.TB -0,|"]    e~2u9/5sR D("Y#l$ Zf (1 %NlB7=(l{ K{$$64&wB(2 > L#8-a_iJv4qIw7 6 @Hk"K0!  $ -'3 \- ` #RaFE '^ > (6u +"h093@9 d&B Rv{2*9/C,@Yb"X:[XMiB( *Y8]mYh QS,6AI|tggf8I* , F }0R >xA)(uAzW [7fe(gN-w &dA(OQ ZGc>_,A"6 Q+0F-8 _N?$Cd5&oD _",aw~e?nA5Z9:PL}/Q]wI3"P!lGjK[~8A 5qpq2 FwS? B!*Mz ALgNh\Aa ;>%e!$*;AGX0nas F#*KPD\am9={ig!*Uy *$+RJ U aN 9a'!` v K7HM :!0[Bq=e4 1 C8cX6e<p(w* %_7JE2v7o*_{'7.@+[ZfCu^+!/(|u=J l,h<l^~I-B(M^ZL0RBLQ\`Sh0s=;=>Tdf)og?jedf|T >\j{ u $ .!%j9<P{]G$v>A5KV\gu-  / [/Q>Ktxg- 1U~rYWKKFIPYy|GkJMr_#hFrtdC_pT~m33=5i(m@1EJbPx"~:+*07D;>>FH`i km>{~G0 T;so{A% V%(a!j! jHvarnF~ 077E & 5L?X^ `y/" &)_V~ \DBRa t" (Ia!V9a $cI + 2 ]hv.-a!,*XY)pxCB.aLKb q| #(*3]a. aWsh |k.vqeO prNm)vauCX)\^;qw=aG9KU@^lt #U(Q,\2tS-jz| S#>0 :U?xHKOKm:4t"8-@HKyZ_Sm  9L(12y<^T r=xE g0fQfo| 1&()pOvm}h1<^ELrSY|^a Gg8 }( _QBiZ :6IDOEFuP lwa5]=x@ERl~&P_Dk\sEz@+nJT9c"M!R ,'k-0b:XF'),.lK V@^d:p $g=P2,#D`i"@BX$6XG[SVe|igt4 ))^2 ?;NPs]Tg;nu*LF.14LB3FqL[.* ^*!8h""p{yQd =P#'b5t@Ck`Hlix.W3 $"N'\L N `.l?tw(BW E%Rda ]L!TZ4 _jB lw+ka=NtWUhnx{p 0 +%>. 13gNUnjmZuI} L!{)j36BE!Jamqo|! "J8;?&FQ{\ldhUxY G:+q;=0OQ;W Y_n&ru)$(1/6?ADV%[xn1j ((+ .1/6DFJ LaR>P3G8qCXHRjHqH<Qp"@),k@Rs y8>$@DNUgO n&(-1ZNP9U[e\pMyIR E$AANHThgq%wIW -03|V1Z$^#a?hJqt0} I #9->36; >ACFI%OR3[6e"~2  W$,/2DKM1Vqz}s 3&).DLQ=WZ;`:g{l\vCL c<AEā%zPUpa `T/${/%$p OTq 5[a]kecg__a" 0c>G@Imanuskript-0.10.0/libs/pdf.js/web/cmaps/UniJIS-UTF16-V.bcmap000066400000000000000000000012031354442177200231020ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEUniJIS-UTF16-HA!bA U?dAM6Q#t&+"' +B9Q% G(A %%o/Q %@uA &zwz!O 0/ ]A'A0KQ 3JWVmA3  K? A31$1 ) ') q A3L    a%97=;A?j]`UXw ~6O c]H^[a0kg6 EPT\bhtw|~ma#^dIX MXmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniJIS-UTF32-H.bcmap000066400000000000000000001171331354442177200230740ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE#C\a !GSk]>d_?V3CMT+ 2!+VS LIS tA ~$c S n$cUP &%$)C$) f7![ S .s"'A"} ";96"B; |,"m  S/P' j>"kOL iOfO>_c 0 m("[<SCiP. S2j Ck9S PX""O( zC ^W-*'0#rS l6B''$cbC x1TI67ZS 94 M-|3)FCmb >M#=:B@; J:E+ 'ch W~92 |C l ; ls9' Vhi N.:K e, d[ 5J|Or]C3 ZZ+./? xvC F Q'  jw *"e4  ? ^(D@ 9zCAc, `2Hj &_;/1 !f PcZw 65 h6  4!;4/QfB.+T* U  9.536?C$<(#CaJ #"k l )@]VI b0# 8%  #  #'`p|k`-k]FI[-&3w;<; ye5@T K9G$ +CUptmZ$;M v3\7V=/jU_(AKv9y.@7 #C.eC.:CK  _!W:rS/0i ww85Rt {v\S /Sh> cr/qS/#&? CZccTc{i7&&So(_4uw$nBS^n}Ha$/7R4 w> .YO@4<{0PS_(VKpAX]X`-tGW-e"NOxe?Kj8]/8GUF ah(.\z($X[op%t:+T}Ra G6]C3!Y"o5n S/N <7JarC8wzC /Ӟ~/_H +<Dw*3`C00: aaC0M;:J =KA&wPy{C3x    5 & C4$&b9S6mhN T  `( 2n$Q@"QcC4lR#.g O8oxmjH9C'4Z%=,'0"kzpkH 7( pa 55F>5$LK&& . ? iGT4\#]r> K4## P\ 8 9 P" ZA8>F 2i5%" $09g  B^g6" \_ ,HBP &7J$(*V 8Cn !4 3< 5&Y1<& C$`j0Q_ \(pDG$% f@zy6d $.~.BdCD&r } v%Qo 3S N*9!#}DR1UCVNL^iO2wli@m32M(7X/uve R\gfN z3 iZj9{: ~WdQ }xXSwhN I@GF5Kr#yC NZ  a ed$ "  CN)Uxy  tuT"yx wnS N݅gN/F7CN9zPA,CN끆bFGCN聤]S NZ4dlmgpSS Oa 4?S O%k! WVroCO.3 $[q/5lCCOwS P*6mO ~z ySP!Bzidof IT;(C,P6^N yXqA(t'FeO?nR E$q)~G>@/.CP@? )#CC2P0 tu5{$yxy5{&'&} |76-05}01(;:) o 19lS P၇ 4Lk+S P_JRTjI CPbEh qtED9UCQ CP+8  )(C(SQA8!1hd;^C:d?)rgCQRr9 B?A)h.7Zm[ M`sCQdJCQS;IF_T_ W>HSS Q~#P367#"C!QQ3+Dwvsgfot1jDYX/[~+*5Rp32CQK a`CQ 1`j.-<='PgS QpQusLEzCTQ5F} =}A jC:yxQP)?I.-B;Q$` ]`9(y7>aR38&x}r3UUp{$7jFPYZoYnO$ih/0CRNGa>` XYGC1Ro #N 1 $g  Z'+P'C*+NMN#IP ON $!zg Z}SRR)hva`o*=3nA@CR|{1tKb CSSC R쁥a HBg#B,EDS SM!xVuB0 KsSCS#OA@CS$UCS%iKTU)S S8S{mo UQxTKS SEVm  C SQp9r]J/h.< CSa!CSYq#J%S Sl"JW+^X;^C#Sw`SN{|IHU pHJyxAnP{c8UN{<&CSWCSy '(RILYU**UT-~WV( V{7SSYJ'L]ZEq5 6##wPHWE#p71R>CSr?S Ty/0i/^E``C&TlC8C< b*t ;:W}]Vt /B'  vC T 4 O  0  CT"^_#]\ GTS T%XmyYCTH7%p7CS Ttz <65CTSTL}B8 =82$0p{C%TǢ 5@=L+mnJo5}:+27.m=* CT^^C'T2DETn oonoE\aJK^j  ONspQ6qS U{4HSZglnKC)U<zo t Of O`Mc~& 4p i MP1W ~owh YCU_C,U:Zrsr u  s}| jkibmz% S V/U8XCX/21(<>C2Xayx ~ vo~ ~ }f ]p| |}|atze `z#S Xhyz_zvC7Xܣ1)t|:)_PG|32kj-1: o|qR#PY6]\Pc^cdxOT[CY iGCX݁y""|/./w$%$;8 =<1S YgMyzYJwB[ CsYs&t32u4T|8izOaE"3.sA|$u X] o B_r/2OJg% t#!D =< ;g* KL =V    GJ #$ ABwa_H9t! ]\NOCYnCYq  ml# , 4?>C;Yyj?%`?<?'&8963767=: ;:KJ aC)Yr  *   ! -IS[HGHIJ[e[h*{S [Cl5*}p>,bC[nDORz5WCC[w C[= S [S:"gGt:C![ɤeJOBWMoX+D)(GB/}L//L}1k'sutSZIR2ebi/PCBk`o`snwEh#J [d   ;2 wG>[_:KFOJ  _h sr !wr  '>ed uH8  on 5KC [sEUC] }|)C] P}|U - z y&TM vRS ^w)$/7C$)C&^?2231 -gngCg`o^ U&nKL9/l C^0r d_C^N}zU'&'xU'zS^t 5j2WWVwS _-,UML+`&C _wFYist}S _!dF^$h%C_-$ 3^5z3B~wz 1;XOtd)iiC_4!! C_. -=<Bf+* C@A( ! H S _|tLb1-`F76C_9-Rhe}FGC_<" #"!C_S _>!f}9edC_-L*whFWPH; J?6|c?:mv C_&C_8 3 5,549 * S `Vp*'zsCC5` 5&#4 +2SJ 78g0>!!F#oA>o: (~  I2k^!pC`]'C`&;(  )(  ED-,))S `7 8R{f^_S `O"Y"ZC`c&?> z C` C`!.1'"S `إzR/Ef5c4GC`gKF>SF_^ #& k]D%"C` C`偨@7)\=<?>;z>;%$8ADCB?S aDj;I}/elC aS!QLiqRCa^(utCalLS an6\q vnC5a~GeSP Qia  7Az5. yz in=P wY*CazC%a{*'& Lw 2BO)vE3vE r4pqF~YVWVS Ra /S bp,89#Z9:$C?b&lon+mVm4w IA3$SM) (3<y r=,wn/xTKm~5rQ{*| sd C b)^ C_ .=>q|  = 4cXq> 8 }t)V C:q7ElMFP/ cn   "v1:E@MPAB:s#  ?@/V#4(w\|E&m`E!107"H@ h9&2i ^5.uxOPO8A]Hn{eZ;6 Pe,C cO<, <0S+~1 Ccs 1 N`1 N=@-<  Cc偃lJ XsC&c"+* 5   ' $CcꁗJ'  9*1 C-c %!  #    "4 Sfk6owY<+(W}RkeN+SOl!RCf4j*/>5GDaZ_BCf3v .'W~Cf7L S f]q63V=C-fiiRg,CcT#pcZ  {fqdQR^2  ! %21@Cfs"% C fjQ SL} 54  ()?f7z[ZEDEDS f'Pm [pNC.gK$=<YnhwSK3Zm5/B}N.I69J1'"-&#"P$Cg(WCg i 76fa`SOS gli;HM,yx`;C g|$}b"9$ gCg{2k jYCgj S g #LT1Zo>Cgnt]x! S g089][: Cg(PNKF% mF#HP6Cg+C g{h~~)&|S g6hoe%$Cg*d}noT}1v_gFYbU]dCg 'CgJ%z~ih~}50~}S h;~-,~x{ 5  C"hH j{xX>9j5I ^?& !}u%&}~ [,EChR,;!ChIvwr3@C454wA& uh96S hKvo6Q)C hQ[]p=CNCh/ChS h0v654O |gC hߘi IZ-&exDCh.Chꁪ A@]pSi sd] h2qtdt=C@i@c  e }S  L\'$=K1.//c(} ?!Y B /nd g2 V +6 } WNK UD\3 B JS Hel) YLuCqip+& 7,    8=$         & 18       oj/0    ad C ih2/.M$ cC i55 sv 2[ Z   XU'J 1C2iB 4;4 ? > EDI LQPUZ g hij      Ci" B5 X  =HR O7Ci 72#   S k_bnomVpQnCki2nOrtE=! .C klc Ckk?S kI[oHGDC5kuu@Ary2o2(4 #3~X ! <XE^vmlQK('Ck=hC/kj 1q  #` ;'pu&LutONO+^ kpk&>srA@uy( "A3yjuwS l ^)M4/P2qtCF ?f =R{tnWG4{t aTyz +Cn9LbC"n2&) &hv {[r % MB$+*)S nC8eX C#nыH8 3% p )410E.e8 e+   c @CCn8 )" m lq pf[XY\C o  S oWAoLUSj!SCHodk 8Xa| >.kB ~%T)sM +j_:Wt CAV ; >g)  h|%  (M  OhQ@ C x CuZ |KGF}#m _DA" CgofDM     AB+2   uv.    /         #  CoQ,?_^  \%WHX  {+|<}'<C(o} %$#?! *  nm) Co~3  %]&.?9 "2 PC.ohC' *  "  !6*,Co3U(0M1lA"#C(ol "  >E !  1   S rW+<dQZ}'JJCErg ?~ XY ~ [ (I@g  _ p`V 1\nN8E~Y= v $?j* YeN E!#E_ Zqv,Q iHu.8CWrtk       7 4+     )("  Cra eRE  5w$xaC8r; %$3,(`a ON HI @=   WCrI (; 85C6rx &  , # CrhH D *  </C/rkA /   @   SuJ]V*-]^dk/0C u0><Z ~EHCu/rCu6E!dS uFS^gX=d'&CuT^JS uYy4q!*H OC udVE#fWZDES uou-hk~dm-(D.CGu@@'U[jeVQPtk|?g"ON   wz[Vad +sczCBu~ 23B 54   KD)(I(!+H CDEP]\SBoUBsYBihEwP h+Z[C u WS vO7o`! CHvw ; `^P x] <2NpgY m\H>I{Z'fpa&{*'T= R#aG Gy61d{PY6;=#L0DA CVv  %&       $.        =:C vy=>o>p,5C v7%  ;  :!5) 5Cv^  `Kb*>OC'v  ."#?  "  C)vr   E$! 8C4v!  = "   +   S y:THy@Cc$C1yGZ3^XJ{r[`t?WpO T$*$Yk:(ih[\ y}W:;ST6%CyE;v NOJK TK ~|FG~DEm nCyDY  S y݁gWk@)()mGCyf; -D$YIv SCyꁙ&SPE%$8C >Cyk S z7 \ >tVCzB6T?@] b  stQPyCzEK C zD+7H K@E S z}*1d)?2ZCz+Z>S zZ>5gC zx niwtjGJCzQCz{ A&#"#S zËT@B=^O C z n#-S zd .61JdwCzzQ07y7  XN#CzcC\5 VWCz #S {% jh9UvC{3JK VoMC{1Z TB 'C{0S {KR'k0NSvC{]i!  g C {`](+LM&| -C{j S{)2 . $) XW"_C{{5(pogLC{bC {30+*+.S {Ěc0byF%CQ{Ϯn Z.-<  zq{r uv#& /.yxKQp(!-05#EB''*s6B;fC{c1   C@BC'{ԁ hifizlmlmlq nut w tun gfeC{ہ&   ) S |ү&HHC3z,C|ܯ'E/+12utCVcK(C|vHI J C|遭1S}2'KkI0cTHC} IL*nS }*6z= 3_C}595XS }?8ZQ.R X1C }K5,tSt/{r kYT 9Vh1Hx C}MN  T5! T WX>{zZ>A<BC}Q8 S}6OS PsbE2TM{C!}N(luX#P?*yk`  k;kr/*d2  C}8I ; a9ihifC}G  S ~12ZPY Ci~&N{  53N  w<St8Q|OjmbTI )  QTdz4ML!GH! b_?6?6K-x +1Z[C~GON + /- C#~'B[Z, 1)01010+ &%"    C~-L /) & S >9IC+yQih9Q$O4;@xzZI$TuiTlYzG'N  8C{j  ~~ ~ /. /.Cp7S큙t!5F }C%7n~elOevk,;%F,3 h . s v qAj>8C+ d      C6y  GFz  ?FC8 tutwNLO@uONvup(p,C y   S MrX\&M0eC S c-xpQ \]WC!=0veyxS 2>76-q\wNC@$?@^<7@ {z9Ma#C<nm5016wv ^Wc\VYI Y C C   S +R?k~u(-,S E%?0kj 6JC ŋ_ Rkp$e^CGJCЁ S ޱELShiP+W tC)m (yJUT=B;ZQC ꁚSML C큮%3S+T,ut3HU>ES'hBC@OJ C<9a`C=/S OcZpK,UACwYWC bmp ;4C Zzh /Q~US ON?PlmmC7[O@*_2wh*!@bINkV!^ 0fW7>!3<# +6Y\%M\*=dy[C5Kdi +*KMf!ml"C 9 )0S _;EP)g?$S id5Cun$A4  CW, -]C s=Mz3 B54CtJS `Zb[=X C8ėr/mv;>,)^( Y 9f ~SZ;~ B#wrShiPitrCJawTv_ CӁ_z G JKGun H J KTĆR%  S ,terqpECPC:Ca(bcbES -zwy* rF?LCO> 9: C& q '"?@rm W 6 ;D{ d/LON)Hb =R  56C'  3,Yt*  Cb%GH( KJaC-| knsrsronmlst/` 5 x'(%  C"m   " #  S X*Vsmlm|C >,Y( _)d ,T>&C- r             +8CP#noano\ alZih] cbhkb Ul 3=tvhcb]t}|d[xzy\ed_^_^ihcba`] bonk*)f=+S  |q,kCC=  UVg)z)CC<x}| mnojkjmjkjSUCwch9&! b.x?HC/h/x/jb SZy d dW tW a;\SCc\F L<q;3dz d+={vuDU\CIk3       .7$  ^[   C  *  <[SZ GFC,iOji0 h[r de$h a`iyx`a` e ` a`a`cC$qG#     S |H=T CNAW!CS XedAb]\C*Z/g`k@YC6@ AC /y#jI#S P.fPbuXIIC5[ ! 6Gn8M#VJ9 :[>rg6>rudu-4i!LO9%K/y`&C]dj kjon KJM|NMLsrOC\ S ڴ3 sC#+JUH0o-,\[bC&C 쁚chiS:7LQ87LS ` .2ikaCF&57<heCDKN'"MFGFTUw h GJ%&onI["5 QPUX1n.SC+- 3 ~ 4J}z4 5~KJONO7|}KCzA@BIHG9HC0  (  S AE/RVgnC HD%5r ]^S u?a wXIRC"Ε*Jbkd (ut_<E 0CX.H) +>< )yR]yQ. 4MC+ʹ}   rqPb c   C8ҁv7Q 54 96 L     '& FG`&'b G  EDEDM Q^0= <9}Cρ<  e    !S G DAVYC_|CU*  CT1V?>^a7Z D#"GF]\S GUVB+E*C ʒq|0 J!1a4 PUC>`aj k CH\iD]\ C@ "GT f#E jO&S|S %!(O:HW~uS 3SJ+/X]#S >X[&vI7C9IZ[^A9&$]^ML c`kA,72S7Z8}|!"A\1K \G&CJ@N_^QKR? j ]^ uN utu0c$C O|7 S dJ#H]k CPfN/4  ;Z]JO` beujpW@=YoVz Tm "SD/ *[xh-6i`Y,/eWiE#& j1+0B0M84 C<;T2uC@v   Z[de-jH%>G>? >=  Z[daC,VC "" )  C -~i '$NC8/0? :=< =<=:=898965 (/ $% !  C?"!& "   S ֶ8G.m Kt^C| %-%"KC:    zC쁒}t67   a,b  i/ &S B0'_tmC:NL}~ u{\  G 5f*wB wz G Nuz +{Qs=:/_bS:KNCOzRON$KJC2MM  zw{ )vSoB?r )#nL$GtC/hxIe9eC .[  zC3W454_m6'9^9o&S ixc6AE$+~CudH e .T  "_6"nUh#c:FWhC5|e t } hehe r _ VWL S,-C5s% hede ED + $#HI YA  Y d#NO @G$YILM # LML LC"tz     yS }'Cx2wxC?AD5.IH6 7BUK), <Dq41cLABup;h%f>)}R$kTC&Y  ~KJ4`"SRON)()VPUT10C &> S 4rs *zHC)E6DsnZU+BAo(g|-8O]&IIyrKHK$A|+1C"|}0Scfi tuC8#S )&QPQ $iC= R C5v54!B="!45~ED6]$qr! mlG@W ~Z36&C"\BCFG }lqono,?o*E>1p>1 0I HI C ?, " S ƸJNP< C ӌ=kd: A|`CܸCЁRKHIyjTA.9H 9yD M61S LyY?e~CEB&Kk% K$\1@02C3G h5Q6q4ETCP.D>HY/P[T ^eVs)f-^- .)M$i 8 $NDCwjpCܰ9?B (Co! HGJc bK5 "   H     L#/A 0 '   pql k lmC93&7'BC8KZ Q8  " RCV*p*= +$0C<u!D (B  V   " C&< */ >A  CMYC ? L  S P]H;C*O Cɏ% $  }bCc\c   H3    C%2?LMLM:!s/b3x-def ](~)$A.)8S !4^M+*;qC-;hszU(> d.lONip E`Q 8aX1Fmf_ZSk6 l| fUzT_ S Z  )2MR `e |G](2/V ;:76;:xde 2dt-}6;D }MIC C6n   ?#  :C eA]7 &C?1g ! !  k xo n mheda L M]HIF E!@  E>C&=C {"  p S \`auxc_,C"6 S+0F-8 _N?$Cd5&oD _",aw~e?nA5Z9:PL}/S]wI3"P!lGjK[~8CCC 5qpq2 FwS? B!*MzCYNh\nY5#Qh;>^ )N"s=2ZCLCCi4LCD ~%HqAQR{e u_E:^Cltq0? or%?jW3JOGbE3 GNYODg/K V_[ *%)2).Ad tZ >28 tC&>eh $,I/^@ !W# `$ (}:C& St+;;I ooCQ n,Ew P>Lx7 2~ B 5I'$'I!,S  [  WX (holQ;z)fV (Ri2W B9E.gO c( _v<.TB -0,|"]    e~2u9/5sR D("Y#l$ Zf (1 %NlB7=(l{ K{$$64&wB(2 > L#8-a_iJv4qIw7 6 @Hk"K0!  $ -'3 \- ` #RaFE '^ > (6u +"h093@9 d&B Rv{2*9/C,Yb"X:[XMiB( *Y8]mYh QS,6AI|tggf8I* , F }0R >xc ;>%e!$*;AGX0nFpcs F#*KPD\am9={ig!*Uy *$+RJ U cN 9cK!` ! jHvarn2~ 0JK7!7E & 5L?X^ M :!0>`y/B &H=\_4 1Vx C8cX6e<p(w* %_7JE2v7o*_{'7.@+[ZfCu^+!/(~~|u=J l,h<l^~I-B(M^ZL0RBLQ\`Sh0s=;=>Tdf)og?jp\sdf|T >\j{ u $ .!%j9<P{]G$v>A5KV\gu-  / [/Q>Ktxg- 1U~rYWKKFIPYy|GkJMr_#hFrtdC_pT~m3"DB=R3i(m@1EJbPx"~:+*07D;>>FH`i km>{~G0 T;so{A% V%(*${eOTc t" (I$c!V9c $cI + 2 ]hv.-c!,*XY)pxCB.aLKb q| #(*3]c[%c. cXsh |k.vqeO prNm)vauCX)\^;qw=aG9KU@^lt #U(Q,\2tS-jz| S#>0 :U?xHKOKm:4t"8-@HKyZ_Sm  9L(12y<^T r=xE g0fQfo| 1&()pOvm}h1<^ELrSY|^+Tc Gg8 }( _QBiZ :6IDOEFuP lwc5]=x@ERl~&P_Dk\sEz@+nJT9c"M!R ,'k-0b:XF'),.lK V@^d:p $g=P2,#D`i"@BX$6XG[SVe|igt4 ))^2 ?;NPs]Tg;nu*LF.14LB3FqL[.* ^*!8h""p{yQd =P#'b5t@Ck`Hlix.W3 $"N'\L N `.l?tw(BW E%Rdc ]L!TZ4 _jB lw+kc=NtWUhnx{p 0 +%>. 13gNUnjmZuI} L!{)j36BE!Jamqo|! "J8;?&FQ{\ldhUxY G:+q;=0OQ;W Y_n&ru)$(1/6?ADV%[xn1j ((+ .1/6DFJ LaR>P3G8qCXHRjHqH<Qp"@),k@Rs y8>$@DNUgO n&(-1ZNP9U[e\pMyIR E$AANHThgq%wIW -03|V1Z$^#a?hJqt0} I #9->36; >ACFI%OR3[6e"~2  W$,/2DKM1Vqz}s 3&).DLQ=WZ;`:g{l\vCL s 5[a]kecg__c" 0>G@Ic_c/Ac+O%zPUpmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniJIS-UTF32-V.bcmap000066400000000000000000000012451354442177200231060ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEUniJIS-UTF32-HC!bC U?dCM6S#t&+"' +B9S% G(C %%o/S %@uC &zwz!O 0/ ]C'C0KS 3JWVmC3  K? C31$1 ) ') q C3L    c%97=;A?j]`UXw ~6O c]H^[c0kg6 EPT\bhtw|~mc#^dIX MXmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniJIS-UTF8-H.bcmap000066400000000000000000001213371354442177200230200ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE??? @\a A Q¤k]>d_?V3A´MT+ 2!+FVS LIQĀ tA ~$c Q Ėn$cUP &%$)AĤ) f7![ QĮs"'A"} ";96"BQŀj; |,"m  Q/Ő' j>"kOL iOfO>_c 0 m("[<SAƒiPn QǍ2j AǵkyQ ɐX""O( zA ɞW-*'0#rQ ɬ6B''$cbA ɸ1TIA67ZQ ʈ94 M-|3)FAʻbI>Mc=:B@; J<@A+ʔJ #"k lI)@ ]VI bp# 8%  #  c'`p I A ΆK Y B[ g" 8F.q.J N MyEu~:E cr/qR⼣&? CZccTc{i7&&So(R@⽀'4uw$nBS^n}Ha$/7R4 w> .YO@4<{0PS_(VKpAX]X`-tGW-e"NOR@⾀Se?Kj8]/8GUF ah(.\z($X[op%t:+T}Ra G6]C3!Y"o5n R⿀m <7JarC8wzB ⿓~o_H +<w*s`B〰: aaB〼BcR ㈳O p}$ B㉀Vlyn OR㊐g  D5,=2 ^B㌀pB㊩ZB㊢{R ㌃jr[Z B一0+B2㌔"   *? F#F?#,y`P'>M;:J =PKA&wPy{B㌗x   B 5[ f B㐂$&bySvmhN  M`( rn$"cB㐅l#ng xox-jyB'㐆Z%},g0"kzDpkH w(\ paP u5>u$LK&& B.I iGt\c]Qr~ K4#c \ O8 9L P" Z[A\8~F riue" $p9g@Z  ^gv"Z _^ lH fSwJd(W*VW xCnV !4 Us< u&1?R 侈%k! WVroB侖.3 $[q/B5lCB侚wR 倖*6mO ~z yR倡Bzidof IT;(B,倶^NIyXqA(t'FBeO?nR E$qC)~G>@/.B偀? )cB2倰E tu5{$yxy5{&'&}I|76-05}01(;:B) o 19lR 僡 4Lk+R 僭_JRTjI B價bDEh qtED9UB儈 B僺+D8  )(C(R兀qs!1hd;^C:d?)rgB兒r9 B?A)h.7Zm[ MC`sB兤JB兓;IF_T_ W>HDSR 冉~#P367#"B!冗Q3+Dwvsgfot1jDFYX/[~+*5Rp32B冝K ]a`B冘 1`Bj.-<='PgR 凰pQusLEzBT函5FA} =}A jC:yxQP)?I.-GB;Q$` ]`9(y7>aR38C&x}r3UUp{$7jFPYBZoYnO$ih/0B刕Na~` XPYGB1刅o #N 1 H$g  Z'+P'C*+HNMN#IP ON F$!zg Z}R勛R)hva`o*=3nA@B勲|{1tAKb B匀SB 勬a HBg#GB,EDR 匕M!xVuB0 KsSB 匣OA@{moZ@x B匤UB 匥iKTU)|UQC&R 卅Vm  B 卑p9r]J/h.< B卡!B卙q#J%R 卬"JW+^X;^B#卷`SN{B|IHU pHJyxAFnP{c8UN{<&B厓WB卹 '(DRILYU**UT-~WVB( V{7R叝YJ'L]ZEq5 6##wPHWE#p71R>B叺rF?R 合y/0i/^E``B&君lC8C< b*t ;A:W}]Vt /B'  BvB 吞 4 O M0  B吚"^_Q#]\ GATR 咈%XmyYB咕H7%p7CR 咤tz <65B咱R 咷L}B8 =82BX哀i$0  5@=L+mnFJo5}:A+27.m=*  A zo t Of O`Mc~& M4p i MPG1W ~owh YB哿^^gB'哃N98UE @DG\]FConKHqxI}| ]ih) B1哊on o nonFo jkjKqpYtOursr u Nrspqr sjEklm liR 嘯U8XB堯2q(|>B2堃ayx ~ vo~ ~I}f ]p| |@}|atze `Ez#R 壐hyz_zvB7壜1)t|:)_PG|G32kj-1: o|qR#PY6]\EPc^cdxOT[B夋iB壝yb"|/./w$%$;8C =<1R 奧MyzYJwB[ Bs女&t3C2u4T|8izOaE"3.GsA|$u X] o BA_r/2OJg% tC#!D =< ;Rg* BKL =V _   GJ #$A ABwa_H9t! ]\NOB妤n[B姊q  Wmlc _l_ S4?>B;她j?N%`?<?F'&896T376w=:I;:DKJQS aB)奲 PI*H  W T!J-C R宀HGHIJ[e[h*{R 宓Cl5*}p>,bB6実nDORz5WC;BGt:eJOBWMoX+D)(GB/}LA//L}1k'sutSZIR2ebi@/PCBk`o`snwEh#J [dR   ;2 wG>F[_:KFOJI _h sr awr  '>edKuH8  onK5KB 寀q|G PzqZbB尔*? rNO No\eB.宬wa E{zu M Su  M%&P-0 52V56B宷y_~  boc2[$DB寬NB+宭= D W d I bcH J W R 巠coXYePB0巫m W^ysje+x7C.Tq4mh[= oOB" qbGBa` !>UB巸 }@|iB巹 MP}|U -Jz y&TM vRR 幷)$/7C$B'庁?2231 -gngCg`o^JU&nKL9/l B庙0r`d_B庀 N}zU'&H'xU'zR 延t 5j2WB开VWVwR 弆-,UML+`&B 弓wFYist}R 弡dF^$h%B6弭$ 3^5z3BB~wz 1;XOtd)ii@-`F76-Rhe}FGB弴P!! B!弮 -=<Bf@+* C@A( ! H ubJ#254!R 徧>!f}9edB徳-L*wEhFWPH; J?6|c?:mvN B德fB徵8K3 5,549J* R 怒Vp*'zsCB5怠5&#4 +2SJ F78g0>!!F#oA>o: (~I I2k^!pB恝gB怟&;(J )(  EBD-,))R 悢7 8R{f^_R 悰O"Y"ZB悼c&G?> z B惕 B悻!C.1'"R 惘zR/Ef5c4GB惧gKF>SF_^D #& k]D%"BB惲 ^B惥@7)\=D<?>;z>;%$8ADCB?FR 慄j;I}/elB 慓!QLiqRB慞(utB慬LR 慮6\q vnB5慾GCeSP Qia  7ADz5. yz in=P@ wY*B憘zB%慻*'&KLw 2BO)vE3vE rE4pqF~YVWVSKRa /R 戚p,89#Z9:$B?戦lon+mV@m4w IA3$SM) (3<y@ r=,wn/xTKm~5rQ{*| Dsd B 戩^ C_D n=~q|  = 4cXqC> 8 }t)HV C:q7ElMFP/ Dcn   "v1:EA@MPAB:sE#  ?@/V#4(w\|NE&m`E!107"H@ h9&2i C^5.uxOPO8A]Hn{eZF;6 Pe,B 揵^O|, |pk~q B揑s 1 NQ`q N=@HmY|  B揥lJ sB&掽bkj I u O QI'I $GB揪Jg R [yjZq IB-揁 V%Za K#K H  Zbt R昜k6owY<+(W}RkeN+SOl!RB昴j*/>A5GDaZ_BB昳v J.'W~B昷LF R 晝q63V=B-晩iRg,CcTF#pcZ  {fqdQR^2 B ! %21@B晳"e B 晪Q SL@} 54  ()?Df7z[ZEDEDR 曷'Pm [pB/最7&$=<YnhwSK3Zm5/B}N.I6A9J1'"-&#"P$B朎(B朁_ i 76fDa`SOR 杬i;HM,yx`;B 杼$}bE"9$ gB杻D2k jYB构j R 枕 #LT1Zo>B枠nt]x! R 枯089][: B柁(PNKF% mF#HP6B枻+DB 枾{Ch~~)&|R 柮6hoe%$B<査*d}BnoT}1v_gFYbU]di,B~ 5 *gj{xX>9j5I ^?& !A}u%&}~ [,EB柺J'~N {!B-柹JD%z~ih~}50~}xEyvwr3@C454wEA& uh96R 梭Kvo6Q)B 梹Q[G]p=CNB棈/B梻GR 棏0v654O |gB 棟i IZ-&eExDB棨.B棪 A@]pR椃 sd] h2qtdt=B%椙@^C 8+& 5|,J (}hwrqt)\LuB楨2B椖%$%F&_;=$p"a]R 楷uf`=~B榁c1*}1,8=$ A(}L )?n i lB  AJ  knd{d:-g2,W '+6F uN  i@j=8    ojE/0 {~3("Hcbadyz1S Hl)DBLPGHB 榘4n U$ cB榀;wv r[ ZJ  FXUg  qPB+榒)? > CEDI LQPRUZIPg hijH  M   Z B榨u X  }RJO7B榍LwrVW# E V R 歟bnomVpQnB歩2nOrn@E=! .B 歬cF B歫?TR 殬I[oHGDB5殷uu@@Ary2o2(4 T#3~XA ! <XE^vmlQK('B毖=(\B/殽jM1q  #` ;'puB&LutONO+^ kpk&>NsrA@uy( "A3yjuwR 沁 ^)M4/P2qtCF ?@f =R{tnWG4{t aTyzD +B渹L_"B"渲&) &Fhv {[r %KMB$+C*)R 滇C8eX B#滑H8 3% p )41A0E.e8 e+  A c @CB滙8 )" mLlq pf[XY\UB 漄  SR 潗AoLUSj!SBH潤k 8XSa|N >.kB ~eT)sM kj_:WtKCAV ;M>g) Z h|% L(M  OhQ@LC x CQuZ |KGFW}#m _DAH" Bi潦DMC   H  AB+2B  Muvn R  Ko    W  J  #M  @B澈Q,_N^  \%WHX  {k||}g<B(潽 M%$cWB!`jX X nWmi HB潾3MJ%]&ny b\2IB.潨Cg j C HOXV"` avj,HB澇3Uh0 1T,bcB*潬V T"YL ~J! H q @ Z UR 牗+<dQZ}'JJBE牧 ?~ BXY ~K[ (I@g  _ p`]V 1\DnN8EQ~Y= v $O?j* YDeN E!cE_ ZqOv,Q ^iHZu.8BW牴k B   IP  XwD 4+L A  L)(b JB犱a eK QuwdxaB8犍;K%$3lQ(F`a ONR HI F@= JN HWB犛I h{Z x_5WB6牸NP &L TO EFl c ZB牨HLMj  |oZB/牫AW oN`F X @`] I R甞J]V*-]^dk/0B 田><Z ~EHGB甯rB甶E@!dR 畆S^gX=d'&B畔^JR 留y4q!*H OB 畤VE#fWZDER 畯u-hk~dm-(D.BG畿@B@'U[jeVQPCtk|?g"OND   Fwz[Vad +sczBD疁~ 23B 54@  KD)(IF(!+H CDEP]\SBoUBsDYBihEwP h+Z[B 疅 WVR 皀O7o`! Bi皐w C; `^P x]B <2NpgYC m\H~I{Zgfpa&{*N'T= R#aG] Gy6N1d{PY6;=#FL0DAQ +c8gBcg3^X1c`2WpO TIE$YK:;  }@W STmBh皋M %&H]  K G  O d.I F   I  =:S  @* + U B皛y=N>o~plucuB硏B睪U~B'盅we W{ Q [ !ui u G NB皝^ W X E b*~OQ2N B2皕  Ynb#]I Z"_ YQ d  b  MB0皭r[F  FWJd!YU xBnXBB皟a O D}M"U ` k G  FNM _R 秝gWk@)()mGB秩f; -DD$YIv SB秪&STPE%$8C >B秱kJR 稷 \ >tB穀b \e$XdAC?B穃! JB穄+AHSRK  @ENA)3Z)>R 窐Z>5gB 窟x niwtjGJB窠QB窞{ A&#"#R 竃T@B=^O B 竑 n#-R 童d .61JdwB端zQ07y7B  XN#B竴cC\H5 VWB竱 cR 笥 jh9UvB笳JKKVoMB笱Z TBC 'B笰 @R 筋R'k0NSvB筝i!  Kg B 筠](+LM&| P-B筪 YR箔)2 . $) XW"_B箪{5(poGgLB箯bB 箥30+*+.DR 範c0byF%BQ篏n Z.-<H  zq{r uv@#& /.yxKBQp(!-05#EB''*s6BA;fB篗cq Z  CBB'篔 hifBizlmlmNlq nutIw tunIgfeB篛f  QI) SR 糒&HHC3z,B糜'E/+12utCAVcK(B糝vHI JMB糩1R紏2'KkI0cTHB素IL*nR 紪6z= 3_B紵95X+R 絀&Q.R X1B 絋5,tSt/{r kYTK9Vh1Hx B絍N  T5! T WXB>{zZ>A<BB絑8 ER綪6OS PsbE2TM{B!綽N(GluX#P?*yk`  k;kr/*Ed2  B緀8I ; a9iNhifB緢G E R 縛12ZPY Bi縦N{  53BN  w<St8Q|OjBmbTI )J QTdz4MHL!GH! b_?6?C6K-x +1Z[B繇ON Yk o-N B%縧B[Z,M1)0101B0+ &%D" @    U B縭L No)\ f CR 耀>9IB+聹QihD9Q$O4;@xzZI$TuiTlHYzG'N  8B聻jL  ~~ ~L/. /.B肁p7NR胭t!5F }B%脂7n~elOTevk,;%F,O3 h . s vF qAj>8B+脉dG K  A  FB6脃y  GFz C ?FC8MtutwNELO@uONvup(@p,B脋yH N V R 與MrX\&M0eB舒 R 舖c-xpQ \]WB舡=0veyxR 舲>76-q\wNB艀$?@^<7@L{z9Ma#B舼Gnm5016wv ^Wc\CVYI Y B 艃 K R 芩+R?k~u(-,R 芷E%?0kj 6JB 苅_ Rkp$e^B苆GJB苐 R 苞ELShiP+W tB苫)m E(yJUT=B;ZQB 苪SMAL B苭%sR茫T,ut3HU>ES'hBB荀OJ B茼9Fa`B茽/DR 荏cZpK,UAB荷YWB 荢mpE ;4B 荚zh /QB~UR 莘ON?PlmmB7莢[O@*C_2wh*!@bINkV!^ 0fWE7>!3<# +6Y\%MH\*=dy[B莧5K@`i +*DKMf!Pml"B 莦9 ipUR 葟;EP)g?$R 葩d5BN葵n$AG4  CW, -]}Z=2A sr/mv;>,)^( @Y 9f ~SZ;~ BA#wrShiPitrCJawTv_ AB/葳=MzD3 B54CBAz NG JKGQun H J KTAB葴JTv%O P R 薄,terqpEB薗PB薐:B薏a(bcbER 薤-zwy* rF?LBO薹>F 9: C& q '"C?@rm W 6M ;D{ d/LON)NHb =R  M56C'  3,Yt*  AB薷bV%G]Hh KOJ!B-薼|Jknsrs@ronmlstC/` 5 xO'G(%  B"薴mI \_ Q" # E R 蜂X*Vsmlm|B 蜘>lY( _)dM ,T~&B-蜍r   L    I B   F+8BP蜎#noano\ alZih] cAbhkb UlJ3=tvhcb]t}|d[xzAy\ed_^_^ihcba`] bonAk*)f=+R 蠍 |q,kCB蠟=  DUVg)z)B蠜B蠘<x}| mnojkjmDjkjR衕Cwch9&! b.x?HB/表/x/Hjb SZyI d dW tW a;H\Sc\F LA<q;3dz d+^={vYuDU\BK衫3 B    T  .7E$ E ^[D@  JB袘 [ j  |D[Z OGFB,衩OjipC h[r dQe$h a`iyFx`a` Le ` a`a`XcB$衱GDcUK O ` R 討|H=T CNAW!B訛R 訝XedAb]\B訪Z/g`k@YB訶@IAB 訯yA#jI#R 詐.fPbuXIIB5詛 ! 6Gn8M#VJ9E :[>rg6>rudu-4i!LO9B%K/y`&B詝dj kjoFn KJM|NMQLsrOB詜Z GR 諚3 sB諤#+JUHA0o-,\[bB諴&B 諬chiS:E7LQ87LR 謙` .2ikaBF謦57< iyR]yQT. tMB+賍}  I rqbJc CP LB8賒v7Q 54 B96  U   '&S FG`&'b G  ECDEDM Q^0= <9}B賏<  eB  C  `!R 蹇 DAVYB蹟|XB蹕*  DB蹔1V?>^a7ZMD#"GF]\R 躩GUVB+E*B 車q|0 J!1aE4 PUB躾>A`aj kF B躳H\iD]E\ C@ "GTE f#E jO&S|R 輥!(O:HW~uR 輳SJ+/X]#B?輾X[BV[^Ay&$]^ML c`kA,B72S7Z8}|!"A\1BK \G&B轀?LON_^Q R? jL]^ uN utFu0c$B 轁{ wA R 逓dJ#H]k BP逝fN/4  ;ZD]JO` beujpW@=YoVz TDm "SD/ *H[xh-6i`Y,oe[WiE#& j1+0NB0M84MC<;T2uB@逞v J Z[deB-jHe>G]>? >=W  NZ[daNB逬VW bbJi  B 逭~i H'dNB8逯0?K:=<K=<=:=898E965 (/I$% !] JDB逿baf b F  ER 釖8G.m Kt^B釣| e-%"KB釡:F    @zB釬}t67   Ba,b  i/ &R 鉂0'_tmB:鉎L}~ u{\  G A5f*wB wz G NUuz +{Qs=:/_bBS:KNB鉏zONNdKJB4鉍M Izw@v{ H)vR錜oB?r )#nL$GtB錯hxXIe9eB 錮[ H zB錳W454O_m6'9^9o&R 鍩xc6AE$+~B鍵dHMe .T  b_v"nUXh#cH:FWhB5鍼eW t }I hehe rJ_ VWFL SA,-B5鍳% hBede ED + $E#HI YA  Y d#NOD @G$YILMJ# LMLLLB"鍴zO ] I  ET9ER 閟}'Cx2wxB?閭ADD5.IHv 7BUK@), <Dq41cLABup;h%f>G)}R$kTB&閫Y  ~FKJt`"SRONC)()VPAUT10B 閺&^~Z RR 隔4rs *zHB)隠E6DsnZU+BCAo(g|-8O]&IIyrKHK$A|+D1B隤"|}0STcfi tuB隟8cR 霂)&QPQ $iB=霍R C5v54!B="F!45~ED6]$qr! mlDG@W ~Z36U&B"霔\BCFGJ}lqono,?o*UE>1p>1 0I HIB B 霚?l "D R 韆JNP< B 韓=kdA: A|`B韜B韐RKHIyjTA.9H 9yDIM61R 頌 LyY?e~BE頗B&Kk% OK$\10rC3G h5Q6qF4ETCPnD~HY/P[TL^eVs)fN-^- .i $iK8 $DDCwj^pB飜9? (Bo頡 HGHJc bKuL"W  S T E   A L#/ C0 'J P pqlMk lmB頹3f7gBB頞8Z HZ Wx Q "IB顖*pj} k$p]B<頖uaJT(OCMR L  bMB頦P|R j]o >AR W BM頙YN]PM] \Q H@ T ER 鮦P]H;C*O B鯉% $  }WbB鮱c\Dc  MH3    B%鮰2?LMLM:A!s/b3x-def ](~)B$A.)8R 鰡4^M+*;qB鰭;hszU(>G d.lONip E`QL8aX1Fmf_ZSk6A l| fUzT_LS Z  )2MRE `e |G]([2/ ;A:76;:xde 2dt-D}6;D }MIB黃 B鰶nJ JN#Q `zB 鱥A]w C&_B?鰱g !L !  k Xxo nLmhedHaIL NMHIDF Ea@  EB>B&鰽CE {b H][ OpR R 鼎\`auxc_,B福"6 R侮F-8 _N?$Cd5&oDR懲9_",aw~e?nA5Z9:PL}/R艹wI3"P!lGjK[~8B! 5qpq2 FwS?@ B!*Mz B ︐Lg @DBffC 𡨚u#Qh;>XL)"s=rZC🄀}C🈂i4LC眞-C𠤎SCB𠀋~%HqAQR{[Ez^ClNt10 ore?*W3 Ob3` NYOD'/K V_[ *%)Q2).Zd tZ >R28 tCf>eh d,I/F^@ !WeX$ h}zC𢘉S4+{;I /oC𠂉Q n,O7 P~ xw 2~ `u g$g a,  [  ]WXM(ho,Q{:)EfWY hi2 \B9.g c(Mv|.BL-0,|"]    e~2uyo53RM("Ycld Z&@ (q %NWl7}(l{ {d$v4fwB(r`~  cxm!_i vtq ww O6 X|m g \ zxw  P  &U{;"^ mys*wi< ib%$a¡e!A$*;AGXAs @#* K@UaǸsh |knva΄]L!T\Zt _j lwb†DnUamy={Vig!*Uy *$k>J@  @6< Bp" F0G@fIb享`9bOⅠ ! jHv!rnr @~ 0J?7@ w!7EM& 5 ?\^F M :n!0~ yoB_ &=\_4 1Vx 8cXve&wj X%7 Ervwo*{Y'7n@k[fu^k!/(~~|u}J l,h|l~U mB(M^Z 0BLQ`hps}{}>dpogjp\3dc|V >T\*{ u`d n!%j9<P{]$v>AuK\gum  o [/> txE'- 1^U~rYW KFIYp|kJMr_#hrHt$\_pT~m3"DB=Rsihm1EJbPx"~zk*0R7;>~FH`i km~{~]p T{so{%I%(j${eOT[a]keBg_b⁴"F ( db⅖9b Ⓐ c@mI k r` ]hvP.-b↖,*YipxBnaLKb q| C#(*3]cb﹅_b者%b⺌ bNḾqeLprmivauDX)\O^;qAw=!GyKU^lt T#(,\2tSmj:|[ #~0d?xH O mztt"8m@HKyZ_Sm  y (q2y<TKr}x g0o| qfh)0Ovm\}(1[<ELrSY|^kTb⁇'8 }@ ( _Qi :vIOZEFu lwb㕝=xElY~&P_ksz+H.JT9#bM!RF ,gk-0":P<.Ih_=e|RVbp' qHd K^Yq*R yRm  x5?T'T[Z+Hko~X'),.lK <u_Dh Rr M~V`dzp dg}2lcD ib@B$vXOGSV~igtt ))^2 ?{NPs]g{nujL.q4 BsFqLn*] *a8hbbp{y$ }Pggb5t@k Hlixns d"N'L N``nl?twhBJE%RTeb≤kkb;乴WUh.xB{0 ]p k%~. 13gNUnjmZu } ] !{)j36BYE!Jamqo|!M" 8;?fFQ{\ldhUx z^+q;=pOQ{W Y__n&rui$](1/v?AQDVe[8nqj T((+ .U1o6DFJIL!R~Y81CXHRjq|Qp"),k@sx~$H@DUg Mn&(m1N\PyUepMy  E$ANThgq%w W -0O3|V1Zd^cah qtp}   cy-~36Y; >ACFIeORs[veb~2M $,/[2DKM1Vqz}sP 3&[).L^Q}WZ{`zg{lvP  c 🄐@ %A@ Q%zPU0manuskript-0.10.0/libs/pdf.js/web/cmaps/UniJIS-UTF8-V.bcmap000066400000000000000000000012461354442177200230320ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE UniJIS-UTF8-HA°MB←bB ‐UdB′QP6R⎛t&+"' +B9R┌G(B ┥o/R ╀uB ☜zwzaO_ 0/Y ]CB✂B゠KR ㌃JWVmB㌔  R ?[ B㌕1$1 F) ')Lq B㌗L   B b─97=;A?j]`UXwI~vO c]HQ[b〘kg6 EPT\bhtCw|~mb⎰^dI MXmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniJIS2004-UTF16-H.bcmap000066400000000000000000001151561354442177200234070ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE!A\a !GQk]>d_?V3AMT+ 2!+VS LIQ tA ~$c Q n$cUP &%$)A$) f7![ Q .s"'A"} ";96"B; |,"m  Q/P' j>"kOL iOfO>_c 0 m("[<SAiP. Q2j Ak9Q PX""O( zA ^W-*'0#rQ l6B''$cbA x1TI67ZQ 94 M-|3)FAmb >M#=:B@; J:E+ 'ch W~92 |C l ; ls9' Vhi N.:K e, d[ 5J|Or]A3 ZZ+./? xvC F Q'  jw *"e4  ? ^(D@ 9zAAc, `2Hj &_;/1 !f PcZw 65 h6  4!;4/QfB.+T* U  9.536?C$<(#AaJ #"k l )@]VI b0# 8%  #  #'`p|k`-k]FI[-&3w;<; ye5@T K9G$ +CUptmZ$;M v3\7V=/jU_(AKv9y.@7 #A.eA.:AK  _!W:rQ/0i ww85Rt {v\Q /Sh> cr/qQ/#&? CZccTc{i7&&So(_4uw$nBS^n}Ha$/7R4 t- .YO@4<{0PS_(VKpAX]X`-tGW-e"NOxe?Kj8]/8GUF ah(.\z($X[op%t:+T}Ra G6]C3!Y"o5n Q/N <7JarC8wzA /Ӟ~/_H +<Dw*3`A00: aaA0M;:J =KA&wPy{A3x    5 & A4$&b9S6mhN T  `( 2n$Q@"QcA4lR#.g O8oxmjH9A'4Z%=,'0"kzpkH 7( pa 55F>5$LK&& . ? iGT4\#]r> K4## P\ 8 9 P" ZA8>F 2i5%" $09g  B^g6" \_ ,HBP &7J$(*V 8Cn !4 3< 5&Y1<& C$`j0Q_ \(pDG$% f@zy6d $.~.BdCD&r } v%Qo 3Q N*9!#}DR1UAVNL^iO2wli@m32M(7X/uve R\gfN z3 iZj9{: ~WdQ }xXSwhN I@GF5Kr#yA NZ  a ed$ "  AN)Uxy  tuT"yx wnQ N݅gN/F7AN9zPA,AN끆bFGAN聤]Q NZ4dlmgpSQ Oa 4?Q O%k! WVroAO.3 $[q/5lCAOwQ P*6mO ~z yQP!Bzidv IT;(A+P6^N yXqA(t'FeO?nR E$q )G>@/.AP@? )#012A2P0 tu5{$yxy5{&'&} |76-05}01(;:) o 19lQ P၇ 4Lk+Q P_JRTjI APbEh qtED9 :AQ2vAP+- 8EF )(C(QQA8!1hd;^C:d?PxgAQRr9 B?A)h.7Zm[ M`sAQdJAQS;IF_T_ W>HSQ Q~#P367#"A QQ3+D{vsgfot1jDYX/[~+*5Rp32AQKa`AQ 1`j.-<='PgQ QpQusLEzATQ5F} =}A jC:yxQP)?I.-B;Q$` ]`9(y7>aR38&x}r3UUp{$7jFPYZoYnO$ih/0ARNGa>` XYGA1Ro #N 1 $g  Z'+P'C*+NMN#IP ON $!zg Z}QRR)hva`o*=3nA@AR|{1tKb ASSA R쁥a HBg#B,EDQ SM!xVuB0 KsSAS#OA@AS$UAS%iKTU)Q S8S{mo UQxTKQ SEVm  A SQp9r]J/h.< ASa!ASYq#J%Q Sl"JW+^X;^ASw`SNIHU pKJyxAnP]8UN{ASr?Q Ty/0i/^E``A&TlC8C< b*t ;:W}]Vt /B'  vA T 4 O  0  AT"^_#]\ GTQ T%XmyYATH7%p7CQ Ttz@ 65ATQTL}B8 =82$0p{A$TǢ 5@=LmnJo5}:+27.m=* AT ^A'T2DETn oonoE\aJK^j  ONspQ6qQ U{4HSZglnKA(U<zo t Of O`Mc~&% 4p i MP1W ~owh YAU_)_A,U:Zrsr u  s}| jkibmz% Q V/U8PDCXY\[TAVNL kvSV 1#<kl Y\AVBZ bEkA+V;* {ihxkvwv ifgd u ~gd%*r}% ab%*t56Q VȢgLiHw38t/AVӢjQ Vעk_=Je9 ACV R1 eV}~OdKJ*yr `W6.y_6;4cb %1V yvK6_AWY` FAFVPduttkxpmhy{p mh ut torIHy IH{xzyz WRc-~Q WexOlv3A8X y@D cb)7O~_}%.cL?B54\Ia@.V gv SsDMLUP # O>AX/2,+<>A2Xayx ~ vo~ ~ }f ]p| |}|atze `z#Q Xhyz_zvA7Xܣ1)t|:)_PG|32kj-1: o|qR#PY6]\Pc^cdxOT[AY iGAX݁y |"|/./w$%$;8 =<1Q YgMyzYJwB[ ArYs&t32u4T|8izOaE"3.sA|$u X] o B_r/2OJ t#!D =< ;g* KL =V    GJ #$ ABwa_H9t! ]\NOAYnn,AYq  ml# , 4?>A;Yyj?%`?<?'&8963767=: ;:KJ aA)Yr  *   ! -IQ[HGHIJ[e[h*{Q [Cl5*}p>,bA[nDORz5WCA[w A[= Q [S:"gGt:A[ɤeJOBWMoX+D)(GB/}L//L}1k'sutSZIR2ebi/PCBk`o`wE9J [d   ;2 wG>[_:KFOJ  _h sr !wr  '>ed uH8  on 5KA[sE2 >{CP:1bA\*? 2NO N/G%A-[΁z {z5   5   %&-0 5256A[ׁz $2%  "o#2$CA&[́D $  "#    Q ]coXYePA/]m W^ysjx7.Tq4mh[= oO" qbGBa` !>UA]A] TS|$'"|UML- z y)NTM vRQ ^w)$/7C$)A$^?2231 TgngCg`o^ U&nKLgl A^pH A^N }-*zU'&'KBUQ(zQ^t 0{2WWVwQ _-,UML+`&A _wFYist}Q _!dF^$h%A_-$ 3^5z3B~wz 1;XOtd)iiA_4!! A_. -=<Bf+* C@A( ! H Q _|tLb1-`F76A_9-Rhe}DGA_<"Y4"!A_Q _>!f}9edA_-L* FWPH; J?6|c?:mv A_5 4A_8 3 5,549 * Q `Vp*'zsCA4` 5&#4 +2SJ 78g0>!&#oA>o: (~  I2k^!pA`]'A`&;(  )B  ED-,)(Q `7 8R{f^_Q `O"Y"ZA`c&?> z A` A`!.1'"Q `إzR/Ef5c4GA`gKF>SF_^ #& m]D%"A` %$A`偨@7)\=<?>;z>;%$8ADCB?Q aDj;I}/elA aS!QLiqRAa^(utAalLQ an6\q vnA5a~GeSP Qia  7Az5. yz in=P wY*AazA%a{*'& Lw 2BO)vE3vE r4pqF~YVWVS Ra /Q bp,89#Z9:$A?b&lon+mVmG IA3$SM) (3<y r=,wn/xTKm~5rQ{*| sd A b)^ C_ .=>q|  = 4cXq> 8 }t  EV C:q7ElM/ cn  v1:E@MPAB:s#  ?@/V#4(w\|E&m`E!107"HH h9&2i ^5.uxOPO8A]Hn{eZ;6 Pe,Acþ'1VO<, g"fcb#?"+~1 Acs 1 N`1 N=@-<  A,c"_ b+*qp $w x      $AcꁗJ'  9*1 Ado(70A-c %!  #    "4 Qfk6owY<+(W}RkeN+SOl!RAf4j*/>5GDaZ_BAf3v .'W~Af7L Q f]q63VyA-fiiRg,CcT#pcZ  {fqdQR^2  ! %21@Afs"% A fjQ SL} 54  (T=f7z[ZEDEDQ f'Pm [pNA,gK$=<YnhwSK3Zm5/B}N.I69J1-&#"P$Ag(D34Ag i 76fa`SO 'Q gli;HM,yx`;A g|$}b"9$ gAg{2k jYAgj Q g #LT1Zo>Agnt]x! Q g089][: Ag(PNKF% mF#HP6Ag+A g{h~~)&|Q g6hoe%$Ag*d}noT}1v_gFYbU]dAg 'AgJ%z~ih~}50~}Q h;~-,~x{ 5  A!hH j{xX>9j5I ^?& !}u%& [,EAhR,;!AhIvwr3@C454wA& uVOh96Q hKvo6Q)A hQ[]p=CNAh/AhQ h0v654O |gA hߘi IZ-&exDAh.Ahꁪ A@]pQi sd] h2qtdt=A7i@c  e }S *'$=K ) /c, ?!Y nd g2 V +: WNK UD\#B JS Hel) YXAqip+& 7,    8=$         & 18       oj/0    ad AibX2!Y z^.h(#$" yz$ \A"i55 IHsv 2[ Z   XU'J 1{zA2iB 4;4 ? > EDI LQPUZ g hij      Ai" B5 X  =HR O7Ai 72#   Q k_bnomVpQnAki2nOrtE=! .A klc Akk?Q kI[oHGDA4kuu@Ary2o2(4 #3~X ! <XE^vmlQ^'Ak=hGA/kj 1q  #` ;'pu&LutONO+^ kpk&>srA@uy( "A3yjuwQ l ^)M4/P*yqtCF ?f =R{tnWG4FM aTBARE +An2&) Yhv {[^r wMBr}A n;w $ Q nC8eX A#nыH8 3% p )410E.e8 e)   c @CAn8 )" m lq pf[XY\A o  Q oWAoLUSj!SA=odk 8Xa| >.kB ~7 >s:W | CAV ; >g)  h|% A OhQ x CuZ |KGF}#m _{" %AgofDM     AB+2   uv.    /         #  AoQ,?_^  U5)0/# %WHX  {J9 h op'<M A'o} %$#?! * nm) Ao~3  %]&.?9 "2 PA.ohC' *  "  !6*,Ao3U(0-IilA"A)ol "  >E !  1   Q rW+dPdQZ}'JJAErg ?~ XY ~ [ (I@g  _ p`V 1\nN8E~Y= v $?j* YeN E!#E_ Zqv,Q iH! .8AWrtk        7 4+     )("  Ara eRE  5w$xaA9r; %$3, (`a ON HI @=   WArI (; 85A6rx &  , # ArhH DTU *  </>#A/rkA /   @   QuJ]V*-]>k/0A u0><Z ~EHAu/rAu6E!dQ uFS^gX=d'&AuT^JQ uYy4q!*H OA udVE#fWZDEQ uou-hk~dm-(D.AFu@@'U[jeVQLtk|?g"ON   wz[Vad +sczAu~#/c b    wvA8u cbSRc \{Y  !@= B74Eons832Iih i.G+ BQ vO7o`! AGvw ; `^P x] <2NpgY m\HECZ'fpa&{*'T= R#aG Gy61d{PY6;=#L0DA AVv  %&       $.        =:A vy=>oB/{,5A v7%  ;  :!5) 5Av^  `Kb*>OA'v  ."#?  "  A)vr   E$! 8A4v!  = "   +   Q y:THy@CjVA1yGkU^XJ{r[`t?WpO T$*$Yk:(ih y}W:;ST6%AyE;v NOJK TK ~|FG~DEm nAyDY  Q y݁gWk@)()GAyf; -D$YX'v SAyꁙ&SPE%$8C >Ayk Q z7 \ >tVAzB6T?@] b  stQPyAzEK A zD+7H K@E Q z}*' d)?2ZAz+Z>Q zZ>5gA zx niwtjGJAzQAz{ A&#"#Q zËT@B=|^O A z n#-Q zd .61JdwAzzQ07y7 XN#A{W A z;:\ j I |Q {% jh9UvA{3JK VoMA{1Z TB 'A{0Q {KR'k0NSvA{A {]i! &A{`](+TULM&jo 8+-Q{)2 . $) XW"_A{{Tap^5LA{bA {30+*+.Q {Ěc0tRyF%AN{Ϯn Z.-<  zq{r uv#& /.yx !-05#EB''*s6B;fA{c1   C@BA*{ԁ hifizlmlm @Uq nut|+Sw tun gfeA{ہ&   ) Q |ү&HHC3z,A|ܯ'E/+12utCVcK(A|vHI J A|遭1Q}2'KkI0cTHA} IL*nQ }*6z= 3_A}595XQ }?8ZQ.R X1A }K5,tSt/{r kYT 9Vh1Hx A}MN  T5! T WX>{zZ>A<BA}Q8 Q}6OS PsbE2TM{A!}N(luX#P?*yk`  k;kr/*d2  A}8I ; a9ihifA}G  Q ~12ZPY Ai~&N{  53N  w<St8Q|OjmbTI )  QTdz4ML!GH! b_?6?6K-x dc[A~GON + /- A#~'B[Z, 1)01010+ &%"    A~-L /) & Q >9IA+yQih9Q$O4;@xzZI$TuiTlYzG'N  8A{j  ~~ ~ /. /.Ap7Q큙t!5F }A$7n~elOevk,;%F h . s v qAj>8A+ d  rm    A 2544/) A=y~ ~z{z ?DC8jk {z}t MLzK@ uONvuvup }poQ MrX\&M0eA Q c-xpQ \]WA!=0veyxQ 2>76-q\wNA G*^I79 DMYA @$ BA%<tm501$%$qUVwvj WcDiVYI ^9fsQ +R?k~u(-,Q E%?0kj 6JA ŋ_ Rkp$e^AGJAЁ Q ޱELShiP+W tA)m (yJUT=B;ZxA ꁚSML A큮%3Q+T,ut3HU>ES'hBA@OJ A<9a`A=/Q OcZpK,UAAwYWA bmp ;4A Zzh /Q~UQ ON?PlmmA7[O@*_2wh*!@bINkV!^ 0fW7>!3<# +6Y\%M\*=dyZA5Kdi +*KMf!ml"A 9 )0Q _;EP)g?$Q id5Aun$A4  CW, -]A s=Mz3 B54AtJQ `Zb[=X A7ėr/mv;>,sW( Y f ~SZ;~T#wrShiPitrCJawTv_ AӁ_z C PG JKGun H J KTÁR%  Q ,terqpEAPA:Aa(bcbEQ -zw,{ rF?AN> 9: C& @%'"?@rm W 6 ;J d/LON)Hb =R  56C'  3,Yt  Ab%GH( KJaA.| knsrsronmlst/` 5BC x'(%  A"m   " #  Q X^"smlm|A >,Y(d ,T>&A- r     ,7       AQ#noano\ alZih] cbhkb Ul 3=tvhcb]t}|d[xzy\ed_^_^ihcba`] bonk*#f=+Q  |q,kCA=  UVg)z)AA<x}| mnojkjmjkjQUCwch9&! b.x?HA-h/x/jb SZy d dW tW a;\SLF L<q;3dz d+={vuDUAJk3       .7$  ^u   A  *  <[SZ GFyA,iOji0 h[r de$h a`iyx`a` e ` a`a`cA$qG#     Q |H=T CNAW!AQ , edAb]\A*Z/g`kA6@[gA /y#jI#Q P.fPbuXIIA4[ ! 6Gn80#VJ9 :[>rg6>rudu-4i! ~9%K/y`&A]dj kjon KJM|NMPsrOA\ Q ڴ3 sA#+JU~I0o-,\TMA&A 쁚chiS:7LQ87LQ ` .2ikaAD&5dm7<heCDKN'"MFGFw h GJ%&onI["5 UX1n.SA 7(G( +IHA:-4 ml;J48o~KJlmH8kO8 ul941GA.oA.H T~ A< )yR]yQ. 4MA,ʹ} :J rqPb c   A8ҁv7Q 54 96 L     '& FG`&'b G  EDEDM Q^0= <9}Aρ<  e    !Q G DAVYA_|AU*  AT1V?>^a7Z D#"GF]\Q GUVB+E*A ʒq|0 J!1a4 PUA>`aj k AH\iD]\ C@ "GT f#E jO&S|Q %!(O:HW~uQ 3SJ+/X]#Q >X[&vI7A9IZ[^A9&$]^ML c`JwLC*S7j#8}|!"A\1K \G&AJ@N_^QKR? j ]^ uN utu0c$A O|7 Q dJNV_i AIfN  ; zJO` beu Z@=YoVz Tm "SD/ *[xh-6i`Y,K8?E#& j1+0B0M84 C<;T2uAFv*# TG  ZrODe-jH%>G>? >uI` a Z[daA,VC "" )  A -~i '$NA9/0? ZY:=< =<=:=898965 (/ $% !  A?"!& "   Q ֶ8G.m c^A| %-%"KA:    zA쁒}t67   a,b  i/ &Q B0'_tmA:NL}~ u{\  G 5f*wB wz G Nuz +{Qs=:/_b3eKNAOzRON$KJA2MM  zw{ )vQoB?r )#nL$GtA/hxIe9eA .[  zA3W454_m6'9^9o&Q ixc6AE$+~A~I e .E "_6"nU%:FWhA7|e * H } hehe r _ VWL SjU,-A6s% 5ede ED + $#HI YA  Y d#NO @G$YILM # LML LA"tz     yQ }'Cx2wxA?AD5.IH6 7BUK), <Dq41cLABup;h%f>)}R$kTA&Y  ~KJ4`"SRON)()VPUT10A &> Q 4rs`CzHA)E6DsnZU+BAo(g|-8O]&IIyrKHK$A|+1A"|}0Scfi tuA8#Q )&QPQ $iA; R C5v54!B="!45~ED6]$qr!Kl`gW E36A$\BCFG }lqono,?okj*E>1p>1 0r= HI A ?, " Q ƸJNP< A ӌ=kd: A|`AܸAЁRKHIyjTA.9H 9yD M61Q LyY?e~A?B&Kk% K$\1@02C3G h5Q 6q >1PmY/P[T/eVs)f-^- .)M$i 8 $NDCwjpAܰ9?B (As! HGJc bK5 "\]$%xy   JF<   je  L#/A 0 '   pql k lmA93&7+ {NA8KZ Q8 " RAV*p*= +$0A\u(+D&%  {xyx {B:;ji be` a`a^_V   FKHI AG FE D EB ALYC ?  L  Q P]H;6OO Aɏ%<  }bAc\c P Q  H3    A%2?LMLM:!s/b3x-def ](~)$A.)8Q !4^M+*;qA+-; ]i "l f &`Q%Y ' k Mj K"]$=bI]}kd W)_k2dt-}|8 MIAb.0F?+, zun    R[fYT_   )2 `e 2/V xde A6n   i8h#  y#xA eA]7 &A?1g ! !  k xo n mheda L M]HIF E!@  E>A&=C {"  p Q \`auxc^ )N"s=2ZC<}C<i4LC~E-CBSCB@ ~%HqAQR{[_E:^Cltq0? or%?jW3JOGbE3 GNYODg/K V_[ *%)2).Ad tZ >28 tC&>eh $,I/^@ !W%X$ (}:CI St+;;I ooC@܉Q n,Ew P>Lx7 2~ B 5I'$'I!,S  [  WX (holQ;z)fV (Ri2W B9E.gO c( _v<.TB -0,|"]    e~2u9/5sR D("Y#l$ Zf (1 %NlB7=(l{ K{$$64&wB(2 > L#8-a_iJv4qIw7 6 @Hk"K0!  $ -'3 \- ` #RaFE '^ > (6u +"h093@9 d&B Rv{2*9/C,@Yb"X:[XMiB( *Y8]mYh QS,6AI|tggf8I* , F }0R >xA)(uAzW [7fe(gN-w &dA(OQ ZGc>_,Q\Y"6 A,~Q+0F-8 _N?$Cd5&oD8_",aw~e?nA5Z9:PL}/Q]wI3"P!lGjK[~8A 5qpq2 FwS? B!*Mz ALgNh\Aa ;>%e!$*;AGX0nas F#*KPD\am9={ig!*Uy *$+RJ U aN 9a_ha$!` v K7HM :!0[Bq=e4 1 C8cX6e<p(w* %_7JE2v7o*_{'7.@+[ZfCu^+!/(|u=J l,>l^~I-B(M^ZL0RBLQ\`Sh0s=;=>Tdf)og?jedf  >\j{ u $ .!%j9<P{]G$v>A5KV\gu-  / [/Q>Ktxg- 1U~rYWKKFIPYy|GkJMr_#hFrtdC_pT~m33=5i(m@1EJbPx"~:+*07D;>>FH`i km>{~G0 T;so{A% V%(a!j! jHvarnF~ 077E & 5L?X^ `y/" &)_V~ \DBRa t" (Ia!V9a $cI + 2 ]hv.-a!,*XY)pxCB.aLKb q| #(*3]a. aWsh |k.vqeO prNm)vauCX)\^;qw=aG9KU@^lt #U(Q,\2tS-jz| S#>0 :U?xHKOKm:4t"8-@HKyZ_Sm  9L(12y<^T r=xE g0fQfo| 1&()pOvm}h1<^ELrSY|^a Gg8 }( _QBiZ :6IDOEFuP lwa$]L!TZ4 _jB lw+kJ=x@ERl~&P_Dk\sEz@+nJT9c"M!R ,'k-0b:I(_F=e|RV"p' qH$ KY1*R ym  85B?'TZkHko>XF'),.lK V@^d:p $g=P2,#D`i"@BX$6XG[SVe|igt4 ))^2 ?;NPs]Tg;nu*LF.14LB3FqL[.* ^*!8h""p{yQd =P#'b5t@Ck`Hlix.W3 $"N'\L N `.l?tw(BW E%Rda>NtWUhnx{p 0 +%>. 13gNUnjmZuI} L!{)j36BE!Jamqo|! "J8;?&FQ{\ldhUxY G:+q;=0OQ;W Y_n&ru)$(1/6?ADV%[xn1j ((+ .1/6DFJ LaR>P3G8qCXHRjHqH<Qp"@),k@Rs y8>$@DNUgO n&(-1ZNP9U[e\pMyIR E$AANHThgq%wIW -03|V1Z$^#a?hJqt0} I #9->36; >ACFI%OR3[6e"~2  W$,/2DKM1Vqz}K& 3&).DLQ=WZ;`:g{l\vCL c<AEā%zPUpa `T/{/%$p OTq 5[a]kecg__a" 0c>G@Imanuskript-0.10.0/libs/pdf.js/web/cmaps/UniJIS2004-UTF16-V.bcmap000066400000000000000000000012071354442177200234140ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEUniJIS2004-UTF16-HA!bA U?dAM6Q#t&+"' +B9Q% G(A %%o/Q %@uA &zwz!O 0/ ]A'A0KQ 3JWVmA3  K? A31$1 ) ') q A3L    a%97=;A?j]`UXw ~6O c]H^[a0kg6 EPT\bhtw|~ma#^dIX MXmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniJIS2004-UTF32-H.bcmap000066400000000000000000001172661354442177200234110ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE#C\a !GSk]>d_?V3CMT+ 2!+VS LIS tA ~$c S n$cUP &%$)C$) f7![ S .s"'A"} ";96"B; |,"m  S/P' j>"kOL iOfO>_c 0 m("[<SCiP. S2j Ck9S PX""O( zC ^W-*'0#rS l6B''$cbC x1TI67ZS 94 M-|3)FCmb >M#=:B@; J:E+ 'ch W~92 |C l ; ls9' Vhi N.:K e, d[ 5J|Or]C3 ZZ+./? xvC F Q'  jw *"e4  ? ^(D@ 9zCAc, `2Hj &_;/1 !f PcZw 65 h6  4!;4/QfB.+T* U  9.536?C$<(#CaJ #"k l )@]VI b0# 8%  #  #'`p|k`-k]FI[-&3w;<; ye5@T K9G$ +CUptmZ$;M v3\7V=/jU_(AKv9y.@7 #C.eC.:CK  _!W:rS/0i ww85Rt {v\S /Sh> cr/qS/#&? CZccTc{i7&&So(_4uw$nBS^n}Ha$/7R4 t- .YO@4<{0PS_(VKpAX]X`-tGW-e"NOxe?Kj8]/8GUF ah(.\z($X[op%t:+T}Ra G6]C3!Y"o5n S/N <7JarC8wzC /Ӟ~/_H +<Dw*3`C00: aaC0M;:J =KA&wPy{C3x    5 & C4$&b9S6mhN T  `( 2n$Q@"QcC4lR#.g O8oxmjH9C'4Z%=,'0"kzpkH 7( pa 55F>5$LK&& . ? iGT4\#]r> K4## P\ 8 9 P" ZA8>F 2i5%" $09g  B^g6" \_ ,HBP &7J$(*V 8Cn !4 3< 5&Y1<& C$`j0Q_ \(pDG$% f@zy6d $.~.BdCD&r } v%Qo 3S N*9!#}DR1UCVNL^iO2wli@m32M(7X/uve R\gfN z3 iZj9{: ~WdQ }xXSwhN I@GF5Kr#yC NZ  a ed$ "  CN)Uxy  tuT"yx wnS N݅gN/F7CN9zPA,CN끆bFGCN聤]S NZ4dlmgpSS Oa 4?S O%k! WVroCO.3 $[q/5lCCOwS P*6mO ~z ySP!Bzidv IT;(C+P6^N yXqA(t'FeO?nR E$q )G>@/.CP@? )#012C2P0 tu5{$yxy5{&'&} |76-05}01(;:) o 19lS P၇ 4Lk+S P_JRTjI CPbEh qtED9 :CQ2vCP+- 8EF )(C(SQA8!1hd;^C:d?PxgCQRr9 B?A)h.7Zm[ M`sCQdJCQS;IF_T_ W>HSS Q~#P367#"C QQ3+D{vsgfot1jDYX/[~+*5Rp32CQKa`CQ 1`j.-<='PgS QpQusLEzCTQ5F} =}A jC:yxQP)?I.-B;Q$` ]`9(y7>aR38&x}r3UUp{$7jFPYZoYnO$ih/0CRNGa>` XYGC1Ro #N 1 $g  Z'+P'C*+NMN#IP ON $!zg Z}SRR)hva`o*=3nA@CR|{1tKb CSSC R쁥a HBg#B,EDS SM!xVuB0 KsSCS#OA@CS$UCS%iKTU)S S8S{mo UQxTKS SEVm  C SQp9r]J/h.< CSa!CSYq#J%S Sl"JW+^X;^CSw`SNIHU pKJyxAnP]8UN{CSr?S Ty/0i/^E``C&TlC8C< b*t ;:W}]Vt /B'  vC T 4 O  0  CT"^_#]\ GTS T%XmyYCTH7%p7CS Ttz@ 65CTSTL}B8 =82$0p{C$TǢ 5@=LmnJo5}:+27.m=* CT ^C'T2DETn oonoE\aJK^j  ONspQ6qS U{4HSZglnKC(U<zo t Of O`Mc~&% 4p i MP1W ~owh YCU_)_C,U:Zrsr u  s}| jkibmz% S V/U8PDCXY\[TCVNL kvSV 1#<kl Y\CVBZ bEkC+V;* {ihxkvwv ifgd u ~gd%*r}% ab%*t56S VȢgLiHw38t/CVӢjS Vעk_=Je9 CCV R1 eV}~OdKJ*yr `W6.y_6;4cb %1V yvK6_CWY` FCFVPduttkxpmhy{p mh ut torIHy IH{xzyz WRc-~S WexOlv3C8X y@D cb)7O~_}%.cL?B54\Ia@.V gv SsDMLUP # O>CX/2,+<>C2Xayx ~ vo~ ~ }f ]p| |}|atze `z#S Xhyz_zvC7Xܣ1)t|:)_PG|32kj-1: o|qR#PY6]\Pc^cdxOT[CY iGCX݁y |"|/./w$%$;8 =<1S YgMyzYJwB[ CrYs&t32u4T|8izOaE"3.sA|$u X] o B_r/2OJ t#!D =< ;g* KL =V    GJ #$ ABwa_H9t! ]\NOCYnn,CYq  ml# , 4?>C;Yyj?%`?<?'&8963767=: ;:KJ aC)Yr  *   ! -IS[HGHIJ[e[h*{S [Cl5*}p>,bC[nDORz5WCC[w C[= S [S:"gGt:C[ɤeJOBWMoX+D)(GB/}L//L}1k'sutSZIR2ebi/PCBk`o`wE9J [d   ;2 wG>[_:KFOJ  _h sr !wr  '>ed uH8  on 5KC[sE2 >{CP:1bC\*? 2NO N/G%C-[΁z {z5   5   %&-0 5256C[ׁz $2%  "o#2$CC&[́D $  "#    S ]coXYePC/]m W^ysjx7.Tq4mh[= oO" qbGBa` !>UC]C] TS|$'"|UML- z y)NTM vRS ^w)$/7C$)C$^?2231 TgngCg`o^ U&nKLgl C^pH C^N }-*zU'&'KBUQ(zS^t 0{2WWVwS _-,UML+`&C _wFYist}S _!dF^$h%C_-$ 3^5z3B~wz 1;XOtd)iiC_4!! C_. -=<Bf+* C@A( ! H S _|tLb1-`F76C_9-Rhe}DGC_<"Y4"!C_S _>!f}9edC_-L* FWPH; J?6|c?:mv C_5 4C_8 3 5,549 * S `Vp*'zsCC4` 5&#4 +2SJ 78g0>!&#oA>o: (~  I2k^!pC`]'C`&;(  )B  ED-,)(S `7 8R{f^_S `O"Y"ZC`c&?> z C` C`!.1'"S `إzR/Ef5c4GC`gKF>SF_^ #& m]D%"C` %$C`偨@7)\=<?>;z>;%$8ADCB?S aDj;I}/elC aS!QLiqRCa^(utCalLS an6\q vnC5a~GeSP Qia  7Az5. yz in=P wY*CazC%a{*'& Lw 2BO)vE3vE r4pqF~YVWVS Ra /S bp,89#Z9:$C?b&lon+mVmG IA3$SM) (3<y r=,wn/xTKm~5rQ{*| sd C b)^ C_ .=>q|  = 4cXq> 8 }t  EV C:q7ElM/ cn  v1:E@MPAB:s#  ?@/V#4(w\|E&m`E!107"HH h9&2i ^5.uxOPO8A]Hn{eZ;6 Pe,Ccþ'1VO<, g"fcb#?"+~1 Ccs 1 N`1 N=@-<  C,c"_ b+*qp $w x      $CcꁗJ'  9*1 Cdo(70C-c %!  #    "4 Sfk6owY<+(W}RkeN+SOl!RCf4j*/>5GDaZ_BCf3v .'W~Cf7L S f]q63VyC-fiiRg,CcT#pcZ  {fqdQR^2  ! %21@Cfs"% C fjQ SL} 54  (T=f7z[ZEDEDS f'Pm [pNC,gK$=<YnhwSK3Zm5/B}N.I69J1-&#"P$Cg(D34Cg i 76fa`SO 'S gli;HM,yx`;C g|$}b"9$ gCg{2k jYCgj S g #LT1Zo>Cgnt]x! S g089][: Cg(PNKF% mF#HP6Cg+C g{h~~)&|S g6hoe%$Cg*d}noT}1v_gFYbU]dCg 'CgJ%z~ih~}50~}S h;~-,~x{ 5  C!hH j{xX>9j5I ^?& !}u%& [,EChR,;!ChIvwr3@C454wA& uVOh96S hKvo6Q)C hQ[]p=CNCh/ChS h0v654O |gC hߘi IZ-&exDCh.Chꁪ A@]pSi sd] h2qtdt=C7i@c  e }S *'$=K ) /c, ?!Y nd g2 V +: WNK UD\#B JS Hel) YXCqip+& 7,    8=$         & 18       oj/0    ad CibX2!Y z^.h(#$" yz$ \C"i55 IHsv 2[ Z   XU'J 1{zC2iB 4;4 ? > EDI LQPUZ g hij      Ci" B5 X  =HR O7Ci 72#   S k_bnomVpQnCki2nOrtE=! .C klc Ckk?S kI[oHGDC4kuu@Ary2o2(4 #3~X ! <XE^vmlQ^'Ck=hGC/kj 1q  #` ;'pu&LutONO+^ kpk&>srA@uy( "A3yjuwS l ^)M4/P*yqtCF ?f =R{tnWG4FM aTBARE +Cn2&) Yhv {[^r wMBr}C n;w $ S nC8eX C#nыH8 3% p )410E.e8 e)   c @CCn8 )" m lq pf[XY\C o  S oWAoLUSj!SC=odk 8Xa| >.kB ~7 >s:W | CAV ; >g)  h|% A OhQ x CuZ |KGF}#m _{" %CgofDM     AB+2   uv.    /         #  CoQ,?_^  U5)0/# %WHX  {J9 h op'<M C'o} %$#?! * nm) Co~3  %]&.?9 "2 PC.ohC' *  "  !6*,Co3U(0-IilA"C)ol "  >E !  1   S rW+dPdQZ}'JJCErg ?~ XY ~ [ (I@g  _ p`V 1\nN8E~Y= v $?j* YeN E!#E_ Zqv,Q iH! .8CWrtk        7 4+     )("  Cra eRE  5w$xaC9r; %$3, (`a ON HI @=   WCrI (; 85C6rx &  , # CrhH DTU *  </>#C/rkA /   @   SuJ]V*-]>k/0C u0><Z ~EHCu/rCu6E!dS uFS^gX=d'&CuT^JS uYy4q!*H OC udVE#fWZDES uou-hk~dm-(D.CFu@@'U[jeVQLtk|?g"ON   wz[Vad +sczCu~#/c b    wvC8u cbSRc \{Y  !@= B74Eons832Iih i.G+ BS vO7o`! CGvw ; `^P x] <2NpgY m\HECZ'fpa&{*'T= R#aG Gy61d{PY6;=#L0DA CVv  %&       $.        =:C vy=>oB/{,5C v7%  ;  :!5) 5Cv^  `Kb*>OC'v  ."#?  "  C)vr   E$! 8C4v!  = "   +   S y:THy@CjVC1yGkU^XJ{r[`t?WpO T$*$Yk:(ih y}W:;ST6%CyE;v NOJK TK ~|FG~DEm nCyDY  S y݁gWk@)()GCyf; -D$YX'v SCyꁙ&SPE%$8C >Cyk S z7 \ >tVCzB6T?@] b  stQPyCzEK C zD+7H K@E S z}*' d)?2ZCz+Z>S zZ>5gC zx niwtjGJCzQCz{ A&#"#S zËT@B=|^O C z n#-S zd .61JdwCzzQ07y7 XN#C{W C z;:\ j I |S {% jh9UvC{3JK VoMC{1Z TB 'C{0S {KR'k0NSvC{C {]i! &C{`](+TULM&jo 8+-S{)2 . $) XW"_C{{Tap^5LC{bC {30+*+.S {Ěc0tRyF%CN{Ϯn Z.-<  zq{r uv#& /.yx !-05#EB''*s6B;fC{c1   C@BC*{ԁ hifizlmlm @Uq nut|+Sw tun gfeC{ہ&   ) S |ү&HHC3z,C|ܯ'E/+12utCVcK(C|vHI J C|遭1S}2'KkI0cTHC} IL*nS }*6z= 3_C}595XS }?8ZQ.R X1C }K5,tSt/{r kYT 9Vh1Hx C}MN  T5! T WX>{zZ>A<BC}Q8 S}6OS PsbE2TM{C!}N(luX#P?*yk`  k;kr/*d2  C}8I ; a9ihifC}G  S ~12ZPY Ci~&N{  53N  w<St8Q|OjmbTI )  QTdz4ML!GH! b_?6?6K-x dc[C~GON + /- C#~'B[Z, 1)01010+ &%"    C~-L /) & S >9IC+yQih9Q$O4;@xzZI$TuiTlYzG'N  8C{j  ~~ ~ /. /.Cp7S큙t!5F }C$7n~elOevk,;%F h . s v qAj>8C+ d  rm    C 2544/) C=y~ ~z{z ?DC8jk {z}t MLzK@ uONvuvup }poS MrX\&M0eC S c-xpQ \]WC!=0veyxS 2>76-q\wNC G*^I79 DMYC @$ BC%<tm501$%$qUVwvj WcDiVYI ^9fsS +R?k~u(-,S E%?0kj 6JC ŋ_ Rkp$e^CGJCЁ S ޱELShiP+W tC)m (yJUT=B;ZxC ꁚSML C큮%3S+T,ut3HU>ES'hBC@OJ C<9a`C=/S OcZpK,UACwYWC bmp ;4C Zzh /Q~US ON?PlmmC7[O@*_2wh*!@bINkV!^ 0fW7>!3<# +6Y\%M\*=dyZC5Kdi +*KMf!ml"C 9 )0S _;EP)g?$S id5Cun$A4  CW, -]C s=Mz3 B54CtJS `Zb[=X C7ėr/mv;>,sW( Y f ~SZ;~T#wrShiPitrCJawTv_ CӁ_z C PG JKGun H J KTĆR%  S ,terqpECPC:Ca(bcbES -zw,{ rF?CN> 9: C& @%'"?@rm W 6 ;J d/LON)Hb =R  56C'  3,Yt  Cb%GH( KJaC.| knsrsronmlst/` 5BC x'(%  C"m   " #  S X^"smlm|C >,Y(d ,T>&C- r     ,7       CQ#noano\ alZih] cbhkb Ul 3=tvhcb]t}|d[xzy\ed_^_^ihcba`] bonk*#f=+S  |q,kCC=  UVg)z)CC<x}| mnojkjmjkjSUCwch9&! b.x?HC-h/x/jb SZy d dW tW a;\SLF L<q;3dz d+={vuDUCJk3       .7$  ^u   C  *  <[SZ GFyC,iOji0 h[r de$h a`iyx`a` e ` a`a`cC$qG#     S |H=T CNAW!CS , edAb]\C*Z/g`kC6@[gC /y#jI#S P.fPbuXIIC4[ ! 6Gn80#VJ9 :[>rg6>rudu-4i! ~9%K/y`&C]dj kjon KJM|NMPsrOC\ S ڴ3 sC#+JU~I0o-,\TMC&C 쁚chiS:7LQ87LS ` .2ikaCD&5dm7<heCDKN'"MFGFw h GJ%&onI["5 UX1n.SC 7(G( +IHC:-4 ml;J48o~KJlmH8kO8 ul941GA.oA.H T~ A< )yR]yQ. 4MC,ʹ} :J rqPb c   C8ҁv7Q 54 96 L     '& FG`&'b G  EDEDM Q^0= <9}Cρ<  e    !S G DAVYC_|CU*  CT1V?>^a7Z D#"GF]\S GUVB+E*C ʒq|0 J!1a4 PUC>`aj k CH\iD]\ C@ "GT f#E jO&S|S %!(O:HW~uS 3SJ+/X]#S >X[&vI7C9IZ[^A9&$]^ML c`JwLC*S7j#8}|!"A\1K \G&CJ@N_^QKR? j ]^ uN utu0c$C O|7 S dJNV_i CIfN  ; zJO` beu Z@=YoVz Tm "SD/ *[xh-6i`Y,K8?E#& j1+0B0M84 C<;T2uCFv*# TG  ZrODe-jH%>G>? >uI` a Z[daC,VC "" )  C -~i '$NC9/0? ZY:=< =<=:=898965 (/ $% !  C?"!& "   S ֶ8G.m c^C| %-%"KC:    zC쁒}t67   a,b  i/ &S B0'_tmC:NL}~ u{\  G 5f*wB wz G Nuz +{Qs=:/_b3eKNCOzRON$KJC2MM  zw{ )vSoB?r )#nL$GtC/hxIe9eC .[  zC3W454_m6'9^9o&S ixc6AE$+~C~I e .E "_6"nU%:FWhC7|e * H } hehe r _ VWL SjU,-C6s% 5ede ED + $#HI YA  Y d#NO @G$YILM # LML LC"tz     yS }'Cx2wxC?AD5.IH6 7BUK), <Dq41cLABup;h%f>)}R$kTC&Y  ~KJ4`"SRON)()VPUT10C &> S 4rs`CzHC)E6DsnZU+BAo(g|-8O]&IIyrKHK$A|+1C"|}0Scfi tuC8#S )&QPQ $iC; R C5v54!B="!45~ED6]$qr!Kl`gW E36C$\BCFG }lqono,?okj*E>1p>1 0r= HI C ?, " S ƸJNP< C ӌ=kd: A|`CܸCЁRKHIyjTA.9H 9yD M61S LyY?e~C?B&Kk% K$\1@02C3G h5Q 6q >1PmY/P[T/eVs)f-^- .)M$i 8 $NDCwjpCܰ9?B (Cs! HGJc bK5 "\]$%xy   JF<   je  L#/A 0 '   pql k lmC93&7+ {NC8KZ Q8 " RCV*p*= +$0C\u(+D&%  {xyx {B:;ji be` a`a^_V   FKHI AG FE D EB CLYC ?  L  S P]H;6OO Cɏ%<  }bCc\c P Q  H3    C%2?LMLM:!s/b3x-def ](~)$A.)8S !4^M+*;qC+-; ]i "l f &`Q%Y ' k Mj K"]$=bI]}kd W)_k2dt-}|8 MICb.0F?+, zun    R[fYT_   )2 `e 2/V xde C6n   i8h#  y#xC eA]7 &C?1g ! !  k xo n mheda L M]HIF E!@  E>C&=C {"  p S \`auxc_,S\Y"6 C,~S+0F-8 _N?$Cd5&oD8_",aw~e?nA5Z9:PL}/S]wI3"P!lGjK[~8CCC 5qpq2 FwS? B!*MzCYNh\nY5#Qh;>^ )N"s=2ZCLCCi4LCD ~%HqAQR{e u_E:^Cltq0? or%?jW3JOGbE3 GNYODg/K V_[ *%)2).Ad tZ >28 tC&>eh $,I/^@ !W# `$ (}:C& St+;;I ooCQ n,Ew P>Lx7 2~ B 5I'$'I!,S  [  WX (holQ;z)fV (Ri2W B9E.gO c( _v<.TB -0,|"]    e~2u9/5sR D("Y#l$ Zf (1 %NlB7=(l{ K{$$64&wB(2 > L#8-a_iJv4qIw7 6 @Hk"K0!  $ -'3 \- ` #RaFE '^ > (6u +"h093@9 d&B Rv{2*9/C,Yb"X:[XMiB( *Y8]mYh QS,6AI|tggf8I* , F }0R >xc ;>%e!$*;AGX0nFpcs F#*KPD\am9={ig!*Uy *$+RJ U cN 9c_hcG!` ! jHvarn2~ 0JK7!7E & 5L?X^ M :!0>`y/B &H=\_4 1Vx C8cX6e<p(w* %_7JE2v7o*_{'7.@+[ZfCu^+!/(~~|u=J l,>l^~I-B(M^ZL0RBLQ\`Sh0s=;=>Tdf)og?jp\sdf  >\j{ u $ .!%j9<P{]G$v>A5KV\gu-  / [/Q>Ktxg- 1U~rYWKKFIPYy|GkJMr_#hFrtdC_pT~m3"DB=R3i(m@1EJbPx"~:+*07D;>>FH`i km>{~G0 T;so{A% V%(*{eOTc t" (I$c!V9c $cI + 2 ]hv.-c!,*XY)pxCB.aLKb q| #(*3]c[%c. cXsh |k.vqeO prNm)vauCX)\^;qw=aG9KU@^lt #U(Q,\2tS-jz| S#>0 :U?xHKOKm:4t"8-@HKyZ_Sm  9L(12y<^T r=xE g0fQfo| 1&()pOvm}h1<^ELrSY|^+Tc Gg8 }( _QBiZ :6IDOEFuP lwc$]L!TZ4 _jB lw+kJ=x@ERl~&P_Dk\sEz@+nJT9c"M!R ,'k-0b:I(_F=e|RV"p' qH$ KY1*R ym  85B?'TZkHko>XF'),.lK V@^d:p $g=P2,#D`i"@BX$6XG[SVe|igt4 ))^2 ?;NPs]Tg;nu*LF.14LB3FqL[.* ^*!8h""p{yQd =P#'b5t@Ck`Hlix.W3 $"N'\L N `.l?tw(BW E%Rdc>NtWUhnx{p 0 +%>. 13gNUnjmZuI} L!{)j36BE!Jamqo|! "J8;?&FQ{\ldhUxY G:+q;=0OQ;W Y_n&ru)$(1/6?ADV%[xn1j ((+ .1/6DFJ LaR>P3G8qCXHRjHqH<Qp"@),k@Rs y8>$@DNUgO n&(-1ZNP9U[e\pMyIR E$AANHThgq%wIW -03|V1Z$^#a?hJqt0} I #9->36; >ACFI%OR3[6e"~2  W$,/2DKM1Vqz}K& 3&).DLQ=WZ;`:g{l\vCL s 5[a]kecg__c" 0>G@Ic_c/Ac+O%zPUpmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniJIS2004-UTF32-V.bcmap000066400000000000000000000012511354442177200234110ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEUniJIS2004-UTF32-HC!bC U?dCM6S#t&+"' +B9S% G(C %%o/S %@uC &zwz!O 0/ ]C'C0KS 3JWVmC3  K? C31$1 ) ') q C3L    c%97=;A?j]`UXw ~6O c]H^[c0kg6 EPT\bhtw|~mc#^dIX MXmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniJIS2004-UTF8-H.bcmap000066400000000000000000001214631354442177200233260ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE??? @\a A Q¤k]>d_?V3A´MT+ 2!+FVS LIQĀ tA ~$c Q Ėn$cUP &%$)AĤ) f7![ QĮs"'A"} ";96"BQŀj; |,"m  Q/Ő' j>"kOL iOfO>_c 0 m("[<SAƒiPn QǍ2j AǵkyQ ɐX""O( zA ɞW-*'0#rQ ɬ6B''$cbA ɸ1TIA67ZQ ʈ94 M-|3)FAʻbI>Mc=:B@; J<@A+ʔJ #"k lI)@ ]VI bp# 8%  #  c'`p I A ΆK Y B[ g" 8F.q.J N MyEu~:E cr/qR⼣&? CZccTc{i7&&So(R@⽀'4uw$nBS^n}Ha$/7R4 t- .YO@4<{0PS_(VKpAX]X`-tGW-e"NOR@⾀Se?Kj8]/8GUF ah(.\z($X[op%t:+T}Ra G6]C3!Y"o5n R⿀m <7JarC8wzB ⿓~o_H +<w*s`B〰: aaB〼BcR ㈳O p}$ B㉀Vlyn OR㊐g  D5,=2 ^B㌀pB㊩ZB㊢{R ㌃jr[Z B一0+B2㌔"   *? F#F?#,y`P'>M;:J =PKA&wPy{B㌗x   B 5[ f B㐂$&bySvmhN  M`( rn$"cB㐅l#ng xox-jyB'㐆Z%},g0"kzDpkH w(\ paP u5>u$LK&& B.I iGt\c]Qr~ K4#c \ O8 9L P" Z[A\8~F riue" $p9g@Z  ^gv"Z _^ lH fSwJd(W*VW xCnV !4 Us< u&1?R 侈%k! WVroB侖.3 $[q/B5lCB侚wR 倖*6mO ~z yR倡Bzidv IT;(B+倶^NIyXqA(t'FBeO?nR E$qC )G>@/.B偀? )cp12B2倰E tu5{$yxy5{&'&}I|76-05}01(;:B) o 19lR 僡 4Lk+R 僭_JRTjI B價bDEh qtED9 :B儲vB僺+D- 8EF )(C(R兀qs!1hd;^C:d?PxgB兒r9 B?A)h.7Zm[ MC`sB兤JB兓;IF_T_ W>HDSR 冉~#P367#"B 冗Q3+D{vsgfot1jDFYX/[~+*5Rp32B冝K]a`B冘 1`Bj.-<='PgR 凰pQusLEzBT函5FA} =}A jC:yxQP)?I.-GB;Q$` ]`9(y7>aR38C&x}r3UUp{$7jFPYBZoYnO$ih/0B刕Na~` XPYGB1刅o #N 1 H$g  Z'+P'C*+HNMN#IP ON F$!zg Z}R勛R)hva`o*=3nA@B勲|{1tAKb B匀SB 勬a HBg#GB,EDR 匕M!xVuB0 KsSB 匣OA@{moZ@x B匤UB 匥iKTU)|UQC&R 卅Vm  B 卑p9r]J/h.< B卡!B卙q#J%R 卬"JW+^X;^B卷`SNFIHU pKJyxAFnP]8UN{B叺rF?R 合y/0i/^E``B&君lC8C< b*t ;A:W}]Vt /B'  BvB 吞 4 O M0  B吚"^_Q#]\ GATR 咈%XmyYB咕H7%p7CR 咤tz@ 65B咱R 咷L}B8 =82BV哀i$0  5@=LmnFJo5}:A+27.m=*  A zo t Of O`Mc~&%M4p i MPG1W ~owh YB哨 ^g)_B'哃N98UE @DG\]FConKHqxI}| ]ih) B1哊on o nonFo jkjKqpYtOursr u Nrspqr sjEklm liR 嘯U8PDCXY\[TB噎L kvSV 1#B堯2,k|>B2堃ayx ~ vo~ ~I}f ]p| |@}|atze `Ez#R 壐hyz_zvB7壜1)t|:)_PG|G32kj-1: o|qR#PY6]\EPc^cdxOT[B夋iB壝y[ |"|/./w$%$;8C =<1R 奧MyzYJwB[ Br女&t3C2u4T|8izOaE"3.GsA|$u X] o BA_r/2OJ tC#!D =< ;Rg* BKL =V _   GJ #$A ABwa_H9t! ]\NOB妤nnlB姊q  Wmlc _l_ S4?>B;她j?N%`?<?F'&896T376w=:I;:DKJQS aB)奲 PI*H  W T!J-C R宀HGHIJ[e[h*{R 宓Cl5*}p>,bB4実nDORz5WC;BGt:eJOBWMoX+D)(GB/}LA//L}1k'sutSZIR2ebi@/PCBk`o`wE9J [dR   ;2 wG>F[_:KFOJI _h sr awr  '>edKuH8  onK5KB寀qr >{PzqZbB尔*? rNO No\eB.宬wa E{zu M Su  M%&P-0 52V56B宷y_~  boc2[$DB寬NB+宭= D W d I bcH J W R 巠coXYePB/巫m W^ysjx7C.Tq4mh[= oOB" qbGBa` !>UB巷B巸 TS@|$'"|UML-Jz y)NTM vRR 幷)$/7C$B%庁?2231 TgngCg`o^JU&nKLgl B庖p B庀 N }-*zU'&H'KBUQ(zR 延t 0{2WB开VWVwR 弆-,UML+`&B 弓wFYist}R 弡dF^$h%B5弭$ 3^5z3BB~wz 1;XOtd)ii@-`F76-Rhe}DGB弴P!! B"弮 -=<Bf@+* C@A( ! H ubJ#2k44!R 徧>!f}9edB徳-L*F FWPH; J?6|c?:mvN B德5`4B徵8K3 5,549J* R 怒Vp*'zsCB4怠5&#4 +2SJ F78g0>!&#oA>o: (~I I2k^!pB恝gB怟&;(J )B  EBD-,)(R 悢7 8R{f^_R 悰O"Y"ZB悼c&G?> z B惕 B悻!C.1'"R 惘zR/Ef5c4GB惧gKF>SF_^D #& m]D%"BB惲 U%$B惥@7)\=D<?>;z>;%$8ADCB?FR 慄j;I}/elB 慓!QLiqRB慞(utB慬LR 慮6\q vnB5慾GCeSP Qia  7ADz5. yz in=P@ wY*B憘zB%慻*'&KLw 2BO)vE3vE rE4pqF~YVWVSKRa /R 戚p,89#Z9:$B?戦lon+mV@mG IA3$SM) (3<y@ r=,wn/xTKm~5rQ{*| Dsd B 戩^ C_D n=~q|  = 4cXqC> 8 }t JEV C:q7ElM/ Dcn  v1:EA@MPAB:sE#  ?@/V#4(w\|NE&m`E!107"HH h9&2i C^5.uxOPO8A]Hn{eZF;6 Pe,B揃'1V^O|, gbfc]b#"k~q B揑s 1 NQ`q N=@HmY|  B,掽b_ bkjqpI dw x O   QII $GB揪Jg R [yjZq IB摯(w0B-揁 V%Za K#K H  Zbt R昜k6owY<+(W}RkeN+SOl!RB昴j*/>A5GDaZ_BB昳v J.'W~B昷LF R 晝q63VyB-晩iRg,CcTF#pcZ  {fqdQR^2 B ! %21@B晳"e B 晪Q SL@} 54  (T=Df7z[ZEDEDR 曷'Pm [pB-最7&$=<YnhwSK3Zm5/B}N.I6A9J1-&#"P$B朎(34B朁_ i 76fDa`SO 'R 杬i;HM,yx`;B 杼$}bE"9$ gB杻D2k jYB构j R 枕 #LT1Zo>B枠nt]x! R 枯089][: B柁(PNKF% mF#HP6B枻+DB 枾{Ch~~)&|R 柮6hoe%$B;査*d}BnoT}1v_gFYbU]di,B~ 5 *gj{xX>9j5I ^?& !A}u%& [,EB柺J'~N {!B.柹JD%z~ih~}50~}xEyvwr3@C454wEA& uVOh96R 梭Kvo6Q)B 梹Q[G]p=CNB棈/B梻GR 棏0v654O |gB 棟i IZ-&eExDB棨.B棪 A@]pR椃 sd] h2qtdt=B#椙@^C 8+& 5|,J (}hwrqtKLuB楢X2B椖%$%F&_;=$p"a'HR 楷uf`=~B榁c )*1,8=$ A,L )?n i lB     knd{d:-g2,W '+I: uN  i@j=8    ojE/0 {~ "Hcbadyz1S Hl)DBGHB榊 z^nhh#$" yHz$ \B榀;wv r[ ZJ  FXUg  qP{zB+榒)? > CEDI LQPRUZIPg hijH  M   Z B榨u X  }RJO7B榍LwrVW# E V R 歟bnomVpQnB歩2nOrn@E=! .B 歬cF B歫?TR 殬I[oHGDB4殷uu@@Ary2o2(4 T#3~XA ! <XE^vmlQ^'B毖=(\GB/殽jM1q  #` ;'puB&LutONO+^ kpk&>NsrA@uy( "A3yjuwR 沁 ^)M4/P*yqtCF ?@f =R{tnWG4FM aTBARBE +B渲&) KYhv {[^rK wMBrD}B 渻wV d DR 滇C8eX B#滑H8 3% p )41A0E.e8 e)  A c @CB滙8 )" mLlq pf[XY\UB 漄  SR 潗AoLUSj!SB=潤k 8XSa|N >.kB ~w ~s:W |KCAV ;M>g) Z h|% \A OhQ[ x CQuZ |KGFW}#m _{H" %Bi潦DMC   H  AB+2B  Muvn R  Ko    W  J  #M  @B澈Q,_N^  U5)0o#H %WHX  {XJ9 h o[pg<M B'潽 M%$cWB!`jXX nWmi HB潾3MJ%]&ny b\2IB.潨Cg j C HOXV"` avj,HB澇3Uh0-I_iT,bHB+潬V T"YL ~J! H q @ Z UR 牗+dPdQZ}'JJBE牧 ?~ BXY ~K[ (I@g  _ p`]V 1\DnN8EQ~Y= v $O?j* YDeN E!cE_ ZqOv,Q ^iHa .8BW牴k B   I P  XwD 4+L A  L)(b JB犱a eK QuwdxaB9犍;K%$3lK(F`a ONR HI F@= JN HWB犛I h{Z x_5WB6牸NP &L TO EFl c ZB牨HLTUMj  |oU>#B/牫AW oN`F X @`] I R甞J]V*-]>k/0B 田><Z ~EHGB甯rB甶E@!dR 畆S^gX=d'&B畔^JR 留y4q!*H OB 畤VE#fWZDER 畯u-hk~dm-(D.BF畿@B@'U[jeVQLCtk|?g"OND   Fwz[Vad +sczB疁~#oc bF   MwvB:疅 cbSRc \{c@  P!@= B74EonsC832Iih i.G+ BR 皀O7o`! Be皐w C; `^P x]B <2NpgYC m\HCZgfpa&{*N'T= R#aG] Gy6N1d{PY6;=#FL0DAQ +c8gI{^X1c`2WpO TIE$YK:;x}@W STmBh皋M %&H]  K G  O d.I F   I  =:S  @* + U B皛y=N>o/{luP 4_B硏B睪U~B'盅we W{ Q [ !ui u G NB皝^ W X E b*~OQ2N B2皕  Ynb#]I Z"_ YQ d  b  MB0皭r[F  FWJd!YU xBnXBB皟a O D}M"U ` k G  FNM _R 秝gWk@)()GB秩f; -DD$YX'v SB秪&STPE%$8C >B秱kJR 稷 \ >tB穀b \e$XFnC?B 穃! tHuB穄+AHSRK  @ENA)3Z)>R 窐Z>5gB 窟x niwtjGJB窠QB窞{ A&#"#R 竃T@B=|^O B 竑 n#-R 童d .61JdwB端zQ07y7B XN#B笇W B 竱;:\Ij I |R 笥 jh9UvB笳JKKVoMB笱Z TBC 'B笰 @R 筋R'k0NSvB箆B 筝i! P&B筠](+TULM&jo D8+-R箔)2 . $) XW"_B箪{Tap^G5LB箯bB 箥30+*+.DR 範c0tRyF%BN篏n Z.-<H  zq{r uv@#& /.yxK!-05#EB''*s6BA;fB篗cq Z  CBB*篔 hifBizlmlm @CUq nut|C+Sw tunIgfeB篛f  QI) SR 糒&HHC3z,B糜'E/+12utCAVcK(B糝vHI JMB糩1R紏2'KkI0cTHB素IL*nR 紪6z= 3_B紵95X+R 絀&Q.R X1B 絋5,tSt/{r kYTK9Vh1Hx B絍N  T5! T WXB>{zZ>A<BB絑8 ER綪6OS PsbE2TM{B!綽N(GluX#P?*yk`  k;kr/*Ed2  B緀8I ; a9iNhifB緢G E R 縛12ZPY Bi縦N{  53BN  w<St8Q|OjBmbTI )J QTdz4MHL!GH! b_?6?C6K-x dc[B繇ON Yk o-N B%縧B[Z,M1)0101B0+ &%D" @    U B縭L No)\ f CR 耀>9IB+聹QihD9Q$O4;@xzZI$TuiTlHYzG'N  8B聻jL  ~~ ~L/. /.B肁p7NR胭t!5F }B$脂7n~elOTevk,;%FT h . s vF qAj>8B+脉dG  r@m  A  FB 脖254Ft/Z)IB=脃y~ ~z{Gz ?DC8jkM{z}t MELzK@ uONvuvup }@poR 與MrX\&M0eB舒 R 舖c-xpQ \]WB舡=0veyxR 舲>76-q\wNB 艇*^I7T9 DMYB 艀$ NBB%舼Ftm501$%$qUVwvj WcDiCVYI ^9fsR 芩+R?k~u(-,R 芷E%?0kj 6JB 苅_ Rkp$e^B苆GJB苐 R 苞ELShiP+W tB苫)m E(yJUT=B;ZxB 苪SMAL B苭%sR茫T,ut3HU>ES'hBB荀OJ B茼9Fa`B茽/DR 荏cZpK,UAB荷YWB 荢mpE ;4B 荚zh /QB~UR 莘ON?PlmmB7莢[O@*C_2wh*!@bINkV!^ 0fWE7>!3<# +6Y\%MH\*=dyZB莧5K@`i +*DKMf!Pml"B 莦9 ipUR 葟;EP)g?$R 葩d5BM葵n$AG4  CW, -]}Z=2A sr/mv;>,sW( @Y f ~SZ;~TA#wrShiPitrCJawTv_ AB0葳=MzD3 B54CBAz NC PG JKGQun H J KTAB葴JTv%O P R 薄,terqpEB薗PB薐:B薏a(bcbER 薤-zw,{ rF?BN薹>F 9: C& @%'"C?@rm W 6M ;J d/LON)NHb =R  M56C'  3,Yt  AB薷bV%G]Hh KOJ!B.薼|Jknsrs@ronmlstC/` 5BC xO'G(%  B"薴mI \_ Q" # E R 蜂X^"smlm|B 蜘>lY(dM ,T~&B-蜍r   L ,7  I B   HBQ蜎#noano\ alZih] cAbhkb UlJ3=tvhcb]t}|d[xzAy\ed_^_^ihcba`] bonAk*#f=+R 蠍 |q,kCB蠟=  DUVg)z)B蠜B蠘<x}| mnojkjmDjkjR衕Cwch9&! b.x?HB-表/x/Hjb SZyI d dW tW a;H\S F LA<q;3dz d+^={vYuDUBL衫3 B    T  .7E$ E ^uD@  JB袘 [ j  |D[Z OGFyB,衩OjipC h[r dQe$h a`iyFx`a` Le ` a`a`XcB$衱GDcUK O ` R 討|H=T CNAW!B訛R 訝, edAb]\B訪Z/g`kB訶@[EgB 訯yA#jI#R 詐.fPbuXIIB4詛 ! 6Gn80#VJ9E :[>rg6>rudu-4i! ~9B%K/y`&B詝dj kjoFn KJM|NMOPsrOB詜Z GR 諚3 sB諤#+JU~IA0o-,\TMB諴&B 諬chiS:E7LQ87LR 謙` .2ikaBD謦5dm7< iyR]yQT. tMB,賍} :JI rqbJc CP LB8賒v7Q 54 B96  U   '&S FG`&'b G  ECDEDM Q^0= <9}B賏<  eB  C  `!R 蹇 DAVYB蹟|XB蹕*  DB蹔1V?>^a7ZMD#"GF]\R 躩GUVB+E*B 車q|0 J!1aE4 PUB躾>A`aj kF B躳H\iD]E\ C@ "GTE f#E jO&S|R 輥!(O:HW~uR 輳SJ+/X]#B?輾X[BV[^Ay&$]^ML c`JwLBC*S7j#8}|!"A\1BK \G&B轀?LON_^Q R? jL]^ uN utFu0c$B 轁{ wA R 逓dJNV_i BI逝fN  ;IzJO` beu Z@=YoVz TDm "SD/ *H[xh-6i`Y,K8?E#& j1+0NB0M84MC<;T2uBF逞v*# TGJ ZrODeB-jHe>G]>? >uIW` a NZ[daNB逬VW bbJi  B 逭~i H'dNB9逯0?IZY:=<K=<=:=898E965 (/I$% !] JDB逿baf b F  ER 釖8G.m c^B釣| e-%"KB釡:F    @zB釬}t67   Ba,b  i/ &R 鉂0'_tmB:鉎L}~ u{\  G A5f*wB wz G NUuz +{Qs=:/_bB3eKNB鉏zONNdKJB4鉍M Izw@v{ H)vR錜oB?r )#nL$GtB錯hxXIe9eB 錮[ H zB錳W454O_m6'9^9o&R 鍩xc6AE$+~B鍾IMe .E b_v"nUX%H:FWhB7鍼eW * H }I hehe rJ_ VWFL SjUA,-B6鍳% 5Bede ED + $E#HI YA  Y d#NOD @G$YILMJ# LMLLLB"鍴zO ] I  ET9ER 閟}'Cx2wxB?閭ADD5.IHv 7BUK@), <Dq41cLABup;h%f>G)}R$kTB&閫Y  ~FKJt`"SRONC)()VPAUT10B 閺&^~Z RR 隔4rs`CzHB)隠E6DsnZU+BCAo(g|-8O]&IIyrKHK$A|+D1B隤"|}0STcfi tuB隟8cR 霂)&QPQ $iB;霍R C5v54!B="F!45~ED6]$qr!KlD`gW E36WB$霔\BCFGJ}lqono,?okj*UE>1p>1 0r= HIB B 霚?l "D R 韆JNP< B 韓=kdA: A|`B韜B韐RKHIyjTA.9H 9yDIM61R 頌 LyY?e~B?頗B&Kk% OK$\10rC3G h5Q 6qK>1PmY/P[TO/eVs)fN-^- .i $iK8 $DDCwj^pB飜9? (Bs頡 HGHJc bKuL"\N]$%xy  S J<T E  je A L#/ C0 'J P pqlMk lmB頹3f7k {NB頞8Z HZ Wx ]"IB顖*pj} k$p]B\頖u(X+&%JNK{xyx {A:;jiMbe` aO`a^_L  WFKHI AGJFE D EBW BL頙YN]PM] \Q  H@ T ER 鮦P]H;6OO B鯉%<  }WbB鮱c\Dc P Q MH3    B%鮰2?LMLM:A!s/b3x-def ](~)B$A.)8R 鰡4^M+*;qB+鰭; ]iL"l f &`QP%Y ' k`Mj Kb]$}bI]}kdS W)_k2dt-D}|8 MIBb鰮0F?+,G zun R  A R[fYT_L  )2E `e [2/ CxdeS B鰶nJ JixhN#Q `Vy#xB 鱥A]w C&_B?鰱g !L !  k Xxo nLmhedHaIL NMHIDF Ea@  EB>B&鰽CE {b H][ OpR R 鼎\`auxc_,R福\Y"6 B館~R侮F-8 _N?$Cd5&oDR懲P_",aw~e?nA5Z9:PL}/R艹wI3"P!lGjK[~8B! 5qpq2 FwS?@ B!*Mz B ︐Lg @DBffC 𡨚u#Qh;>XL)"s=rZC🄀}C🈂i4LC眞-C𠤎SCB𠀋~%HqAQR{[Ez^ClNt10 ore?*W3 Ob3` NYOD'/K V_[ *%)Q2).Zd tZ >R28 tCf>eh d,I/F^@ !WeX$ h}zC𢘉S4+{;I /oC𠂉Q n,O7 P~ xw 2~ `u g$g a,  [  ]WXM(ho,Q{:)EfWY hi2 \B9.g c(Mv|.BL-0,|"]    e~2uyo53RM("Ycld Z&@ (q %NWl7}(l{ {d$v4fwB(r`~  cxm!_i vtq ww O6 X|m g \ zxw  P  &U{;"^ mys*wi< ib%$a¡e!A$*;AGXAs @#* K@UaǸsh |knva΄]L!T\Zt _j lwb†DnUamy={Vig!*Uy *$k>J@  @6< Bp" F0G@fIb享`9b忘hbKⅠ ! jHv!rnr @~ 0J?7@ w!7EM& 5 ?\^F M :n!0~ yoB_ &=\_4 1Vx 8cXve&wj X%7 Ervwo*{Y'7n@k[fu^k!/(~~|u}J l,~l~U mB(M^Z 0BLQ`hps}{}>dpogjp\3dQ >T\*{ u`d n!%j9<P{]$v>AuK\gum  o [/> txE'- 1^U~rYW KFIYp|kJMr_#hrHt$\_pT~m3"DB=Rsihm1EJbPx"~zk*0R7;>~FH`i km~{~]p T{so{%I%(j{eOT[a]keBg_b⁴"F ( db⅖9b Ⓐ c@mI k r` ]hvP.-b↖,*YipxBnaLKb q| C#(*3]cb﹅_b者%b⺌ bNḾqeLprmivauDX)\O^;qAw=!GyKU^lt T#(,\2tSmj:|[ #~0d?xH O mztt"8m@HKyZ_Sm  y (q2y<TKr}x g0o| qfh)0Ovm\}(1[<ELrSY|^kTb⁇'8 }@ ( _Qi :vIOZEFu lwb≤kk =xElY~&P_ksz+H.JT9#bM!RF ,gk-0":Ih_=e|RVbp' qHd K^Yq*R yRm  x5?T'T[Z+Hko~X'),.lK <u_Dh Rr M~V`dzp dg}2lcD ib@B$vXOGSV~igtt ))^2 ?{NPs]g{nujL.q4 BsFqLn*] *a8hbbp{y$ }Pggb5t@k Hlixns d"N'L N``nl?twhBJE%RTeb<乴WUh.xB{0 ]p k%~. 13gNUnjmZu } ] !{)j36BYE!Jamqo|!M" 8;?fFQ{\ldhUx z^+q;=pOQ{W Y__n&rui$](1/v?AQDVe[8nqj T((+ .U1o6DFJIL!R~Y81CXHRjq|Qp"),k@sx~$H@DUg Mn&(m1N\PyUepMy  E$ANThgq%w W -0O3|V1Zd^cah qtp}   cy-~36Y; >ACFIeORs[veb~2M $,/[2DKM1Vqz}K&P 3&[).L^Q}WZ{`zg{lvP  c 🄐@ %A@ Q%zPU0manuskript-0.10.0/libs/pdf.js/web/cmaps/UniJIS2004-UTF8-V.bcmap000066400000000000000000000012521354442177200233350ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEUniJIS2004-UTF8-HA°MB←bB ‐UdB′QP6R⎛t&+"' +B9R┌G(B ┥o/R ╀uB ☜zwzaO_ 0/Y ]CB✂B゠KR ㌃JWVmB㌔  R ?[ B㌕1$1 F) ')Lq B㌗L   B b─97=;A?j]`UXwI~vO c]HQ[b〘kg6 EPT\bhtCw|~mb⎰^dI MXmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniJISPro-UCS2-HW-V.bcmap000066400000000000000000000013011354442177200240050ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE UniJIS-UCS2-Ha ;g!$&# M_UTW A!bA %Z n6Y;m2A!6a%97=;A?Q% G(q%#jomlnqpr[]\`SUTXa%=wQ %@ua%I~a &_O cN]a'A0Vz!O 0/a0S6Q 3JWVmq3E LNP!T WY \$q 3-_b&eh npqjrtsw%{|~ a3{ [A m A L AEmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniJISPro-UCS2-V.bcmap000066400000000000000000000012611354442177200234760ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE UniJIS-UCS2-HaM_UTW A!bA %Z n6Y;m2A!6a%97=;A?Q% G(q%#jomlnqpr[]\`SUTXa%=wQ %@ua%I~a &_O cN]a'A0Vz!O 0/a0S6Q 3JWVmq3E LNP!T WY \$q 3-_b&eh npqjrtsw%{|~ a3{ [A m A L AEmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniJISPro-UTF8-V.bcmap000066400000000000000000000013261354442177200235120ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE UniJIS-UTF8-Ha°Mb‐UTW B←bB‥Z nP6Y{mrB↕6b─97=;A?R┌G(r┣jomlnqpr[]\`SUTXb┽wR ╀ub╉~b ☜_O cN]b✂B〜VzaO_ 0/YbヵSC6R ㌃JWVmr㌎E LNP!T WY \$r㌭_b&eh npqjrtr㍀vsw%{|~ b㍻ H[B =m[ B,L B:Emanuskript-0.10.0/libs/pdf.js/web/cmaps/UniJISX0213-UTF32-H.bcmap000066400000000000000000001171051354442177200235310ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE#C\a !GS k]>2&?V3C>S 2!+ S tA ~$c S n$cUP &%$)C$) f7![ S .s"'A"} ";96"B; |,"m  S/P' j>"kOL iOfO>_c 0 m("[<SCiP. S2j Ck9S PX""O( zC ^W-*'0#rS l6B''$cbC x1TI67ZS 94 M-|3)FCXb >M#=:B@; J:E1=;+ =Ngf UJ )^-IR   QL5? X55@T K9G$ +CUptmZ$;M v3\7V=/jU_(AKv9y.@7 #C.eC.:CK  _!W:rS/0i ww85Rt {v\S /Sh> cr/qS/#&? CZccTc{i7&&So(_4uw$nBS^n}Ha$/7R4 w> .YO@4<{0PS_(VKpAX]X`-tGW-e"NOxe?Kj8]/8GUF ah(.\z($X[op%t:+T}Ra G6]C3!Y"o5n S/N <7JarC8wzC /Ӟ~/_H +<Dw*3`C00: aaC0M;:J =KA&wPy{C3x    5 & C4$&b9S6mhN T  `( 2n$Q@"QcC4lR#.g O8oxmjH9C'4Z%=,'0"kzpkH 7( pa 55F>5$LK&& . ? iGT4\#]r> K4## P\ 8 9 P" ZA8>F 2i5%" $09g  B^g6" \_ ,HBP &7J$(*V 8Cn !4 3< 5&Y1<& C$`j0Q_ \(pDG$% f@zy6d $.~.BdCD&r } v%Qo 3S N*9!#}DR1UCVNL^iO2wli@m32M(7X/uve R\gfN z3 iZj9{: ~WdQ }xXSwhN I@GF5Kr#yC NZ  a ed$ "  CN)Uxy  tuT"yx wnS N݅gN/F7CN9zPA,CN끆bFGCN聤]S NZ4dlmgpSS Oa 4?S O%k! WVroCO.3 $[q/5lCCOwS P*6mO ~z ySP!Bzidof IT;(C,P6^N yXqA(t'FeO?nR E$q)~G>@/.CP@? )#CC2P0 tu5{$yxy5{&'&} |76-05}01(;:) o 19lS P၇ 4Lk+S P_JRTjI CPbEh qtED9UCQ CP+8  )(C(SQA8!1hd;^C:d?)rgCQRr9 B?A)h.7Zm[ M`sCQdJCQS;IF_T_ W>HSS Q~#P367#"C!QQ3+Dwvsgfot1jDYX/[~+*5Rp32CQK a`CQ 1`j.-<='PgS QpQusLEzCTQ5F} =}A jC:yxQP)?I.-B;Q$` ]`9(y7>aR38&x}r3UUp{$7jFPYZoYnO$ih/0CRNGa>` XYGC1Ro #N 1 $g  Z'+P'C*+NMN#IP ON $!zg Z}SRR)hva`o*=3nA@CR|{1tKb CSSC R쁥a HBg#B,EDS SM!xVuB0 KsSCS#OA@CS$UCS%iKTU)S S8S{mo UQxTKS SEVm  C SQp9r]J/h.< CSa!CSYq#J%S Sl"JW+^X;^C#Sw`SN{|IHU pHJyxAnP{c8UN{<&CSWCSy '(RILYU**UT-~WV( V{7SSYJ'L]ZEq5 6##wPHWE#p71R>CSr?S Ty/0i/^E``C&TlC8C< b*t ;:W}]Vt /B'  vC T 4 O  0  CT"^_#]\ GTS T%XmyYCTH7%p7CS Ttz <65CTSTL}B8 =82$0p{C%TǢ 5@=L+mnJo5}:+27.m=* CT^^C'T2DETn oonoE\aJK^j  ONspQ6qS U{4HSZglnKC)U<zo t Of O`Mc~& 4p i MP1W ~owh YCU_C,U:Zrsr u  s}| jkibmz% S V/U8XCX/21(<>C2Xayx ~ vo~ ~ }f ]p| |}|atze `z#S Xhyz_zvC7Xܣ1)t|:)_PG|32kj-1: o|qR#PY6]\Pc^cdxOT[CY iGCX݁y""|/./w$%$;8 =<1S YgMyzYJwB[ CsYs&t32u4T|8izOaE"3.sA|$u X] o B_r/2OJg% t#!D =< ;g* KL =V    GJ #$ ABwa_H9t! ]\NOCYnCYq  ml# , 4?>C;Yyj?%`?<?'&8963767=: ;:KJ aC)Yr  *   ! -IS[HGHIJ[e[h*{S [Cl5*}p>,bC[nDORz5WCC[w C[= S [S:"gGt:C![ɤeJOBWMoX+D)(GB/}L//L}1k'sutSZIR2ebi/PCBk`o`snwEh#J [d   ;2 wG>[_:KFOJ  _h sr !wr  '>ed uH8  on 5KC [sEUC] }|)C] P}|U - z y&TM vRS ^w)$/7C$)C&^?2231 -gngCg`o^ U&nKL9/l C^0r d_C^N}zU'&'xU'zS^t 5j2WWVwS _-,UML+`&C _wFYist}S _!dF^$h%C_-$ 3^5z3B~wz 1;XOtd)iiC_4!! C_. -=<Bf+* C@A( ! H S _|tLb1-`F76C_9-Rhe}FGC_<" #"!C_S _>!f}9edC_-L*whFWPH; J?6|c?:mv C_&C_8 3 5,549 * S `Vp*'zsCC5` 5&#4 +2SJ 78g0>!!F#oA>o: (~  I2k^!pC`]'C`&;(  )(  ED-,))S `7 8R{f^_S `O"Y"ZC`c&?> z C` C`!.1'"S `إzR/Ef5c4GC`gKF>SF_^ #& k]D%"C` C`偨@7)\=<?>;z>;%$8ADCB?S aDj;I}/elC aS!QLiqRCa^(utCalLS an6\q vnC5a~GeSP Qia  7Az5. yz in=P wY*CazC%a{*'& Lw 2BO)vE3vE r4pqF~YVWVS Ra /S bp,89#Z9:$C?b&lon+mVm4w IA3$SM) (3<y r=,wn/xTKm~5rQ{*| sd C b)^ C_ .=>q|  = 4cXq> 8 }t)V C:q7ElMFP/ cn   "v1:E@MPAB:s#  ?@/V#4(w\|E&m`E!107"H@ h9&2i ^5.uxOPO8A]Hn{eZ;6 Pe,C cO<, <0S+~1 Ccs 1 N`1 N=@-<  Cc偃lJ XsC&c"+* 5   ' $CcꁗJ'  9*1 C-c %!  #    "4 Sfk6owY<+(W}RkeN+SOl!RCf4j*/>5GDaZ_BCf3v .'W~Cf7L S f]q63V=C-fiiRg,CcT#pcZ  {fqdQR^2  ! %21@Cfs"% C fjQ SL} 54  ()?f7z[ZEDEDS f'Pm [pNC.gK$=<YnhwSK3Zm5/B}N.I69J1'"-&#"P$Cg(WCg i 76fa`SOS gli;HM,yx`;C g|$}b"9$ gCg{2k jYCgj S g #LT1Zo>Cgnt]x! S g089][: Cg(PNKF% mF#HP6Cg+C g{h~~)&|S g6hoe%$Cg*d}noT}1v_gFYbU]dCg 'CgJ%z~ih~}50~}S h;~-,~x{ 5  C"hH j{xX>9j5I ^?& !}u%&}~ [,EChR,;!ChIvwr3@C454wA& uh96S hKvo6Q)C hQ[]p=CNCh/ChS h0v654O |gC hߘi IZ-&exDCh.Chꁪ A@]pSi sd] h2qtdt=C@i@c  e }S  L\'$=K1.//c(} ?!Y B /nd g2 V +6 } WNK UD\3 B JS Hel) YLuCqip+& 7,    8=$         & 18       oj/0    ad C ih2/.M$ cC i55 sv 2[ Z   XU'J 1C2iB 4;4 ? > EDI LQPUZ g hij      Ci" B5 X  =HR O7Ci 72#   S k_bnomVpQnCki2nOrtE=! .C klc Ckk?S kI[oHGDC5kuu@Ary2o2(4 #3~X ! <XE^vmlQK('Ck=hC/kj 1q  #` ;'pu&LutONO+^ kpk&>srA@uy( "A3yjuwS l ^)M4/P2qtCF ?f =R{tnWG4{t aTyz +Cn9LbC"n2&) &hv {[r % MB$+*)S nC8eX C#nыH8 3% p )410E.e8 e+   c @CCn8 )" m lq pf[XY\C o  S oWAoLUSj!SCHodk 8Xa| >.kB ~%T)sM +j_:Wt CAV ; >g)  h|%  (M  OhQ@ C x CuZ |KGF}#m _DA" CgofDM     AB+2   uv.    /         #  CoQ,?_^  \%WHX  {+|<}'<C(o} %$#?! *  nm) Co~3  %]&.?9 "2 PC.ohC' *  "  !6*,Co3U(0M1lA"#C(ol "  >E !  1   S rW+<dQZ}'JJCErg ?~ XY ~ [ (I@g  _ p`V 1\nN8E~Y= v $?j* YeN E!#E_ Zqv,Q iHu.8CWrtk       7 4+     )("  Cra eRE  5w$xaC8r; %$3,(`a ON HI @=   WCrI (; 85C6rx &  , # CrhH D *  </C/rkA /   @   SuJ]V*-]^dk/0C u0><Z ~EHCu/rCu6E!dS uFS^gX=d'&CuT^JS uYy4q!*H OC udVE#fWZDES uou-hk~dm-(D.CGu@@'U[jeVQPtk|?g"ON   wz[Vad +sczCBu~ 23B 54   KD)(I(!+H CDEP]\SBoUBsYBihEwP h+Z[C u WS vO7o`! CHvw ; `^P x] <2NpgY m\H>I{Z'fpa&{*'T= R#aG Gy61d{PY6;=#L0DA CVv  %&       $.        =:C vy=>o>p,5C v7%  ;  :!5) 5Cv^  `Kb*>OC'v  ."#?  "  C)vr   E$! 8C4v!  = "   +   S y:THy@Cc$C1yGZ3^XJ{r[`t?WpO T$*$Yk:(ih[\ y}W:;ST6%CyE;v NOJK TK ~|FG~DEm nCyDY  S y݁gWk@)()mGCyf; -D$YIv SCyꁙ&SPE%$8C >Cyk S z7 \ >tVCzB6T?@] b  stQPyCzEK C zD+7H K@E S z}*1d)?2ZCz+Z>S zZ>5gC zx niwtjGJCzQCz{ A&#"#S zËT@B=^O C z n#-S zd .61JdwCzzQ07y7  XN#CzcC\5 VWCz #S {% jh9UvC{3JK VoMC{1Z TB 'C{0S {KR'k0NSvC{]i!  g C {`](+LM&| -C{j S{)2 . $) XW"_C{{5(pogLC{bC {30+*+.S {Ěc0byF%CQ{Ϯn Z.-<  zq{r uv#& /.yxKQp(!-05#EB''*s6B;fC{c1   C@BC'{ԁ hifizlmlmlq nut w tun gfeC{ہ&   ) S |ү&HHC3z,C|ܯ'E/+12utCVcK(C|vHI J C|遭1S}2'KkI0cTHC} IL*nS }*6z= 3_C}595XS }?8ZQ.R X1C }K5,tSt/{r kYT 9Vh1Hx C}MN  T5! T WX>{zZ>A<BC}Q8 S}6OS PsbE2TM{C!}N(luX#P?*yk`  k;kr/*d2  C}8I ; a9ihifC}G  S ~12ZPY Ci~&N{  53N  w<St8Q|OjmbTI )  QTdz4ML!GH! b_?6?6K-x +1Z[C~GON + /- C#~'B[Z, 1)01010+ &%"    C~-L /) & S >9IC+yQih9Q$O4;@xzZI$TuiTlYzG'N  8C{j  ~~ ~ /. /.Cp7S큙t!5F }C%7n~elOevk,;%F,3 h . s v qAj>8C+ d      C6y  GFz  ?FC8 tutwNLO@uONvup(p,C y   S MrX\&M0eC S c-xpQ \]WC!=0veyxS 2>76-q\wNC@$?@^<7@ {z9Ma#C<nm5016wv ^Wc\VYI Y C C   S +R?k~u(-,S E%?0kj 6JC ŋ_ Rkp$e^CGJCЁ S ޱELShiP+W tC)m (yJUT=B;ZQC ꁚSML C큮%3S+T,ut3HU>ES'hBC@OJ C<9a`C=/S OcZpK,UACwYWC bmp ;4C Zzh /Q~US ON?PlmmC7[O@*_2wh*!@bINkV!^ 0fW7>!3<# +6Y\%M\*=dy[C5Kdi +*KMf!ml"C 9 )0S _;EP)g?$S id5Cun$A4  CW, -]C s=Mz3 B54CtJS `Zb[=X C8ėr/mv;>,)^( Y 9f ~SZ;~ B#wrShiPitrCJawTv_ CӁ_z G JKGun H J KTĆR%  S ,terqpECPC:Ca(bcbES -zwy* rF?LCO> 9: C& q '"?@rm W 6 ;D{ d/LON)Hb =R  56C'  3,Yt*  Cb%GH( KJaC-| knsrsronmlst/` 5 x'(%  C"m   " #  S X*Vsmlm|C >,Y( _)d ,T>&C- r             +8CP#noano\ alZih] cbhkb Ul 3=tvhcb]t}|d[xzy\ed_^_^ihcba`] bonk*)f=+S  |q,kCC=  UVg)z)CC<x}| mnojkjmjkjSUCwch9&! b.x?HC/h/x/jb SZy d dW tW a;\SCc\F L<q;3dz d+={vuDU\CIk3       .7$  ^[   C  *  <[SZ GFC,iOji0 h[r de$h a`iyx`a` e ` a`a`cC$qG#     S |H=T CNAW!CS XedAb]\C*Z/g`k@YC6@ AC /y#jI#S P.fPbuXIIC5[ ! 6Gn8M#VJ9 :[>rg6>rudu-4i!LO9%K/y`&C]dj kjon KJM|NMLsrOC\ S ڴ3 sC#+JUH0o-,\[bC&C 쁚chiS:7LQ87LS ` .2ikaCF&57<heCDKN'"MFGFTUw h GJ%&onI["5 QPUX1n.SC+- 3 ~ 4J}z4 5~KJONO7|}KCzA@BIHG9HC0  (  S AE/RVgnC HD%5r ]^S u?a wXIRC"Ε*Jbkd (ut_<E 0CX.H) +>< )yR]yQ. 4MC+ʹ}   rqPb c   C8ҁv7Q 54 96 L     '& FG`&'b G  EDEDM Q^0= <9}Cρ<  e    !S G DAVYC_|CU*  CT1V?>^a7Z D#"GF]\S GUVB+E*C ʒq|0 J!1a4 PUC>`aj k CH\iD]\ C@ "GT f#E jO&S|S %!(O:HW~uS 3SJ+/X]#S >X[&vI7C9IZ[^A9&$]^ML c`kA,72S7Z8}|!"A\1K \G&CJ@N_^QKR? j ]^ uN utu0c$C O|7 S dJ#H]k CPfN/4  ;Z]JO` beujpW@=YoVz Tm "SD/ *[xh-6i`Y,/eWiE#& j1+0B0M84 C<;T2uC@v   Z[de-jH%>G>? >=  Z[daC,VC "" )  C -~i '$NC8/0? :=< =<=:=898965 (/ $% !  C?"!& "   S ֶ8G.m Kt^C| %-%"KC:    zC쁒}t67   a,b  i/ &S B0'_tmC:NL}~ u{\  G 5f*wB wz G Nuz +{Qs=:/_bS:KNCOzRON$KJC2MM  zw{ )vSoB?r )#nL$GtC/hxIe9eC .[  zC3W454_m6'9^9o&S ixc6AE$+~CudH e .T  "_6"nUh#c:FWhC5|e t } hehe r _ VWL S,-C5s% hede ED + $#HI YA  Y d#NO @G$YILM # LML LC"tz     yS }'Cx2wxC?AD5.IH6 7BUK), <Dq41cLABup;h%f>)}R$kTC&Y  ~KJ4`"SRON)()VPUT10C &> S 4rs *zHC)E6DsnZU+BAo(g|-8O]&IIyrKHK$A|+1C"|}0Scfi tuC8#S )&QPQ $iC= R C5v54!B="!45~ED6]$qr! mlG@W ~Z36&C"\BCFG }lqono,?o*E>1p>1 0I HI C ?, " S ƸJNP< C ӌ=kd: A|`CܸCЁRKHIyjTA.9H 9yD M61S LyY?e~CEB&Kk% K$\1@02C3G h5Q6q4ETCP.D>HY/P[T ^eVs)f-^- .)M$i 8 $NDCwjpCܰ9?B (Co! HGJc bK5 "   H     L#/A 0 '   pql k lmC93&7'BC8KZ Q8  " RCV*p*= +$0C<u!D (B  V   " C&< */ >A  CMYC ? L  S P]H;C*O Cɏ% $  }bCc\c   H3    C%2?LMLM:!s/b3x-def ](~)$A.)8S !4^M+*;qC-;hszU(> d.lONip E`Q 8aX1Fmf_ZSk6 l| fUzT_ S Z  )2MR `e |G](2/V ;:76;:xde 2dt-}6;D }MIC C6n   ?#  :C eA]7 &C?1g ! !  k xo n mheda L M]HIF E!@  E>C&=C {"  p S \`auxc_,C"6 S+0F-8 _N?$Cd5&oD _",aw~e?nA5Z9:PL}/S]wI3"P!lGjK[~8CCC 5qpq2 FwS? B!*MzCYNh\nY5#Qh;>^ )N"s=2ZCLCCi4LCD ~%HqAQR{e u_E:^Cltq0? or%?jW3JOGbE3 GNYODg/K V_[ *%)2).Ad tZ >28 tC&>eh $,I/^@ !W# `$ (}:C& St+;;I ooCQ n,Ew P>Lx7 2~ B 5I'$'I!,S  [  WX (holQ;z)fV (Ri2W B9E.gO c( _v<.TB -0,|"]    e~2u9/5sR D("Y#l$ Zf (1 %NlB7=(l{ K{$$64&wB(2 > L#8-a_iJv4qIw7 6 @Hk"K0!  $ -'3 \- ` #RaFE '^ > (6u +"h093@9 d&B Rv{2*9/C,Yb"X:[XMiB( *Y8]mYh QS,6AI|tggf8I* , F }0R >xc ;>%e !$*;AGX0nFpcs F#*KPna*Uy *$+RJ U cN 9cK!` ! jHvarn2~ 0JK7!7E & 5L?X^ M :!0>`y/B &H=\_4 1Vx C8cX6e<p(w* %_7JE2v7o*_{'7.@+[ZfCu^+!/(~~|u=J l,h<l^~I-B(M^ZL0RBLQ\`Sh0s=;=>Tdf)og?jp\sdf|T >\j{ u $ .!%j9<P{]G$v>A5KV\gu-  / [/Q>Ktxg- 1U~rYWKKFIPYy|GkJMr_#hFrtdC_pT~m3"DB=R3i(m@1EJbPx"~:+*07D;>>FH`i km>{~G0 T;so{A% V%(*${eOTc 2 @" (I$c!V9c $cI + 2 ]hv.-c!,*pxCB.aLKb q| #(*3]c[%c. c`sh |k.vqex9a  lpjr ~Bm)vauCX)\^;qw=aG9KU@^lt #U(Q,\2tS-jz| S#>0 :U?xHKOKm:4t"8-@HKyZ_Sm  9L(12y<^T r=xE g0fQfo| 1&()pOvm}h1<^ELrSY|^+Tc Gg8 }( _QBiZ :6IDOEFuP lwc5]=x@ERl~&P_Dk\sEz@+nJT9c"M!R ,'k-0b:XF'),.lK V@^d:p $g=P2,#D`i"@BX$6XG[SVe|igt4 ))^2 ?;NPs]Tg;nu*LF.14LB3FqL[.* ^*!8h""p{yQd =P#'b5t@Ck`Hlix.W3 $"N'\L N `.l?tw(BW E%Rdc ]L!TZ4 _jB lw+kc=NtWUhnx{p 0 +%>. 13gNUnjmZuI} L!{)j36BE!Jamqo|! "J8;?&FQ{\ldhUxY G:+q;=0OQ;W Y_n&ru)$(1/6?ADV%[xn1j ((+ .1/6DFJ LaR>P3G8qCXHRjHqH<Qp"@),k@Rs y8>$@DNUgO n&(-1ZNP9U[e\pMyIR E$AANHThgq%wIW -03|V1Z$^#a?hJqt0} I #9->36; >ACFI%OR3[6e"~2  W$,/2DKM1Vqz}s 3&).DLQ=WZ;`:g{l\vCL s 5[a]kecg__c" 0>G@Ic_c/Ac+O%zPUpmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniJISX0213-UTF32-V.bcmap000066400000000000000000000012541354442177200235440ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEUniJISX0213-UTF32-HC!bC T?dC!wS#t&+"' +B9S% G(C %%o/S %@uC &zwz!O 0/ ]C'C0KS 3JWVmC3  K? C31$1 ) ') q C3L    &vc%97=;A?j]`UXw ~6O c]H^[c0kg6 EPT\bhtw|~mc#^dIX MXmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniJISX02132004-UTF32-H.bcmap000066400000000000000000001172401354442177200240370ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE#C\a !GS k]>2&?V3C>S 2!+ S tA ~$c S n$cUP &%$)C$) f7![ S .s"'A"} ";96"B; |,"m  S/P' j>"kOL iOfO>_c 0 m("[<SCiP. S2j Ck9S PX""O( zC ^W-*'0#rS l6B''$cbC x1TI67ZS 94 M-|3)FCXb >M#=:B@; J:E1=;+ =Ngf UJ )^-IR   QL5? X55@T K9G$ +CUptmZ$;M v3\7V=/jU_(AKv9y.@7 #C.eC.:CK  _!W:rS/0i ww85Rt {v\S /Sh> cr/qS/#&? CZccTc{i7&&So(_4uw$nBS^n}Ha$/7R4 t- .YO@4<{0PS_(VKpAX]X`-tGW-e"NOxe?Kj8]/8GUF ah(.\z($X[op%t:+T}Ra G6]C3!Y"o5n S/N <7JarC8wzC /Ӟ~/_H +<Dw*3`C00: aaC0M;:J =KA&wPy{C3x    5 & C4$&b9S6mhN T  `( 2n$Q@"QcC4lR#.g O8oxmjH9C'4Z%=,'0"kzpkH 7( pa 55F>5$LK&& . ? iGT4\#]r> K4## P\ 8 9 P" ZA8>F 2i5%" $09g  B^g6" \_ ,HBP &7J$(*V 8Cn !4 3< 5&Y1<& C$`j0Q_ \(pDG$% f@zy6d $.~.BdCD&r } v%Qo 3S N*9!#}DR1UCVNL^iO2wli@m32M(7X/uve R\gfN z3 iZj9{: ~WdQ }xXSwhN I@GF5Kr#yC NZ  a ed$ "  CN)Uxy  tuT"yx wnS N݅gN/F7CN9zPA,CN끆bFGCN聤]S NZ4dlmgpSS Oa 4?S O%k! WVroCO.3 $[q/5lCCOwS P*6mO ~z ySP!Bzidv IT;(C+P6^N yXqA(t'FeO?nR E$q )G>@/.CP@? )#012C2P0 tu5{$yxy5{&'&} |76-05}01(;:) o 19lS P၇ 4Lk+S P_JRTjI CPbEh qtED9 :CQ2vCP+- 8EF )(C(SQA8!1hd;^C:d?PxgCQRr9 B?A)h.7Zm[ M`sCQdJCQS;IF_T_ W>HSS Q~#P367#"C QQ3+D{vsgfot1jDYX/[~+*5Rp32CQKa`CQ 1`j.-<='PgS QpQusLEzCTQ5F} =}A jC:yxQP)?I.-B;Q$` ]`9(y7>aR38&x}r3UUp{$7jFPYZoYnO$ih/0CRNGa>` XYGC1Ro #N 1 $g  Z'+P'C*+NMN#IP ON $!zg Z}SRR)hva`o*=3nA@CR|{1tKb CSSC R쁥a HBg#B,EDS SM!xVuB0 KsSCS#OA@CS$UCS%iKTU)S S8S{mo UQxTKS SEVm  C SQp9r]J/h.< CSa!CSYq#J%S Sl"JW+^X;^CSw`SNIHU pKJyxAnP]8UN{CSr?S Ty/0i/^E``C&TlC8C< b*t ;:W}]Vt /B'  vC T 4 O  0  CT"^_#]\ GTS T%XmyYCTH7%p7CS Ttz@ 65CTSTL}B8 =82$0p{C$TǢ 5@=LmnJo5}:+27.m=* CT ^C'T2DETn oonoE\aJK^j  ONspQ6qS U{4HSZglnKC(U<zo t Of O`Mc~&% 4p i MP1W ~owh YCU_)_C,U:Zrsr u  s}| jkibmz% S V/U8PDCXY\[TCVNL kvSV 1#<kl Y\CVBZ bEkC+V;* {ihxkvwv ifgd u ~gd%*r}% ab%*t56S VȢgLiHw38t/CVӢjS Vעk_=Je9 CCV R1 eV}~OdKJ*yr `W6.y_6;4cb %1V yvK6_CWY` FCFVPduttkxpmhy{p mh ut torIHy IH{xzyz WRc-~S WexOlv3C8X y@D cb)7O~_}%.cL?B54\Ia@.V gv SsDMLUP # O>CX/2,+<>C2Xayx ~ vo~ ~ }f ]p| |}|atze `z#S Xhyz_zvC7Xܣ1)t|:)_PG|32kj-1: o|qR#PY6]\Pc^cdxOT[CY iGCX݁y |"|/./w$%$;8 =<1S YgMyzYJwB[ CrYs&t32u4T|8izOaE"3.sA|$u X] o B_r/2OJ t#!D =< ;g* KL =V    GJ #$ ABwa_H9t! ]\NOCYnn,CYq  ml# , 4?>C;Yyj?%`?<?'&8963767=: ;:KJ aC)Yr  *   ! -IS[HGHIJ[e[h*{S [Cl5*}p>,bC[nDORz5WCC[w C[= S [S:"gGt:C[ɤeJOBWMoX+D)(GB/}L//L}1k'sutSZIR2ebi/PCBk`o`wE9J [d   ;2 wG>[_:KFOJ  _h sr !wr  '>ed uH8  on 5KC[sE2 >{CP:1bC\*? 2NO N/G%C-[΁z {z5   5   %&-0 5256C[ׁz $2%  "o#2$CC&[́D $  "#    S ]coXYePC/]m W^ysjx7.Tq4mh[= oO" qbGBa` !>UC]C] TS|$'"|UML- z y)NTM vRS ^w)$/7C$)C$^?2231 TgngCg`o^ U&nKLgl C^pH C^N }-*zU'&'KBUQ(zS^t 0{2WWVwS _-,UML+`&C _wFYist}S _!dF^$h%C_-$ 3^5z3B~wz 1;XOtd)iiC_4!! C_. -=<Bf+* C@A( ! H S _|tLb1-`F76C_9-Rhe}DGC_<"Y4"!C_S _>!f}9edC_-L* FWPH; J?6|c?:mv C_5 4C_8 3 5,549 * S `Vp*'zsCC4` 5&#4 +2SJ 78g0>!&#oA>o: (~  I2k^!pC`]'C`&;(  )B  ED-,)(S `7 8R{f^_S `O"Y"ZC`c&?> z C` C`!.1'"S `إzR/Ef5c4GC`gKF>SF_^ #& m]D%"C` %$C`偨@7)\=<?>;z>;%$8ADCB?S aDj;I}/elC aS!QLiqRCa^(utCalLS an6\q vnC5a~GeSP Qia  7Az5. yz in=P wY*CazC%a{*'& Lw 2BO)vE3vE r4pqF~YVWVS Ra /S bp,89#Z9:$C?b&lon+mVmG IA3$SM) (3<y r=,wn/xTKm~5rQ{*| sd C b)^ C_ .=>q|  = 4cXq> 8 }t  EV C:q7ElM/ cn  v1:E@MPAB:s#  ?@/V#4(w\|E&m`E!107"HH h9&2i ^5.uxOPO8A]Hn{eZ;6 Pe,Ccþ'1VO<, g"fcb#?"+~1 Ccs 1 N`1 N=@-<  C,c"_ b+*qp $w x      $CcꁗJ'  9*1 Cdo(70C-c %!  #    "4 Sfk6owY<+(W}RkeN+SOl!RCf4j*/>5GDaZ_BCf3v .'W~Cf7L S f]q63VyC-fiiRg,CcT#pcZ  {fqdQR^2  ! %21@Cfs"% C fjQ SL} 54  (T=f7z[ZEDEDS f'Pm [pNC,gK$=<YnhwSK3Zm5/B}N.I69J1-&#"P$Cg(D34Cg i 76fa`SO 'S gli;HM,yx`;C g|$}b"9$ gCg{2k jYCgj S g #LT1Zo>Cgnt]x! S g089][: Cg(PNKF% mF#HP6Cg+C g{h~~)&|S g6hoe%$Cg*d}noT}1v_gFYbU]dCg 'CgJ%z~ih~}50~}S h;~-,~x{ 5  C!hH j{xX>9j5I ^?& !}u%& [,EChR,;!ChIvwr3@C454wA& uVOh96S hKvo6Q)C hQ[]p=CNCh/ChS h0v654O |gC hߘi IZ-&exDCh.Chꁪ A@]pSi sd] h2qtdt=C7i@c  e }S *'$=K ) /c, ?!Y nd g2 V +: WNK UD\#B JS Hel) YXCqip+& 7,    8=$         & 18       oj/0    ad CibX2!Y z^.h(#$" yz$ \C"i55 IHsv 2[ Z   XU'J 1{zC2iB 4;4 ? > EDI LQPUZ g hij      Ci" B5 X  =HR O7Ci 72#   S k_bnomVpQnCki2nOrtE=! .C klc Ckk?S kI[oHGDC4kuu@Ary2o2(4 #3~X ! <XE^vmlQ^'Ck=hGC/kj 1q  #` ;'pu&LutONO+^ kpk&>srA@uy( "A3yjuwS l ^)M4/P*yqtCF ?f =R{tnWG4FM aTBARE +Cn2&) Yhv {[^r wMBr}C n;w $ S nC8eX C#nыH8 3% p )410E.e8 e)   c @CCn8 )" m lq pf[XY\C o  S oWAoLUSj!SC=odk 8Xa| >.kB ~7 >s:W | CAV ; >g)  h|% A OhQ x CuZ |KGF}#m _{" %CgofDM     AB+2   uv.    /         #  CoQ,?_^  U5)0/# %WHX  {J9 h op'<M C'o} %$#?! * nm) Co~3  %]&.?9 "2 PC.ohC' *  "  !6*,Co3U(0-IilA"C)ol "  >E !  1   S rW+dPdQZ}'JJCErg ?~ XY ~ [ (I@g  _ p`V 1\nN8E~Y= v $?j* YeN E!#E_ Zqv,Q iH! .8CWrtk        7 4+     )("  Cra eRE  5w$xaC9r; %$3, (`a ON HI @=   WCrI (; 85C6rx &  , # CrhH DTU *  </>#C/rkA /   @   SuJ]V*-]>k/0C u0><Z ~EHCu/rCu6E!dS uFS^gX=d'&CuT^JS uYy4q!*H OC udVE#fWZDES uou-hk~dm-(D.CFu@@'U[jeVQLtk|?g"ON   wz[Vad +sczCu~#/c b    wvC8u cbSRc \{Y  !@= B74Eons832Iih i.G+ BS vO7o`! CGvw ; `^P x] <2NpgY m\HECZ'fpa&{*'T= R#aG Gy61d{PY6;=#L0DA CVv  %&       $.        =:C vy=>oB/{,5C v7%  ;  :!5) 5Cv^  `Kb*>OC'v  ."#?  "  C)vr   E$! 8C4v!  = "   +   S y:THy@CjVC1yGkU^XJ{r[`t?WpO T$*$Yk:(ih y}W:;ST6%CyE;v NOJK TK ~|FG~DEm nCyDY  S y݁gWk@)()GCyf; -D$YX'v SCyꁙ&SPE%$8C >Cyk S z7 \ >tVCzB6T?@] b  stQPyCzEK C zD+7H K@E S z}*' d)?2ZCz+Z>S zZ>5gC zx niwtjGJCzQCz{ A&#"#S zËT@B=|^O C z n#-S zd .61JdwCzzQ07y7 XN#C{W C z;:\ j I |S {% jh9UvC{3JK VoMC{1Z TB 'C{0S {KR'k0NSvC{C {]i! &C{`](+TULM&jo 8+-S{)2 . $) XW"_C{{Tap^5LC{bC {30+*+.S {Ěc0tRyF%CN{Ϯn Z.-<  zq{r uv#& /.yx !-05#EB''*s6B;fC{c1   C@BC*{ԁ hifizlmlm @Uq nut|+Sw tun gfeC{ہ&   ) S |ү&HHC3z,C|ܯ'E/+12utCVcK(C|vHI J C|遭1S}2'KkI0cTHC} IL*nS }*6z= 3_C}595XS }?8ZQ.R X1C }K5,tSt/{r kYT 9Vh1Hx C}MN  T5! T WX>{zZ>A<BC}Q8 S}6OS PsbE2TM{C!}N(luX#P?*yk`  k;kr/*d2  C}8I ; a9ihifC}G  S ~12ZPY Ci~&N{  53N  w<St8Q|OjmbTI )  QTdz4ML!GH! b_?6?6K-x dc[C~GON + /- C#~'B[Z, 1)01010+ &%"    C~-L /) & S >9IC+yQih9Q$O4;@xzZI$TuiTlYzG'N  8C{j  ~~ ~ /. /.Cp7S큙t!5F }C$7n~elOevk,;%F h . s v qAj>8C+ d  rm    C 2544/) C=y~ ~z{z ?DC8jk {z}t MLzK@ uONvuvup }poS MrX\&M0eC S c-xpQ \]WC!=0veyxS 2>76-q\wNC G*^I79 DMYC @$ BC%<tm501$%$qUVwvj WcDiVYI ^9fsS +R?k~u(-,S E%?0kj 6JC ŋ_ Rkp$e^CGJCЁ S ޱELShiP+W tC)m (yJUT=B;ZxC ꁚSML C큮%3S+T,ut3HU>ES'hBC@OJ C<9a`C=/S OcZpK,UACwYWC bmp ;4C Zzh /Q~US ON?PlmmC7[O@*_2wh*!@bINkV!^ 0fW7>!3<# +6Y\%M\*=dyZC5Kdi +*KMf!ml"C 9 )0S _;EP)g?$S id5Cun$A4  CW, -]C s=Mz3 B54CtJS `Zb[=X C7ėr/mv;>,sW( Y f ~SZ;~T#wrShiPitrCJawTv_ CӁ_z C PG JKGun H J KTĆR%  S ,terqpECPC:Ca(bcbES -zw,{ rF?CN> 9: C& @%'"?@rm W 6 ;J d/LON)Hb =R  56C'  3,Yt  Cb%GH( KJaC.| knsrsronmlst/` 5BC x'(%  C"m   " #  S X^"smlm|C >,Y(d ,T>&C- r     ,7       CQ#noano\ alZih] cbhkb Ul 3=tvhcb]t}|d[xzy\ed_^_^ihcba`] bonk*#f=+S  |q,kCC=  UVg)z)CC<x}| mnojkjmjkjSUCwch9&! b.x?HC-h/x/jb SZy d dW tW a;\SLF L<q;3dz d+={vuDUCJk3       .7$  ^u   C  *  <[SZ GFyC,iOji0 h[r de$h a`iyx`a` e ` a`a`cC$qG#     S |H=T CNAW!CS , edAb]\C*Z/g`kC6@[gC /y#jI#S P.fPbuXIIC4[ ! 6Gn80#VJ9 :[>rg6>rudu-4i! ~9%K/y`&C]dj kjon KJM|NMPsrOC\ S ڴ3 sC#+JU~I0o-,\TMC&C 쁚chiS:7LQ87LS ` .2ikaCD&5dm7<heCDKN'"MFGFw h GJ%&onI["5 UX1n.SC 7(G( +IHC:-4 ml;J48o~KJlmH8kO8 ul941GA.oA.H T~ A< )yR]yQ. 4MC,ʹ} :J rqPb c   C8ҁv7Q 54 96 L     '& FG`&'b G  EDEDM Q^0= <9}Cρ<  e    !S G DAVYC_|CU*  CT1V?>^a7Z D#"GF]\S GUVB+E*C ʒq|0 J!1a4 PUC>`aj k CH\iD]\ C@ "GT f#E jO&S|S %!(O:HW~uS 3SJ+/X]#S >X[&vI7C9IZ[^A9&$]^ML c`JwLC*S7j#8}|!"A\1K \G&CJ@N_^QKR? j ]^ uN utu0c$C O|7 S dJNV_i CIfN  ; zJO` beu Z@=YoVz Tm "SD/ *[xh-6i`Y,K8?E#& j1+0B0M84 C<;T2uCFv*# TG  ZrODe-jH%>G>? >uI` a Z[daC,VC "" )  C -~i '$NC9/0? ZY:=< =<=:=898965 (/ $% !  C?"!& "   S ֶ8G.m c^C| %-%"KC:    zC쁒}t67   a,b  i/ &S B0'_tmC:NL}~ u{\  G 5f*wB wz G Nuz +{Qs=:/_b3eKNCOzRON$KJC2MM  zw{ )vSoB?r )#nL$GtC/hxIe9eC .[  zC3W454_m6'9^9o&S ixc6AE$+~C~I e .E "_6"nU%:FWhC7|e * H } hehe r _ VWL SjU,-C6s% 5ede ED + $#HI YA  Y d#NO @G$YILM # LML LC"tz     yS }'Cx2wxC?AD5.IH6 7BUK), <Dq41cLABup;h%f>)}R$kTC&Y  ~KJ4`"SRON)()VPUT10C &> S 4rs`CzHC)E6DsnZU+BAo(g|-8O]&IIyrKHK$A|+1C"|}0Scfi tuC8#S )&QPQ $iC; R C5v54!B="!45~ED6]$qr!Kl`gW E36C$\BCFG }lqono,?okj*E>1p>1 0r= HI C ?, " S ƸJNP< C ӌ=kd: A|`CܸCЁRKHIyjTA.9H 9yD M61S LyY?e~C?B&Kk% K$\1@02C3G h5Q 6q >1PmY/P[T/eVs)f-^- .)M$i 8 $NDCwjpCܰ9?B (Cs! HGJc bK5 "\]$%xy   JF<   je  L#/A 0 '   pql k lmC93&7+ {NC8KZ Q8 " RCV*p*= +$0C\u(+D&%  {xyx {B:;ji be` a`a^_V   FKHI AG FE D EB CLYC ?  L  S P]H;6OO Cɏ%<  }bCc\c P Q  H3    C%2?LMLM:!s/b3x-def ](~)$A.)8S !4^M+*;qC+-; ]i "l f &`Q%Y ' k Mj K"]$=bI]}kd W)_k2dt-}|8 MICb.0F?+, zun    R[fYT_   )2 `e 2/V xde C6n   i8h#  y#xC eA]7 &C?1g ! !  k xo n mheda L M]HIF E!@  E>C&=C {"  p S \`auxc_,S\Y"6 C,~S+0F-8 _N?$Cd5&oD8_",aw~e?nA5Z9:PL}/S]wI3"P!lGjK[~8CCC 5qpq2 FwS? B!*MzCYNh\nY5#Qh;>^ )N"s=2ZCLCCi4LCD ~%HqAQR{e u_E:^Cltq0? or%?jW3JOGbE3 GNYODg/K V_[ *%)2).Ad tZ >28 tC&>eh $,I/^@ !W# `$ (}:C& St+;;I ooCQ n,Ew P>Lx7 2~ B 5I'$'I!,S  [  WX (holQ;z)fV (Ri2W B9E.gO c( _v<.TB -0,|"]    e~2u9/5sR D("Y#l$ Zf (1 %NlB7=(l{ K{$$64&wB(2 > L#8-a_iJv4qIw7 6 @Hk"K0!  $ -'3 \- ` #RaFE '^ > (6u +"h093@9 d&B Rv{2*9/C,Yb"X:[XMiB( *Y8]mYh QS,6AI|tggf8I* , F }0R >xc ;>%e !$*;AGX0nFpcs F#*KPna*Uy *$+RJ U cN 9c_hcG!` ! jHvarn2~ 0JK7!7E & 5L?X^ M :!0>`y/B &H=\_4 1Vx C8cX6e<p(w* %_7JE2v7o*_{'7.@+[ZfCu^+!/(~~|u=J l,>l^~I-B(M^ZL0RBLQ\`Sh0s=;=>Tdf)og?jp\sdf  >\j{ u $ .!%j9<P{]G$v>A5KV\gu-  / [/Q>Ktxg- 1U~rYWKKFIPYy|GkJMr_#hFrtdC_pT~m3"DB=R3i(m@1EJbPx"~:+*07D;>>FH`i km>{~G0 T;so{A% V%(*{eOTc 2 @" (I$c!V9c $cI + 2 ]hv.-c!,*pxCB.aLKb q| #(*3]c[%c. c`sh |k.vqex9a  lpjr ~Bm)vauCX)\^;qw=aG9KU@^lt #U(Q,\2tS-jz| S#>0 :U?xHKOKm:4t"8-@HKyZ_Sm  9L(12y<^T r=xE g0fQfo| 1&()pOvm}h1<^ELrSY|^+Tc Gg8 }( _QBiZ :6IDOEFuP lwc$]L!TZ4 _jB lw+kJ=x@ERl~&P_Dk\sEz@+nJT9c"M!R ,'k-0b:I(_F=e|RV"p' qH$ KY1*R ym  85B?'TZkHko>XF'),.lK V@^d:p $g=P2,#D`i"@BX$6XG[SVe|igt4 ))^2 ?;NPs]Tg;nu*LF.14LB3FqL[.* ^*!8h""p{yQd =P#'b5t@Ck`Hlix.W3 $"N'\L N `.l?tw(BW E%Rdc>NtWUhnx{p 0 +%>. 13gNUnjmZuI} L!{)j36BE!Jamqo|! "J8;?&FQ{\ldhUxY G:+q;=0OQ;W Y_n&ru)$(1/6?ADV%[xn1j ((+ .1/6DFJ LaR>P3G8qCXHRjHqH<Qp"@),k@Rs y8>$@DNUgO n&(-1ZNP9U[e\pMyIR E$AANHThgq%wIW -03|V1Z$^#a?hJqt0} I #9->36; >ACFI%OR3[6e"~2  W$,/2DKM1Vqz}K& 3&).DLQ=WZ;`:g{l\vCL s 5[a]kecg__c" 0>G@Ic_c/Ac+O%zPUpmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniJISX02132004-UTF32-V.bcmap000066400000000000000000000012601354442177200240470ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSEUniJISX02132004-UTF32-HC!bC T?dC!wS#t&+"' +B9S% G(C %%o/S %@uC &zwz!O 0/ ]C'C0KS 3JWVmC3  K? C31$1 ) ') q C3L    &vc%97=;A?j]`UXw ~6O c]H^[c0kg6 EPT\bhtw|~mc#^dIX MXmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniKS-UCS2-H.bcmap000066400000000000000000000622671354442177200227040ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE!a ^"PVk0 KAGXM;>OA JO-  6  34 769898 =8C858ASa$Who7|$#Amortui X 8M NO~ W N 'mq M C+*-a .-$;7/8:a 5nlA !wT a!@A!ҁC+]\]>6EYA !pN2B1 (A!fa"%@?>6A".SV8?3 +&A"7 dA"P#!<'a"d<:Ij"a$`];!Ca"f)!)+,+&(  &7/ ,2 ZWR.DA%Q% H3:%>)<'(q%/1$357#9; %=?!A&Ca%h %$eiA%mbsJabIDchW^i>=a%fA&& !AA%G?{%JOUA@lW=L/.#f%\ sS6O0Qyd n'?8U% #8pYf!%r @/u!b(mP)$GFS4B"Qiq^=/_ Ks$$qA#P+9xzM U}`Zg~gMN| oV ID!hbQ6Qfi7\_ j_xB"Lo9A]{b3NUa0s>w (m N"=-qj7 %j wXHtt?_ #/pQiDQX%CY^,2 +Cb%tS4DF~GL'Mxc4PY;>k@# vAh8EUb% nZ'kD6k|vun?^&+Ob{fn]oD#64 vLMS pPLWDU85Ty  ;;qC\ `|AA_RL?*<m-|,JEd%/T ]h*+OTn1:ojn 1A@?1\(!W``X?Jz]x1zZ? 6Ew0af3l; GPeaJ .))F-YXY B7,AMpq &Fv[:&3" ]XgJ{l_vy2E8;}<nYfrvsx0PEm=( { u}xs2#x ]~wu .u0a[|0&{]b&Wy sa2q %i _ ; DHS$8{ 0F&1P  ^;ps o\;ydemPa5H;l_# {z@3H+hgdlXFEQ- GGbE,+z2g> _07Z%eb!LK A51m*@ "CE#OJc}QNJ E>( ni >iVKAjO%J~c| x} |9f6sAYA"2k"S&Rpl!N<iDEfaoMgJ]SZ=,st *4 jp=/l/[Zl_zqp.|a eTJ = W!d @9N' ,?G:1C +3k`fFc6IF^w b< <by,a2p9u2dA(tsIs"mP}T zX1R?5>dX@SSb:jnI]O?!|7V-I#^ZX7(s q;6`4! IH^U:]K(_ D[ /. 4CQStr wodB ;.9d<[&YToy&6qRI0;Dna\hA]T47swA2\5bE3Y$? fc!rib,YB1 MbF*qz o g$TA> :0e) w{x{% 3 e%hA\7y,gZ3mR3|kB wTM_U; ,[4k ^fa^|-A/^~n*2B UX6Q= NY ;o=Dp0 $_{nSk>k9 -B),W@&>D ?yA*^hBD!sHP3rF)`A+z!A0y>%y klnj o`eZQ f } ^6[A^ȻD' v m  x= & T 6a_ZA_C sU L V ang9r ?4r L)yA_&H wa$ }tl @k AV w%gl=$  FA_ ,U m,0Q;LN[ |sriu1aa2Aa:2O 0Aa 6NAa]?10W U'h\4aaX-A7acnCBZ 0 X B|?^#V?o 9 doJ v22a>f#'!FfY =SP* hYvmo&a)AabCH w>#AFy |6+TR`STRXy)p;L <)x "@?KL d2 9p r>oX YagsAg&> rM gV{ Zi!"(_6ScO\EN}AgpAg-(>]YBRobw?agxAgIYI01,@v h!*^ +7D~hg `|=%t\16AEgJ% s5>? `qNZmhq! 6|QpP$i xE]*M0Qi3|oP[) c &BI _I4 >p P9 BmAhSSKaia9Alic{I4s3^]^He `X)  MhU]oX^#TGk `:%]2l7hV}Gp!A<-Tus(U#* y`UY] \[w?] *_A k HtMe>+~9"~{} :97LX_zGohk_y-|A iw CBLp!:Pu7,A ii_0(02_TakMAkۥ(6mjm+}0;Kd O6Gx-&KP?tm"Qr\4vexM  epZ4i*F}hxmTfOOR{6'H+2p-|Z 3:I~)s\8mU2%]D'|l<M+r<#dH~p$fcPS^WV,# CLj9T: tG6m)p&yi|(k0n0+FR ,!R mhjhogBi6GK>V>ze(h3-\s |sKzJoBttScJL 1[O>x +:I&L5X7!7m l |='5} T(W`^IrsNS pwNY%!i pIo Md2w1T{ @>VA\Oj9Fk<)|Jy qbSv*bg@'ne 8o1 ^eXXUL]hO #v'n cp_@ !r bB #)XQ 'N)5P$/x6WVu[- )aqqAr}6. WA:qp5SJ&X  R yk Y K wP1y.8WF`ab|V%Shv ${ o |t 7 i# (7$Nu!B Aq1'3d J}9%9< s9{&0-(M(q%as6?Aos>];I xCYV El;a `6JC^  uaEW2AE&VvQpg&( 9$F^CV c rR NButZh0l= T%I34!B \ izi8C*ma HF s!y\!=xn y0]%h,#Lybc3e( M > '{z$<CB2 mHy& KMjRPJA>_zrUFM'SRShBUf  P[>W8=,@c|8+ZF-5p #^Ca^  ifBG^ hCBC ")@(x lav}Avtf E]'C+N+)E1Ad%^ *Ul&s:!+A.vb'r03cv# {Za6OSrsL$1I8 FL-<> P#O"VYX ?L9OAvc ?C  g,-zO RWv ^ a/lz V?<x r()QaxGAx3P5wb :G,r% $a1AxcAx˷ 5` ayGAy[ |LK,+ u 3G6w8s8*z/EJO&qAyPF )%)!Zi3WyI .n-0D+Q Q>^A)yI2 989t1 J_U@m +Y Kps,+4 CRi-hb F(#h%H}m>G E(WazUAGz~ Y <V 6h+L]v X-6u PQ%,  A A<  R+foVj%  o 4i Z/ ,T.U}b ))B,%l2PH.A(zķu-N -R ;_^F4# {&'$K=! \3W}R2ke 3   "A{,1e"?:>Ja} jA!}!) J Q L6<Y9V! =`0 _ i?V b Y)][<)x(uqin eCQYy* :3A 0Jg0Al}4!5 \KJA$T}f NN GiL da\}f < ?u N$rs2 EF 0e3 N g=8 .B=n!Zmxww.~b}j g3( qp]GW&8x R?:5l |ns2>ut_ & MA~jG^"+^ CjaP AgT`o=ZasFL [`u J)^T ;"3iol(~, sFSBkvlM+jTU2X fUXD;}BGG@u@ aJB\ HVWb*Q dTo>b^Y+<BQj=.+IRwNt!/J!o[YJ  ; g[x3^7 ~"tB#1 s;5J;Y& c ? %so d\ 9H~Wx ~N |),2Jzh^#AZgI  @A0#Btm]ZWP#=RcO(W/P1s0S~qoBt78jcp .X 011p-n 1pStgI K% Jz]^G: }vgV1Sh DU: Rczo^c`\ I8-#|oF\+j(C2%s0c w3f9~91AZ"-T; \Y- / B"# h% t[<A m*o| PEG0\6T.'\ .a~OA3FkpI/ $ * I26# A2)O9X:A FauAF0 1U4 S H m%f_JqJ<4 9z.p7P0& ?,pcLK|I@[n Zt3,LY9Ma \,!/4il3Q8YzzJm_I( M2GDciEK 8 &m,zRCr\i/4K\/B"  (Psa>>.q<g)o L \$vU9@ LEn{F|M\q7 ?^><}  QP'I]7_*)_Z X#~H{D?2 y@ 5JutpwT3]|AOLfY_Rq1G:Qr m&,m~ }M{ ` ^w2 rc -H(V_ ti@SC =JKV Y hon oT;d|Pk%t.g ,,o'.w? V%O?p !  By:kvF?FJ CF b5R=f/=&8x2=  j x# tqN!w0Xzpas6QP9i"UCX9 $(x<'o ^ydw4xc H@zO|LRK1ROA:OS=djL fqfk}F9MFKPmK\.K[vVCWartyW"D_J0d U:$s{j(]kVsE:~1 zK4@Z[Y; Sd=1q4> fM$U KDqaLX" p }(VMpkbC I1$sp&ZpMHn W zk=/.~ p:o@/X0q<of sNonpiHwAV { }T8 & } `L {aQGA [ !,wYu\0yHa]A +F y(,3-p'@P7AzW4~9jihy& oc: 'vA$s  a 4 W k?? z& V Qz/8\I:W hC ?@#atAǝ3A*z]A0 ~gp#>~m77 i,NaaSA5,[A]UMj%^@Ni@7 #B-rmRAy b I<;( f8%iVSHKNY1^' z tk3uG:+[30m/ 2cBcfi4, 6u (ad_z A31Y>gB95Ql*&oA1  y B#N !#Q B+v%Q<0eY G  \8=/%C $ - AS `E ZfaA[+pWiy;==*` nE+^ Sshl%w>S/ (Y-'h2Y S pm 5 ^( @GF 4<R)0"lsV|s10 0%Bavu ! Vn u Fi%x S7(?@A 1kp> V~5GV`dd/r;, >Agc \ n Y# pNSUtN/D]6$*IxI=cT=D* 4 ujUq3>u@wAyE~MRST V Y[\ ]!^"_(`+a.bAdCeEgFhKjLnNrQsTt[v\yb|c}elmprux     #$% +!."1#9$;&A(C)F*M,N-O.U/X0[1c2d3l5n6p:t=u>v@{B}C D FG#H+J-K0L7N8O@PCQFRYT[UV]XcZd[e\k]_` b cefhilmno q!t$u&w(x+y2{3~9.?noryz   &*,GIJKRS T#X% ^&i(o*+, -.01294;5>6D9E:F<K= R>]@cBeChDoFqGxH{I~J LM*O,P-Q.R/S3V4W5X8YV[X\[]b_c`dajdkemirksptqutwuzvx{} ~ 2:;>?C D IKNUV\^ahjl o!r" $ %&')*+./ 0"+1N2Q3T4[6\7d9f:i;q<r=su>y@{A}CEFG HI&JAKDLGM NOXQ^ReThUnWpXs[x]y^z`}a~bcdfghi"k#l$m(n)q*r,w/z0358?@ 6F } ~   !"!# $$/&5'8(O*Q+S-T.U/X1Y2Z3[4\5^6a7d8wz9 :;<=?@'ABCDDGENGOHPIVJiKpLM N OPQRS T#U&V-W1X7Z9[;]<^A`BaCbIPcdeffhhojpnupwqzrtwz { |~=RTWX\ ] bdgnou+- 0<BI\ w!2z"-$/%2&8(!<)^*y+|,-/! 0+2-3/56778?9B:E; L=V>Y?\@cBdCeDkFmGpHwJxN{R}STVY[ \]!^A`CaFbMdeNgSjUkXl_n`oapgrisltsvtyzz }{ | } &)9S Z ] ` ghioru}~ , 3!N#P$S%Z&\'](c*e+h,o.p/q0w2y3|4679;$=&>)?0A1B2C8E:F;K@MANBPDQETGUJVQXR\W^ ]_!i` b cdeghjmn!o(q)t/v1w 4x>{?|C}^_bchijps ! $ ' *234:=@HIQRTY Z!["^#_%b&e'm(n)v*+,-*.-/007192A3D4G5N6#P7t9v:;x<y=~?BCDIN P Q RSUVWY\ ]"_ $`%0aVcXdZf[g`iajblgniokqrssvyx{y~z{~  &'*-12 3 9 < K Relnq x % &!'"*$+% 2&='D(_*a+ d,p-v.y/|0123 5679#:=<?=B>C?HAIBJENGPHSITJYLZO_RaSdTkVlY r[&\'^)_+a2b4e:MfNg Tibk!cnpq rt=uRvmwxz { |}~;4p  %=? B I J KQRTYZ]_ad k"l%r't(w)~+,-. / 01279 ;$=%@)A*C,D/E6G7J=L?MBNIPJSPTSU VVbWhZi[l\m]r_s`tawbyd{e ~f ghijkm&n)o,p3r4s<u>vAwHyIzJ{P}R~T[\]^_`s z |   $*134:< ?"E$F%!G&i(k)m+s.t/u0y1z3{5~68: =>?AC!5DWFYG\H]IbKdMjNmO2pP#Q:S<T>V?WDYGZM\OV]^^e_x`abc ef1h3i6j=l@mFnYo`p{q+~r*s0u2v5w6xy :{D|G}J~ Q\^ahijp r swx{|~  "#$%'()* ,#-&. ./81:3;7@>A?B@CBECHDOFPGQHWKXL[M\OS`UcYfZi[p]q_xazb}e~fijkln o pruw x'y)z*{0}2~5<=>DFIP Q R X Z]bcdjlovx~ ! # $&'(* +!,'.)/,032435465:7<8?9D:E<F=GEJFMGTHVI^K`LcOgRhVkWlYnZo]p^u`vd{f}ghjmopqrst#u&v)w<y>zA{B|G~HINPSZ[\ b e h oqw"( 0!1"2#8$K&Q'T(W)^+_,`-f/h0x1~3479 : ;<#=*>E@GAJBQDREZF]G`H gIrKtLwM~OP!Q"S$T&V'W,Y-Z.\0^1`3a4b5c7d;f<iBkDlGmNoOrUsXt!hu w xy{~17"Jmoryz { |   #+258?^dfipsy! !."I#d$s%u&v ')*+$-'/+2-3.4/5677;<=>>A?HAIDOERFSGTH[I!_JLMN PSUVW Y!Z"[(\+]:^A_DS`TaZc\d_efgghhinjqk tl!m"n%o(p/r0s1t7u FvQxSyVz]|^}_~ex&'(* . 1 4 ; ?EGJQR!Suwy " # $&'(*+ ,'.(1.3!A4c6e7g9n;o>u@wAzBDEF G HIKNO8Q:R=SDUEVFWLYNZQ[X\\]b^v_|`ab1d3e6f=h>i?jEkHl KmWn]oqpwrys|tvwx yz{ |#~%(/!2TVY` a b h jmstz| !! C"E#H$I%N'O*U,W-Z.a0b1c2i3l4{5679:!;(=)>*?.@/A2BICdDgnEuFvG|HJKL#N$O%P+Q>RES`UbVeWlYoZu[x\{]^_ abdeghi"j%k ,m6o8p;qBsCtDuJxKyNzO{T}UXZ\_fg 5m #%(/068;BCDJMP W"Y$_%f&n'o(w*y+|,./0 1!2A3D4[5^6a7i8j9r;t<v>w?|A}B~CD!E:F=G@HGIIJQKTLWM^N`OacPgQjRmStU#uVXYZ%\&]'^-`/a2b6c8e9f:g@iBjEkLmMpSq!gr t uvwyz{}~!()*025< = C FI Q[]`dfghkmo r|} " #$%'()'*(+),/-2.5/=0>1F3H4K5O6Q7S8T9Z:];`<g=k>q@sA vBCE F GIJKMN!O(P*Q+R1T3U4Y:[;\<]?^A_D`GaNcQdWfYg\hcjdkeQ m\.FV]Ld5q ("*/369CH!%,07=AFTV[`|QZ^m~{h3FNsKF:O3fst;6P9qOuIMSWZ?\_aego@qAtBwzy{~/TCF G g%GTK(LPS4kaWcehjlXnsw0{ > [\ $*-QglwNYhKV$>ixo*Ta :p DqBeCmanuskript-0.10.0/libs/pdf.js/web/cmaps/UniKS-UCS2-V.bcmap000066400000000000000000000002621354442177200227050ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE UniKS-UCS2-Ha {}z[x  k   ~manuskript-0.10.0/libs/pdf.js/web/cmaps/UniKS-UTF16-H.bcmap000066400000000000000000000633271354442177200227730ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE!A  warYMQ tJvOez?AZƅ 1:6 gr34 769898 =8C858_s#lO@>P y8` )]YX l |kf68m+]\]>6EYT(V8?3 +&C IW"Vm`A-S^Kb3hI9?3V  N2B1 (C dZ!<'g  z_Iob /A 5n) Q% H3:%>)<'(A8%  (  Fi jebm 5& !A  A!/<!@:Bz;v(oFy:)&}=0lU:3wDQFi4A% V)-_? &H"5@Q /BhW4X'6+L_A /OVjIJwNQ Q /ZaV yGj'pd4bA/i]F>QPC"vGfA/utA/j0gQ /yA` ;jJA/<URA/,oX9A/L_)QY~}g"#HYK.+"%Q /q6E ~YXcY)Q /x(y ~=pA0lgh76bA/Ν6Fi'SA /ʹf,?x ;:Eh4=V|9 Q 3‚ r-D`qlA3؂A3τc` A|N<f& }Xo lv.a^UV' NK|u_Fpk5 uxv<e&BLi$1l41/@&o:5P>{%JOUA@lW=L/.#f%\ sS6O0Qyd n'?8U% #8pYf!%r @/u!b(mP)$GFS4B"Qiq^=/_ Ks$$qA#P+9xzM U}`Zg~gMN| oV ID!hbQ6Qfi7\_ j_xB"Lo9A]{b3NUa0s>w (m N"=-qj7 %j wXHtt?_ #/pQiDQX%CY^,2 +Cb%tS4DF~GL'Mxc4PY;>k@# vAh8EUb% nZ'kD6k|vun?^&+Ob{fn]oD#64 vLMS pPLWDU85Ty  ;;qC\ `|AA_RL?*<m-|,JEd%/T ]h*+OTn1:ojn 1A@?1\(!W``X?Jz]x1zZ? 6Ew0af3l; GPeaJ .))F-YXY B7,AMpq &Fv[:&3" ]XgJ{l_vy2E8;}<nYfrvsx0PEm=( { u}xs2#x ]~wu .u0a[|0&{]b&Wy sa2q %i _ ; DHS$8{ 0F&1P  ^;ps o\;ydemPa5H;l_# {z@3H+hgdlXFEQ- GGbE,+z2g> _07Z%eb!LK A51m*@ "CE#OJc}QNJ E>( ni >iVKAjO%J~c| x} |9f6sAYA"2k"S&Rpl!N<iDEfaoMgJ]SZ=,st *4 jp=/l/[Zl_zqp.|a eTJ = W!d @9N' ,?G:1C +3k`fFc6IF^w b< <by,a2p9u2dA(tsIs"mP}T zX1R?5>dX@SSb:jnI]O?!|7V-I#^ZX7(s q;6`4! IH^U:]K(_ D[ /. 4CQStr wodB ;.9d<[&YToy&6qRI0;Dn D , WE3Y<> fc!{jrb,YB1 MbF*qz`3 gpM=r5H L /^t[.M_U[XEw`]x{[)\Q dQe:/ UhHfA@2BB!X6Q"a>sYFo=D3yjn]0)`KH%_p1+ !r70 iH>u< 9>k9Sln-7^? CR^qp5NbZIW@&>DNc$d% ',vub6[N  !L Hferk$KU>}t 8'Tql}~C\;L]5ng}AVNN[=%<sXg3FrDA9 $~fu |7ib(?10W52 U~'[Zh+4u%5+CH9ly|/uGvto o 8ah8%=|?`+AQ .QL Sp?of$1*uZ+B_o@[ V:Ej\8a uBV}%Z&Keh7-N=DXY{gf6YKff+a'!:A./{V~ a<wh fY& tiox e z=4p3LM*||%*G\IYv X5u6S./LRwq(S u" 98'V~"r 5$ mcpQj q l' $\eF3yM,UFO.YZfD16ol?nF@a1P9;Y!D+j1i2 FPEnEJN@+x3 BAB?7?[\B[C3g'2F{}R?R~;4\raq$VcBC1~Cw|+%alAR ]*yAh?f;b9Wx['p(v~1 zC( >Xy)UDEUz;WVL x<7(x]e@9Z@?yw  ]0 ~#T i.ga4 r>oX}A:u<\ rM>],V{YB+Z 2!"(~bC6 uJ/O\EEE% s5O ? ` ?YI:qNZmhq! +46|9!:{vjpu^`cP$^4 alxXs*M0[~i3 ogN[3 =Jq ^BI _I4 >p P9  xBmI4s3.Q]^He=X):E M0IU]oX^#TGk `(o%]2l7hP{}Gp!A<-T VMs(U#*@;`UxS] \8w?] P'wADYX]irSH>KMe>+~9"~|y} :97LX_zGohpuk_y-|I6mjm+}0;Kd O6Gx-&KP?tm"Qr\4vexM  epZ4i*F}hxmTfOOR{6'H+2p-|Z 3:I~)s\8mU2%]D'|l<M+r<#dH~p$fcPS^WV,# CLj9T: tG6m)p&yi|(k0n0+FR ,!R mhjhogBi6GK>V>ze(h3-\s |sKzJoBttScJL 1[O>x +:I&L5X7!7m l |='5} T(W`^IrsNS pwNY%!i pIo Md2w1T{ @>VA\Oj9Fk<)|Jy qbSv*bg@'ne 8o1 ^eXXUL]hO #v'n cp_@ !r bB #)XQ 'N)5P$/x6WVu[- ) 5SJ&X  R hU Y P9 e wPNy.8WFXk`ab9{|V%Shv lu*{ o4y>A4 7 wpI^-*  \$Nu!B (;I xCYV El;a `6JC^  uaEW2AE&VvQpg&( 9$F^CV c rR NButZh0l= T%I34!B \ izi8C*ma HF s!y\!=xn y0]%h,#Lybc3e( M > '{z$<CB2 mHy& KMjRPJA>_zrUFM'SRShBUf  P[>W8=,@c|8+ZF-5p #^Ca^  ifBG^ hCBC ")@(x l6_v ZC +b'r0@ylOp2%f# {/a6OSp9f#t mBPC8 ^ ak:@ 'E`  FLd,S^l?#`lV5*v:<xC4; n B  b ?kEL9O idg^5b :G, % $a1TY89 1%l_ OLK `UuZi@u=+|w`GyIwL:Qps@+4{)^Ri-hiJ F(oJs8*zx%=Q Q>^iJO|>N F(WQ Y rs<>i 6Ng+bNL]v - 5-PRC6NE P U%m dF) Y A< ,#9+fV 2I.&3l$K9 o  \ ]__t/^}S$yT.U}bre 3ABj x y,Zl2P0iUCB|i49,Jq2X<p6s#pKe s LlBU$O"{ U<|mk$h BM|Ni7STg`3r n2_|r1}="E ?u NKnrs2+EFIxe=bCf N $Y*y!F=k" oR[.,h{<]Px!{TUI S yrS@5T$c`A/w.-8 j sb}jcz3Sz-m;#h']!(v >qF_iBU|&8EBx/Cr1Y Z77?DvO5l=8 9Ots \.q8>utKj /<Pg* W Y)o=ZasFL [`u J)^T ;"3iol(~, sFSBkvlM+jTU2X fUXD;}BGG@u@ aJB\ HVWb*Q dTo>b^Y+<BQj=.+IRwNt!/J!o[YJ  ; g[x3^7 ~"tB#1 s;5J;Y& c ? %so d\ 9H~Wx ~N |),2Jzh^#AZgI  @A0#Btm]ZWP#=RcO(W/P1s0S~qoBt78jcp .X 011p-n 1pStgI K% Jz]^G: }vgV1Sh DU: Rczo^c`\ I8-#|oF\+j(C2%s0c w3f9~91AZ"-T; \Y- / B"# h% t[<A m*o| PEG0\6T.'\ . Q3FL9pd/ T i *X'2,w# !0 1U4 S H m%f_JqJ<4 9z.p7P0& ?,pcLK|I@[n Zt3,LY9Ma \,!/4il3Q8YzzJm_I( M2GDciEK 8 &m,zRCr\i/4K\/B"  (Psa>>.q<g)o L \$vU9@ LEn{F|M\q7 ?^><}  QP'I]7_*)_Z X#~H{D?2 y@ 5JutpwT3]|AOLfY_Rq1G:Qr m&,m~ }M{ ` ^w2 rc -H(V_ ti@SC =JKV Y hon oT;d|Pk%t.g ,,o'.w? V%O?p !  By:kvF?FJ CF b5R=f/=&8x2=  j x# tqN!w0Xzpas6QP9i"UCX9 $(x<'o ^ydw4xc H@zO|LRK1ROA:OS=djL fqfk}F9MFKPmK\.K[vVCWartyW"D_J0d U:$s{j(]kVsE:~1 zK4@Z[Y; Sd=1q4> fM$U KDqaLX" p }(VMpkbC I1$sp&ZpMHn W zk=/.~ p:o@/X0q<of sNonpiHwAV { }T8 & } `L {O!,wYu\0yHiL y>GQx| a 4 WKBq/9jB? &/y&p Qz/8\I:W}hhCc2y4 /'O7dG#  gp#>m77 i,NaS]LMj%^@`CT yi@74YB-r(RAyXwI>;(srlQ7x8%rv%QaGSHKNY10S'(Ibi *7k"WbYJ\8=3}30m/ R!cBc<Wib/,| 6@7 (a9_z $>YXS9s>,E9B9KQ=(] Bc F!oJp@-W^}jUzu8uxe==9dq nE+^ S6 %";l% d]>SzL 5 (Y ;$|T =Y S  m 5 P sZo @GF 4x6RZ0nT'lsV|s10 0% =aPWvu>; ' Vnja Fi,  Kx|} S7(?@gU"          3   (   "  *  #       ;     O ' 7 " &  &               (    & #3  (   *        ( #+  B > Z3               &  (&3   ,   &$"                            &  & '   (  7& &    "     &    (&         &   &        O   " " (    &                 A'~*,F  & 5P( Q7V,J  "Dv*Dr ADAI,5Z Cp"Jp Q *"A%x%<  DzJvM7^Q,B 5X""J"A0:67X$,5\"$*(Q($S$$5V  J|  *#> Q( Ax "Jz  &(>A %h4$.R  "qB(AA#I "$,>$(< Q~("Jx*"5XvBoBAL5@d "#4  $( *$$ Qv$5@ "9^ "Hv "5X5PQ7X,L  $SoDA uDn "Br$7b$Q5XQ5R5X$$S $&7ZA=Qm6"$J $Q L 5ZA 7V  "S$5T(A!ni oD&7`"$J $$7R(,&(*Q(  5NQ m\.FV]Ld5A( s (,LQZ^m~{h3FNsKF:O3fst;6P9A)~W18 _n|   l) D_j A/7 wAgQglwNYhKV$>ixo*TA.C4 ]! D)ba ^auK]WhoF|$Cmrtui  MONmq M C+-@67<:X];!C4/13579;=?ACYi*f^}e xv+RS U&:2f)qD'sd`~K UQg ixtxG->AEMTVY6behjntvy}"  $&*&36:>@D"HL&RVX&]`cfi oquy{~6  -# #&(*.&2 6:>@DJ&M S&Y] aeikqvx{6  ""'+G4 7>ACRM OR UX[^!di nrwz>  $"(+/R=&AEzX[^&cfhjnrtw|~>  > " &S-&035;@ DHJNTVY6^begl ptv"}R &B!(, 0479;? CFKNQVX\6`ehjoqtx"}  Z #'7=?DIN SWY]6adgjloqsv{" B&"9(637&:?BEJLOTVY6\_ b"gik"nrzx&  "%)&279;=AEGJNP"W ] b-kp sw {~   "&&)+ 13 68:?A>DIKZQTW ZFc&fjzsy&    % */137@D HMOSU[]_bf lpru{    ! $( ,0 5:=ILORWZ^`dhjm6w| ".$) -147B>B&IM&QTWZ\^dfimo>uy{Z  F&'+-/57;?A>JNPSWBaeRp&vzR&&  $ (,.16479;>BIK"OS WnbfBpt&|&  > %'*.B7;zHLBSW&_bek mq u {} 6  ""(,z9<? S&VZ ^c gkm>rw {  "  %616>CG KRUYa dhg: Dags'5O[\a2_Z" j"*69C!%,07=AV[|IMSZagqtw{~ GLPensw  $-av}uua\heMw atazUa^|- 2W9S?0SaaX-a]afCguGaqqa z/:q!)L ,ZD: a 9$j?)%#/2W aa!@a$Ra_0jjUruwy  "(+.ACFLNQT\cemprux  %+.19;ACFOUX[dlnpv{}  #+-08@CFY[]ek !$&(+39.?orz  &*,GKTX ^io 9;>FK R]cehoqx{~ */58VX[dkmuwz  2;?DIKNV\^ahjlor   "+NQT\dfisuy{} &ADG NX^ehnpsz~$*, 0358@6F~  ! $/58OQU \^adwz 'BDGPVip   #&-179<CIPdfhpuwz  =RTX]bdgou+- 0<BI\w2z-/28!<^y|! +-/7?BE LVY\ekmpx{} !ACFNSUXagiltz }  &)9SZ]`ioru ,3NPSZ]cehqwy|$&)28;BEGJRW ]!i  !)/1 4?C_cjps!$'*4:=@IRT[_benv*-079ADGN#Ptvy   " $%0VX[bgiksy{~  '*-39<KRelnq x '+ 2=D_a dpvy| #=?CJNPTZ_adl r&')+24:N T!c =Rm  ;4p  %=?BKRTZ]_adlrtw   %*,/7=?BJPS Vbimtwy{ ~ &),4<>AJPRT `sz| $*14:<?!Gikmu{~ !5WY]bdjm2p#:<?DGMOV^ex 136=@FY`{+~*026 :DGJ Q\^ajpsx|~  #& .8;CEHQX\`cfiqxz~    '*025>DFIRXZ]djlovx~  !'),6:<?GJMTV^`chlpv{}#&)<>BINPS\behoqw"(28KQTW`fhx~ #*EGJRZ]` grtw!"$'.157<BDGOUX!h  17"Jmor|  #+258?^dfipsy! .Idsv $'+/7<>AIOT[!_"(+:ADTZ\_hnq t!"%(17 FQSV_ex(*.14;?EGJ!Suwy   (.!Acegouwz  8:=FLNQX\bv|136?EH KW]qwy|  #%(/!2TVYbhjmtz| !!CEIOUWZcil{!*/2Idgnv|%+>E`beloux{ "% ,68;DKOUXZ\_g5m#%(068;DJMPWY_fowy| !AD[^ajrtw~!:=@GIQTW^acgjm#u'-/26:@BEMS!g  !*025=CFI Q[]`dhkmo r} )/25>FHKOQTZ]`gkqs v  !(+14<?ADGNQWY\emanuskript-0.10.0/libs/pdf.js/web/cmaps/UniKS-UTF16-V.bcmap000066400000000000000000000002441354442177200227760ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE UniKS-UTF16-HA }m m , 7P y8` )]YX l |kf68m+]\]>6EYT(V8?3 +&C IW"Vm`C-S^Kb3hI9?3V  N2B1 (C dZ!<'g  z_Iob /C 5n) S% H3:%>)<'(C8%  (  Fi jebm 5& !A  C!/<!@:Bz;v(oFy:)&}=0lU:3wDQFi4C% V)-_? &H"5@S /BhW4X'6+L_C /OVjIJwNQ S /ZaV yGj'pd4bC/i]F>QPC"vGfC/utC/j0gS /yA` ;jJC/<URC/,oX9C/L_)QY~}g"#HYK.+"%S /q6E ~YXcY)S /x(y ~=pC0lgh76bC/Ν6Fi'SC /ʹf,?x ;:Eh4=V|9 S 3‚ r-D`qlC3؂C3τc` C|N<f& }Xo lv.a^UV' NK|u_Fpk5 uxv<e&BLi$1l41/@&o:5P>{%JOUA@lW=L/.#f%\ sS6O0Qyd n'?8U% #8pYf!%r @/u!b(mP)$GFS4B"Qiq^=/_ Ks$$qA#P+9xzM U}`Zg~gMN| oV ID!hbQ6Qfi7\_ j_xB"Lo9A]{b3NUa0s>w (m N"=-qj7 %j wXHtt?_ #/pQiDQX%CY^,2 +Cb%tS4DF~GL'Mxc4PY;>k@# vAh8EUb% nZ'kD6k|vun?^&+Ob{fn]oD#64 vLMS pPLWDU85Ty  ;;qC\ `|AA_RL?*<m-|,JEd%/T ]h*+OTn1:ojn 1A@?1\(!W``X?Jz]x1zZ? 6Ew0af3l; GPeaJ .))F-YXY B7,AMpq &Fv[:&3" ]XgJ{l_vy2E8;}<nYfrvsx0PEm=( { u}xs2#x ]~wu .u0a[|0&{]b&Wy sa2q %i _ ; DHS$8{ 0F&1P  ^;ps o\;ydemPa5H;l_# {z@3H+hgdlXFEQ- GGbE,+z2g> _07Z%eb!LK A51m*@ "CE#OJc}QNJ E>( ni >iVKAjO%J~c| x} |9f6sAYA"2k"S&Rpl!N<iDEfaoMgJ]SZ=,st *4 jp=/l/[Zl_zqp.|a eTJ = W!d @9N' ,?G:1C +3k`fFc6IF^w b< <by,a2p9u2dA(tsIs"mP}T zX1R?5>dX@SSb:jnI]O?!|7V-I#^ZX7(s q;6`4! IH^U:]K(_ D[ /. 4CQStr wodB ;.9d<[&YToy&6qRI0;Dn D , WE3Y<> fc!{jrb,YB1 MbF*qz`3 gpM=r5H L /^t[.M_U[XEw`]x{[)\Q dQe:/ UhHfA@2BB!X6Q"a>sYFo=D3yjn]0)`KH%_p1+ !r70 iH>u< 9>k9Sln-7^? CR^qp5NbZIW@&>DNc$d% ',vub6[N  !L Hferk$KU>}t 8'Tql}~C\;L]5ng}AVNN[=%<sXg3FrDA9 $~fu |7ib(?10W52 U~'[Zh+4u%5+CH9ly|/uGvto o 8ah8%=|?`+AQ .QL Sp?of$1*uZ+B_o@[ V:Ej\8a uBV}%Z&Keh7-N=DXY{gf6YKff+a'!:A./{V~ a<wh fY& tiox e z=4p3LM*||%*G\IYv X5u6S./LRwq(S u" 98'V~"r 5$ mcpQj q l' $\eF3yM,UFO.YZfD16ol?nF@a1P9;Y!D+j1i2 FPEnEJN@+x3 BAB?7?[\B[C3g'2F{}R?R~;4\raq$VcBC1~Cw|+%alAR ]*yAh?f;b9Wx['p(v~1 zC( >Xy)UDEUz;WVL x<7(x]e@9Z@?yw  ]0 ~#T i.ga4 r>oX}A:u<\ rM>],V{YB+Z 2!"(~bC6 uJ/O\EEE% s5O ? ` ?YI:qNZmhq! +46|9!:{vjpu^`cP$^4 alxXs*M0[~i3 ogN[3 =Jq ^BI _I4 >p P9  xBmI4s3.Q]^He=X):E M0IU]oX^#TGk `(o%]2l7hP{}Gp!A<-T VMs(U#*@;`UxS] \8w?] P'wADYX]irSH>KMe>+~9"~|y} :97LX_zGohpuk_y-|I6mjm+}0;Kd O6Gx-&KP?tm"Qr\4vexM  epZ4i*F}hxmTfOOR{6'H+2p-|Z 3:I~)s\8mU2%]D'|l<M+r<#dH~p$fcPS^WV,# CLj9T: tG6m)p&yi|(k0n0+FR ,!R mhjhogBi6GK>V>ze(h3-\s |sKzJoBttScJL 1[O>x +:I&L5X7!7m l |='5} T(W`^IrsNS pwNY%!i pIo Md2w1T{ @>VA\Oj9Fk<)|Jy qbSv*bg@'ne 8o1 ^eXXUL]hO #v'n cp_@ !r bB #)XQ 'N)5P$/x6WVu[- ) 5SJ&X  R hU Y P9 e wPNy.8WFXk`ab9{|V%Shv lu*{ o4y>A4 7 wpI^-*  \$Nu!B (;I xCYV El;a `6JC^  uaEW2AE&VvQpg&( 9$F^CV c rR NButZh0l= T%I34!B \ izi8C*ma HF s!y\!=xn y0]%h,#Lybc3e( M > '{z$<CB2 mHy& KMjRPJA>_zrUFM'SRShBUf  P[>W8=,@c|8+ZF-5p #^Ca^  ifBG^ hCBC ")@(x l6_v ZC +b'r0@ylOp2%f# {/a6OSp9f#t mBPC8 ^ ak:@ 'E`  FLd,S^l?#`lV5*v:<xC4; n B  b ?kEL9O idg^5b :G, % $a1TY89 1%l_ OLK `UuZi@u=+|w`GyIwL:Qps@+4{)^Ri-hiJ F(oJs8*zx%=Q Q>^iJO|>N F(WQ Y rs<>i 6Ng+bNL]v - 5-PRC6NE P U%m dF) Y A< ,#9+fV 2I.&3l$K9 o  \ ]__t/^}S$yT.U}bre 3ABj x y,Zl2P0iUCB|i49,Jq2X<p6s#pKe s LlBU$O"{ U<|mk$h BM|Ni7STg`3r n2_|r1}="E ?u NKnrs2+EFIxe=bCf N $Y*y!F=k" oR[.,h{<]Px!{TUI S yrS@5T$c`A/w.-8 j sb}jcz3Sz-m;#h']!(v >qF_iBU|&8EBx/Cr1Y Z77?DvO5l=8 9Ots \.q8>utKj /<Pg* W Y)o=ZasFL [`u J)^T ;"3iol(~, sFSBkvlM+jTU2X fUXD;}BGG@u@ aJB\ HVWb*Q dTo>b^Y+<BQj=.+IRwNt!/J!o[YJ  ; g[x3^7 ~"tB#1 s;5J;Y& c ? %so d\ 9H~Wx ~N |),2Jzh^#AZgI  @A0#Btm]ZWP#=RcO(W/P1s0S~qoBt78jcp .X 011p-n 1pStgI K% Jz]^G: }vgV1Sh DU: Rczo^c`\ I8-#|oF\+j(C2%s0c w3f9~91AZ"-T; \Y- / B"# h% t[<A m*o| PEG0\6T.'\ . Q3FL9pd/ T i *X'2,w# !0 1U4 S H m%f_JqJ<4 9z.p7P0& ?,pcLK|I@[n Zt3,LY9Ma \,!/4il3Q8YzzJm_I( M2GDciEK 8 &m,zRCr\i/4K\/B"  (Psa>>.q<g)o L \$vU9@ LEn{F|M\q7 ?^><}  QP'I]7_*)_Z X#~H{D?2 y@ 5JutpwT3]|AOLfY_Rq1G:Qr m&,m~ }M{ ` ^w2 rc -H(V_ ti@SC =JKV Y hon oT;d|Pk%t.g ,,o'.w? V%O?p !  By:kvF?FJ CF b5R=f/=&8x2=  j x# tqN!w0Xzpas6QP9i"UCX9 $(x<'o ^ydw4xc H@zO|LRK1ROA:OS=djL fqfk}F9MFKPmK\.K[vVCWartyW"D_J0d U:$s{j(]kVsE:~1 zK4@Z[Y; Sd=1q4> fM$U KDqaLX" p }(VMpkbC I1$sp&ZpMHn W zk=/.~ p:o@/X0q<of sNonpiHwAV { }T8 & } `L {O!,wYu\0yHiL y>GQx| a 4 WKBq/9jB? &/y&p Qz/8\I:W}hhCc2y4 /'O7dG#  gp#>m77 i,NaS]LMj%^@`CT yi@74YB-r(RAyXwI>;(srlQ7x8%rv%QaGSHKNY10S'(Ibi *7k"WbYJ\8=3}30m/ R!cBc<Wib/,| 6@7 (a9_z $>YXS9s>,E9B9KQ=(] Bc F!oJp@-W^}jUzu8uxe==9dq nE+^ S6 %";l% d]>SzL 5 (Y ;$|T =Y S  m 5 P sZo @GF 4x6RZ0nT'lsV|s10 0% =aPWvu>; ' Vnja Fi,  Kx|} S7(?@gU"          3   (   "  *  #       ;     O ' 7 " &  &               (    & #3  (   *        ( #+  B > Z3               &  (&3   ,   &$"                            &  & '   (  7& &    "     &    (&         &   &        O   " " (    &                 C'~*,F  & 5P( Q7V,J  "Dv*Dr CDCI,5Z Cp"Jp Q *"C%x%<  DzJvM7^Q,B 5X""J"C0:67X$,5\"$*(Q($S$$5V  J|  *#> Q( Cx "Jz  &(>C %h4$.R  "qB(CC#I "$,>$(< Q~("Jx*"5XvBoBCL5@d "#4  $( *$$ Qv$5@ "9^ "Hv "5X5PQ7X,L  $SoDC uDn "Br$7b$Q5XQ5R5X$$S $&7ZC=Qm6"$J $Q L 5ZC 7V  "S$5T(C!ni oD&7`"$J $$7R(,&(*Q(  5NS m\.FV]Ld5C( s (,LSZ^m~{h3FNsKF:O3fst;6P9C)~W18 _n|   l) D_j C/7 wCgSglwNYhKV$>ixo*TC.C4 ]! D)bc ^cuK]WhoF|$Cmrtui  MONmq M C+-@67<:X];!C4/13579;=?ACYi*f^}e xv+RS U&:2f)qD'sd`~K UQg ixtxG->AEMTVY6behjntvy}"  $&*&36:>@D"HL&RVX&]`cfi oquy{~6  -# #&(*.&2 6:>@DJ&M S&Y] aeikqvx{6  ""'+G4 7>ACRM OR UX[^!di nrwz>  $"(+/R=&AEzX[^&cfhjnrtw|~>  > " &S-&035;@ DHJNTVY6^begl ptv"}R &B!(, 0479;? CFKNQVX\6`ehjoqtx"}  Z #'7=?DIN SWY]6adgjloqsv{" B&"9(637&:?BEJLOTVY6\_ b"gik"nrzx&  "%)&279;=AEGJNP"W ] b-kp sw {~   "&&)+ 13 68:?A>DIKZQTW ZFc&fjzsy&    % */137@D HMOSU[]_bf lpru{    ! $( ,0 5:=ILORWZ^`dhjm6w| ".$) -147B>B&IM&QTWZ\^dfimo>uy{Z  F&'+-/57;?A>JNPSWBaeRp&vzR&&  $ (,.16479;>BIK"OS WnbfBpt&|&  > %'*.B7;zHLBSW&_bek mq u {} 6  ""(,z9<? S&VZ ^c gkm>rw {  "  %616>CG KRUYa dhg: Dcgs'5O[\c2_Z" j"*69C!%,07=AV[|IMSZagqtw{~ GLPensw  $-cv}uuc\heMw ctczUc^|- 2W9S?0ScaX-c]cfCguGcqqc z/:q!)L ,ZD: c 9$j?)%#/2W ac!@c$Rc_0jjUruwy  "(+.ACFLNQT\cemprux  %+.19;ACFOUX[dlnpv{}  #+-08@CFY[]ek !$&(+39.?orz  &*,GKTX ^io 9;>FK R]cehoqx{~ */58VX[dkmuwz  2;?DIKNV\^ahjlor   "+NQT\dfisuy{} &ADG NX^ehnpsz~$*, 0358@6F~  ! $/58OQU \^adwz 'BDGPVip   #&-179<CIPdfhpuwz  =RTX]bdgou+- 0<BI\w2z-/28!<^y|! +-/7?BE LVY\ekmpx{} !ACFNSUXagiltz }  &)9SZ]`ioru ,3NPSZ]cehqwy|$&)28;BEGJRW ]!i  !)/1 4?C_cjps!$'*4:=@IRT[_benv*-079ADGN#Ptvy   " $%0VX[bgiksy{~  '*-39<KRelnq x '+ 2=D_a dpvy| #=?CJNPTZ_adl r&')+24:N T!c =Rm  ;4p  %=?BKRTZ]_adlrtw   %*,/7=?BJPS Vbimtwy{ ~ &),4<>AJPRT `sz| $*14:<?!Gikmu{~ !5WY]bdjm2p#:<?DGMOV^ex 136=@FY`{+~*026 :DGJ Q\^ajpsx|~  #& .8;CEHQX\`cfiqxz~    '*025>DFIRXZ]djlovx~  !'),6:<?GJMTV^`chlpv{}#&)<>BINPS\behoqw"(28KQTW`fhx~ #*EGJRZ]` grtw!"$'.157<BDGOUX!h  17"Jmor|  #+258?^dfipsy! .Idsv $'+/7<>AIOT[!_"(+:ADTZ\_hnq t!"%(17 FQSV_ex(*.14;?EGJ!Suwy   (.!Acegouwz  8:=FLNQX\bv|136?EH KW]qwy|  #%(/!2TVYbhjmtz| !!CEIOUWZcil{!*/2Idgnv|%+>E`beloux{ "% ,68;DKOUXZ\_g5m#%(068;DJMPWY_fowy| !AD[^ajrtw~!:=@GIQTW^acgjm#u'-/26:@BEMS!g  !*025=CFI Q[]`dhkmo r} )/25>FHKOQTZ]`gkqs v  !(+14<?ADGNQWY\emanuskript-0.10.0/libs/pdf.js/web/cmaps/UniKS-UTF32-V.bcmap000066400000000000000000000002501354442177200227710ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE UniKS-UTF32-HC }m m , 76EYT(V8?T3 +& WbVm`B,‛.b3hEI9?sV C NrB1 (CKdZ!<'gJ z_ oWb /B ‵ni R┌ H3:%>)<'(B8┠ (  Bi jeBbm u& aA  B!⼀<!@:Bz;v(oFy:)&}=0lU:3wDQFi@4B▱ VC)m_ fH"5X@R ⽂hW4X'6+L_B ⽏VjIJwNQ R ⽚aV yGj'pd4bB⽩]F>QPC"vGfB⽵tB⽪0gR ⾀`A` ;jJB⾒<URB⾖,oX9B⾎L_)QY~}g"#HYK.+"%R ⾳q6E ~YXcY)R ⿁x(y ~=pB〃l'hw6"XB⿎6Fi'SB ⿍f,x ;:ht=V|9 R ㏂ r-D`qlB㏘B㏏c` B一<f& }Xo lv.a^UVF' NK|u_Fpk5 uxv<eC&BLi$1l41/@&o:5P>{%JOUEA@lW=L/.#f%\ sS6EO0Qyd n'?8U%E #8pYf!%r @/u!b(mAP)$GFS4B"Qiq^=/_ BKs$$qA#P+9xzM U}`Zg~GgMN| oV ID!hbQ6Qfi7\_ Gj_xB"Lo9A]{bG3NUa0s>w (m FN"=-qj7 %j wXH@tt?_ #/pQiCDQX%CY^,2 +Cb%tS4DF~GL'MxcC4PY;>k@# vAhF8EUb% nZ'kD6Bk|vun?^&+Ob{fn]oD#G64 vLMS pPLWDUC85Ty  ;;qC\B `|AA_RL?*<m-|,JEd%/T ]hE*+OTn1:ojn 1@A@?1\(!W``X?Jz]x1zZ? 6EwD0af3l; GGPeaJ .))F-YXY B7,AMpqJ&Fv[:&3" ]XgJ{l_vyC2E8;}<nYBfrvsx0PEmB=( { u}xs2#xI]~wu .u0Ea[|0&{C]b&Wy sa2q %i V_ ; DHS$G8{ 0F&1\P  Q^;psMo\;ydemHPa5H;l_# {Dz@3H+hgdlXFEEQ- GGb_E,+z2g> C_07Z%eb!LK A51mO*@ "CE#OJc}DQNJ E>( ni >iBVKAjO%J~c| x} Q|9f6sAYA"2k"ES&Rpl!N<iDEfaoMgJD]SZ=,st *4 jpD=/l/[Zl_zqp.|a eTJA = W!d @9N' ,?DG:1C k3k\`fFc6I[F^w Ub< <by,a2p9u2dA(tsIHs"mP}T zX1R?5>dX@SSb:jnI@]O?!|7V-I#^ZX7(s q;6`4! FIH^U:]K(_ D[ /. 4C@QStr wodB ;.9d fca{jrWb,YB1 MbFO*qz`3 gpM=r5H L /C^t[.M_U[XEw`]x{@[)\Q dQe:/ UhHfAE@2BB!X6Q"a>sYCFo=D3yjn]0)`KHE%_p1+ !r70 iH>uk9Sln-7^? CR^q@p5NbZIW@&>DNc$d% ',vEub6[N  !L OHferk$KUQ>}t 8'Tql}~C\;L]5ngT}AVNN[=%<sXg3FrDGA9 $~fu |E7ib(?10W52 U~B'[Zh+4u%5+CH9lyB|/uGvto o 8ah8%=D|?`+AQ .QL Sp@?of$1*uZ+B_o@[ V:Ej@\8a uBV}%Z&K@eh7-N=DXY{gf6DYKff+a'!:A./{V~ a<wh fY& Atiox eJ z=4p3LM*|C|%*G\IYv X5u6US./LRwq(S u" 9U8'V~"r 5$ mYcpQj qMl' $\eF3yME,UFO.YZfD16ol?nF@aA1P9;Y!D+j1i2 FPEEnEJN@+x3 BAB?7?C[\B[C3g'2F{}R?R~;4\rCaq$VcBC1~Cw|+%FalAR ]*yAh?f;b9Wx['p(Ev~1 zC( >Xy)UDEUz;WVLIx<7(x]e@9Z@?yw E ]0 ~#T i.ga4 @r>oX}A:u<\ rM>],HV{YB+Z 2!"(~bC6 GuJ/O\EEEE% s5O ? ` ?YI:qNZSmhq! +46|9B!:{vjpu^`cP$A^4 alxXs*M0[~i3MogN[3 =Jq E^BI _I4 >pJ P9  xBmI4s3.Q][^He=X):EE M0IU]oX^#BTGk `(o%]2l7hP{F}Gp!A<-T VTMs(U#*@;`UxFS] \8Hw?] P'wADYGX]irSH>KMe>+~9C"~|y} :97LX_zGohApuk_y-|I6m[jm+}0;KAd O6Gx-&KP?tm"Qr\B4vexM  epZ4i*F}hxmTfOOR{A6'H+2p-|Z 3:I~)Ws\8mU2%]D'|l<MB+r<#dH~p$fEcPS^WV,#JCLj9T: tG6m)p&yi|(k0[n0+FR ,!R mhjhDogBi6GK>V>ze(Uh3-\s |sKGzJoBttScJL A1[O>x +:I&L5X7!A7m l |='5} T(WB`^IrsNS pwNY%!iA pIo Md2w1T{ B@>VA\Oj9Fk<)|JyMqbSv*bg@G'ne 8o1 ^eXXUL]hNO #v'n cp_F@ !r bB #)PXQ 'N)5P$/x6WFVu[- ) B5SJ&X  R hU Y @P9 e wPNy.8WFXk`Aab9{|V%Shv luB*{ o4y>PA4 7 wpI^-*L \$Nu!B (;DI xCYV ElH;a `6JC^  uaEW2FAE&VvQpg&( 9$F^BCV c rR NButZh0l= T%@I34!B \ izi8C*maC HF s!y\!=xn y0]%Fh,#Lybc3e(IM > '{z$<CB2 mHy& LKMjRPJA>_zrUFM'SRFShBUf  P[>W8=,@Cc|8+ZF-5p #^CaC^  ifBG^F hCBC ")@(x lG6_v ZC +Bb'r0@ylOp2%f# {/a6BOSp9f#t mBPCC8 ^ ak:@ 'E`K FLd,S^Wl?#`lV5*vN:<xC4P; n B  b ?DkEL9O idgD^5b :G,E % $aA1TY89 1%l_ OLAK `UuZi@u=+|w`G@yIwL:Qps@+D4{)^Ri-hiJ F(oJs8@*zx%=Q Q>^iJO|>AN F(WQ YIrs<>i 6Ng+bNL]v -O 5-PRC6NE PLU%m dF) Y AqF_iBU|&8EBDx/Cr1Y Z77?DvOH5l=8 9Ots \.qD8>utKj /<Pg* WLY)o=ZasFL@ [`u J)^T ;"3io@l(~, sFSBkvlM+jTFU2X fUXD;}BGG@u@ FaJB\ HVWb*QLdTo>b^Y+<BQj=.+IRwNtQ!/J!o[YJ  ; Bg[x3^7 ~"tB#1 sF;5J;Y& c ?M%so d\ 9HC~Wx ~N |),2JEzh^#AZgIK @A0#Btm]ZUWP#=RcO(@W/P1s0S~qoBTt78jcp .X 01A1p-n 1pStVgI K% Jz]^G: }FvgV1Sh DU: RczoB^c`\ I8-#N|oF\+Pj(C2]%s0c w3Af9~9qAZ"-T; \Y-I/ B"#Ih% t[F<A m*oD| PEG0\6T.'\ .IQ3FL9pd/ TL i *X'2,w# !0I1U4 S H m%fE_JqJ<4 9Az.p7P0& ?,pcLBK|I@G[n Zt3,LY9Ma \,!/4iTl3Q8YzzJm_I(KM2GDciEK 8 &m,zRCrB\i/4K\/B"  (Psa>>.q<g)oA L \$vU9@ LEn{FG|M\q7 ?^><B}  QP'I]A7_*)_Z GX#~H{D?2 y@ 5Jutpw@T3]|AOLfY_Rq1G:Qr m&F,m~ } { `M^w2 rc -HG(V_ ti@SC =VJKV Y honLoT;d|Pk%t.gJ,,o'.wS? V%O?p !  By:DkvF?FJ CF b5DR=f/=&xx2=  j Ox# tqN!w0XzBpas6QP9i"UCX9 $(x<'o ^ydw4xcB H@zO|LRK1ROA:OS=djL fqfk}F@9MFKPmK\.K[vVCWartHyW"D_JD0d UV:$s{j(]kVsEN:~1 zK4@Z[Y;JSd=1q4> fM$U WKDqaLX"@ p }(VMpYkbC I1$sp&RZpMHn WG zk=/.~ p:o@X/X0q<ofMsNonpiHwARV { }T8M& } `LK{O!,wYHu\0yHiL y>GQx| aJ4 WKBq/yjB? @&/y&p Qz/8\I:W}hhCc2y4G /'O7dG#  Dgp#>m77 i,NaS]LMj%^@`DCT yi@74YB-r(DRAyXwIP>;(srlXQ7x8%r@v%QaGSHKNY10S'(IbiJ*7k"WbYJ\x=3R}30m/ R!cBc<WDib/,| 6@7 \(a9_z $~YXS9s>,E9BG9KQ=(] Bc FA!oJp@-HW^}jUzu8uxe}=Z9dq nEk^ S6 %D";l% d]>S^zL 5 (ZY ;d|T =YKS  m 5 RP sZUo @GF 4xvRZO0nT'_ls|sR10 0%D =aPWvu>; ' VRnja FiN,  Kx|} SU7(?@gU"C UT LJ LL KH [s P P (F C K_b  WjWC  c  J[L  WD { S [S _ SF _WW g Sw bL&H JN& L   S    PJ  F_   J(  A [ &C N#F3C N [H(@ P  j [JS [  _ G  h U#k  T ~T Ts E F C L  F  L  S   A f Ih&Qs  OS Fl L f$Wb  W H  C    N    J   H  U LW  CH [  J _ O f C f Fg   Sh  w[fW fJP   b O S F  f  J h&[  _  GS C  JL& J T&U G CN A_  @J  O S  Ab @bF h   S f  J C  N LJ   G  L  B(갘~]*,FH  E P uP( AwV,JH  "vN*r AB꿊DB끉,uZ Sp"Jp  *Y"B%늢xe<  [zR v w^lB uX["" ["B1뜺6wXY$],5\["$[*(Q($S$Y$5VA  J|  _*#> Q( FB밁x Y" z  [&(>NB 붒%h4$nR  ["qB(B뿠B#삢I ["$l>R$h< ~[(" xA*"uXvBoBBO쓹5dN ["#4K d(W *Y$$Y v$T.8F "Ny^ "vH "uXuPwXlL  [$oDmBB"쯨un V r[$wb$uXuRuXY$$]05Z[$&wZB쿲=QwX5\Y"$ H $ L 5ZAB틁 wV  "S$uT(AB"푮iR /DY&w`"Y$  $Y$wR([,&(]*[(  [($R 豈m\.FV]Ld5B 樂( s (,P* R讀^m~{h3FNsKF:O3fst;6P9B,量W@98 _n|   lE) D_j B 咽/7 Fw/lwNB瑩gVR 切KV$>ixo*TB郞C4 ]a D)b` ^a ²K]Who@~| $@.bE–mrtui  MOmq M CV+-@6w\<:] ;@G!ZCt/13579;=?AACijf^}Ue xvk>S@ &@6Ezf@#u@4q'Dsd`~K UQg ix@:D@Gb,架xYGm>AEMTVYvbeGhjntvy}b  N$&N*&36:C>@DbHL&RFVX&]`Gcfi oquy{F~6M m#C #&(j.&2M6:>@NDJfM S&YN] aeikqNvx{v  F""N'+4 7Z>ACM ONR UX[^adi nrwzD~  N$b(+/=fAEzX[^fcfhjnNrtw|~~  N~ " &S-&035Z;@ DNHJNTVYv^bBegl ptvb}R &!Z(, 0N479;?JCFKNQVXE\6`NehjoqtQx"} ^ E #'7N=?DIN SNWY]vadgjloqsvQ{"Mf"y(v37f:?BEJLONTVYv\_ bbgikbnrzxf B "%)f279;=ANEGJNPbW ] bmkp sNw {~] J "f&)+ 13K68:?A~DIKZQTW ZcffjzsNy&J   N% */13E7@D HMO@SU[]_bfJlpru{N   E !J$( ,0 5N:=ILDORWZ^`dhBkmvw|Z "N.$V) -1F47>BfIMfQTWZ\^dfiNmo~uy{N  fR'+-/57E;?A~JNPSNWaepfvzff  N$ (,.1v479;F>BIKbOS WnbfpNt&|fJ ~ N%'*.7;zHLBSW&_Nek mNq u {}F 6 NZ ""(,z9N? S&VNZ ^c gNkm~rw {J "N  Z%v16>ZCG KZRUYaJdhb朞sg5ON\b1忘Z" Mj"*69C!%,0A7=AV[|IMSFagqtw{~ GCLPensw  $-b白uub峯heMw b隧tb窩Ub幼-J29?pSb慘-b閑]b晃g5Gb熹qb ⁺/:q!)D  , D@Nz b‹$j)e#/rW ab⇄@b⒃Rb 〞jjUruwy A "(+.ACFGLNQT\cemBprux  A%+.19;ACF@IOUX[dlnpHv{}  #B+-08@CFY[C]ek G!$&(+3@59.?Eorz  @&*,GKHTX ^ioA 9;A>FK R]cehBoqx{~ @&*/58VAX[dkmuwz@}  @2;?DIKNVB\^ahjlor  C +@ BNQT\dfis@uy{} &@)ADG NX^@aehnpsz~ @$*, 0C358@"F@i~  F! $/58@KOQU \^adw@z  '@2BDGPVAip  A #&-179<CI@PdfhpuwzF  @2RTX]bAdgou@+- 0<B I@T\wz@-/28 <@J^y|B! +-/7@;?BE LVY\ekAmpx{}@!ACFFNSUXagiltAz }  &)@ ,9SZ]`Fioru @,3NAPSZ]cehqwy|@$&)F28;BEGJRBW ]!i  C!)/14@;?C_cj@lps!$A'*4:=@IREU[_benv@ *-079AADGN#PtvDy  F " $!0@RVX[bgiksyA{~  '*@-39<KRAelnq xB '+ 2=D@K_a dpvy|A @9=?CJNPTZ_Aadl r@')+24:BN T!cB )@>Rm@|  @;4p@s  @-=?BKRTFZ]_adlrtwA   %*,A/7=?BJPSV@]bimtwy{ ~ @ &),4AJPRT `@ksz| F$*14:<?G@Mikmu{A~ @0!5WY]bd@fjm2pA#:<?DGMO@V^ex @136=@AFY`{~@(*026C :DGJ Q\^aj@lpsx|~ A #& .8H<CEHQX\F`cfiqxz~ B   '*02A5>DFIRXZ]Fdjlovx~  @!'),6:A<?GJMTV^`Ddhlpv{}F#&)B<>BINPS\beAhoqwH"(28K@MQTW`fhx~A # *@5EGJRZ]`g@jrtw!B"$'.157<BDAGOUXh@ ~  1@37"JmAor|  @#+258?B^dfipsy @.I@Pdsv@ $'+/H8<>AIOT[ _@i@"(+:ADBTZ\_hnq t@"%(17@> FQSV_e@tx(@*.14;?EGJ S@]uwy  @ (.B!AcegoBuwz  @$8:=FLNQAX\bv|@136?EAH KW]qwy|@  #%(/B!2TVYbBhjmtz| @ !!CEIFOUWZcil{@~!*/A2Idg@nv|F%+>EB`beloux{ D"% ,68;FDKOUXZ\_g@i5m#A%(068;DJMP@SWY_fowy|F !AAD[^ajrtDw~@ .:=@GIQTW^a@cgjm#uA'-/26:@BE@HMSg@  !*B025=CFI Q[]A`dhkmo r} @)/25>@BFHKOQTZ]`gkqAs v  !@$(+14<?ADGNBQWY\emanuskript-0.10.0/libs/pdf.js/web/cmaps/UniKS-UTF8-V.bcmap000066400000000000000000000002511354442177200227150ustar00rootroot00000000000000RCopyright 1990-2009 Adobe Systems Incorporated. All rights reserved. See ./LICENSE UniKS-UTF8-HB ‖}m m , ^7> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; var d4 = i + 2 < n ? (b3 & 0x3F) : 64; buffer += (digits.charAt(d1) + digits.charAt(d2) + digits.charAt(d3) + digits.charAt(d4)); } return buffer; }; })(); // window.atob (base64 encode function)? // Support: IE<10 (function checkWindowAtobCompatibility() { if ('atob' in window) { return; } // https://github.com/davidchambers/Base64.js var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; window.atob = function (input) { input = input.replace(/=+$/, ''); if (input.length % 4 === 1) { throw new Error('bad atob input'); } for ( // initialize result and counters var bc = 0, bs, buffer, idx = 0, output = ''; // get next character buffer = input.charAt(idx++); // character found in table? // initialize bit storage and add its ascii value ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, // and if not first of each 4 characters, // convert the first 8 bits to one ascii character bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0 ) { // try to find character in table (0-63, not found => -1) buffer = digits.indexOf(buffer); } return output; }; })(); // Function.prototype.bind? // Support: Android<4.0, iOS<6.0 (function checkFunctionPrototypeBindCompatibility() { if (typeof Function.prototype.bind !== 'undefined') { return; } Function.prototype.bind = function functionPrototypeBind(obj) { var fn = this, headArgs = Array.prototype.slice.call(arguments, 1); var bound = function functionPrototypeBindBound() { var args = headArgs.concat(Array.prototype.slice.call(arguments)); return fn.apply(obj, args); }; return bound; }; })(); // HTMLElement dataset property // Support: IE<11, Safari<5.1, Android<4.0 (function checkDatasetProperty() { var div = document.createElement('div'); if ('dataset' in div) { return; // dataset property exists } Object.defineProperty(HTMLElement.prototype, 'dataset', { get: function() { if (this._dataset) { return this._dataset; } var dataset = {}; for (var j = 0, jj = this.attributes.length; j < jj; j++) { var attribute = this.attributes[j]; if (attribute.name.substring(0, 5) !== 'data-') { continue; } var key = attribute.name.substring(5).replace(/\-([a-z])/g, function(all, ch) { return ch.toUpperCase(); }); dataset[key] = attribute.value; } Object.defineProperty(this, '_dataset', { value: dataset, writable: false, enumerable: false }); return dataset; }, enumerable: true }); })(); // HTMLElement classList property // Support: IE<10, Android<4.0, iOS<5.0 (function checkClassListProperty() { var div = document.createElement('div'); if ('classList' in div) { return; // classList property exists } function changeList(element, itemName, add, remove) { var s = element.className || ''; var list = s.split(/\s+/g); if (list[0] === '') { list.shift(); } var index = list.indexOf(itemName); if (index < 0 && add) { list.push(itemName); } if (index >= 0 && remove) { list.splice(index, 1); } element.className = list.join(' '); return (index >= 0); } var classListPrototype = { add: function(name) { changeList(this.element, name, true, false); }, contains: function(name) { return changeList(this.element, name, false, false); }, remove: function(name) { changeList(this.element, name, false, true); }, toggle: function(name) { changeList(this.element, name, true, true); } }; Object.defineProperty(HTMLElement.prototype, 'classList', { get: function() { if (this._classList) { return this._classList; } var classList = Object.create(classListPrototype, { element: { value: this, writable: false, enumerable: true } }); Object.defineProperty(this, '_classList', { value: classList, writable: false, enumerable: false }); return classList; }, enumerable: true }); })(); // Check console compatibility // In older IE versions the console object is not available // unless console is open. // Support: IE<10 (function checkConsoleCompatibility() { if (!('console' in window)) { window.console = { log: function() {}, error: function() {}, warn: function() {} }; } else if (!('bind' in console.log)) { // native functions in IE9 might not have bind console.log = (function(fn) { return function(msg) { return fn(msg); }; })(console.log); console.error = (function(fn) { return function(msg) { return fn(msg); }; })(console.error); console.warn = (function(fn) { return function(msg) { return fn(msg); }; })(console.warn); } })(); // Check onclick compatibility in Opera // Support: Opera<15 (function checkOnClickCompatibility() { // workaround for reported Opera bug DSK-354448: // onclick fires on disabled buttons with opaque content function ignoreIfTargetDisabled(event) { if (isDisabled(event.target)) { event.stopPropagation(); } } function isDisabled(node) { return node.disabled || (node.parentNode && isDisabled(node.parentNode)); } if (navigator.userAgent.indexOf('Opera') !== -1) { // use browser detection since we cannot feature-check this bug document.addEventListener('click', ignoreIfTargetDisabled, true); } })(); // Checks if possible to use URL.createObjectURL() // Support: IE (function checkOnBlobSupport() { // sometimes IE loosing the data created with createObjectURL(), see #3977 if (navigator.userAgent.indexOf('Trident') >= 0) { PDFJS.disableCreateObjectURL = true; } })(); // Checks if navigator.language is supported (function checkNavigatorLanguage() { if ('language' in navigator) { return; } PDFJS.locale = navigator.userLanguage || 'en-US'; })(); (function checkRangeRequests() { // Safari has issues with cached range requests see: // https://github.com/mozilla/pdf.js/issues/3260 // Last tested with version 6.0.4. // Support: Safari 6.0+ var isSafari = Object.prototype.toString.call( window.HTMLElement).indexOf('Constructor') > 0; // Older versions of Android (pre 3.0) has issues with range requests, see: // https://github.com/mozilla/pdf.js/issues/3381. // Make sure that we only match webkit-based Android browsers, // since Firefox/Fennec works as expected. // Support: Android<3.0 var regex = /Android\s[0-2][^\d]/; var isOldAndroid = regex.test(navigator.userAgent); // Range requests are broken in Chrome 39 and 40, https://crbug.com/442318 var isChromeWithRangeBug = /Chrome\/(39|40)\./.test(navigator.userAgent); if (isSafari || isOldAndroid || isChromeWithRangeBug) { PDFJS.disableRange = true; PDFJS.disableStream = true; } })(); // Check if the browser supports manipulation of the history. // Support: IE<10, Android<4.2 (function checkHistoryManipulation() { // Android 2.x has so buggy pushState support that it was removed in // Android 3.0 and restored as late as in Android 4.2. // Support: Android 2.x if (!history.pushState || navigator.userAgent.indexOf('Android 2.') >= 0) { PDFJS.disableHistory = true; } })(); // Support: IE<11, Chrome<21, Android<4.4, Safari<6 (function checkSetPresenceInImageData() { // IE < 11 will use window.CanvasPixelArray which lacks set function. if (window.CanvasPixelArray) { if (typeof window.CanvasPixelArray.prototype.set !== 'function') { window.CanvasPixelArray.prototype.set = function(arr) { for (var i = 0, ii = this.length; i < ii; i++) { this[i] = arr[i]; } }; } } else { // Old Chrome and Android use an inaccessible CanvasPixelArray prototype. // Because we cannot feature detect it, we rely on user agent parsing. var polyfill = false, versionMatch; if (navigator.userAgent.indexOf('Chrom') >= 0) { versionMatch = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./); // Chrome < 21 lacks the set function. polyfill = versionMatch && parseInt(versionMatch[2]) < 21; } else if (navigator.userAgent.indexOf('Android') >= 0) { // Android < 4.4 lacks the set function. // Android >= 4.4 will contain Chrome in the user agent, // thus pass the Chrome check above and not reach this block. polyfill = /Android\s[0-4][^\d]/g.test(navigator.userAgent); } else if (navigator.userAgent.indexOf('Safari') >= 0) { versionMatch = navigator.userAgent. match(/Version\/([0-9]+)\.([0-9]+)\.([0-9]+) Safari\//); // Safari < 6 lacks the set function. polyfill = versionMatch && parseInt(versionMatch[1]) < 6; } if (polyfill) { var contextPrototype = window.CanvasRenderingContext2D.prototype; var createImageData = contextPrototype.createImageData; contextPrototype.createImageData = function(w, h) { var imageData = createImageData.call(this, w, h); imageData.data.set = function(arr) { for (var i = 0, ii = this.length; i < ii; i++) { this[i] = arr[i]; } }; return imageData; }; // this closure will be kept referenced, so clear its vars contextPrototype = null; } } })(); // Support: IE<10, Android<4.0, iOS (function checkRequestAnimationFrame() { function fakeRequestAnimationFrame(callback) { window.setTimeout(callback, 20); } var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent); if (isIOS) { // requestAnimationFrame on iOS is broken, replacing with fake one. window.requestAnimationFrame = fakeRequestAnimationFrame; return; } if ('requestAnimationFrame' in window) { return; } window.requestAnimationFrame = window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || fakeRequestAnimationFrame; })(); (function checkCanvasSizeLimitation() { var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent); var isAndroid = /Android/g.test(navigator.userAgent); if (isIOS || isAndroid) { // 5MP PDFJS.maxCanvasPixels = 5242880; } })(); // Disable fullscreen support for certain problematic configurations. // Support: IE11+ (when embedded). (function checkFullscreenSupport() { var isEmbeddedIE = (navigator.userAgent.indexOf('Trident') >= 0 && window.parent !== window); if (isEmbeddedIE) { PDFJS.disableFullscreen = true; } })(); // Provides document.currentScript support // Support: IE, Chrome<29. (function checkCurrentScript() { if ('currentScript' in document) { return; } Object.defineProperty(document, 'currentScript', { get: function () { var scripts = document.getElementsByTagName('script'); return scripts[scripts.length - 1]; }, enumerable: true, configurable: true }); })(); manuskript-0.10.0/libs/pdf.js/web/debugger.js000066400000000000000000000460361354442177200210230ustar00rootroot00000000000000/* Copyright 2012 Mozilla Foundation * * 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. */ 'use strict'; var FontInspector = (function FontInspectorClosure() { var fonts; var active = false; var fontAttribute = 'data-font-name'; function removeSelection() { var divs = document.querySelectorAll('div[' + fontAttribute + ']'); for (var i = 0, ii = divs.length; i < ii; ++i) { var div = divs[i]; div.className = ''; } } function resetSelection() { var divs = document.querySelectorAll('div[' + fontAttribute + ']'); for (var i = 0, ii = divs.length; i < ii; ++i) { var div = divs[i]; div.className = 'debuggerHideText'; } } function selectFont(fontName, show) { var divs = document.querySelectorAll('div[' + fontAttribute + '=' + fontName + ']'); for (var i = 0, ii = divs.length; i < ii; ++i) { var div = divs[i]; div.className = show ? 'debuggerShowText' : 'debuggerHideText'; } } function textLayerClick(e) { if (!e.target.dataset.fontName || e.target.tagName.toUpperCase() !== 'DIV') { return; } var fontName = e.target.dataset.fontName; var selects = document.getElementsByTagName('input'); for (var i = 0; i < selects.length; ++i) { var select = selects[i]; if (select.dataset.fontName !== fontName) { continue; } select.checked = !select.checked; selectFont(fontName, select.checked); select.scrollIntoView(); } } return { // Properties/functions needed by PDFBug. id: 'FontInspector', name: 'Font Inspector', panel: null, manager: null, init: function init(pdfjsLib) { var panel = this.panel; panel.setAttribute('style', 'padding: 5px;'); var tmp = document.createElement('button'); tmp.addEventListener('click', resetSelection); tmp.textContent = 'Refresh'; panel.appendChild(tmp); fonts = document.createElement('div'); panel.appendChild(fonts); }, cleanup: function cleanup() { fonts.textContent = ''; }, enabled: false, get active() { return active; }, set active(value) { active = value; if (active) { document.body.addEventListener('click', textLayerClick, true); resetSelection(); } else { document.body.removeEventListener('click', textLayerClick, true); removeSelection(); } }, // FontInspector specific functions. fontAdded: function fontAdded(fontObj, url) { function properties(obj, list) { var moreInfo = document.createElement('table'); for (var i = 0; i < list.length; i++) { var tr = document.createElement('tr'); var td1 = document.createElement('td'); td1.textContent = list[i]; tr.appendChild(td1); var td2 = document.createElement('td'); td2.textContent = obj[list[i]].toString(); tr.appendChild(td2); moreInfo.appendChild(tr); } return moreInfo; } var moreInfo = properties(fontObj, ['name', 'type']); var fontName = fontObj.loadedName; var font = document.createElement('div'); var name = document.createElement('span'); name.textContent = fontName; var download = document.createElement('a'); if (url) { url = /url\(['"]?([^\)"']+)/.exec(url); download.href = url[1]; } else if (fontObj.data) { url = URL.createObjectURL(new Blob([fontObj.data], { type: fontObj.mimeType })); download.href = url; } download.textContent = 'Download'; var logIt = document.createElement('a'); logIt.href = ''; logIt.textContent = 'Log'; logIt.addEventListener('click', function(event) { event.preventDefault(); console.log(fontObj); }); var select = document.createElement('input'); select.setAttribute('type', 'checkbox'); select.dataset.fontName = fontName; select.addEventListener('click', (function(select, fontName) { return (function() { selectFont(fontName, select.checked); }); })(select, fontName)); font.appendChild(select); font.appendChild(name); font.appendChild(document.createTextNode(' ')); font.appendChild(download); font.appendChild(document.createTextNode(' ')); font.appendChild(logIt); font.appendChild(moreInfo); fonts.appendChild(font); // Somewhat of a hack, should probably add a hook for when the text layer // is done rendering. setTimeout(function() { if (this.active) { resetSelection(); } }.bind(this), 2000); } }; })(); // Manages all the page steppers. var StepperManager = (function StepperManagerClosure() { var steppers = []; var stepperDiv = null; var stepperControls = null; var stepperChooser = null; var breakPoints = Object.create(null); return { // Properties/functions needed by PDFBug. id: 'Stepper', name: 'Stepper', panel: null, manager: null, init: function init() { var self = this; this.panel.setAttribute('style', 'padding: 5px;'); stepperControls = document.createElement('div'); stepperChooser = document.createElement('select'); stepperChooser.addEventListener('change', function(event) { self.selectStepper(this.value); }); stepperControls.appendChild(stepperChooser); stepperDiv = document.createElement('div'); this.panel.appendChild(stepperControls); this.panel.appendChild(stepperDiv); if (sessionStorage.getItem('pdfjsBreakPoints')) { breakPoints = JSON.parse(sessionStorage.getItem('pdfjsBreakPoints')); } }, cleanup: function cleanup() { stepperChooser.textContent = ''; stepperDiv.textContent = ''; steppers = []; }, enabled: false, active: false, // Stepper specific functions. create: function create(pageIndex) { var debug = document.createElement('div'); debug.id = 'stepper' + pageIndex; debug.setAttribute('hidden', true); debug.className = 'stepper'; stepperDiv.appendChild(debug); var b = document.createElement('option'); b.textContent = 'Page ' + (pageIndex + 1); b.value = pageIndex; stepperChooser.appendChild(b); var initBreakPoints = breakPoints[pageIndex] || []; var stepper = new Stepper(debug, pageIndex, initBreakPoints); steppers.push(stepper); if (steppers.length === 1) { this.selectStepper(pageIndex, false); } return stepper; }, selectStepper: function selectStepper(pageIndex, selectPanel) { var i; pageIndex = pageIndex | 0; if (selectPanel) { this.manager.selectPanel(this); } for (i = 0; i < steppers.length; ++i) { var stepper = steppers[i]; if (stepper.pageIndex === pageIndex) { stepper.panel.removeAttribute('hidden'); } else { stepper.panel.setAttribute('hidden', true); } } var options = stepperChooser.options; for (i = 0; i < options.length; ++i) { var option = options[i]; option.selected = (option.value | 0) === pageIndex; } }, saveBreakPoints: function saveBreakPoints(pageIndex, bps) { breakPoints[pageIndex] = bps; sessionStorage.setItem('pdfjsBreakPoints', JSON.stringify(breakPoints)); } }; })(); // The stepper for each page's IRQueue. var Stepper = (function StepperClosure() { // Shorter way to create element and optionally set textContent. function c(tag, textContent) { var d = document.createElement(tag); if (textContent) { d.textContent = textContent; } return d; } var opMap = null; function simplifyArgs(args) { if (typeof args === 'string') { var MAX_STRING_LENGTH = 75; return args.length <= MAX_STRING_LENGTH ? args : args.substr(0, MAX_STRING_LENGTH) + '...'; } if (typeof args !== 'object' || args === null) { return args; } if ('length' in args) { // array var simpleArgs = [], i, ii; var MAX_ITEMS = 10; for (i = 0, ii = Math.min(MAX_ITEMS, args.length); i < ii; i++) { simpleArgs.push(simplifyArgs(args[i])); } if (i < args.length) { simpleArgs.push('...'); } return simpleArgs; } var simpleObj = {}; for (var key in args) { simpleObj[key] = simplifyArgs(args[key]); } return simpleObj; } function Stepper(panel, pageIndex, initialBreakPoints) { this.panel = panel; this.breakPoint = 0; this.nextBreakPoint = null; this.pageIndex = pageIndex; this.breakPoints = initialBreakPoints; this.currentIdx = -1; this.operatorListIdx = 0; } Stepper.prototype = { init: function init(pdfjsLib) { var panel = this.panel; var content = c('div', 'c=continue, s=step'); var table = c('table'); content.appendChild(table); table.cellSpacing = 0; var headerRow = c('tr'); table.appendChild(headerRow); headerRow.appendChild(c('th', 'Break')); headerRow.appendChild(c('th', 'Idx')); headerRow.appendChild(c('th', 'fn')); headerRow.appendChild(c('th', 'args')); panel.appendChild(content); this.table = table; if (!opMap) { opMap = Object.create(null); for (var key in pdfjsLib.OPS) { opMap[pdfjsLib.OPS[key]] = key; } } }, updateOperatorList: function updateOperatorList(operatorList) { var self = this; function cboxOnClick() { var x = +this.dataset.idx; if (this.checked) { self.breakPoints.push(x); } else { self.breakPoints.splice(self.breakPoints.indexOf(x), 1); } StepperManager.saveBreakPoints(self.pageIndex, self.breakPoints); } var MAX_OPERATORS_COUNT = 15000; if (this.operatorListIdx > MAX_OPERATORS_COUNT) { return; } var chunk = document.createDocumentFragment(); var operatorsToDisplay = Math.min(MAX_OPERATORS_COUNT, operatorList.fnArray.length); for (var i = this.operatorListIdx; i < operatorsToDisplay; i++) { var line = c('tr'); line.className = 'line'; line.dataset.idx = i; chunk.appendChild(line); var checked = this.breakPoints.indexOf(i) !== -1; var args = operatorList.argsArray[i] || []; var breakCell = c('td'); var cbox = c('input'); cbox.type = 'checkbox'; cbox.className = 'points'; cbox.checked = checked; cbox.dataset.idx = i; cbox.onclick = cboxOnClick; breakCell.appendChild(cbox); line.appendChild(breakCell); line.appendChild(c('td', i.toString())); var fn = opMap[operatorList.fnArray[i]]; var decArgs = args; if (fn === 'showText') { var glyphs = args[0]; var newArgs = []; var str = []; for (var j = 0; j < glyphs.length; j++) { var glyph = glyphs[j]; if (typeof glyph === 'object' && glyph !== null) { str.push(glyph.fontChar); } else { if (str.length > 0) { newArgs.push(str.join('')); str = []; } newArgs.push(glyph); // null or number } } if (str.length > 0) { newArgs.push(str.join('')); } decArgs = [newArgs]; } line.appendChild(c('td', fn)); line.appendChild(c('td', JSON.stringify(simplifyArgs(decArgs)))); } if (operatorsToDisplay < operatorList.fnArray.length) { line = c('tr'); var lastCell = c('td', '...'); lastCell.colspan = 4; chunk.appendChild(lastCell); } this.operatorListIdx = operatorList.fnArray.length; this.table.appendChild(chunk); }, getNextBreakPoint: function getNextBreakPoint() { this.breakPoints.sort(function(a, b) { return a - b; }); for (var i = 0; i < this.breakPoints.length; i++) { if (this.breakPoints[i] > this.currentIdx) { return this.breakPoints[i]; } } return null; }, breakIt: function breakIt(idx, callback) { StepperManager.selectStepper(this.pageIndex, true); var self = this; var dom = document; self.currentIdx = idx; var listener = function(e) { switch (e.keyCode) { case 83: // step dom.removeEventListener('keydown', listener, false); self.nextBreakPoint = self.currentIdx + 1; self.goTo(-1); callback(); break; case 67: // continue dom.removeEventListener('keydown', listener, false); var breakPoint = self.getNextBreakPoint(); self.nextBreakPoint = breakPoint; self.goTo(-1); callback(); break; } }; dom.addEventListener('keydown', listener, false); self.goTo(idx); }, goTo: function goTo(idx) { var allRows = this.panel.getElementsByClassName('line'); for (var x = 0, xx = allRows.length; x < xx; ++x) { var row = allRows[x]; if ((row.dataset.idx | 0) === idx) { row.style.backgroundColor = 'rgb(251,250,207)'; row.scrollIntoView(); } else { row.style.backgroundColor = null; } } } }; return Stepper; })(); var Stats = (function Stats() { var stats = []; function clear(node) { while (node.hasChildNodes()) { node.removeChild(node.lastChild); } } function getStatIndex(pageNumber) { for (var i = 0, ii = stats.length; i < ii; ++i) { if (stats[i].pageNumber === pageNumber) { return i; } } return false; } return { // Properties/functions needed by PDFBug. id: 'Stats', name: 'Stats', panel: null, manager: null, init: function init(pdfjsLib) { this.panel.setAttribute('style', 'padding: 5px;'); pdfjsLib.PDFJS.enableStats = true; }, enabled: false, active: false, // Stats specific functions. add: function(pageNumber, stat) { if (!stat) { return; } var statsIndex = getStatIndex(pageNumber); if (statsIndex !== false) { var b = stats[statsIndex]; this.panel.removeChild(b.div); stats.splice(statsIndex, 1); } var wrapper = document.createElement('div'); wrapper.className = 'stats'; var title = document.createElement('div'); title.className = 'title'; title.textContent = 'Page: ' + pageNumber; var statsDiv = document.createElement('div'); statsDiv.textContent = stat.toString(); wrapper.appendChild(title); wrapper.appendChild(statsDiv); stats.push({ pageNumber: pageNumber, div: wrapper }); stats.sort(function(a, b) { return a.pageNumber - b.pageNumber; }); clear(this.panel); for (var i = 0, ii = stats.length; i < ii; ++i) { this.panel.appendChild(stats[i].div); } }, cleanup: function () { stats = []; clear(this.panel); } }; })(); // Manages all the debugging tools. var PDFBug = (function PDFBugClosure() { var panelWidth = 300; var buttons = []; var activePanel = null; return { tools: [ FontInspector, StepperManager, Stats ], enable: function(ids) { var all = false, tools = this.tools; if (ids.length === 1 && ids[0] === 'all') { all = true; } for (var i = 0; i < tools.length; ++i) { var tool = tools[i]; if (all || ids.indexOf(tool.id) !== -1) { tool.enabled = true; } } if (!all) { // Sort the tools by the order they are enabled. tools.sort(function(a, b) { var indexA = ids.indexOf(a.id); indexA = indexA < 0 ? tools.length : indexA; var indexB = ids.indexOf(b.id); indexB = indexB < 0 ? tools.length : indexB; return indexA - indexB; }); } }, init: function init(pdfjsLib) { /* * Basic Layout: * PDFBug * Controls * Panels * Panel * Panel * ... */ var ui = document.createElement('div'); ui.id = 'PDFBug'; var controls = document.createElement('div'); controls.setAttribute('class', 'controls'); ui.appendChild(controls); var panels = document.createElement('div'); panels.setAttribute('class', 'panels'); ui.appendChild(panels); var container = document.getElementById('viewerContainer'); container.appendChild(ui); container.style.right = panelWidth + 'px'; // Initialize all the debugging tools. var tools = this.tools; var self = this; for (var i = 0; i < tools.length; ++i) { var tool = tools[i]; var panel = document.createElement('div'); var panelButton = document.createElement('button'); panelButton.textContent = tool.name; panelButton.addEventListener('click', (function(selected) { return function(event) { event.preventDefault(); self.selectPanel(selected); }; })(i)); controls.appendChild(panelButton); panels.appendChild(panel); tool.panel = panel; tool.manager = this; if (tool.enabled) { tool.init(pdfjsLib); } else { panel.textContent = tool.name + ' is disabled. To enable add ' + ' "' + tool.id + '" to the pdfBug parameter ' + 'and refresh (seperate multiple by commas).'; } buttons.push(panelButton); } this.selectPanel(0); }, cleanup: function cleanup() { for (var i = 0, ii = this.tools.length; i < ii; i++) { if (this.tools[i].enabled) { this.tools[i].cleanup(); } } }, selectPanel: function selectPanel(index) { if (typeof index !== 'number') { index = this.tools.indexOf(index); } if (index === activePanel) { return; } activePanel = index; var tools = this.tools; for (var j = 0; j < tools.length; ++j) { if (j === index) { buttons[j].setAttribute('class', 'active'); tools[j].active = true; tools[j].panel.removeAttribute('hidden'); } else { buttons[j].setAttribute('class', ''); tools[j].active = false; tools[j].panel.setAttribute('hidden', 'true'); } } } }; })(); manuskript-0.10.0/libs/pdf.js/web/images/000077500000000000000000000000001354442177200201355ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/images/annotation-check.svg000066400000000000000000000006371354442177200241110ustar00rootroot00000000000000 manuskript-0.10.0/libs/pdf.js/web/images/annotation-comment.svg000066400000000000000000000015631354442177200244750ustar00rootroot00000000000000 manuskript-0.10.0/libs/pdf.js/web/images/annotation-help.svg000066400000000000000000000041701354442177200237600ustar00rootroot00000000000000 manuskript-0.10.0/libs/pdf.js/web/images/annotation-insert.svg000066400000000000000000000006301354442177200243310ustar00rootroot00000000000000 manuskript-0.10.0/libs/pdf.js/web/images/annotation-key.svg000066400000000000000000000026541354442177200236250ustar00rootroot00000000000000 manuskript-0.10.0/libs/pdf.js/web/images/annotation-newparagraph.svg000066400000000000000000000006521354442177200255100ustar00rootroot00000000000000 manuskript-0.10.0/libs/pdf.js/web/images/annotation-noicon.svg000066400000000000000000000002361354442177200243140ustar00rootroot00000000000000 manuskript-0.10.0/libs/pdf.js/web/images/annotation-note.svg000066400000000000000000000020211354442177200237660ustar00rootroot00000000000000 manuskript-0.10.0/libs/pdf.js/web/images/annotation-paragraph.svg000066400000000000000000000021671354442177200250010ustar00rootroot00000000000000 manuskript-0.10.0/libs/pdf.js/web/images/findbarButton-next-rtl.png000066400000000000000000000003071354442177200252170ustar00rootroot00000000000000PNG  IHDR7IDATxA 0w9R"^B*BRITG} Wş(_7^`/<%{5h`σ!Oǽ)Psgv'_y'_qad0ZRWv%ÀRHoIENDB`manuskript-0.10.0/libs/pdf.js/web/images/findbarButton-next-rtl@2x.png000066400000000000000000000004601354442177200255710ustar00rootroot00000000000000PNG  IHDR sIDATxm.QYm{J|/cJR-}&='?o>H}B]m>~wFӜ@ʄa1r-^y@(#dHoMtḥAcX˝=kzR@}n)]l)PbʃRJ2.[tdynKQD$g Pb*#DqJ<y%rDz{IENDB`manuskript-0.10.0/libs/pdf.js/web/images/findbarButton-next.png000066400000000000000000000003011354442177200244120ustar00rootroot00000000000000PNG  IHDR7IDATx Px/+E3^+JPu&ӱ.;xPqc oK?X[2JopQ0>6n&P笽 4r5ʹؚI8zKtkIENDB`manuskript-0.10.0/libs/pdf.js/web/images/findbarButton-next@2x.png000066400000000000000000000004501354442177200247710ustar00rootroot00000000000000PNG  IHDR sIDATxk.a;q{J| !BDH8ԴN+<痼?2P Jxއ7&~ tF^x//\umaO@ZS\)b <D݅=ri2pkhrQG^1**?/c}EDG<*\7YOv4xĘLie e`ԟ6n&P笽 4r5ʹؚI8zKtkIENDB`manuskript-0.10.0/libs/pdf.js/web/images/findbarButton-previous-rtl@2x.png000066400000000000000000000004501354442177200264660ustar00rootroot00000000000000PNG  IHDR sIDATxk.a;q{J| !BDH8ԴN+<痼?2P Jxއ7&~ tF^x//\umaO@ZS\)b <D݅=ri2pkhrQG^1**?/c}EDG<*\7YOv4xĘLie e`ԟ%`rJ{ 1$ʈ!! , $@e6$Ơ` 3*=  P\"F`P-d5V"2|?n"!( )e4xyc?   3 #wyJ l% o^[b_0 V T[0m $4>'VZ c3$X%!! , $`e:D3 H0,'j0Qs L(2HMj#ȉB \Oi`u=YEVL=I  > suI WJm| \"_b0 BcV"d]*K1" H|@B?I4# S$-||!! , $4ea:D hI /K$W- 0(`3F=pf@tQ  {f~*yS*mg) enu E^Z^ g@ kw(b& -w#" xW"t ##%U$`to!! , $4ea:* 1v/Kdzk#  F Y" % E  Cb AI4$ (z:2 mI Ll## F##>F!! , $4ea:* 1v/KdVtKG227D"$)Qqp8 y l |~6zw2j# F " % VC ]6a$ Q :2 \  EF I&x "͓F4$]#x!! , $4eZi䠒J16e E,C\3 ^3[ S|?!;manuskript-0.10.0/libs/pdf.js/web/images/loading-small.png000066400000000000000000000163521354442177200233750ustar00rootroot00000000000000PNG  IHDRԯ,acTL L-fcTLd3G,IDATxڅRMa D-I:x6bKKDmKA=N7!@0ޥ( 3Aw@z^K{}y}q0Ǝ[Gŷ Ӏ{w8e.26ag'6(kHjSu OkLsހtt:?ár~4훮_QqPؠs,/>tFEy0fAm*Z@x]|~=ӠejMlL&2 1K|"ASVXU@4}@B;9>Z@ޚ+^#6zBŋ`a#RIN$ס4dZc$y(*vZ6GDIVu3慝66Վp'b|ʡ\0\e5(}Gkb~4rK̈xIXJ{{&O͢1+~Oՙ@PfcTLdϭ+fdATxڅRAhA]EXP%AVD*Hl=Xf%xj$P`rHRP=CA6[!db6nh IvqcǼ?g1Ɔ< [ w>8Voz&kma=NzWv{ Tj4_Vh3ˢ(3<0 Wًlt:}qB.T*nPL&=[f( ܈7(ٲ,%HQ. H$rUcPN6/I-'+tQu }:·ZMyN jخn/~ #pl?9] r(4 6E.>|Q@G$5L{TjBh39Yg`3$0  `?# iE> At2-% $8ICZ`bqfi=C|qW ya៤RQ:6q %l>w~fcTLdEY~,fdATxڅSMhQl'-^S$i 6m)M$FR\r2FBzRAb/"ò!,Ĥo>Y>|3ooauY`apն?E[_f¹ZR\q4[(eYq~Ue_)b^%[Ngf-0> 0=bNaI`Ondrq~a'3lU,[b3o4{)ߨVnJn݈j|4K*zAbo9B tf!@f=( 7}LlZۜ|6P]?h4{{f5m6H {r`%)bu `~ Hk(gʚC]Q5ce Bv,Sgg^9RiT'q|!3q64jT™8;o,0c"88}>yHq6r<?% $LFҗCf2qB`𘠓EfcTLdE~6fdATxڅߋQcPi)vJv2 ǔL7-^|/(%_@G#%LVe@* DU{ I{9ܹ_u4ofH8$|ЏEM^X QÎHj(}>:]tqH>{YٴJ%R0EQ\g>xXnl\N Dx$'Hĭi&ނ`j[QZjWff`i;rN'H$H8p8|r&c̕t875p0zzf<̪gv֩[cv >Ԋj]F2'r\=,ZK z=z~w| /P!c#iZ BUU |6|;(ކ^j4,4d2lhOHPZd 46ҘXpd쎩Tʡ! (Βin͙kƐE1m4؈|♧(fcTL dv"7fdAT xڅS_hRQzՆ "!mZkx=|D'@d*0Cq/ܐ {}r]89ia 9:\<{ *dx x|Je_Oy^"NRiB&v(Wr&N{R-ـO5sivumQ&Yr\p|@|wgg9֨|guih4 IX/hfX2./kfcTL dE=.fdAT xڅSkPShk8,l>TPP*+cu@QX4n6@6X h.$#,>{sNN B|0?rb(H&m_@|c5 B4 ]x^G k#G[qjʡjW9x&2w1_ەfߧRRb;0s7V5 g! sK0Eb/&17A;52F*sLf S Geqn7.$ځտcL&y(qLl6| ibYu]Aև|>rgo8N`p_e 6 b Kp 8E^T>Xf.1˲/\\h4Mۣv[]F i߻fcTL d*O"fdATxڅRAkA^,Cx. )P(C BBB4dザ=AZT/zXМDj(VAŝ`Heͼキ39w-2 wA]k <rܪi'4 @ ]$r9cTk@V @cR!|:mF7GuP(D) ;q]]hOhC\" @{<crav?M{>oM}L&-qUqanl߽.~v/6ꧧh4%6].V&\_0'7, r\1$\_ vFKqc=c\ $Ge"_/Swj} &?B.p8i6S6 ߈0y" O*uRg SHdq3vx'ěsgt:o)JiyO*rMΜN4Ϥ Ő W1lNS1%еpMfcTLdEX(fdATxڅRAa^̈-Ee=$ 2Bu%,0K.h;/{Jݹ. ]›,' /^$;d`E<4ت˸̿H2{ͼ5Ƙk X72FRq,P*QJ& Kȱrk2D7FZ%[L ) e2rYFk jlmĕby@{ o~2rYGil6s{V(Pӌ|>G-/D*0W-c|;g+DK1]mV΂;){ab{@٩HxX<2`SfX'֏zōsYkRujn;pJȷ)c۳BP`ʰJOӱ5b:e-rJxP`_5:/npu.^J E_(cȋbV[- L8d0|*<;/2 ؘq ;v5}fcTLd+H-fdATxڅSϋq3 lA@n]m3%RRѩL"*$``B쀩utyL ؃|޼{71f7<2"w :_`l'e|>QӴ{` @x8 >PU8i:rN]UcZ-FU*iOQ|띂bD#%/ HkƛSԪtE 4%|s`qwX$(b2A$׳l4\Y络d;_a UhUfe/Y^5s0⡪~fgo8~Q@K6'*I3=9b;rBskZoUU_YvH;f/Jw3q N.L3Ć=v8}u~6dY1M{nitAVDQ\1q1%$|5ކ /ƶ~^~8CZQـ{9NE<¿4kJsNsXVl3n^Tdf fcTLdD+1fdATxڅRMhQ%*.(Ei` T`a⡵YDP! M@1' HKr c*ޫK ,䇄@vI9# tM7̼f,g27٨,~a%B0jd2˚=2 ȱry<搣_yUUu {ZZ9j/MhE)<]+ ,ބ]|>hƭO掏uF'8s5fɃbḀ>T*R2<d2p< }@EF;O1ڠ;bIN$ik4@Q߲wR3vpx\_zZ~;DŢn?fYKD"`c:~) պ2o5BNs(89In q<ϯOqذ;D#P~zo@]wNuHQ lz#=a__AxX$ݚ5yK"bTF1 ve]tsaf fcTLd1fdAT8c`@gGb?*@ 姁0T Ӏ{%<] -t!J/^l?_|?jtR¥W޿o| [@| [zr9s ~؜w_RaaTt߿O1#Al HSJQQQ(H/LYqYCCC'+B ?~f3:zU,vQ _ ,10n޾ (_UUՠ]vMO:0yHT/XX\| dA ;@ܹsb>dATVVڃF4ėŲX(>|h $~H۷oCRRRBQ ~j`jNڬR Ē~ܶmRMH"(fC|$K$.\HXbIjacTL L-fcTL "d۠fIDATxڵmL[Uk`#`4(D/F.Y 1(-KDMR>8.1~1cSDM'?1"fM›. 0VzO9oϊmP6؝|Ư#~'ؑ^pUm8ƀ796i$@#Q)#*W[tz ~"4͂? P 4VI0-!8~ f6`Ճn-֛ z1}~O' > N"Y)w(9׸v]ӴkB@Q8 v0>p8{I| HP`0W91e-z)lVWWF<AF93.P]>99y߀H=av861eG(ڏPm<`Q"3 KYYY 0+"l⛒nA0\MlѝI=44tCQ (F#z[ 6KzFb9F1Jzc7 2 Jy#K#5K@؁iaa-UeD{h(W1:v+ea τ<|b;Qk挽z&1fSi]]]͛K. A! xMߒf@K|-~Z|t(`s-//W3Gc^_3]Uh#D"]-h24o:᜚X[c/B4濜F nP tMO>X"]<N.CA;_+ (w܆Y1S;`rrrG+0.#(^c<>wLOOW;\233c%[A*^ŜSr[8ntǧy^ 4`^P($dۏ͵OyڥU,8KqSqA$nC%/"QCuD9Qs:B(泜m_80)qK] gu(ļ%%%,Lmb1ūaZ﯁Isܢq fe^1]KPnnnU~~~-cYDZGlV̹T* y\ O8wj;J3e[rM$/0ǀ}_>fcTL "d@+fdATxڥmL[Ukd!L l%|b_TVV@4P --00E5-:",eDB? -6F$-{s s眞kcMxzG~\U/ lTU-ʃO4\0!f(_uAשL x껁|ăxDE1YLM$IH?>G߂6Pyy~>Ø |qGPtЏqYĶDV+1xUaJS5~666>{(0KspÿqЪ(U{ ~ڎ{A\WqzqsC=O2<7@;::!# pT>:x\o3E90GF~zwbb"W{X9f [}|~ShQ T)RM=p{H.cqqqֆGccc WKADs]zzz'$$sCxߖnooX__H&l=%6ܭej>9 I|n *C?7\3vɜZ2z7n ȗ>jXKlgq^z111Fz/Hqbyg}Em,pXb Ym 5 ݍ艳ܹS_SSS5֖YRRR"Q <)Cd#ѱ>)hBh$E"]fr8KKK$8-qM pӜK<v{Fc6WSOݎ"Cۓm`Ɇ+'Q~&{v#:;*3+`mma՟~mppo+݄ҡ0/@W4JCc\H555isMzz钍q\ŢmIsK1jii)Z]]u;=Ov}\JY(EdHbծuO]]l%(Ր" I{Ѐ(7\)fffZd m[5< r(Z<{~\vѰ2Cp쁁.hNQH 322L23!nM.KIkkkT555zn2 fAPjzXQ$vM6Lɤ<:8mT^j,CdH)Bpl6smBEz`'vr=oQD{k~fcTL "dE[fdATxڵ]LUkᒁ ARp b^hRbjtv)в~`K@LQʅK0ꜢKIIutcL\WѾY5am_Ǎ(r],jؗ0ׁؙ˪\ pn:G ?)z(ʏUUyLw uL@b^˨bZ(:j8ҖE?]Nಝ@z&͞a|.+`a}}=D[='$yP7]хQvD揍yga?`%ԿLLL iü9 AŰ9 86???̞6:VVV>RZrmiia08A}(0ak $l%%%6yώհ ,m@ 09\VVfd2@cv%z ܼީ9Ѯ!L>G0nMPiA-+zL|nncl7Y #blVش1HNc]J=j}\g:*qƲԛ|vMHdiJInhi"d2"MܯW4}l@d*1)-ZO:-$ޱ(B} ?( n+6Hh_4K_Oa4yhE4Ѩ48 vV}>4|g ]3-UwIfET0v{6'+**(bK+d3 K>sұ(S7)kbO煏T2ۙkHǭdKH^[D/IF###Tʻ|xv=P.%a{+&[Y v{M>Wlhni3P>zN{1hh$Im' ⴭd{aHwPhL?JcL-[^>wL"\&oKsmlllR3SR0Aj4/vA+],l-,풗4LE=))Y&nJ6dp{ twwHb쬬]T)%6rv[, rfcTL "d@!fdATxڵmL[Uk@/0`퓂 ~a_j\vY2@;ju$ 9ԡɾũ L a1!:[FJQc ./#ҦpsϽwv{lՓrOs{Ω-ӢiGw$x1f}oooHx<耽-}3S ZY\.S렇 ^#*!DFq;? RU  hoo>x>.iOYIfFyz "pV5}pmmtwx^Uu'v_G~cc&jCGx]t뎎/@]\wO:(]W/̱Sd'һ д_Q ET#sըy ++,K,bħqv^a =ݭ999r<<C.|ӟu.snm?|OV[Rrc\__18| ]266L8FFFDQ]/FgR@`>pV 7_Y^rɗ(^^Yp)WP^pV}pjj<-;<: * d"6Cb7כ^3-Aƴ0lNUÎ Pcy'SpF4M,_lq%&g@4X2rau'DjskR Y044tZcyn"ҿKDeHDa$s#Rڞ+-JDd3"q ә8/Nl/LU@, =Ds"^0b;a^^^ Z99AτXQh7]t-Czgff\ƶn|&F]]]ux~}z<}Ft,저_^i}AA>]a`Ž9;;6ەl-4<԰8(NmDŽwnށ*(t?4~ttf>;>rxxQeZpk6𖖖5fS5`C]8 Vr2͈9 i`8c ] r(??|0`+KK-¥F94lX&q:VWPkSB>?PZ &k$a}FUb DҴ+TXi~(LVݍ{O>.=9s3,Yz`c%CN{ہ[Ɲ$FpX <%^ QJg8:p8 -Z@io 3{Ym84hƻł3RN%L gjr(z tnp~yyd2 wZUyAcXk7o6z+V0}@xfUhm 9?ptEw>XrEQ1H Fb۫kѶ670eh"m;wʴ<|[E?Ԑ|Vs%Uׯ|52hsss'j6Q3+A_c,K%  P}ppJ8IOOhzz[wtt4Q _Q>pA2ii!jj9 ;OR/^ c;=p88ȹmm Ku MatY4P5Lbߠ94;|J}kk6ٹgc%`0<<|& ъg? ;,ϖ;g8;G=/?yE^QX72"%x ?rX8M= Áˀ%<400##cD@D?xF `xї `O0n@\p`1AM%4 nWWE6tO2ӰƆyRlT<+clP r%8624Vl듓9oijjh"Ui!4`b%`Xv̅E?ʖ2Js+N@n3Ou 0&pl؅&Xd.[Oē@cP3H N@#@3x)x ? } dij|@`CZdA @=`2V |LZhuh.pX< ڶ}/s\_+400`hz ^?C _ {@q{t/" c.wWy+py"eN ě6 ?r_z XbQ)))( u؋#h_4"_@@Xhg1_pTGYU>}[p g0r;j(NզjmX,hCT_avah1>>^#|<55u!\UPPҭ# M;fi&+%rz655K[ W _Gc\.p({Rp׃Eµ L" m3336,v Rx֭QPWb15iP3999'̆< vMU$;``eHB%L(0$~~LM.``RDps\f􌔟_WEsd¡uښ"ڀ$j%HU#ȌgafcTL "d}fdAT xڵWmLUa3@Ą_h~Le5Y^Vʇ`-]I֐Ȕ+RdaI3%hBJmB ]~rZVOܜss=キ(A`vOvQ`whϓNsKԫDEt1_c.Ψ X--4Duu\G P&'N|s|"ٽМF|>_![ZZD$u{Ri3ؠgrBTO'lF"z6'R K$`2f Me T,%#y03@s&''Otb 1oE絺񼼼YhS`neI/,yYm5Tz/k+!17LzGGGmsչ.@|KI AEx$$ ] 9Fc3 Dhpp}ccõoWOI+ri%]埡oM;6YV` lƛǯ`i_PP?VVV:I~OVEcEEEOS,.mx8}F}a6j0AF~YQnߨa1(˕]ЭbnnV*& YYf.xVAzƠWɤC]9 WeeEa*z= hHncccM Aw D45nC%$`1???dAN76@@~ `Y5BMMMۡV纅7*s7n=6Ir,~ tI}U/fcTL "d@6fdATxڵ[L\E׀.&Ĵ$FHAIiLJXE(ܗS*JK5RLx iڄA}c RKw]g9ð%|vp~P~#^zOԗɆl <NHB;3]嶹$$pg)X)E$4NVH0G'NJ9xbh̪:;;+ H|q"Ƭ -x פ\ g"GԼ[}5X7'ْ BН+QGfb~||.4&捌:D>qԴRL̪4(ۇJR( 2yN'QJJJ*hِ3*-gϞ i.۟|ymmmωVvuuUS e{;?O2D7'(Œ 9aNX Qx(%@|R\͍ v%|lllț+J]I|X?ԂbP{>4Mkc /ppX ZoSܢy<2Fq%Ly_^ds ⩪1gF)^]O`]r f:-R 䀏B/x!]h iN^fiiit^)3 /55u[8v}!3П=xtsicbnp8|1/dw$Ё;*OTIr///j  ITWWW[:::966ր~pO``| H >;J>4[`8|a``5T]z(==q8>p,b3i?B %}\EɇQA$^1pX|F*588x ~@"3hIHfW Ev51]BƚrfGn5ŽEfK|Q1Ģ$9"7p@]H^$Dx~h.Q#]|Q__oh" QLqPW8ijB 䙢u\@@ua5Abvkf@[!5ë C^Ff< VhNPF-OĺseM\ZZ~wKKK ІlĄ*e7Mt-_|_A@ t/cb!.:s̻(?ɳhϑ#DBO}#>ds3k][[suwwWo %Jik.pL˲|}:ٮBo64R %ĖuC@1RtN ?t|!$cFU7'i<@k> ?b{i`LTd">a.sss, r>UHeee} ^ (** $,juz@<`W{X? !OmrUjh,KE~~~%c"b Ee 5RNNNiVV b r?xz iXuve3ߞ񄕲O˙=g}i4m/6Ѓ!\Q7,S Ś2&XnBP4c3xc1FF 1n@Zއ.N+pNBpXF\.WD:4554?]D^v]hyy(2Xjc' ^Q dVJPxڗFXj># jFQ':J/#1JO No`` Ey(v4=Jq{ݺ#RT&Iͧ ${Cbslv_< ^q:Oz¥,tQ#hoo/'׈A{+?]J AL|:QK%$rOC-VsFwvQA[| FJA8 t"4 Am' qOPudd,HSVeee?..n%S7-& EU~Tm ?TqTB~4k@ZQXG w4U6F6ff ҉)/..kkkMfRO_u]Lmx ϥazzoCQm" }B/E ;{c `WxHd3Sa*iRUZ %4oZW3. |t %LNMw)r pps  dxjhdZM/8ZVJ 1ɀ;+|HIIIEwRf |B\8 [9V&NϦR4-g %A/XVfcTL "d7~fdATxڵ[L\Ei&Fn(X|\"`>X Pv.4UT,x#1bB ,®_z6Nfvf?&UU+- $աA|=;p<,oh&ngg(NSu|DnBumT$F%`aߍAqs XbXl@}}}ʊf'9Fo 6Ft&\  l&=,I0gX?H^ 5߂몲' ̃zœHqMQq_.eeei;rF'wwG%2Z+_Ө>innn>EGW1k5bjKoz _   :===/8+/1-`BOFʸx^;[훛ކSRR >ofTkCp @eKKK[s/bnT[v'@y1kkۭrX,)yN2 hHtp\h/κhP'_[ @5)qu/x?, em7T[ NFFFF!#p}3rfIXӲ,"%gWWx:e2*233A 0&222RSSؚN٠t଀jVGi'R-gK_] BofcTL !dPffdATx{H[SL+Bu(v̿uWC,՟XmMV=|છ1(aD L(ݣ+B!H}fؖFp=\w{H.199'$@)-EQy"C@ Cai ? tMG@ LEFT:V6LzAL^GL "}xI*p }F MAIwuuUIݴX,Wb@ڃ^dssC Y__otr5Bʓ*@=CCCl".²a.Sr4`hV 3Ɖi8W7- -]ZYQza~ eqV SSS|TJqo@̻Wp8qffm||kll+##C+ai $IxruuJUaE|`f,kzo7&'' -DDy`& {.\9$` ^>ǃWxE~ߡ s?g"49XYbX( l;w\V4O #lB!͹lhxH! N@%t-7 A%<YW _aa&%zkι`~7"}MIS`# bTPO#D]zN#q O`clUe\uA.h"+?_|ݵ֋~5H J0??bc/"d0|xች.l*H^TUz0fl`\c=8z,ΧJ b"7"7==e+!҅p4CNNa%_}ٯPa3L /..t:kxJv(E:`6zwٙL}x;FD"wqyw il,cC  ВF}En˲Fw/t'n( :d weevW84Y,p@ȅ2!o)n*ԏQ}Ȕ5b9YFx3 S#f {|pT D0Tݾ"c d[Gmz+|~VE !.T`uyu7yp NyPW6MnQX F(rfs3brG.!$iv aNid[0+l6@@@Z>KOX_T,v+IENDB`manuskript-0.10.0/libs/pdf.js/web/images/secondaryToolbarButton-documentProperties@2x.png000066400000000000000000000016451354442177200316220ustar00rootroot00000000000000PNG  IHDR slIDATx_hSg3/0wm腤ۺ+W/^ X Sqވ![izNqkp[Kgl4G4-f61[g(5Jrfzw8|yBٰ~r). )9:a`IOZ,˧Aq\*,͑p6Zl> Pݡkq,%ռق67/Nc؅]r}:=,Bmf9EaI ”tsYEve?h4!+)  jE0|h^88v}>.P\.Z۱>̓BH!@qKc*XPWX6S|gK^~btK9t!S% NZZMMt}ӴVB$ '*IR:fNI\Ru0n:L*OЙ?fHCS8NӠQ aGt )^>'fӂQ Mғ@5#՟yC$U>u 5sBkЎP7cTgk|a o㔄>>) p|t4I!;l#&nTJoq}vt0oˢ|͘).f# Q19+apFNcX#}jN#Ӥ;Bqӿ[_uz;hԖ󉞗7#9^yy33p{{g WS7iƧIENDB`manuskript-0.10.0/libs/pdf.js/web/images/secondaryToolbarButton-firstPage.png000066400000000000000000000002631354442177200272740ustar00rootroot00000000000000PNG  IHDR7zIDATx1 @wxB 6), l@,RX[w aٵ7_2< NH9rϋc* vJ gj6\бti2 K"|sDķ?T^ }}IENDB`manuskript-0.10.0/libs/pdf.js/web/images/secondaryToolbarButton-firstPage@2x.png000066400000000000000000000004121354442177200276420ustar00rootroot00000000000000PNG  IHDR sIDATxQJ0Ivwݥٲ-O_ED\Y)e1QgciD|{d Dp83xO=7ųVuB& q鈏cxuLp9`RK ,c vT'v,bsgCEh66go0Gɴk(x P5֨AF}t.ҪY4Lw< "|MIENDB`manuskript-0.10.0/libs/pdf.js/web/images/secondaryToolbarButton-handTool.png000066400000000000000000000004551354442177200271230ustar00rootroot00000000000000PNG  IHDR7IDATxmʿJA#"XR`a'>0`koJ!(bQ\#qc X7&e0d=(~<1>]Azw4q]?HTr#//>+|'U^k\!V57jGuH;ryTu쁭AcTnd e]FBM}^Oү6׆g ;1+mok `R99'Iec3 _#L[IENDB`manuskript-0.10.0/libs/pdf.js/web/images/secondaryToolbarButton-handTool@2x.png000066400000000000000000000011071354442177200274700ustar00rootroot00000000000000PNG  IHDR sIDATx?ha[Y$ ֹK Pݺ Pt1 VC %.J`[QijkO%RMCIy3 02䦑1 7Ee "L+7jsѺhM>1R~{]ߠ 4_/&4_U0q > M[tЁ7 гsv}~5v*#̬z?sV[hA3I&Pƴ=q>_G`/q/a[inr1@\s\k%XgV-˜S*CV;/Kr|^-^C H\Hw HPUPŸ$R=svvDj3feۧ 8|IENDB`manuskript-0.10.0/libs/pdf.js/web/images/secondaryToolbarButton-lastPage.png000066400000000000000000000002571354442177200271130ustar00rootroot00000000000000PNG  IHDR7vIDATx1!DJr+$?ل+PhcaaGW[n_F.N3?G4a_O6Gt3Ke41mIs%CR# KI4hz> zc^ NͣIENDB`manuskript-0.10.0/libs/pdf.js/web/images/secondaryToolbarButton-lastPage@2x.png000066400000000000000000000004241354442177200274610ustar00rootroot00000000000000PNG  IHDR sIDATxKJ0FZ]+Җ>cI" "" u>WD߁;;Bǫ>Dtg;tM}j<~蜨hX&JIENDB`manuskript-0.10.0/libs/pdf.js/web/images/secondaryToolbarButton-rotateCcw.png000066400000000000000000000005501354442177200273020ustar00rootroot00000000000000PNG  IHDR7/IDAT}1KEh%Z "7[4EG] BH80D<:74- y$#đ$Oy -F&66MZ^5QNs1cӱaUߨRz֌FOJS* *q8Vߤ}ȓP۩~csSTQEռ~lNP|p[ v$HwfJ5&`pߘUנIDbR5WOh;sC2eJܸq4 RHxneZ\QH5WlWOIENDB`manuskript-0.10.0/libs/pdf.js/web/images/secondaryToolbarButton-rotateCcw@2x.png000066400000000000000000000013331354442177200276540ustar00rootroot00000000000000PNG  IHDR sIDATx_HsuǕ؄h Ivc7AEx!%O¨]0/. F1ɋV"[I4 sլte\nPؙy?u;ws3}~Oa`?, sr[aa&/p,OIuKjYphzZ~;'DӉ82$`|ž~=ff!; 4P-W^/r} `GT)8yڮ.- ÅR ͫ_c7D!|{UV\ei(6ЩnZ K@1w0GiHGl Vy 2@F| Jn=dy6Wߔ3A\w\Eɮdl%eIȖ+)VQD!k/sx\?*W}AV rD`XI98 \Dy#̼7EVy"皢TtMIkkE'tXUE[A'΅_b=rF_qi \1K&Ħ/>8Qbߗ cnNswv:u@>f=Ox^YÃS ;IENDB`manuskript-0.10.0/libs/pdf.js/web/images/secondaryToolbarButton-rotateCw.png000066400000000000000000000005471354442177200271450ustar00rootroot00000000000000PNG  IHDR7.IDATu1KEh Z%\l4E Gtm(j E) :C4!F!޸"MZ0RG*Y _?zxxF'Xx`EU#hѾkN1MhB1]iӦ`GT3 .-Zq뭄|͍iYPJ)ҢB6IV'5m@g C*wX\_NKТ DIMRDC 4ip3o3Z˽q-\"ՒV%*OC E7IENDB`manuskript-0.10.0/libs/pdf.js/web/images/secondaryToolbarButton-rotateCw@2x.png000066400000000000000000000013121354442177200275060ustar00rootroot00000000000000PNG  IHDR sIDATxAHaוԤHD/!4C<A$!vQ;;JT)1?YUXe8c$T@/qb*_ݧ9Tj׬9tV@_GuTH9tLt2xWXsYsH/4hoL{u8qOQ>%|W|q8>凪x(a X?*mHR Ԃ9̤ΔInH%4Ap HA"Y“=g{HBzJ"Y~Nი=2K"YNN(U$KؼI"YfV7kAhqU0 ,33 > \d'7ZAqꅛyI²O*N#;/"#]+~NEdv1wYx%<dyǞ4:eU:#CḭiMG:)L6hvKm2Ӿ^zvF]Q׶nՐ^JǓI'+b>3IENDB`manuskript-0.10.0/libs/pdf.js/web/images/shadow.png000066400000000000000000000004421354442177200221300ustar00rootroot00000000000000PNG  IHDRYGIDATx^]j0 ק^/+#B3,{MzR㢔ЬE3)kfX5Vb],Z 0Z2 ]I[Lo{gh,xM+ؙ넡 e "6ADZR3n9YrEWfW(+r 薳F4H=p f"83v=o6{)ª'k%"YNRduIENDB`manuskript-0.10.0/libs/pdf.js/web/images/texture.png000066400000000000000000000045621354442177200223520ustar00rootroot00000000000000PNG  IHDR@@PLTE!!!###%%%'''))),,,...000222444666???999;;;  ===AAADDDFFFHHHJJJLLLNNNQQQWWWSSSUUU\\\^^^YYY```bbbiiimmmfffkkkdddoooqqqtttvvvxxxzzz:tRNS~^9IDATXÅWv]9Cs7]=WUK, t,h_ ON8^ՠ9bwYQ)*<\4wh oUiuuYLv+kK#8w٭T&^g-a]Wa&y B8W\A5 HBSэgp m a!2p1sgڍ\($ p&n|wVɹuTxaqQ҃0uKhJ@[& œ)zfh_D< 6b9 /ɖ@7wGXu{#V7S uϝ8 mq0ëTfoRƫ:u 7TkSu:]a6=ptޣ0e"$Endz0g,0Z!uAs}o+ӦLUsgd:z.ʤJf#W'l%34\nqho0Gn5U\}l1o:[heQoS֘-%'aS+.$[4!%`"0ŇO# 1hu am\'!Atц^R~kǜt "LgoW%bcv y*Kt7j<!r\*n 2gb0BBM%}rdrdY+OW5֪ HA\g1v@@uc3Cڱ4L*xS̊^5twJ#(z^CM=fngk37LjHt]o%GkԔRpt~ /-ؐcO+N8<lrD>shl0ls{x{ URʌqUl3怜[fwt4d֧k8nmwjpb)/ru.na'fRpp1 #-(cJzs諂 S9_ְg4z>-V(,Lf"vɸ Y,y}~A-+*)p5,t{e ' G0Kx9 1;2&Dnŝ Giqʝ -MБ4^S* t$;`G @h4WfIENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-download@2x.png000066400000000000000000000006511354442177200256620ustar00rootroot00000000000000PNG  IHDR spIDATxͻJ+Qov)FDQ| [h'b-*.+X'CEưd6-Dp~3%!ZT@=9au" |Gci:-t@!E`yC 4-~n¶ qx`MG39wTmBRD;ʊ(@Iw(*EU o,̊I}毋s;xF{ zXK1@&pN MW8PD NC. '=uA 8&9c# xɢyiĐ#l?t2-!OSO}f֫^IENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-menuArrows.png000066400000000000000000000001541354442177200256410ustar00rootroot00000000000000PNG  IHDRځe3IDATc`@~ ^%Xx-?,ȒK0:m,^ 1[IIENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-menuArrows@2x.png000066400000000000000000000002301354442177200262060ustar00rootroot00000000000000PNG  IHDR _IDATxc<2 # &g@xB(@?$@A8XPAlH4$ ^ G830?g~;3{ IENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-openFile.png000066400000000000000000000004471354442177200252450ustar00rootroot00000000000000PNG  IHDR7IDATxc ng@ 5GHHXAG:.ؗTph4nx7aɊo'"3ܟ~;L2+/C@iN9JADt3k# %usy And݀ fo  D1Pa "? `i t1U<?@w_‹0 , L v 8-A^8ylIENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-openFile@2x.png000066400000000000000000000010461354442177200256130ustar00rootroot00000000000000PNG  IHDR sIDATx?habHpZW` P.UA:" E$FSsri`b򪁒;m^>cb7o"eJ_B[;PrQn^og%_\U䫫h {M^:ѻȹl5NWz݉XgOy;s1ax0SϝDB” s9Qe乜Hs߭V古L̥Ð$IП+O}/IENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-pageDown.png000066400000000000000000000003561354442177200252470ustar00rootroot00000000000000PNG  IHDR7IDATxA @A'E :D:PDH"ZE8ޅ}٢-? H0$DmOǸ yH턿řXŭYy,UǨ- Ć29ZaӤ9yNb]2$ Yh7۳xiOfjWAIENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-pageDown@2x.png000066400000000000000000000006141354442177200256160ustar00rootroot00000000000000PNG  IHDR sSIDATx̻JA#(1666>o`6K!v(mn$F !s hF#Y?usc!8?=TL$ꛠ w6_j莸z(c7s[ )߀Bg-puH;,ξ^N'k{h J454tܺKƭ8,@c s-0Ɓ@ D9\N1G!BN本{q2ji~\S8g\N$$k4gBWHsԫBŽbŠX4Ey+*s!o;Mp%[FIENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-pageUp-rtl.png000066400000000000000000000003651354442177200255230ustar00rootroot00000000000000PNG  IHDR7IDATxϱ P೴=CcA#6"AC Hw.[G]/,I)č rd,GTXpt2j).B _<$kx0 TǦ98 Wq .vF)x<lbV?b# ~08R}ɢʴC}}Xja~IENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-pageUp-rtl@2x.png000066400000000000000000000006251354442177200260740ustar00rootroot00000000000000PNG  IHDR s\IDATx.QCXHh-tx̴<J72´ED#DZH?緺's>H s@wJ 5ܐFT"GՀ'DP `G` p Bt8(@ h^A`N 7FPA:H_*#iJUp5ʗ<@O1О9O13_IĬ^7piH$,P8Ň" s$Q9\b&A:8L$a"c NGJp=W]_IghEĨ>)fG-^MVMں V Z:u4Z Qg0 =AxI2#q/L&6?SLK[G<dCR@N#S I3=9V:"P`S}ɺ9~;IENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-presentationMode.png000066400000000000000000000005011354442177200270130ustar00rootroot00000000000000PNG  IHDR7IDAT(Sc` :HL }2((] (xߎmD}pi;Q<ӓTܜ>G:=C<T2iG /(V4ȂIyaA?*}[̧ z ~ OE?i;i? = Qp4#tD  wUSQ &z:mIIENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-presentationMode@2x.png000066400000000000000000000011121354442177200273640ustar00rootroot00000000000000PNG  IHDR sIDATx=kQOjXH%B"T¦3V +|`Bd&V0nf7Y;ΝB<}aL1 J0{2RrFɜEquQ8K k(WѬz(K:Ѭc0YC7Oo;3JZs/fxM4c{{ΫEO-OWx>mx>ٰ~J=~ S- j>eCC@9/:ż"E4a(ske={Lu iN_0(M5+x.&S yh᠕PLnL1)~P5.΄ѓ17wqV+ (z[|fgp} FQ Ku7Ӊt xzA-Rœ) '׉(VoF4+ (uA9aE"C(P'3E\()F(9#1zXGIENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-print.png000066400000000000000000000004011354442177200246260ustar00rootroot00000000000000PNG  IHDR7IDATx=J@9*ϏlgR=xT6EAD "V?Oa+?g~/3𗽹/i# vsD'0>B~9gD|M`[;e_ҫ@-zׁomnYeCy}nyc4aE4 渂5+P+3~cYEIENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-print@2x.png000066400000000000000000000007201354442177200252040ustar00rootroot00000000000000PNG  IHDR sIDATx?o@duW \u:vu_DGDN ݪ"-mDCA=E%.?܅Nlc#eyztr 0`0DQX Ǎ]m 往#lXkNx!P4Vrk@B77 %2Y|P"әE_CLg_4t&Iv(knBĚܪN E2CM9 3uQÆM5}~5ؗz??lՃ6rWGR&|J3`96fI⡺//xqw /:t`f3twQ`'msH4g$ޯ)k(KN^u_Oz|SIENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-search.png000066400000000000000000000004651354442177200247510ustar00rootroot00000000000000PNG  IHDR7IDATJ4*&m NИkXm998c E?=$E{ۢxQ HCw1f1-lWoUn&%՜ZҲ9\N*Tk1iwšvL^|h#Ms|%CLE^ "]XB#5OQѩ9Q@kcgwVS\q҂wÃs{RP?{9{ԯ"TP H7IENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-search@2x.png000066400000000000000000000012151354442177200253150ustar00rootroot00000000000000PNG  IHDR sTIDATxOH!SCiT?@C١xYxC Hiokls[y9}|\lmy>cӋy8EϳX,A/1FELނr^(DܶN1^h 8j (OZPh ut肵Saܴ/%72deٷO Uij(͖8 8`rtշUHe8N`թ,)+dQEFЀi(%РxiH1P@Nq!m>"͐D{Y5~em Clqg>}T^a=wz^7N(Gᢅn;j^g'GRB=5jIG1"'֒?/ңeEN7I-qyױKˣ}ɜXn/ݦ㨔8Wz{P^|_⸖Ʊus/n8}1-1q`ϕƁG-2vMG[4PcaIENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-secondaryToolbarToggle-rtl.png000066400000000000000000000003661354442177200307570ustar00rootroot00000000000000PNG  IHDR7IDATx1+Eqw 6v`* EJwI)VIAn9NO=˧_ X8`ImXOfΎg; Xʎ|{K_|epo`jaΖ6Տw>m<ef>{wt=u+[uw%IENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-secondaryToolbarToggle-rtl@2x.png000066400000000000000000000007101354442177200313220ustar00rootroot00000000000000PNG  IHDR sIDATxMLqgMhJR,&eᖒdH)Qbc#S.‚l$+5Eq_suACs1fHI4"_N,,9ŷSG GK|8Rfk1WD)˨zX >Q}9nӥByp팬+Cw4UvkMRB ÒBL7ydnXxj={%*+G#$һOџSTQcV#*[+G@U4q9$wp߷̡Q9$[*} j-~7,ݺ*l9dIq[&OψwehѺu ,\ʄbcC?+YĕI7?ɬ@i$6"(PMEɶ$8IENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-secondaryToolbarToggle@2x.png000066400000000000000000000007121354442177200305250ustar00rootroot00000000000000PNG  IHDR sIDATxOq7MIa%I9RR p8^& '"< iƘ!%ш g{Sy|eK.@"=F_IK)3{~>4*듮FC&)wy_9B>\<)QCq ]<@Us3<2ty* ؄݉ԑY^.dՅ>$91%+]kn=͋H'WUHka{K{QIn`FȢ!72. dA}wpm.Gy$.zwknYiwou!x72;dqH:{N v~5-Z`YgrR#dd` H!7"_@OMIENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-sidebarToggle.png000066400000000000000000000003411354442177200262500ustar00rootroot00000000000000PNG  IHDR7IDATxС Po%m"d1VaZ\7 FGv!ð{Na ߁k3_.aA3`h))V2eeV"KHn7.Nk0Wa$X CBMKGoqm IENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-sidebarToggle@2x.png000066400000000000000000000005131354442177200266230ustar00rootroot00000000000000PNG  IHDR sIDATx=SAgr/A ``* H b!i\B(3c# dFӟy_.@n qi|N.6|\$$8qK p6̞̍ޞ HW2{a.=∔*|A.)Ee/ ?O8p 6Ѷ"{U*T:x#B\^B^jw_7} j=IENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-viewAttachments.png000066400000000000000000000006001354442177200266410ustar00rootroot00000000000000PNG  IHDR7GIDAT(Sc` WKwlb>{vV*Pɚo͜dA[M{oM$3z &>&'_}# y{r˿#6E}^͌ Gs~[w1S&Pvx20+ *J@@]-:CŷM66pi `zK)b0d0Tm#4LwFsp``e@m_V?ԓ `% . إ!04aIENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-viewAttachments@2x.png000066400000000000000000000015471354442177200272260ustar00rootroot00000000000000PNG  IHDR s.IDATHkHSaǩ%]EIC,A+y(42/F] -/чnBYiVP[jinNܥR\"s;j9W|9y</`+N+|fW71{9uތ`j>~dմr[ X < (Q][(@G=&aցz~MOM0Kġ2Pى8w\!raVӅYeW呃:ʉ?ʠtZ3~f!yqa$py=-E ]1"f98.0|aHl;j*x:5qc+Djo8eYtثxl7F:8m! t|ޛWf'h=YsM7k' -К%!gDQZ/:[eo57W>נt?$ o\f[ELrh5MDEJ"_>rI蠾B~ jvܛ/Aݔ p_<ͼJrܵ0f*IȨ|/TOa4= hQ/M%'~!Ph(`;,t, wx[AA>x%j;cbi1|2k74iHKvzD()@Yታ:׃>!;),;e)<8V% dB ,BᕶcHZ^tΑl_eGM_q!s)Iah`I0_-x]yfՃ˻`y_ &n>ki)OƏ &2IENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-viewOutline-rtl.png000066400000000000000000000002611354442177200266070ustar00rootroot00000000000000PNG  IHDR7xIDATx-A@"8ܠhɊ&gLȒ = +s4-3Lwu'?iv#7q% !PVV=DA f13ǜ_4fGCy  -BqlT8 5Agr;gy7]euIXb @wn5AXq?Pb:J6*M MԯAǬs?O%?\筆 dAʄXdɍ#MPY& ban ňZsˈ0o..erIENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-viewOutline.png000066400000000000000000000002621354442177200260110ustar00rootroot00000000000000PNG  IHDR7yIDATx-Ac0(?<V7ɡ#O) 5|'@c2ѕ;| qcLwCGi^3ऎu[x'閮\KHU o?|Uэ}IENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-viewOutline@2x.png000066400000000000000000000005131354442177200263620ustar00rootroot00000000000000PNG  IHDR sIDATxJQ1 .GECHHCʴCCln87gHf,>L:QV:EER@S~9<Ε|p?t:Pla뷫AcN(})# gى[L@0U}s_|UʑS%JrĿVCN9] W @p D<;oBؠžS!J/J6[^*}ny7;i5Z)Z$BIENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-viewThumbnail.png000066400000000000000000000002711354442177200263150ustar00rootroot00000000000000PNG  IHDR7IDATx1 Q Ṓjx"ł,ĀW%lXWߔ_v&9l8wIë$a,A|Kl˶ԫ#Ds @q 8[Iõ$a{^`ΰ?̥9,KIENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-viewThumbnail@2x.png000066400000000000000000000003341354442177200266670ustar00rootroot00000000000000PNG  IHDR sIDATxԱI1/F9,\%],nBN.uO$+О݋^<^|:D'. v 44pOٕ`}[_3 (О܉f7~D *Dl7q<>] >Z˂`R?IENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-zoomIn.png000066400000000000000000000002101354442177200247430ustar00rootroot00000000000000PNG  IHDR7OIDATxc;!Tеjc( @ٲ&lv ^tF x&,.>..MQhcZB샊NC$gѤ0` zQ8IENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-zoomOut.png000066400000000000000000000001301354442177200251450ustar00rootroot00000000000000PNG  IHDR7IDATxcQ;, /aB X0[3vIENDB`manuskript-0.10.0/libs/pdf.js/web/images/toolbarButton-zoomOut@2x.png000066400000000000000000000001551354442177200255260ustar00rootroot00000000000000PNG  IHDR s4IDATxc`Q #6qlj8 `p RQ0 r eKWdIENDB`manuskript-0.10.0/libs/pdf.js/web/images/treeitem-collapsed-rtl.png000066400000000000000000000002671354442177200252310ustar00rootroot00000000000000PNG  IHDR JΛgAMA abKGD̿tIME ƫىMIDATc`@/^LB押yqEҋC/΀ &TB/֣ Y_ļ؏"xQd#GFF>IENDB`manuskript-0.10.0/libs/pdf.js/web/images/treeitem-collapsed-rtl@2x.png000066400000000000000000000003151354442177200255750ustar00rootroot00000000000000PNG  IHDRFgAMA abKGD̿tIME ƫىcIDAT(c`^HcEڋ/SbbË3 `Q"TK(´C6K0ٽHPQAʼ'&6E0bJ b 6V-'IENDB`manuskript-0.10.0/libs/pdf.js/web/images/treeitem-collapsed.png000066400000000000000000000002001354442177200244150ustar00rootroot00000000000000PNG  IHDR JΛGIDATc``x1*xq5/DP@ЋB &T!,BZY1/Xm,!l#?GFsz2IENDB`manuskript-0.10.0/libs/pdf.js/web/images/treeitem-collapsed@2x.png000066400000000000000000000002251354442177200247760ustar00rootroot00000000000000PNG  IHDRF\IDATxc}/g^}"0"YLPbXc1B  lVAs8%&LҤhIENDB`manuskript-0.10.0/libs/pdf.js/web/images/treeitem-expanded.png000066400000000000000000000001751354442177200242520ustar00rootroot00000000000000PNG  IHDR JΛDIDATxc }q1{qI` 0$!7V}T_ !lI6P^/!l?65IENDB`manuskript-0.10.0/libs/pdf.js/web/images/treeitem-expanded@2x.png000066400000000000000000000002541354442177200246220ustar00rootroot00000000000000PNG  IHDRFsIDATxc3x1p )JJǫ( b!ۋMe`éȖ'Q@)dtE#E Er c:SG7Nj/6b8N AxIENDB`manuskript-0.10.0/libs/pdf.js/web/l10n.js000066400000000000000000000711051354442177200200040ustar00rootroot00000000000000/** * Copyright (c) 2011-2013 Fabien Cazenave, Mozilla. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ /* Additional modifications for PDF.js project: - Disables language initialization on page loading; - Removes consoleWarn and consoleLog and use console.log/warn directly. - Removes window._ assignment. - Remove compatibility code for OldIE. */ /*jshint browser: true, devel: true, es5: true, globalstrict: true */ 'use strict'; document.webL10n = (function(window, document, undefined) { var gL10nData = {}; var gTextData = ''; var gTextProp = 'textContent'; var gLanguage = ''; var gMacros = {}; var gReadyState = 'loading'; /** * Synchronously loading l10n resources significantly minimizes flickering * from displaying the app with non-localized strings and then updating the * strings. Although this will block all script execution on this page, we * expect that the l10n resources are available locally on flash-storage. * * As synchronous XHR is generally considered as a bad idea, we're still * loading l10n resources asynchronously -- but we keep this in a setting, * just in case... and applications using this library should hide their * content until the `localized' event happens. */ var gAsyncResourceLoading = true; // read-only /** * DOM helpers for the so-called "HTML API". * * These functions are written for modern browsers. For old versions of IE, * they're overridden in the 'startup' section at the end of this file. */ function getL10nResourceLinks() { return document.querySelectorAll('link[type="application/l10n"]'); } function getL10nDictionary() { var script = document.querySelector('script[type="application/l10n"]'); // TODO: support multiple and external JSON dictionaries return script ? JSON.parse(script.innerHTML) : null; } function getTranslatableChildren(element) { return element ? element.querySelectorAll('*[data-l10n-id]') : []; } function getL10nAttributes(element) { if (!element) return {}; var l10nId = element.getAttribute('data-l10n-id'); var l10nArgs = element.getAttribute('data-l10n-args'); var args = {}; if (l10nArgs) { try { args = JSON.parse(l10nArgs); } catch (e) { console.warn('could not parse arguments for #' + l10nId); } } return { id: l10nId, args: args }; } function fireL10nReadyEvent(lang) { var evtObject = document.createEvent('Event'); evtObject.initEvent('localized', true, false); evtObject.language = lang; document.dispatchEvent(evtObject); } function xhrLoadText(url, onSuccess, onFailure) { onSuccess = onSuccess || function _onSuccess(data) {}; onFailure = onFailure || function _onFailure() { console.warn(url + ' not found.'); }; var xhr = new XMLHttpRequest(); xhr.open('GET', url, gAsyncResourceLoading); if (xhr.overrideMimeType) { xhr.overrideMimeType('text/plain; charset=utf-8'); } xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (xhr.status == 200 || xhr.status === 0) { onSuccess(xhr.responseText); } else { onFailure(); } } }; xhr.onerror = onFailure; xhr.ontimeout = onFailure; // in Firefox OS with the app:// protocol, trying to XHR a non-existing // URL will raise an exception here -- hence this ugly try...catch. try { xhr.send(null); } catch (e) { onFailure(); } } /** * l10n resource parser: * - reads (async XHR) the l10n resource matching `lang'; * - imports linked resources (synchronously) when specified; * - parses the text data (fills `gL10nData' and `gTextData'); * - triggers success/failure callbacks when done. * * @param {string} href * URL of the l10n resource to parse. * * @param {string} lang * locale (language) to parse. Must be a lowercase string. * * @param {Function} successCallback * triggered when the l10n resource has been successully parsed. * * @param {Function} failureCallback * triggered when the an error has occured. * * @return {void} * uses the following global variables: gL10nData, gTextData, gTextProp. */ function parseResource(href, lang, successCallback, failureCallback) { var baseURL = href.replace(/[^\/]*$/, '') || './'; // handle escaped characters (backslashes) in a string function evalString(text) { if (text.lastIndexOf('\\') < 0) return text; return text.replace(/\\\\/g, '\\') .replace(/\\n/g, '\n') .replace(/\\r/g, '\r') .replace(/\\t/g, '\t') .replace(/\\b/g, '\b') .replace(/\\f/g, '\f') .replace(/\\{/g, '{') .replace(/\\}/g, '}') .replace(/\\"/g, '"') .replace(/\\'/g, "'"); } // parse *.properties text data into an l10n dictionary // If gAsyncResourceLoading is false, then the callback will be called // synchronously. Otherwise it is called asynchronously. function parseProperties(text, parsedPropertiesCallback) { var dictionary = {}; // token expressions var reBlank = /^\s*|\s*$/; var reComment = /^\s*#|^\s*$/; var reSection = /^\s*\[(.*)\]\s*$/; var reImport = /^\s*@import\s+url\((.*)\)\s*$/i; var reSplit = /^([^=\s]*)\s*=\s*(.+)$/; // TODO: escape EOLs with '\' // parse the *.properties file into an associative array function parseRawLines(rawText, extendedSyntax, parsedRawLinesCallback) { var entries = rawText.replace(reBlank, '').split(/[\r\n]+/); var currentLang = '*'; var genericLang = lang.split('-', 1)[0]; var skipLang = false; var match = ''; function nextEntry() { // Use infinite loop instead of recursion to avoid reaching the // maximum recursion limit for content with many lines. while (true) { if (!entries.length) { parsedRawLinesCallback(); return; } var line = entries.shift(); // comment or blank line? if (reComment.test(line)) continue; // the extended syntax supports [lang] sections and @import rules if (extendedSyntax) { match = reSection.exec(line); if (match) { // section start? // RFC 4646, section 4.4, "All comparisons MUST be performed // in a case-insensitive manner." currentLang = match[1].toLowerCase(); skipLang = (currentLang !== '*') && (currentLang !== lang) && (currentLang !== genericLang); continue; } else if (skipLang) { continue; } match = reImport.exec(line); if (match) { // @import rule? loadImport(baseURL + match[1], nextEntry); return; } } // key-value pair var tmp = line.match(reSplit); if (tmp && tmp.length == 3) { dictionary[tmp[1]] = evalString(tmp[2]); } } } nextEntry(); } // import another *.properties file function loadImport(url, callback) { xhrLoadText(url, function(content) { parseRawLines(content, false, callback); // don't allow recursive imports }, null); } // fill the dictionary parseRawLines(text, true, function() { parsedPropertiesCallback(dictionary); }); } // load and parse l10n data (warning: global variables are used here) xhrLoadText(href, function(response) { gTextData += response; // mostly for debug // parse *.properties text data into an l10n dictionary parseProperties(response, function(data) { // find attribute descriptions, if any for (var key in data) { var id, prop, index = key.lastIndexOf('.'); if (index > 0) { // an attribute has been specified id = key.substring(0, index); prop = key.substr(index + 1); } else { // no attribute: assuming text content by default id = key; prop = gTextProp; } if (!gL10nData[id]) { gL10nData[id] = {}; } gL10nData[id][prop] = data[key]; } // trigger callback if (successCallback) { successCallback(); } }); }, failureCallback); } // load and parse all resources for the specified locale function loadLocale(lang, callback) { // RFC 4646, section 2.1 states that language tags have to be treated as // case-insensitive. Convert to lowercase for case-insensitive comparisons. if (lang) { lang = lang.toLowerCase(); } callback = callback || function _callback() {}; clear(); gLanguage = lang; // check all nodes // and load the resource files var langLinks = getL10nResourceLinks(); var langCount = langLinks.length; if (langCount === 0) { // we might have a pre-compiled dictionary instead var dict = getL10nDictionary(); if (dict && dict.locales && dict.default_locale) { console.log('using the embedded JSON directory, early way out'); gL10nData = dict.locales[lang]; if (!gL10nData) { var defaultLocale = dict.default_locale.toLowerCase(); for (var anyCaseLang in dict.locales) { anyCaseLang = anyCaseLang.toLowerCase(); if (anyCaseLang === lang) { gL10nData = dict.locales[lang]; break; } else if (anyCaseLang === defaultLocale) { gL10nData = dict.locales[defaultLocale]; } } } callback(); } else { console.log('no resource to load, early way out'); } // early way out fireL10nReadyEvent(lang); gReadyState = 'complete'; return; } // start the callback when all resources are loaded var onResourceLoaded = null; var gResourceCount = 0; onResourceLoaded = function() { gResourceCount++; if (gResourceCount >= langCount) { callback(); fireL10nReadyEvent(lang); gReadyState = 'complete'; } }; // load all resource files function L10nResourceLink(link) { var href = link.href; // Note: If |gAsyncResourceLoading| is false, then the following callbacks // are synchronously called. this.load = function(lang, callback) { parseResource(href, lang, callback, function() { console.warn(href + ' not found.'); // lang not found, used default resource instead console.warn('"' + lang + '" resource not found'); gLanguage = ''; // Resource not loaded, but we still need to call the callback. callback(); }); }; } for (var i = 0; i < langCount; i++) { var resource = new L10nResourceLink(langLinks[i]); resource.load(lang, onResourceLoaded); } } // clear all l10n data function clear() { gL10nData = {}; gTextData = ''; gLanguage = ''; // TODO: clear all non predefined macros. // There's no such macro /yet/ but we're planning to have some... } /** * Get rules for plural forms (shared with JetPack), see: * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html * https://github.com/mozilla/addon-sdk/blob/master/python-lib/plural-rules-generator.p * * @param {string} lang * locale (language) used. * * @return {Function} * returns a function that gives the plural form name for a given integer: * var fun = getPluralRules('en'); * fun(1) -> 'one' * fun(0) -> 'other' * fun(1000) -> 'other'. */ function getPluralRules(lang) { var locales2rules = { 'af': 3, 'ak': 4, 'am': 4, 'ar': 1, 'asa': 3, 'az': 0, 'be': 11, 'bem': 3, 'bez': 3, 'bg': 3, 'bh': 4, 'bm': 0, 'bn': 3, 'bo': 0, 'br': 20, 'brx': 3, 'bs': 11, 'ca': 3, 'cgg': 3, 'chr': 3, 'cs': 12, 'cy': 17, 'da': 3, 'de': 3, 'dv': 3, 'dz': 0, 'ee': 3, 'el': 3, 'en': 3, 'eo': 3, 'es': 3, 'et': 3, 'eu': 3, 'fa': 0, 'ff': 5, 'fi': 3, 'fil': 4, 'fo': 3, 'fr': 5, 'fur': 3, 'fy': 3, 'ga': 8, 'gd': 24, 'gl': 3, 'gsw': 3, 'gu': 3, 'guw': 4, 'gv': 23, 'ha': 3, 'haw': 3, 'he': 2, 'hi': 4, 'hr': 11, 'hu': 0, 'id': 0, 'ig': 0, 'ii': 0, 'is': 3, 'it': 3, 'iu': 7, 'ja': 0, 'jmc': 3, 'jv': 0, 'ka': 0, 'kab': 5, 'kaj': 3, 'kcg': 3, 'kde': 0, 'kea': 0, 'kk': 3, 'kl': 3, 'km': 0, 'kn': 0, 'ko': 0, 'ksb': 3, 'ksh': 21, 'ku': 3, 'kw': 7, 'lag': 18, 'lb': 3, 'lg': 3, 'ln': 4, 'lo': 0, 'lt': 10, 'lv': 6, 'mas': 3, 'mg': 4, 'mk': 16, 'ml': 3, 'mn': 3, 'mo': 9, 'mr': 3, 'ms': 0, 'mt': 15, 'my': 0, 'nah': 3, 'naq': 7, 'nb': 3, 'nd': 3, 'ne': 3, 'nl': 3, 'nn': 3, 'no': 3, 'nr': 3, 'nso': 4, 'ny': 3, 'nyn': 3, 'om': 3, 'or': 3, 'pa': 3, 'pap': 3, 'pl': 13, 'ps': 3, 'pt': 3, 'rm': 3, 'ro': 9, 'rof': 3, 'ru': 11, 'rwk': 3, 'sah': 0, 'saq': 3, 'se': 7, 'seh': 3, 'ses': 0, 'sg': 0, 'sh': 11, 'shi': 19, 'sk': 12, 'sl': 14, 'sma': 7, 'smi': 7, 'smj': 7, 'smn': 7, 'sms': 7, 'sn': 3, 'so': 3, 'sq': 3, 'sr': 11, 'ss': 3, 'ssy': 3, 'st': 3, 'sv': 3, 'sw': 3, 'syr': 3, 'ta': 3, 'te': 3, 'teo': 3, 'th': 0, 'ti': 4, 'tig': 3, 'tk': 3, 'tl': 4, 'tn': 3, 'to': 0, 'tr': 0, 'ts': 3, 'tzm': 22, 'uk': 11, 'ur': 3, 've': 3, 'vi': 0, 'vun': 3, 'wa': 4, 'wae': 3, 'wo': 0, 'xh': 3, 'xog': 3, 'yo': 0, 'zh': 0, 'zu': 3 }; // utility functions for plural rules methods function isIn(n, list) { return list.indexOf(n) !== -1; } function isBetween(n, start, end) { return start <= n && n <= end; } // list of all plural rules methods: // map an integer to the plural form name to use var pluralRules = { '0': function(n) { return 'other'; }, '1': function(n) { if ((isBetween((n % 100), 3, 10))) return 'few'; if (n === 0) return 'zero'; if ((isBetween((n % 100), 11, 99))) return 'many'; if (n == 2) return 'two'; if (n == 1) return 'one'; return 'other'; }, '2': function(n) { if (n !== 0 && (n % 10) === 0) return 'many'; if (n == 2) return 'two'; if (n == 1) return 'one'; return 'other'; }, '3': function(n) { if (n == 1) return 'one'; return 'other'; }, '4': function(n) { if ((isBetween(n, 0, 1))) return 'one'; return 'other'; }, '5': function(n) { if ((isBetween(n, 0, 2)) && n != 2) return 'one'; return 'other'; }, '6': function(n) { if (n === 0) return 'zero'; if ((n % 10) == 1 && (n % 100) != 11) return 'one'; return 'other'; }, '7': function(n) { if (n == 2) return 'two'; if (n == 1) return 'one'; return 'other'; }, '8': function(n) { if ((isBetween(n, 3, 6))) return 'few'; if ((isBetween(n, 7, 10))) return 'many'; if (n == 2) return 'two'; if (n == 1) return 'one'; return 'other'; }, '9': function(n) { if (n === 0 || n != 1 && (isBetween((n % 100), 1, 19))) return 'few'; if (n == 1) return 'one'; return 'other'; }, '10': function(n) { if ((isBetween((n % 10), 2, 9)) && !(isBetween((n % 100), 11, 19))) return 'few'; if ((n % 10) == 1 && !(isBetween((n % 100), 11, 19))) return 'one'; return 'other'; }, '11': function(n) { if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14))) return 'few'; if ((n % 10) === 0 || (isBetween((n % 10), 5, 9)) || (isBetween((n % 100), 11, 14))) return 'many'; if ((n % 10) == 1 && (n % 100) != 11) return 'one'; return 'other'; }, '12': function(n) { if ((isBetween(n, 2, 4))) return 'few'; if (n == 1) return 'one'; return 'other'; }, '13': function(n) { if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14))) return 'few'; if (n != 1 && (isBetween((n % 10), 0, 1)) || (isBetween((n % 10), 5, 9)) || (isBetween((n % 100), 12, 14))) return 'many'; if (n == 1) return 'one'; return 'other'; }, '14': function(n) { if ((isBetween((n % 100), 3, 4))) return 'few'; if ((n % 100) == 2) return 'two'; if ((n % 100) == 1) return 'one'; return 'other'; }, '15': function(n) { if (n === 0 || (isBetween((n % 100), 2, 10))) return 'few'; if ((isBetween((n % 100), 11, 19))) return 'many'; if (n == 1) return 'one'; return 'other'; }, '16': function(n) { if ((n % 10) == 1 && n != 11) return 'one'; return 'other'; }, '17': function(n) { if (n == 3) return 'few'; if (n === 0) return 'zero'; if (n == 6) return 'many'; if (n == 2) return 'two'; if (n == 1) return 'one'; return 'other'; }, '18': function(n) { if (n === 0) return 'zero'; if ((isBetween(n, 0, 2)) && n !== 0 && n != 2) return 'one'; return 'other'; }, '19': function(n) { if ((isBetween(n, 2, 10))) return 'few'; if ((isBetween(n, 0, 1))) return 'one'; return 'other'; }, '20': function(n) { if ((isBetween((n % 10), 3, 4) || ((n % 10) == 9)) && !( isBetween((n % 100), 10, 19) || isBetween((n % 100), 70, 79) || isBetween((n % 100), 90, 99) )) return 'few'; if ((n % 1000000) === 0 && n !== 0) return 'many'; if ((n % 10) == 2 && !isIn((n % 100), [12, 72, 92])) return 'two'; if ((n % 10) == 1 && !isIn((n % 100), [11, 71, 91])) return 'one'; return 'other'; }, '21': function(n) { if (n === 0) return 'zero'; if (n == 1) return 'one'; return 'other'; }, '22': function(n) { if ((isBetween(n, 0, 1)) || (isBetween(n, 11, 99))) return 'one'; return 'other'; }, '23': function(n) { if ((isBetween((n % 10), 1, 2)) || (n % 20) === 0) return 'one'; return 'other'; }, '24': function(n) { if ((isBetween(n, 3, 10) || isBetween(n, 13, 19))) return 'few'; if (isIn(n, [2, 12])) return 'two'; if (isIn(n, [1, 11])) return 'one'; return 'other'; } }; // return a function that gives the plural form name for a given integer var index = locales2rules[lang.replace(/-.*$/, '')]; if (!(index in pluralRules)) { console.warn('plural form unknown for [' + lang + ']'); return function() { return 'other'; }; } return pluralRules[index]; } // pre-defined 'plural' macro gMacros.plural = function(str, param, key, prop) { var n = parseFloat(param); if (isNaN(n)) return str; // TODO: support other properties (l20n still doesn't...) if (prop != gTextProp) return str; // initialize _pluralRules if (!gMacros._pluralRules) { gMacros._pluralRules = getPluralRules(gLanguage); } var index = '[' + gMacros._pluralRules(n) + ']'; // try to find a [zero|one|two] key if it's defined if (n === 0 && (key + '[zero]') in gL10nData) { str = gL10nData[key + '[zero]'][prop]; } else if (n == 1 && (key + '[one]') in gL10nData) { str = gL10nData[key + '[one]'][prop]; } else if (n == 2 && (key + '[two]') in gL10nData) { str = gL10nData[key + '[two]'][prop]; } else if ((key + index) in gL10nData) { str = gL10nData[key + index][prop]; } else if ((key + '[other]') in gL10nData) { str = gL10nData[key + '[other]'][prop]; } return str; }; /** * l10n dictionary functions */ // fetch an l10n object, warn if not found, apply `args' if possible function getL10nData(key, args, fallback) { var data = gL10nData[key]; if (!data) { console.warn('#' + key + ' is undefined.'); if (!fallback) { return null; } data = fallback; } /** This is where l10n expressions should be processed. * The plan is to support C-style expressions from the l20n project; * until then, only two kinds of simple expressions are supported: * {[ index ]} and {{ arguments }}. */ var rv = {}; for (var prop in data) { var str = data[prop]; str = substIndexes(str, args, key, prop); str = substArguments(str, args, key); rv[prop] = str; } return rv; } // replace {[macros]} with their values function substIndexes(str, args, key, prop) { var reIndex = /\{\[\s*([a-zA-Z]+)\(([a-zA-Z]+)\)\s*\]\}/; var reMatch = reIndex.exec(str); if (!reMatch || !reMatch.length) return str; // an index/macro has been found // Note: at the moment, only one parameter is supported var macroName = reMatch[1]; var paramName = reMatch[2]; var param; if (args && paramName in args) { param = args[paramName]; } else if (paramName in gL10nData) { param = gL10nData[paramName]; } // there's no macro parser yet: it has to be defined in gMacros if (macroName in gMacros) { var macro = gMacros[macroName]; str = macro(str, param, key, prop); } return str; } // replace {{arguments}} with their values function substArguments(str, args, key) { var reArgs = /\{\{\s*(.+?)\s*\}\}/g; return str.replace(reArgs, function(matched_text, arg) { if (args && arg in args) { return args[arg]; } if (arg in gL10nData) { return gL10nData[arg]; } console.log('argument {{' + arg + '}} for #' + key + ' is undefined.'); return matched_text; }); } // translate an HTML element function translateElement(element) { var l10n = getL10nAttributes(element); if (!l10n.id) return; // get the related l10n object var data = getL10nData(l10n.id, l10n.args); if (!data) { console.warn('#' + l10n.id + ' is undefined.'); return; } // translate element (TODO: security checks?) if (data[gTextProp]) { // XXX if (getChildElementCount(element) === 0) { element[gTextProp] = data[gTextProp]; } else { // this element has element children: replace the content of the first // (non-empty) child textNode and clear other child textNodes var children = element.childNodes; var found = false; for (var i = 0, l = children.length; i < l; i++) { if (children[i].nodeType === 3 && /\S/.test(children[i].nodeValue)) { if (found) { children[i].nodeValue = ''; } else { children[i].nodeValue = data[gTextProp]; found = true; } } } // if no (non-empty) textNode is found, insert a textNode before the // first element child. if (!found) { var textNode = document.createTextNode(data[gTextProp]); element.insertBefore(textNode, element.firstChild); } } delete data[gTextProp]; } for (var k in data) { element[k] = data[k]; } } // webkit browsers don't currently support 'children' on SVG elements... function getChildElementCount(element) { if (element.children) { return element.children.length; } if (typeof element.childElementCount !== 'undefined') { return element.childElementCount; } var count = 0; for (var i = 0; i < element.childNodes.length; i++) { count += element.nodeType === 1 ? 1 : 0; } return count; } // translate an HTML subtree function translateFragment(element) { element = element || document.documentElement; // check all translatable children (= w/ a `data-l10n-id' attribute) var children = getTranslatableChildren(element); var elementCount = children.length; for (var i = 0; i < elementCount; i++) { translateElement(children[i]); } // translate element itself if necessary translateElement(element); } return { // get a localized string get: function(key, args, fallbackString) { var index = key.lastIndexOf('.'); var prop = gTextProp; if (index > 0) { // An attribute has been specified prop = key.substr(index + 1); key = key.substring(0, index); } var fallback; if (fallbackString) { fallback = {}; fallback[prop] = fallbackString; } var data = getL10nData(key, args, fallback); if (data && prop in data) { return data[prop]; } return '{{' + key + '}}'; }, // debug getData: function() { return gL10nData; }, getText: function() { return gTextData; }, // get|set the document language getLanguage: function() { return gLanguage; }, setLanguage: function(lang, callback) { loadLocale(lang, function() { if (callback) callback(); translateFragment(); }); }, // get the direction (ltr|rtl) of the current language getDirection: function() { // http://www.w3.org/International/questions/qa-scripts // Arabic, Hebrew, Farsi, Pashto, Urdu var rtlList = ['ar', 'he', 'fa', 'ps', 'ur']; var shortCode = gLanguage.split('-', 1)[0]; return (rtlList.indexOf(shortCode) >= 0) ? 'rtl' : 'ltr'; }, // translate an element or document fragment translate: translateFragment, // this can be used to prevent race conditions getReadyState: function() { return gReadyState; }, ready: function(callback) { if (!callback) { return; } else if (gReadyState == 'complete' || gReadyState == 'interactive') { window.setTimeout(function() { callback(); }); } else if (document.addEventListener) { document.addEventListener('localized', function once() { document.removeEventListener('localized', once); callback(); }); } } }; }) (window, document); manuskript-0.10.0/libs/pdf.js/web/locale/000077500000000000000000000000001354442177200201275ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/ach/000077500000000000000000000000001354442177200206625ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/ach/viewer.properties000066400000000000000000000151601354442177200243040ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Pot buk mukato previous_label=Mukato next.title=Pot buk malubo next_label=Malubo # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Pot buk: page_of=pi {{pageCount}} zoom_out.title=Jwik Matidi zoom_out_label=Jwik Matidi zoom_in.title=Kwot Madit zoom_in_label=Kwot Madit zoom.title=Kwoti presentation_mode.title=Lokke i kit me tyer presentation_mode_label=Kit me tyer open_file.title=Yab Pwail open_file_label=Yab print.title=Go print_label=Go download.title=Gam download_label=Gam bookmark.title=Neno ma kombedi (lok onyo yab i dirica manyen) bookmark_label=Neno ma kombedi # Secondary toolbar and context menu tools.title=Gintic tools_label=Gintic first_page.title=Cit i pot buk mukwongo first_page.label=Cit i pot buk mukwongo first_page_label=Cit i pot buk mukwongo last_page.title=Cit i pot buk magiko last_page.label=Cit i pot buk magiko last_page_label=Cit i pot buk magiko page_rotate_cw.title=Wire i tung lacuc page_rotate_cw.label=Wire i tung lacuc page_rotate_cw_label=Wire i tung lacuc page_rotate_ccw.title=Wire i tung lacam page_rotate_ccw.label=Wire i tung lacam page_rotate_ccw_label=Wire i tung lacam hand_tool_enable.title=Ye gintic me cing hand_tool_enable_label=Ye gintic me cing hand_tool_disable.title=Juk gintic me cing hand_tool_disable_label=Juk gintic me cing # Document properties dialog box document_properties.title=Jami me gin acoya… document_properties_label=Jami me gin acoya… document_properties_file_name=Nying pwail: document_properties_file_size=Dit pa pwail: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=Wiye: document_properties_author=Ngat mucoyo: document_properties_subject=Lok: document_properties_keywords=Lok mapire tek: document_properties_creation_date=Nino dwe me cwec: document_properties_modification_date=Nino dwe me yub: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Lacwec: document_properties_producer=Layub PDF: document_properties_version=Kit PDF: document_properties_page_count=Kwan me pot buk: document_properties_close=Lor # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Lok gintic ma inget toggle_sidebar_label=Lok gintic ma inget outline.title=Nyut rek pa gin acoya outline_label=Pek pa gin acoya attachments.title=Nyut twec attachments_label=Twec thumbs.title=Nyut cal thumbs_label=Cal findbar.title=Nong iye gin acoya findbar_label=Nong # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Pot buk {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Cal me pot buk {{page}} # Find panel button title and messages find_label=Nong: find_previous.title=Nong timme pa lok mukato find_previous_label=Mukato find_next.title=Nong timme pa lok malubo find_next_label=Malubo find_highlight=Wer weng find_match_case_label=Lok marwate find_reached_top=Oo iwi gin acoya, omede ki i tere find_reached_bottom=Oo i agiki me gin acoya, omede ki iwiye find_not_found=Lok pe ononge # Error panel labels error_more_info=Ngec Mukene error_less_info=Ngec Manok error_close=Lor # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Kwena: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Can kikore {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Pwail: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Rek: {{line}} rendering_error=Bal otime i kare me nyuto pot buk. # Predefined zoom values page_scale_width=Lac me iye pot buk page_scale_fit=Porre me pot buk page_scale_auto=Kwot pire kene page_scale_actual=Dite kikome # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Bal loading_error=Bal otime kun cano PDF. invalid_file_error=Pwail me PDF ma pe atir onyo obale woko. missing_file_error=Pwail me PDF tye ka rem. unexpected_response_error=Lagam mape kigeno pa lapok tic. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Lok angea manok] password_label=Ket mung me donyo me yabo pwail me PDF man. password_invalid=Mung me donyo pe atir. Tim ber i tem doki. password_ok=OK password_cancel=Juk printing_not_supported=Ciko: Layeny ma pe teno goyo liweng. printing_not_ready=Ciko: PDF pe ocane weng me agoya. web_fonts_disabled=Kijuko dit pa coc me kakube woko: pe romo tic ki dit pa coc me PDF ma kiketo i kine. document_colors_not_allowed=Pe ki ye ki gin acoya me PDF me tic ki rangi gi kengi: 'Ye pot buk me yero rangi mamegi kengi' kijuko woko i layeny. manuskript-0.10.0/libs/pdf.js/web/locale/af/000077500000000000000000000000001354442177200205155ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/af/viewer.properties000066400000000000000000000155371354442177200241470ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Vorige bladsy previous_label=Vorige next.title=Volgende bladsy next_label=Volgende # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Bladsy: page_of=van {{pageCount}} zoom_out.title=Zoem uit zoom_out_label=Zoem uit zoom_in.title=Zoem in zoom_in_label=Zoem in zoom.title=Zoem presentation_mode.title=Wissel na voorleggingsmodus presentation_mode_label=Voorleggingsmodus open_file.title=Open lêer open_file_label=Open print.title=Druk print_label=Druk download.title=Laai af download_label=Laai af bookmark.title=Huidige aansig (kopieer of open in nuwe venster) bookmark_label=Huidige aansig # Secondary toolbar and context menu tools.title=Nutsgoed tools_label=Nutsgoed first_page.title=Gaan na eerste bladsy first_page.label=Gaan na eerste bladsy first_page_label=Gaan na eerste bladsy last_page.title=Gaan na laaste bladsy last_page.label=Gaan na laaste bladsy last_page_label=Gaan na laaste bladsy page_rotate_cw.title=Roteer kloksgewys page_rotate_cw.label=Roteer kloksgewys page_rotate_cw_label=Roteer kloksgewys page_rotate_ccw.title=Roteer anti-kloksgewys page_rotate_ccw.label=Roteer anti-kloksgewys page_rotate_ccw_label=Roteer anti-kloksgewys hand_tool_enable.title=Aktiveer handjie hand_tool_enable_label=Aktiveer handjie hand_tool_disable.title=Deaktiveer handjie hand_tool_disable_label=Deaktiveer handjie # Document properties dialog box document_properties.title=Dokumenteienskappe… document_properties_label=Dokumenteienskappe… document_properties_file_name=Lêernaam: document_properties_file_size=Lêergrootte: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} kG ({{size_b}} grepe) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MG ({{size_b}} grepe) document_properties_title=Titel: document_properties_author=Outeur: document_properties_subject=Onderwerp: document_properties_keywords=Sleutelwoorde: document_properties_creation_date=Skeppingsdatum: document_properties_modification_date=Wysigingsdatum: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Skepper: document_properties_producer=PDF-vervaardiger: document_properties_version=PDF-weergawe: document_properties_page_count=Aantal bladsye: document_properties_close=Sluit # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Sypaneel aan/af toggle_sidebar_label=Sypaneel aan/af outline.title=Wys dokumentoorsig outline_label=Dokumentoorsig attachments.title=Wys aanhegsels attachments_label=Aanhegsels thumbs.title=Wys duimnaels thumbs_label=Duimnaels findbar.title=Soek in dokument findbar_label=Vind # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Bladsy {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Duimnael van bladsy {{page}} # Find panel button title and messages find_label=Vind: find_previous.title=Vind die vorige voorkoms van die frase find_previous_label=Vorige find_next.title=Vind die volgende voorkoms van die frase find_next_label=Volgende find_highlight=Verlig alle find_match_case_label=Kassensitief find_reached_top=Bokant van dokument is bereik; gaan voort van onder af find_reached_bottom=Einde van dokument is bereik; gaan voort van bo af find_not_found=Frase nie gevind nie # Error panel labels error_more_info=Meer inligting error_less_info=Minder inligting error_close=Sluit # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (ID: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Boodskap: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stapel: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Lêer: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Lyn: {{line}} rendering_error='n Fout het voorgekom toe die bladsy weergegee is. # Predefined zoom values page_scale_width=Bladsywydte page_scale_fit=Pas bladsy page_scale_auto=Outomatiese zoem page_scale_actual=Werklike grootte # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Fout loading_error='n Fout het voorgekom met die laai van die PDF. invalid_file_error=Ongeldige of korrupte PDF-lêer. missing_file_error=PDF-lêer is weg. unexpected_response_error=Onverwagse antwoord van bediener. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}}-annotasie password_label=Gee die wagwoord om dié PDF-lêer mee te open. password_invalid=Ongeldige wagwoord. Probeer gerus weer. password_ok=OK password_cancel=Kanselleer printing_not_supported=Waarskuwing: Dié blaaier ondersteun nie drukwerk ten volle nie. printing_not_ready=Waarskuwing: Die PDF is nog nie volledig gelaai vir drukwerk nie. web_fonts_disabled=Webfonte is gedeaktiveer: kan nie PDF-fonte wat ingebed is, gebruik nie. document_colors_not_allowed=PDF-dokumente word nie toegelaat om hul eie kleure te gebruik nie: 'Laat bladsye toe om hul eie kleure te kies' is gedeaktiveer in die blaaier. manuskript-0.10.0/libs/pdf.js/web/locale/ak/000077500000000000000000000000001354442177200205225ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/ak/viewer.properties000066400000000000000000000123051354442177200241420ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Krataafa baako a etwa mu previous_label=Ekyiri-baako next.title=Krataafa a edi so baako next_label=Dea-ɛ-di-so-baako # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Krataafa: page_of=wɔ {{pageCount}} zoom_out.title=Zuum pue zoom_out_label=Zuum ba abɔnten zoom_in.title=Zuum kɔ mu zoom_in_label=Zuum kɔ mu zoom.title=Zuum presentation_mode.title=Sesa kɔ Yɛkyerɛ Tebea mu presentation_mode_label=Yɛkyerɛ Tebea open_file.title=Bue Fael open_file_label=Bue print.title=Prente print_label=Prente download.title=Twe download_label=Twe bookmark.title=Seisei nhwɛ (fa anaaso bue wɔ tokuro foforo mu) bookmark_label=Seisei nhwɛ # Secondary toolbar and context menu # Document properties dialog box # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_title=Ti asɛm: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Sɔ anaaso dum saedbaa toggle_sidebar_label=Sɔ anaaso dum saedbaa outline.title=Kyerɛ dɔkomɛnt bɔbea outline_label=Dɔkomɛnt bɔbea thumbs.title=Kyerɛ mfoniwaa thumbs_label=Mfoniwaa findbar.title=Hu wɔ dɔkomɛnt no mu findbar_label=Hu # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Krataafa {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Krataafa ne mfoniwaa {{page}} # Find panel button title and messages find_label=Hunu: find_previous.title=San hu fres wɔ ekyiri baako find_previous_label=Ekyiri baako find_next.title=San hu fres no wɔ enim baako find_next_label=Ndiso find_highlight=Hyɛ bibiara nso find_match_case_label=Fa susu kaase find_reached_top=Edu krataafa ne soro, atoa so efiri ase find_reached_bottom=Edu krataafa n'ewiei, atoa so efiri soro find_not_found=Ennhu fres # Error panel labels error_more_info=Infɔmehyɛn bio a wɔka ho error_less_info=Te infɔmehyɛn bio a wɔka ho so # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{vɛɛhyen}} (nsi: {{si}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Nkrato: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Staake: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Fael: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Laen: {{line}} rendering_error=Mfomso bae wɔ bere a wɔ rekyerɛ krataafa no. # Predefined zoom values page_scale_width=Krataafa tɛtrɛtɛ page_scale_fit=Krataafa ehimtwa page_scale_auto=Zuum otomatik page_scale_actual=Kɛseyɛ ankasa # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. # Loading indicator messages loading_error_indicator=Mfomso loading_error=Mfomso bae wɔ bere a wɔreloode PDF no. invalid_file_error=PDF fael no nndi mu anaaso ho atɔ kyima. missing_file_error=PDF fael no ayera. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Tɛkst-nyiano] password_ok=OK password_cancel=Twa-mu printing_not_supported=Kɔkɔbɔ: Brawsa yi nnhyɛ daa mma prent ho kwan. printing_not_ready=Kɔkɔbɔ: Wɔnntwee PDF fael no nyinara mmbaee ama wo ɛ tumi aprente. web_fonts_disabled=Ɔedum wɛb-mfɔnt: nntumi mmfa PDF mfɔnt a wɔhyɛ mu nndi dwuma. document_colors_not_allowed=Wɔmma ho kwan sɛ PDF adɔkomɛnt de wɔn ara wɔn ahosu bɛdi dwuma: wɔ adum 'Ma ho kwan ma nkrataafa mpaw wɔn ara wɔn ahosu' wɔ brawsa yi mu. manuskript-0.10.0/libs/pdf.js/web/locale/an/000077500000000000000000000000001354442177200205255ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/an/viewer.properties000066400000000000000000000162331354442177200241510ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Pachina anterior previous_label=Anterior next.title=Pachina siguient next_label=Siguient # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Pachina: page_of=de {{pageCount}} zoom_out.title=Achiquir zoom_out_label=Achiquir zoom_in.title=Agrandir zoom_in_label=Agrandir zoom.title=Grandaria presentation_mode.title=Cambear t'o modo de presentación presentation_mode_label=Modo de presentación open_file.title=Ubrir o fichero open_file_label=Ubrir print.title=Imprentar print_label=Imprentar download.title=Descargar download_label=Descargar bookmark.title=Vista actual (copiar u ubrir en una nueva finestra) bookmark_label=Anvista actual # Secondary toolbar and context menu tools.title=Ferramientas tools_label=Ferramientas first_page.title=Ir ta la primer pachina first_page.label=Ir ta la primer pachina first_page_label=Ir ta la primer pachina last_page.title=Ir ta la zaguer pachina last_page.label=Ir ta la zaguera pachina last_page_label=Ir ta la zaguer pachina page_rotate_cw.title=Chirar enta la dreita page_rotate_cw.label=Chirar enta la dreita page_rotate_cw_label=Chira enta la dreita page_rotate_ccw.title=Chirar enta la zurda page_rotate_ccw.label=Chirar en sentiu antihorario page_rotate_ccw_label=Chirar enta la zurda hand_tool_enable.title=Activar a ferramienta man hand_tool_enable_label=Activar a ferramenta man hand_tool_disable.title=Desactivar a ferramienta man hand_tool_disable_label=Desactivar a ferramienta man # Document properties dialog box document_properties.title=Propiedatz d'o documento... document_properties_label=Propiedatz d'o documento... document_properties_file_name=Nombre de fichero: document_properties_file_size=Grandaria d'o fichero: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=Titol: document_properties_author=Autor: document_properties_subject=Afer: document_properties_keywords=Parolas clau: document_properties_creation_date=Calendata de creyación: document_properties_modification_date=Calendata de modificación: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Creyador: document_properties_producer=Creyador de PDF: document_properties_version=Versión de PDF: document_properties_page_count=Numero de pachinas: document_properties_close=Zarrar # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Amostrar u amagar a barra lateral toggle_sidebar_label=Amostrar a barra lateral outline.title=Amostrar o esquema d'o documento outline_label=Esquema d'o documento attachments.title=Amostrar os adchuntos attachments_label=Adchuntos thumbs.title=Amostrar as miniaturas thumbs_label=Miniaturas findbar.title=Trobar en o documento findbar_label=Trobar # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Pachina {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Miniatura d'a pachina {{page}} # Find panel button title and messages find_label=Trobar: find_previous.title=Trobar l'anterior coincidencia d'a frase find_previous_label=Anterior find_next.title=Trobar a siguient coincidencia d'a frase find_next_label=Siguient find_highlight=Resaltar-lo tot find_match_case_label=Coincidencia de mayusclas/minusclas find_reached_top=S'ha plegau a l'inicio d'o documento, se contina dende baixo find_reached_bottom=S'ha plegau a la fin d'o documento, se contina dende alto find_not_found=No s'ha trobau a frase # Error panel labels error_more_info=Mas información error_less_info=Menos información error_close=Zarrar # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Mensache: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Pila: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Fichero: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Linia: {{line}} rendering_error=Ha ocurriu una error en renderizar a pachina. # Predefined zoom values page_scale_width=Amplaria d'a pachina page_scale_fit=Achuste d'a pachina page_scale_auto=Grandaria automatica page_scale_actual=Grandaria actual # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Error loading_error=S'ha produciu una error en cargar o PDF. invalid_file_error=O PDF no ye valido u ye estorbau. missing_file_error=No i ha fichero PDF. unexpected_response_error=Respuesta a lo servicio inasperada. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Anotación {{type}}] password_label=Introduzca a clau ta ubrir iste fichero PDF. password_invalid=Clau invalida. Torna a intentar-lo. password_ok=Acceptar password_cancel=Cancelar printing_not_supported=Pare cuenta: Iste navegador no maneya totalment as impresions. printing_not_ready=Aviso: Encara no se ha cargau completament o PDF ta imprentar-lo. web_fonts_disabled=As fuents web son desactivadas: no se puet incrustar fichers PDF. document_colors_not_allowed=Os documentos PDF no pueden fer servir as suyas propias colors: 'Permitir que as pachinas triguen as suyas propias colors' ye desactivau en o navegador. manuskript-0.10.0/libs/pdf.js/web/locale/ar/000077500000000000000000000000001354442177200205315ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/ar/viewer.properties000066400000000000000000000177441354442177200241650ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=الصفحة السابقة previous_label=السابقة next.title=الصفحة التالية next_label=التالية # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=صفحة: page_of=من {{pageCount}} zoom_out.title=بعّد zoom_out_label=بعّد zoom_in.title=قرّب zoom_in_label=قرّب zoom.title=التقريب presentation_mode.title=انتقل لوضع العرض التقديمي presentation_mode_label=وضع العرض التقديمي open_file.title=افتح ملفًا open_file_label=افتح print.title=اطبع print_label=اطبع download.title=نزّل download_label=نزّل bookmark.title=المنظور الحالي (انسخ أو افتح في نافذة جديدة) bookmark_label=المنظور الحالي # Secondary toolbar and context menu tools.title=الأدوات tools_label=الأدوات first_page.title=اذهب إلى الصفحة الأولى first_page.label=اذهب إلى الصفحة الأولى first_page_label=اذهب إلى الصفحة الأولى last_page.title=اذهب إلى الصفحة الأخيرة last_page.label=اذهب إلى الصفحة الأخيرة last_page_label=اذهب إلى الصفحة الأخيرة page_rotate_cw.title=أدر باتجاه عقارب الساعة page_rotate_cw.label=أدر باتجاه عقارب الساعة page_rotate_cw_label=أدر باتجاه عقارب الساعة page_rotate_ccw.title=أدر بعكس اتجاه عقارب الساعة page_rotate_ccw.label=أدر بعكس اتجاه عقارب الساعة page_rotate_ccw_label=أدر بعكس اتجاه عقارب الساعة hand_tool_enable.title=فعّل أداة اليد hand_tool_enable_label=فعّل أداة اليد hand_tool_disable.title=عطّل أداة اليد hand_tool_disable_label=عطّل أداة اليد # Document properties dialog box document_properties.title=خصائص المستند… document_properties_label=خصائص المستند… document_properties_file_name=اسم الملف: document_properties_file_size=حجم الملف: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} ك.بايت ({{size_b}} بايت) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} م.بايت ({{size_b}} بايت) document_properties_title=العنوان: document_properties_author=المؤلف: document_properties_subject=الموضوع: document_properties_keywords=الكلمات الأساسية: document_properties_creation_date=تاريخ الإنشاء: document_properties_modification_date=تاريخ التعديل: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}، {{time}} document_properties_creator=المنشئ: document_properties_producer=منتج PDF: document_properties_version=إصدارة PDF: document_properties_page_count=عدد الصفحات: document_properties_close=أغلق # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=بدّل الشريط الجانبي toggle_sidebar_label=بدّل الشريط الجانبي outline.title=اعرض مخطط المستند outline_label=مخطط المستند attachments.title=اعرض المرفقات attachments_label=المُرفقات thumbs.title=اعرض مُصغرات thumbs_label=مُصغّرات findbar.title=ابحث في المستند findbar_label=ابحث # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=صفحة {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=مصغّرة صفحة {{page}} # Find panel button title and messages find_label=ابحث: find_previous.title=ابحث عن التّواجد السّابق للعبارة find_previous_label=السابق find_next.title=ابحث عن التّواجد التّالي للعبارة find_next_label=التالي find_highlight=أبرِز الكل find_match_case_label=طابق حالة الأحرف find_reached_top=تابعت من الأسفل بعدما وصلت إلى بداية المستند find_reached_bottom=تابعت من الأعلى بعدما وصلت إلى نهاية المستند find_not_found=لا وجود للعبارة # Error panel labels error_more_info=معلومات أكثر error_less_info=معلومات أقل error_close=أغلق # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=‏PDF.js ن{{version}} ‏(بناء: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=الرسالة: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=الرصّة: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=الملف: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=السطر: {{line}} rendering_error=حدث خطأ أثناء عرض الصفحة. # Predefined zoom values page_scale_width=عرض الصفحة page_scale_fit=ملائمة الصفحة page_scale_auto=تقريب تلقائي page_scale_actual=الحجم الحقيقي # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}٪ # Loading indicator messages loading_error_indicator=عطل loading_error=حدث عطل أثناء تحميل ملف PDF. invalid_file_error=ملف PDF تالف أو غير صحيح. missing_file_error=ملف PDF غير موجود. unexpected_response_error=استجابة خادوم غير متوقعة. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[تعليق {{type}}] password_label=أدخل لكلمة السر لفتح هذا الملف. password_invalid=كلمة سر خطأ. من فضلك أعد المحاولة. password_ok=حسنا password_cancel=ألغِ printing_not_supported=تحذير: لا يدعم هذا المتصفح الطباعة بشكل كامل. printing_not_ready=تحذير: ملف PDF لم يُحمّل كاملًا للطباعة. web_fonts_disabled=خطوط الوب مُعطّلة: تعذّر استخدام خطوط PDF المُضمّنة. document_colors_not_allowed=ليس مسموحًا لملفات PDF باستخدام ألوانها الخاصة: خيار 'اسمح للصفحات باختيار ألوانها الخاصة' ليس مُفعّلًا في المتصفح. manuskript-0.10.0/libs/pdf.js/web/locale/as/000077500000000000000000000000001354442177200205325ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/as/viewer.properties000066400000000000000000000240671354442177200241620ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=পূৰ্বৱৰ্তী পৃষ্ঠা previous_label=পূৰ্বৱৰ্তী next.title=পৰৱৰ্তী পৃষ্ঠা next_label=পৰৱৰ্তী # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=পৃষ্ঠা: page_of=ৰ {{pageCount}} zoom_out.title=জুম আউট zoom_out_label=জুম আউট zoom_in.title=জুম ইন zoom_in_label=জুম ইন zoom.title=জুম কৰক presentation_mode.title=উপস্থাপন অৱস্থালে যাওক presentation_mode_label=উপস্থাপন অৱস্থা open_file.title=ফাইল খোলক open_file_label=খোলক print.title=প্ৰিন্ট কৰক print_label=প্ৰিন্ট কৰক download.title=ডাউনল'ড কৰক download_label=ডাউনল'ড কৰক bookmark.title=বৰ্তমান দৃশ্য (কপি কৰক অথবা নতুন উইন্ডোত খোলক) bookmark_label=বৰ্তমান দৃশ্য # Secondary toolbar and context menu tools.title=সঁজুলিসমূহ tools_label=সঁজুলিসমূহ first_page.title=প্ৰথম পৃষ্ঠাত যাওক first_page.label=প্ৰথম পৃষ্ঠাত যাওক first_page_label=প্ৰথম পৃষ্ঠাত যাওক last_page.title=সৰ্বশেষ পৃষ্ঠাত যাওক last_page.label=সৰ্বশেষ পৃষ্ঠাত যাওক last_page_label=সৰ্বশেষ পৃষ্ঠাত যাওক page_rotate_cw.title=ঘড়ীৰ দিশত ঘুৰাওক page_rotate_cw.label=ঘড়ীৰ দিশত ঘুৰাওক page_rotate_cw_label=ঘড়ীৰ দিশত ঘুৰাওক page_rotate_ccw.title=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক page_rotate_ccw.label=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক page_rotate_ccw_label=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক hand_tool_enable.title=হাঁত সঁজুলি সামৰ্থবান কৰক hand_tool_enable_label=হাঁত সঁজুলি সামৰ্থবান কৰক hand_tool_disable.title=হাঁত সঁজুলি অসামৰ্থবান কৰক hand_tool_disable_label=হাঁত সঁজুলি অসামৰ্থবান কৰক # Document properties dialog box document_properties.title=দস্তাবেজৰ বৈশিষ্ট্যসমূহ… document_properties_label=দস্তাবেজৰ বৈশিষ্ট্যসমূহ… document_properties_file_name=ফাইল নাম: document_properties_file_size=ফাইলৰ আকাৰ: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=শীৰ্ষক: document_properties_author=লেখক: document_properties_subject=বিষয়: document_properties_keywords=কিৱাৰ্ডসমূহ: document_properties_creation_date=সৃষ্টিৰ তাৰিখ: document_properties_modification_date=পৰিবৰ্তনৰ তাৰিখ: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=সৃষ্টিকৰ্তা: document_properties_producer=PDF উৎপাদক: document_properties_version=PDF সংস্কৰণ: document_properties_page_count=পৃষ্ঠাৰ গণনা: document_properties_close=বন্ধ কৰক # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=কাষবাৰ টগল কৰক toggle_sidebar_label=কাষবাৰ টগল কৰক outline.title=দস্তাবেজ আউটলাইন দেখুৱাওক outline_label=দস্তাবেজ আউটলাইন attachments.title=এটাচমেন্টসমূহ দেখুৱাওক attachments_label=এটাচমেন্টসমূহ thumbs.title=থাম্বনেইলসমূহ দেখুৱাওক thumbs_label=থাম্বনেইলসমূহ findbar.title=দস্তাবেজত সন্ধান কৰক findbar_label=সন্ধান কৰক # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=পৃষ্ঠা {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=পৃষ্ঠাৰ থাম্বনেইল {{page}} # Find panel button title and messages find_label=সন্ধান কৰক: find_previous.title=বাক্যাংশৰ পূৰ্বৱৰ্তী উপস্থিতি সন্ধান কৰক find_previous_label=পূৰ্বৱৰ্তী find_next.title=বাক্যাংশৰ পৰৱৰ্তী উপস্থিতি সন্ধান কৰক find_next_label=পৰৱৰ্তী find_highlight=সকলো উজ্জ্বল কৰক find_match_case_label=ফলা মিলাওক find_reached_top=তলৰ পৰা আৰম্ভ কৰি, দস্তাবেজৰ ওপৰলৈ অহা হৈছে find_reached_bottom=ওপৰৰ পৰা আৰম্ভ কৰি, দস্তাবেজৰ তললৈ অহা হৈছে find_not_found=বাক্যাংশ পোৱা নগল # Error panel labels error_more_info=অধিক তথ্য error_less_info=কম তথ্য error_close=বন্ধ কৰক # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=বাৰ্তা: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=স্টেক: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=ফাইল: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=শাৰী: {{line}} rendering_error=এই পৃষ্ঠা ৰেণ্ডাৰ কৰোতে এটা ত্ৰুটি দেখা দিলে। # Predefined zoom values page_scale_width=পৃষ্ঠাৰ প্ৰস্থ page_scale_fit=পৃষ্ঠা খাপ page_scale_auto=স্বচালিত জুম page_scale_actual=প্ৰকৃত আকাৰ # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. # Loading indicator messages loading_error_indicator=ত্ৰুটি loading_error=PDF ল'ড কৰোতে এটা ত্ৰুটি দেখা দিলে। invalid_file_error=অবৈধ অথবা ক্ষতিগ্ৰস্থ PDF file। missing_file_error=সন্ধানহিন PDF ফাইল। unexpected_response_error=অপ্ৰত্যাশিত চাৰ্ভাৰ প্ৰতিক্ৰিয়া। # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} টোকা] password_label=এই PDF ফাইল খোলিবলৈ পাছৱৰ্ড সুমুৱাওক। password_invalid=অবৈধ পাছৱৰ্ড। অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক। password_ok=ঠিক আছে password_cancel=বাতিল কৰক printing_not_supported=সতৰ্কবাৰ্তা: প্ৰিন্টিং এই ব্ৰাউছাৰ দ্বাৰা সম্পূৰ্ণভাৱে সমৰ্থিত নহয়। printing_not_ready=সতৰ্কবাৰ্তা: PDF প্ৰিন্টিংৰ বাবে সম্পূৰ্ণভাৱে ল'ডেড নহয়। web_fonts_disabled=ৱেব ফন্টসমূহ অসামৰ্থবান কৰা আছে: অন্তৰ্ভুক্ত PDF ফন্টসমূহ ব্যৱহাৰ কৰিবলে অক্ষম। document_colors_not_allowed=PDF দস্তাবেজসমূহৰ সিহতৰ নিজস্ব ৰঙ ব্যৱহাৰ কৰাৰ অনুমতি নাই: ব্ৰাউছাৰত 'পৃষ্ঠাসমূহক সিহতৰ নিজস্ব ৰঙ নিৰ্বাচন কৰাৰ অনুমতি দিয়ক' অসামৰ্থবান কৰা আছে। manuskript-0.10.0/libs/pdf.js/web/locale/ast/000077500000000000000000000000001354442177200207165ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/ast/viewer.properties000066400000000000000000000113101354442177200243310ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. previous.title = Páxina anterior previous_label = Anterior next.title = Páxina siguiente next_label = Siguiente page_label = Páxina: page_of = de {{pageCount}} zoom_out.title = Reducir zoom_out_label = Reducir zoom_in.title = Aumentar zoom_in_label = Aumentar zoom.title = Tamañu print.title = Imprentar print_label = Imprentar open_file.title = Abrir ficheru open_file_label = Abrir download.title = Descargar download_label = Descargar bookmark.title = Vista actual (copiar o abrir nuna nueva ventana) bookmark_label = Vista actual outline.title = Amosar l'esquema del documentu outline_label = Esquema del documentu thumbs.title = Amosar miniatures thumbs_label = Miniatures thumb_page_title = Páxina {{page}} thumb_page_canvas = Miniatura de la páxina {{page}} error_more_info = Más información error_less_info = Menos información error_close = Zarrar error_message = Mensaxe: {{message}} error_stack = Pila: {{stack}} error_file = Ficheru: {{file}} error_line = Llinia: {{line}} rendering_error = Hebo un fallu al renderizar la páxina. page_scale_width = Anchor de la páxina page_scale_fit = Axuste de la páxina page_scale_auto = Tamañu automáticu page_scale_actual = Tamañu actual loading_error_indicator = Fallu loading_error = Hebo un fallu al cargar el PDF. printing_not_supported = Avisu: Imprentar nun tien sofitu téunicu completu nesti navegador. presentation_mode_label = presentation_mode.title = page_rotate_cw.label = page_rotate_ccw.label = last_page.label = Dir a la cabera páxina invalid_file_error = Ficheru PDF inválidu o corruptu. first_page.label = Dir a la primer páxina findbar_label = Guetar findbar.title = Guetar nel documentu find_previous_label = Anterior find_previous.title = Alcontrar l'anterior apaición de la fras find_not_found = Frase non atopada find_next_label = Siguiente find_next.title = Alcontrar la siguiente apaición d'esta fras find_match_case_label = Coincidencia de mayús./minús. find_label = Guetar: find_highlight = Remarcar toos find_reached_top=Algamóse'l principiu del documentu, siguir dende'l final find_reached_bottom=Algamóse'l final del documentu, siguir dende'l principiu web_fonts_disabled = Les fontes web tán desactivaes: ye imposible usar les fontes PDF embebíes. toggle_sidebar_label = Camudar barra llateral toggle_sidebar.title = Camudar barra llateral missing_file_error = Nun hai ficheru PDF. error_version_info = PDF.js v{{version}} (build: {{build}}) printing_not_ready = Avisu: Esti PDF nun se cargó completamente pa poder imprentase. text_annotation_type.alt = [Anotación {{type}}] document_colors_disabled = Los documentos PDF nun tienen permitío usar los sos propios colores: 'Permitir a les páxines elexir los sos propios colores' ta desactivao nel navegador. tools_label = Ferramientes tools.title = Ferramientes password_ok = Aceutar password_label = Introduz la contraseña p'abrir esti ficheru PDF password_invalid = Contraseña non válida. Vuelvi a intentalo. password_cancel = Encaboxar page_rotate_cw_label = Xirar en sen horariu page_rotate_cw.title = Xirar en sen horariu page_rotate_ccw_label = Xirar en sen antihorariu page_rotate_ccw.title = Xirar en sen antihorariu last_page_label = Dir a la postrer páxina last_page.title = Dir a la postrer páxina hand_tool_enable_label = Activar ferramienta mano hand_tool_enable.title = Activar ferramienta mano hand_tool_disable_label = Desactivar ferramienta mano hand_tool_disable.title = Desactivar ferramienta mano first_page_label = Dir a la primer páxina first_page.title = Dir a la primer páxina document_properties_version = Versión PDF: document_properties_title = Títulu: document_properties_subject = Asuntu: document_properties_producer = Productor PDF: document_properties_page_count = Númberu de páxines: document_properties_modification_date = Data de modificación: document_properties_mb = {{size_mb}} MB ({{size_b}} bytes) document_properties_label = Propiedaes del documentu… document_properties_keywords = Pallabres clave: document_properties_kb = {{size_kb}} KB ({{size_b}} bytes) document_properties_file_size = Tamañu de ficheru: document_properties_file_name = Nome de ficheru: document_properties_date_string = {{date}}, {{time}} document_properties_creator = Creador: document_properties_creation_date = Data de creación: document_properties_close = Zarrar document_properties_author = Autor: document_properties.title = Propiedaes del documentu… attachments_label = Axuntos attachments.title = Amosar axuntos unexpected_response_error = Rempuesta inesperada del sirvidor. page_scale_percent = {{scale}}% manuskript-0.10.0/libs/pdf.js/web/locale/az/000077500000000000000000000000001354442177200205415ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/az/viewer.properties000066400000000000000000000162761354442177200241740ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Əvvəlki səhifə previous_label=Əvvəlkini tap next.title=Növbəti səhifə next_label=İrəli # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Səhifə: page_of=/ {{pageCount}} zoom_out.title=Uzaqlaş zoom_out_label=Uzaqlaş zoom_in.title=Yaxınlaş zoom_in_label=Yaxınlaş zoom.title=Yaxınlaşdırma presentation_mode.title=Təqdimat Rejiminə Keç presentation_mode_label=Təqdimat Rejimi open_file.title=Fayl Aç open_file_label=Aç print.title=Yazdır print_label=Yazdır download.title=Yüklə download_label=Yüklə bookmark.title=Hazırkı görünüş (köçür və ya yeni pəncərədə aç) bookmark_label=Hazırki görünüş # Secondary toolbar and context menu tools.title=Alətlər tools_label=Alətlər first_page.title=İlk Səhifəyə get first_page.label=İlk Səhifəyə get first_page_label=İlk Səhifəyə get last_page.title=Son Səhifəyə get last_page.label=Son Səhifəyə get last_page_label=Son Səhifəyə get page_rotate_cw.title=Saat İstiqamətində Fırlat page_rotate_cw.label=Saat İstiqamətində Fırlat page_rotate_cw_label=Saat İstiqamətində Fırlat page_rotate_ccw.title=Saat İstiqamətinin Əksinə Fırlat page_rotate_ccw.label=Saat İstiqamətinin Əksinə Fırlat page_rotate_ccw_label=Saat İstiqamətinin Əksinə Fırlat hand_tool_enable.title=Əl alətini aktiv et hand_tool_enable_label=Əl alətini aktiv et hand_tool_disable.title=Əl alətini deaktiv et hand_tool_disable_label=Əl alətini deaktiv et # Document properties dialog box document_properties.title=Sənəd xüsusiyyətləri… document_properties_label=Sənəd xüsusiyyətləri… document_properties_file_name=Fayl adı: document_properties_file_size=Fayl ölçüsü: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bayt) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bayt) document_properties_title=Başlık: document_properties_author=Müəllif: document_properties_subject=Mövzu: document_properties_keywords=Açar sözlər: document_properties_creation_date=Yaradılış Tarixi : document_properties_modification_date=Dəyişdirilmə Tarixi : # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Yaradan: document_properties_producer=PDF yaradıcısı: document_properties_version=PDF versiyası: document_properties_page_count=Səhifə sayı: document_properties_close=Qapat # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Yan Paneli Aç/Bağla toggle_sidebar_label=Yan Paneli Aç/Bağla outline.title=Sənəd struktunu göstər outline_label=Sənəd strukturu attachments.title=Bağlamaları göstər attachments_label=Bağlamalar thumbs.title=Kiçik şəkilləri göstər thumbs_label=Kiçik şəkillər findbar.title=Sənəddə Tap findbar_label=Tap # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Səhifə{{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas={{page}} səhifəsinin kiçik vəziyyəti # Find panel button title and messages find_label=Tap: find_previous.title=Bir öncəki uyğun gələn sözü tapır find_previous_label=Geri find_next.title=Bir sonrakı uyğun gələn sözü tapır find_next_label=İrəli find_highlight=İşarələ find_match_case_label=Böyük/kiçik hərfə həssaslıq find_reached_top=Sənədin yuxarısına çatdı, aşağıdan davam edir find_reached_bottom=Sənədin sonuna çatdı, yuxarıdan davam edir find_not_found=Uyğunlaşma tapılmadı # Error panel labels error_more_info=Daha çox məlumati error_less_info=Daha az məlumat error_close=Qapat # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (yığma: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=İsmarıc: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stek: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Fayl: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Sətir: {{line}} rendering_error=Səhifə göstərilərkən səhv yarandı. # Predefined zoom values page_scale_width=Səhifə genişliyi page_scale_fit=Səhifəni sığdır page_scale_auto=Avtomatik yaxınlaşdır page_scale_actual=Hazırki Həcm # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Səhv loading_error=PDF yüklenərkən bir səhv yarandı. invalid_file_error=Səhv və ya zədələnmiş olmuş PDF fayl. missing_file_error=PDF fayl yoxdur. unexpected_response_error=Gözlənilməz server cavabı. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Annotasiyası] password_label=Bu PDF faylı açmaq üçün şifrəni daxil edin. password_invalid=Şifrə yanlışdır. Bir daha sınayın. password_ok=Tamam password_cancel=Ləğv et printing_not_supported=Xəbərdarlıq: Çap bu səyyah tərəfindən tam olaraq dəstəklənmir. printing_not_ready=Xəbərdarlıq: PDF çap üçün tam yüklənməyib. web_fonts_disabled=Web Şriftlər söndürülüb: yerləşdirilmiş PDF şriftlərini istifadə etmək mümkün deyil. document_colors_not_allowed=PDF sənədlərə öz rənglərini işlətməyə icazə verilmir: 'Səhifələrə öz rənglərini istifadə etməyə icazə vermə' səyyahda söndürülüb. manuskript-0.10.0/libs/pdf.js/web/locale/be/000077500000000000000000000000001354442177200205155ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/be/viewer.properties000066400000000000000000000144201354442177200241350ustar00rootroot00000000000000previous.title = Папярэдняя старонка previous_label = Папярэдняя next.title = Наступная старонка next_label = Наступная page_label = Старонка: page_of = з {{pageCount}} zoom_out.title = Паменшыць zoom_out_label = Паменшыць zoom_in.title = Павялічыць zoom_in_label = Павялічыць zoom.title = Павялічэнне тэксту presentation_mode.title = Пераключыцца ў рэжым паказу presentation_mode_label = Рэжым паказу open_file.title = Адчыніць файл open_file_label = Адчыніць print.title = Друкаваць print_label = Друкаваць download.title = Загрузка download_label = Загрузка bookmark.title = Цяперашняя праява (скапіяваць або адчыніць у новым акне) bookmark_label = Цяперашняя праява tools.title = Прылады tools_label = Прылады first_page.title = Перайсці на першую старонку first_page.label = Перайсці на першую старонку first_page_label = Перайсці на першую старонку last_page.title = Перайсці на апошнюю старонку last_page.label = Перайсці на апошнюю старонку last_page_label = Перайсці на апошнюю старонку page_rotate_cw.title = Павярнуць па гадзіннікавай стрэлцы page_rotate_cw.label = Павярнуць па гадзіннікавай стрэлцы page_rotate_cw_label = Павярнуць па гадзіннікавай стрэлцы page_rotate_ccw.title = Павярнуць супраць гадзіннікавай стрэлкі page_rotate_ccw.label = Павярнуць супраць гадзіннікавай стрэлкі page_rotate_ccw_label = Павярнуць супраць гадзіннікавай стрэлкі hand_tool_enable.title = Дазволіць ручную прыладу hand_tool_enable_label = Дазволіць ручную прыладу hand_tool_disable.title = Забараніць ручную прыладу hand_tool_disable_label = Забараніць ручную прыладу document_properties.title = Уласцівасці дакумента… document_properties_label = Уласцівасці дакумента… document_properties_file_name = Назва файла: document_properties_file_size = Памер файла: document_properties_kb = {{size_kb}} КБ ({{size_b}} байт) document_properties_mb = {{size_mb}} МБ ({{size_b}} байт) document_properties_title = Загаловак: document_properties_author = Аўтар: document_properties_subject = Тэма: document_properties_keywords = Ключавыя словы: document_properties_creation_date = Дата стварэння: document_properties_modification_date = Дата змянення: document_properties_date_string = {{date}}, {{time}} document_properties_creator = Стваральнік: document_properties_producer = Вырабнік PDF: document_properties_version = Версія PDF: document_properties_page_count = Колькасць старонак: document_properties_close = Зачыніць toggle_sidebar.title = Пераключэнне палічкі toggle_sidebar_label = Пераключыць палічку outline.title = Паказ будовы дакумента outline_label = Будова дакумента attachments.title = Паказаць далучэнні attachments_label = Далучэнні thumbs.title = Паказ накідаў thumbs_label = Накіды findbar.title = Пошук у дакуменце findbar_label = Знайсці thumb_page_title = Старонка {{page}} thumb_page_canvas = Накід старонкі {{page}} find_label = Пошук: find_previous.title = Знайсці папярэдні выпадак выразу find_previous_label = Папярэдні find_next.title = Знайсці наступны выпадак выразу find_next_label = Наступны find_highlight = Падфарбаваць усе find_match_case_label = Адрозніваць вялікія/малыя літары find_reached_top = Дасягнуты пачатак дакумента, працяг з канца find_reached_bottom = Дасягнуты канец дакумента, працяг з пачатку find_not_found = Выраз не знойдзены error_more_info = Падрабязней error_less_info = Сцісла error_close = Закрыць error_version_info = PDF.js в{{version}} (пабудова: {{build}}) error_message = Паведамленне: {{message}} error_stack = Стос: {{stack}} error_file = Файл: {{file}} error_line = Радок: {{line}} rendering_error = Здарылася памылка падчас адлюстравання старонкі. page_scale_width = Шырыня старонкі page_scale_fit = Уцісненне старонкі page_scale_auto = Самастойнае павялічэнне page_scale_actual = Сапраўдны памер loading_error_indicator = Памылка loading_error = Здарылася памылка падчас загрузкі PDF. invalid_file_error = Няспраўны або пашкоджаны файл PDF. missing_file_error = Адсутны файл PDF. text_annotation_type.alt = [{{type}} Annotation] password_label = Увядзіце пароль, каб адчыніць гэты файл PDF. password_invalid = Крывы пароль. Паспрабуйце зноў. password_ok = Добра password_cancel = Скасаваць printing_not_supported = Папярэджанне: друк не падтрымлівацца цалкам гэтым азіральнікам. printing_not_ready = Увага: PDF не сцягнуты цалкам для друкавання. web_fonts_disabled = Шрыфты Сеціва забаронены: немгчыма ўжываць укладзеныя шрыфты PDF. document_colors_disabled = Дакументам PDF не дазволена карыстацца сваімі ўласнымі колерамі: 'Дазволіць старонкам выбіраць свае ўласныя колеры' абяздзейнена ў азіральніку. manuskript-0.10.0/libs/pdf.js/web/locale/bg/000077500000000000000000000000001354442177200205175ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/bg/viewer.properties000066400000000000000000000223561354442177200241460ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Предишна страница previous_label=Предишна next.title=Следваща страница next_label=Следваща # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Страница: page_of=от {{pageCount}} zoom_out.title=Отдалечаване zoom_out_label=Отдалечаване zoom_in.title=Приближаване zoom_in_label=Приближаване zoom.title=Мащабиране presentation_mode.title=Превключване към режим на представяне presentation_mode_label=Режим на представяне open_file.title=Отваряне на файл open_file_label=Отваряне print.title=Отпечатване print_label=Отпечатване download.title=Изтегляне download_label=Изтегляне bookmark.title=Текущ изглед (копиране или отваряне в нов прозорец) bookmark_label=Текущ изглед # Secondary toolbar and context menu tools.title=Инструменти tools_label=Инструменти first_page.title=Към първата страница first_page.label=Към първата страница first_page_label=Към първата страница last_page.title=Към последната страница last_page.label=Към последната страница last_page_label=Към последната страница page_rotate_cw.title=Превъртане по часовниковата стрелка page_rotate_cw.label=Превъртане по часовниковата стрелка page_rotate_cw_label=Превъртане по часовниковата стрелка page_rotate_ccw.title=Превъртане обратно на часовниковата стрелка page_rotate_ccw.label=Превъртане обратно на часовниковата стрелка page_rotate_ccw_label=Превъртане обратно на часовниковата стрелка hand_tool_enable.title=Включване на инструмента ръка hand_tool_enable_label=Включване на инструмента ръка hand_tool_disable.title=Изключване на инструмента ръка hand_tool_disable_label=Изключване на инструмента ръка # Document properties dialog box document_properties.title=Свойства на документа… document_properties_label=Свойства на документа… document_properties_file_name=Име на файл: document_properties_file_size=Големина на файл: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} КБ ({{size_b}} байта) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} МБ ({{size_b}} байта) document_properties_title=Заглавие: document_properties_author=Автор: document_properties_subject=Тема: document_properties_keywords=Ключови думи: document_properties_creation_date=Дата на създаване: document_properties_modification_date=Дата на промяна: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Създател: document_properties_producer=PDF произведен от: document_properties_version=PDF версия: document_properties_page_count=Брой страници: document_properties_close=Затваряне # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Превключване на страничната лента toggle_sidebar_label=Превключване на страничната лента outline.title=Показване на очертанията на документа outline_label=Очертание на документа attachments.title=Показване на притурките attachments_label=Притурки thumbs.title=Показване на миниатюрите thumbs_label=Миниатюри findbar.title=Намиране в документа findbar_label=Търсене # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Страница {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Миниатюра на страница {{page}} # Find panel button title and messages find_label=Търсене: find_previous.title=Намиране на предното споменаване на тази фраза find_previous_label=Предишна find_next.title=Намиране на следващото споменаване на тази фраза find_next_label=Следваща find_highlight=Маркирай всички find_match_case_label=Точно съвпадения find_reached_top=Достигнато е началото на документа, продължаване от края find_reached_bottom=Достигнат е краят на документа, продължаване от началото find_not_found=Фразата не е намерена # Error panel labels error_more_info=Повече информация error_less_info=По-малко информация error_close=Затваряне # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js версия {{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Съобщение: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Стек: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Файл: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Ред: {{line}} rendering_error=Грешка при изчертаване на страницата. # Predefined zoom values page_scale_width=Ширина на страницата page_scale_fit=Вместване в страницата page_scale_auto=Автоматично мащабиране page_scale_actual=Действителен размер # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Грешка loading_error=Получи се грешка при зареждане на PDF-а. invalid_file_error=Невалиден или повреден PDF файл. missing_file_error=Липсващ PDF файл. unexpected_response_error=Неочакван отговор от сървъра. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Анотация {{type}}] password_label=Въведете парола за отваряне на този PDF файл. password_invalid=Невалидна парола. Моля, опитайте отново. password_ok=Добре password_cancel=Отказ printing_not_supported=Внимание: Този браузър няма пълна поддръжка на отпечатване. printing_not_ready=Внимание: Този PDF файл не е напълно зареден за печат. web_fonts_disabled=Уеб-шрифтовете са забранени: разрешаване на използването на вградените PDF шрифтове. document_colors_not_allowed=На PDF-документите не е разрешено да използват собствени цветове: „Разрешаване на страниците да избират собствени цветове“ е изключено в браузъра. manuskript-0.10.0/libs/pdf.js/web/locale/bn-BD/000077500000000000000000000000001354442177200210115ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/bn-BD/viewer.properties000066400000000000000000000242621354442177200244360ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=পূর্ববর্তী পৃষ্ঠা previous_label=পূর্ববর্তী next.title=পরবর্তী পৃষ্ঠা next_label=পরবর্তী # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=পৃষ্ঠা: page_of={{pageCount}} এর zoom_out.title=ছোট আকারে প্রদর্শন zoom_out_label=ছোট আকারে প্রদর্শন zoom_in.title=বড় আকারে প্রদর্শন zoom_in_label=বড় আকারে প্রদর্শন zoom.title=বড় আকারে প্রদর্শন presentation_mode.title=উপস্থাপনা মোডে স্যুইচ করুন presentation_mode_label=উপস্থাপনা মোড open_file.title=ফাইল খুলুন open_file_label=খুলুন print.title=মুদ্রণ print_label=মুদ্রণ download.title=ডাউনলোড download_label=ডাউনলোড bookmark.title=বর্তমান অবস্থা (অনুলিপি অথবা নতুন উইন্ডো তে খুলুন) bookmark_label=বর্তমান অবস্থা # Secondary toolbar and context menu tools.title=টুল tools_label=টুল first_page.title=প্রথম পাতায় যাও first_page.label=প্রথম পাতায় যাও first_page_label=প্রথম পাতায় যাও last_page.title=শেষ পাতায় যাও last_page.label=শেষ পাতায় যাও last_page_label=শেষ পাতায় যাও page_rotate_cw.title=ঘড়ির কাঁটার দিকে ঘোরাও page_rotate_cw.label=ঘড়ির কাঁটার দিকে ঘোরাও page_rotate_cw_label=ঘড়ির কাঁটার দিকে ঘোরাও page_rotate_ccw.title=ঘড়ির কাঁটার বিপরীতে ঘোরাও page_rotate_ccw.label=ঘড়ির কাঁটার বিপরীতে ঘোরাও page_rotate_ccw_label=ঘড়ির কাঁটার বিপরীতে ঘোরাও hand_tool_enable.title=হ্যান্ড টুল সক্রিয় করুন hand_tool_enable_label=হ্যান্ড টুল সক্রিয় করুন hand_tool_disable.title=হ্যান্ড টুল নিস্ক্রিয় করুন hand_tool_disable_label=হ্যান্ড টুল নিস্ক্রিয় করুন # Document properties dialog box document_properties.title=নথি বৈশিষ্ট্য… document_properties_label=নথি বৈশিষ্ট্য… document_properties_file_name=ফাইলের নাম: document_properties_file_size=ফাইলের আকার: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} কেবি ({{size_b}} বাইট) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} এমবি ({{size_b}} বাইট) document_properties_title=শিরোনাম: document_properties_author=লেখক: document_properties_subject=বিষয়: document_properties_keywords=কীওয়ার্ড: document_properties_creation_date=তৈরির তারিখ: document_properties_modification_date=পরিবর্তনের তারিখ: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=প্রস্তুতকারক: document_properties_producer=পিডিএফ প্রস্তুতকারক: document_properties_version=পিডিএফ সংষ্করণ: document_properties_page_count=মোট পাতা: document_properties_close=বন্ধ # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=সাইডবার টগল করুন toggle_sidebar_label=সাইডবার টগল করুন outline.title=নথির রূপরেখা প্রদর্শন করুন outline_label=নথির রূপরেখা attachments.title=সংযুক্তি দেখাও attachments_label=সংযুক্তি thumbs.title=থাম্বনেইল সমূহ প্রদর্শন করুন thumbs_label=থাম্বনেইল সমূহ findbar.title=নথির মধ্যে খুঁজুন findbar_label=অনুসন্ধান # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=পৃষ্ঠা {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas={{page}} পৃষ্ঠার থাম্বনেইল # Find panel button title and messages find_label=অনুসন্ধান: find_previous.title=বাক্যাংশের পূর্ববর্তী উপস্থিতি অনুসন্ধান find_previous_label=পূর্ববর্তী find_next.title=বাক্যাংশের পরবর্তী উপস্থিতি অনুসন্ধান find_next_label=পরবর্তী find_highlight=সব হাইলাইট করা হবে find_match_case_label=অক্ষরের ছাঁদ মেলানো find_reached_top=পৃষ্ঠার শুরুতে পৌছে গেছে, নীচ থেকে আরম্ভ করা হয়েছে find_reached_bottom=পৃষ্ঠার শেষে পৌছে গেছে, উপর থেকে আরম্ভ করা হয়েছে find_not_found=বাক্যাংশ পাওয়া যায়নি # Error panel labels error_more_info=আরও তথ্য error_less_info=কম তথ্য error_close=বন্ধ # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=বার্তা: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stack: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=নথি: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=লাইন: {{line}} rendering_error=পৃষ্ঠা উপস্থাপনার সময় ত্রুটি দেখা দিয়েছে। # Predefined zoom values page_scale_width=পৃষ্ঠার প্রস্থ page_scale_fit=পৃষ্ঠা ফিট করুন page_scale_auto=স্বয়ংক্রিয় জুম page_scale_actual=প্রকৃত আকার # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=ত্রুটি loading_error=পিডিএফ লোড করার সময় ত্রুটি দেখা দিয়েছে। invalid_file_error=অকার্যকর অথবা ক্ষতিগ্রস্ত পিডিএফ ফাইল। missing_file_error=পিডিএফ ফাইল পাওয়া যাচ্ছে না। unexpected_response_error=অপ্রত্যাশীত সার্ভার প্রতিক্রিয়া। # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} টীকা] password_label=পিডিএফ ফাইলটি ওপেন করতে পাসওয়ার্ড দিন। password_invalid=ভুল পাসওয়ার্ড। অনুগ্রহ করে আবার চেষ্টা করুন। password_ok=ঠিক আছে password_cancel=বাতিল printing_not_supported=সতর্কতা: এই ব্রাউজারে মুদ্রণ সম্পূর্ণভাবে সমর্থিত নয়। printing_not_ready=সতর্কীকরণ: পিডিএফটি মুদ্রণের জন্য সম্পূর্ণ লোড হয়নি। web_fonts_disabled=ওয়েব ফন্ট নিষ্ক্রিয়: সংযুক্ত পিডিএফ ফন্ট ব্যবহার করা যাচ্ছে না। document_colors_not_allowed=পিডিএফ ডকুমেন্টকে তাদের নিজস্ব রঙ ব্যবহারে অনুমতি নেই: 'পাতা তাদের নিজেস্ব রঙ নির্বাচন করতে অনুমতি দিন' এই ব্রাউজারে নিষ্ক্রিয় রয়েছে। manuskript-0.10.0/libs/pdf.js/web/locale/bn-IN/000077500000000000000000000000001354442177200210325ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/bn-IN/viewer.properties000066400000000000000000000250761354442177200244630ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=পূর্ববর্তী পৃষ্ঠা previous_label=পূর্ববর্তী next.title=পরবর্তী পৃষ্ঠা next_label=পরবর্তী # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=পৃষ্ঠা: page_of=সর্বমোট {{pageCount}} zoom_out.title=ছোট মাপে প্রদর্শন zoom_out_label=ছোট মাপে প্রদর্শন zoom_in.title=বড় মাপে প্রদর্শন zoom_in_label=বড় মাপে প্রদর্শন zoom.title=প্রদর্শনের মাপ presentation_mode.title=উপস্থাপনা মোড স্যুইচ করুন presentation_mode_label=উপস্থাপনা মোড open_file.title=ফাইল খুলুন open_file_label=খুলুন print.title=প্রিন্ট করুন print_label=প্রিন্ট করুন download.title=ডাউনলোড করুন download_label=ডাউনলোড করুন bookmark.title=বর্তমান প্রদর্শন (কপি করুন অথবা নতুন উইন্ডোতে খুলুন) bookmark_label=বর্তমান প্রদর্শন # Secondary toolbar and context menu tools.title=সরঞ্জাম tools_label=সরঞ্জাম first_page.title=প্রথম পৃষ্ঠায় চলুন first_page.label=প্রথম পৃষ্ঠায় চলুন first_page_label=প্রথম পৃষ্ঠায় চলুন last_page.title=সর্বশেষ পৃষ্ঠায় চলুন last_page.label=সর্বশেষ পৃষ্ঠায় চলুন last_page_label=সর্বশেষ পৃষ্ঠায় চলুন page_rotate_cw.title=ডানদিকে ঘোরানো হবে page_rotate_cw.label=ডানদিকে ঘোরানো হবে page_rotate_cw_label=ডানদিকে ঘোরানো হবে page_rotate_ccw.title=বাঁদিকে ঘোরানো হবে page_rotate_ccw.label=বাঁদিকে ঘোরানো হবে page_rotate_ccw_label=বাঁদিকে ঘোরানো হবে hand_tool_enable.title=হ্যান্ড টুল সক্রিয় করুন hand_tool_enable_label=হ্যান্ড টুল সক্রিয় করুন hand_tool_disable.title=হ্যান্ড টুল নিস্ক্রিয় করুন hand_tool_disable_label=হ্যান্ড টুল নিস্ক্রিয় করুন # Document properties dialog box document_properties.title=নথির বৈশিষ্ট্য… document_properties_label=নথির বৈশিষ্ট্য… document_properties_file_name=ফাইলের নাম: document_properties_file_size=ফাইলের মাপ: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} মেগাবাইট ({{size_b}} bytes) document_properties_title=শিরোনাম: document_properties_author=লেখক: document_properties_subject=বিষয়: document_properties_keywords=নির্দেশক শব্দ: document_properties_creation_date=নির্মাণের তারিখ: document_properties_modification_date=পরিবর্তনের তারিখ: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=নির্মাতা: document_properties_producer=PDF নির্মাতা: document_properties_version=PDF সংস্করণ: document_properties_page_count=মোট পৃষ্ঠা: document_properties_close=বন্ধ করুন # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=সাইডবার টগল করুন toggle_sidebar_label=সাইডবার টগল করুন outline.title=নথির রূপরেখা প্রদর্শন outline_label=নথির রূপরেখা প্রদর্শন attachments.title=সংযুক্তিসমূহ দেখান attachments_label=সংযুক্ত বস্তু thumbs.title=থাম্ব-নেইল প্রদর্শন thumbs_label=থাম্ব-নেইল প্রদর্শন findbar.title=নথিতে খুঁজুন findbar_label=অনুসন্ধান করুন # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=পৃষ্ঠা {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=পৃষ্ঠা {{page}}-র থাম্ব-নেইল # Find panel button title and messages find_label=অনুসন্ধান: find_previous.title=চিহ্নিত পংক্তির পূর্ববর্তী উপস্থিতি অনুসন্ধান করুন find_previous_label=পূর্ববর্তী find_next.title=চিহ্নিত পংক্তির পরবর্তী উপস্থিতি অনুসন্ধান করুন find_next_label=পরবর্তী find_highlight=সমগ্র উজ্জ্বল করুন find_match_case_label=হরফের ছাঁদ মেলানো হবে find_reached_top=পৃষ্ঠার প্রারম্ভে পৌছে গেছে, নীচের অংশ থেকে আরম্ভ করা হবে find_reached_bottom=পৃষ্ঠার অন্তিম প্রান্তে পৌছে গেছে, প্রথম অংশ থেকে আরম্ভ করা হবে find_not_found=পংক্তি পাওয়া যায়নি # Error panel labels error_more_info=অতিরিক্ত তথ্য error_less_info=কম তথ্য error_close=বন্ধ করুন # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Message: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stack: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=File: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Line: {{line}} rendering_error=পৃষ্ঠা প্রদর্শনকালে একটি সমস্যা দেখা দিয়েছে। # Predefined zoom values page_scale_width=পৃষ্ঠার প্রস্থ অনুযায়ী page_scale_fit=পৃষ্ঠার মাপ অনুযায়ী page_scale_auto=স্বয়ংক্রিয় মাপ নির্ধারণ page_scale_actual=প্রকৃত মাপ # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=ত্রুটি loading_error=PDF লোড করার সময় সমস্যা দেখা দিয়েছে। invalid_file_error=অবৈধ বা ক্ষতিগ্রস্ত পিডিএফ ফাইল। missing_file_error=অনুপস্থিত PDF ফাইল unexpected_response_error=সার্ভার থেকে অপ্রত্যাশিত সাড়া পাওয়া গেছে। # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Annotation] password_label=এই PDF ফাইল খোলার জন্য পাসওয়ার্ড দিন। password_invalid=পাসওয়ার্ড সঠিক নয়। অনুগ্রহ করে পুনরায় প্রচেষ্টা করুন। password_ok=OK password_cancel=বাতিল করুন printing_not_supported=সতর্কবার্তা: এই ব্রাউজার দ্বারা প্রিন্ট ব্যবস্থা সম্পূর্ণরূপে সমর্থিত নয়। printing_not_ready=সতর্কবাণী: পিডিএফ সম্পূর্ণরূপে মুদ্রণের জন্য লোড করা হয় না. web_fonts_disabled=ওয়েব ফন্ট নিষ্ক্রিয় করা হয়েছে: এমবেডেড পিডিএফ ফন্ট ব্যবহার করতে অক্ষম. document_colors_not_allowed=পিডিএফ নথি তাদের নিজস্ব রং ব্যবহার করার জন্য অনুমতিপ্রাপ্ত নয়: ব্রাউজারে নিষ্ক্রিয় করা হয়েছে য়েন 'পেজ তাদের নিজস্ব রং নির্বাচন করার অনুমতি প্রদান করা য়ায়।' manuskript-0.10.0/libs/pdf.js/web/locale/br/000077500000000000000000000000001354442177200205325ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/br/viewer.properties000066400000000000000000000165321354442177200241600ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Pajenn a-raok previous_label=A-raok next.title=Pajenn war-lerc'h next_label=War-lerc'h # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Pajenn : page_of=eus {{pageCount}} zoom_out.title=Zoum bihanaat zoom_out_label=Zoum bihanaat zoom_in.title=Zoum brasaat zoom_in_label=Zoum brasaat zoom.title=Zoum presentation_mode.title=Trec'haoliñ etrezek ar mod kinnigadenn presentation_mode_label=Mod kinnigadenn open_file.title=Digeriñ ur restr open_file_label=Digeriñ ur restr print.title=Moullañ print_label=Moullañ download.title=Pellgargañ download_label=Pellgargañ bookmark.title=Gwel bremanel (eilañ pe zigeriñ e-barzh ur prenestr nevez) bookmark_label=Gwel bremanel # Secondary toolbar and context menu tools.title=Ostilhoù tools_label=Ostilhoù first_page.title=Mont d'ar bajenn gentañ first_page.label=Mont d'ar bajenn gentañ first_page_label=Mont d'ar bajenn gentañ last_page.title=Mont d'ar bajenn diwezhañ last_page.label=Mont d'ar bajenn diwezhañ last_page_label=Mont d'ar bajenn diwezhañ page_rotate_cw.title=C'hwelañ gant roud ar bizied page_rotate_cw.label=C'hwelañ gant roud ar bizied page_rotate_cw_label=C'hwelañ gant roud ar bizied page_rotate_ccw.title=C'hwelañ gant roud gin ar bizied page_rotate_ccw.label=C'hwelañ gant roud gin ar bizied page_rotate_ccw_label=C'hwelañ gant roud gin ar bizied hand_tool_enable.title=Gweredekaat an ostilh "dorn" hand_tool_enable_label=Gweredekaat an ostilh "dorn" hand_tool_disable.title=Diweredekaat an ostilh "dorn" hand_tool_disable_label=Diweredekaat an ostilh "dorn" # Document properties dialog box document_properties.title=Perzhioù an teul… document_properties_label=Perzhioù an teul… document_properties_file_name=Anv restr : document_properties_file_size=Ment ar restr : # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} Ke ({{size_b}} eizhbit) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} Me ({{size_b}} eizhbit) document_properties_title=Titl : document_properties_author=Aozer : document_properties_subject=Danvez : document_properties_keywords=Gerioù-alc'hwez : document_properties_creation_date=Deiziad krouiñ : document_properties_modification_date=Deiziad kemmañ : # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Krouer : document_properties_producer=Kenderc'her PDF : document_properties_version=Handelv PDF : document_properties_page_count=Niver a bajennoù : document_properties_close=Serriñ # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Diskouez/kuzhat ar varrenn gostez toggle_sidebar_label=Diskouez/kuzhat ar varrenn gostez outline.title=Diskouez ar sinedoù outline_label=Sinedoù an teuliad attachments.title=Diskouez ar c'henstagadurioù attachments_label=Kenstagadurioù thumbs.title=Diskouez ar melvennoù thumbs_label=Melvennoù findbar.title=Klask e-barzh an teuliad findbar_label=Klask # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Pajenn {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Melvenn ar bajenn {{page}} # Find panel button title and messages find_label=Kavout : find_previous.title=Kavout an tamm frazenn kent o klotañ ganti find_previous_label=Kent find_next.title=Kavout an tamm frazenn war-lerc'h o klotañ ganti find_next_label=War-lerc'h find_highlight=Usskediñ pep tra find_match_case_label=Teurel evezh ouzh ar pennlizherennoù find_reached_top=Tizhet eo bet derou ar bajenn, kenderc'hel diouzh an diaz find_reached_bottom=Tizhet eo bet dibenn ar bajenn, kenderc'hel diouzh ar c'hrec'h find_not_found=N'haller ket kavout ar frazenn # Error panel labels error_more_info=Muioc'h a ditouroù error_less_info=Nebeutoc'h a ditouroù error_close=Serriñ # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js handelv {{version}} (kempunadur : {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Kemennadenn : {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Torn : {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Restr : {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Linenn : {{line}} rendering_error=Degouezhet ez eus bet ur fazi e-pad skrammañ ar bajennad. # Predefined zoom values page_scale_width=Led ar bajenn page_scale_fit=Pajenn a-bezh page_scale_auto=Zoum emgefreek page_scale_actual=Ment wir # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Fazi loading_error=Degouezhet ez eus bet ur fazi e-pad kargañ ar PDF. invalid_file_error=Restr PDF didalvoudek pe kontronet. missing_file_error=Restr PDF o vankout. unexpected_response_error=Respont dic'hortoz a-berzh an dafariad # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Notennañ] password_label=Enankit ar ger-tremen evit digeriñ ar restr PDF-mañ. password_invalid=Ger-tremen didalvoudek. Klaskit en-dro mar plij. password_ok=Mat eo password_cancel=Nullañ printing_not_supported=Kemenn : N'eo ket skoret penn-da-benn ar moullañ gant ar merdeer-mañ. printing_not_ready=Kemenn : N'hall ket bezañ moullet ar restr PDF rak n'eo ket karget penn-da-benn. web_fonts_disabled=Diweredekaet eo an nodrezhoù web : n'haller ket arverañ an nodrezhoù PDF enframmet. document_colors_not_allowed=N'eo ket aotreet an teuliadoù PDF da arverañ o livioù dezho : diweredekaet eo 'Aotren ar pajennoù da zibab o livioù dezho' e-barzh ar merdeer. manuskript-0.10.0/libs/pdf.js/web/locale/bs/000077500000000000000000000000001354442177200205335ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/bs/viewer.properties000066400000000000000000000160601354442177200241550ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Prethodna strana previous_label=Prethodna next.title=Sljedeća strna next_label=Sljedeća # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Strana: page_of=od {{pageCount}} zoom_out.title=Umanji zoom_out_label=Umanji zoom_in.title=Uvećaj zoom_in_label=Uvećaj zoom.title=Uvećanje presentation_mode.title=Prebaci se u prezentacijski režim presentation_mode_label=Prezentacijski režim open_file.title=Otvori fajl open_file_label=Otvori print.title=Štampaj print_label=Štampaj download.title=Preuzmi download_label=Preuzmi bookmark.title=Trenutni prikaz (kopiraj ili otvori u novom prozoru) bookmark_label=Trenutni prikaz # Secondary toolbar and context menu tools.title=Alati tools_label=Alati first_page.title=Idi na prvu stranu first_page.label=Idi na prvu stranu first_page_label=Idi na prvu stranu last_page.title=Idi na zadnju stranu last_page.label=Idi na zadnju stranu last_page_label=Idi na zadnju stranu page_rotate_cw.title=Rotiraj u smjeru kazaljke na satu page_rotate_cw.label=Rotiraj u smjeru kazaljke na satu page_rotate_cw_label=Rotiraj u smjeru kazaljke na satu page_rotate_ccw.title=Rotiraj suprotno smjeru kazaljke na satu page_rotate_ccw.label=Rotiraj suprotno smjeru kazaljke na satu page_rotate_ccw_label=Rotiraj suprotno smjeru kazaljke na satu hand_tool_enable.title=Omogući ručni alat hand_tool_enable_label=Omogući ručni alat hand_tool_disable.title=Onemogući ručni alat hand_tool_disable_label=Onemogući ručni alat # Document properties dialog box document_properties.title=Svojstva dokumenta... document_properties_label=Svojstva dokumenta... document_properties_file_name=Naziv fajla: document_properties_file_size=Veličina fajla: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bajta) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bajta) document_properties_title=Naslov: document_properties_author=Autor: document_properties_subject=Predmet: document_properties_keywords=Ključne riječi: document_properties_creation_date=Datum kreiranja: document_properties_modification_date=Datum promjene: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Kreator: document_properties_producer=PDF stvaratelj: document_properties_version=PDF verzija: document_properties_page_count=Broj stranica: document_properties_close=Zatvori # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Uključi/isključi bočnu traku toggle_sidebar_label=Uključi/isključi bočnu traku outline.title=Prikaži konture dokumenta outline_label=Konture dokumenta attachments.title=Prikaži priloge attachments_label=Prilozi thumbs.title=Prikaži thumbnailove thumbs_label=Thumbnailovi findbar.title=Pronađi u dokumentu findbar_label=Pronađi # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Strana {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Thumbnail strane {{page}} # Find panel button title and messages find_label=Pronađi: find_previous.title=Pronađi prethodno pojavljivanje fraze find_previous_label=Prethodno find_next.title=Pronađi sljedeće pojavljivanje fraze find_next_label=Sljedeće find_highlight=Označi sve find_match_case_label=Osjetljivost na karaktere find_reached_top=Dostigao sam vrh dokumenta, nastavljam sa dna find_reached_bottom=Dostigao sam kraj dokumenta, nastavljam sa vrha find_not_found=Fraza nije pronađena # Error panel labels error_more_info=Više informacija error_less_info=Manje informacija error_close=Zatvori # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Poruka: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stack: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Fajl: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Linija: {{line}} rendering_error=Došlo je do greške prilikom renderiranja strane. # Predefined zoom values page_scale_width=Širina strane page_scale_fit=Uklopi stranu page_scale_auto=Automatsko uvećanje page_scale_actual=Stvarna veličina # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Greška loading_error=Došlo je do greške prilikom učitavanja PDF-a. invalid_file_error=Neispravan ili oštećen PDF fajl. missing_file_error=Nedostaje PDF fajl. unexpected_response_error=Neočekivani odgovor servera. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} pribilješka] password_label=Upišite lozinku da biste otvorili ovaj PDF fajl. password_invalid=Pogrešna lozinka. Pokušajte ponovo. password_ok=OK password_cancel=Otkaži printing_not_supported=Upozorenje: Štampanje nije u potpunosti podržano u ovom browseru. printing_not_ready=Upozorenje: PDF nije u potpunosti učitan za štampanje. web_fonts_disabled=Web fontovi su onemogućeni: nemoguće koristiti ubačene PDF fontove. document_colors_not_allowed=PDF dokumentima nije dozvoljeno da koriste vlastite boje: 'Dozvoli stranicama da izaberu vlastite boje' je deaktivirano u browseru. manuskript-0.10.0/libs/pdf.js/web/locale/ca/000077500000000000000000000000001354442177200205125ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/ca/viewer.properties000066400000000000000000000162021354442177200241320ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Pàgina anterior previous_label=Anterior next.title=Pàgina següent next_label=Següent # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Pàgina: page_of=de {{pageCount}} zoom_out.title=Allunya zoom_out_label=Allunya zoom_in.title=Apropa zoom_in_label=Apropa zoom.title=Escala presentation_mode.title=Canvia al mode de presentació presentation_mode_label=Mode de presentació open_file.title=Obre el fitxer open_file_label=Obre print.title=Imprimeix print_label=Imprimeix download.title=Baixa download_label=Baixa bookmark.title=Vista actual (copia o obre en una finestra nova) bookmark_label=Vista actual # Secondary toolbar and context menu tools.title=Eines tools_label=Eines first_page.title=Vés a la primera pàgina first_page.label=Vés a la primera pàgina first_page_label=Vés a la primera pàgina last_page.title=Vés a l'última pàgina last_page.label=Vés a l'última pàgina last_page_label=Vés a l'última pàgina page_rotate_cw.title=Gira cap a la dreta page_rotate_cw.label=Gira cap a la dreta page_rotate_cw_label=Gira cap a la dreta page_rotate_ccw.title=Gira cap a l'esquerra page_rotate_ccw.label=Gira cap a l'esquerra page_rotate_ccw_label=Gira cap a l'esquerra hand_tool_enable.title=Habilita l'eina de mà hand_tool_enable_label=Habilita l'eina de mà hand_tool_disable.title=Inhabilita l'eina de mà hand_tool_disable_label=Inhabilita l'eina de mà # Document properties dialog box document_properties.title=Propietats del document… document_properties_label=Propietats del document… document_properties_file_name=Nom del fitxer: document_properties_file_size=Mida del fitxer: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=Títol: document_properties_author=Autor: document_properties_subject=Assumpte: document_properties_keywords=Paraules clau: document_properties_creation_date=Data de creació: document_properties_modification_date=Data de modificació: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Creador: document_properties_producer=Generador de PDF: document_properties_version=Versió de PDF: document_properties_page_count=Nombre de pàgines: document_properties_close=Tanca # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Mostra/amaga la barra lateral toggle_sidebar_label=Mostra/amaga la barra lateral outline.title=Mostra el contorn del document outline_label=Contorn del document attachments.title=Mostra les adjuncions attachments_label=Adjuncions thumbs.title=Mostra les miniatures thumbs_label=Miniatures findbar.title=Cerca al document findbar_label=Cerca # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Pàgina {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Miniatura de la pàgina {{page}} # Find panel button title and messages find_label=Cerca: find_previous.title=Cerca l'anterior coincidència de l'expressió find_previous_label=Anterior find_next.title=Cerca la següent coincidència de l'expressió find_next_label=Següent find_highlight=Ressalta-ho tot find_match_case_label=Distingeix entre majúscules i minúscules find_reached_top=S'ha arribat al principi del document, es continua pel final find_reached_bottom=S'ha arribat al final del document, es continua pel principi find_not_found=No s'ha trobat l'expressió # Error panel labels error_more_info=Més informació error_less_info=Menys informació error_close=Tanca # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (muntatge: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Missatge: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Pila: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Fitxer: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Línia: {{line}} rendering_error=S'ha produït un error mentre es renderitzava la pàgina. # Predefined zoom values page_scale_width=Amplària de la pàgina page_scale_fit=Ajusta la pàgina page_scale_auto=Zoom automàtic page_scale_actual=Mida real # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Error loading_error=S'ha produït un error en carregar el PDF. invalid_file_error=El fitxer PDF no és vàlid o està malmès. missing_file_error=Falta el fitxer PDF. unexpected_response_error=Resposta inesperada del servidor. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Anotació {{type}}] password_label=Introduïu la contrasenya per obrir aquest fitxer PDF. password_invalid=La contrasenya no és vàlida. Torneu-ho a provar. password_ok=D'acord password_cancel=Cancel·la printing_not_supported=Avís: la impressió no és plenament funcional en aquest navegador. printing_not_ready=Atenció: el PDF no s'ha acabat de carregar per imprimir-lo. web_fonts_disabled=Les fonts web estan inhabilitades: no es poden incrustar fitxers PDF. document_colors_not_allowed=Els documents PDF no poden usar els seus colors propis: «Permet a les pàgines triar els colors propis» es troba desactivat al navegador. manuskript-0.10.0/libs/pdf.js/web/locale/cs/000077500000000000000000000000001354442177200205345ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/cs/viewer.properties000066400000000000000000000161711354442177200241610ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Předchozí stránka previous_label=Předchozí next.title=Další stránka next_label=Další # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Stránka: page_of=z {{pageCount}} zoom_out.title=Zmenší velikost zoom_out_label=Zmenšit zoom_in.title=Zvětší velikost zoom_in_label=Zvětšit zoom.title=Nastaví velikost presentation_mode.title=Přepne do režimu prezentace presentation_mode_label=Režim prezentace open_file.title=Otevře soubor open_file_label=Otevřít print.title=Vytiskne dokument print_label=Tisk download.title=Stáhne dokument download_label=Stáhnout bookmark.title=Aktuální pohled (kopírovat nebo otevřít v novém okně) bookmark_label=Aktuální pohled # Secondary toolbar and context menu tools.title=Nástroje tools_label=Nástroje first_page.title=Přejde na první stránku first_page.label=Přejít na první stránku first_page_label=Přejít na první stránku last_page.title=Přejde na poslední stránku last_page.label=Přejít na poslední stránku last_page_label=Přejít na poslední stránku page_rotate_cw.title=Otočí po směru hodin page_rotate_cw.label=Otočit po směru hodin page_rotate_cw_label=Otočit po směru hodin page_rotate_ccw.title=Otočí proti směru hodin page_rotate_ccw.label=Otočit proti směru hodin page_rotate_ccw_label=Otočit proti směru hodin hand_tool_enable.title=Povolit nástroj ručička hand_tool_enable_label=Povolit nástroj ručička hand_tool_disable.title=Zakázat nástroj ručička hand_tool_disable_label=Zakázat nástroj ručička # Document properties dialog box document_properties.title=Vlastnosti dokumentu… document_properties_label=Vlastnosti dokumentu… document_properties_file_name=Název souboru: document_properties_file_size=Velikost souboru: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bajtů) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bajtů) document_properties_title=Nadpis: document_properties_author=Autor: document_properties_subject=Subjekt: document_properties_keywords=Klíčová slova: document_properties_creation_date=Datum vytvoření: document_properties_modification_date=Datum úpravy: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Vytvořil: document_properties_producer=Tvůrce PDF: document_properties_version=Verze PDF: document_properties_page_count=Počet stránek: document_properties_close=Zavřít # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Postranní lišta toggle_sidebar_label=Postranní lišta outline.title=Zobrazí osnovu dokumentu outline_label=Osnova dokumentu attachments.title=Zobrazí přílohy attachments_label=Přílohy thumbs.title=Zobrazí náhledy thumbs_label=Náhledy findbar.title=Najde v dokumentu findbar_label=Najít # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Strana {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Náhled strany {{page}} # Find panel button title and messages find_label=Najít: find_previous.title=Najde předchozí výskyt hledaného spojení find_previous_label=Předchozí find_next.title=Najde další výskyt hledaného spojení find_next_label=Další find_highlight=Zvýraznit find_match_case_label=Rozlišovat velikost find_reached_top=Dosažen začátek dokumentu, pokračuje se od konce find_reached_bottom=Dosažen konec dokumentu, pokračuje se od začátku find_not_found=Hledané spojení nenalezeno # Error panel labels error_more_info=Více informací error_less_info=Méně informací error_close=Zavřít # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (sestavení: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Zpráva: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Zásobník: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Soubor: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Řádka: {{line}} rendering_error=Při vykreslování stránky nastala chyba. # Predefined zoom values page_scale_width=Podle šířky page_scale_fit=Podle výšky page_scale_auto=Automatická velikost page_scale_actual=Skutečná velikost # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Chyba loading_error=Při nahrávání PDF nastala chyba. invalid_file_error=Neplatný nebo chybný soubor PDF. missing_file_error=Chybí soubor PDF. unexpected_response_error=Neočekávaná odpověď serveru. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Anotace typu {{type}}] password_label=Pro otevření PDF souboru vložte heslo. password_invalid=Neplatné heslo. Zkuste to znovu. password_ok=OK password_cancel=Zrušit printing_not_supported=Upozornění: Tisk není v tomto prohlížeči plně podporován. printing_not_ready=Upozornění: Dokument PDF není kompletně načten. web_fonts_disabled=Webová písma jsou zakázána, proto není možné použít vložená písma PDF. document_colors_not_allowed=PDF dokumenty nemají povoleno používat vlastní barvy: volba 'Povolit stránkám používat vlastní barvy' je v prohlížeči deaktivována. manuskript-0.10.0/libs/pdf.js/web/locale/csb/000077500000000000000000000000001354442177200206765ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/csb/viewer.properties000066400000000000000000000113401354442177200243140ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # Main toolbar buttons (tooltips and alt text for images) previous.title=Pòprzédnô strona previous_label=Pòprzédnô next.title=Nôslédnô strona next_label=Nôslédnô # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Strona: page_of=z {{pageCount}} zoom_out.title=Zmniészë zoom_out_label=Zmniészë zoom_in.title=Zwikszë zoom_in_label=Wiôlgòsc zoom.title=Wiôlgòsc print.title=Drëkùjë print_label=Drëkùjë presentation_mode.title=Przéńdzë w trib prezentacje presentation_mode_label=Trib prezentacje open_file.title=Òtemkni lopk open_file_label=Òtemkni download.title=Zladënk download_label=Zladënk bookmark.title=Spamiãtôj wëzdrzatk (kòpérëje, abò òtemkni w nowim òknnie) bookmark_label=Aktualny wëzdrzatk find_label=Szëkôj: find_previous.title=Biéj do pòprzédnégò wënikù szëkbë find_previous_label=Pòprzédny find_next.title=Biéj do nôslédnégò wënikù szëkbë find_next_label=Nôslédny find_highlight=Pòdszkrzëni wszëtczé find_match_case_label=Rozeznôwôj miarã lëterów find_not_found=Nie nalôzł tekstu find_reached_bottom=Doszedł do kùńca dokùmentu, zaczinającë òd górë find_reached_top=Doszedł do pòczątkù dokùmentu, zaczinającë òd dołù toggle_sidebar.title=Pòsuwk wëbiérkù toggle_sidebar_label=Pòsuwk wëbiérkù outline.title=Wëskrzëni òbcéch dokùmentu outline_label=Òbcéch dokùmentu thumbs.title=Wëskrzëni miniaturë thumbs_label=Miniaturë findbar.title=Przeszëkôj dokùment findbar_label=Nalezë tools_label=Nôrzãdła first_page.title=Biéj do pierszi stronë first_page.label=Biéj do pierszi stronë last_page.label=Biéj do òstatny stronë invalid_file_error=Lëchi ôrt, abò pòpsëti lopk PDF. # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Strona {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Miniatura stronë {{page}} # Error panel labels error_more_info=Wicy infòrmacje error_less_info=Mni infòrmacje error_close=Close error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Message: {{wiadło}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stack: {{stóg}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=File: {{lopk}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Line: {{line}} rendering_error=Pòkôza sã fela przë renderowanim stronë. # Predefined zoom values page_scale_width=Szérzawa stronë page_scale_fit=Dopasëje stronã page_scale_auto=Aùtomatnô wiôlgòsc page_scale_actual=Naturalnô wiôlgòsc # Loading indicator messages # LOCALIZATION NOTE (error_line): "{{[percent}}" will be replaced with a percentage loading_error_indicator=Fela loading_error=Pòkôza sã fela przë wczëtiwanim PDFù. # LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip. # "{{[type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" request_password=PDF je zabezpieczony parolą: printing_not_supported = Òstrzéga: przezérnik nie je do kùńca wspieróny przez drëkôrze # Context menu page_rotate_cw.label=Òbkrãcë w prawò page_rotate_ccw.label=Òbkrãcë w lewò last_page.title=Biéj do pòprzédny stronë last_page_label=Biéj do pòprzédny stronë page_rotate_cw.title=Òbkrãcë w prawò page_rotate_cw_label=Òbkrãcë w prawò page_rotate_ccw.title=Òbkrãcë w lewò page_rotate_ccw_label=Òbkrãcë w lewò web_fonts_disabled=Sécowé czconczi są wëłączoné: włączë je, bë móc ùżiwac òsadzonëch czconków w lopkach PDF. missing_file_error=Felëje lopka PDF. printing_not_ready = Òstrzéga: lopk mùszi sã do kùńca wczëtac zanim gò mòże drëkòwac document_colors_disabled=Dokùmentë PDF nie mògą ù swòjich farwów: \'Pòzwòlë stronóm wëbierac swòje farwë\' je wëłączoné w przezérnikù. invalid_password=Lëchô parola. text_annotation_type.alt=[Adnotacjô {{type}}] tools.title=Tools first_page_label=Go to First Page manuskript-0.10.0/libs/pdf.js/web/locale/cy/000077500000000000000000000000001354442177200205425ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/cy/viewer.properties000066400000000000000000000155651354442177200241750ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Tudalen Flaenorol previous_label=Blaenorol next.title=Tudalen Nesaf next_label=Nesaf # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Tudalen: page_of=o {{pageCount}} zoom_out.title=Chwyddo Allan zoom_out_label=Chwyddo Allan zoom_in.title=Chwyddo Mewn zoom_in_label=Chwyddo Mewn zoom.title=Chwyddo presentation_mode.title=Newid i'r Modd Cyflwyno presentation_mode_label=Modd Cyflwyno open_file.title=Agor Ffeil open_file_label=Agor print.title=Argraffu print_label=Argraffu download.title=Llwyth download_label=Llwytho i Lawr bookmark.title=Golwg cyfredol (copïo neu agor ffenestr newydd) bookmark_label=Golwg Gyfredol # Secondary toolbar and context menu tools.title=Offer tools_label=Offer first_page.title=Mynd i'r Dudalen Gyntaf first_page.label=Mynd i'r Dudalen Gyntaf first_page_label=Mynd i'r Dudalen Gyntaf last_page.title=Mynd i'r Dudalen Olaf last_page.label=Mynd i'r Dudalen Olaf last_page_label=Mynd i'r Dudalen Olaf page_rotate_cw.title=Cylchdroi Clocwedd page_rotate_cw.label=Cylchdroi Clocwedd page_rotate_cw_label=Cylchdroi Clocwedd page_rotate_ccw.title=Cylchdroi Gwrthglocwedd page_rotate_ccw.label=Cylchdroi Gwrthglocwedd page_rotate_ccw_label=Cylchdroi Gwrthglocwedd hand_tool_enable.title=Galluogi offeryn llaw hand_tool_enable_label=Galluogi offeryn llaw hand_tool_disable.title=Analluogi offeryn llaw hand_tool_disable_label=Analluogi offeryn llaw # Document properties dialog box document_properties.title=Priodweddau Dogfen… document_properties_label=Priodweddau Dogfen… document_properties_file_name=Enw ffeil: document_properties_file_size=Maint ffeil: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} beit) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} beit) document_properties_title=Teitl: document_properties_author=Awdur: document_properties_subject=Pwnc: document_properties_keywords=Allweddair: document_properties_creation_date=Dyddiad Creu: document_properties_modification_date=Dyddiad Addasu: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Crewr: document_properties_producer=Cynhyrchydd PDF: document_properties_version=Fersiwn PDF: document_properties_page_count=Cyfrif Tudalen: document_properties_close=Cau # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Toglo'r Bar Ochr toggle_sidebar_label=Toglo'r Bar Ochr outline.title=Dangos Amlinell Dogfen outline_label=Amlinelliad Dogfen attachments.title=Dangos Atodiadau attachments_label=Atodiadau thumbs.title=Dangos Lluniau Bach thumbs_label=Lluniau Bach findbar.title=Canfod yn y Ddogfen findbar_label=Canfod # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Tudalen {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Llun Bach Tudalen {{page}} # Find panel button title and messages find_label=Canfod: find_previous.title=Canfod enghraifft flaenorol o'r ymadrodd find_previous_label=Blaenorol find_next.title=Canfod enghraifft nesaf yr ymadrodd find_next_label=Nesaf find_highlight=Amlygu popeth find_match_case_label=Cydweddu maint find_reached_top=Wedi cyrraedd brig y dudalen, parhau o'r gwaelod find_reached_bottom=Wedi cyrraedd diwedd y dudalen, parhau o'r brig find_not_found=Heb ganfod ymadrodd # Error panel labels error_more_info=Rhagor o Wybodaeth error_less_info=Llai o wybodaeth error_close=Cau # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Neges: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stac: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Ffeil: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Llinell: {{line}} rendering_error=Digwyddodd gwall wrth adeiladu'r dudalen. # Predefined zoom values page_scale_width=Lled Tudalen page_scale_fit=Ffit Tudalen page_scale_auto=Chwyddo Awtomatig page_scale_actual=Maint Gwirioneddol # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Gwall loading_error=Digwyddodd gwall wrth lwytho'r PDF. invalid_file_error=Ffeil PDF annilys neu llwgr. missing_file_error=Ffeil PDF coll. unexpected_response_error=Ymateb annisgwyl gan y gweinydd. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Anodiad {{type}} ] password_label=Rhowch gyfrinair i agor y PDF. password_invalid=Cyfrinair annilys. Ceisiwch eto. password_ok=Iawn password_cancel=Diddymu printing_not_supported=Rhybudd: Nid yw argraffu yn cael ei gynnal yn llawn gan y porwr. printing_not_ready=Rhybudd: Nid yw'r PDF wedi ei lwytho'n llawn ar gyfer argraffu. web_fonts_disabled=Ffontiau gwe wedi eu hanalluogi: methu defnyddio ffontiau PDF mewnblanedig. document_colors_not_allowed=Nid oes caniatâd i ddogfennau PDF i ddefnyddio eu lliwiau eu hunain: Mae 'Caniatáu i dudalennau ddefnyddio eu lliwiau eu hunain' wedi ei atal yn y porwr. manuskript-0.10.0/libs/pdf.js/web/locale/da/000077500000000000000000000000001354442177200205135ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/da/viewer.properties000066400000000000000000000145641354442177200241440ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Forrige side previous_label=Forrige next.title=Næste side next_label=Næste # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Side: page_of=af {{pageCount}} zoom_out.title=Zoom ud zoom_out_label=Zoom ud zoom_in.title=Zoom ind zoom_in_label=Zoom ind zoom.title=Zoom print.title=Udskriv print_label=Udskriv presentation_mode.title=Skift til fuldskærmsvisning presentation_mode_label=Fuldskærmsvisning open_file.title=Åbn fil open_file_label=Åbn download.title=Hent download_label=Hent bookmark.title=Aktuel visning (kopier eller åbn i et nyt vindue) bookmark_label=Aktuel visning # Secondary toolbar and context menu tools.title=Funktioner tools_label=Funktioner first_page.title=Gå til første side first_page.label=Gå til første side first_page_label=Gå til første side last_page.title=Gå til sidste side last_page.label=Gå til sidste side last_page_label=Gå til sidste side page_rotate_cw.title=Roter med uret page_rotate_cw.label=Roter med uret page_rotate_cw_label=Roter med uret page_rotate_ccw.title=Roter mod uret page_rotate_ccw.label=Roter mod uret page_rotate_ccw_label=Roter mod uret hand_tool_enable.title=Aktiver håndværktøj hand_tool_enable_label=Aktiver håndværktøj hand_tool_disable.title=Deaktiver håndværktøj hand_tool_disable_label=Deaktiver håndværktøj # Document properties dialog box document_properties.title=Dokumentegenskaber… document_properties_label=Dokumentegenskaber… document_properties_file_name=Filnavn: document_properties_file_size=Filstørrelse: document_properties_kb={{size_kb}} KB ({{size_b}} bytes) document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=Titel: document_properties_author=Forfatter: document_properties_subject=Emne: document_properties_keywords=Nøgleord: document_properties_creation_date=Oprettet: document_properties_modification_date=Redigeret: document_properties_date_string={{date}}, {{time}} document_properties_creator=Program: document_properties_producer=PDF-producent: document_properties_version=PDF-version: document_properties_page_count=Antal sider: document_properties_close=Luk # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Slå sidepanel til eller fra toggle_sidebar_label=Slå sidepanel til eller fra outline.title=Vis dokumentets disposition outline_label=Dokument-disposition attachments.title=Vis vedhæftede filer attachments_label=Vedhæftede filer thumbs.title=Vis miniaturer thumbs_label=Miniaturer findbar.title=Find i dokument findbar_label=Find # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Side {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Miniature af side {{page}} # Find panel button title and messages find_label=Find: find_previous.title=Find den forrige forekomst find_previous_label=Forrige find_next.title=Find den næste forekomst find_next_label=Næste find_highlight=Fremhæv alle find_match_case_label=Forskel på store og små bogstaver find_reached_top=Toppen af siden blev nået, fortsatte fra bunden find_reached_bottom=Bunden af siden blev nået, fortsatte fra toppen find_not_found=Der blev ikke fundet noget # Error panel labels error_more_info=Mere information error_less_info=Mindre information error_close=Luk # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Fejlmeddelelse: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stack: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Fil: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Linje: {{line}} rendering_error=Der opstod en fejl ved generering af siden. # Predefined zoom values page_scale_width=Sidebredde page_scale_fit=Tilpas til side page_scale_auto=Automatisk zoom page_scale_actual=Faktisk størrelse # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Fejl loading_error=Der opstod en fejl ved indlæsning af PDF-filen. invalid_file_error=PDF-filen er ugyldig eller ødelagt. missing_file_error=Manglende PDF-fil. unexpected_response_error=Uventet svar fra serveren. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}}kommentar] password_label=Angiv adgangskode til at åbne denne PDF-fil. password_invalid=Ugyldig adgangskode. Prøv igen. password_ok=OK password_cancel=Fortryd printing_not_supported=Advarsel: Udskrivning er ikke fuldt understøttet af browseren. printing_not_ready=Advarsel: PDF-filen er ikke fuldt indlæst til udskrivning. web_fonts_disabled=Webskrifttyper er deaktiverede. De indlejrede skrifttyper i PDF-filen kan ikke anvendes. document_colors_not_allowed=PDF-dokumenter må ikke bruge deres egne farver: 'Tillad sider at vælge deres egne farver' er deaktiveret i browseren. manuskript-0.10.0/libs/pdf.js/web/locale/de/000077500000000000000000000000001354442177200205175ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/de/viewer.properties000066400000000000000000000153431354442177200241440ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Eine Seite zurück previous_label=Zurück next.title=Eine Seite vor next_label=Vor # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Seite: page_of=von {{pageCount}} zoom_out.title=Verkleinern zoom_out_label=Verkleinern zoom_in.title=Vergrößern zoom_in_label=Vergrößern zoom.title=Zoom print.title=Drucken print_label=Drucken presentation_mode.title=In Präsentationsmodus wechseln presentation_mode_label=Präsentationsmodus open_file.title=Datei öffnen open_file_label=Öffnen download.title=Dokument speichern download_label=Speichern bookmark.title=Aktuelle Ansicht (zum Kopieren oder Öffnen in einem neuen Fenster) bookmark_label=Aktuelle Ansicht # Secondary toolbar and context menu tools.title=Werkzeuge tools_label=Werkzeuge first_page.title=Erste Seite anzeigen first_page.label=Erste Seite anzeigen first_page_label=Erste Seite anzeigen last_page.title=Letzte Seite anzeigen last_page.label=Letzte Seite anzeigen last_page_label=Letzte Seite anzeigen page_rotate_cw.title=Im Uhrzeigersinn drehen page_rotate_cw.label=Im Uhrzeigersinn drehen page_rotate_cw_label=Im Uhrzeigersinn drehen page_rotate_ccw.title=Gegen Uhrzeigersinn drehen page_rotate_ccw.label=Gegen Uhrzeigersinn drehen page_rotate_ccw_label=Gegen Uhrzeigersinn drehen hand_tool_enable.title=Hand-Werkzeug aktivieren hand_tool_enable_label=Hand-Werkzeug aktivieren hand_tool_disable.title=Hand-Werkzeug deaktivieren hand_tool_disable_label=Hand-Werkzeug deaktivieren # Document properties dialog box document_properties.title=Dokumenteigenschaften document_properties_label=Dokumenteigenschaften… document_properties_file_name=Dateiname: document_properties_file_size=Dateigröße: document_properties_kb={{size_kb}} KB ({{size_b}} Bytes) document_properties_mb={{size_mb}} MB ({{size_b}} Bytes) document_properties_title=Titel: document_properties_author=Autor: document_properties_subject=Thema: document_properties_keywords=Stichwörter: document_properties_creation_date=Erstelldatum: document_properties_modification_date=Bearbeitungsdatum: document_properties_date_string={{date}} {{time}} document_properties_creator=Anwendung: document_properties_producer=PDF erstellt mit: document_properties_version=PDF-Version: document_properties_page_count=Seitenzahl: document_properties_close=Schließen # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Sidebar umschalten toggle_sidebar_label=Sidebar umschalten outline.title=Dokumentstruktur anzeigen outline_label=Dokumentstruktur attachments.title=Anhänge anzeigen attachments_label=Anhänge thumbs.title=Miniaturansichten anzeigen thumbs_label=Miniaturansichten findbar.title=Dokument durchsuchen findbar_label=Suchen # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Seite {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Miniaturansicht von Seite {{page}} # Find panel button title and messages find_label=Suchen: find_previous.title=Vorheriges Auftreten des Suchbegriffs finden find_previous_label=Zurück find_next.title=Nächstes Auftreten des Suchbegriffs finden find_next_label=Weiter find_highlight=Alle hervorheben find_match_case_label=Groß-/Kleinschreibung beachten find_reached_top=Anfang des Dokuments erreicht, fahre am Ende fort find_reached_bottom=Ende des Dokuments erreicht, fahre am Anfang fort find_not_found=Suchbegriff nicht gefunden # Error panel labels error_more_info=Mehr Informationen error_less_info=Weniger Informationen error_close=Schließen # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js Version {{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Nachricht: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Aufrufliste: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Datei: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Zeile: {{line}} rendering_error=Beim Darstellen der Seite trat ein Fehler auf. # Predefined zoom values page_scale_width=Seitenbreite page_scale_fit=Seitengröße page_scale_auto=Automatischer Zoom page_scale_actual=Originalgröße # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Fehler loading_error=Beim Laden der PDF-Datei trat ein Fehler auf. invalid_file_error=Ungültige oder beschädigte PDF-Datei missing_file_error=Fehlende PDF-Datei unexpected_response_error=Unerwartete Antwort des Servers # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Anlage: {{type}}] password_label=Geben Sie zum Öffnen der PDF-Datei deren Passwort ein. password_invalid=Falsches Passwort. Bitte versuchen Sie es erneut. password_ok=OK password_cancel=Abbrechen printing_not_supported=Warnung: Die Drucken-Funktion wird durch diesen Browser nicht vollständig unterstützt. printing_not_ready=Warnung: Die PDF-Datei ist nicht vollständig geladen, dies ist für das Drucken aber empfohlen. web_fonts_disabled=Web-Schriftarten sind deaktiviert: Eingebettete PDF-Schriftarten konnten nicht geladen werden. document_colors_not_allowed=PDF-Dokumenten ist es nicht erlaubt, ihre eigenen Farben zu verwenden: 'Seiten das Verwenden von eigenen Farben erlauben' ist im Browser deaktiviert. manuskript-0.10.0/libs/pdf.js/web/locale/el/000077500000000000000000000000001354442177200205275ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/el/viewer.properties000066400000000000000000000213301354442177200241450ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Προηγούμενη σελίδα previous_label=Προηγούμενη next.title=Επόμενη σελίδα next_label=Επόμενη # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Σελίδα: page_of=από {{pageCount}} zoom_out.title=Σμίκρυνση zoom_out_label=Σμίκρυνση zoom_in.title=Μεγέθυνση zoom_in_label=Μεγέθυνση zoom.title=Μεγέθυνση presentation_mode.title=Μετάβαση σε λειτουργία παρουσίασης presentation_mode_label=Λειτουργία παρουσίασης open_file.title=Άνοιγμα αρχείου open_file_label=Άνοιγμα print.title=Εκτύπωση print_label=Εκτύπωση download.title=Λήψη download_label=Λήψη bookmark.title=Τρέχουσα προβολή (αντίγραφο ή άνοιγμα σε νέο παράθυρο) bookmark_label=Τρέχουσα προβολή # Secondary toolbar and context menu tools.title=Εργαλεία tools_label=Εργαλεία first_page.title=Μετάβαση στην πρώτη σελίδα first_page.label=Μετάβαση στην πρώτη σελίδα first_page_label=Μετάβαση στην πρώτη σελίδα last_page.title=Μετάβαση στη τελευταία σελίδα last_page.label=Μετάβαση στη τελευταία σελίδα last_page_label=Μετάβαση στη τελευταία σελίδα page_rotate_cw.title=Δεξιόστροφη περιστροφή page_rotate_cw.label=Δεξιόστροφη περιστροφή page_rotate_cw_label=Δεξιόστροφη περιστροφή page_rotate_ccw.title=Αριστερόστροφη περιστροφή page_rotate_ccw.label=Αριστερόστροφη περιστροφή page_rotate_ccw_label=Αριστερόστροφη περιστροφή hand_tool_enable.title=Ενεργοποίηση εργαλείου χεριού hand_tool_enable_label=Ενεργοποίηση εργαλείου χεριού hand_tool_disable.title=Απενεργοποίηση εργαλείου χεριού hand_tool_disable_label=Απενεργοποίηση εργαλείου χεριού # Document properties dialog box document_properties.title=Ιδιότητες εγγράφου… document_properties_label=Ιδιότητες εγγράφου… document_properties_file_name=Όνομα αρχείου: document_properties_file_size=Μέγεθος αρχείου: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_title=Τίτλος: document_properties_author=Συγγραφέας: document_properties_subject=Θέμα: document_properties_keywords=Λέξεις κλειδιά: document_properties_creation_date=Ημερομηνία δημιουργίας: document_properties_modification_date=Ημερομηνία τροποποίησης: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_creator=Δημιουργός: document_properties_producer=Παραγωγός PDF: document_properties_version=Έκδοση PDF: document_properties_page_count=Αριθμός σελίδων: document_properties_close=Κλείσιμο # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Εναλλαγή προβολής πλευρικής στήλης toggle_sidebar_label=Εναλλαγή προβολής πλευρικής στήλης outline.title=Προβολή διάρθρωσης κειμένου outline_label=Διάρθρωση κειμένου attachments.title=Προβολή συνημμένου attachments_label=Συνημμένα thumbs.title=Προβολή μικρογραφιών thumbs_label=Μικρογραφίες findbar.title=Εύρεση στο έγγραφο findbar_label=Εύρεση # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Σελίδα {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Μικρογραφία της σελίδας {{page}} # Find panel button title and messages find_label=Εύρεση: find_previous.title=Εύρεση της προηγούμενης εμφάνισης της φράσης find_previous_label=Προηγούμενο find_next.title=Εύρεση της επόμενης εμφάνισης της φράσης find_next_label=Επόμενο find_highlight=Επισήμανση όλων find_match_case_label=Ταίριασμα χαρακτήρα find_reached_top=Έλευση στην αρχή του εγγράφου, συνέχεια από το τέλος find_reached_bottom=Έλευση στο τέλος του εγγράφου, συνέχεια από την αρχή find_not_found=Η φράση δεν βρέθηκε # Error panel labels error_more_info=Περισσότερες πληροφορίες error_less_info=Λιγότερες πληροφορίες error_close=Κλείσιμο # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Μήνυμα: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Αρχείο: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number rendering_error=Προέκυψε σφάλμα κατά την ανάλυση της σελίδας. # Predefined zoom values page_scale_width=Πλάτος σελίδας page_scale_fit=Μέγεθος σελίδας page_scale_auto=Αυτόματη μεγέθυνση page_scale_actual=Πραγματικό μέγεθος # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. # Loading indicator messages loading_error_indicator=Σφάλμα loading_error=Προέκυψε ένα σφάλμα κατά τη φόρτωση του PDF. invalid_file_error=Μη έγκυρο ή κατεστραμμένο αρχείο PDF. missing_file_error=Λείπει αρχείο PDF. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Σχόλιο] password_label=Εισαγωγή κωδικού για το άνοιγμα του PDF αρχείου. password_invalid=Μη έγκυρος κωδικός. Προσπαθείστε ξανά. password_ok=ΟΚ password_cancel=Ακύρωση printing_not_supported=Προειδοποίηση: Η εκτύπωση δεν υποστηρίζεται πλήρως από αυτόν τον περιηγητή. printing_not_ready=Προειδοποίηση: Το PDF δεν φορτώθηκε πλήρως για εκτύπωση. web_fonts_disabled=Οι γραμματοσειρές Web απενεργοποιημένες: αδυναμία χρήσης των ενσωματωμένων γραμματοσειρών PDF. document_colors_disabled=Δεν επιτρέπεται στα έγγραφα PDF να χρησιμοποιούν τα δικά τους χρώματα: Η επιλογή \'Να επιτρέπεται η χρήση χρωμάτων της σελίδας\' δεν είναι ενεργή στην εφαρμογή. manuskript-0.10.0/libs/pdf.js/web/locale/en-GB/000077500000000000000000000000001354442177200210175ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/en-GB/viewer.properties000066400000000000000000000152461354442177200244460ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Previous Page previous_label=Previous next.title=Next Page next_label=Next # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Page: page_of=of {{pageCount}} zoom_out.title=Zoom Out zoom_out_label=Zoom Out zoom_in.title=Zoom In zoom_in_label=Zoom In zoom.title=Zoom presentation_mode.title=Switch to Presentation Mode presentation_mode_label=Presentation Mode open_file.title=Open File open_file_label=Open print.title=Print print_label=Print download.title=Download download_label=Download bookmark.title=Current view (copy or open in new window) bookmark_label=Current View # Secondary toolbar and context menu tools.title=Tools tools_label=Tools first_page.title=Go to First Page first_page.label=Go to First Page first_page_label=Go to First Page last_page.title=Go to Last Page last_page.label=Go to Last Page last_page_label=Go to Last Page page_rotate_cw.title=Rotate Clockwise page_rotate_cw.label=Rotate Clockwise page_rotate_cw_label=Rotate Clockwise page_rotate_ccw.title=Rotate Anti-Clockwise page_rotate_ccw.label=Rotate Anti-Clockwise page_rotate_ccw_label=Rotate Anti-Clockwise hand_tool_enable.title=Enable hand tool hand_tool_enable_label=Enable hand tool hand_tool_disable.title=Disable hand tool hand_tool_disable_label=Disable hand tool # Document properties dialog box document_properties.title=Document Properties… document_properties_label=Document Properties… document_properties_file_name=File name: document_properties_file_size=File size: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} kB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=Title: document_properties_author=Author: document_properties_subject=Subject: document_properties_keywords=Keywords: document_properties_creation_date=Creation Date: document_properties_modification_date=Modification Date: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Creator: document_properties_producer=PDF Producer: document_properties_version=PDF Version: document_properties_page_count=Page Count: document_properties_close=Close # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Toggle Sidebar toggle_sidebar_label=Toggle Sidebar outline.title=Show Document Outline outline_label=Document Outline attachments.title=Show Attachments attachments_label=Attachments thumbs.title=Show Thumbnails thumbs_label=Thumbnails findbar.title=Find in Document findbar_label=Find # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Page {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Thumbnail of Page {{page}} # Find panel button title and messages find_label=Find: find_previous.title=Find the previous occurrence of the phrase find_previous_label=Previous find_next.title=Find the next occurrence of the phrase find_next_label=Next find_highlight=Highlight all find_match_case_label=Match case find_reached_top=Reached top of document, continued from bottom find_reached_bottom=Reached end of document, continued from top find_not_found=Phrase not found # Error panel labels error_more_info=More Information error_less_info=Less Information error_close=Close # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Message: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stack: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=File: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Line: {{line}} rendering_error=An error occurred while rendering the page. # Predefined zoom values page_scale_width=Page Width page_scale_fit=Page Fit page_scale_auto=Automatic Zoom page_scale_actual=Actual Size # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Error loading_error=An error occurred while loading the PDF. invalid_file_error=Invalid or corrupted PDF file. missing_file_error=Missing PDF file. unexpected_response_error=Unexpected server response. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Annotation] password_label=Enter the password to open this PDF file. password_invalid=Invalid password. Please try again. password_ok=OK password_cancel=Cancel printing_not_supported=Warning: Printing is not fully supported by this browser. printing_not_ready=Warning: The PDF is not fully loaded for printing. web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts. document_colors_not_allowed=PDF documents are not allowed to use their own colours: 'Allow pages to choose their own colours' is deactivated in the browser. manuskript-0.10.0/libs/pdf.js/web/locale/en-US/000077500000000000000000000000001354442177200210565ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/en-US/viewer.properties000066400000000000000000000152521354442177200245020ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Previous Page previous_label=Previous next.title=Next Page next_label=Next # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Page: page_of=of {{pageCount}} zoom_out.title=Zoom Out zoom_out_label=Zoom Out zoom_in.title=Zoom In zoom_in_label=Zoom In zoom.title=Zoom presentation_mode.title=Switch to Presentation Mode presentation_mode_label=Presentation Mode open_file.title=Open File open_file_label=Open print.title=Print print_label=Print download.title=Download download_label=Download bookmark.title=Current view (copy or open in new window) bookmark_label=Current View # Secondary toolbar and context menu tools.title=Tools tools_label=Tools first_page.title=Go to First Page first_page.label=Go to First Page first_page_label=Go to First Page last_page.title=Go to Last Page last_page.label=Go to Last Page last_page_label=Go to Last Page page_rotate_cw.title=Rotate Clockwise page_rotate_cw.label=Rotate Clockwise page_rotate_cw_label=Rotate Clockwise page_rotate_ccw.title=Rotate Counterclockwise page_rotate_ccw.label=Rotate Counterclockwise page_rotate_ccw_label=Rotate Counterclockwise hand_tool_enable.title=Enable hand tool hand_tool_enable_label=Enable hand tool hand_tool_disable.title=Disable hand tool hand_tool_disable_label=Disable hand tool # Document properties dialog box document_properties.title=Document Properties… document_properties_label=Document Properties… document_properties_file_name=File name: document_properties_file_size=File size: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=Title: document_properties_author=Author: document_properties_subject=Subject: document_properties_keywords=Keywords: document_properties_creation_date=Creation Date: document_properties_modification_date=Modification Date: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Creator: document_properties_producer=PDF Producer: document_properties_version=PDF Version: document_properties_page_count=Page Count: document_properties_close=Close # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Toggle Sidebar toggle_sidebar_label=Toggle Sidebar outline.title=Show Document Outline outline_label=Document Outline attachments.title=Show Attachments attachments_label=Attachments thumbs.title=Show Thumbnails thumbs_label=Thumbnails findbar.title=Find in Document findbar_label=Find # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Page {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Thumbnail of Page {{page}} # Find panel button title and messages find_label=Find: find_previous.title=Find the previous occurrence of the phrase find_previous_label=Previous find_next.title=Find the next occurrence of the phrase find_next_label=Next find_highlight=Highlight all find_match_case_label=Match case find_reached_top=Reached top of document, continued from bottom find_reached_bottom=Reached end of document, continued from top find_not_found=Phrase not found # Error panel labels error_more_info=More Information error_less_info=Less Information error_close=Close # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Message: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stack: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=File: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Line: {{line}} rendering_error=An error occurred while rendering the page. # Predefined zoom values page_scale_width=Page Width page_scale_fit=Page Fit page_scale_auto=Automatic Zoom page_scale_actual=Actual Size # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Error loading_error=An error occurred while loading the PDF. invalid_file_error=Invalid or corrupted PDF file. missing_file_error=Missing PDF file. unexpected_response_error=Unexpected server response. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Annotation] password_label=Enter the password to open this PDF file. password_invalid=Invalid password. Please try again. password_ok=OK password_cancel=Cancel printing_not_supported=Warning: Printing is not fully supported by this browser. printing_not_ready=Warning: The PDF is not fully loaded for printing. web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts. document_colors_not_allowed=PDF documents are not allowed to use their own colors: 'Allow pages to choose their own colors' is deactivated in the browser. manuskript-0.10.0/libs/pdf.js/web/locale/en-ZA/000077500000000000000000000000001354442177200210415ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/en-ZA/viewer.properties000066400000000000000000000152541354442177200244670ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Previous Page previous_label=Previous next.title=Next Page next_label=Next # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Page: page_of=of {{pageCount}} zoom_out.title=Zoom Out zoom_out_label=Zoom Out zoom_in.title=Zoom In zoom_in_label=Zoom In zoom.title=Zoom presentation_mode.title=Switch to Presentation Mode presentation_mode_label=Presentation Mode open_file.title=Open File open_file_label=Open print.title=Print print_label=Print download.title=Download download_label=Download bookmark.title=Current view (copy or open in new window) bookmark_label=Current View # Secondary toolbar and context menu tools.title=Tools tools_label=Tools first_page.title=Go to First Page first_page.label=Go to First Page first_page_label=Go to First Page last_page.title=Go to Last Page last_page.label=Go to Last Page last_page_label=Go to Last Page page_rotate_cw.title=Rotate Clockwise page_rotate_cw.label=Rotate Clockwise page_rotate_cw_label=Rotate Clockwise page_rotate_ccw.title=Rotate Counterclockwise page_rotate_ccw.label=Rotate Counterclockwise page_rotate_ccw_label=Rotate Counterclockwise hand_tool_enable.title=Enable hand tool hand_tool_enable_label=Enable hand tool hand_tool_disable.title=Disable hand tool hand_tool_disable_label=Disable hand tool # Document properties dialog box document_properties.title=Document Properties… document_properties_label=Document Properties… document_properties_file_name=File name: document_properties_file_size=File size: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=Title: document_properties_author=Author: document_properties_subject=Subject: document_properties_keywords=Keywords: document_properties_creation_date=Creation Date: document_properties_modification_date=Modification Date: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Creator: document_properties_producer=PDF Producer: document_properties_version=PDF Version: document_properties_page_count=Page Count: document_properties_close=Close # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Toggle Sidebar toggle_sidebar_label=Toggle Sidebar outline.title=Show Document Outline outline_label=Document Outline attachments.title=Show Attachments attachments_label=Attachments thumbs.title=Show Thumbnails thumbs_label=Thumbnails findbar.title=Find in Document findbar_label=Find # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Page {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Thumbnail of Page {{page}} # Find panel button title and messages find_label=Find: find_previous.title=Find the previous occurrence of the phrase find_previous_label=Previous find_next.title=Find the next occurrence of the phrase find_next_label=Next find_highlight=Highlight all find_match_case_label=Match case find_reached_top=Reached top of document, continued from bottom find_reached_bottom=Reached end of document, continued from top find_not_found=Phrase not found # Error panel labels error_more_info=More Information error_less_info=Less Information error_close=Close # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Message: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stack: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=File: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Line: {{line}} rendering_error=An error occurred while rendering the page. # Predefined zoom values page_scale_width=Page Width page_scale_fit=Page Fit page_scale_auto=Automatic Zoom page_scale_actual=Actual Size # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Error loading_error=An error occurred while loading the PDF. invalid_file_error=Invalid or corrupted PDF file. missing_file_error=Missing PDF file. unexpected_response_error=Unexpected server response. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Annotation] password_label=Enter the password to open this PDF file. password_invalid=Invalid password. Please try again. password_ok=OK password_cancel=Cancel printing_not_supported=Warning: Printing is not fully supported by this browser. printing_not_ready=Warning: The PDF is not fully loaded for printing. web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts. document_colors_not_allowed=PDF documents are not allowed to use their own colours: 'Allow pages to choose their own colours' is deactivated in the browser. manuskript-0.10.0/libs/pdf.js/web/locale/eo/000077500000000000000000000000001354442177200205325ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/eo/viewer.properties000066400000000000000000000157521354442177200241630ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Antaŭa paĝo previous_label=Malantaŭen next.title=Venonta paĝo next_label=Antaŭen # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Paĝo: page_of=el {{pageCount}} zoom_out.title=Malpligrandigi zoom_out_label=Malpligrandigi zoom_in.title=Pligrandigi zoom_in_label=Pligrandigi zoom.title=Pligrandigilo presentation_mode.title=Iri al prezenta reĝimo presentation_mode_label=Prezenta reĝimo open_file.title=Malfermi dosieron open_file_label=Malfermi print.title=Presi print_label=Presi download.title=Elŝuti download_label=Elŝuti bookmark.title=Nuna vido (kopii aŭ malfermi en nova fenestro) bookmark_label=Nuna vido # Secondary toolbar and context menu tools.title=Iloj tools_label=Iloj first_page.title=Iri al la unua paĝo first_page.label=Iri al la unua paĝo first_page_label=Iri al la unua paĝo last_page.title=Iri al la lasta paĝo last_page.label=Iri al la lasta paĝo last_page_label=Iri al la lasta paĝo page_rotate_cw.title=Rotaciigi dekstrume page_rotate_cw.label=Rotaciigi dekstrume page_rotate_cw_label=Rotaciigi dekstrume page_rotate_ccw.title=Rotaciigi maldekstrume page_rotate_ccw.label=Rotaciigi maldekstrume page_rotate_ccw_label=Rotaciigi maldekstrume hand_tool_enable.title=Aktivigi manan ilon hand_tool_enable_label=Aktivigi manan ilon hand_tool_disable.title=Malaktivigi manan ilon hand_tool_disable_label=Malaktivigi manan ilon # Document properties dialog box document_properties.title=Atributoj de dokumento… document_properties_label=Atributoj de dokumento… document_properties_file_name=Nomo de dosiero: document_properties_file_size=Grado de dosiero: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KO ({{size_b}} oktetoj) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MO ({{size_b}} oktetoj) document_properties_title=Titolo: document_properties_author=Aŭtoro: document_properties_subject=Temo: document_properties_keywords=Ŝlosilvorto: document_properties_creation_date=Dato de kreado: document_properties_modification_date=Dato de modifo: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Kreinto: document_properties_producer=Produktinto de PDF: document_properties_version=Versio de PDF: document_properties_page_count=Nombro de paĝoj: document_properties_close=Fermi # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Montri/kaŝi flankan strion toggle_sidebar_label=Montri/kaŝi flankan strion outline.title=Montri skemon de dokumento outline_label=Skemo de dokumento attachments.title=Montri kunsendaĵojn attachments_label=Kunsendaĵojn thumbs.title=Montri miniaturojn thumbs_label=Miniaturoj findbar.title=Serĉi en dokumento findbar_label=Serĉi # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Paĝo {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Miniaturo de paĝo {{page}} # Find panel button title and messages find_label=Serĉi: find_previous.title=Serĉi la antaŭan aperon de la frazo find_previous_label=Malantaŭen find_next.title=Serĉi la venontan aperon de la frazo find_next_label=Antaŭen find_highlight=Elstarigi ĉiujn find_match_case_label=Distingi inter majuskloj kaj minuskloj find_reached_top=Komenco de la dokumento atingita, daŭrigado ekde la fino find_reached_bottom=Fino de la dokumento atingita, daŭrigado ekde la komenco find_not_found=Frazo ne trovita # Error panel labels error_more_info=Pli da informo error_less_info=Mapli da informo error_close=Fermi # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Mesaĝo: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stako: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Dosiero: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Linio: {{line}} rendering_error=Okazis eraro dum la montrado de la paĝo. # Predefined zoom values page_scale_width=Larĝo de paĝo page_scale_fit=Adapti paĝon page_scale_auto=Aŭtomata skalo page_scale_actual=Reala gandeco # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Eraro loading_error=Okazis eraro dum la ŝargado de la PDF dosiero. invalid_file_error=Nevalida aŭ difektita PDF dosiero. missing_file_error=Mankas dosiero PDF. unexpected_response_error=Neatendita respondo de servilo. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Prinoto: {{type}}] password_label=Tajpu pasvorton por malfermi tiun ĉi dosieron PDF. password_invalid=Nevalida pasvorto. Bonvolu provi denove. password_ok=Akcepti password_cancel=Nuligi printing_not_supported=Averto: tiu ĉi retumilo ne plene subtenas presadon. printing_not_ready=Averto: La PDF dosiero ne estas plene ŝargita por presado. web_fonts_disabled=Neaktivaj teksaĵaj tiparoj: ne elbas uzi enmetitajn tiparojn de PDF. document_colors_disabled=Dokumentoj PDF ne rajtas havi siajn proprajn kolorojn: \'Permesi al paĝoj elekti siajn proprajn kolorojn\' estas malaktiva en la retumilo. manuskript-0.10.0/libs/pdf.js/web/locale/es-AR/000077500000000000000000000000001354442177200210365ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/es-AR/viewer.properties000066400000000000000000000151061354442177200244600ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Página anterior previous_label=Anterior next.title=Página siguiente next_label=Siguiente # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Página: page_of=de {{pageCount}} zoom_out.title=Alejar zoom_out_label=Alejar zoom_in.title=Acercar zoom_in_label=Acercar zoom.title=Zoom print.title=Imprimir print_label=Imprimir presentation_mode.title=Cambiar a modo presentación presentation_mode_label=Modo presentación open_file.title=Abrir archivo open_file_label=Abrir download.title=Descargar download_label=Descargar bookmark.title=Vista actual (copiar o abrir en nueva ventana) bookmark_label=Vista actual # Secondary toolbar and context menu tools.title=Herramientas tools_label=Herramientas first_page.title=Ir a primera página first_page.label=Ir a primera página first_page_label=Ir a primera página last_page.title=Ir a última página last_page.label=Ir a última página last_page_label=Ir a última página page_rotate_cw.title=Rotar horario page_rotate_cw.label=Rotar horario page_rotate_cw_label=Rotar horario page_rotate_ccw.title=Rotar antihorario page_rotate_ccw.label=Rotar antihorario page_rotate_ccw_label=Rotar antihorario hand_tool_enable.title=Habilitar herramienta mano hand_tool_enable_label=Habilitar herramienta mano hand_tool_disable.title=Deshabilitar herramienta mano hand_tool_disable_label=Deshabilitar herramienta mano # Document properties dialog box document_properties.title=Propiedades del documento… document_properties_label=Propiedades del documento… document_properties_file_name=Nombre de archivo: document_properties_file_size=Tamaño de archovo: document_properties_kb={{size_kb}} KB ({{size_b}} bytes) document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=Título: document_properties_author=Autor: document_properties_subject=Asunto: document_properties_keywords=Palabras clave: document_properties_creation_date=Fecha de creación: document_properties_modification_date=Fecha de modificación: document_properties_date_string={{date}}, {{time}} document_properties_creator=Creador: document_properties_producer=PDF Productor: document_properties_version=Versión de PDF: document_properties_page_count=Cantidad de páginas: document_properties_close=Cerrar # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Alternar barra lateral toggle_sidebar_label=Alternar barra lateral outline.title=Mostrar esquema del documento outline_label=Esquema del documento attachments.title=Mostrar adjuntos attachments_label=Adjuntos thumbs.title=Mostrar miniaturas thumbs_label=Miniaturas findbar.title=Buscar en documento findbar_label=Buscar # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Página {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Miniatura de página {{page}} # Find panel button title and messages find_label=Buscar: find_previous.title=Buscar la aparición anterior de la frase find_previous_label=Anterior find_next.title=Buscar la siguiente aparición de la frase find_next_label=Siguiente find_highlight=Resaltar todo find_match_case_label=Coincidir mayúsculas find_reached_top=Inicio de documento alcanzado, continuando desde abajo find_reached_bottom=Fin de documento alcanzando, continuando desde arriba find_not_found=Frase no encontrada # Error panel labels error_more_info=Más información error_less_info=Menos información error_close=Cerrar # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Mensaje: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Pila: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Archivo: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Línea: {{line}} rendering_error=Ocurrió un error al dibujar la página. # Predefined zoom values page_scale_width=Ancho de página page_scale_fit=Ajustar página page_scale_auto=Zoom automático page_scale_actual=Tamaño real # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Error loading_error=Ocurrió un error al cargar el PDF. invalid_file_error=Archivo PDF no válido o cocrrupto. missing_file_error=Archivo PDF faltante. unexpected_response_error=Respuesta del servidor inesperada. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Anotación] password_label=Ingrese la contraseña para abrir este archivo PDF password_invalid=Contraseña inválida. Intente nuevamente. password_ok=Aceptar password_cancel=Cancelar printing_not_supported=Advertencia: La impresión no está totalmente soportada por este navegador. printing_not_ready=Advertencia: El PDF no está completamente cargado para impresión. web_fonts_disabled=Tipografía web deshabilitada: no se pueden usar tipos incrustados en PDF. document_colors_not_allowed=Los documentos PDF no tienen permitido usar sus propios colores: 'Permitir a las páginas elegir sus propios colores' está desactivado en el navegador. manuskript-0.10.0/libs/pdf.js/web/locale/es-CL/000077500000000000000000000000001354442177200210325ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/es-CL/viewer.properties000066400000000000000000000125451354442177200244600ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. previous.title = Página anterior previous_label = Anterior next.title = Página siguiente next_label = Siguiente page_label = Página: page_of = de {{pageCount}} zoom_out.title = Alejar zoom_out_label = Alejar zoom_in.title = Acercar zoom_in_label = Acercar zoom.title = Ampliación print.title = Imprimir print_label = Imprimir presentation_mode.title = Cambiar al modo de presentación presentation_mode_label = Modo de presentación open_file.title = Abrir archivo open_file_label = Abrir download.title = Descargar download_label = Descargar bookmark.title = Vista actual (copiar o abrir en nueva ventana) bookmark_label = Vista actual tools.title=Herramientas tools_label=Herramientas first_page.title=Ir a la primera página first_page.label=Ir a la primera página first_page_label=Ir a la primera página last_page.title=Ir a la última página last_page.label=Ir a la última página last_page_label=Ir a la última página page_rotate_cw.title=Girar a la derecha page_rotate_cw.label=Girar a la derecha page_rotate_cw_label=Girar a la derecha page_rotate_ccw.title=Girar a la izquierda page_rotate_ccw.label=Girar a la izquierda page_rotate_ccw_label=Girar a la izquierda hand_tool_enable.title=Activar herramienta de mano hand_tool_enable_label=Activar herramienta de mano hand_tool_disable.title=Desactivar herramienta de mano hand_tool_disable_label=Desactivar herramienta de mano document_properties.title=Propiedades del documento… document_properties_label=Propiedades del documento… document_properties_file_name=Nombre del archivo: document_properties_file_size=Tamaño del archivo: document_properties_kb={{size_kb}} KB ({{size_b}} bytes) document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=Título: document_properties_author=Autor: document_properties_subject=Asunto: document_properties_keywords=Palabras clave: document_properties_creation_date=Fecha de creación: document_properties_modification_date=Fecha de modificación: document_properties_date_string={{date}}, {{time}} document_properties_creator=Creador: document_properties_producer=Productor del PDF: document_properties_version=Versión de PDF: document_properties_page_count=Cantidad de páginas: document_properties_close=Cerrar toggle_sidebar.title=Barra lateral toggle_sidebar_label=Mostrar u ocultar la barra lateral outline.title = Mostrar esquema del documento outline_label = Esquema del documento attachments.title=Mostrar adjuntos attachments_label=Adjuntos thumbs.title = Mostrar miniaturas thumbs_label = Miniaturas findbar.title = Buscar en el documento findbar_label = Buscar thumb_page_title = Página {{page}} thumb_page_canvas = Miniatura de la página {{page}} first_page.label = Ir a la primera página last_page.label = Ir a la última página page_rotate_cw.label = Rotar en sentido de los punteros del reloj page_rotate_ccw.label = Rotar en sentido contrario a los punteros del reloj find_label = Buscar: find_previous.title = Encontrar la aparición anterior de la frase find_previous_label = Previo find_next.title = Encontrar la siguiente aparición de la frase find_next_label = Siguiente find_highlight = Destacar todos find_match_case_label = Coincidir mayús./minús. find_reached_top=Se alcanzó el inicio del documento, continuando desde el final find_reached_bottom=Se alcanzó el final del documento, continuando desde el inicio find_not_found = Frase no encontrada error_more_info = Más información error_less_info = Menos información error_close = Cerrar error_version_info=PDF.js v{{version}} (compilación: {{build}}) error_message = Mensaje: {{message}} error_stack = Pila: {{stack}} error_file = Archivo: {{file}} error_line = Línea: {{line}} rendering_error = Ha ocurrido un error al renderizar la página. page_scale_width = Ancho de página page_scale_fit = Ajuste de página page_scale_auto = Aumento automático page_scale_actual = Tamaño actual page_scale_percent={{scale}}% loading_error_indicator = Error loading_error = Ha ocurrido un error al cargar el PDF. invalid_file_error = Archivo PDF inválido o corrupto. missing_file_error=Falta el archivo PDF. unexpected_response_error=Respuesta del servidor inesperada. text_annotation_type.alt=[{{type}} Anotación] password_label=Ingrese la contraseña para abrir este archivo PDF. password_invalid=Contraseña inválida. Por favor, vuelva a intentarlo. password_ok=Aceptar password_cancel=Cancelar printing_not_supported = Advertencia: Imprimir no está soportado completamente por este navegador. printing_not_ready=Advertencia: El PDF no está completamente cargado para ser impreso. web_fonts_disabled=Las fuentes web están desactivadas: imposible usar las fuentes PDF embebidas. document_colors_not_allowed=Los documentos PDF no tienen permitido usar sus propios colores: 'Permitir a las páginas elegir sus propios colores' está desactivado en el navegador. manuskript-0.10.0/libs/pdf.js/web/locale/es-ES/000077500000000000000000000000001354442177200210435ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/es-ES/viewer.properties000066400000000000000000000116101354442177200244610ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. previous.title = Página anterior previous_label = Anterior next.title = Página siguiente next_label = Siguiente page_label = Página: page_of = de {{pageCount}} zoom_out.title = Reducir zoom_out_label = Reducir zoom_in.title = Aumentar zoom_in_label = Aumentar zoom.title = Tamaño presentation_mode.title = Cambiar al modo presentación presentation_mode_label = Modo presentación open_file.title = Abrir archivo open_file_label = Abrir print.title = Imprimir print_label = Imprimir download.title = Descargar download_label = Descargar bookmark.title = Vista actual (copiar o abrir en una nueva ventana) bookmark_label = Vista actual tools.title = Herramientas tools_label = Herramientas first_page.title = Ir a la primera página first_page.label = Ir a la primera página first_page_label = Ir a la primera página last_page.title = Ir a la última página last_page.label = Ir a la última página last_page_label = Ir a la última página page_rotate_cw.title = Rotar en sentido horario page_rotate_cw.label = Rotar en sentido horario page_rotate_cw_label = Rotar en sentido horario page_rotate_ccw.title = Rotar en sentido antihorario page_rotate_ccw.label = Rotar en sentido antihorario page_rotate_ccw_label = Rotar en sentido antihorario hand_tool_enable.title = Activar herramienta mano hand_tool_enable_label = Activar herramienta mano hand_tool_disable.title = Desactivar herramienta mano hand_tool_disable_label = Desactivar herramienta mano document_properties.title = Propiedades del documento… document_properties_label = Propiedades del documento… document_properties_file_name = Nombre de archivo: document_properties_file_size = Tamaño de archivo: document_properties_kb = {{size_kb}} KB ({{size_b}} bytes) document_properties_mb = {{size_mb}} MB ({{size_b}} bytes) document_properties_title = Título: document_properties_author = Autor: document_properties_subject = Asunto: document_properties_keywords = Palabras clave: document_properties_creation_date = Fecha de creación: document_properties_modification_date = Fecha de modificación: document_properties_date_string = {{date}}, {{time}} document_properties_creator = Creador: document_properties_producer = Productor PDF: document_properties_version = Versión PDF: document_properties_page_count = Número de páginas: document_properties_close = Cerrar toggle_sidebar.title = Cambiar barra lateral toggle_sidebar_label = Cambiar barra lateral outline.title = Mostrar el esquema del documento outline_label = Esquema del documento attachments.title = Mostrar adjuntos attachments_label = Adjuntos thumbs.title = Mostrar miniaturas thumbs_label = Miniaturas findbar.title = Buscar en el documento findbar_label = Buscar thumb_page_title = Página {{page}} thumb_page_canvas = Miniatura de la página {{page}} find_label = Buscar: find_previous.title = Encontrar la anterior aparición de la frase find_previous_label = Anterior find_next.title = Encontrar la siguiente aparición de esta frase find_next_label = Siguiente find_highlight = Resaltar todos find_match_case_label = Coincidencia de mayús./minús. find_reached_top = Se alcanzó el inicio del documento, se continúa desde el final find_reached_bottom = Se alcanzó el final del documento, se continúa desde el inicio find_not_found = Frase no encontrada error_more_info = Más información error_less_info = Menos información error_close = Cerrar error_version_info = PDF.js v{{version}} (build: {{build}}) error_message = Mensaje: {{message}} error_stack = Pila: {{stack}} error_file = Archivo: {{file}} error_line = Línea: {{line}} rendering_error = Ocurrió un error al renderizar la página. page_scale_width = Anchura de la página page_scale_fit = Ajuste de la página page_scale_auto = Tamaño automático page_scale_actual = Tamaño real page_scale_percent = {{scale}}% loading_error_indicator = Error loading_error = Ocurrió un error al cargar el PDF. invalid_file_error = Fichero PDF no válido o corrupto. missing_file_error = No hay fichero PDF. unexpected_response_error = Respuesta inesperada del servidor. text_annotation_type.alt = [Anotación {{type}}] password_label = Introduzca la contraseña para abrir este archivo PDF. password_invalid = Contraseña no válida. Vuelva a intentarlo. password_ok = Aceptar password_cancel = Cancelar printing_not_supported = Advertencia: Imprimir no está totalmente soportado por este navegador. printing_not_ready = Advertencia: Este PDF no se ha cargado completamente para poder imprimirse. web_fonts_disabled = Las tipografías web están desactivadas: es imposible usar las tipografías PDF embebidas. document_colors_not_allowed = Los documentos PDF no tienen permitido usar sus propios colores: 'Permitir a las páginas elegir sus propios colores' está desactivado en el navegador. manuskript-0.10.0/libs/pdf.js/web/locale/es-MX/000077500000000000000000000000001354442177200210605ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/es-MX/viewer.properties000066400000000000000000000161531354442177200245050ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Página anterior previous_label=Anterior next.title=Página siguiente next_label=Siguiente # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Página: page_of=de {{pageCount}} zoom_out.title=Reducir zoom_out_label=Reducir zoom_in.title=Aumentar zoom_in_label=Aumentar zoom.title=Zoom presentation_mode.title=Cambiar al modo presentación presentation_mode_label=Modo presentación open_file.title=Abrir archivo open_file_label=Abrir print.title=Imprimir print_label=Imprimir download.title=Descargar download_label=Descargar bookmark.title=Vista actual (copiar o abrir en una nueva ventana) bookmark_label=Vista actual # Secondary toolbar and context menu tools.title=Herramientas tools_label=Herramientas first_page.title=Ir a la primera página first_page.label=Ir a la primera página first_page_label=Ir a la primera página last_page.title=Ir a la última página last_page.label=Ir a la última página last_page_label=Ir a la última página page_rotate_cw.title=Girar a la derecha page_rotate_cw.label=Girar a la derecha page_rotate_cw_label=Girar a la derecha page_rotate_ccw.title=Girar a la izquierda page_rotate_ccw.label=Girar a la izquierda page_rotate_ccw_label=Girar a la izquierda hand_tool_enable.title=Activar herramienta mano hand_tool_enable_label=Activar herramienta mano hand_tool_disable.title=Desactivar herramienta mano hand_tool_disable_label=Desactivar herramienta mano # Document properties dialog box document_properties.title=Propiedades del documento… document_properties_label=Propiedades del documento… document_properties_file_name=Nombre del archivo: document_properties_file_size=Tamaño del archivo: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=Título: document_properties_author=Autor: document_properties_subject=Asunto: document_properties_keywords=Palabras claves: document_properties_creation_date=Fecha de creación: document_properties_modification_date=Fecha de modificación: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Creador: document_properties_producer=Productor PDF: document_properties_version=Versión PDF: document_properties_page_count=Número de páginas: document_properties_close=Cerrar # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Cambiar barra lateral toggle_sidebar_label=Cambiar barra lateral outline.title=Mostrar esquema del documento outline_label=Esquema del documento attachments.title=Mostrar adjuntos attachments_label=Adjuntos thumbs.title=Mostrar miniaturas thumbs_label=Miniaturas findbar.title=Buscar en el documento findbar_label=Buscar # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Página {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Miniatura de la página {{page}} # Find panel button title and messages find_label=Encontrar: find_previous.title=Ir a la anterior frase encontrada find_previous_label=Anterior find_next.title=Ir a la siguiente frase encontrada find_next_label=Siguiente find_highlight=Resaltar todo find_match_case_label=Coincidir con mayúsculas y minúsculas find_reached_top=Se alcanzó el inicio del documento, se buscará al final find_reached_bottom=Se alcanzó el final del documento, se buscará al inicio find_not_found=No se encontró la frase # Error panel labels error_more_info=Más información error_less_info=Menos información error_close=Cerrar # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Mensaje: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Pila: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Archivo: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Línea: {{line}} rendering_error=Un error ocurrió al renderizar la página. # Predefined zoom values page_scale_width=Ancho de página page_scale_fit=Ajustar página page_scale_auto=Zoom automático page_scale_actual=Tamaño real # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Error loading_error=Un error ocurrió al cargar el PDF. invalid_file_error=Archivo PDF invalido o dañado. missing_file_error=Archivo PDF no encontrado. unexpected_response_error=Respuesta inesperada del servidor. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} anotación] password_label=Ingresa la contraseña para abrir este archivo PDF. password_invalid=Contraseña inválida. Por favor intenta de nuevo. password_ok=Aceptar password_cancel=Cancelar printing_not_supported=Advertencia: La impresión no esta completamente soportada por este navegador. printing_not_ready=Advertencia: El PDF no cargo completamente para impresión. web_fonts_disabled=Las fuentes web están desactivadas: es imposible usar las fuentes PDF embebidas. document_colors_not_allowed=Los documentos PDF no tienen permiso de usar sus propios colores: 'Permitir que las páginas elijan sus propios colores' esta desactivada en el navegador. manuskript-0.10.0/libs/pdf.js/web/locale/et/000077500000000000000000000000001354442177200205375ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/et/viewer.properties000066400000000000000000000145101354442177200241570ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Eelmine lehekülg previous_label=Eelmine next.title=Järgmine lehekülg next_label=Järgmine # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Lehekülg: page_of=(kokku {{pageCount}}) zoom_out.title=Vähenda zoom_out_label=Vähenda zoom_in.title=Suurenda zoom_in_label=Suurenda zoom.title=Suurendamine presentation_mode.title=Lülitu esitlusrežiimi presentation_mode_label=Esitlusrežiim open_file.title=Ava fail open_file_label=Ava print.title=Prindi print_label=Prindi download.title=Laadi alla download_label=Laadi alla bookmark.title=Praegune vaade (kopeeri või ava uues aknas) bookmark_label=Praegune vaade # Secondary toolbar and context menu tools.title=Tööriistad tools_label=Tööriistad first_page.title=Mine esimesele leheküljele first_page.label=Mine esimesele leheküljele first_page_label=Mine esimesele leheküljele last_page.title=Mine viimasele leheküljele last_page.label=Mine viimasele leheküljele last_page_label=Mine viimasele leheküljele page_rotate_cw.title=Pööra päripäeva page_rotate_cw.label=Pööra päripäeva page_rotate_cw_label=Pööra päripäeva page_rotate_ccw.title=Pööra vastupäeva page_rotate_ccw.label=Pööra vastupäeva page_rotate_ccw_label=Pööra vastupäeva hand_tool_enable.title=Luba sirvimine hand_tool_enable_label=Luba sirvimine hand_tool_disable.title=Keela sirvimine hand_tool_disable_label=Keela sirvimine # Document properties dialog box document_properties.title=Dokumendi omadused… document_properties_label=Dokumendi omadused… document_properties_file_name=Faili nimi: document_properties_file_size=Faili suurus: document_properties_kb={{size_kb}} KiB ({{size_b}} baiti) document_properties_mb={{size_mb}} MiB ({{size_b}} baiti) document_properties_title=Pealkiri: document_properties_author=Autor: document_properties_subject=Teema: document_properties_keywords=Märksõnad: document_properties_creation_date=Loodud: document_properties_modification_date=Muudetud: document_properties_date_string={{date}} {{time}} document_properties_creator=Looja: document_properties_producer=Generaator: document_properties_version=Generaatori versioon: document_properties_page_count=Lehekülgi: document_properties_close=Sulge # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Näita külgriba toggle_sidebar_label=Näita külgriba outline.title=Näita sisukorda outline_label=Näita sisukorda attachments.title=Näita manuseid attachments_label=Manused thumbs.title=Näita pisipilte thumbs_label=Pisipildid findbar.title=Otsi dokumendist findbar_label=Otsi # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title={{page}}. lehekülg # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas={{page}}. lehekülje pisipilt # Find panel button title and messages find_label=Otsi: find_previous.title=Otsi fraasi eelmine esinemiskoht find_previous_label=Eelmine find_next.title=Otsi fraasi järgmine esinemiskoht find_next_label=Järgmine find_highlight=Too kõik esile find_match_case_label=Tõstutundlik find_reached_top=Jõuti dokumendi algusesse, jätkati lõpust find_reached_bottom=Jõuti dokumendi lõppu, jätkati algusest find_not_found=Fraasi ei leitud # Error panel labels error_more_info=Rohkem teavet error_less_info=Vähem teavet error_close=Sulge # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Teade: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stack: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Fail: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Rida: {{line}} rendering_error=Lehe renderdamisel esines viga. # Predefined zoom values page_scale_width=Mahuta laiusele page_scale_fit=Mahuta leheküljele page_scale_auto=Automaatne suurendamine page_scale_actual=Tegelik suurus # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Viga loading_error=PDFi laadimisel esines viga. invalid_file_error=Vigane või rikutud PDF-fail. missing_file_error=PDF-fail puudub. unexpected_response_error=Ootamatu vastus serverilt. # LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Annotation] password_label=PDF-faili avamiseks sisesta parool. password_invalid=Vigane parool. Palun proovi uuesti. password_ok=Sobib password_cancel=Loobu printing_not_supported=Hoiatus: printimine pole selle brauseri poolt täielikult toetatud. printing_not_ready=Hoiatus: PDF pole printimiseks täielikult laaditud. web_fonts_disabled=Veebifondid on keelatud: PDFiga kaasatud fonte pole võimalik kasutada. document_colors_disabled=PDF-dokumentidel pole oma värvide kasutamine lubatud: \'Veebilehtedel on lubatud kasutada oma värve\' on brauseris deaktiveeritud. manuskript-0.10.0/libs/pdf.js/web/locale/eu/000077500000000000000000000000001354442177200205405ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/eu/viewer.properties000066400000000000000000000161541354442177200241660ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Aurreko orria previous_label=Aurrekoa next.title=Hurrengo orria next_label=Hurrengoa # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Orria: page_of=/ {{pageCount}} zoom_out.title=Urrundu zooma zoom_out_label=Urrundu zooma zoom_in.title=Gerturatu zooma zoom_in_label=Gerturatu zooma zoom.title=Zooma presentation_mode.title=Aldatu aurkezpen modura presentation_mode_label=Arkezpen modua open_file.title=Ireki fitxategia open_file_label=Ireki print.title=Inprimatu print_label=Inprimatu download.title=Deskargatu download_label=Deskargatu bookmark.title=Uneko ikuspegia (kopiatu edo ireki leiho berrian) bookmark_label=Uneko ikuspegia # Secondary toolbar and context menu tools.title=Tresnak tools_label=Tresnak first_page.title=Joan lehen orrira first_page.label=Joan lehen orrira first_page_label=Joan lehen orrira last_page.title=Joan azken orrira last_page.label=Joan azken orrira last_page_label=Joan azken orrira page_rotate_cw.title=Biratu erlojuaren norantzan page_rotate_cw.label=Biratu erlojuaren norantzan page_rotate_cw_label=Biratu erlojuaren norantzan page_rotate_ccw.title=Biratu erlojuaren aurkako norantzan page_rotate_ccw.label=Biratu erlojuaren aurkako norantzan page_rotate_ccw_label=Biratu erlojuaren aurkako norantzan hand_tool_enable.title=Gaitu eskuaren tresna hand_tool_enable_label=Gaitu eskuaren tresna hand_tool_disable.title=Desgaitu eskuaren tresna hand_tool_disable_label=Desgaitu eskuaren tresna # Document properties dialog box document_properties.title=Dokumentuaren propietateak… document_properties_label=Dokumentuaren propietateak… document_properties_file_name=Fitxategi-izena: document_properties_file_size=Fitxategiaren tamaina: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} byte) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} byte) document_properties_title=Izenburua: document_properties_author=Egilea: document_properties_subject=Gaia: document_properties_keywords=Gako-hitzak: document_properties_creation_date=Sortze-data: document_properties_modification_date=Aldatze-data: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Sortzailea: document_properties_producer=PDFaren ekoizlea: document_properties_version=PDF bertsioa: document_properties_page_count=Orrialde kopurua: document_properties_close=Itxi # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Txandakatu alboko barra toggle_sidebar_label=Txandakatu alboko barra outline.title=Erakutsi dokumentuaren eskema outline_label=Dokumentuaren eskema attachments.title=Erakutsi eranskinak attachments_label=Eranskinak thumbs.title=Erakutsi koadro txikiak thumbs_label=Koadro txikiak findbar.title=Bilatu dokumentuan findbar_label=Bilatu # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title={{page}}. orria # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas={{page}}. orriaren koadro txikia # Find panel button title and messages find_label=Bilatu: find_previous.title=Bilatu esaldiaren aurreko parekatzea find_previous_label=Aurrekoa find_next.title=Bilatu esaldiaren hurrengo parekatzea find_next_label=Hurrengoa find_highlight=Nabarmendu guztia find_match_case_label=Bat etorri maiuskulekin/minuskulekin find_reached_top=Dokumentuaren hasierara heldu da, bukaeratik jarraitzen find_reached_bottom=Dokumentuaren bukaerara heldu da, hasieratik jarraitzen find_not_found=Esaldia ez da aurkitu # Error panel labels error_more_info=Informazio gehiago error_less_info=Informazio gutxiago error_close=Itxi # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (eraikuntza: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Mezua: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Pila: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Fitxategia: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Lerroa: {{line}} rendering_error=Errorea gertatu da orria errendatzean. # Predefined zoom values page_scale_width=Orriaren zabalera page_scale_fit=Doitu orrira page_scale_auto=Zoom automatikoa page_scale_actual=Benetako tamaina # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent=%{{scale}} # Loading indicator messages loading_error_indicator=Errorea loading_error=Errorea gertatu da PDFa kargatzean. invalid_file_error=PDF fitxategi baliogabe edo hondatua. missing_file_error=PDF fitxategia falta da. unexpected_response_error=Espero gabeko zerbitzariaren erantzuna. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} ohartarazpena] password_label=Idatzi PDF fitxategi hau irekitzeko pasahitza. password_invalid=Pasahitz baliogabea. Saiatu berriro mesedez. password_ok=Ados password_cancel=Utzi printing_not_supported=Abisua: inprimatzeko euskarria ez da erabatekoa nabigatzaile honetan. printing_not_ready=Abisua: PDFa ez dago erabat kargatuta inprimatzeko. web_fonts_disabled=Webeko letra-tipoak desgaituta daude: ezin dira kapsulatutako PDF letra-tipoak erabili. document_colors_not_allowed=PDF dokumentuek ez dute beraien koloreak erabiltzeko baimenik: 'Baimendu orriak beraien letra-tipoak aukeratzea' desaktibatuta dago nabigatzailean. manuskript-0.10.0/libs/pdf.js/web/locale/fa/000077500000000000000000000000001354442177200205155ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/fa/viewer.properties000066400000000000000000000202151354442177200241340ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=صفحهٔ قبلی previous_label=قبلی next.title=صفحهٔ بعدی next_label=بعدی # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=صفحه: page_of=از {{pageCount}} zoom_out.title=کوچک‌نمایی zoom_out_label=کوچک‌نمایی zoom_in.title=بزرگ‌نمایی zoom_in_label=بزرگ‌نمایی zoom.title=زوم presentation_mode.title=تغییر به حالت ارائه presentation_mode_label=حالت ارائه open_file.title=باز کردن پرونده open_file_label=باز کردن print.title=چاپ print_label=چاپ download.title=بارگیری download_label=بارگیری bookmark.title=نمای فعلی (رونوشت و یا نشان دادن در پنجره جدید) bookmark_label=نمای فعلی # Secondary toolbar and context menu tools.title=ابزارها tools_label=ابزارها first_page.title=برو به اولین صفحه first_page.label=برو یه اولین صفحه first_page_label=برو به اولین صفحه last_page.title=برو به آخرین صفحه last_page.label=برو به آخرین صفحه last_page_label=برو به آخرین صفحه page_rotate_cw.title=چرخش ساعتگرد page_rotate_cw.label=چرخش ساعتگرد page_rotate_cw_label=چرخش ساعتگرد page_rotate_ccw.title=چرخش پاد ساعتگرد page_rotate_ccw.label=چرخش پاد ساعتگرد page_rotate_ccw_label=چرخش پاد ساعتگرد hand_tool_enable.title=فعال سازی ابزار دست hand_tool_enable_label=فعال سازی ابزار دست hand_tool_disable.title=غیر‌فعال سازی ابزار دست hand_tool_disable_label=غیر‌فعال سازی ابزار دست # Document properties dialog box document_properties.title=خصوصیات سند... document_properties_label=خصوصیات سند... document_properties_file_name=نام فایل: document_properties_file_size=حجم پرونده: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} کیلوبایت ({{size_b}} بایت) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} مگابایت ({{size_b}} بایت) document_properties_title=عنوان: document_properties_author=نویسنده: document_properties_subject=موضوع: document_properties_keywords=کلیدواژه‌ها: document_properties_creation_date=تاریخ ایجاد: document_properties_modification_date=تاریخ ویرایش: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}، {{time}} document_properties_creator=ایجاد کننده: document_properties_producer=ایجاد کننده PDF: document_properties_version=نسخه PDF: document_properties_page_count=تعداد صفحات: document_properties_close=بستن # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=باز و بسته کردن نوار کناری toggle_sidebar_label=تغییرحالت نوارکناری outline.title=نمایش طرح نوشتار outline_label=طرح نوشتار attachments.title=نمایش پیوست‌ها attachments_label=پیوست‌ها thumbs.title=نمایش تصاویر بندانگشتی thumbs_label=تصاویر بندانگشتی findbar.title=جستجو در سند findbar_label=پیدا کردن # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=صفحه {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=تصویر بند‌ انگشتی صفحه {{page}} # Find panel button title and messages find_label=جستجو: find_previous.title=پیدا کردن رخداد قبلی عبارت find_previous_label=قبلی find_next.title=پیدا کردن رخداد بعدی عبارت find_next_label=بعدی find_highlight=برجسته و هایلایت کردن همه موارد find_match_case_label=تطبیق کوچکی و بزرگی حروف find_reached_top=به بالای صفحه رسیدیم، از پایین ادامه می‌دهیم find_reached_bottom=به آخر صفحه رسیدیم، از بالا ادامه می‌دهیم find_not_found=عبارت پیدا نشد # Error panel labels error_more_info=اطلاعات بیشتر error_less_info=اطلاعات کمتر error_close=بستن # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=‏PDF.js ورژن{{version}} ‏(ساخت: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=پیام: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=توده: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=پرونده: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=سطر: {{line}} rendering_error=هنگام بارگیری صفحه خطایی رخ داد. # Predefined zoom values page_scale_width=عرض صفحه page_scale_fit=اندازه کردن صفحه page_scale_auto=بزرگنمایی خودکار page_scale_actual=اندازه واقعی‌ # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=خطا loading_error=هنگام بارگیری پرونده PDF خطایی رخ داد. invalid_file_error=پرونده PDF نامعتبر یامعیوب می‌باشد. missing_file_error=پرونده PDF یافت نشد. unexpected_response_error=پاسخ پیش بینی نشده سرور # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Annotation] password_label=جهت باز کردن پرونده PDF گذرواژه را وارد نمائید. password_invalid=گذرواژه نامعتبر. لطفا مجددا تلاش کنید. password_ok=تأیید password_cancel=انصراف printing_not_supported=هشدار: قابلیت چاپ به‌طور کامل در این مرورگر پشتیبانی نمی‌شود. printing_not_ready=اخطار: پرونده PDF بطور کامل بارگیری نشده و امکان چاپ وجود ندارد. web_fonts_disabled=فونت های تحت وب غیر فعال شده اند: امکان استفاده از نمایش دهنده داخلی PDF وجود ندارد. document_colors_not_allowed=فایلهای PDF نمیتوانند که رنگ های خود را داشته باشند. لذا گزینه 'اجازه تغییر رنگ" در مرورگر غیر فعال شده است. manuskript-0.10.0/libs/pdf.js/web/locale/ff/000077500000000000000000000000001354442177200205225ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/ff/viewer.properties000066400000000000000000000155231354442177200241470ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Hello Ɓennungo previous_label=Ɓennuɗo next.title=Hello faango next_label=Yeeso # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Hello: page_of=e nder {{pageCount}} zoom_out.title=Lonngo Woɗɗa zoom_out_label=Lonngo Woɗɗa zoom_in.title=Lonngo Ara zoom_in_label=Lonngo Ara zoom.title=Lonngo presentation_mode.title=Faytu to Presentation Mode presentation_mode_label=Presentation Mode open_file.title=Uddit Fiilde open_file_label=Uddit print.title=Winndito print_label=Winndito download.title=Aawto download_label=Aawto bookmark.title=Jiytol gonangol (natto walla uddit e henorde) bookmark_label=Jiytol Gonangol # Secondary toolbar and context menu tools.title=Kuutorɗe tools_label=Kuutorɗe first_page.title=Yah to hello adanngo first_page.label=Yah to hello adanngo first_page_label=Yah to hello adanngo last_page.title=Yah to hello wattindiingo last_page.label=Yah to hello wattindiingo last_page_label=Yah to hello wattindiingo page_rotate_cw.title=Yiiltu Faya Ñaamo page_rotate_cw.label=Yiiltu Faya Ñaamo page_rotate_cw_label=Yiiltu Faya Ñaamo page_rotate_ccw.title=Yiiltu Faya Nano page_rotate_ccw.label=Yiiltu Faya Nano page_rotate_ccw_label=Yiiltu Faya Nano hand_tool_enable.title=Hurmin kuutorgal junngo hand_tool_enable_label=Hurmin kuutorgal junngo hand_tool_disable.title=Daaƴ kuutorgal junngo hand_tool_disable_label=Daaƴ kuutorgal junngo # Document properties dialog box document_properties.title=Keeroraaɗi Winndannde… document_properties_label=Keeroraaɗi Winndannde… document_properties_file_name=Innde fiilde: document_properties_file_size=Ɓetol fiilde: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bite) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bite) document_properties_title=Tiitoonde: document_properties_author=Binnduɗo: document_properties_subject=Toɓɓere: document_properties_keywords=Kelmekele jiytirɗe: document_properties_creation_date=Ñalnde Sosaa: document_properties_modification_date=Ñalnde Waylaa: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Cosɗo: document_properties_producer=Paggiiɗo PDF: document_properties_version=Yamre PDF: document_properties_page_count=Limoore Kelle: document_properties_close=Uddu # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Toggilo Palal Sawndo toggle_sidebar_label=Toggilo Palal Sawndo outline.title=Hollu Toɓɓe Fiilannde outline_label=Toɓɓe Fiilannde attachments.title=Hollu Ɗisanɗe attachments_label=Ɗisanɗe thumbs.title=Hollu Dooɓe thumbs_label=Dooɓe findbar.title=Yiylo e fiilannde findbar_label=Yiytu # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Hello {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Dooɓre Hello {{page}} # Find panel button title and messages find_label=Yiytu: find_previous.title=Yiylo cilol ɓennugol konngol ngol find_previous_label=Ɓennuɗo find_next.title=Yiylo cilol garowol konngol ngol find_next_label=Yeeso find_highlight=Jalbin fof find_match_case_label=Jaaɓnu darnde find_reached_top=Heɓii fuɗɗorde fiilannde, jokku faya les find_reached_bottom=Heɓii hoore fiilannde, jokku faya les find_not_found=Konngi njiyataa # Error panel labels error_more_info=Ɓeydu Humpito error_less_info=Ustu Humpito error_close=Uddu # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Ɓatakuure: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stack: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Fiilde: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Gorol: {{line}} rendering_error=Juumre waɗii tuma nde yoŋkittoo hello. # Predefined zoom values page_scale_width=Njaajeendi Hello page_scale_fit=Keƴeendi Hello page_scale_auto=Loongorde Jaajol page_scale_actual=Ɓetol Jaati # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Juumre loading_error=Juumre waɗii tuma nde loowata PDF oo. invalid_file_error=Fiilde PDF moƴƴaani walla jiibii. missing_file_error=Fiilde PDF ena ŋakki. unexpected_response_error=Jaabtol sarworde tijjinooka. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Siiftannde] password_label=Naatu finnde ngam uddite ndee fiilde PDF. password_invalid=Finnde moƴƴaani. Tiiɗno eto kadi. password_ok=OK password_cancel=Haaytu printing_not_supported=Reentino: Winnditagol tammbitaaka no feewi e ndee wanngorde. printing_not_ready=Reentino: PDF oo loowaaki haa timmi ngam winnditagol. web_fonts_disabled=Ponte geese ko daaƴaaɗe: horiima huutoraade ponte PDF coomtoraaɗe. document_colors_not_allowed=Piilanɗe PDF njamiraaka yoo kuutoro goobuuji mum'en keeriiɗi: 'Yamir kello yoo kuutoro goobuuki keeriiɗi' koko daaƴaa e wanngorde ndee. manuskript-0.10.0/libs/pdf.js/web/locale/fi/000077500000000000000000000000001354442177200205255ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/fi/viewer.properties000066400000000000000000000150421354442177200241460ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Edellinen sivu previous_label=Edellinen next.title=Seuraava sivu next_label=Seuraava # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Sivu: page_of=/ {{pageCount}} zoom_out.title=Loitonna zoom_out_label=Loitonna zoom_in.title=Lähennä zoom_in_label=Lähennä zoom.title=Suurennus presentation_mode.title=Siirry esitystilaan presentation_mode_label=Esitystila open_file.title=Avaa tiedosto open_file_label=Avaa print.title=Tulosta print_label=Tulosta download.title=Lataa download_label=Lataa bookmark.title=Avoin ikkuna (kopioi tai avaa uuteen ikkunaan) bookmark_label=Avoin ikkuna # Secondary toolbar and context menu tools.title=Tools tools_label=Tools first_page.title=Siirry ensimmäiselle sivulle first_page.label=Siirry ensimmäiselle sivulle first_page_label=Siirry ensimmäiselle sivulle last_page.title=Siirry viimeiselle sivulle last_page.label=Siirry viimeiselle sivulle last_page_label=Siirry viimeiselle sivulle page_rotate_cw.title=Kierrä oikealle page_rotate_cw.label=Kierrä oikealle page_rotate_cw_label=Kierrä oikealle page_rotate_ccw.title=Kierrä vasemmalle page_rotate_ccw.label=Kierrä vasemmalle page_rotate_ccw_label=Kierrä vasemmalle hand_tool_enable.title=Käytä käsityökalua hand_tool_enable_label=Käytä käsityökalua hand_tool_disable.title=Poista käsityökalu käytöstä hand_tool_disable_label=Poista käsityökalu käytöstä # Document properties dialog box document_properties.title=Dokumentin ominaisuudet… document_properties_label=Dokumentin ominaisuudet… document_properties_file_name=Tiedostonimi: document_properties_file_size=Tiedoston koko: document_properties_kb={{size_kb}} kt ({{size_b}} tavua) document_properties_mb={{size_mb}} Mt ({{size_b}} tavua) document_properties_title=Otsikko: document_properties_author=Tekijä: document_properties_subject=Aihe: document_properties_keywords=Avainsanat: document_properties_creation_date=Luomispäivämäärä: document_properties_modification_date=Muokkauspäivämäärä: document_properties_date_string={{date}}, {{time}} document_properties_creator=Luoja: document_properties_producer=PDF-tuottaja: document_properties_version=PDF-versio: document_properties_page_count=Sivujen määrä: document_properties_close=Sulje # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Näytä/piilota sivupaneeli toggle_sidebar_label=Näytä/piilota sivupaneeli outline.title=Näytä dokumentin rakenne outline_label=Dokumentin rakenne attachments.title=Näytä liitteet attachments_label=Liitteet thumbs.title=Näytä pienoiskuvat thumbs_label=Pienoiskuvat findbar.title=Etsi dokumentista findbar_label=Etsi # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Sivu {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Pienoiskuva sivusta {{page}} # Find panel button title and messages find_label=Etsi: find_previous.title=Etsi hakusanan edellinen osuma find_previous_label=Edellinen find_next.title=Etsi hakusanan seuraava osuma find_next_label=Seuraava find_highlight=Korosta kaikki find_match_case_label=Huomioi kirjainkoko find_reached_top=Päästiin dokumentin alkuun, jatketaan lopusta find_reached_bottom=Päästiin dokumentin loppuun, continued from top find_not_found=Hakusanaa ei löytynyt # Error panel labels error_more_info=Lisätietoja error_less_info=Lisätietoja error_close=Sulje # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (kooste: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Virheilmoitus: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Pino: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Tiedosto: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Rivi: {{line}} rendering_error=Tapahtui virhe piirrettäessä sivua. # Predefined zoom values page_scale_width=Sivun leveys page_scale_fit=Koko sivu page_scale_auto=Automaattinen suurennus page_scale_actual=Todellinen koko # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}} % # Loading indicator messages loading_error_indicator=Virhe loading_error=Tapahtui virhe ladattaessa PDF-tiedostoa. invalid_file_error=Virheellinen tai vioittunut PDF-tiedosto. missing_file_error=Puuttuva PDF-tiedosto. unexpected_response_error=Odottamaton vastaus palvelimelta. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Annotation] password_label=Kirjoita PDF-tiedoston salasana. password_invalid=Virheellinen salasana. Yritä uudestaan. password_ok=OK password_cancel=Peruuta printing_not_supported=Varoitus: Selain ei tue kaikkia tulostustapoja. printing_not_ready=Varoitus: PDF-tiedosto ei ole vielä latautunut kokonaan, eikä sitä voi vielä tulostaa. web_fonts_disabled=Verkkosivujen omat kirjasinlajit on estetty: ei voida käyttää upotettuja PDF-kirjasinlajeja. document_colors_not_allowed=PDF-dokumenttien ei ole sallittua käyttää omia värejään: Asetusta "Sivut saavat käyttää omia värejään oletusten sijaan" ei ole valittu selaimen asetuksissa. manuskript-0.10.0/libs/pdf.js/web/locale/fr/000077500000000000000000000000001354442177200205365ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/fr/viewer.properties000066400000000000000000000155551354442177200241700ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Page précédente previous_label=Précédent next.title=Page suivante next_label=Suivant # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Page : page_of=sur {{pageCount}} zoom_out.title=Zoom arrière zoom_out_label=Zoom arrière zoom_in.title=Zoom avant zoom_in_label=Zoom avant zoom.title=Zoom presentation_mode.title=Basculer en mode présentation presentation_mode_label=Mode présentation open_file.title=Ouvrir le fichier open_file_label=Ouvrir le fichier print.title=Imprimer print_label=Imprimer download.title=Télécharger download_label=Télécharger bookmark.title=Affichage courant (copier ou ouvrir dans une nouvelle fenêtre) bookmark_label=Affichage actuel # Secondary toolbar and context menu tools.title=Outils tools_label=Outils first_page.title=Aller à la première page first_page.label=Aller à la première page first_page_label=Aller à la première page last_page.title=Aller à la dernière page last_page.label=Aller à la dernière page last_page_label=Aller à la dernière page page_rotate_cw.title=Rotation horaire page_rotate_cw.label=Rotation horaire page_rotate_cw_label=Rotation horaire page_rotate_ccw.title=Rotation anti-horaire page_rotate_ccw.label=Rotation anti-horaire page_rotate_ccw_label=Rotation anti-horaire # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Afficher/Masquer le panneau latéral toggle_sidebar_label=Afficher/Masquer le panneau latéral outline.title=Afficher les signets outline_label=Signets du document attachments.title=Afficher les pièces jointes attachments_label=Pièces jointes thumbs.title=Afficher les vignettes thumbs_label=Vignettes findbar.title=Rechercher dans le document findbar_label=Rechercher # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Page {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Vignette de la page {{page}} hand_tool_enable.title=Activer l’outil main hand_tool_enable_label=Activer l’outil main hand_tool_disable.title=Désactiver l’outil main hand_tool_disable_label=Désactiver l’outil main # Document properties dialog box document_properties.title=Propriétés du document… document_properties_label=Propriétés du document… document_properties_file_name=Nom du fichier : document_properties_file_size=Taille du fichier : document_properties_kb={{size_kb}} Ko ({{size_b}} octets) document_properties_mb={{size_mb}} Mo ({{size_b}} octets) document_properties_title=Titre : document_properties_author=Auteur : document_properties_subject=Sujet : document_properties_keywords=Mots-clés : document_properties_creation_date=Date de création : document_properties_modification_date=Modifié le : document_properties_date_string={{date}} à {{time}} document_properties_creator=Créé par : document_properties_producer=Outil de conversion PDF : document_properties_version=Version PDF : document_properties_page_count=Nombre de pages : document_properties_close=Fermer # Find panel button title and messages find_label=Rechercher : find_previous.title=Trouver l’occurrence précédente de la phrase find_previous_label=Précédent find_next.title=Trouver la prochaine occurrence de la phrase find_next_label=Suivant find_highlight=Tout surligner find_match_case_label=Respecter la casse find_reached_top=Haut de la page atteint, poursuite depuis la fin find_reached_bottom=Bas de la page atteint, poursuite au début find_not_found=Phrase introuvable # Error panel labels error_more_info=Plus d’informations error_less_info=Moins d’informations error_close=Fermer # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (identifiant de compilation : {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Message : {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Pile : {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Fichier : {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Ligne : {{line}} rendering_error=Une erreur s’est produite lors de l’affichage de la page. # Predefined zoom values page_scale_width=Pleine largeur page_scale_fit=Page entière page_scale_auto=Zoom automatique page_scale_actual=Taille réelle # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}} % # Loading indicator messages loading_error_indicator=Erreur loading_error=Une erreur s’est produite lors du chargement du fichier PDF. invalid_file_error=Fichier PDF invalide ou corrompu. missing_file_error=Fichier PDF manquant. unexpected_response_error=Réponse inattendue du serveur. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Annotation {{type}}] password_label=Veuillez saisir le mot de passe pour ouvrir ce fichier PDF. password_invalid=Mot de passe incorrect. Veuillez réessayer. password_ok=OK password_cancel=Annuler printing_not_supported=Attention : l’impression n’est pas totalement prise en charge par ce navigateur. printing_not_ready=Attention : le PDF n’est pas entièrement chargé pour pouvoir l’imprimer. web_fonts_disabled=Les polices web sont désactivées : impossible d’utiliser les polices intégrées au PDF. document_colors_not_allowed=Les documents PDF ne peuvent pas utiliser leurs propres couleurs : « Autoriser les pages web à utiliser leurs propres couleurs » est désactivé dans le navigateur. manuskript-0.10.0/libs/pdf.js/web/locale/fy-NL/000077500000000000000000000000001354442177200210545ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/fy-NL/viewer.properties000066400000000000000000000160461354442177200245020ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Foarige side previous_label=Foarige next.title=Folgjende side next_label=Folgjende # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=side: page_of=fan {{pageCount}} zoom_out.title=Utzoome zoom_out_label=Utzoome zoom_in.title=Ynzoome zoom_in_label=Ynzoome zoom.title=Zoome print.title=Ofdrukke print_label=Ofdrukke presentation_mode.title=Wikselje nei presintaasjemoadus presentation_mode_label=Presintaasjemoadus open_file.title=Bestân iepenje open_file_label=Iepenje download.title=Ynlade download_label=Ynlade bookmark.title=Aktuele finster (kopiearje of iepenje yn nij finster) bookmark_label=Aktuele finster # Secondary toolbar and context menu tools.title=Ark tools_label=Ark first_page.title=Gean nei earste side first_page.label=Gean nei earste side first_page_label=Gean nei earste side last_page.title=Gean nei lêste side last_page.label=Gean nei lêste side last_page_label=Gean nei lêste side page_rotate_cw.title=Rjochtsom draaie page_rotate_cw.label=Rjochtsom draaie page_rotate_cw_label=Rjochtsom draaie page_rotate_ccw.title=Linksom draaie page_rotate_ccw.label=Linksom draaie page_rotate_ccw_label=Linksom draaie hand_tool_enable.title=Hânark ynskeakelje hand_tool_enable_label=Hânark ynskeakelje hand_tool_disable.title=Hânark úyskeakelje hand_tool_disable_label=Hânark úyskeakelje # Document properties dialog box document_properties.title=Dokuminteigenskippen… document_properties_label=Dokuminteigenskippen… document_properties_file_name=Bestânsnamme: document_properties_file_size=Bestânsgrutte: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=Titel: document_properties_author=Auteur: document_properties_subject=Underwerp: document_properties_keywords=Kaaiwurden: document_properties_creation_date=Oanmaakdatum: document_properties_modification_date=Bewurkingsdatum: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Makker: document_properties_producer=PDF-makker: document_properties_version=PDF-ferzje: document_properties_page_count=Siden: document_properties_close=Slute # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Sidebalke yn-/útskeakelje toggle_sidebar_label=Sidebalke yn-/útskeakelje outline.title=Dokumint ynhâldsopjefte toane outline_label=Dokumint ynhâldsopjefte attachments.title=Bylagen toane attachments_label=Bylagen thumbs.title=Foarbylden toane thumbs_label=Foarbylden findbar.title=Sykje yn dokumint findbar_label=Sykje # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Side {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Foarbyld fan side {{page}} # Context menu first_page.label=Nei earste side gean last_page.label=Nei lêste side gean page_rotate_cw.label=Rjochtsom draaie page_rotate_ccw.label=Linksom draaie # Find panel button title and messages find_label=Sykje: find_previous.title=It foarige foarkommen fan de tekst sykje find_previous_label=Foarige find_next.title=It folgjende foarkommen fan de tekst sykje find_next_label=Folgjende find_highlight=Alles markearje find_match_case_label=Haadlettergefoelich find_reached_top=Boppekant fan dokumint berikt, trochgien fanôf ûnder find_reached_bottom=Ein fan dokumint berikt, trochgien fanôf boppe find_not_found=Tekst net fûn # Error panel labels error_more_info=Mear ynformaasje error_less_info=Minder ynformaasje error_close=Slute # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js f{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Berjocht: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stack: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Bestân: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Rigel: {{line}} rendering_error=Der is in flater bard by it renderjen fan de side. # Predefined zoom values page_scale_width=Sidebreedte page_scale_fit=Hiele side page_scale_auto=Automatysk zoome page_scale_actual=Wurklike grutte # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Flater loading_error=Der is in flater bard by it laden fan de PDF. invalid_file_error=Ynfalide of korruptearre PDF-bestân. missing_file_error=PDF-bestân ûntbrekt. unexpected_response_error=Unferwacht tsjinnerantwurd. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}}-annotaasje] password_label=Jou it wachtwurd om dit PDF-bestân te iepenjen. password_invalid=Ferkeard wachtwurd. Probearje opnij. password_ok=OK password_cancel=Annulearje printing_not_supported=Warning: Printen is net folslein stipe troch dizze browser. printing_not_ready=Warning: PDF is net folslein laden om ôf te drukken. web_fonts_disabled=Weblettertypen binne útskeakele: gebrûk fan ynsluten PDF-lettertypen is net mooglik. document_colors_not_allowed=PDF-dokuminten meie harren eigen kleuren net brûike: ‘Siden tastean om harren eigen kleuren te kiezen’ is útskeakele yn de browser. manuskript-0.10.0/libs/pdf.js/web/locale/ga-IE/000077500000000000000000000000001354442177200210115ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/ga-IE/viewer.properties000066400000000000000000000164601354442177200244370ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=An Leathanach Roimhe Seo previous_label=Roimhe Seo next.title=An Chéad Leathanach Eile next_label=Ar Aghaidh # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Leathanach: page_of=as {{pageCount}} zoom_out.title=Súmáil Amach zoom_out_label=Súmáil Amach zoom_in.title=Súmáil Isteach zoom_in_label=Súmáil Isteach zoom.title=Súmáil presentation_mode.title=Úsáid an Mód Láithreoireachta presentation_mode_label=Mód Láithreoireachta open_file.title=Oscail Comhad open_file_label=Oscail print.title=Priontáil print_label=Priontáil download.title=Íosluchtaigh download_label=Íosluchtaigh bookmark.title=An t-amharc reatha (cóipeáil nó oscail i bhfuinneog nua) bookmark_label=An tAmharc Reatha # Secondary toolbar and context menu tools.title=Uirlisí tools_label=Uirlisí first_page.title=Go dtí an chéad leathanach first_page.label=Go dtí an chéad leathanach first_page_label=Go dtí an chéad leathanach last_page.title=Go dtí an leathanach deiridh last_page.label=Go dtí an leathanach deiridh last_page_label=Go dtí an leathanach deiridh page_rotate_cw.title=Rothlaigh ar deiseal page_rotate_cw.label=Rothlaigh ar deiseal page_rotate_cw_label=Rothlaigh ar deiseal page_rotate_ccw.title=Rothlaigh ar tuathal page_rotate_ccw.label=Rothlaigh ar tuathal page_rotate_ccw_label=Rothlaigh ar tuathal hand_tool_enable.title=Cumasaigh uirlis láimhe hand_tool_enable_label=Cumasaigh uirlis láimhe hand_tool_disable.title=Díchumasaigh uirlis láimhe hand_tool_disable_label=Díchumasaigh uirlis láimhe # Document properties dialog box document_properties.title=Airíonna na Cáipéise… document_properties_label=Airíonna na Cáipéise… document_properties_file_name=Ainm an chomhaid: document_properties_file_size=Méid an chomhaid: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} kB ({{size_b}} beart) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} beart) document_properties_title=Teideal: document_properties_author=Údar: document_properties_subject=Ábhar: document_properties_keywords=Eochairfhocail: document_properties_creation_date=Dáta Cruthaithe: document_properties_modification_date=Dáta Athraithe: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Cruthaitheoir: document_properties_producer=Cruthaitheoir an PDF: document_properties_version=Leagan PDF: document_properties_page_count=Líon Leathanach: document_properties_close=Dún # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Scoránaigh an Barra Taoibh toggle_sidebar_label=Scoránaigh an Barra Taoibh outline.title=Taispeáin Creatlach na Cáipéise outline_label=Creatlach na Cáipéise attachments.title=Taispeáin Iatáin attachments_label=Iatáin thumbs.title=Taispeáin Mionsamhlacha thumbs_label=Mionsamhlacha findbar.title=Aimsigh sa Cháipéis findbar_label=Aimsigh # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Leathanach {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Mionsamhail Leathanaigh {{page}} # Find panel button title and messages find_label=Aimsigh: find_previous.title=Aimsigh an sampla roimhe seo den nath seo find_previous_label=Roimhe seo find_next.title=Aimsigh an chéad sampla eile den nath sin find_next_label=Ar aghaidh find_highlight=Aibhsigh uile find_match_case_label=Cásíogair find_reached_top=Ag barr na cáipéise, ag leanúint ón mbun find_reached_bottom=Ag bun na cáipéise, ag leanúint ón mbarr find_not_found=Abairtín gan aimsiú # Error panel labels error_more_info=Tuilleadh Eolais error_less_info=Níos Lú Eolais error_close=Dún # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Teachtaireacht: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Cruach: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Comhad: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Líne: {{line}} rendering_error=Tharla earráid agus an leathanach á leagan amach. # Predefined zoom values page_scale_width=Leithead Leathanaigh page_scale_fit=Laghdaigh go dtí an Leathanach page_scale_auto=Súmáil Uathoibríoch page_scale_actual=Fíormhéid # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Earráid loading_error=Tharla earráid agus an cháipéis PDF á luchtú. invalid_file_error=Comhad neamhbhailí nó truaillithe PDF. missing_file_error=Comhad PDF ar iarraidh. unexpected_response_error=Freagra ón bhfreastalaí gan súil leis. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Anótáil {{type}}] password_label=Cuir an focal faire isteach chun an comhad PDF seo a oscailt. password_invalid=Focal faire mícheart. Déan iarracht eile. password_ok=OK password_cancel=Cealaigh printing_not_supported=Rabhadh: Ní thacaíonn an brabhsálaí le priontáil go hiomlán. printing_not_ready=Rabhadh: Ní féidir an PDF a phriontáil go dtí go mbeidh an cháipéis iomlán luchtaithe. web_fonts_disabled=Tá clófhoirne Gréasáin díchumasaithe: ní féidir clófhoirne leabaithe PDF a úsáid. document_colors_not_allowed=Níl cead ag cáipéisí PDF a ndathanna féin a roghnú; tá 'Tabhair cead do leathanaigh a ndathanna féin a roghnú' díchumasaithe sa mbrabhsálaí. manuskript-0.10.0/libs/pdf.js/web/locale/gd/000077500000000000000000000000001354442177200205215ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/gd/viewer.properties000066400000000000000000000166431354442177200241520ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=An duilleag roimhe previous_label=Air ais next.title=An ath-dhuilleag next_label=Air adhart # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Duilleag: page_of=à {{pageCount}} zoom_out.title=Sùm a-mach zoom_out_label=Sùm a-mach zoom_in.title=Sùm a-steach zoom_in_label=Sùm a-steach zoom.title=Sùm presentation_mode.title=Gearr leum dhan mhodh taisbeanaidh presentation_mode_label=Am modh taisbeanaidh open_file.title=Fosgail faidhle open_file_label=Fosgail print.title=Clò-bhuail print_label=Clò-bhuail download.title=Luchdaich a-nuas download_label=Luchdaich a-nuas bookmark.title=An sealladh làithreach (dèan lethbhreac no fosgail e ann an uinneag ùr) bookmark_label=An sealladh làithreach # Secondary toolbar and context menu tools.title=Innealan tools_label=Innealan first_page.title=Rach gun chiad duilleag first_page.label=Rach gun chiad duilleag first_page_label=Rach gun chiad duilleag last_page.title=Rach gun duilleag mu dheireadh last_page.label=Rach gun duilleag mu dheireadh last_page_label=Rach gun duilleag mu dheireadh page_rotate_cw.title=Cuairtich gu deiseil page_rotate_cw.label=Cuairtich gu deiseil page_rotate_cw_label=Cuairtich gu deiseil page_rotate_ccw.title=Cuairtich gu tuathail page_rotate_ccw.label=Cuairtich gu tuathail page_rotate_ccw_label=Cuairtich gu tuathail hand_tool_enable.title=Cuir inneal na làimhe an comas hand_tool_enable_label=Cuir inneal na làimhe an comas hand_tool_disable.title=Cuir inneal na làimhe à comas hand_tool_disable_label=Cuir à comas inneal na làimhe # Document properties dialog box document_properties.title=Roghainnean na sgrìobhainne… document_properties_label=Roghainnean na sgrìobhainne… document_properties_file_name=Ainm an fhaidhle: document_properties_file_size=Meud an fhaidhle: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=Tiotal: document_properties_author=Ùghdar: document_properties_subject=Cuspair: document_properties_keywords=Faclan-luirg: document_properties_creation_date=Latha a chruthachaidh: document_properties_modification_date=Latha atharrachaidh: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Cruthadair: document_properties_producer=Saothraiche a' PDF: document_properties_version=Tionndadh a' PDF: document_properties_page_count=Àireamh de dhuilleagan: document_properties_close=Dùin # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Toglaich am bàr-taoibh toggle_sidebar_label=Toglaich am bàr-taoibh outline.title=Seall an sgrìobhainn far loidhne outline_label=Oir-loidhne na sgrìobhainne attachments.title=Seall na ceanglachain attachments_label=Ceanglachain thumbs.title=Seall na dealbhagan thumbs_label=Dealbhagan findbar.title=Lorg san sgrìobhainn findbar_label=Lorg # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Duilleag a {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Dealbhag duilleag a {{page}} # Find panel button title and messages find_label=Lorg: find_previous.title=Lorg làthair roimhe na h-abairt seo find_previous_label=Air ais find_next.title=Lorg ath-làthair na h-abairt seo find_next_label=Air adhart find_highlight=Soillsich a h-uile find_match_case_label=Aire do litrichean mòra is beaga find_reached_top=Ràinig sinn barr na duilleige, a' leantainn air adhart o bhonn na duilleige find_reached_bottom=Ràinig sinn bonn na duilleige, a' leantainn air adhart o bharr na duilleige find_not_found=Cha deach an abairt a lorg # Error panel labels error_more_info=Barrachd fiosrachaidh error_less_info=Nas lugha de dh'fhiosrachadh error_close=Dùin # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Teachdaireachd: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stac: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Faidhle: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Loidhne: {{line}} rendering_error=Thachair mearachd rè reandaradh na duilleige. # Predefined zoom values page_scale_width=Leud na duilleige page_scale_fit=Freagair ri meud na duilleige page_scale_auto=Sùm fèin-obrachail page_scale_actual=Am fìor-mheud # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Mearachd loading_error=Thachair mearachd rè luchdadh a' PDF. invalid_file_error=Faidhle PDF a tha mì-dhligheach no coirbte. missing_file_error=Faidhle PDF a tha a dhìth. unexpected_response_error=Freagairt on fhrithealaiche ris nach robh dùil. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Nòtachadh {{type}}] password_label=Cuir a-steach am facal-faire gus am faidhle PDF seo fhosgladh. password_invalid=Tha am facal-faire cearr. Nach fheuch thu ris a-rithist? password_ok=Ceart ma-tha password_cancel=Sguir dheth printing_not_supported=Rabhadh: Chan eil am brabhsair seo a' cur làn-taic ri clò-bhualadh. printing_not_ready=Rabhadh: Cha deach am PDF a luchdadh gu tur airson clò-bhualadh. web_fonts_disabled=Tha cruthan-clò lìn à comas: Chan urrainn dhuinn cruthan-clò PDF leabaichte a chleachdadh. document_colors_not_allowed=Chan fhaod sgrìobhainnean PDF na dathan aca fhèin a chleachdadh: Tha "Leig le duilleagan na dathan aca fhèin a chleachdadh" à comas sa bhrabhsair. manuskript-0.10.0/libs/pdf.js/web/locale/gl/000077500000000000000000000000001354442177200205315ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/gl/viewer.properties000066400000000000000000000163471354442177200241630ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Páxina anterior previous_label=Anterior next.title=Seguinte páxina next_label=Seguinte # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Páxina: page_of=de {{pageCount}} zoom_out.title=Reducir zoom_out_label=Reducir zoom_in.title=Ampliar zoom_in_label=Ampliar zoom.title=Zoom presentation_mode.title=Cambiar ao modo presentación presentation_mode_label=Modo presentación open_file.title=Abrir ficheiro open_file_label=Abrir print.title=Imprimir print_label=Imprimir download.title=Descargar download_label=Descargar bookmark.title=Vista actual (copiar ou abrir nunha nova xanela) bookmark_label=Vista actual # Secondary toolbar and context menu tools.title=Ferramentas tools_label=Ferramentas first_page.title=Ir á primeira páxina first_page.label=Ir á primeira páxina first_page_label=Ir á primeira páxina last_page.title=Ir á última páxina last_page.label=Ir á última páxina last_page_label=Ir á última páxina page_rotate_cw.title=Rotar no sentido das agullas do reloxo page_rotate_cw.label=Rotar no sentido das agullas do reloxo page_rotate_cw_label=Rotar no sentido das agullas do reloxo page_rotate_ccw.title=Rotar no sentido contrario ás agullas do reloxo page_rotate_ccw.label=Rotar no sentido contrario ás agullas do reloxo page_rotate_ccw_label=Rotar no sentido contrario ás agullas do reloxo hand_tool_enable.title=Activar ferramenta man hand_tool_enable_label=Activar ferramenta man hand_tool_disable.title=Desactivar ferramenta man hand_tool_disable_label=Desactivar ferramenta man # Document properties dialog box document_properties.title=Propiedades do documento… document_properties_label=Propiedades do documento… document_properties_file_name=Nome do ficheiro: document_properties_file_size=Tamaño do ficheiro: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=Título: document_properties_author=Autor: document_properties_subject=Asunto: document_properties_keywords=Palabras clave: document_properties_creation_date=Data de creación: document_properties_modification_date=Data de modificación: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Creado por: document_properties_producer=Xenerador do PDF: document_properties_version=Versión de PDF: document_properties_page_count=Número de páxinas: document_properties_close=Pechar # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Amosar/agochar a barra lateral toggle_sidebar_label=Amosar/agochar a barra lateral outline.title=Amosar esquema do documento outline_label=Esquema do documento attachments.title=Amosar anexos attachments_label=Anexos thumbs.title=Amosar miniaturas thumbs_label=Miniaturas findbar.title=Atopar no documento findbar_label=Atopar # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Páxina {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Miniatura da páxina {{page}} # Find panel button title and messages find_label=Atopar: find_previous.title=Atopar a anterior aparición da frase find_previous_label=Anterior find_next.title=Atopar a seguinte aparición da frase find_next_label=Seguinte find_highlight=Realzar todo find_match_case_label=Diferenciar maiúsculas de minúsculas find_reached_top=Chegouse ao inicio do documento, continuar desde o final find_reached_bottom=Chegouse ao final do documento, continuar desde o inicio find_not_found=Non se atopou a frase # Error panel labels error_more_info=Máis información error_less_info=Menos información error_close=Pechar # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (Identificador da compilación: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Mensaxe: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Pila: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Ficheiro: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Liña: {{line}} rendering_error=Produciuse un erro ao representar a páxina. # Predefined zoom values page_scale_width=Largura da páxina page_scale_fit=Axuste de páxina page_scale_auto=Zoom automático page_scale_actual=Tamaño actual # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Erro loading_error=Produciuse un erro ao cargar o PDF. invalid_file_error=Ficheiro PDF danado ou incorrecto. missing_file_error=Falta o ficheiro PDF. unexpected_response_error=Resposta inesperada do servidor. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Anotación {{type}}] password_label=Escriba o contrasinal para abrir este ficheiro PDF. password_invalid=Contrasinal incorrecto. Tente de novo. password_ok=Aceptar password_cancel=Cancelar printing_not_supported=Aviso: A impresión non é compatíbel de todo con este navegador. printing_not_ready=Aviso: O PDF non se cargou completamente para imprimirse. web_fonts_disabled=Desactiváronse as fontes web: foi imposíbel usar as fontes incrustadas no PDF. document_colors_disabled=Non se permite que os documentos PDF usen as súas propias cores: «Permitir que as páxinas escollan as súas propias cores» está desactivado no navegador. manuskript-0.10.0/libs/pdf.js/web/locale/gu-IN/000077500000000000000000000000001354442177200210465ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/gu-IN/viewer.properties000066400000000000000000000226411354442177200244720ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=પહેલાનુ પાનું previous_label=પહેલાનુ next.title=આગળનુ પાનું next_label=આગળનું # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=પાનું: page_of={{pageCount}} નું zoom_out.title=મોટુ કરો zoom_out_label=મોટુ કરો zoom_in.title=નાનું કરો zoom_in_label=નાનું કરો zoom.title=નાનું મોટુ કરો presentation_mode.title=રજૂઆત સ્થિતિમાં જાવ presentation_mode_label=રજૂઆત સ્થિતિ open_file.title=ફાઇલ ખોલો open_file_label=ખોલો print.title=છાપો print_label=છારો download.title=ડાઉનલોડ download_label=ડાઉનલોડ bookmark.title=વર્તમાન દૃશ્ય (નવી વિન્ડોમાં નકલ કરો અથવા ખોલો) bookmark_label=વર્તમાન દૃશ્ય # Secondary toolbar and context menu tools.title=સાધનો tools_label=સાધનો first_page.label=પહેલાં પાનામાં જાવ first_page_label=પ્રથમ પાનાં પર જાવ last_page.label=છેલ્લા પાનામાં જાવ last_page_label=છેલ્લા પાનાં પર જાવ page_rotate_cw.label=ઘડિયાળનાં કાંટાની જેમ ફેરવો page_rotate_cw_label=ઘડિયાળનાં કાંટા તરફ ફેરવો page_rotate_ccw.label=ઘડિયાળનાં કાંટાની ઉલટી દિશામાં ફેરવો page_rotate_ccw_label=ઘડિયાળનાં કાંટાની વિરુદ્દ ફેરવો hand_tool_enable.title=હાથનાં સાધનને સક્રિય કરો hand_tool_enable_label=હાથનાં સાધનને સક્રિય કરો hand_tool_disable.title=હાથનાં સાધનને નિષ્ક્રિય કરો hand_tool_disable_label=હાથનાં સાધનને નિષ્ક્રિય કરો # Document properties dialog box document_properties.title=દસ્તાવેજ ગુણધર્મો… document_properties_label=દસ્તાવેજ ગુણધર્મો… document_properties_file_name=ફાઇલ નામ: document_properties_file_size=ફાઇલ માપ: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} બાઇટ) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} બાઇટ) document_properties_title=શીર્ષક: document_properties_author=લેખક: document_properties_subject=વિષય: document_properties_keywords=કિવર્ડ: document_properties_creation_date=નિર્માણ તારીખ: document_properties_modification_date=ફેરફાર તારીખ: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=નિર્માતા: document_properties_producer=PDF નિર્માતા: document_properties_version=PDF આવૃત્તિ: document_properties_page_count=પાનાં ગણતરી: document_properties_close=બંધ કરો # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=ટૉગલ બાજુપટ્ટી toggle_sidebar_label=ટૉગલ બાજુપટ્ટી outline.title=દસ્તાવેજ રૂપરેખા બતાવો outline_label=દસ્તાવેજ રૂપરેખા attachments.title=જોડાણોને બતાવો attachments_label=જોડાણો thumbs.title=થંબનેલ્સ બતાવો thumbs_label=થંબનેલ્સ findbar.title=દસ્તાવેજમાં શોધો findbar_label=શોધો # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=પાનું {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=પાનાં {{page}} નું થંબનેલ્સ # Find panel button title and messages find_label=શોધો: find_previous.title=શબ્દસમૂહની પાછલી ઘટનાને શોધો find_previous_label=પહેલાંનુ find_next.title=શબ્દસમૂહની આગળની ઘટનાને શોધો find_next_label=આગળનું find_highlight=બધુ પ્રકાશિત કરો find_match_case_label=કેસ બંધબેસાડો find_reached_top=દસ્તાવેજનાં ટોચે પહોંચી ગયા, તળિયેથી ચાલુ કરેલ હતુ find_reached_bottom=દસ્તાવેજનાં અંતે પહોંચી ગયા, ઉપરથી ચાલુ કરેલ હતુ find_not_found=શબ્દસમૂહ મળ્યુ નથી # Error panel labels error_more_info=વધારે જાણકારી error_less_info=ઓછી જાણકારી error_close=બંધ કરો # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=સંદેશો: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=સ્ટેક: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=ફાઇલ: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=વાક્ય: {{line}} rendering_error=ભૂલ ઉદ્ભવી જ્યારે પાનાંનુ રેન્ડ કરી રહ્યા હોય. # Predefined zoom values page_scale_width=પાનાની પહોળાઇ page_scale_fit=પાનું બંધબેસતુ page_scale_auto=આપમેળે નાનુંમોટુ કરો page_scale_actual=ચોક્કસ માપ # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. # Loading indicator messages loading_error_indicator=ભૂલ loading_error=ભૂલ ઉદ્ભવી જ્યારે PDF ને લાવી રહ્યા હોય. invalid_file_error=અયોગ્ય અથવા ભાંગેલ PDF ફાઇલ. missing_file_error=ગુમ થયેલ PDF ફાઇલ. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Annotation] password_label=આ PDF ફાઇલને ખોલવા પાસવર્ડને દાખલ કરો. password_invalid=અયોગ્ય પાસવર્ડ. મહેરબાની કરીને ફરી પ્રયત્ન કરો. password_ok=બરાબર password_cancel=રદ કરો printing_not_supported=ચેતવણી: છાપવાનું આ બ્રાઉઝર દ્દારા સંપૂર્ણપણે આધારભૂત નથી. printing_not_ready=Warning: PDF એ છાપવા માટે સંપૂર્ણપણે લાવેલ છે. web_fonts_disabled=વેબ ફોન્ટ નિષ્ક્રિય થયેલ છે: ઍમ્બેડ થયેલ PDF ફોન્ટને વાપરવાનું અસમર્થ. document_colors_not_allowed=PDF દસ્તાવેજો તેનાં પોતાના રંગોને વાપરવા પરવાનગી આપતા નથી: 'તેનાં પોતાનાં રંગોને પસંદ કરવા માટે પાનાંને પરવાનગી આપો' બ્રાઉઝરમાં નિષ્ક્રિય થયેલ છે. manuskript-0.10.0/libs/pdf.js/web/locale/he/000077500000000000000000000000001354442177200205235ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/he/viewer.properties000066400000000000000000000171431354442177200241500ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=דף קודם previous_label=קודם next.title=דף הבא next_label=הבא # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=עמוד: page_of=מתוך {{pageCount}} zoom_out.title=התרחקות zoom_out_label=התרחקות zoom_in.title=התקרבות zoom_in_label=התקרבות zoom.title=מרחק מתצוגה presentation_mode.title=מעבר למצב מצגת presentation_mode_label=מצב מצגת open_file.title=פתיחת קובץ open_file_label=פתיחה print.title=הדפסה print_label=הדפסה download.title=הורדה download_label=הורדה bookmark.title=תצוגה נוכחית (העתקה או פתיחה בחלון חדש) bookmark_label=תצוגה נוכחית # Secondary toolbar and context menu tools.title=כלים tools_label=כלים first_page.title=מעבר לעמוד הראשון first_page.label=מעבר לעמוד הראשון first_page_label=מעבר לעמוד הראשון last_page.title=מעבר לעמוד האחרון last_page.label=מעבר לעמוד האחרון last_page_label=מעבר לעמוד האחרון page_rotate_cw.title=הטיה עם כיוון השעון page_rotate_cw.label=הטיה עם כיוון השעון page_rotate_cw_label=הטיה עם כיוון השעון page_rotate_ccw.title=הטיה כנגד כיוון השעון page_rotate_ccw.label=הטיה כנגד כיוון השעון page_rotate_ccw_label=הטיה כנגד כיוון השעון hand_tool_enable.title=הפעלת כלי היד hand_tool_enable_label=הפעלת כלי היד hand_tool_disable.title=נטרול כלי היד hand_tool_disable_label=נטרול כלי היד # Document properties dialog box document_properties.title=מאפייני מסמך… document_properties_label=מאפייני מסמך… document_properties_file_name=שם קובץ: document_properties_file_size=גודל הקובץ: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} ק״ב ({{size_b}} בתים) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} מ״ב ({{size_b}} בתים) document_properties_title=כותרת: document_properties_author=מחבר: document_properties_subject=נושא: document_properties_keywords=מילות מפתח: document_properties_creation_date=תאריך יצירה: document_properties_modification_date=תאריך שינוי: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=יוצר: document_properties_producer=יצרן PDF: document_properties_version=גרסת PDF: document_properties_page_count=מספר דפים: document_properties_close=סגירה # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=הצגה/הסתרה של סרגל הצד toggle_sidebar_label=הצגה/הסתרה של סרגל הצד outline.title=הצגת מתאר מסמך outline_label=מתאר מסמך attachments.title=הצגת צרופות attachments_label=צרופות thumbs.title=הצגת תצוגה מקדימה thumbs_label=תצוגה מקדימה findbar.title=חיפוש במסמך findbar_label=חיפוש # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=עמוד {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=תצוגה מקדימה של עמוד {{page}} # Find panel button title and messages find_label=חיפוש: find_previous.title=חיפוש מופע קודם של הביטוי find_previous_label=קודם find_next.title=חיפוש המופע הבא של הביטוי find_next_label=הבא find_highlight=הדגשת הכול find_match_case_label=התאמת אותיות find_reached_top=הגיע לראש הדף, ממשיך מלמטה find_reached_bottom=הגיע לסוף הדף, ממשיך מלמעלה find_not_found=ביטוי לא נמצא # Error panel labels error_more_info=מידע נוסף error_less_info=פחות מידע error_close=סגירה # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js גרסה {{version}} (בנייה: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=הודעה: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=תוכן מחסנית: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=קובץ: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=שורה: {{line}} rendering_error=אירעה שגיאה בעת עיבוד הדף. # Predefined zoom values page_scale_width=רוחב העמוד page_scale_fit=התאמה לעמוד page_scale_auto=מרחק מתצוגה אוטומטי page_scale_actual=גודל אמתי # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=שגיאה loading_error=אירעה שגיאה בעת טעינת ה־PDF. invalid_file_error=קובץ PDF פגום או לא תקין. missing_file_error=קובץ PDF חסר. unexpected_response_error=תגובת שרת לא צפויה. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[הערת {{type}}] password_label=נא להכניס את הססמה לפתיחת קובץ PDF זה. password_invalid=ססמה שגויה. נא לנסות שנית. password_ok=אישור password_cancel=ביטול printing_not_supported=אזהרה: הדפסה אינה נתמכת במלואה בדפדפן זה. printing_not_ready=אזהרה: ה־PDF לא ניתן לחלוטין עד מצב שמאפשר הדפסה. web_fonts_disabled=גופני רשת מנוטרלים: לא ניתן להשתמש בגופני PDF מוטבעים. document_colors_disabled=מסמכי PDF לא יכולים להשתמש בצבעים משלהם: האפשרות \\'לאפשר לעמודים לבחור צבעים משלהם\\' אינה פעילה בדפדפן. manuskript-0.10.0/libs/pdf.js/web/locale/hi-IN/000077500000000000000000000000001354442177200210335ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/hi-IN/viewer.properties000066400000000000000000000236261354442177200244630ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=पिछला पृष्ठ previous_label=पिछला next.title=अगला पृष्ठ next_label=आगे # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=पृष्ठ: page_of={{pageCount}} का zoom_out.title=\u0020छोटा करें zoom_out_label=\u0020छोटा करें zoom_in.title=बड़ा करें zoom_in_label=बड़ा करें zoom.title=बड़ा-छोटा करें presentation_mode.title=प्रस्तुति अवस्था में जाएँ presentation_mode_label=\u0020प्रस्तुति अवस्था open_file.title=फ़ाइल खोलें open_file_label=\u0020खोलें print.title=छापें print_label=\u0020छापें download.title=डाउनलोड download_label=डाउनलोड bookmark.title=मौजूदा दृश्य (नए विंडो में नक़ल लें या खोलें) bookmark_label=\u0020मौजूदा दृश्य # Secondary toolbar and context menu tools.title=औज़ार tools_label=औज़ार first_page.title=प्रथम पृष्ठ पर जाएँ first_page.label=\u0020प्रथम पृष्ठ पर जाएँ first_page_label=प्रथम पृष्ठ पर जाएँ last_page.title=अंतिम पृष्ठ पर जाएँ last_page.label=\u0020अंतिम पृष्ठ पर जाएँ last_page_label=\u0020अंतिम पृष्ठ पर जाएँ page_rotate_cw.title=घड़ी की दिशा में घुमाएँ page_rotate_cw.label=घड़ी की दिशा में घुमाएँ page_rotate_cw_label=घड़ी की दिशा में घुमाएँ page_rotate_ccw.title=घड़ी की दिशा से उल्टा घुमाएँ page_rotate_ccw.label=घड़ी की दिशा से उल्टा घुमाएँ page_rotate_ccw_label=\u0020घड़ी की दिशा से उल्टा घुमाएँ hand_tool_enable.title=हाथ औजार सक्रिय करें hand_tool_enable_label=हाथ औजार सक्रिय करें hand_tool_disable.title=हाथ औजार निष्क्रिय करना hand_tool_disable_label=हाथ औजार निष्क्रिय करना # Document properties dialog box document_properties.title=दस्तावेज़ विशेषता... document_properties_label=दस्तावेज़ विशेषता... document_properties_file_name=फ़ाइल नाम: document_properties_file_size=फाइल आकारः # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} बाइट) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} बाइट) document_properties_title=शीर्षक: document_properties_author=लेखकः document_properties_subject=विषय: document_properties_keywords=कुंजी-शब्द: document_properties_creation_date=निर्माण दिनांक: document_properties_modification_date=संशोधन दिनांक: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=निर्माता: document_properties_producer=PDF उत्पादक: document_properties_version=PDF संस्करण: document_properties_page_count=पृष्ठ गिनती: document_properties_close=बंद करें # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=\u0020स्लाइडर टॉगल करें toggle_sidebar_label=स्लाइडर टॉगल करें outline.title=\u0020दस्तावेज़ आउटलाइन दिखाएँ outline_label=दस्तावेज़ आउटलाइन attachments.title=संलग्नक दिखायें attachments_label=संलग्नक thumbs.title=लघुछवियाँ दिखाएँ thumbs_label=लघु छवि findbar.title=\u0020दस्तावेज़ में ढूँढ़ें findbar_label=ढूँढ़ें # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=पृष्ठ {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=पृष्ठ {{page}} की लघु-छवि # Find panel button title and messages find_label=ढूंढें: find_previous.title=वाक्यांश की पिछली उपस्थिति ढूँढ़ें find_previous_label=पिछला find_next.title=वाक्यांश की अगली उपस्थिति ढूँढ़ें find_next_label=आगे find_highlight=\u0020सभी आलोकित करें find_match_case_label=मिलान स्थिति find_reached_top=पृष्ठ के ऊपर पहुंच गया, नीचे से जारी रखें find_reached_bottom=पृष्ठ के नीचे में जा पहुँचा, ऊपर से जारी find_not_found=वाक्यांश नहीं मिला # Error panel labels error_more_info=अधिक सूचना error_less_info=कम सूचना error_close=बंद करें # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=\u0020संदेश: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=स्टैक: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=फ़ाइल: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=पंक्ति: {{line}} rendering_error=पृष्ठ रेंडरिंग के दौरान त्रुटि आई. # Predefined zoom values page_scale_width=\u0020पृष्ठ चौड़ाई page_scale_fit=पृष्ठ फिट page_scale_auto=स्वचालित जूम page_scale_actual=वास्तविक आकार # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=त्रुटि loading_error=पीडीएफ लोड करते समय एक त्रुटि हुई. invalid_file_error=अमान्य या भ्रष्ट PDF फ़ाइल. missing_file_error=\u0020अनुपस्थित PDF फ़ाइल. unexpected_response_error=अप्रत्याशित सर्वर प्रतिक्रिया. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=\u0020[{{type}} Annotation] password_label=इस पीडीएफ फ़ाइल को खोलने के लिए कृपया कूटशब्द भरें. password_invalid=अवैध कूटशब्द, कृपया फिर कोशिश करें. password_ok=ठीक password_cancel=रद्द करें printing_not_supported=चेतावनी: इस ब्राउज़र पर छपाई पूरी तरह से समर्थित नहीं है. printing_not_ready=\u0020चेतावनी: पीडीएफ छपाई के लिए पूरी तरह से लोड नहीं है. web_fonts_disabled=वेब फॉन्ट्स निष्क्रिय हैं: अंतःस्थापित PDF फॉन्टस के उपयोग में असमर्थ. document_colors_not_allowed=PDF दस्तावेज़ उनके अपने रंग को उपयोग करने के लिए अनुमति प्राप्त नहीं है: 'पृष्ठों को उनके अपने रंग को चुनने के लिए स्वीकृति दें कि वह उस ब्राउज़र में निष्क्रिय है. manuskript-0.10.0/libs/pdf.js/web/locale/hr/000077500000000000000000000000001354442177200205405ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/hr/viewer.properties000066400000000000000000000161231354442177200241620ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Prethodna stranica previous_label=Prethodna next.title=Sljedeća stranica next_label=Sljedeća # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Stranica: page_of=od {{pageCount}} zoom_out.title=Uvećaj zoom_out_label=Smanji zoom_in.title=Uvećaj zoom_in_label=Smanji zoom.title=Uvećanje presentation_mode.title=Prebaci u prezentacijski način rada presentation_mode_label=Prezentacijski način rada open_file.title=Otvori datoteku open_file_label=Otvori print.title=Ispis print_label=Ispis download.title=Preuzmi download_label=Preuzmi bookmark.title=Trenutni prikaz (kopiraj ili otvori u novom prozoru) bookmark_label=Trenutni prikaz # Secondary toolbar and context menu tools.title=Alati tools_label=Alati first_page.title=Idi na prvu stranicu first_page.label=Idi na prvu stranicu first_page_label=Idi na prvu stranicu last_page.title=Idi na posljednju stranicu last_page.label=Idi na posljednju stranicu last_page_label=Idi na posljednju stranicu page_rotate_cw.title=Rotiraj u smjeru kazaljke na satu page_rotate_cw.label=Rotiraj u smjeru kazaljke na satu page_rotate_cw_label=Rotiraj u smjeru kazaljke na satu page_rotate_ccw.title=Rotiraj obrnutno od smjera kazaljke na satu page_rotate_ccw.label=Rotiraj obrnutno od smjera kazaljke na satu page_rotate_ccw_label=Rotiraj obrnutno od smjera kazaljke na satu hand_tool_enable.title=Omogući ručni alat hand_tool_enable_label=Omogući ručni alat hand_tool_disable.title=Onemogući ručni alat hand_tool_disable_label=Onemogući ručni alat # Document properties dialog box document_properties.title=Svojstva dokumenta... document_properties_label=Svojstva dokumenta... document_properties_file_name=Naziv datoteke: document_properties_file_size=Veličina datoteke: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bajtova) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bajtova) document_properties_title=Naslov: document_properties_author=Autor: document_properties_subject=Predmet: document_properties_keywords=Ključne riječi: document_properties_creation_date=Datum stvaranja: document_properties_modification_date=Datum promjene: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Stvaratelj: document_properties_producer=PDF stvaratelj: document_properties_version=PDF inačica: document_properties_page_count=Broj stranica: document_properties_close=Zatvori # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Prikaži/sakrij bočnu traku toggle_sidebar_label=Prikaži/sakrij bočnu traku outline.title=Prikaži obris dokumenta outline_label=Obris dokumenta attachments.title=Prikaži privitke attachments_label=Privitci thumbs.title=Prikaži sličice thumbs_label=Sličice findbar.title=Traži u dokumentu findbar_label=Traži # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Stranica {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Sličica stranice {{page}} # Find panel button title and messages find_label=Traži: find_previous.title=Pronađi prethodno javljanje ovog izraza find_previous_label=Prethodno find_next.title=Pronađi iduće javljanje ovog izraza find_next_label=Sljedeće find_highlight=Istankni sve find_match_case_label=Slučaj podudaranja find_reached_top=Dosegnut vrh dokumenta, nastavak od dna find_reached_bottom=Dosegnut vrh dokumenta, nastavak od vrha find_not_found=Izraz nije pronađen # Error panel labels error_more_info=Više informacija error_less_info=Manje informacija error_close=Zatvori # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Poruka: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stog: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Datoteka: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Redak: {{line}} rendering_error=Došlo je do greške prilikom iscrtavanja stranice. # Predefined zoom values page_scale_width=Širina stranice page_scale_fit=Pristajanje stranici page_scale_auto=Automatsko uvećanje page_scale_actual=Prava veličina # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Greška loading_error=Došlo je do greške pri učitavanju PDF-a. invalid_file_error=Kriva ili oštećena PDF datoteka. missing_file_error=Nedostaje PDF datoteka. unexpected_response_error=Neočekivani odgovor poslužitelja. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Bilješka] password_label=Upišite lozinku da biste otvorili ovu PDF datoteku. password_invalid=Neispravna lozinka. Pokušajte ponovo. password_ok=U redu password_cancel=Odustani printing_not_supported=Upozorenje: Ispisivanje nije potpuno podržano u ovom pregledniku. printing_not_ready=Upozorenje: PDF nije u potpunosti učitan za ispis. web_fonts_disabled=Web fontovi su onemogućeni: nije moguće koristiti umetnute PDF fontove. document_colors_not_allowed=PDF dokumenti nemaju dopuštene koristiti vlastite boje: opcija 'Dopusti stranicama da koriste vlastite boje' je deaktivirana. manuskript-0.10.0/libs/pdf.js/web/locale/hu/000077500000000000000000000000001354442177200205435ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/hu/viewer.properties000066400000000000000000000166041354442177200241710ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Előző oldal previous_label=Előző next.title=Következő oldal next_label=Tovább # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Oldal: page_of=összesen: {{pageCount}} zoom_out.title=Kicsinyítés zoom_out_label=Kicsinyítés zoom_in.title=Nagyítás zoom_in_label=Nagyítás zoom.title=Nagyítás presentation_mode.title=Váltás bemutató módba presentation_mode_label=Bemutató mód open_file.title=Fájl megnyitása open_file_label=Megnyitás print.title=Nyomtatás print_label=Nyomtatás download.title=Letöltés download_label=Letöltés bookmark.title=Jelenlegi nézet (másolás vagy megnyitás új ablakban) bookmark_label=Aktuális nézet # Secondary toolbar and context menu tools.title=Eszközök tools_label=Eszközök first_page.title=Ugrás az első oldalra first_page.label=Ugrás az első oldalra first_page_label=Ugrás az első oldalra last_page.title=Ugrás az utolsó oldalra last_page.label=Ugrás az utolsó oldalra last_page_label=Ugrás az utolsó oldalra page_rotate_cw.title=Forgatás az óramutató járásával egyezően page_rotate_cw.label=Forgatás az óramutató járásával egyezően page_rotate_cw_label=Forgatás az óramutató járásával egyezően page_rotate_ccw.title=Forgatás az óramutató járásával ellentétesen page_rotate_ccw.label=Forgatás az óramutató járásával ellentétesen page_rotate_ccw_label=Forgatás az óramutató járásával ellentétesen hand_tool_enable.title=Kéz eszköz bekapcsolása hand_tool_enable_label=Kéz eszköz bekapcsolása hand_tool_disable.title=Kéz eszköz kikapcsolása hand_tool_disable_label=Kéz eszköz kikapcsolása # Document properties dialog box document_properties.title=Dokumentum tulajdonságai… document_properties_label=Dokumentum tulajdonságai… document_properties_file_name=Fájlnév: document_properties_file_size=Fájlméret: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bájt) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bájt) document_properties_title=Cím: document_properties_author=Szerző: document_properties_subject=Tárgy: document_properties_keywords=Kulcsszavak: document_properties_creation_date=Létrehozás dátuma: document_properties_modification_date=Módosítás dátuma: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Létrehozta: document_properties_producer=PDF előállító: document_properties_version=PDF verzió: document_properties_page_count=Oldalszám: document_properties_close=Bezárás # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Oldalsáv be/ki toggle_sidebar_label=Oldalsáv be/ki outline.title=Dokumentumvázlat megjelenítése outline_label=Dokumentumvázlat attachments.title=Mellékletek megjelenítése attachments_label=Van melléklet thumbs.title=Bélyegképek megjelenítése thumbs_label=Bélyegképek findbar.title=Keresés a dokumentumban findbar_label=Keresés # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title={{page}}. oldal # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas={{page}}. oldal bélyegképe # Find panel button title and messages find_label=Keresés: find_previous.title=A kifejezés előző előfordulásának keresése find_previous_label=Előző find_next.title=A kifejezés következő előfordulásának keresése find_next_label=Tovább find_highlight=Összes kiemelése find_match_case_label=Kis- és nagybetűk megkülönböztetése find_reached_top=A dokumentum eleje elérve, folytatás a végétől find_reached_bottom=A dokumentum vége elérve, folytatás az elejétől find_not_found=A kifejezés nem található # Error panel labels error_more_info=További tudnivalók error_less_info=Kevesebb információ error_close=Bezárás # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Üzenet: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Nyomkövetés: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Fájl: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Sor: {{line}} rendering_error=Hiba történt az oldal feldolgozása közben. # Predefined zoom values page_scale_width=Oldalszélesség page_scale_fit=Teljes oldal page_scale_auto=Automatikus nagyítás page_scale_actual=Valódi méret # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Hiba loading_error=Hiba történt a PDF betöltésekor. invalid_file_error=Érvénytelen vagy sérült PDF fájl. missing_file_error=Hiányzó PDF fájl. unexpected_response_error=Váratlan kiszolgálóválasz. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} megjegyzés] password_label=Adja meg a jelszót a PDF fájl megnyitásához. password_invalid=Helytelen jelszó. Próbálja újra. password_ok=OK password_cancel=Mégse printing_not_supported=Figyelmeztetés: Ez a böngésző nem teljesen támogatja a nyomtatást. printing_not_ready=Figyelmeztetés: A PDF nincs teljesen betöltve a nyomtatáshoz. web_fonts_disabled=Webes betűkészletek letiltva: nem használhatók a beágyazott PDF betűkészletek. document_colors_not_allowed=A PDF dokumentumok nem használhatják saját színeiket: „Az oldalak a saját maguk által kiválasztott színeket használhatják” beállítás ki van kapcsolva a böngészőben. manuskript-0.10.0/libs/pdf.js/web/locale/hy-AM/000077500000000000000000000000001354442177200210425ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/hy-AM/viewer.properties000066400000000000000000000212161354442177200244630ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Նախորդ էջը previous_label=Նախորդը next.title=Հաջորդ էջը next_label=Հաջորդը # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Էջ. page_of={{pageCount}}-ից zoom_out.title=Փոքրացնել zoom_out_label=Փոքրացնել zoom_in.title=Խոշորացնել zoom_in_label=Խոշորացնել zoom.title=Մասշտաբը\u0020 presentation_mode.title=Անցնել Ներկայացման եղանակին presentation_mode_label=Ներկայացման եղանակ open_file.title=Բացել Ֆայլ open_file_label=Բացել print.title=Տպել print_label=Տպել download.title=Բեռնել download_label=Բեռնել bookmark.title=Ընթացիկ տեսքով (պատճենել կամ բացել նոր պատուհանում) bookmark_label=Ընթացիկ տեսքը # Secondary toolbar and context menu tools.title=Գործիքներ tools_label=Գործիքներ first_page.title=Անցնել առաջին էջին first_page.label=Անցնել առաջին էջին first_page_label=Անցնել առաջին էջին last_page.title=Անցնել վերջին էջին last_page.label=Անցնել վերջին էջին last_page_label=Անցնել վերջին էջին page_rotate_cw.title=Պտտել ըստ ժամացույցի սլաքի page_rotate_cw.label=Պտտել ըստ ժամացույցի սլաքի page_rotate_cw_label=Պտտել ըստ ժամացույցի սլաքի page_rotate_ccw.title=Պտտել հակառակ ժամացույցի սլաքի page_rotate_ccw.label=Պտտել հակառակ ժամացույցի սլաքի page_rotate_ccw_label=Պտտել հակառակ ժամացույցի սլաքի hand_tool_enable.title=Միացնել ձեռքի գործիքը hand_tool_enable_label=Միացնել ձեռքի գործիքը hand_tool_disable.title=Անջատել ձեռքի գործիքը hand_tool_disable_label=ԱՆջատել ձեռքի գործիքը # Document properties dialog box document_properties.title=Փաստաթղթի հատկությունները... document_properties_label=Փաստաթղթի հատկությունները... document_properties_file_name=Ֆայլի անունը. document_properties_file_size=Ֆայլի չափը. # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} ԿԲ ({{size_b}} բայթ) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} ՄԲ ({{size_b}} բայթ) document_properties_title=Վերնագիր. document_properties_author=Հեղինակ․ document_properties_subject=Վերնագիր. document_properties_keywords=Հիմնաբառ. document_properties_creation_date=Ստեղծելու ամսաթիվը. document_properties_modification_date=Փոփոխելու ամսաթիվը. # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Ստեղծող. document_properties_producer=PDF-ի հեղինակը. document_properties_version=PDF-ի տարբերակը. document_properties_page_count=Էջերի քանակը. document_properties_close=Փակել # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Բացել/Փակել Կողային վահանակը toggle_sidebar_label=Բացել/Փակել Կողային վահանակը outline.title=Ցուցադրել փաստաթղթի բովանդակությունը outline_label=Փաստաթղթի բովանդակությունը attachments.title=Ցուցադրել կցորդները attachments_label=Կցորդներ thumbs.title=Ցուցադրել Մանրապատկերը thumbs_label=Մանրապատկերը findbar.title=Գտնել փաստաթղթում findbar_label=Որոնում # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Էջը {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Էջի մանրապատկերը {{page}} # Find panel button title and messages find_label=Գտնել` find_previous.title=Գտնել անրահայտության նախորդ հանդիպումը find_previous_label=Նախորդը find_next.title=Գտիր արտահայտության հաջորդ հանդիպումը find_next_label=Հաջորդը find_highlight=Գունանշել բոլորը find_match_case_label=Մեծ(փոքր)ատառ հաշվի առնել find_reached_top=Հասել եք փաստաթղթի վերևին, կշարունակվի ներքևից find_reached_bottom=Հասել եք փաստաթղթի վերջին, կշարունակվի վերևից find_not_found=Արտահայտությունը չգտնվեց # Error panel labels error_more_info=Ավելի շատ տեղեկություն error_less_info=Քիչ տեղեկություն error_close=Փակել # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (կառուցումը. {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Գրությունը. {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Շեղջ. {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Ֆայլ. {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Տողը. {{line}} rendering_error=Սխալ՝ էջը ստեղծելիս: # Predefined zoom values page_scale_width=Էջի լայնքը page_scale_fit=Ձգել էջը page_scale_auto=Ինքնաշխատ page_scale_actual=Իրական չափը # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Սխալ loading_error=Սխալ՝ PDF ֆայլը բացելիս։ invalid_file_error=Սխալ կամ բնասված PDF ֆայլ: missing_file_error=PDF ֆայլը բացակայում է: unexpected_response_error=Սպասարկիչի անսպասելի պատասխան: # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Ծանոթություն] password_label=Մուտքագրեք PDF-ի գաղտնաբառը: password_invalid=Գաղտնաբառը սխալ է: Կրկին փորձեք: password_ok=ԼԱՎ password_cancel=Չեղարկել printing_not_supported=Զգուշացում. Տպելը ամբողջությամբ չի աջակցվում դիտարկիչի կողմից։ printing_not_ready=Զգուշացում. PDF-ը ամբողջությամբ չի բեռնավորվել տպելու համար: web_fonts_disabled=Վեբ-տառատեսակները անջատված են. հնարավոր չէ օգտագործել ներկառուցված PDF տառատեսակները: document_colors_not_allowed=PDF փաստաթղթերին թույլատրված չէ օգտագործել իրենց սեփական գույները: 'Թույլատրել էջերին ընտրել իրենց սեփական գույները' ընտրանքը անջատված է դիտարկիչում: manuskript-0.10.0/libs/pdf.js/web/locale/id/000077500000000000000000000000001354442177200205235ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/id/viewer.properties000066400000000000000000000156571354442177200241600ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Laman Sebelumnya previous_label=Sebelumnya next.title=Laman Selanjutnya next_label=Selanjutnya # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Laman: page_of=dari {{pageCount}} zoom_out.title=Perkecil zoom_out_label=Perkecil zoom_in.title=Perbesar zoom_in_label=Perbesar zoom.title=Perbesaran presentation_mode.title=Ganti ke Mode Presentasi presentation_mode_label=Mode Presentasi open_file.title=Buka Berkas open_file_label=Buka print.title=Cetak print_label=Cetak download.title=Unduh download_label=Unduh bookmark.title=Tampilan Sekarang (salin atau buka di jendela baru) bookmark_label=Tampilan Sekarang # Secondary toolbar and context menu tools.title=Alat tools_label=Alat first_page.title=Buka Halaman Pertama first_page.label=Ke Halaman Pertama first_page_label=Buka Halaman Pertama last_page.title=Buka Halaman Terakhir last_page.label=Ke Halaman Terakhir last_page_label=Buka Halaman Terakhir page_rotate_cw.title=Putar Searah Jarum Jam page_rotate_cw.label=Putar Searah Jarum Jam page_rotate_cw_label=Putar Searah Jarum Jam page_rotate_ccw.title=Putar Berlawanan Arah Jarum Jam page_rotate_ccw.label=Putar Berlawanan Arah Jarum Jam page_rotate_ccw_label=Putar Berlawanan Arah Jarum Jam hand_tool_enable.title=Aktifkan alat tangan hand_tool_enable_label=Aktifkan alat tangan hand_tool_disable.title=Nonaktifkan alat tangan hand_tool_disable_label=Nonaktifkan alat tangan # Document properties dialog box document_properties.title=Properti Dokumen… document_properties_label=Properti Dokumen… document_properties_file_name=Nama berkas: document_properties_file_size=Ukuran berkas: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} byte) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} byte) document_properties_title=Judul: document_properties_author=Penyusun: document_properties_subject=Subjek: document_properties_keywords=Kata Kunci: document_properties_creation_date=Tanggal Dibuat: document_properties_modification_date=Tanggal Dimodifikasi: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Pembuat: document_properties_producer=Pemroduksi PDF: document_properties_version=Versi PDF: document_properties_page_count=Jumlah Halaman: document_properties_close=Tutup # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Aktif/Nonaktifkan Bilah Samping toggle_sidebar_label=Aktif/Nonaktifkan Bilah Samping outline.title=Buka Kerangka Dokumen outline_label=Kerangka Dokumen attachments.title=Tampilkan Lampiran attachments_label=Lampiran thumbs.title=Tampilkan Miniatur thumbs_label=Miniatur findbar.title=Temukan di Dokumen findbar_label=Temukan # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Laman {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Miniatur Laman {{page}} # Find panel button title and messages find_label=Temukan: find_previous.title=Temukan kata sebelumnya find_previous_label=Sebelumnya find_next.title=Temukan lebih lanjut find_next_label=Selanjutnya find_highlight=Sorot semuanya find_match_case_label=Cocokkan BESAR/kecil find_reached_top=Sampai di awal dokumen, dilanjutkan dari bawah find_reached_bottom=Sampai di akhir dokumen, dilanjutkan dari atas find_not_found=Frasa tidak ditemukan # Error panel labels error_more_info=Lebih Banyak Informasi error_less_info=Lebih Sedikit Informasi error_close=Tutup # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Pesan: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stack: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Berkas: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Baris: {{line}} rendering_error=Galat terjadi saat merender laman. # Predefined zoom values page_scale_width=Lebar Laman page_scale_fit=Muat Laman page_scale_auto=Perbesaran Otomatis page_scale_actual=Ukuran Asli # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Galat loading_error=Galat terjadi saat memuat PDF. invalid_file_error=Berkas PDF tidak valid atau rusak. missing_file_error=Berkas PDF tidak ada. unexpected_response_error=Balasan server yang tidak diharapkan. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Anotasi {{type}}] password_label=Masukkan sandi untuk membuka berkas PDF ini. password_invalid=Sandi tidak valid. Silakan coba lagi. password_ok=Oke password_cancel=Batal printing_not_supported=Peringatan: Pencetakan tidak didukung secara lengkap pada peramban ini. printing_not_ready=Peringatan: Berkas PDF masih belum dimuat secara lengkap untuk dapat dicetak. web_fonts_disabled=Font web dinonaktifkan: tidak dapat menggunakan font PDF yang tersemat. document_colors_not_allowed=Dokumen PDF tidak diizinkan untuk menggunakan warnanya sendiri karena setelan 'Izinkan laman memilih warna sendiri' dinonaktifkan pada pengaturan. manuskript-0.10.0/libs/pdf.js/web/locale/is/000077500000000000000000000000001354442177200205425ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/is/viewer.properties000066400000000000000000000155651354442177200241750ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Fyrri síða previous_label=Fyrri next.title=Næsta síða next_label=Næsti # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Síða: page_of=af {{pageCount}} zoom_out.title=Minnka zoom_out_label=Minnka zoom_in.title=Stækka zoom_in_label=Stækka zoom.title=Aðdráttur presentation_mode.title=Skipta yfir á kynningarham presentation_mode_label=Kynningarhamur open_file.title=Opna skrá open_file_label=Opna print.title=Prenta print_label=Prenta download.title=Hala niður download_label=Hala niður bookmark.title=Núverandi sýn (afritaðu eða opnaðu í nýjum glugga) bookmark_label=Núverandi sýn # Secondary toolbar and context menu tools.title=Verkfæri tools_label=Verkfæri first_page.title=Fara á fyrstu síðu first_page.label=Fara á fyrstu síðu first_page_label=Fara á fyrstu síðu last_page.title=Fara á síðustu síðu last_page.label=Fara á síðustu síðu last_page_label=Fara á síðustu síðu page_rotate_cw.title=Snúa réttsælis page_rotate_cw.label=Snúa réttsælis page_rotate_cw_label=Snúa réttsælis page_rotate_ccw.title=Snúa rangsælis page_rotate_ccw.label=Snúa rangsælis page_rotate_ccw_label=Snúa rangsælis hand_tool_enable.title=Virkja handarverkfæri hand_tool_enable_label=Virkja handarverkfæri hand_tool_disable.title=Gera handarverkfæri óvirkt hand_tool_disable_label=Gera handarverkfæri óvirkt # Document properties dialog box document_properties.title=Eiginleikar skjals… document_properties_label=Eiginleikar skjals… document_properties_file_name=Skráarnafn: document_properties_file_size=Skrárstærð: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=Titill: document_properties_author=Hönnuður: document_properties_subject=Efni: document_properties_keywords=Stikkorð: document_properties_creation_date=Búið til: document_properties_modification_date=Dags breytingar: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Höfundur: document_properties_producer=PDF framleiðandi: document_properties_version=PDF útgáfa: document_properties_page_count=Blaðsíðufjöldi: document_properties_close=Loka # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Víxla hliðslá toggle_sidebar_label=Víxla hliðslá outline.title=Sýna efniskipan skjals outline_label=Efnisskipan skjals attachments.title=Sýna viðhengi attachments_label=Viðhengi thumbs.title=Sýna smámyndir thumbs_label=Smámyndir findbar.title=Leita í skjali findbar_label=Leita # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Síða {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Smámynd af síðu {{page}} # Find panel button title and messages find_label=Leita: find_previous.title=Leita að fyrra tilfelli þessara orða find_previous_label=Fyrri find_next.title=Leita að næsta tilfelli þessara orða find_next_label=Næsti find_highlight=Lita allt find_match_case_label=Passa við stafstöðu find_reached_top=Náði efst í skjal, held áfram neðst find_reached_bottom=Náði enda skjals, held áfram efst find_not_found=Fann ekki orðið # Error panel labels error_more_info=Meiri upplýsingar error_less_info=Minni upplýsingar error_close=Loka # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Skilaboð: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stafli: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Skrá: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Lína: {{line}} rendering_error=Upp kom villa við að birta síðuna. # Predefined zoom values page_scale_width=Síðubreidd page_scale_fit=Passa á síðu page_scale_auto=Sjálfvirkur aðdráttur page_scale_actual=Raunstærð # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Villa loading_error=Villa kom upp við að hlaða inn PDF. invalid_file_error=Ógild eða skemmd PDF skrá. missing_file_error=Vantar PDF skrá. unexpected_response_error=Óvænt svar frá netþjóni. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Skýring] password_label=Sláðu inn lykilorð til að opna þessa PDF skrá. password_invalid=Ógilt lykilorð. Reyndu aftur. password_ok=Í lagi password_cancel=Hætta við printing_not_supported=Aðvörun: Prentun er ekki með fyllilegan stuðning á þessum vafra. printing_not_ready=Aðvörun: Ekki er búið að hlaða inn allri PDF skránni fyrir prentun. web_fonts_disabled=Vef leturgerðir eru óvirkar: get ekki notað innbyggðar PDF leturgerðir. document_colors_not_allowed=PDF skjöl hafa ekki leyfi til að nota sína eigin liti: 'Leyfa síðum að velja eigin liti' er óvirkt í vafranum. manuskript-0.10.0/libs/pdf.js/web/locale/it/000077500000000000000000000000001354442177200205435ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/it/viewer.properties000066400000000000000000000116701354442177200241670ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. previous.title = Pagina precedente previous_label = Precedente next.title = Pagina successiva next_label = Successiva page_label = Pagina: page_of = di {{pageCount}} zoom_out.title = Riduci zoom zoom_out_label = Riduci zoom zoom_in.title = Aumenta zoom zoom_in_label = Aumenta zoom zoom.title = Zoom presentation_mode.title = Passa alla modalità presentazione presentation_mode_label = Modalità presentazione open_file.title = Apri file open_file_label = Apri print.title = Stampa print_label = Stampa download.title = Scarica questo documento download_label = Download bookmark.title = Visualizzazione corrente (copia o apri in una nuova finestra) bookmark_label = Visualizzazione corrente tools.title = Strumenti tools_label = Strumenti first_page.title = Vai alla prima pagina first_page.label = Vai alla prima pagina first_page_label = Vai alla prima pagina last_page.title = Vai all’ultima pagina last_page.label = Vai all’ultima pagina last_page_label = Vai all’ultima pagina page_rotate_cw.title = Ruota in senso orario page_rotate_cw.label = Ruota in senso orario page_rotate_cw_label = Ruota in senso orario page_rotate_ccw.title = Ruota in senso antiorario page_rotate_ccw.label = Ruota in senso antiorario page_rotate_ccw_label = Ruota in senso antiorario hand_tool_enable.title = Attiva strumento mano hand_tool_enable_label = Attiva strumento mano hand_tool_disable.title = Disattiva strumento mano hand_tool_disable_label = Disattiva strumento mano document_properties.title = Proprietà del documento… document_properties_label = Proprietà del documento… document_properties_file_name = Nome file: document_properties_file_size = Dimensione file: document_properties_kb = {{size_kb}} kB ({{size_b}} byte) document_properties_mb = {{size_mb}} MB ({{size_b}} byte) document_properties_title = Titolo: document_properties_author = Autore: document_properties_subject = Oggetto: document_properties_keywords = Parole chiave: document_properties_creation_date = Data creazione: document_properties_modification_date = Data modifica: document_properties_date_string = {{date}}, {{time}} document_properties_creator = Autore originale: document_properties_producer = Produttore PDF: document_properties_version = Versione PDF: document_properties_page_count = Conteggio pagine: document_properties_close = Chiudi toggle_sidebar.title = Attiva/disattiva barra laterale toggle_sidebar_label = Attiva/disattiva barra laterale outline.title = Visualizza la struttura del documento outline_label = Struttura documento attachments.title = Visualizza allegati attachments_label = Allegati thumbs.title = Mostra le miniature thumbs_label = Miniature findbar.title = Trova nel documento findbar_label = Trova thumb_page_title = Pagina {{page}} thumb_page_canvas = Miniatura della pagina {{page}} find_label = Trova: find_previous.title = Trova l’occorrenza precedente del testo da cercare find_previous_label = Precedente find_next.title = Trova l’occorrenza successiva del testo da cercare find_next_label = Successivo find_highlight = Evidenzia find_match_case_label = Maiuscole/minuscole find_reached_top = Raggiunto l’inizio della pagina, continua dalla fine find_reached_bottom = Raggiunta la fine della pagina, continua dall’inizio find_not_found = Testo non trovato error_more_info = Ulteriori informazioni error_less_info = Nascondi dettagli error_close = Chiudi error_version_info = PDF.js v{{version}} (build: {{build}}) error_message = Messaggio: {{message}} error_stack = Stack: {{stack}} error_file = File: {{file}} error_line = Riga: {{line}} rendering_error = Si è verificato un errore durante il rendering della pagina. page_scale_width = Larghezza pagina page_scale_fit = Adatta a una pagina page_scale_auto = Zoom automatico page_scale_actual = Dimensioni effettive page_scale_percent = {{scale}}% loading_error_indicator = Errore loading_error = Si è verificato un errore durante il caricamento del PDF. invalid_file_error = File PDF non valido o danneggiato. missing_file_error = File PDF non disponibile. unexpected_response_error = Risposta imprevista del server text_annotation_type.alt = [Annotazione: {{type}}] password_label = Inserire la password per aprire questo file PDF. password_invalid = Password non corretta. Riprovare. password_ok = OK password_cancel = Annulla printing_not_supported = Attenzione: la stampa non è completamente supportata da questo browser. printing_not_ready = Attenzione: il PDF non è ancora stato caricato completamente per la stampa. web_fonts_disabled = I web font risultano disattivati: impossibile utilizzare i caratteri inclusi nel PDF. document_colors_not_allowed = Non è possibile visualizzare i colori originali definiti nel file PDF: l’opzione del browser “Consenti alle pagine di scegliere i propri colori invece di quelli impostati” è disattivata. manuskript-0.10.0/libs/pdf.js/web/locale/ja/000077500000000000000000000000001354442177200205215ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/ja/viewer.properties000066400000000000000000000165651354442177200241550ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=前のページへ戻ります previous_label=前へ next.title=次のページへ進みます next_label=次へ # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=ページ: page_of=/ {{pageCount}} zoom_out.title=表示を縮小します zoom_out_label=縮小 zoom_in.title=表示を拡大します zoom_in_label=拡大 zoom.title=拡大/縮小 presentation_mode.title=プレゼンテーションモードに切り替えます presentation_mode_label=プレゼンテーションモード open_file.title=ファイルを指定して開きます open_file_label=開く print.title=印刷します print_label=印刷 download.title=ダウンロードします download_label=ダウンロード bookmark.title=現在のビューの URL です (コピーまたは新しいウィンドウに開く) bookmark_label=現在のビュー # Secondary toolbar and context menu tools.title=ツール tools_label=ツール first_page.title=最初のページへ移動します first_page.label=最初のページへ移動 first_page_label=最初のページへ移動 last_page.title=最後のページへ移動します last_page.label=最後のページへ移動 last_page_label=最後のページへ移動 page_rotate_cw.title=ページを右へ回転します page_rotate_cw.label=右回転 page_rotate_cw_label=右回転 page_rotate_ccw.title=ページを左へ回転します page_rotate_ccw.label=左回転 page_rotate_ccw_label=左回転 hand_tool_enable.title=手のひらツールを有効にします hand_tool_enable_label=手のひらツールを有効にする hand_tool_disable.title=手のひらツールを無効にします hand_tool_disable_label=手のひらツールを無効にする # Document properties dialog box document_properties.title=文書のプロパティ... document_properties_label=文書のプロパティ... document_properties_file_name=ファイル名: document_properties_file_size=ファイルサイズ: document_properties_kb={{size_kb}} KB ({{size_b}} bytes) document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=タイトル: document_properties_author=作成者: document_properties_subject=件名: document_properties_keywords=キーワード: document_properties_creation_date=作成日: document_properties_modification_date=更新日: document_properties_date_string={{date}}, {{time}} document_properties_creator=アプリケーション: document_properties_producer=PDF 作成: document_properties_version=PDF のバージョン: document_properties_page_count=ページ数: document_properties_close=閉じる # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=サイドバー表示を切り替えます toggle_sidebar_label=サイドバーの切り替え outline.title=文書の目次を表示します outline_label=文書の目次 attachments.title=添付ファイルを表示します attachments_label=添付ファイル thumbs.title=縮小版を表示します thumbs_label=縮小版 findbar.title=文書内を検索します findbar_label=検索 # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title={{page}} ページ # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=ページの縮小版 {{page}} # Find panel button title and messages find_label=検索: find_previous.title=指定文字列に一致する 1 つ前の部分を検索します find_previous_label=前へ find_next.title=指定文字列に一致する次の部分を検索します find_next_label=次へ find_highlight=すべて強調表示 find_match_case_label=大文字/小文字を区別 find_reached_top=文書先頭に到達したので末尾に戻って検索しました。 find_reached_bottom=文書末尾に到達したので先頭に戻って検索しました。 find_not_found=見つかりませんでした。 # Error panel labels error_more_info=詳細情報 error_less_info=詳細情報の非表示 error_close=閉じる # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (ビルド: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=メッセージ: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=スタック: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=ファイル: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=行: {{line}} rendering_error=ページのレンダリング中にエラーが発生しました # Predefined zoom values page_scale_width=幅に合わせる page_scale_fit=ページのサイズに合わせる page_scale_auto=自動ズーム page_scale_actual=実際のサイズ # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=エラー loading_error=PDF の読み込み中にエラーが発生しました invalid_file_error=無効または破損した PDF ファイル missing_file_error=PDF ファイルが見つかりません。 unexpected_response_error=サーバから予期せぬ応答がありました。 # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} 注釈] password_label=この PDF ファイルを開くためのパスワードを入力してください。 password_invalid=無効なパスワードです。もう一度やり直してください。 password_ok=OK password_cancel=キャンセル printing_not_supported=警告: このブラウザでは印刷が完全にサポートされていません printing_not_ready=警告: PDF を印刷するための読み込みが終了していません web_fonts_disabled=Web フォントが無効になっています: 埋め込まれた PDF のフォントを使用できません document_colors_not_allowed=PDF 文書は、Web ページが指定した配色を使用することができません: 'Web ページが指定した配色' はブラウザで無効になっています。 manuskript-0.10.0/libs/pdf.js/web/locale/ka/000077500000000000000000000000001354442177200205225ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/ka/viewer.properties000066400000000000000000000250551354442177200241500ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=წინა გვერდი previous_label=წინა next.title=შემდეგი გვერდი next_label=შემდეგი # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=გვერდი: page_of=/ {{pageCount}} zoom_out.title=დაშორება zoom_out_label=დაშორება zoom_in.title=მიახლოება zoom_in_label=მიახლოება zoom.title=მასშტაბი presentation_mode.title=პრეზენტაციის რეჟიმზე გადართვა presentation_mode_label=პრეზენტაციის რეჟიმი open_file.title=ფაილის გახსნა open_file_label=გახსნა print.title=დაბეჭდვა print_label=დაბეჭდვა download.title=ჩამოტვირთვა download_label=ჩამოტვირთვა bookmark.title=მიმდინარე ხედი (კოპირება ან გახსნა ახალ ფანჯარაში) bookmark_label=მიმდინარე ხედი # Secondary toolbar and context menu tools.title=ხელსაწყოები tools_label=ხელსაწყოები first_page.title=პირველ გვერდზე გადასვლა first_page.label=პირველ გვერდზე გადასვლა first_page_label=პირველ გვერდზე გადასვლა last_page.title=ბოლო გვერდზე გადასვლა last_page.label=ბოლო გვერდზე გადასვლა last_page_label=ბოლო გვერდზე გადასვლა page_rotate_cw.title=ისრის მიმართულებით შებრუნება page_rotate_cw.label=ისრის მიმართულებით შებრუნება page_rotate_cw_label=ისრის მიმართულებით შებრუნება page_rotate_ccw.title=ისრის საპირისპიროდ შებრუნება page_rotate_ccw.label=ისრის საპირისპიროდ შებრუნება page_rotate_ccw_label=ისრის საპირისპიროდ შებრუნება hand_tool_enable.title=ხელის ხელსაწყოს ჩართვა hand_tool_enable_label=ხელის ხელსაწყოს ჩართვა hand_tool_disable.title=ხელის ხელსაწყოს გამორთვა hand_tool_disable_label=ხელის ხელსაწყოს გამორთვა # Document properties dialog box document_properties.title=დოკუმენტის თვისებები… document_properties_label=დოკუმენტის თვისებები… document_properties_file_name=ფაილის სახელი: document_properties_file_size=ფაილის ზომა: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} ბაიტი) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} ბაიტი) document_properties_title=სათაური: document_properties_author=ავტორი: document_properties_subject=თემა: document_properties_keywords=საკვანძო სიტყვები: document_properties_creation_date=შექმნის თარიღი: document_properties_modification_date=სახეცვალების თარიღი: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=შემქმნელი: document_properties_producer=PDF მწარმოებელი: document_properties_version=PDF ვერსია: document_properties_page_count=გვერდების რაოდენობა: document_properties_close=დახურვა # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=გვერდითა ზოლის ბერკეტი toggle_sidebar_label=გვერდითა ზოლის ბერკეტი outline.title=დოკუმენტის კონტურის ჩვენება outline_label=დოკუმენტის კონტური attachments.title=დანართების ჩვენება attachments_label=დანართები thumbs.title=ესკიზების ჩვენება thumbs_label=ესკიზები findbar.title=პოვნა დოკუმენტში findbar_label=პოვნა # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=გვერდი {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=გვერდის ესკიზი {{page}} # Find panel button title and messages find_label=პოვნა: find_previous.title=ფრაზის წინა კონტექსტის პოვნა find_previous_label=წინა find_next.title=ფრაზის შემდეგი კონტექსტის პოვნა find_next_label=შემდეგი find_highlight=ყველას მონიშვნა find_match_case_label=მთავრულის გათვალისწინება find_reached_top=მიღწეულია დოკუმენტის უმაღლესი წერტილი, გრძელდება ქვემოდან find_reached_bottom=მიღწეულია დოკუმენტის ბოლი, გრძელდება ზემოდან find_not_found=კონტექსტი ვერ მოიძებნა # Error panel labels error_more_info=დამატებითი ინფორმაცია error_less_info=ნაკლები ინფორმაცია error_close=დახურვა # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=შეტყობინება: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=სტეკი: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=ფაილი: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=ხაზი: {{line}} rendering_error=გვერდის რენდერისას დაფიქსირდა შეცდომა. # Predefined zoom values page_scale_width=გვერდის სიგანე page_scale_fit=გვერდის მორგება page_scale_auto=ავტომატური მასშტაბი page_scale_actual=აქტუალური ზომა # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=შეცდომა loading_error=PDF-ის ჩატვირთვისას დაფიქსირდა შეცდომა. invalid_file_error=არამართებული ან დაზიანებული PDF ფაილი. missing_file_error=ნაკლული PDF ფაილი. unexpected_response_error=სერვერის მოულოდნელი პასუხი. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} ანოტაცია] password_label=შეიყვანეთ პაროლი, რათა გახსნათ ეს PDF ფაილი. password_invalid=არასწორი პაროლი. გთხოვთ, სცადეთ ხელახლა. password_ok=დიახ password_cancel=გაუქმება printing_not_supported=გაფრთხილება: ამ ბრაუზერის მიერ დაბეჭდვა ბოლომდე მხარდაჭერილი არაა. printing_not_ready=გაფრთხილება: PDF ამობეჭდვისთვის ბოლომდე ჩატვირთული არაა. web_fonts_disabled=ვებ-შრიფტები გამორთულია: ჩაშენებული PDF შრიფტების გამოყენება ვერ ხერხდება. document_colors_not_allowed=PDF დოკუმენტებს არ აქვთ საკუთარი ფერების გამოყენების უფლება: ბრაუზერში გამორთულია "გვერდებისთვის საკუთარი ფერების გამოყენების უფლება". manuskript-0.10.0/libs/pdf.js/web/locale/kk/000077500000000000000000000000001354442177200205345ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/kk/viewer.properties000066400000000000000000000212521354442177200241550ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Алдыңғы парақ previous_label=Алдыңғысы next.title=Келесі парақ next_label=Келесі # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Парақ: page_of={{pageCount}} ішінен zoom_out.title=Кішірейту zoom_out_label=Кішірейту zoom_in.title=Үлкейту zoom_in_label=Үлкейту zoom.title=Масштаб presentation_mode.title=Презентация режиміне ауысу presentation_mode_label=Презентация режимі open_file.title=Файлды ашу open_file_label=Ашу print.title=Баспаға шығару print_label=Баспаға шығару download.title=Жүктеп алу download_label=Жүктеп алу bookmark.title=Ағымдағы көрініс (көшіру не жаңа терезеде ашу) bookmark_label=Ағымдағы көрініс # Secondary toolbar and context menu tools.title=Саймандар tools_label=Саймандар first_page.title=Алғашқы параққа өту first_page.label=Алғашқы параққа өту first_page_label=Алғашқы параққа өту last_page.title=Соңғы параққа өту last_page.label=Соңғы параққа өту last_page_label=Соңғы параққа өту page_rotate_cw.title=Сағат тілі бағытымен айналдыру page_rotate_cw.label=Сағат тілі бағытымен бұру page_rotate_cw_label=Сағат тілі бағытымен бұру page_rotate_ccw.title=Сағат тілі бағытына қарсы бұру page_rotate_ccw.label=Сағат тілі бағытына қарсы бұру page_rotate_ccw_label=Сағат тілі бағытына қарсы бұру hand_tool_enable.title=Қол сайманын іске қосу hand_tool_enable_label=Қол сайманын іске қосу hand_tool_disable.title=Қол сайманын сөндіру hand_tool_disable_label=Қол сайманын сөндіру # Document properties dialog box document_properties.title=Құжат қасиеттері… document_properties_label=Құжат қасиеттері… document_properties_file_name=Файл аты: document_properties_file_size=Файл өлшемі: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} КБ ({{size_b}} байт) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} МБ ({{size_b}} байт) document_properties_title=Тақырыбы... document_properties_author=Авторы: document_properties_subject=Тақырыбы: document_properties_keywords=Кілт сөздер: document_properties_creation_date=Жасалған күні: document_properties_modification_date=Түзету күні: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Жасаған: document_properties_producer=PDF өндірген: document_properties_version=PDF нұсқасы: document_properties_page_count=Беттер саны: document_properties_close=Жабу # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Бүйір панелін көрсету/жасыру toggle_sidebar_label=Бүйір панелін көрсету/жасыру outline.title=Құжат құрамасын көрсету outline_label=Құжат құрамасы attachments.title=Салынымдарды көрсету attachments_label=Салынымдар thumbs.title=Кіші көріністерді көрсету thumbs_label=Кіші көріністер findbar.title=Құжаттан табу findbar_label=Табу # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title={{page}} парағы # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas={{page}} парағы үшін кіші көрінісі # Find panel button title and messages find_label=Табу: find_previous.title=Осы сөздердің мәтіннен алдыңғы кездесуін табу find_previous_label=Алдыңғысы find_next.title=Осы сөздердің мәтіннен келесі кездесуін табу find_next_label=Келесі find_highlight=Барлығын түспен ерекшелеу find_match_case_label=Регистрді ескеру find_reached_top=Құжаттың басына жеттік, соңынан бастап жалғастырамыз find_reached_bottom=Құжаттың соңына жеттік, басынан бастап жалғастырамыз find_not_found=Сөз(дер) табылмады # Error panel labels error_more_info=Көбірек ақпарат error_less_info=Азырақ ақпарат error_close=Жабу # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (жинақ: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Хабарлама: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Стек: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Файл: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Жол: {{line}} rendering_error=Парақты өңдеу кезінде қате кетті. # Predefined zoom values page_scale_width=Парақ ені page_scale_fit=Парақты сыйдыру page_scale_auto=Автомасштабтау page_scale_actual=Нақты өлшемі # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Қате loading_error=PDF жүктеу кезінде қате кетті. invalid_file_error=Зақымдалған немесе қате PDF файл. missing_file_error=PDF файлы жоқ. unexpected_response_error=Сервердің күтпеген жауабы. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} аңдатпасы] password_label=Бұл PDF файлын ашу үшін парольді енгізіңіз. password_invalid=Пароль дұрыс емес. Қайталап көріңіз. password_ok=ОК password_cancel=Бас тарту printing_not_supported=Ескерту: Баспаға шығаруды бұл браузер толығымен қолдамайды. printing_not_ready=Ескерту: Баспаға шығару үшін, бұл PDF толығымен жүктеліп алынбады. web_fonts_disabled=Веб қаріптері сөндірілген: құрамына енгізілген PDF қаріптерін қолдану мүмкін емес. document_colors_not_allowed=PDF құжаттарына өздік түстерді қолдану рұқсат етілмеген: бұл браузерде 'Веб-сайттарға өздерінің түстерін қолдануға рұқсат беру' мүмкіндігі сөндірулі тұр. manuskript-0.10.0/libs/pdf.js/web/locale/km/000077500000000000000000000000001354442177200205365ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/km/viewer.properties000066400000000000000000000251431354442177200241620ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=ទំព័រ​មុន previous_label=មុន next.title=ទំព័រ​បន្ទាប់ next_label=បន្ទាប់ # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=ទំព័រ ៖ page_of=នៃ {{pageCount}} zoom_out.title=​បង្រួម zoom_out_label=​បង្រួម zoom_in.title=​ពង្រីក zoom_in_label=​ពង្រីក zoom.title=ពង្រីក presentation_mode.title=ប្ដូរ​ទៅ​របៀប​បទ​បង្ហាញ presentation_mode_label=របៀប​បទ​បង្ហាញ open_file.title=បើក​ឯកសារ open_file_label=បើក print.title=បោះពុម្ព print_label=បោះពុម្ព download.title=ទាញ​យក download_label=ទាញ​យក bookmark.title=ទិដ្ឋភាព​បច្ចុប្បន្ន (ចម្លង ឬ​បើក​នៅ​ក្នុង​បង្អួច​ថ្មី) bookmark_label=ទិដ្ឋភាព​បច្ចុប្បន្ន # Secondary toolbar and context menu tools.title=ឧបករណ៍ tools_label=ឧបករណ៍ first_page.title=ទៅកាន់​ទំព័រ​ដំបូង​ first_page.label=ទៅកាន់​ទំព័រ​ដំបូង​ first_page_label=ទៅកាន់​ទំព័រ​ដំបូង​ last_page.title=ទៅកាន់​ទំព័រ​ចុងក្រោយ​ last_page.label=ទៅកាន់​ទំព័រ​ចុងក្រោយ​ last_page_label=ទៅកាន់​ទំព័រ​ចុងក្រោយ page_rotate_cw.title=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា page_rotate_cw.label=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា page_rotate_cw_label=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា page_rotate_ccw.title=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​ page_rotate_ccw.label=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​ page_rotate_ccw_label=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​ hand_tool_enable.title=បើក​ឧបករណ៍​ដោយ​ដៃ hand_tool_enable_label=បើក​ឧបករណ៍​ដោយ​ដៃ hand_tool_disable.title=បិទ​ឧបករណ៍​ប្រើ​ដៃ hand_tool_disable_label=បិទ​ឧបករណ៍​ប្រើ​ដៃ # Document properties dialog box document_properties.title=លក្ខណ​សម្បត្តិ​ឯកសារ… document_properties_label=លក្ខណ​សម្បត្តិ​ឯកសារ… document_properties_file_name=ឈ្មោះ​ឯកសារ៖ document_properties_file_size=ទំហំ​ឯកសារ៖ # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=ចំណងជើង ៖ document_properties_author=អ្នក​និពន្ធ៖ document_properties_subject=ប្រធានបទ៖ document_properties_keywords=ពាក្យ​គន្លឹះ៖ document_properties_creation_date=កាលបរិច្ឆេទ​បង្កើត៖ document_properties_modification_date=កាលបរិច្ឆេទ​កែប្រែ៖ # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=អ្នក​បង្កើត៖ document_properties_producer=កម្មវិធី​បង្កើត PDF ៖ document_properties_version=កំណែ PDF ៖ document_properties_page_count=ចំនួន​ទំព័រ៖ document_properties_close=បិទ # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=បិទ/បើក​គ្រាប់​រំកិល toggle_sidebar_label=បិទ/បើក​គ្រាប់​រំកិល outline.title=បង្ហាញ​គ្រោង​ឯកសារ outline_label=គ្រោង​ឯកសារ attachments.title=បង្ហាញ​ឯកសារ​ភ្ជាប់ attachments_label=ឯកសារ​ភ្ជាប់ thumbs.title=បង្ហាញ​រូបភាព​តូចៗ thumbs_label=រួបភាព​តូចៗ findbar.title=រក​នៅ​ក្នុង​ឯកសារ findbar_label=រក # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=ទំព័រ {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=រូបភាព​តូច​របស់​ទំព័រ {{page}} # Find panel button title and messages find_label=រក ៖ find_previous.title=រក​ពាក្យ ឬ​ឃ្លា​ដែល​បាន​ជួប​មុន find_previous_label=មុន find_next.title=រក​ពាក្យ ឬ​ឃ្លា​ដែល​បាន​ជួប​បន្ទាប់ find_next_label=បន្ទាប់ find_highlight=បន្លិច​ទាំងអស់ find_match_case_label=ករណី​ដំណូច find_reached_top=បាន​បន្ត​ពី​ខាង​ក្រោម ទៅ​ដល់​ខាង​​លើ​នៃ​ឯកសារ find_reached_bottom=បាន​បន្ត​ពី​ខាងលើ ទៅដល់​ចុង​​នៃ​ឯកសារ find_not_found=រក​មិន​ឃើញ​ពាក្យ ឬ​ឃ្លា # Error panel labels error_more_info=ព័ត៌មាន​បន្ថែម error_less_info=ព័ត៌មាន​តិចតួច error_close=បិទ # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=សារ ៖ {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=ជង់ ៖ {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=ឯកសារ ៖ {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=ជួរ ៖ {{line}} rendering_error=មាន​កំហុស​បាន​កើតឡើង​ពេល​បង្ហាញ​ទំព័រ ។ # Predefined zoom values page_scale_width=ទទឹង​ទំព័រ page_scale_fit=សម​ទំព័រ page_scale_auto=ពង្រីក​ស្វ័យប្រវត្តិ page_scale_actual=ទំហំ​ជាក់ស្ដែង # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=កំហុស loading_error=មាន​កំហុស​បាន​កើតឡើង​ពេល​កំពុង​ផ្ទុក PDF ។ invalid_file_error=ឯកសារ PDF ខូច ឬ​មិន​ត្រឹមត្រូវ ។ missing_file_error=បាត់​ឯកសារ PDF unexpected_response_error=ការ​ឆ្លើយ​តម​ម៉ាស៊ីន​មេ​ដែល​មិន​បាន​រំពឹង។ # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} ចំណារ​ពន្យល់] password_label=បញ្ចូល​ពាក្យសម្ងាត់​ដើម្បី​បើក​ឯកសារ PDF នេះ។ password_invalid=ពាក្យសម្ងាត់​មិន​ត្រឹមត្រូវ។ សូម​ព្យាយាម​ម្ដងទៀត។ password_ok=យល់​ព្រម password_cancel=បោះបង់ printing_not_supported=ការ​ព្រមាន ៖ កា​រ​បោះពុម្ព​មិន​ត្រូវ​បាន​គាំទ្រ​ពេញលេញ​ដោយ​កម្មវិធី​រុករក​នេះ​ទេ ។ printing_not_ready=ព្រមាន៖ PDF មិន​ត្រូវ​បាន​ផ្ទុក​ទាំងស្រុង​ដើម្បី​បោះពុម្ព​ទេ។ web_fonts_disabled=បាន​បិទ​ពុម្ពអក្សរ​បណ្ដាញ ៖ មិន​អាច​ប្រើ​ពុម្ពអក្សរ PDF ដែល​បាន​បង្កប់​បាន​ទេ ។ document_colors_not_allowed=ឯកសារ PDF មិន​ត្រូវ​បាន​អនុញ្ញាត​ឲ្យ​ប្រើ​ពណ៌​ផ្ទាល់​របស់​វា​ទេ៖ 'អនុញ្ញាត​​ឲ្យ​ទំព័រ​ជ្រើស​ពណ៌​ផ្ទាល់​ខ្លួន' ត្រូវ​បាន​ធ្វើ​ឲ្យ​អសកម្ម​ក្នុង​​កម្មវិធី​រុករក។ manuskript-0.10.0/libs/pdf.js/web/locale/kn/000077500000000000000000000000001354442177200205375ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/kn/viewer.properties000066400000000000000000000250501354442177200241600ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=ಹಿಂದಿನ ಪುಟ previous_label=ಹಿಂದಿನ next.title=ಮುಂದಿನ ಪುಟ next_label=ಮುಂದಿನ # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=ಪುಟ: page_of={{pageCount}} ರಲ್ಲಿ zoom_out.title=ಕಿರಿದಾಗಿಸು zoom_out_label=ಕಿರಿದಾಗಿಸಿ zoom_in.title=ಹಿರಿದಾಗಿಸು zoom_in_label=ಹಿರಿದಾಗಿಸಿ zoom.title=ಗಾತ್ರಬದಲಿಸು presentation_mode.title=ಪ್ರಸ್ತುತಿ (ಪ್ರಸೆಂಟೇಶನ್) ಕ್ರಮಕ್ಕೆ ಬದಲಾಯಿಸು presentation_mode_label=ಪ್ರಸ್ತುತಿ (ಪ್ರಸೆಂಟೇಶನ್) ಕ್ರಮ open_file.title=ಕಡತವನ್ನು ತೆರೆ open_file_label=ತೆರೆಯಿರಿ print.title=ಮುದ್ರಿಸು print_label=ಮುದ್ರಿಸಿ download.title=ಇಳಿಸು download_label=ಇಳಿಸಿಕೊಳ್ಳಿ bookmark.title=ಪ್ರಸಕ್ತ ನೋಟ (ಪ್ರತಿ ಮಾಡು ಅಥವ ಹೊಸ ಕಿಟಕಿಯಲ್ಲಿ ತೆರೆ) bookmark_label=ಪ್ರಸಕ್ತ ನೋಟ # Secondary toolbar and context menu tools.title=ಉಪಕರಣಗಳು tools_label=ಉಪಕರಣಗಳು first_page.title=ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು first_page.label=ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು first_page_label=ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು last_page.title=ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು last_page.label=ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು last_page_label=ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು page_rotate_cw.title=ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು page_rotate_cw.label=ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು page_rotate_cw_label=ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು page_rotate_ccw.title=ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು page_rotate_ccw.label=ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು page_rotate_ccw_label=ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು hand_tool_enable.title=ಕೈ ಉಪಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸು hand_tool_enable_label=ಕೈ ಉಪಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸು hand_tool_disable.title=ಕೈ ಉಪಕರಣವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸು hand_tool_disable_label=ಕೈ ಉಪಕರಣವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸು # Document properties dialog box document_properties.title=ಡಾಕ್ಯುಮೆಂಟ್‌ ಗುಣಗಳು... document_properties_label=ಡಾಕ್ಯುಮೆಂಟ್‌ ಗುಣಗಳು... document_properties_file_name=ಕಡತದ ಹೆಸರು: document_properties_file_size=ಕಡತದ ಗಾತ್ರ: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} ಬೈಟ್‍ಗಳು) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} ಬೈಟ್‍ಗಳು) document_properties_title=ಶೀರ್ಷಿಕೆ: document_properties_author=ಕರ್ತೃ: document_properties_subject=ವಿಷಯ: document_properties_keywords=ಮುಖ್ಯಪದಗಳು: document_properties_creation_date=ರಚಿಸಿದ ದಿನಾಂಕ: document_properties_modification_date=ಮಾರ್ಪಡಿಸಲಾದ ದಿನಾಂಕ: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=ರಚಿಸಿದವರು: document_properties_producer=PDF ಉತ್ಪಾದಕ: document_properties_version=PDF ಆವೃತ್ತಿ: document_properties_page_count=ಪುಟದ ಎಣಿಕೆ: document_properties_close=ಮುಚ್ಚು # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=ಬದಿಪಟ್ಟಿಯನ್ನು ಹೊರಳಿಸು toggle_sidebar_label=ಬದಿಪಟ್ಟಿಯನ್ನು ಹೊರಳಿಸು outline.title=ದಸ್ತಾವೇಜಿನ ಹೊರರೇಖೆಯನ್ನು ತೋರಿಸು outline_label=ದಸ್ತಾವೇಜಿನ ಹೊರರೇಖೆ attachments.title=ಲಗತ್ತುಗಳನ್ನು ತೋರಿಸು attachments_label=ಲಗತ್ತುಗಳು thumbs.title=ಚಿಕ್ಕಚಿತ್ರದಂತೆ ತೋರಿಸು thumbs_label=ಚಿಕ್ಕಚಿತ್ರಗಳು findbar.title=ದಸ್ತಾವೇಜಿನಲ್ಲಿ ಹುಡುಕು findbar_label=ಹುಡುಕು # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=ಪುಟ {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=ಪುಟವನ್ನು ಚಿಕ್ಕಚಿತ್ರದಂತೆ ತೋರಿಸು {{page}} # Find panel button title and messages find_label=ಹುಡುಕು: find_previous.title=ವಾಕ್ಯದ ಹಿಂದಿನ ಇರುವಿಕೆಯನ್ನು ಹುಡುಕು find_previous_label=ಹಿಂದಿನ find_next.title=ವಾಕ್ಯದ ಮುಂದಿನ ಇರುವಿಕೆಯನ್ನು ಹುಡುಕು find_next_label=ಮುಂದಿನ find_highlight=ಎಲ್ಲವನ್ನು ಹೈಲೈಟ್ ಮಾಡು find_match_case_label=ಕೇಸನ್ನು ಹೊಂದಿಸು find_reached_top=ದಸ್ತಾವೇಜಿನ ಮೇಲ್ಭಾಗವನ್ನು ತಲುಪಿದೆ, ಕೆಳಗಿನಿಂದ ಆರಂಭಿಸು find_reached_bottom=ದಸ್ತಾವೇಜಿನ ಕೊನೆಯನ್ನು ತಲುಪಿದೆ, ಮೇಲಿನಿಂದ ಆರಂಭಿಸು find_not_found=ವಾಕ್ಯವು ಕಂಡು ಬಂದಿಲ್ಲ # Error panel labels error_more_info=ಹೆಚ್ಚಿನ ಮಾಹಿತಿ error_less_info=ಕಡಿಮೆ ಮಾಹಿತಿ error_close=ಮುಚ್ಚು # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=ಸಂದೇಶ: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=ರಾಶಿ: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=ಕಡತ: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=ಸಾಲು: {{line}} rendering_error=ಪುಟವನ್ನು ನಿರೂಪಿಸುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ. # Predefined zoom values page_scale_width=ಪುಟದ ಅಗಲ page_scale_fit=ಪುಟದ ಸರಿಹೊಂದಿಕೆ page_scale_auto=ಸ್ವಯಂಚಾಲಿತ ಗಾತ್ರಬದಲಾವಣೆ page_scale_actual=ನಿಜವಾದ ಗಾತ್ರ # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=ದೋಷ loading_error=PDF ಅನ್ನು ಲೋಡ್ ಮಾಡುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ. invalid_file_error=ಅಮಾನ್ಯವಾದ ಅಥವ ಹಾಳಾದ PDF ಕಡತ. missing_file_error=PDF ಕಡತ ಇಲ್ಲ. unexpected_response_error=ಅನಿರೀಕ್ಷಿತವಾದ ಪೂರೈಕೆಗಣಕದ ಪ್ರತಿಕ್ರಿಯೆ. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} ಟಿಪ್ಪಣಿ] password_label=PDF ಅನ್ನು ತೆರೆಯಲು ಗುಪ್ತಪದವನ್ನು ನಮೂದಿಸಿ. password_invalid=ಅಮಾನ್ಯವಾದ ಗುಪ್ತಪದ, ದಯವಿಟ್ಟು ಇನ್ನೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ. password_ok=OK password_cancel=ರದ್ದು ಮಾಡು printing_not_supported=ಎಚ್ಚರಿಕೆ: ಈ ಜಾಲವೀಕ್ಷಕದಲ್ಲಿ ಮುದ್ರಣಕ್ಕೆ ಸಂಪೂರ್ಣ ಬೆಂಬಲವಿಲ್ಲ. printing_not_ready=ಎಚ್ಚರಿಕೆ: PDF ಕಡತವು ಮುದ್ರಿಸಲು ಸಂಪೂರ್ಣವಾಗಿ ಲೋಡ್ ಆಗಿಲ್ಲ. web_fonts_disabled=ಜಾಲ ಅಕ್ಷರಶೈಲಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ: ಅಡಕಗೊಳಿಸಿದ PDF ಅಕ್ಷರಶೈಲಿಗಳನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ. document_colors_not_allowed=PDF ದಸ್ತಾವೇಜುಗಳು ತಮ್ಮದೆ ಆದ ಬಣ್ಣಗಳನ್ನು ಬಳಸಲು ಅನುಮತಿ ಇರುವುದಿಲ್ಲ: 'ಪುಟಗಳು ತಮ್ಮದೆ ಆದ ಬಣ್ಣವನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಅನುಮತಿಸು' ಅನ್ನು ಜಾಲವೀಕ್ಷಕದಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿರುತ್ತದೆ. manuskript-0.10.0/libs/pdf.js/web/locale/ko/000077500000000000000000000000001354442177200205405ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/ko/viewer.properties000066400000000000000000000162711354442177200241660ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=이전 페이지 previous_label=이전 next.title=다음 페이지 next_label=다음 # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=페이지: page_of=/{{pageCount}} zoom_out.title=축소 zoom_out_label=축소 zoom_in.title=확대 zoom_in_label=확대 zoom.title=크기 presentation_mode.title=발표 모드로 전환 presentation_mode_label=발표 모드 open_file.title=파일 열기 open_file_label=열기 print.title=인쇄 print_label=인쇄 download.title=다운로드 download_label=다운로드 bookmark.title=지금 보이는 그대로 (복사하거나 새 창에 열기) bookmark_label=지금 보이는 그대로 # Secondary toolbar and context menu tools.title=도구 tools_label=도구 first_page.title=첫 페이지로 이동 first_page.label=첫 페이지로 이동 first_page_label=첫 페이지로 이동 last_page.title=마지막 페이지로 이동 last_page.label=마지막 페이지로 이동 last_page_label=마지막 페이지로 이동 page_rotate_cw.title=시계방향으로 회전 page_rotate_cw.label=시계방향으로 회전 page_rotate_cw_label=시계방향으로 회전 page_rotate_ccw.title=시계 반대방향으로 회전 page_rotate_ccw.label=시계 반대방향으로 회전 page_rotate_ccw_label=시계 반대방향으로 회전 hand_tool_enable.title=손 도구 켜기 hand_tool_enable_label=손 도구 켜기 hand_tool_disable.title=손 도구 끄기 hand_tool_disable_label=손 도구 끄기 # Document properties dialog box document_properties.title=문서 속성… document_properties_label=문서 속성… document_properties_file_name=파일 이름: document_properties_file_size=파일 사이즈: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}}바이트) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}}바이트) document_properties_title=제목: document_properties_author=저자: document_properties_subject=주제: document_properties_keywords=키워드: document_properties_creation_date=생성일: document_properties_modification_date=수정일: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=생성자: document_properties_producer=PDF 생성기: document_properties_version=PDF 버전: document_properties_page_count=총 페이지: document_properties_close=닫기 # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=탐색창 열고 닫기 toggle_sidebar_label=탐색창 열고 닫기 outline.title=문서 개요 보기 outline_label=문서 개요 attachments.title=첨부파일 보기 attachments_label=첨부파일 thumbs.title=미리보기 thumbs_label=미리보기 findbar.title=검색 findbar_label=검색 # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title={{page}}쪽 # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas={{page}}쪽 미리보기 # Find panel button title and messages find_label=검색: find_previous.title=지정 문자열에 일치하는 1개 부분을 검색 find_previous_label=이전 find_next.title=지정 문자열에 일치하는 다음 부분을 검색 find_next_label=다음 find_highlight=모두 강조 표시 find_match_case_label=대문자/소문자 구별 find_reached_top=문서 처음까지 검색하고 끝으로 돌아와 검색했습니다. find_reached_bottom=문서 끝까지 검색하고 앞으로 돌아와 검색했습니다. find_not_found=검색 결과 없음 # Error panel labels error_more_info=정보 더 보기 error_less_info=정보 간단히 보기 error_close=닫기 # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (빌드: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=메시지: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=스택: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=파일: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=줄 번호: {{line}} rendering_error=페이지를 렌더링하다 오류가 났습니다. # Predefined zoom values page_scale_width=페이지 너비에 맞춤 page_scale_fit=페이지에 맞춤 page_scale_auto=알아서 맞춤 page_scale_actual=실제 크기에 맞춤 # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=오류 loading_error=PDF를 읽는 중 오류가 생겼습니다. invalid_file_error=유효하지 않거나 파손된 PDF 파일 missing_file_error=PDF 파일이 없습니다. unexpected_response_error=알 수 없는 서버 응답입니다. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} 주석] password_label=이 PDF 파일을 열 수 있는 암호를 입력하십시오. password_invalid=잘못된 암호입니다. 다시 시도해 주십시오. password_ok=확인 password_cancel=취소 printing_not_supported=경고: 이 브라우저는 인쇄를 완전히 지원하지 않습니다. printing_not_ready=경고: 이 PDF를 인쇄를 할 수 있을 정도로 읽어들이지 못했습니다. web_fonts_disabled=웹 폰트가 꺼져있음: 내장된 PDF 글꼴을 쓸 수 없습니다. document_colors_not_allowed=PDF 문서의 색상을 쓰지 못하게 되어 있음: '웹 페이지 자체 색상 사용 허용'이 브라우저에서 꺼져 있습니다. manuskript-0.10.0/libs/pdf.js/web/locale/ku/000077500000000000000000000000001354442177200205465ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/ku/viewer.properties000066400000000000000000000140021354442177200241620ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Rûpela berê previous_label=Paşve next.title=Rûpela pêş next_label=Pêş # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Rûpel: page_of=/ {{pageCount}} zoom_out.title=Dûr bike zoom_out_label=Dûr bike zoom_in.title=Nêzîk bike zoom_in_label=Nêzîk bike zoom.title=Nêzîk Bike presentation_mode.title=Derbasî mûda pêşkêşkariyê bibe presentation_mode_label=Moda Pêşkêşkariyê open_file.title=Pelî veke open_file_label=Veke print.title=Çap bike print_label=Çap bike download.title=Jêbar bike download_label=Jêbar bike bookmark.title=Xuyakirina niha (kopî yan jî di pencereyeke nû de veke) bookmark_label=Xuyakirina niha # Secondary toolbar and context menu tools.title=Amûr tools_label=Amûr first_page.title=Here rûpela yekemîn first_page.label=Here rûpela yekemîn first_page_label=Here rûpela yekemîn last_page.title=Here rûpela dawîn last_page.label=Here rûpela dawîn last_page_label=Here rûpela dawîn page_rotate_cw.title=Bi aliyê saetê ve bizivirîne page_rotate_cw.label=Bi aliyê saetê ve bizivirîne page_rotate_cw_label=Bi aliyê saetê ve bizivirîne page_rotate_ccw.title=Berevajî aliyê saetê ve bizivirîne page_rotate_ccw.label=Berevajî aliyê saetê ve bizivirîne page_rotate_ccw_label=Berevajî aliyê saetê ve bizivirîne # Document properties dialog box # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_title=Sernav: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Darikê kêlekê veke/bigire toggle_sidebar_label=Darikê kêlekê veke/bigire outline.title=Şemaya belgeyê nîşan bide outline_label=Şemaya belgeyê thumbs.title=Wênekokan nîşan bide thumbs_label=Wênekok findbar.title=Di belgeyê de bibîne findbar_label=Bibîne # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Rûpel {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Wênekoka rûpelê {{page}} # Find panel button title and messages find_label=Bibîne: find_previous.title=Peyva berê bibîne find_previous_label=Paşve find_next.title=Peyya pêş bibîne find_next_label=Pêşve find_highlight=Tevî beloq bike find_match_case_label=Ji bo tîpên hûrdek-girdek bihîstyar find_reached_top=Gihîşt serê rûpelê, ji dawiya rûpelê bidomîne find_reached_bottom=Gihîşt dawiya rûpelê, ji serê rûpelê bidomîne find_not_found=Peyv nehat dîtin # Error panel labels error_more_info=Zêdetir agahî error_less_info=Zêdetir agahî # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js versiyon {{version}} (avanî: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Peyam: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Komik: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Pel: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Rêzik: {{line}} rendering_error=Di vehûrandina rûpelê de çewtî çêbû. # Predefined zoom values page_scale_width=Firehiya rûpelê page_scale_fit=Di rûpelê de bicî bike page_scale_auto=Xweber nêzîk bike page_scale_actual=Mezinahiya rastîn # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. # Loading indicator messages loading_error_indicator=Xeletî loading_error=Dema ku PDF dihat barkirin çewtiyek çêbû. invalid_file_error=Pelê PDFê nederbasdar yan jî xirabe ye. missing_file_error=Pelê PDFê kêm e. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Nîşaneya {{type}}ê] password_label=Ji bo PDFê vekî şîfreyê binivîse. password_invalid=Şîfre çewt e. Tika ye dîsa biceribîne. password_ok=Temam password_cancel=Betal printing_not_supported=Hişyarî: Çapkirin ji hêla vê gerokê ve bi temamî nayê destekirin. printing_not_ready=Hişyarî: PDF bi temamî nehat barkirin û ji bo çapê ne amade ye. web_fonts_disabled=Fontên Webê neçalak in: Fontên PDFê yên veşartî nayên bikaranîn. document_colors_not_allowed=Destûr tune ye ku belgeyên PDFê rengên xwe bi kar bînin: Di gerokê de 'destûrê bide rûpelan ku rengên xwe bi kar bînin' nehatiye çalakirin. manuskript-0.10.0/libs/pdf.js/web/locale/lg/000077500000000000000000000000001354442177200205315ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/lg/viewer.properties000066400000000000000000000102671354442177200241560ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Omuko Ogubadewo next.title=Omuko Oguddako # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Omuko: page_of=ku {{pageCount}} zoom_out.title=Zimbulukusa zoom_out_label=Zimbulukusa zoom_in.title=Funza Munda zoom_in_label=Funza Munda zoom.title=Gezzamu open_file.title=Bikula Fayiro open_file_label=Ggulawo print.title=Fulumya print_label=Fulumya download.title=Tikula download_label=Tikula bookmark.title=Endabika eriwo (koppa oba gulawo mu diriisa epya) bookmark_label=Endabika Eriwo # Secondary toolbar and context menu # Document properties dialog box # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) outline.title=Laga Ensalo ze Kiwandiko outline_label=Ensalo ze Ekiwandiko thumbs.title=Laga Ekifanyi Mubufunze thumbs_label=Ekifanyi Mubufunze findbar_label=Zuula # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Omuko {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Ekifananyi kyo Omuko Mubufunze {{page}} # Find panel button title and messages find_previous.title=Zuula awayise mukweddamu mumiteddera find_next.title=Zuula ekidako mukweddamu mumiteddera find_highlight=Londa byonna find_not_found=Emiteddera tezuuliddwa # Error panel labels error_more_info=Ebisingawo error_less_info=Mubumpimpi # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Obubaaka: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Ebipangiddwa: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Fayiro {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Layini: {{line}} rendering_error=Wabadewo ensobi muku tekawo omuko. # Predefined zoom values page_scale_width=Obugazi bwo Omuko page_scale_fit=Okutuka kwo Omuko page_scale_auto=Okwefunza no Kwegeza page_scale_actual=Obunene Obutufu # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. # Loading indicator messages loading_error_indicator=Ensobi loading_error=Wabadewo ensobi mukutika PDF. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Enyonyola] password_ok=OK password_cancel=Sazaamu printing_not_supported=Okulaabula: Okulumya empapula tekuwagirwa enonyeso enno. manuskript-0.10.0/libs/pdf.js/web/locale/lij/000077500000000000000000000000001354442177200207055ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/lij/viewer.properties000066400000000000000000000115011354442177200243220ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. previous.title = Pagina precedente previous_label = Precedente next.title = Pagina dòppo next_label = Pròscima page_label = Pagina: page_of = de {{pageCount}} zoom_out.title = Diminoisci zoom zoom_out_label = Diminoisci zoom zoom_in.title = Aomenta zoom zoom_in_label = Aomenta zoom zoom.title = Zoom print.title = Stanpa print_label = Stanpa open_file.title = Arvi file open_file_label = Arvi download.title = Descaregamento download_label = Descaregamento bookmark.title = Vixon corente (còpia ò arvi inte 'n neuvo barcon) bookmark_label = Vixon corente outline.title = Veddi strutua documento outline_label = Strutua documento thumbs.title = Mostra miniatue thumbs_label = Miniatue thumb_page_title = Pagina {{page}} thumb_page_canvas = Miniatua da pagina {{page}} error_more_info = Ciù informaçioin error_less_info = Meno informaçioin error_version_info = PDF.js v{{version}} (build: {{build}}) error_close = Særa missing_file_error = O file PDF o no gh'é. toggle_sidebar.title = Ativa/dizativa bara de scianco toggle_sidebar_label = Ativa/dizativa bara de scianco error_message = Mesaggio: {{message}} error_stack = Stack: {{stack}} error_file = File: {{file}} error_line = Linia: {{line}} rendering_error = Gh'é stæto 'n'erô itno rendering da pagina. page_scale_width = Larghessa pagina page_scale_fit = Adatta a una pagina page_scale_auto = Zoom aotomatico page_scale_actual = Dimenscioin efetive loading_error_indicator = Erô loading_error = S'é verificou 'n'erô itno caregamento do PDF. printing_not_supported = Atençion: a stanpa a no l'é conpletamente soportâ da sto navegatô. # Context menu page_rotate_cw.label=Gia in senso do releuio page_rotate_ccw.label=Gia in senso do releuio a-a reversa presentation_mode.title=Vanni into mòddo de prezentaçion presentation_mode_label=Mòddo de prezentaçion find_label = Treuva: find_previous.title = Treuva a ripetiçion precedente do testo da çercâ find_previous_label = Precedente find_next.title = Treuva a ripetiçion dòppo do testo da çercâ find_next_label = Segoente find_highlight = Evidençia find_match_case_label = Maioscole/minoscole find_reached_bottom = Razonto l'iniçio da pagina, continoa da-a fin find_reached_top = Razonto a fin da pagina, continoa da l'iniçio find_not_found = Testo no trovou findbar.title = Treuva into documento findbar_label = Treuva first_page.label = Vanni a-a primma pagina last_page.label = Vanni a l'urtima pagina invalid_file_error = O file PDF o l'é no valido ò aroinou. web_fonts_disabled = I font do web en dizativæ: inposcibile adeuviâ i carateri do PDF. printing_not_ready = Atençion: o PDF o no l'é ancon caregou conpletamente pe-a stanpa. document_colors_not_allowed = No l'é poscibile adeuviâ i pròpi coî pe-i documenti PDF: l'opçion do navegatô “Permetti a-e pagine de çerne i pròpi coî in cangio de quelli inpostæ” a l'é dizativâ. text_annotation_type.alt = [Anotaçion: {{type}}] first_page.title = Vanni a-a primma pagina first_page_label = Vanni a-a primma pagina last_page.title = Vanni a l'urtima pagina last_page_label = Vanni a l'urtima pagina page_rotate_ccw.title = Gia into verso antioraio page_rotate_ccw_label = Gia into verso antioraio page_rotate_cw.title = Gia into verso oraio page_rotate_cw_label = Gia into verso oraio tools.title = Strumenti tools_label = Strumenti password_label = Dimme a paròlla segreta pe arvî sto file PDF. password_invalid = Paròlla segreta sbalia. Preuva torna. password_ok = Va ben password_cancel = Anulla document_properties.title = Propietæ do documento… document_properties_label = Propietæ do documento… document_properties_file_name = Nomme file: document_properties_file_size = Dimenscion file: document_properties_kb = {{size_kb}} kB ({{size_b}} byte) document_properties_mb = {{size_kb}} MB ({{size_b}} byte) document_properties_title = Titolo: document_properties_author = Aoto: document_properties_subject = Ogetto: document_properties_keywords = Paròlle ciave: document_properties_creation_date = Dæta creaçion: document_properties_modification_date = Dæta cangiamento: document_properties_date_string = {{date}}, {{time}} document_properties_creator = Aotô originale: document_properties_producer = Produtô PDF: document_properties_version = Verscion PDF: document_properties_page_count = Contezzo pagine: document_properties_close = Særa hand_tool_enable.title = Ativa strumento man hand_tool_enable_label = Ativa strumento man hand_tool_disable.title = Dizativa strumento man hand_tool_disable_label = Dizativa strumento man attachments.title = Fanni vedde alegæ attachments_label = Alegæ page_scale_percent = {{scale}}% unexpected_response_error = Risposta inprevista do-u server manuskript-0.10.0/libs/pdf.js/web/locale/locale.properties000066400000000000000000000103321354442177200235030ustar00rootroot00000000000000[ach] @import url(ach/viewer.properties) [af] @import url(af/viewer.properties) [ak] @import url(ak/viewer.properties) [an] @import url(an/viewer.properties) [ar] @import url(ar/viewer.properties) [as] @import url(as/viewer.properties) [ast] @import url(ast/viewer.properties) [az] @import url(az/viewer.properties) [be] @import url(be/viewer.properties) [bg] @import url(bg/viewer.properties) [bn-BD] @import url(bn-BD/viewer.properties) [bn-IN] @import url(bn-IN/viewer.properties) [br] @import url(br/viewer.properties) [bs] @import url(bs/viewer.properties) [ca] @import url(ca/viewer.properties) [cs] @import url(cs/viewer.properties) [csb] @import url(csb/viewer.properties) [cy] @import url(cy/viewer.properties) [da] @import url(da/viewer.properties) [de] @import url(de/viewer.properties) [el] @import url(el/viewer.properties) [en-GB] @import url(en-GB/viewer.properties) [en-US] @import url(en-US/viewer.properties) [en-ZA] @import url(en-ZA/viewer.properties) [eo] @import url(eo/viewer.properties) [es-AR] @import url(es-AR/viewer.properties) [es-CL] @import url(es-CL/viewer.properties) [es-ES] @import url(es-ES/viewer.properties) [es-MX] @import url(es-MX/viewer.properties) [et] @import url(et/viewer.properties) [eu] @import url(eu/viewer.properties) [fa] @import url(fa/viewer.properties) [ff] @import url(ff/viewer.properties) [fi] @import url(fi/viewer.properties) [fr] @import url(fr/viewer.properties) [fy-NL] @import url(fy-NL/viewer.properties) [ga-IE] @import url(ga-IE/viewer.properties) [gd] @import url(gd/viewer.properties) [gl] @import url(gl/viewer.properties) [gu-IN] @import url(gu-IN/viewer.properties) [he] @import url(he/viewer.properties) [hi-IN] @import url(hi-IN/viewer.properties) [hr] @import url(hr/viewer.properties) [hu] @import url(hu/viewer.properties) [hy-AM] @import url(hy-AM/viewer.properties) [id] @import url(id/viewer.properties) [is] @import url(is/viewer.properties) [it] @import url(it/viewer.properties) [ja] @import url(ja/viewer.properties) [ka] @import url(ka/viewer.properties) [kk] @import url(kk/viewer.properties) [km] @import url(km/viewer.properties) [kn] @import url(kn/viewer.properties) [ko] @import url(ko/viewer.properties) [ku] @import url(ku/viewer.properties) [lg] @import url(lg/viewer.properties) [lij] @import url(lij/viewer.properties) [lt] @import url(lt/viewer.properties) [lv] @import url(lv/viewer.properties) [mai] @import url(mai/viewer.properties) [mk] @import url(mk/viewer.properties) [ml] @import url(ml/viewer.properties) [mn] @import url(mn/viewer.properties) [mr] @import url(mr/viewer.properties) [ms] @import url(ms/viewer.properties) [my] @import url(my/viewer.properties) [nb-NO] @import url(nb-NO/viewer.properties) [nl] @import url(nl/viewer.properties) [nn-NO] @import url(nn-NO/viewer.properties) [nso] @import url(nso/viewer.properties) [oc] @import url(oc/viewer.properties) [or] @import url(or/viewer.properties) [pa-IN] @import url(pa-IN/viewer.properties) [pl] @import url(pl/viewer.properties) [pt-BR] @import url(pt-BR/viewer.properties) [pt-PT] @import url(pt-PT/viewer.properties) [rm] @import url(rm/viewer.properties) [ro] @import url(ro/viewer.properties) [ru] @import url(ru/viewer.properties) [rw] @import url(rw/viewer.properties) [sah] @import url(sah/viewer.properties) [si] @import url(si/viewer.properties) [sk] @import url(sk/viewer.properties) [sl] @import url(sl/viewer.properties) [son] @import url(son/viewer.properties) [sq] @import url(sq/viewer.properties) [sr] @import url(sr/viewer.properties) [sv-SE] @import url(sv-SE/viewer.properties) [sw] @import url(sw/viewer.properties) [ta] @import url(ta/viewer.properties) [ta-LK] @import url(ta-LK/viewer.properties) [te] @import url(te/viewer.properties) [th] @import url(th/viewer.properties) [tl] @import url(tl/viewer.properties) [tn] @import url(tn/viewer.properties) [tr] @import url(tr/viewer.properties) [uk] @import url(uk/viewer.properties) [ur] @import url(ur/viewer.properties) [vi] @import url(vi/viewer.properties) [wo] @import url(wo/viewer.properties) [xh] @import url(xh/viewer.properties) [zh-CN] @import url(zh-CN/viewer.properties) [zh-TW] @import url(zh-TW/viewer.properties) [zu] @import url(zu/viewer.properties) manuskript-0.10.0/libs/pdf.js/web/locale/lt/000077500000000000000000000000001354442177200205465ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/lt/viewer.properties000066400000000000000000000164111354442177200241700ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Ankstesnis puslapis previous_label=Ankstesnis next.title=Kitas puslapis next_label=Kitas # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Puslapis: page_of=iš {{pageCount}} zoom_out.title=Sumažinti zoom_out_label=Sumažinti zoom_in.title=Padidinti zoom_in_label=Padidinti zoom.title=Mastelis presentation_mode.title=Pereiti į pateikties veikseną presentation_mode_label=Pateikties veiksena open_file.title=Atverti failą open_file_label=Atverti print.title=Spausdinti print_label=Spausdinti download.title=Parsiųsti download_label=Parsiųsti bookmark.title=Esamojo rodinio saitas (kopijavimui ar atvėrimui kitame lange) bookmark_label=Esamasis rodinys # Secondary toolbar and context menu tools.title=Priemonės tools_label=Priemonės first_page.title=Eiti į pirmą puslapį first_page.label=Eiti į pirmą puslapį first_page_label=Eiti į pirmą puslapį last_page.title=Eiti į paskutinį puslapį last_page.label=Eiti į paskutinį puslapį last_page_label=Eiti į paskutinį puslapį page_rotate_cw.title=Pasukti pagal laikrodžio rodyklę page_rotate_cw.label=Pasukti pagal laikrodžio rodyklę page_rotate_cw_label=Pasukti pagal laikrodžio rodyklę page_rotate_ccw.title=Pasukti prieš laikrodžio rodyklę page_rotate_ccw.label=Pasukti prieš laikrodžio rodyklę page_rotate_ccw_label=Pasukti prieš laikrodžio rodyklę hand_tool_enable.title=Įgalinti vilkimo veikseną hand_tool_enable_label=Įgalinti vilkimo veikseną hand_tool_disable.title=Išjungti vilkimo veikseną hand_tool_disable_label=Išjungti vilkimo veikseną # Document properties dialog box document_properties.title=Dokumento savybės… document_properties_label=Dokumento savybės… document_properties_file_name=Failo vardas: document_properties_file_size=Failo dydis: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} B) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} B) document_properties_title=Antraštė: document_properties_author=Autorius: document_properties_subject=Tema: document_properties_keywords=Reikšminiai žodžiai: document_properties_creation_date=Sukūrimo data: document_properties_modification_date=Modifikavimo data: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Kūrėjas: document_properties_producer=PDF generatorius: document_properties_version=PDF versija: document_properties_page_count=Puslapių skaičius: document_properties_close=Užverti # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Rodyti / slėpti šoninį polangį toggle_sidebar_label=Šoninis polangis outline.title=Rodyti dokumento metmenis outline_label=Dokumento metmenys attachments.title=Rodyti priedus attachments_label=Priedai thumbs.title=Rodyti puslapių miniatiūras thumbs_label=Miniatiūros findbar.title=Ieškoti dokumente findbar_label=Ieškoti # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title={{page}} puslapis # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas={{page}} puslapio miniatiūra # Find panel button title and messages find_label=Ieškoti: find_previous.title=Ieškoti ankstesnio frazės egzemplioriaus find_previous_label=Ankstesnis find_next.title=Ieškoti tolesnio frazės egzemplioriaus find_next_label=Tolesnis find_highlight=Viską paryškinti find_match_case_label=Skirti didžiąsias ir mažąsias raides find_reached_top=Pasiekus dokumento pradžią, paieška pratęsta nuo pabaigos find_reached_bottom=Pasiekus dokumento pabaigą, paieška pratęsta nuo pradžios find_not_found=Ieškoma frazė nerasta # Error panel labels error_more_info=Išsamiau error_less_info=Glausčiau error_close=Užverti # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v. {{version}} (darinys: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Pranešimas: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Dėklas: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Failas: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Eilutė: {{line}} rendering_error=Atvaizduojant puslapį, įvyko klaida. # Predefined zoom values page_scale_width=Priderinti prie lapo pločio page_scale_fit=Pritaikyti prie lapo dydžio page_scale_auto=Automatinis mastelis page_scale_actual=Tikras dydis # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Klaida loading_error=Įkeliant PDF failą, įvyko klaida. invalid_file_error=Tai nėra PDF failas arba jis yra sugadintas. missing_file_error=PDF failas nerastas. unexpected_response_error=Netikėtas serverio atsakas. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[„{{type}}“ tipo anotacija] password_label=Įveskite slaptažodį šiam PDF failui atverti. password_invalid=Slaptažodis neteisingas. Bandykite dar kartą. password_ok=Gerai password_cancel=Atsisakyti printing_not_supported=Dėmesio! Spausdinimas šioje naršyklėje nėra pilnai realizuotas. printing_not_ready=Dėmesio! PDF failas dar nėra pilnai įkeltas spausdinimui. web_fonts_disabled=Neįgalinti saityno šriftai – šiame PDF faile esančių šriftų naudoti negalima. document_colors_not_allowed=PDF dokumentams neleidžiama nurodyti savo spalvų, nes išjungta naršyklės nuostata „Leisti tinklalapiams nurodyti spalvas“. manuskript-0.10.0/libs/pdf.js/web/locale/lv/000077500000000000000000000000001354442177200205505ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/lv/viewer.properties000066400000000000000000000157041354442177200241760ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Iepriekšējā lapa previous_label=Iepriekšējā next.title=Nākamā lapa next_label=Nākamā # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Lapa: page_of=no {{pageCount}} zoom_out.title=Attālināt\u0020 zoom_out_label=Attālināt zoom_in.title=Pietuvināt zoom_in_label=Pietuvināt zoom.title=Palielinājums presentation_mode.title=Pārslēgties uz Prezentācijas režīmu presentation_mode_label=Prezentācijas režīms open_file.title=Atvērt failu open_file_label=Atvērt print.title=Drukāšana print_label=Drukāt download.title=Lejupielāde download_label=Lejupielādēt bookmark.title=Pašreizējais skats (kopēt vai atvērt jaunā logā) bookmark_label=Pašreizējais skats # Secondary toolbar and context menu tools.title=Rīki tools_label=Rīki first_page.title=Iet uz pirmo lapu first_page.label=Iet uz pirmo lapu first_page_label=Iet uz pirmo lapu last_page.title=Iet uz pēdējo lapu last_page.label=Iet uz pēdējo lapu last_page_label=Iet uz pēdējo lapu page_rotate_cw.title=Pagriezt pa pulksteni page_rotate_cw.label=Pagriezt pa pulksteni page_rotate_cw_label=Pagriezt pa pulksteni page_rotate_ccw.title=Pagriezt pret pulksteni page_rotate_ccw.label=Pagriezt pret pulksteni page_rotate_ccw_label=Pagriezt pret pulksteni hand_tool_enable.title=Aktivēt rokas rīku hand_tool_enable_label=Aktivēt rokas rīku hand_tool_disable.title=Deaktivēt rokas rīku hand_tool_disable_label=Deaktivēt rokas rīku # Document properties dialog box document_properties.title=Dokumenta iestatījumi… document_properties_label=Dokumenta iestatījumi… document_properties_file_name=Faila nosaukums: document_properties_file_size=Faila izmērs: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} biti) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} biti) document_properties_title=Nosaukums: document_properties_author=Autors: document_properties_subject=Tēma: document_properties_keywords=Atslēgas vārdi: document_properties_creation_date=Izveides datums: document_properties_modification_date=LAbošanas datums: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Radītājs: document_properties_producer=PDF producents: document_properties_version=PDF versija: document_properties_page_count=Lapu skaits: document_properties_close=Aizvērt # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Pārslēgt sānu joslu toggle_sidebar_label=Pārslēgt sānu joslu outline.title=Parādīt dokumenta saturu outline_label=Dokumenta saturs attachments.title=Rādīt pielikumus attachments_label=Pielikumi thumbs.title=Parādīt sīktēlus thumbs_label=Sīktēli findbar.title=Meklēt dokumentā findbar_label=Meklēt # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Lapa {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Lapas {{page}} sīktēls # Find panel button title and messages find_label=Meklēt: find_previous.title=Atrast iepriekšējo find_previous_label=Iepriekšējā find_next.title=Atrast nākamo find_next_label=Nākamā find_highlight=Iekrāsot visas find_match_case_label=Lielo, mazo burtu jutīgs find_reached_top=Sasniegts dokumenta sākums, turpinām no beigām find_reached_bottom=Sasniegtas dokumenta beigas, turpinām no sākuma find_not_found=Frāze nav atrasta # Error panel labels error_more_info=Vairāk informācijas error_less_info=MAzāk informācijas error_close=Close # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Ziņojums: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Steks: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=File: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Rindiņa: {{line}} rendering_error=Attēlojot lapu radās kļūda # Predefined zoom values page_scale_width=Lapas platumā page_scale_fit=Ietilpinot lapu page_scale_auto=Automātiskais izmērs page_scale_actual=Patiesais izmērs # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Kļūda loading_error=Ielādējot PDF notika kļūda. invalid_file_error=Nederīgs vai bojāts PDF fails. missing_file_error=PDF fails nav atrasts. unexpected_response_error=Negaidīa servera atbilde. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} anotācija] password_label=Ievadiet paroli, lai atvērtu PDF failu. password_invalid=Nepareiza parole, mēģiniet vēlreiz. password_ok=Labi password_cancel=Atcelt printing_not_supported=Uzmanību: Drukāšana no šī pārlūka darbojas tikai daļēji. printing_not_ready=Uzmanību: PDF nav pilnībā ielādēts drukāšanai. web_fonts_disabled=Tīmekļa fonti nav aktivizēti: Nevar iegult PDF fontus. document_colors_not_allowed=PDF dokumentiem nav atļauts izmantot pašiem savas krāsas: „Atļaut lapām izvēlēties pašām savas krāsas“ ir deaktivēts pārlūkā. manuskript-0.10.0/libs/pdf.js/web/locale/mai/000077500000000000000000000000001354442177200206755ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/mai/viewer.properties000066400000000000000000000227321354442177200243220ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=पछिला पृष्ठ previous_label=पछिला next.title=अगिला पृष्ठ next_label=आगाँ # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=पृष्ठ: page_of={{pageCount}} क zoom_out.title=छोट करू zoom_out_label=छोट करू zoom_in.title=पैघ करू zoom_in_label=जूम इन zoom.title=छोट-पैघ करू\u0020 presentation_mode.title=प्रस्तुति अवस्थामे जाउ presentation_mode_label=प्रस्तुति अवस्था open_file.title=फाइल खोलू open_file_label=खोलू print.title=छापू print_label=छापू download.title=डाउनलोड download_label=डाउनलोड bookmark.title=मोजुदा दृश्य (नव विंडोमे नकल लिअ अथवा खोलू) bookmark_label=वर्तमान दृश्य # Secondary toolbar and context menu tools.title=अओजार tools_label=अओजार first_page.title=प्रथम पृष्ठ पर जाउ first_page.label=प्रथम पृष्ठ पर जाउ first_page_label=प्रथम पृष्ठ पर जाउ last_page.title=अंतिम पृष्ठ पर जाउ last_page.label=अंतिम पृष्ठ पर जाउ last_page_label=अंतिम पृष्ठ पर जाउ page_rotate_cw.title=घड़ीक दिशा मे घुमाउ page_rotate_cw.label=घड़ीक दिशा मे घुमाउ page_rotate_cw_label=घड़ीक दिशा मे घुमाउ page_rotate_ccw.title=घड़ीक दिशा सँ उनटा घुमाउ page_rotate_ccw.label=घड़ीक दिशा सँ उनटा घुमाउ page_rotate_ccw_label=घड़ीक दिशा सँ उनटा घुमाउ hand_tool_enable.title=हाथ अओजार सक्रिय करू hand_tool_enable_label=हाथ अओजार सक्रिय करू hand_tool_disable.title=हाथ अओजार निष्क्रिय कएनाइ hand_tool_disable_label=हाथ अओजार निष्क्रिय कएनाइ # Document properties dialog box document_properties.title=दस्तावेज़ विशेषता... document_properties_label=दस्तावेज़ विशेषता... document_properties_file_name=फाइल नाम: document_properties_file_size=फ़ाइल आकार: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} बाइट) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} बाइट) document_properties_title=शीर्षक: document_properties_author=लेखकः document_properties_subject=विषय document_properties_keywords=बीजशब्द document_properties_creation_date=निर्माण तिथि: document_properties_modification_date=संशोधन दिनांक: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=सृजक: document_properties_producer=PDF उत्पादक: document_properties_version=PDF संस्करण: document_properties_page_count=पृष्ठ गिनती: document_properties_close=बन्न करू # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=स्लाइडर टागल toggle_sidebar_label=स्लाइडर टागल outline.title=दस्तावेज आउटलाइन देखाउ outline_label=दस्तावेज खाका attachments.title=संलग्नक देखाबू attachments_label=संलग्नक thumbs.title=लघु-छवि देखाउ thumbs_label=लघु छवि findbar.title=दस्तावेजमे ढूँढू findbar_label=ताकू # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=पृष्ठ {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=पृष्ठ {{page}} का लघु-चित्र # Find panel button title and messages find_label=ताकू: find_previous.title=खोजक पछिला उपस्थिति ताकू find_previous_label=पछिला find_next.title=खोजक अगिला उपस्थिति ताकू find_next_label=आगाँ find_highlight=सभटा आलोकित करू find_match_case_label=मिलान स्थिति find_reached_top=पृष्ठक शीर्ष जाए पहुँचल, तल सँ जारी find_reached_bottom=पृष्ठक तल मे जाए पहुँचल, शीर्ष सँ जारी find_not_found=वाकींश नहि भेटल # Error panel labels error_more_info=बेसी सूचना error_less_info=कम सूचना error_close=बन्न करू # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=संदेश: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=स्टैक: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=फ़ाइल: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=पंक्ति: {{line}} rendering_error=पृष्ठ रेंडरिंगक समय त्रुटि आएल. # Predefined zoom values page_scale_width=पृष्ठ चओड़ाइ page_scale_fit=पृष्ठ फिट page_scale_auto=स्वचालित जूम page_scale_actual=सही आकार # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=त्रुटि loading_error=पीडीएफ लोड करैत समय एकटा त्रुटि भेल. invalid_file_error=अमान्य अथवा भ्रष्ट PDF फाइल. missing_file_error=अनुपस्थित PDF फाइल. unexpected_response_error=सर्वर सँ अप्रत्याशित प्रतिक्रिया. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Annotation] password_label=एहि पीडीएफ फ़ाइल केँ खोलबाक लेल कृपया कूटशब्द भरू. password_invalid=अवैध कूटशब्द, कृपया फिनु कोशिश करू. password_ok=बेस password_cancel=रद्द करू\u0020 printing_not_supported=चेतावनी: ई ब्राउजर पर छपाइ पूर्ण तरह सँ समर्थित नहि अछि. printing_not_ready=चेतावनी: पीडीएफ छपाइक लेल पूर्ण तरह सँ लोड नहि अछि. web_fonts_disabled=वेब फॉन्ट्स निष्क्रिय अछि: अंतःस्थापित PDF फान्टसक उपयोगमे असमर्थ. document_colors_not_allowed=PDF दस्तावेज़ हुकर अपन रंग केँ उपयोग करबाक लेल अनुमति प्राप्त नहि अछि: 'पृष्ठ केँ हुकर अपन रंग केँ चुनबाक लेल स्वीकृति दिअ जे ओ ओहि ब्राउज़र मे निष्क्रिय अछि. manuskript-0.10.0/libs/pdf.js/web/locale/mk/000077500000000000000000000000001354442177200205365ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/mk/viewer.properties000066400000000000000000000136411354442177200241620ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # Main toolbar buttons (tooltips and alt text for images) previous.title=Претходна страница previous_label=Претходна next.title=Следна страница next_label=Следна # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Страница: page_of=од {{pageCount}} zoom_out.title=Намалување zoom_out_label=Намали zoom_in.title=Зголемување zoom_in_label=Зголеми zoom.title=Променување на големина print.title=Печатење print_label=Печати open_file.title=Отварање датотека open_file_label=Отвори download.title=Преземање download_label=Преземи bookmark.title=Овој преглед (копирај или отвори во нов прозорец) bookmark_label=Овој преглед # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_slider.title=Вклучување на лизгач toggle_slider_label=Вклучи лизгач outline.title=Прикажување на содржина на документот outline_label=Содржина на документот thumbs.title=Прикажување на икони thumbs_label=Икони # Document outline messages no_outline=Нема содржина # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Страница {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Икона од страница {{page}} # Error panel labels error_more_info=Повеќе информации error_less_info=Помалку информации error_close=Затвори # LOCALIZATION NOTE (error_build): "{{build}}" will be replaced by the PDF.JS # build ID. error_build=PDF.JS Build: {{build}} # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Порака: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stack: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Датотека: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Линија: {{line}} rendering_error=Настана грешка при прикажувањето на страницата. # Predefined zoom values page_scale_width=Ширина на страница page_scale_fit=Цела страница page_scale_auto=Автоматска големина page_scale_actual=Вистинска големина loading_error_indicator=Грешка loading_error=Настана грешка при вчитувањето на PDF-от. # LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip. # "{{[type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type=[{{type}} Забелешка] request_password=PDF-от е заштитен со лозинка: printing_not_supported=Предупредување: Печатењето не е целосно поддржано во овој прелистувач. find_highlight=Означи сѐ # Find panel button title and messages find_label=Најди: find_match_case_label=Токму така find_next.title=Најди ја следната појава на фразата find_next_label=Следно find_not_found=Фразата не е пронајдена find_previous.title=Најди ја предходната појава на фразата find_previous_label=Претходно find_reached_bottom=Барањето стигна до крајот на документот и почнува од почеток find_reached_top=Барањето стигна до почетокот на документот и почнува од крајот findbar.title=Најди во документот findbar_label=Најди # Context menu first_page.label=Оди до првата страница invalid_file_error=Невалидна или корумпирана PDF датотека. last_page.label=Оди до последната страница page_rotate_ccw.label=Ротирај спротивно од стрелките на часовникот page_rotate_cw.label=Ротирај по стрелките на часовникот presentation_mode.title=Премини во презентациски режим presentation_mode_label=Презентациски режим # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) missing_file_error=Недостасува PDF документ. printing_not_ready=Предупредување: PDF документот не е целосно вчитан за печатење. # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Вклучи странична лента toggle_sidebar_label=Вклучи странична лента web_fonts_disabled=Интернет фонтовите се оневозможени: не може да се користат вградените PDF фонтови. manuskript-0.10.0/libs/pdf.js/web/locale/ml/000077500000000000000000000000001354442177200205375ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/ml/viewer.properties000066400000000000000000000301071354442177200241570ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=മുമ്പുള്ള താള്‍ previous_label=മുമ്പു് next.title=അടുത്ത താള്‍ next_label=അടുത്തതു് # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=താള്‍: page_of={{pageCount}} zoom_out.title=ചെറുതാക്കുക zoom_out_label=ചെറുതാക്കുക zoom_in.title=വലുതാക്കുക zoom_in_label=വലുതാക്കുക zoom.title=വ്യാപ്തി മാറ്റുക presentation_mode.title=പ്രസന്റേഷന്‍ രീതിയിലേക്കു് മാറ്റുക presentation_mode_label=പ്രസന്റേഷന്‍ രീതി open_file.title=ഫയല്‍ തുറക്കുക open_file_label=തുറക്കുക print.title=പ്രിന്റ് ചെയ്യുക print_label=പ്രിന്റ് ചെയ്യുക download.title=ഡൌണ്‍ലോഡ് ചെയ്യുക download_label=ഡൌണ്‍ലോഡ് ചെയ്യുക bookmark.title=നിലവിലുള്ള കാഴ്ച (പുതിയ ജാലകത്തില്‍ പകര്‍ത്തുക അല്ലെങ്കില്‍ തുറക്കുക) bookmark_label=നിലവിലുള്ള കാഴ്ച # Secondary toolbar and context menu tools.title=ഉപകരണങ്ങള്‍ tools_label=ഉപകരണങ്ങള്‍ first_page.title=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക first_page.label=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക first_page_label=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക last_page.title=അവസാന താളിലേയ്ക്കു് പോകുക last_page.label=അവസാന താളിലേയ്ക്കു് പോകുക last_page_label=അവസാന താളിലേയ്ക്കു് പോകുക page_rotate_cw.title=ഘടികാരദിശയില്‍ കറക്കുക page_rotate_cw.label=ഘടികാരദിശയില്‍ കറക്കുക page_rotate_cw_label=ഘടികാരദിശയില്‍ കറക്കുക page_rotate_ccw.title=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക page_rotate_ccw.label=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക page_rotate_ccw_label=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക hand_tool_enable.title=ഹാന്‍ഡ് ടൂള്‍ പ്രവര്‍ത്തന സജ്ജമാക്കുക hand_tool_enable_label=ഹാന്‍ഡ് ടൂള്‍ പ്രവര്‍ത്തന സജ്ജമാക്കുക hand_tool_disable.title=ഹാന്‍ഡ് ടൂള്‍ പ്രവര്‍ത്തന രഹിതമാക്കുക hand_tool_disable_label=ഹാന്‍ഡ് ടൂള്‍ പ്രവര്‍ത്തന രഹിതമാക്കുക # Document properties dialog box document_properties.title=രേഖയുടെ വിശേഷതകള്‍... document_properties_label=രേഖയുടെ വിശേഷതകള്‍... document_properties_file_name=ഫയലിന്റെ പേര്‌: document_properties_file_size=ഫയലിന്റെ വലിപ്പം:‌‌ # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} കെബി ({{size_b}} ബൈറ്റുകള്‍) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} എംബി ({{size_b}} ബൈറ്റുകള്‍) document_properties_title=തലക്കെട്ട്‌\u0020 document_properties_author=രചയിതാവ്: document_properties_subject=വിഷയം: document_properties_keywords=കീവേര്‍ഡുകള്‍: document_properties_creation_date=പൂര്‍ത്തിയാകുന്ന തീയതി: document_properties_modification_date=മാറ്റം വരുത്തിയ തീയതി: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=സൃഷ്ടികര്‍ത്താവ്: document_properties_producer=പിഡിഎഫ് പ്രൊഡ്യൂസര്‍: document_properties_version=പിഡിഎഫ് പതിപ്പ്: document_properties_page_count=താളിന്റെ എണ്ണം: document_properties_close=അടയ്ക്കുക # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=സൈഡ് ബാറിലേക്കു് മാറ്റുക toggle_sidebar_label=സൈഡ് ബാറിലേക്കു് മാറ്റുക outline.title=രേഖയുടെ ഔട്ട്ലൈന്‍ കാണിയ്ക്കുക outline_label=രേഖയുടെ ഔട്ട്ലൈന്‍ attachments.title=അറ്റാച്മെന്റുകള്‍ കാണിയ്ക്കുക attachments_label=അറ്റാച്മെന്റുകള്‍ thumbs.title=തംബ്നെയിലുകള്‍ കാണിയ്ക്കുക thumbs_label=തംബ്നെയിലുകള്‍ findbar.title=രേഖയില്‍ കണ്ടുപിടിയ്ക്കുക findbar_label=കണ്ടെത്തുക\u0020 # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=താള്‍ {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas={{page}} താളിനുള്ള തംബ്നെയില്‍ # Find panel button title and messages find_label=കണ്ടെത്തുക find_previous.title=വാചകം ഇതിനു മുന്‍പ്‌ ആവര്‍ത്തിച്ചത്‌ കണ്ടെത്തുക\u0020 find_previous_label=മുമ്പു് find_next.title=വാചകം വീണ്ടും ആവര്‍ത്തിക്കുന്നത്‌ കണ്ടെത്തുക\u0020 find_next_label=അടുത്തതു് find_highlight=എല്ലാം എടുത്തുകാണിയ്ക്കുക find_match_case_label=അക്ഷരങ്ങള്‍ ഒത്തുനോക്കുക find_reached_top=രേഖയുടെ മുകളില്‍ എത്തിയിരിക്കുന്നു, താഴെ നിന്നും തുടരുന്നു find_reached_bottom=രേഖയുടെ അവസാനം വരെ എത്തിയിരിക്കുന്നു, മുകളില്‍ നിന്നും തുടരുന്നു\u0020 find_not_found=വാചകം കണ്ടെത്താനായില്ല\u0020 # Error panel labels error_more_info=കൂടുതല്‍ വിവരം error_less_info=കുറച്ച് വിവരം error_close=അടയ്ക്കുക # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=സന്ദേശം: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=സ്റ്റാക്ക്: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=ഫയല്‍: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=വരി: {{line}} rendering_error=താള്‍ റെണ്ടര്‍ ചെയ്യുമ്പോള്‍‌ പിശകുണ്ടായിരിയ്ക്കുന്നു. # Predefined zoom values page_scale_width=താളിന്റെ വീതി page_scale_fit=താള്‍ പാകത്തിനാക്കുക page_scale_auto=സ്വയമായി വലുതാക്കുക page_scale_actual=യഥാര്‍ത്ഥ വ്യാപ്തി # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=പിശക് loading_error=പിഡിഎഫ് ലഭ്യമാക്കുമ്പോള്‍ പിശക് ഉണ്ടായിരിയ്ക്കുന്നു. invalid_file_error=തെറ്റായ അല്ലെങ്കില്‍ തകരാറുള്ള പിഡിഎഫ് ഫയല്‍. missing_file_error=പിഡിഎഫ് ഫയല്‍ ലഭ്യമല്ല. unexpected_response_error=പ്രതീക്ഷിക്കാത്ത സെര്‍വര്‍ മറുപടി. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Annotation] password_label=ഈ പിഡിഎഫ് ഫയല്‍ തുറക്കുന്നതിനു് രഹസ്യവാക്ക് നല്‍കുക. password_invalid=തെറ്റായ രഹസ്യവാക്ക്, ദയവായി വീണ്ടും ശ്രമിയ്ക്കുക. password_ok=ശരി password_cancel=റദ്ദാക്കുക printing_not_supported=മുന്നറിയിപ്പു്: ഈ ബ്രൌസര്‍ പൂര്‍ണ്ണമായി പ്രിന്റിങ് പിന്തുണയ്ക്കുന്നില്ല. printing_not_ready=മുന്നറിയിപ്പു്: പ്രിന്റ് ചെയ്യുന്നതിനു് പിഡിഎഫ് പൂര്‍ണ്ണമായി ലഭ്യമല്ല. web_fonts_disabled=വെബിനുള്ള അക്ഷരസഞ്ചയങ്ങള്‍ പ്രവര്‍ത്തന രഹിതം: എംബഡ്ഡ് ചെയ്ത പിഡിഎഫ് അക്ഷരസഞ്ചയങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ സാധ്യമല്ല. document_colors_not_allowed=സ്വന്തം നിറങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ പിഡിഎഫ് രേഖകള്‍ക്കു് അനുവാദമില്ല: 'സ്വന്തം നിറങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ താളുകളെ അനുവദിയ്ക്കുക' എന്നതു് ബ്രൌസറില്‍ നിര്‍ജീവമാണു്. manuskript-0.10.0/libs/pdf.js/web/locale/mn/000077500000000000000000000000001354442177200205415ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/mn/viewer.properties000066400000000000000000000063221354442177200241630ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. zoom.title=Тэлэлт open_file.title=Файл нээ open_file_label=Нээ # Secondary toolbar and context menu # Document properties dialog box document_properties_file_name=Файлын нэр: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_title=Гарчиг: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) findbar_label=Ол # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. # Find panel button title and messages find_previous.title=Хайлтын өмнөх олдцыг харуулна find_next.title=Хайлтын дараагийн олдцыг харуулна find_not_found=Олдсонгүй # Error panel labels error_more_info=Нэмэлт мэдээлэл # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number # Predefined zoom values # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. # Loading indicator messages loading_error_indicator=Алдаа # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" password_ok=OK password_cancel=Цуцал manuskript-0.10.0/libs/pdf.js/web/locale/mr/000077500000000000000000000000001354442177200205455ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/mr/viewer.properties000066400000000000000000000235101354442177200241650ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=मागील पृष्ठ previous_label=मागील next.title=पुढील पृष्ठ next_label=पुढील # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=पृष्ठ: page_of=पैकी {{pageCount}} zoom_out.title=छोटे करा zoom_out_label=छोटे करा zoom_in.title=मोठे करा zoom_in_label=मोठे करा zoom.title=लहान किंवा मोठे करा presentation_mode.title=प्रस्तुतिकरण मोडचा वापर करा presentation_mode_label=प्रस्तुतिकरण मोड open_file.title=फाइल उघडा open_file_label=उघडा print.title=छपाई करा print_label=छपाई करा download.title=डाउनलोड करा download_label=डाउनलोड करा bookmark.title=सध्याचे अवलोकन (नवीन पटलात प्रत बनवा किंवा उघडा) bookmark_label=सध्याचे अवलोकन # Secondary toolbar and context menu tools.title=साधने tools_label=साधने first_page.title=पहिल्या पानावर जा first_page.label=पहिल्या पानावर जा first_page_label=पहिल्या पानावर जा last_page.title=शेवटच्या पानावर जा last_page.label=शेवटच्या पानावर जा last_page_label=शेवटच्या पानावर जा page_rotate_cw.title=घड्याळाच्या काट्याच्या दिशेने फिरवा page_rotate_cw.label=घड्याळाच्या काट्याच्या दिशेने फिरवा page_rotate_cw_label=घड्याळाच्या काट्याच्या दिशेने फिरवा page_rotate_ccw.title=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा page_rotate_ccw.label=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा page_rotate_ccw_label=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा hand_tool_enable.title=हात साधन सुरू करा hand_tool_enable_label=हात साधन सुरू करा hand_tool_disable.title=हात साधन बंद करा hand_tool_disable_label=हात साधन बंद करा # Document properties dialog box document_properties.title=दस्तऐवज गुणधर्म… document_properties_label=दस्तऐवज गुणधर्म… document_properties_file_name=फाइलचे नाव: document_properties_file_size=फाइल आकार: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} बाइट्स) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} बाइट्स) document_properties_title=शिर्षक: document_properties_author=लेखक: document_properties_subject=विषय: document_properties_keywords=मुख्यशब्द: document_properties_creation_date=निर्माण दिनांक: document_properties_modification_date=दुरूस्ती दिनांक: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=निर्माता: document_properties_producer=PDF निर्माता: document_properties_version=PDF आवृत्ती: document_properties_page_count=पृष्ठ संख्या: document_properties_close=बंद करा # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=बाजूचीपट्टी टॉगल करा toggle_sidebar_label=बाजूचीपट्टी टॉगल करा outline.title=दस्तऐवज रूपरेषा दाखवा outline_label=दस्तऐवज रूपरेषा attachments.title=जोडपत्र दाखवा attachments_label=जोडपत्र thumbs.title=थंबनेल्स् दाखवा thumbs_label=थंबनेल्स् findbar.title=दस्तऐवजात शोधा findbar_label=शोधा # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=पृष्ठ {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=पृष्ठाचे थंबनेल {{page}} # Find panel button title and messages find_label=शोधा: find_previous.title=वाकप्रयोगची मागील घटना शोधा find_previous_label=मागील find_next.title=वाकप्रयोगची पुढील घटना शोधा find_next_label=पुढील find_highlight=सर्व ठळक करा find_match_case_label=आकार जुळवा find_reached_top=दस्तऐवजाच्या शीर्षकास पोहचले, तळपासून पुढे find_reached_bottom=दस्तऐवजाच्या तळाला पोहचले, शीर्षकापासून पुढे find_not_found=वाकप्रयोग आढळले नाही # Error panel labels error_more_info=आणखी माहिती error_less_info=कमी माहिती error_close=बंद करा # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=संदेश: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=स्टॅक: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=फाइल: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=रेष: {{line}} rendering_error=पृष्ठ दाखवतेवेळी त्रुटी आढळली. # Predefined zoom values page_scale_width=पृष्ठाची रूंदी page_scale_fit=पृष्ठ बसवा page_scale_auto=स्वयं लाहन किंवा मोठे करणे page_scale_actual=प्रत्यक्ष आकार # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=त्रुटी loading_error=PDF लोड करतेवेळी त्रुटी आढळली. invalid_file_error=अवैध किंवा दोषीत PDF फाइल. missing_file_error=न आढळणारी PDF फाइल. unexpected_response_error=अनपेक्षित सर्व्हर प्रतिसाद. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} टिपण्णी] password_label=ही PDF फाइल उघडण्याकरिता पासवर्ड द्या. password_invalid=अवैध पासवर्ड. कृपया पुन्हा प्रयत्न करा. password_ok=ठीक आहे password_cancel=रद्द करा printing_not_supported=सावधानता: या ब्राउजरतर्फे छपाइ पूर्णपणे समर्थीत नाही. printing_not_ready=सावधानता: छपाईकरिता PDF पूर्णतया लोड झाले नाही. web_fonts_disabled=वेब फाँट्स असमर्थीत आहेत: एम्बेडेड PDF फाँट्स्चा वापर अशक्य. document_colors_not_allowed=PDF दस्ताएवजांना त्यांचे रंग वापरण्यास अनुमती नाही: ब्राउजरमध्ये ' पानांना त्यांचे रंग निवडण्यास अनुमती द्या' बंद केले आहे. manuskript-0.10.0/libs/pdf.js/web/locale/ms/000077500000000000000000000000001354442177200205465ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/ms/viewer.properties000066400000000000000000000154371354442177200241770ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Laman Sebelumnya previous_label=Terdahulu next.title=Laman seterusnya next_label=Berikut # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Laman: page_of=daripada {{pageCount}} zoom_out.title=Zum Keluar zoom_out_label=Zum Keluar zoom_in.title=Zum Masuk zoom_in_label=Zum Masuk zoom.title=Zum presentation_mode.title=Bertukar ke Mod Persembahan presentation_mode_label=Mod Persembahan open_file.title=Buka Fail open_file_label=Buka print.title=Cetak print_label=Cetak download.title=Muat turun download_label=Muat turun bookmark.title=Pandangan semasa (salinan atau dibuka dalam tetingkap baru) bookmark_label=Lihat semasa # Secondary toolbar and context menu tools.title=Alatan tools_label=Alatan first_page.title=Pergi ke Halaman Pertama first_page.label=Pergi ke Halaman Pertama first_page_label=Pergi ke Halaman Pertama last_page.title=Pergi ke Halaman Terakhir last_page.label=Pergi ke Halaman Terakhir last_page_label=Pergi ke Halaman Terakhir page_rotate_cw.title=Berputar ikut arah Jam page_rotate_cw.label=Berputar ikut arah Jam page_rotate_cw_label=Berputar ikut arah Jam page_rotate_ccw.title=Pusing berlawan arah jam page_rotate_ccw.label=Pusing berlawan arah jam page_rotate_ccw_label=Pusing berlawan arah jam hand_tool_enable.title=Bolehkan alatan tangan hand_tool_enable_label=Bolehkan alatan tangan hand_tool_disable.title=Lumpuhkan alatan tangan hand_tool_disable_label=Lumpuhkan alatan tangan # Document properties dialog box document_properties.title=Ciri Dokumen… document_properties_label=Ciri Dokumen… document_properties_file_name=Nama fail: document_properties_file_size=Saiz fail: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bait) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bait) document_properties_title=Tajuk: document_properties_author=Pengarang: document_properties_subject=Subjek: document_properties_keywords=Kata kunci: document_properties_creation_date=Masa Dicipta: document_properties_modification_date=Tarikh Ubahsuai: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Pencipta: document_properties_producer=Pengeluar PDF: document_properties_version=Versi PDF: document_properties_page_count=Kiraan Laman: document_properties_close=Tutup # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Togol Bar Sisi toggle_sidebar_label=Togol Bar Sisi outline.title=Tunjuk Rangka Dokumen outline_label=Rangka Dokument attachments.title=Tunjuk Lampiran attachments_label=Lampiran thumbs.title=Tunjuk Imej kecil thumbs_label=Imej kecil findbar.title=Cari didalam Dokumen findbar_label=Cari # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Halaman {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Halaman Imej kecil {{page}} # Find panel button title and messages find_label=Cari: find_previous.title=Cari teks frasa berkenaan yang terdahulu find_previous_label=Sebelumnya find_next.title=Cari teks frasa berkenaan yang berikut find_next_label=Berikut find_highlight=Serlahkan semua find_match_case_label=Kes Sepadan find_reached_top=Mencapai teratas daripada dokumen, sambungan daripada bawah find_reached_bottom=Mencapai terakhir daripada dokumen, sambungan daripada atas find_not_found=Frasa tidak ditemui # Error panel labels error_more_info=Maklumat lanjut error_less_info=Kurang Informasi error_close=Tutup # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Mesej: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Timbun: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Fail: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Garis: {{line}} rendering_error=Ralat berlaku ketika memberikan halaman. # Predefined zoom values page_scale_width=Lebar Halaman page_scale_fit=Muat Halaman page_scale_auto=Zoom Automatik page_scale_actual=Saiz Sebenar # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. # Loading indicator messages loading_error_indicator=Ralat loading_error=Masalah berlaku semasa menuatkan sebuah PDF. invalid_file_error=Tidak sah atau fail PDF rosak. missing_file_error=Fail PDF Hilang. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Anotasi] password_label=Masukan kata kunci untuk membuka fail PDF ini. password_invalid=Kata laluan salah. Cuba lagi. password_ok=OK password_cancel=Batal printing_not_supported=Amaran: Cetakan ini tidak sepenuhnya disokong oleh pelayar ini. printing_not_ready=Amaran: PDF tidak sepenuhnya dimuatkan untuk dicetak. web_fonts_disabled=Fon web dilumpuhkan: tidak dapat fon PDF terbenam. document_colors_not_allowed=Dokumen PDF tidak dibenarkan untuk menggunakan warna sendiri: 'Benarkan muka surat untuk memilih warna sendiri' telah dinyahaktif dalam pelayar. manuskript-0.10.0/libs/pdf.js/web/locale/my/000077500000000000000000000000001354442177200205545ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/my/viewer.properties000066400000000000000000000247761354442177200242130ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=အရင် စာမျက်နှာ previous_label=အရင်နေရာ next.title=ရှေ့ စာမျက်နှာ next_label=နောက်တခု # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=စာမျက်နှာ - page_of=၏ {{pageCount}} zoom_out.title=ချုံ့ပါ zoom_out_label=ချုံ့ပါ zoom_in.title=ချဲ့ပါ zoom_in_label=ချဲ့ပါ zoom.title=ချုံ့/ချဲ့ပါ presentation_mode.title=Switch to Presentation Mode presentation_mode_label=Presentation Mode open_file.title=ဖိုင်အားဖွင့်ပါ။ open_file_label=ဖွင့်ပါ print.title=ပုံနှိုပ်ပါ print_label=ပုံနှိုပ်ပါ download.title=ကူးဆွဲ download_label=ကူးဆွဲ bookmark.title=လက်ရှိ မြင်ကွင်း (ဝင်းဒိုးအသစ်မှာ ကူးပါ သို့မဟုတ် ဖွင့်ပါ) bookmark_label=လက်ရှိ မြင်ကွင်း # Secondary toolbar and context menu tools.title=ကိရိယာများ tools_label=ကိရိယာများ first_page.title=ပထမ စာမျက်နှာသို့ first_page.label=ပထမ စာမျက်နှာသို့ first_page_label=ပထမ စာမျက်နှာသို့ last_page.title=နောက်ဆုံး စာမျက်နှာသို့ last_page.label=နောက်ဆုံး စာမျက်နှာသို့ last_page_label=နောက်ဆုံး စာမျက်နှာသို့ page_rotate_cw.title=နာရီလက်တံ အတိုင်း page_rotate_cw.label=နာရီလက်တံ အတိုင်း page_rotate_cw_label=နာရီလက်တံ အတိုင်း page_rotate_ccw.title=နာရီလက်တံ ပြောင်းပြန် page_rotate_ccw.label=နာရီလက်တံ ပြောင်းပြန် page_rotate_ccw_label=နာရီလက်တံ ပြောင်းပြန် hand_tool_enable.title=လက်ကိုင် ကိရိယာအားသုံး hand_tool_enable_label=လက်ကိုင် ကိရိယာဖွင့် hand_tool_disable.title=လက်ကိုင် ကိရိယာအားပိတ် hand_tool_disable_label=လက်ကိုင်ကိရိယာ အားပိတ် # Document properties dialog box document_properties.title=မှတ်တမ်းမှတ်ရာ ဂုဏ်သတ္တိများ document_properties_label=မှတ်တမ်းမှတ်ရာ ဂုဏ်သတ္တိများ document_properties_file_name=ဖိုင် : document_properties_file_size=ဖိုင်ဆိုဒ် : # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} ကီလိုဘိုတ် ({size_kb}}ဘိုတ်) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=ခေါင်းစဉ်‌ - document_properties_author=ရေးသားသူ: document_properties_subject=အကြောင်းအရာ:\u0020 document_properties_keywords=သော့ချက် စာလုံး: document_properties_creation_date=ထုတ်လုပ်ရက်စွဲ: document_properties_modification_date=ပြင်ဆင်ရက်စွဲ: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=ဖန်တီးသူ: document_properties_producer=PDF ထုတ်လုပ်သူ: document_properties_version=PDF ဗားရှင်း: document_properties_page_count=စာမျက်နှာအရေအတွက်: document_properties_close=ပိတ် # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=ဘေးတန်းဖွင့်ပိတ် toggle_sidebar_label=ဖွင့်ပိတ် ဆလိုက်ဒါ outline.title=စာတမ်း မူကြမ်း ကိုပြပါ outline_label=စာတမ်း မူကြမ်း attachments.title=တွဲချက်များ ပြပါ attachments_label=တွဲထားချက်များ thumbs.title=ပုံရိပ်ငယ်များကို ပြပါ thumbs_label=ပုံရိပ်ငယ်များ findbar.title=Find in Document findbar_label=ရှာဖွေပါ # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=စာမျက်နှာ {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=စာမျက်နှာရဲ့ ပုံရိပ်ငယ် {{page}} # Find panel button title and messages find_label=ရှာဖွေပါ - find_previous.title=စကားစုရဲ့ အရင် ​ဖြစ်ပွားမှုကို ရှာဖွေပါ find_previous_label=နောက်သို့ find_next.title=စကားစုရဲ့ နောက်ထပ် ​ဖြစ်ပွားမှုကို ရှာဖွေပါ find_next_label=ရှေ့သို့ find_highlight=အားလုံးကို မျဉ်းသားပါ find_match_case_label=စာလုံး တိုက်ဆိုင်ပါ find_reached_top=စာမျက်နှာထိပ် ရောက်နေပြီ၊ အဆုံးကနေ ပြန်စပါ find_reached_bottom=စာမျက်နှာအဆုံး ရောက်နေပြီ၊ ထိပ်ကနေ ပြန်စပါ find_not_found=စကားစု မတွေ့ရဘူး # Error panel labels error_more_info=နောက်ထပ်အချက်အလက်များ error_less_info=အနည်းငယ်မျှသော သတင်းအချက်အလက် error_close=ပိတ် # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=မက်ဆေ့ - {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=အထပ် - {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=ဖိုင် {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=လိုင်း - {{line}} rendering_error=စာမျက်နှာကို ပုံဖော်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။ # Predefined zoom values page_scale_width=စာမျက်နှာ အကျယ် page_scale_fit=စာမျက်နှာ ကွက်တိ page_scale_auto=အလိုအလျောက် ချုံ့ချဲ့ page_scale_actual=အမှန်တကယ်ရှိတဲ့ အရွယ် # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=အမှား loading_error=PDF ဖိုင် ကိုဆွဲတင်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။ invalid_file_error=မရသော သို့ ပျက်နေသော PDF ဖိုင် missing_file_error=PDF ပျောက်ဆုံး unexpected_response_error=မမျှော်လင့်ထားသော ဆာဗာမှ ပြန်ကြားချက် # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} အဓိပ္ပာယ်ဖွင့်ဆိုချက်] password_label=PDF အားဖွင့်ရန် ပတ်စ်ဝတ်အားထည့်ပါ password_invalid=စာဝှက် မှားသည်။ ထပ်ကြိုးစားကြည့်ပါ။ password_ok=OK password_cancel=ပယ်​ဖျက်ပါ printing_not_supported=သတိပေးချက်၊ပရင့်ထုတ်ခြင်းကိုဤဘယောက်ဆာသည် ပြည့်ဝစွာထောက်ပံ့မထားပါ ။ printing_not_ready=သတိပေးချက်: ယခု PDF ဖိုင်သည် ပုံနှိပ်ရန် မပြည့်စုံပါ web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts. document_colors_not_allowed=PDF ဖိုင်အား ၎င်းဤ ကိုယ်ပိုင်အရောင်များကို အသုံးပြုခွင့်မပေးထားပါ ။ 'စာမျက်နှာအားလုံးအားအရောင်ရွေးချယ်ခွင့်' အား ယခု ဘယောက်ဆာတွင် ပိတ်ထားခြင်းကြောင့်ဖြစ် သှ် manuskript-0.10.0/libs/pdf.js/web/locale/nb-NO/000077500000000000000000000000001354442177200210405ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/nb-NO/viewer.properties000066400000000000000000000154451354442177200244700ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Forrige side previous_label=Forrige next.title=Neste side next_label=Neste # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Side: page_of=av {{pageCount}} zoom_out.title=Zoom ut zoom_out_label=Zoom ut zoom_in.title=Zoom inn zoom_in_label=Zoom inn zoom.title=Zoom presentation_mode.title=Bytt til presentasjonsmodus presentation_mode_label=Presentasjonsmodus open_file.title=Åpne fil open_file_label=Åpne print.title=Skriv ut print_label=Skriv ut download.title=Last ned download_label=Last ned bookmark.title=Nåværende visning (kopier eller åpne i et nytt vindu) bookmark_label=Nåværende visning # Secondary toolbar and context menu tools.title=Verktøy tools_label=Verktøy first_page.title=Gå til første side first_page.label=Gå til første side first_page_label=Gå til første side last_page.title=Gå til siste side last_page.label=Gå til siste side last_page_label=Gå til siste side page_rotate_cw.title=Roter med klokken page_rotate_cw.label=Roter med klokken page_rotate_cw_label=Roter med klokken page_rotate_ccw.title=Roter mot klokken page_rotate_ccw.label=Roter mot klokken page_rotate_ccw_label=Roter mot klokken hand_tool_enable.title=Slå på hånd-verktøy hand_tool_enable_label=Slå på hånd-verktøy hand_tool_disable.title=Slå av hånd-verktøy hand_tool_disable_label=Slå av hånd-verktøy # Document properties dialog box document_properties.title=Dokumentegenskaper … document_properties_label=Dokumentegenskaper … document_properties_file_name=Filnavn: document_properties_file_size=Filstørrelse: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=Dokumentegenskaper … document_properties_author=Forfatter: document_properties_subject=Emne: document_properties_keywords=Nøkkelord: document_properties_creation_date=Opprettet dato: document_properties_modification_date=Endret dato: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Opprettet av: document_properties_producer=PDF-verktøy: document_properties_version=PDF-versjon: document_properties_page_count=Sideantall: document_properties_close=Lukk # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Slå av/på sidestolpe toggle_sidebar_label=Slå av/på sidestolpe outline.title=Vis dokumentdisposisjon outline_label=Dokumentdisposisjon attachments.title=Vis vedlegg attachments_label=Vedlegg thumbs.title=Vis miniatyrbilde thumbs_label=Miniatyrbilde findbar.title=Finn i dokumentet findbar_label=Finn # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Side {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Miniatyrbilde av side {{page}} # Find panel button title and messages find_label=Finn: find_previous.title=Finn forrige forekomst av frasen find_previous_label=Forrige find_next.title=Finn neste forekomst av frasen find_next_label=Neste find_highlight=Uthev alle find_match_case_label=Skill store/små bokstaver find_reached_top=Nådde toppen av dokumentet, fortsetter fra bunnen find_reached_bottom=Nådde bunnen av dokumentet, fortsetter fra toppen find_not_found=Fant ikke teksten # Error panel labels error_more_info=Mer info error_less_info=Mindre info error_close=Lukk # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (bygg: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Melding: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stakk: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Fil: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Linje: {{line}} rendering_error=En feil oppstod ved opptegning av siden. # Predefined zoom values page_scale_width=Sidebredde page_scale_fit=Tilpass til siden page_scale_auto=Automatisk zoom page_scale_actual=Virkelig størrelse # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}} % # Loading indicator messages loading_error_indicator=Feil loading_error=En feil oppstod ved lasting av PDF. invalid_file_error=Ugyldig eller skadet PDF-fil. missing_file_error=Manglende PDF-fil. unexpected_response_error=Uventet serverrespons. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} annotasjon] password_label=Skriv inn passordet for å åpne denne PDF-filen. password_invalid=Ugyldig passord. Prøv igjen. password_ok=OK password_cancel=Avbryt printing_not_supported=Advarsel: Utskrift er ikke fullstendig støttet av denne nettleseren. printing_not_ready=Advarsel: PDF er ikke fullstendig innlastet for utskrift. web_fonts_disabled=Web-fonter er avslått: Kan ikke bruke innbundne PDF-fonter. document_colors_not_allowed=PDF-dokumenter tillates ikke å bruke deres egne farger: 'Tillat sider å velge egne farger' er deaktivert i nettleseren. manuskript-0.10.0/libs/pdf.js/web/locale/nl/000077500000000000000000000000001354442177200205405ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/nl/viewer.properties000066400000000000000000000160741354442177200241670ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Vorige pagina previous_label=Vorige next.title=Volgende pagina next_label=Volgende # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Pagina: page_of=van {{pageCount}} zoom_out.title=Uitzoomen zoom_out_label=Uitzoomen zoom_in.title=Inzoomen zoom_in_label=Inzoomen zoom.title=Zoomen presentation_mode.title=Wisselen naar presentatiemodus presentation_mode_label=Presentatiemodus open_file.title=Bestand openen open_file_label=Openen print.title=Afdrukken print_label=Afdrukken download.title=Downloaden download_label=Downloaden bookmark.title=Huidige weergave (kopiëren of openen in nieuw venster) bookmark_label=Huidige weergave # Secondary toolbar and context menu tools.title=Hulpmiddelen tools_label=Hulpmiddelen first_page.title=Naar eerste pagina gaan first_page.label=Naar eerste pagina gaan first_page_label=Naar eerste pagina gaan last_page.title=Naar laatste pagina gaan last_page.label=Naar laatste pagina gaan last_page_label=Naar laatste pagina gaan page_rotate_cw.title=Rechtsom draaien page_rotate_cw.label=Rechtsom draaien page_rotate_cw_label=Rechtsom draaien page_rotate_ccw.title=Linksom draaien page_rotate_ccw.label=Linksom draaien page_rotate_ccw_label=Linksom draaien hand_tool_enable.title=Handhulpmiddel inschakelen hand_tool_enable_label=Handhulpmiddel inschakelen hand_tool_disable.title=Handhulpmiddel uitschakelen hand_tool_disable_label=Handhulpmiddel uitschakelen # Document properties dialog box document_properties.title=Documenteigenschappen… document_properties_label=Documenteigenschappen… document_properties_file_name=Bestandsnaam: document_properties_file_size=Bestandsgrootte: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=Titel: document_properties_author=Auteur: document_properties_subject=Onderwerp: document_properties_keywords=Trefwoorden: document_properties_creation_date=Aanmaakdatum: document_properties_modification_date=Wijzigingsdatum: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Auteur: document_properties_producer=PDF-producent: document_properties_version=PDF-versie: document_properties_page_count=Aantal pagina’s: document_properties_close=Sluiten # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Zijbalk in-/uitschakelen toggle_sidebar_label=Zijbalk in-/uitschakelen outline.title=Documentoverzicht tonen outline_label=Documentoverzicht attachments.title=Bijlagen tonen attachments_label=Bijlagen thumbs.title=Miniaturen tonen thumbs_label=Miniaturen findbar.title=Zoeken in document findbar_label=Zoeken # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Pagina {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Miniatuur van pagina {{page}} # Find panel button title and messages find_label=Zoeken: find_previous.title=Het vorige voorkomen van de tekst zoeken find_previous_label=Vorige find_next.title=Het volgende voorkomen van de tekst zoeken find_next_label=Volgende find_highlight=Alles markeren find_match_case_label=Hoofdlettergevoelig find_reached_top=Bovenkant van het document bereikt, doorgegaan vanaf de onderkant find_reached_bottom=Onderkant van het document bereikt, doorgegaan vanaf de bovenkant find_not_found=Tekst niet gevonden # Error panel labels error_more_info=Meer informatie error_less_info=Minder informatie error_close=Sluiten # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Bericht: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stack: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Bestand: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Regel: {{line}} rendering_error=Er is een fout opgetreden bij het weergeven van de pagina. # Predefined zoom values page_scale_width=Paginabreedte page_scale_fit=Hele pagina page_scale_auto=Automatisch zoomen page_scale_actual=Werkelijke grootte # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Fout loading_error=Er is een fout opgetreden bij het laden van de PDF. invalid_file_error=Ongeldig of beschadigd PDF-bestand. missing_file_error=PDF-bestand ontbreekt. unexpected_response_error=Onverwacht serverantwoord. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}}-aantekening] password_label=Voer het wachtwoord in om dit PDF-bestand te openen. password_invalid=Ongeldig wachtwoord. Probeer het opnieuw. password_ok=OK password_cancel=Annuleren printing_not_supported=Waarschuwing: afdrukken wordt niet volledig ondersteund door deze browser. printing_not_ready=Waarschuwing: de PDF is niet volledig geladen voor afdrukken. web_fonts_disabled=Weblettertypen zijn uitgeschakeld: gebruik van ingebedde PDF-lettertypen is niet mogelijk. document_colors_not_allowed=PDF-documenten mogen hun eigen kleuren niet gebruiken: ‘Pagina’s toestaan om hun eigen kleuren te kiezen’ is uitgeschakeld in de browser. manuskript-0.10.0/libs/pdf.js/web/locale/nn-NO/000077500000000000000000000000001354442177200210545ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/nn-NO/viewer.properties000066400000000000000000000144571354442177200245060ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Førre side previous_label=Førre next.title=Neste side next_label=Neste # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Side: page_of=av {{pageCount}} zoom_out.title=Mindre zoom_out_label=Mindre zoom_in.title=Større zoom_in_label=Større zoom.title=Skalering presentation_mode.title=Byt til presentasjonsmodus presentation_mode_label=Presentasjonsmodus open_file.title=Opna fil open_file_label=Opna print.title=Skriv ut print_label=Skriv ut download.title=Last ned download_label=Last ned bookmark.title=Gjeldande vising (kopier eller opna i nytt vindauge) bookmark_label=Gjeldande vising # Secondary toolbar and context menu tools.title=Verktøy tools_label=Verktøy first_page.title=Gå til fyrstesida first_page.label=Gå til fyrstesida first_page_label=Gå til fyrstesida last_page.title=Gå til siste side last_page.label=Gå til siste side last_page_label=Gå til siste side page_rotate_cw.title=Roter med klokka page_rotate_cw.label=Roter med klokka page_rotate_cw_label=Roter med klokka page_rotate_ccw.title=Roter mot klokka page_rotate_ccw.label=Roter mot klokka page_rotate_ccw_label=Roter mot klokka hand_tool_enable.title=Slå på handverktøy hand_tool_enable_label=Slå på handverktøy hand_tool_disable.title=Så av handverktøy hand_tool_disable_label=Slå av handverktøy # Document properties dialog box document_properties.title=Dokumenteigenskapar … document_properties_label=Dokumenteigenskapar … document_properties_file_name=Filnamn: document_properties_file_size=Filstorleik: document_properties_kb={{size_kb}} KB ({{size_b}} bytes) document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=Dokumenteigenskapar … document_properties_author=Forfattar: document_properties_subject=Emne: document_properties_keywords=Stikkord: document_properties_creation_date=Dato oppretta: document_properties_modification_date=Dato endra: document_properties_date_string={{date}}, {{time}} document_properties_creator=Oppretta av: document_properties_producer=PDF-verktøy: document_properties_version=PDF-versjon: document_properties_page_count=Sidetal: document_properties_close=Lukk # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Slå av/på sidestolpe toggle_sidebar_label=Slå av/på sidestolpe outline.title=Vis dokumentdisposisjon outline_label=Dokumentdisposisjon attachments.title=Vis vedlegg attachments_label=Vedlegg thumbs.title=Vis miniatyrbilde thumbs_label=Miniatyrbilde findbar.title=Finn i dokumentet findbar_label=Finn # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Side {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Miniatyrbilde av side {{page}} # Find panel button title and messages find_label=Finn: find_previous.title=Finn tidlegare førekomst av frasen find_previous_label=Førre find_next.title=Finn neste førekomst av frasen find_next_label=Neste find_highlight=Uthev alle find_match_case_label=Skil store/små bokstavar find_reached_top=Nådde toppen av dokumentet, held fram frå botnen find_reached_bottom=Nådde botnen av dokumentet, held fram frå toppen find_not_found=Fann ikkje teksten # Error panel labels error_more_info=Meir info error_less_info=Mindre info error_close=Lukk # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (bygg: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Melding: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stakk: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Fil: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Linje: {{line}} rendering_error=Ein feil oppstod ved oppteikning av sida. # Predefined zoom values page_scale_width=Sidebreidde page_scale_fit=Tilpass til sida page_scale_auto=Automatisk skalering page_scale_actual=Verkeleg storleik # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Feil loading_error=Ein feil oppstod ved lasting av PDF. invalid_file_error=Ugyldig eller korrupt PDF-fil. missing_file_error=Manglande PDF-fil. unexpected_response_error=Uventa tenarrespons. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} annotasjon] password_label=Skriv inn passordet for å opna denne PDF-fila. password_invalid=Ugyldig passord. Prøv igjen. password_ok=OK password_cancel=Avbryt printing_not_supported=Åtvaring: Utskrift er ikkje fullstendig støtta av denne nettlesaren. printing_not_ready=Åtvaring: PDF ikkje fullstendig innlasta for utskrift. web_fonts_disabled=Vev-skrifter er slått av: Kan ikkje bruka innbundne PDF-skrifter. document_colors_disabled=PDF-dokument har ikkje løyve til å bruka eigne fargar: 'Tillat sider å velja eigne fargar' er slått av i nettlesaren. manuskript-0.10.0/libs/pdf.js/web/locale/nso/000077500000000000000000000000001354442177200207265ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/nso/viewer.properties000066400000000000000000000125001354442177200243430ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Letlakala le fetilego previous_label=Fetilego next.title=Letlakala le latelago next_label=Latelago # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Letlakala: page_of=la {{pageCount}} zoom_out.title=Bušetša ka gare zoom_out_label=Bušetša ka gare zoom_in.title=Godišetša ka ntle zoom_in_label=Godišetša ka ntle zoom.title=Godiša presentation_mode.title=Fetogela go mokgwa wa tlhagišo presentation_mode_label=Mokgwa wa tlhagišo open_file.title=Bula faele open_file_label=Bula print.title=Gatiša print_label=Gatiša download.title=Laolla download_label=Laolla bookmark.title=Pono ya bjale (kopiša le go bula lefasetereng le leswa) bookmark_label=Tebelelo ya gona bjale # Secondary toolbar and context menu # Document properties dialog box document_properties_file_name=Leina la faele: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_title=Thaetlele: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Šielanya para ya ka thoko toggle_sidebar_label=Šielanya para ya ka thoko outline.title=Laetša kakaretšo ya tokumente outline_label=Kakaretšo ya tokumente thumbs.title=Laetša dikhutšofatšo thumbs_label=Dikhutšofatšo findbar.title=Hwetša go tokumente findbar_label=Hwetša # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Letlakala {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Khutšofatšo ya letlakala {{page}} # Find panel button title and messages find_label=Hwetša: find_previous.title=Hwetša tiragalo e fetilego ya sekafoko find_previous_label=Fetilego find_next.title=Hwetša tiragalo e latelago ya sekafoko find_next_label=Latelago find_highlight=Bonagatša tšohle find_match_case_label=Swantšha kheisi find_reached_top=Fihlile godimo ga tokumente, go tšwetšwe pele go tloga tlase find_reached_bottom=Fihlile mafelelong a tokumente, go tšwetšwe pele go tloga godimo find_not_found=Sekafoko ga sa hwetšwa # Error panel labels error_more_info=Tshedimošo e oketšegilego error_less_info=Tshedimošo ya tlasana # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Molaetša: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Mokgobo: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Faele: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Mothaladi: {{line}} rendering_error=Go diregile phošo ge go be go gafelwa letlakala. # Predefined zoom values page_scale_width=Bophara bja letlakala page_scale_fit=Go lekana ga letlakala page_scale_auto=Kgodišo ya maitirišo page_scale_actual=Bogolo bja kgonthe # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. # Loading indicator messages loading_error_indicator=Phošo loading_error=Go diregile phošo ge go hlahlelwa PDF. invalid_file_error=Faele ye e sa šomego goba e senyegilego ya PDF. missing_file_error=Faele yeo e sego gona ya PDF. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Tlhaloso] password_ok=LOKILE password_cancel=Khansela printing_not_supported=Temošo: Go gatiša ga go thekgwe ke praosara ye ka botlalo. printing_not_ready=Temošo: PDF ga ya hlahlelwa ka botlalo bakeng sa go gatišwa. web_fonts_disabled=Difonte tša wepe di šitišitšwe: ga e kgone go diriša difonte tša PDF tše khutišitšwego. manuskript-0.10.0/libs/pdf.js/web/locale/oc/000077500000000000000000000000001354442177200205305ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/oc/viewer.properties000066400000000000000000000162061354442177200241540ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Pagina precedenta previous_label=Precedent next.title=Pagina seguenta next_label=Seguent # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Pagina : page_of=sus {{pageCount}} zoom_out.title=Zoom arrièr zoom_out_label=Zoom arrièr zoom_in.title=Zoom avant zoom_in_label=Zoom avant zoom.title=Zoom presentation_mode.title=Bascular en mòde presentacion presentation_mode_label=Mòde Presentacion open_file.title=Dobrir lo fichièr open_file_label=Dobrir print.title=Imprimir print_label=Imprimir download.title=Telecargar download_label=Telecargar bookmark.title=Afichatge corrent (copiar o dobrir dins una fenèstra novèla) bookmark_label=Afichatge actual # Secondary toolbar and context menu tools.title=Aisinas tools_label=Aisinas first_page.title=Anar a la primièra pagina first_page.label=Anar a la primièra pagina first_page_label=Anar a la primièra pagina last_page.title=Anar a la darrièra pagina last_page.label=Anar a la darrièra pagina last_page_label=Anar a la darrièra pagina page_rotate_cw.title=Rotacion orària page_rotate_cw.label=Rotacion orària page_rotate_cw_label=Rotacion orària page_rotate_ccw.title=Rotacion antiorària page_rotate_ccw.label=Rotacion antiorària page_rotate_ccw_label=Rotacion antiorària hand_tool_enable.title=Activar l'aisina man hand_tool_enable_label=Activar l'aisina man hand_tool_disable.title=Desactivar l'aisina man hand_tool_disable_label=Desactivar l'aisina man # Document properties dialog box document_properties.title=Proprietats del document... document_properties_label=Proprietats del document... document_properties_file_name=Nom del fichièr : document_properties_file_size=Talha del fichièr : # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} Ko ({{size_b}} octets) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} Mo ({{size_b}} octets) document_properties_title=Títol : document_properties_author=Autor : document_properties_subject=Subjècte : document_properties_keywords=Mots claus : document_properties_creation_date=Data de creacion : document_properties_modification_date=Data de modificacion : # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Creator : document_properties_producer=Aisina de conversion PDF : document_properties_version=Version PDF : document_properties_page_count=Nombre de paginas : document_properties_close=Tampar # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Afichar/amagar lo panèl lateral toggle_sidebar_label=Afichar/amagar lo panèl lateral outline.title=Afichar los marcapaginas outline_label=Marcapaginas del document attachments.title=Visualizar las pèças juntas attachments_label=Pèças juntas thumbs.title=Afichar las vinhetas thumbs_label=Vinhetas findbar.title=Trobar dins lo document findbar_label=Recercar # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Pagina {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Vinheta de la pagina {{page}} # Find panel button title and messages find_label=Recercar find_previous.title=Tròba l'ocurréncia precedenta de la frasa find_previous_label=Precedent find_next.title=Tròba l'ocurréncia venenta de la frasa find_next_label=Seguent find_highlight=Suslinhar tot find_match_case_label=Respectar la cassa find_reached_top=Naut de la pagina atench, perseguida dempuèi lo bas find_reached_bottom=Bas de la pagina atench, perseguida al començament find_not_found=Frasa pas trobada # Error panel labels error_more_info=Mai de detalhs error_less_info=Mens d'informacions error_close=Tampar # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (identificant de compilacion : {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Messatge : {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Pila : {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Fichièr : {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Linha : {{line}} rendering_error=Una error s'es producha pendent l'afichatge de la pagina. # Predefined zoom values page_scale_width=Largor plena page_scale_fit=Pagina entièra page_scale_auto=Zoom automatic page_scale_actual=Talha vertadièra # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. # Loading indicator messages loading_error_indicator=Error loading_error=Una error s'es producha pendent lo cargament del fichièr PDF. invalid_file_error=Fichièr PDF invalid o corromput. missing_file_error=Fichièr PDF mancant. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Anotacion {{type}}] password_label=Picatz lo senhal per dobrir aqueste fichièr PDF. password_invalid=Senhal incorrècte. Tornatz ensajar. password_ok=D'acòrdi password_cancel=Anullar printing_not_supported=Atencion : l'estampatge es pas completament gerit per aqueste navigador. printing_not_ready=Atencion : lo PDF es pas entièrament cargat per lo poder imprimir. web_fonts_disabled=Las poliças web son desactivadas : impossible d'utilizar las poliças integradas al PDF. document_colors_not_allowed=Los documents PDF pòdon pas utilizar lors pròprias colors : « Autorizar las paginas web d'utilizar lors pròprias colors » es desactivat dins lo navigador. manuskript-0.10.0/libs/pdf.js/web/locale/or/000077500000000000000000000000001354442177200205475ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/or/viewer.properties000066400000000000000000000247741354442177200242040ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=ପୂର୍ବ ପୃଷ୍ଠା previous_label=ପୂର୍ବ next.title=ପର ପୃଷ୍ଠା next_label=ପର # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=ପୃଷ୍ଠା: page_of={{pageCount}} ର zoom_out.title=ଛୋଟ କରନ୍ତୁ zoom_out_label=ଛୋଟ କରନ୍ତୁ zoom_in.title=ବଡ଼ କରନ୍ତୁ zoom_in_label=ବଡ଼ କରନ୍ତୁ zoom.title=ଛୋଟ ବଡ଼ କରନ୍ତୁ presentation_mode.title=ଉପସ୍ଥାପନ ଧାରାକୁ ବଦଳାନ୍ତୁ presentation_mode_label=ଉପସ୍ଥାପନ ଧାରା open_file.title=ଫାଇଲ ଖୋଲନ୍ତୁ open_file_label=ଖୋଲନ୍ତୁ print.title=ମୁଦ୍ରଣ print_label=ମୁଦ୍ରଣ download.title=ଆହରଣ download_label=ଆହରଣ bookmark.title=ପ୍ରଚଳିତ ଦୃଶ୍ୟ (ନକଲ କରନ୍ତୁ କିମ୍ବା ଏକ ନୂତନ ୱିଣ୍ଡୋରେ ଖୋଲନ୍ତୁ) bookmark_label=ପ୍ରଚଳିତ ଦୃଶ୍ୟ # Secondary toolbar and context menu tools.title=ସାଧନଗୁଡ଼ିକ tools_label=ସାଧନଗୁଡ଼ିକ first_page.title=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ first_page.label=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ first_page_label=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ last_page.title=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ last_page.label=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ last_page_label=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ page_rotate_cw.title=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ page_rotate_cw.label=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ page_rotate_cw_label=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ page_rotate_ccw.title=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ page_rotate_ccw.label=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ page_rotate_ccw_label=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ hand_tool_enable.title=ହସ୍ତକୃତ ସାଧନକୁ ସକ୍ରିୟ କରନ୍ତୁ hand_tool_enable_label=ହସ୍ତକୃତ ସାଧନକୁ ସକ୍ରିୟ କରନ୍ତୁ hand_tool_disable.title=ହସ୍ତକୃତ ସାଧନକୁ ନିଷ୍କ୍ରିୟ କରନ୍ତୁ hand_tool_disable_label=ହସ୍ତକୃତ ସାଧନକୁ ନିଷ୍କ୍ରିୟ କରନ୍ତୁ # Document properties dialog box document_properties.title=ଦଲିଲ ଗୁଣଧର୍ମ… document_properties_label=ଦଲିଲ ଗୁଣଧର୍ମ… document_properties_file_name=ଫାଇଲ ନାମ: document_properties_file_size=ଫାଇଲ ଆକାର: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=ଶୀର୍ଷକ: document_properties_author=ଲେଖକ: document_properties_subject=ବିଷୟ: document_properties_keywords=ସୂଚକ ଶବ୍ଦ: document_properties_creation_date=ନିର୍ମାଣ ତାରିଖ: document_properties_modification_date=ପରିବର୍ତ୍ତନ ତାରିଖ: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=ନିର୍ମାତା: document_properties_producer=PDF ପ୍ରଯୋଜକ: document_properties_version=PDF ସଂସ୍କରଣ: document_properties_page_count=ପୃଷ୍ଠା ଗଣନା: document_properties_close=ବନ୍ଦ କରନ୍ତୁ # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=ପାର୍ଶ୍ୱପଟିକୁ ଆଗପଛ କରନ୍ତୁ toggle_sidebar_label=ପାର୍ଶ୍ୱପଟିକୁ ଆଗପଛ କରନ୍ତୁ outline.title=ଦଲିଲ ସାରାଂଶ ଦର୍ଶାନ୍ତୁ outline_label=ଦଲିଲ ସାରାଂଶ attachments.title=ସଂଲଗ୍ନକଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ attachments_label=ସଲଗ୍ନକଗୁଡିକ thumbs.title=ସଂକ୍ଷିପ୍ତ ବିବରଣୀ ଦର୍ଶାନ୍ତୁ thumbs_label=ସଂକ୍ଷିପ୍ତ ବିବରଣୀ findbar.title=ଦଲିଲରେ ଖୋଜନ୍ତୁ findbar_label=ଖୋଜନ୍ତୁ # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=ପୃଷ୍ଠା {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=ପୃଷ୍ଠାର ସଂକ୍ଷିପ୍ତ ବିବରଣୀ {{page}} # Find panel button title and messages find_label=ଖୋଜନ୍ତୁ: find_previous.title=ଏହି ବାକ୍ୟାଂଶର ପୂର୍ବ ଉପସ୍ଥିତିକୁ ଖୋଜନ୍ତୁ find_previous_label=ପୂର୍ବବର୍ତ୍ତୀ find_next.title=ଏହି ବାକ୍ୟାଂଶର ପରବର୍ତ୍ତୀ ଉପସ୍ଥିତିକୁ ଖୋଜନ୍ତୁ find_next_label=ପରବର୍ତ୍ତୀ\u0020 find_highlight=ସମସ୍ତଙ୍କୁ ଆଲୋକିତ କରନ୍ତୁ find_match_case_label=ଅକ୍ଷର ମେଳାନ୍ତୁ find_reached_top=ତଳୁ ଉପରକୁ ଗତି କରି ଦଲିଲର ଉପର ଭାଗରେ ପହଞ୍ଚି ଯାଇଛି find_reached_bottom=ଉପରୁ ତଳକୁ ଗତି କରି ଦଲିଲର ଶେଷ ଭାଗରେ ପହଞ୍ଚି ଯାଇଛି find_not_found=ବାକ୍ୟାଂଶ ମିଳିଲା ନାହିଁ # Error panel labels error_more_info=ଅଧିକ ସୂଚନା error_less_info=ସ୍ୱଳ୍ପ ସୂଚନା error_close=ବନ୍ଦ କରନ୍ତୁ # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=ସନ୍ଦେଶ: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=ଷ୍ଟାକ: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=ଫାଇଲ: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=ଧାଡ଼ି: {{line}} rendering_error=ପୃଷ୍ଠା ଚିତ୍ରଣ କରିବା ସମୟରେ ତ୍ରୁଟି ଘଟିଲା। # Predefined zoom values page_scale_width=ପୃଷ୍ଠା ଓସାର page_scale_fit=ପୃଷ୍ଠା ମେଳନ page_scale_auto=ସ୍ୱୟଂଚାଳିତ ଭାବରେ ଛୋଟବଡ଼ କରିବା page_scale_actual=ପ୍ରକୃତ ଆକାର # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. # Loading indicator messages loading_error_indicator=ତ୍ରୁଟି loading_error=PDF ଧାରଣ କରିବା ସମୟରେ ଏକ ତ୍ରୁଟି ଘଟିଲା। invalid_file_error=ଅବୈଧ କିମ୍ବା ତ୍ରୁଟିଯୁକ୍ତ PDF ଫାଇଲ। missing_file_error=ହଜିଯାଇଥିବା PDF ଫାଇଲ। unexpected_response_error=ଅପ୍ରତ୍ୟାଶିତ ସର୍ଭର ଉତ୍ତର। # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Annotation] password_label=ଏହି PDF ଫାଇଲକୁ ଖୋଲିବା ପାଇଁ ପ୍ରବେଶ ସଂକେତ ଭରଣ କରନ୍ତୁ। password_invalid=ଭୁଲ ପ୍ରବେଶ ସଂକେତ। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ। password_ok=ଠିକ ଅଛି password_cancel=ବାତିଲ କରନ୍ତୁ printing_not_supported=ଚେତାବନୀ: ଏହି ବ୍ରାଉଜର ଦ୍ୱାରା ମୁଦ୍ରଣ କ୍ରିୟା ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ସହାୟତା ପ୍ରାପ୍ତ ନୁହଁ। printing_not_ready=ଚେତାବନୀ: PDF ଟି ମୁଦ୍ରଣ ପାଇଁ ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ଧାରଣ ହୋଇ ନାହିଁ। web_fonts_disabled=ୱେବ ଅକ୍ଷରରୂପଗୁଡ଼ିକୁ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି: ସନ୍ନିହିତ PDF ଅକ୍ଷରରୂପଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିବାରେ ଅସମର୍ଥ। document_colors_not_allowed=PDF ଦଲିଲଗୁଡ଼ିକ ସେମାନଙ୍କର ନିଜର ରଙ୍ଗ ବ୍ୟବହାର କରିବା ପାଇଁ ଅନୁମତି ପ୍ରାପ୍ତ ନୁହଁ: 'ସେମାନଙ୍କର ନିଜ ରଙ୍ଗ ବାଛିବା ପାଇଁ ପୃଷ୍ଠାଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତୁ' କୁ ବ୍ରାଉଜରରେ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି। manuskript-0.10.0/libs/pdf.js/web/locale/pa-IN/000077500000000000000000000000001354442177200210335ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/pa-IN/viewer.properties000066400000000000000000000212771354442177200244630ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=ਸਫ਼ਾ ਪਿੱਛੇ previous_label=ਪਿੱਛੇ next.title=ਸਫ਼ਾ ਅੱਗੇ next_label=ਅੱਗੇ # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=ਸਫ਼ਾ: page_of={{pageCount}} ਵਿੱਚੋਂ zoom_out.title=ਜ਼ੂਮ ਆਉਟ zoom_out_label=ਜ਼ੂਮ ਆਉਟ zoom_in.title=ਜ਼ੂਮ ਇਨ zoom_in_label=ਜ਼ੂਮ ਇਨ zoom.title=ਜ਼ੂਨ print.title=ਪਰਿੰਟ print_label=ਪਰਿੰਟ presentation_mode.title=ਪਰਿਜੈਂਟੇਸ਼ਨ ਮੋਡ ਵਿੱਚ ਜਾਓ presentation_mode_label=ਪਰਿਜੈਂਟੇਸ਼ਨ ਮੋਡ open_file.title=ਫਾਈਲ ਖੋਲ੍ਹੋ open_file_label=ਖੋਲ੍ਹੋ download.title=ਡਾਊਨਲੋਡ download_label=ਡਾਊਨਲੋਡ bookmark.title=ਮੌਜੂਦਾ ਝਲਕ (ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਕਾਪੀ ਕਰੋ ਜਾਂ ਖੋਲ੍ਹੋ) bookmark_label=ਮੌਜੂਦਾ ਝਲਕ # Secondary toolbar and context menu tools.title=ਟੂਲ tools_label=ਟੂਲ first_page.title=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ first_page.label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ first_page_label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ last_page.title=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ last_page_label=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ page_rotate_cw.title=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ page_rotate_cw.label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ page_rotate_cw_label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ page_rotate_ccw.title=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ page_rotate_ccw_label=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ hand_tool_enable.title=ਹੱਥ ਟੂਲ ਚਾਲੂ hand_tool_enable_label=ਹੱਥ ਟੂਲ ਚਾਲੂ hand_tool_disable.title=ਹੱਥ ਟੂਲ ਬੰਦ hand_tool_disable_label=ਹੱਥ ਟੂਲ ਬੰਦ # Document properties dialog box document_properties.title=…ਦਸਤਾਵੇਜ਼ ਵਿਸ਼ੇਸ਼ਤਾ document_properties_label=…ਦਸਤਾਵੇਜ਼ ਵਿਸ਼ੇਸ਼ਤਾ document_properties_file_name=ਫਾਈਲ ਨਾਂ: document_properties_file_size=ਫਾਈਲ ਆਕਾਰ: document_properties_kb={{size_kb}} KB ({{size_b}} ਬਾਈਟ) document_properties_mb={{size_mb}} MB ({{size_b}} ਬਾਈਟ) document_properties_title=ਟਾਈਟਲ: document_properties_author=ਲੇਖਕ: document_properties_subject=ਵਿਸ਼ਾ: document_properties_keywords=ਸ਼ਬਦ: document_properties_creation_date=ਬਣਾਉਣ ਮਿਤੀ: document_properties_modification_date=ਸੋਧ ਮਿਤੀ: document_properties_date_string={{date}}, {{time}} document_properties_creator=ਨਿਰਮਾਤਾ: document_properties_producer=PDF ਪ੍ਰੋਡਿਊਸਰ: document_properties_version=PDF ਵਰਜਨ: document_properties_page_count=ਸਫ਼ਾ ਗਿਣਤੀ: document_properties_close=ਬੰਦ ਕਰੋ # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=ਬਾਹੀ ਬਦਲੋ toggle_sidebar_label=ਬਾਹੀ ਬਦਲੋ outline.title=ਦਸਤਾਵੇਜ਼ ਆਉਟਲਾਈਨ ਵੇਖਾਓ outline_label=ਦਸਤਾਵੇਜ਼ ਆਉਟਲਾਈਨ attachments.title=ਅਟੈਚਮੈਂਟ ਵੇਖਾਓ attachments_label=ਅਟੈਚਮੈਂਟ thumbs.title=ਥੰਮਨੇਲ ਵੇਖਾਓ thumbs_label=ਥੰਮਨੇਲ findbar.title=ਦਸਤਾਵੇਜ਼ ਵਿੱਚ ਲੱਭੋ findbar_label=ਲੱਭੋ # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=ਸਫ਼ਾ {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas={{page}} ਸਫ਼ੇ ਦਾ ਥੰਮਨੇਲ # Context menu first_page.label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ last_page.label=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ page_rotate_cw.label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਉ page_rotate_ccw.label=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਉ # Find panel button title and messages find_label=ਲੱਭੋ: find_previous.title=ਵਾਕ ਦੀ ਪਿਛਲੀ ਮੌਜੂਦਗੀ ਲੱਭੋ find_previous_label=ਪਿੱਛੇ find_next.title=ਵਾਕ ਦੀ ਅਗਲੀ ਮੌਜੂਦਗੀ ਲੱਭੋ find_next_label=ਅੱਗੇ find_highlight=ਸਭ ਉਭਾਰੋ find_match_case_label=ਅੱਖਰ ਆਕਾਰ ਮਿਲਾਉ find_reached_top=ਦਸਤਾਵੇਜ਼ ਦੇ ਉੱਤੇ ਆ ਗਏ ਹਾਂ, ਥੱਲੇ ਤੋਂ ਜਾਰੀ ਰੱਖਿਆ ਹੈ find_reached_bottom=ਦਸਤਾਵੇਜ਼ ਦੇ ਅੰਤ ਉੱਤੇ ਆ ਗਏ ਹਾਂ, ਉੱਤੇ ਤੋਂ ਜਾਰੀ ਰੱਖਿਆ ਹੈ find_not_found=ਵਾਕ ਨਹੀਂ ਲੱਭਿਆ # Error panel labels error_more_info=ਹੋਰ ਜਾਣਕਾਰੀ error_less_info=ਘੱਟ ਜਾਣਕਾਰੀ error_close=ਬੰਦ ਕਰੋ # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (ਬਿਲਡ: {{build}} # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=ਸੁਨੇਹਾ: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=ਸਟੈਕ: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=ਫਾਈਲ: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=ਲਾਈਨ: {{line}} rendering_error=ਸਫ਼ਾ ਰੈਡਰ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ। # Predefined zoom values page_scale_width=ਸਫ਼ਾ ਚੌੜਾਈ page_scale_fit=ਸਫ਼ਾ ਫਿੱਟ page_scale_auto=ਆਟੋਮੈਟਿਕ ਜ਼ੂਮ page_scale_actual=ਆਟੋਮੈਟਿਕ ਆਕਾਰ # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages # LOCALIZATION NOTE (error_line): "{{[percent}}" will be replaced with a percentage loading_error_indicator=ਗਲਤੀ loading_error=PDF ਲੋਡ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ। invalid_file_error=ਗਲਤ ਜਾਂ ਨਿਕਾਰਾ PDF ਫਾਈਲ ਹੈ। missing_file_error=ਨਾ-ਮੌਜੂਦ PDF ਫਾਈਲ। unexpected_response_error=ਅਣਜਾਣ ਸਰਵਰ ਜਵਾਬ। # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} ਵਿਆਖਿਆ] password_label=ਇਹ PDF ਫਾਈਲ ਖੋਲ੍ਹਣ ਲਈ ਪਾਸਵਰਡ ਦਿਉ। password_invalid=ਗਲਤ ਪਾਸਵਰਡ। ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ। password_ok=ਠੀਕ ਹੈ password_cancel=ਰੱਦ ਕਰੋ printing_not_supported=ਸਾਵਧਾਨ: ਇਹ ਬਰਾਊਜ਼ਰ ਪਰਿੰਟ ਕਰਨ ਲਈ ਪੂਰੀ ਤਰ੍ਹਾਂ ਸਹਾਇਕ ਨਹੀਂ ਹੈ। printing_not_ready=ਸਾਵਧਾਨ: PDF ਪਰਿੰਟ ਕਰਨ ਲਈ ਪੂਰੀ ਤਰ੍ਹਾਂ ਲੋਡ ਨਹੀਂ ਹੈ। web_fonts_disabled=ਵੈਬ ਫੋਂਟ ਬੰਦ ਹਨ: ਇੰਬੈਡ PDF ਫੋਂਟ ਵਰਤਨ ਲਈ ਅਸਮਰੱਥ ਹੈ। document_colors_disabled=PDF ਡੌਕੂਮੈਂਟ ਨੂੰ ਆਪਣੇ ਰੰਗ ਵਰਤਣ ਦੀ ਇਜ਼ਾਜ਼ਤ ਨਹੀਂ ਹੈ।: ਬਰਾਊਜ਼ਰ ਵਿੱਚ \u0022ਸਫ਼ਿਆਂ ਨੂੰ ਆਪਣੇ ਰੰਗ ਵਰਤਣ ਦਿਉ\u0022 ਨੂੰ ਬੰਦ ਕੀਤਾ ਹੋਇਆ ਹੈ।manuskript-0.10.0/libs/pdf.js/web/locale/pl/000077500000000000000000000000001354442177200205425ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/pl/viewer.properties000066400000000000000000000115741354442177200241710ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. previous.title=Poprzednia strona previous_label=Poprzednia next.title=Następna strona next_label=Następna page_label=Strona: page_of=z {{pageCount}} zoom_out.title=Pomniejszenie zoom_out_label=Pomniejsz zoom_in.title=Powiększenie zoom_in_label=Powiększ zoom.title=Skala presentation_mode.title=Przełącz na tryb prezentacji presentation_mode_label=Tryb prezentacji open_file.title=Otwieranie pliku open_file_label=Otwórz print.title=Drukowanie print_label=Drukuj download.title=Pobieranie download_label=Pobierz bookmark.title=Bieżąca pozycja (skopiuj lub otwórz jako odnośnik w nowym oknie) bookmark_label=Bieżąca pozycja tools.title=Narzędzia tools_label=Narzędzia first_page.title=Przechodzenie do pierwszej strony first_page.label=Przejdź do pierwszej strony first_page_label=Przejdź do pierwszej strony last_page.title=Przechodzenie do ostatniej strony last_page.label=Przejdź do ostatniej strony last_page_label=Przejdź do ostatniej strony page_rotate_cw.title=Obracanie zgodnie z ruchem wskazówek zegara page_rotate_cw.label=Obróć zgodnie z ruchem wskazówek zegara page_rotate_cw_label=Obróć zgodnie z ruchem wskazówek zegara page_rotate_ccw.title=Obracanie przeciwnie do ruchu wskazówek zegara page_rotate_ccw.label=Obróć przeciwnie do ruchu wskazówek zegara page_rotate_ccw_label=Obróć przeciwnie do ruchu wskazówek zegara hand_tool_enable.title=Włączanie narzędzia rączka hand_tool_enable_label=Włącz narzędzie rączka hand_tool_disable.title=Wyłączanie narzędzia rączka hand_tool_disable_label=Wyłącz narzędzie rączka document_properties.title=Właściwości dokumentu… document_properties_label=Właściwości dokumentu… document_properties_file_name=Nazwa pliku: document_properties_file_size=Rozmiar pliku: document_properties_kb={{size_kb}} KB ({{size_b}} b) document_properties_mb={{size_mb}} MB ({{size_b}} b) document_properties_title=Tytuł: document_properties_author=Autor: document_properties_subject=Temat: document_properties_keywords=Słowa kluczowe: document_properties_creation_date=Data utworzenia: document_properties_modification_date=Data modyfikacji: document_properties_date_string={{date}}, {{time}} document_properties_creator=Utworzony przez: document_properties_producer=PDF wyprodukowany przez: document_properties_version=Wersja PDF: document_properties_page_count=Liczba stron: document_properties_close=Zamknij toggle_sidebar.title=Przełączanie panelu bocznego toggle_sidebar_label=Przełącz panel boczny outline.title=Wyświetlanie zarysu dokumentu outline_label=Zarys dokumentu attachments.title=Wyświetlanie załączników attachments_label=Załączniki thumbs.title=Wyświetlanie miniaturek thumbs_label=Miniaturki findbar.title=Znajdź w dokumencie findbar_label=Znajdź thumb_page_title=Strona {{page}} thumb_page_canvas=Miniaturka strony {{page}} find_label=Znajdź: find_previous.title=Znajdź poprzednie wystąpienie tekstu find_previous_label=Poprzednie find_next.title=Znajdź następne wystąpienie tekstu find_next_label=Następne find_highlight=Podświetl wszystkie find_match_case_label=Rozróżniaj wielkość znaków find_reached_top=Osiągnięto początek dokumentu, kontynuacja od końca find_reached_bottom=Osiągnięto koniec dokumentu, kontynuacja od początku find_not_found=Tekst nieznaleziony error_more_info=Więcej informacji error_less_info=Mniej informacji error_close=Zamknij error_version_info=PDF.js v{{version}} (kompilacja: {{build}}) error_message=Wiadomość: {{message}} error_stack=Stos: {{stack}} error_file=Plik: {{file}} error_line=Wiersz: {{line}} rendering_error=Podczas renderowania strony wystąpił błąd. page_scale_width=Szerokość strony page_scale_fit=Dopasowanie strony page_scale_auto=Skala automatyczna page_scale_actual=Rozmiar rzeczywisty page_scale_percent={{scale}}% loading_error_indicator=Błąd loading_error=Podczas wczytywania dokumentu PDF wystąpił błąd. invalid_file_error=Nieprawidłowy lub uszkodzony plik PDF. missing_file_error=Brak pliku PDF. unexpected_response_error=Nieoczekiwana odpowiedź serwera. text_annotation_type.alt=[Adnotacja: {{type}}] password_label=Wprowadź hasło, aby otworzyć ten dokument PDF. password_invalid=Nieprawidłowe hasło. Proszę spróbować ponownie. password_ok=OK password_cancel=Anuluj printing_not_supported=Ostrzeżenie: Drukowanie nie jest w pełni obsługiwane przez przeglądarkę. printing_not_ready=Ostrzeżenie: Dokument PDF nie jest całkowicie wczytany, więc nie można go wydrukować. web_fonts_disabled=Czcionki sieciowe są wyłączone: nie można użyć osadzonych czcionek PDF. document_colors_not_allowed=Dokumenty PDF nie mogą używać własnych kolorów: Opcja „Pozwalaj stronom stosować inne kolory” w przeglądarce jest nieaktywna. manuskript-0.10.0/libs/pdf.js/web/locale/pt-BR/000077500000000000000000000000001354442177200210535ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/pt-BR/viewer.properties000066400000000000000000000162771354442177200245070ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Página anterior previous_label=Anterior next.title=Próxima página next_label=Próxima # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Página: page_of=de {{pageCount}} zoom_out.title=Diminuir zoom zoom_out_label=Diminuir zoom zoom_in.title=Aumentar zoom zoom_in_label=Aumentar zoom zoom.title=Zoom presentation_mode.title=Alternar para modo de apresentação presentation_mode_label=Modo de apresentação open_file.title=Abrir arquivo open_file_label=Abrir print.title=Imprimir print_label=Imprimir download.title=Download download_label=Download bookmark.title=Visualização atual (copie ou abra em uma nova janela) bookmark_label=Visualização atual # Secondary toolbar and context menu tools.title=Ferramentas tools_label=Ferramentas first_page.title=Ir para a primeira página first_page.label=Ir para a primeira página first_page_label=Ir para a primeira página last_page.title=Ir para a última página last_page.label=Ir para a última página last_page_label=Ir para a última página page_rotate_cw.title=Girar no sentido horário page_rotate_cw.label=Girar no sentido horário page_rotate_cw_label=Girar no sentido horário page_rotate_ccw.title=Girar no sentido anti-horário page_rotate_ccw.label=Girar no sentido anti-horário page_rotate_ccw_label=Girar no sentido anti-horário hand_tool_enable.title=Ativar ferramenta da mão hand_tool_enable_label=Ativar ferramenta da mão hand_tool_disable.title=Desativar ferramenta da mão hand_tool_disable_label=Desativar ferramenta da mão # Document properties dialog box document_properties.title=Propriedades do documento… document_properties_label=Propriedades do documento… document_properties_file_name=Nome do arquivo: document_properties_file_size=Tamanho do arquivo: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=Título: document_properties_author=Autor: document_properties_subject=Assunto: document_properties_keywords=Palavras-chave: document_properties_creation_date=Data da criação: document_properties_modification_date=Data da modificação: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Criação: document_properties_producer=Criador do PDF: document_properties_version=Versão do PDF: document_properties_page_count=Número de páginas: document_properties_close=Fechar # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Exibir/ocultar painel toggle_sidebar_label=Exibir/ocultar painel outline.title=Exibir estrutura de tópicos outline_label=Estrutura de tópicos do documento attachments.title=Exibir anexos attachments_label=Anexos thumbs.title=Exibir miniaturas das páginas thumbs_label=Miniaturas findbar.title=Localizar no documento findbar_label=Localizar # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Página {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Miniatura da página {{page}} # Find panel button title and messages find_label=Localizar: find_previous.title=Localizar a ocorrência anterior do texto find_previous_label=Anterior find_next.title=Localizar a próxima ocorrência do texto find_next_label=Próxima find_highlight=Realçar tudo find_match_case_label=Diferenciar maiúsculas/minúsculas find_reached_top=Atingido o início do documento, continuando do fim find_reached_bottom=Atingido o fim do documento, continuando do início find_not_found=Texto não encontrado # Error panel labels error_more_info=Mais informações error_less_info=Menos informações error_close=Fechar # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Mensagem: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stack: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Arquivo: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Linha: {{line}} rendering_error=Ocorreu um erro ao renderizar a página. # Predefined zoom values page_scale_width=Largura da página page_scale_fit=Ajustar à janela page_scale_auto=Zoom automático page_scale_actual=Tamanho real # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Erro loading_error=Ocorreu um erro ao carregar o PDF. invalid_file_error=Arquivo PDF corrompido ou inválido. missing_file_error=Arquivo PDF ausente. unexpected_response_error=Resposta inesperada do servidor. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Anotação {{type}}] password_label=Forneça a senha para abrir este arquivo PDF. password_invalid=Senha inválida. Por favor, tente de novo. password_ok=OK password_cancel=Cancelar printing_not_supported=Alerta: a impressão não é totalmente suportada neste navegador. printing_not_ready=Alerta: o PDF não está totalmente carregado para impressão. web_fonts_disabled=Fontes da web estão desativadas: não é possível usar fontes incorporadas do PDF. document_colors_not_allowed=Documentos PDF não estão autorizados a usar suas próprias cores: “Páginas podem usar outras cores” está desativado no navegador. manuskript-0.10.0/libs/pdf.js/web/locale/pt-PT/000077500000000000000000000000001354442177200210735ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/pt-PT/viewer.properties000066400000000000000000000161411354442177200245150ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Página anterior previous_label=Anterior next.title=Página seguinte next_label=Seguinte # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Página: page_of=de {{pageCount}} zoom_out.title=Reduzir zoom_out_label=Reduzir zoom_in.title=Ampliar zoom_in_label=Ampliar zoom.title=Ampliação presentation_mode.title=Mudar para modo de apresentação presentation_mode_label=Modo de apresentação open_file.title=Abrir ficheiro open_file_label=Abrir print.title=Imprimir print_label=Imprimir download.title=Descarregar download_label=Descarregar bookmark.title=Visão atual (copiar ou abrir em nova janela) bookmark_label=Visão atual # Secondary toolbar and context menu tools.title=Ferramentas tools_label=Ferramentas first_page.title=Ir para a primeira página first_page.label=Ir para a primeira página first_page_label=Ir para a primeira página last_page.title=Ir para a última página last_page.label=Ir para a última página last_page_label=Ir para a última página page_rotate_cw.title=Rodar à direita page_rotate_cw.label=Rodar à direita page_rotate_cw_label=Rodar à direita page_rotate_ccw.title=Rodar à esquerda page_rotate_ccw.label=Rodar à esquerda page_rotate_ccw_label=Rodar à esquerda hand_tool_enable.title=Ativar ferramenta de mão hand_tool_enable_label=Ativar ferramenta de mão hand_tool_disable.title=Desativar ferramenta de mão hand_tool_disable_label=Desativar ferramenta de mão # Document properties dialog box document_properties.title=Propriedades do documento… document_properties_label=Propriedades do documento… document_properties_file_name=Nome do ficheiro: document_properties_file_size=Tamanho do ficheiro: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=Título: document_properties_author=Autor: document_properties_subject=Assunto: document_properties_keywords=Palavras-chave: document_properties_creation_date=Data de criação: document_properties_modification_date=Data de modificação: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Criador: document_properties_producer=Produtor de PDF: document_properties_version=Versão do PDF: document_properties_page_count=N.º de páginas: document_properties_close=Fechar # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Comutar barra lateral toggle_sidebar_label=Comutar barra lateral outline.title=Mostrar estrutura do documento outline_label=Estrutura do documento attachments.title=Mostrar anexos attachments_label=Anexos thumbs.title=Mostrar miniaturas thumbs_label=Miniaturas findbar.title=Localizar no documento findbar_label=Localizar # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Página {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Miniatura da página {{page}} # Find panel button title and messages find_label=Localizar: find_previous.title=Localizar ocorrência anterior da frase find_previous_label=Anterior find_next.title=Localizar ocorrência seguinte da frase find_next_label=Seguinte find_highlight=Destacar tudo find_match_case_label=Correspondência find_reached_top=Início de documento atingido, a continuar do fim find_reached_bottom=Fim da página atingido, a continuar do início find_not_found=Frase não encontrada # Error panel labels error_more_info=Mais informação error_less_info=Menos informação error_close=Fechar # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (compilação: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Mensagem: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Pilha: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Ficheiro: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Linha: {{line}} rendering_error=Ocorreu um erro ao processar a página. # Predefined zoom values page_scale_width=Ajustar à largura page_scale_fit=Ajustar à página page_scale_auto=Tamanho automático page_scale_actual=Tamanho real # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Erro loading_error=Ocorreu um erro ao carregar o PDF. invalid_file_error=Ficheiro PDF inválido ou danificado. missing_file_error=Ficheiro PDF inexistente. unexpected_response_error=Resposta inesperada do servidor. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Anotação {{type}}] password_label=Digite a palavra-passe para abrir este PDF. password_invalid=Palavra-passe inválida. Por favor, tente novamente. password_ok=OK password_cancel=Cancelar printing_not_supported=Aviso: a impressão não é totalmente suportada por este navegador. printing_not_ready=Aviso: o PDF ainda não está totalmente carregado. web_fonts_disabled=Os tipos de letra web estão desativados: não é possível utilizar os tipos de letra PDF incorporados. document_colors_not_allowed=Os documentos PDF não permitem a utilização das suas próprias cores: 'Autorizar as páginas a escolher as suas próprias cores' está desativada no navegador. manuskript-0.10.0/libs/pdf.js/web/locale/rm/000077500000000000000000000000001354442177200205455ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/rm/viewer.properties000066400000000000000000000165531354442177200241760ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Pagina precedenta previous_label=Enavos next.title=Proxima pagina next_label=Enavant # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Pagina: page_of=da {{pageCount}} zoom_out.title=Empitschnir zoom_out_label=Empitschnir zoom_in.title=Engrondir zoom_in_label=Engrondir zoom.title=Zoom presentation_mode.title=Midar en il modus da preschentaziun presentation_mode_label=Modus da preschentaziun open_file.title=Avrir datoteca open_file_label=Avrir print.title=Stampar print_label=Stampar download.title=Telechargiar download_label=Telechargiar bookmark.title=Vista actuala (copiar u avrir en ina nova fanestra) bookmark_label=Vista actuala # Secondary toolbar and context menu tools.title=Utensils tools_label=Utensils first_page.title=Siglir a l'emprima pagina first_page.label=Siglir a l'emprima pagina first_page_label=Siglir a l'emprima pagina last_page.title=Siglir a la davosa pagina last_page.label=Siglir a la davosa pagina last_page_label=Siglir a la davosa pagina page_rotate_cw.title=Rotar en direcziun da l'ura page_rotate_cw.label=Rotar en direcziun da l'ura page_rotate_cw_label=Rotar en direcziun da l'ura page_rotate_ccw.title=Rotar en direcziun cuntraria a l'ura page_rotate_ccw.label=Rotar en direcziun cuntraria a l'ura page_rotate_ccw_label=Rotar en direcziun cuntraria a l'ura hand_tool_enable.title=Activar l'utensil da maun hand_tool_enable_label=Activar l'utensil da maun hand_tool_disable.title=Deactivar l'utensil da maun hand_tool_disable_label=Deactivar l'utensil da maun # Document properties dialog box document_properties.title=Caracteristicas dal document… document_properties_label=Caracteristicas dal document… document_properties_file_name=Num da la datoteca: document_properties_file_size=Grondezza da la datoteca: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=Titel: document_properties_author=Autur: document_properties_subject=Tema: document_properties_keywords=Chavazzins: document_properties_creation_date=Data da creaziun: document_properties_modification_date=Data da modificaziun: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}} {{time}} document_properties_creator=Creà da: document_properties_producer=Creà il PDF cun: document_properties_version=Versiun da PDF: document_properties_page_count=Dumber da paginas: document_properties_close=Serrar # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Activar/deactivar la trav laterala toggle_sidebar_label=Activar/deactivar la trav laterala outline.title=Mussar la structura da la pagina outline_label=Structura da la pagina attachments.title=Mussar agiuntas attachments_label=Agiuntas thumbs.title=Mussar las miniaturas thumbs_label=Miniaturas findbar.title=Tschertgar en il document findbar_label=Tschertgar # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Pagina {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Miniatura da la pagina {{page}} # Find panel button title and messages find_label=Tschertgar: find_previous.title=Tschertgar la posiziun precedenta da l'expressiun find_previous_label=Enavos find_next.title=Tschertgar la proxima posiziun da l'expressiun find_next_label=Enavant find_highlight=Relevar tuts find_match_case_label=Resguardar maiusclas/minusclas find_reached_top=Il cumenzament dal document è cuntanschì, la tschertga cuntinuescha a la fin dal document find_reached_bottom=La fin dal document è cuntanschì, la tschertga cuntinuescha al cumenzament dal document find_not_found=Impussibel da chattar l'expressiun # Error panel labels error_more_info=Dapli infurmaziuns error_less_info=Damain infurmaziuns error_close=Serrar # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Messadi: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stack: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Datoteca: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Lingia: {{line}} rendering_error=Ina errur è cumparida cun visualisar questa pagina. # Predefined zoom values page_scale_width=Ladezza da la pagina page_scale_fit=Entira pagina page_scale_auto=Zoom automatic page_scale_actual=Grondezza actuala # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Errur loading_error=Ina errur è cumparida cun chargiar il PDF. invalid_file_error=Datoteca PDF nunvalida u donnegiada. missing_file_error=Datoteca PDF manconta. unexpected_response_error=Resposta nunspetgada dal server. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Annotaziun da {{type}}] password_label=Endatescha il pled-clav per avrir questa datoteca da PDF. password_invalid=Pled-clav nunvalid. Emprova anc ina giada. password_ok=OK password_cancel=Interrumper printing_not_supported=Attenziun: Il stampar na funcziunescha anc betg dal tut en quest navigatur. printing_not_ready=Attenziun: Il PDF n'è betg chargià cumplettamain per stampar. web_fonts_disabled=Scrittiras dal web èn deactivadas: impussibel dad utilisar las scrittiras integradas en il PDF. document_colors_not_allowed=Documents da PDF na dastgan betg duvrar las atgnas colurs: 'Permetter a paginas da tscherner lur atgna colur' è deactivà en il navigatur. manuskript-0.10.0/libs/pdf.js/web/locale/ro/000077500000000000000000000000001354442177200205475ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/ro/viewer.properties000066400000000000000000000165321354442177200241750ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Pagina precedentă previous_label=Înapoi next.title=Pagina următoare next_label=Înainte # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Pagină: page_of=din {{pageCount}} zoom_out.title=Micșorează zoom_out_label=Micșorează zoom_in.title=Mărește zoom_in_label=Mărește zoom.title=Scalare presentation_mode.title=Schimbă la modul de prezentare presentation_mode_label=Mod de prezentare open_file.title=Deschide un fișier open_file_label=Deschide print.title=Tipărește print_label=Tipărește download.title=Descarcă download_label=Descarcă bookmark.title=Vizualizare actuală (copiați sau deschideți într-o fereastră nouă) bookmark_label=Vizualizare actuală # Secondary toolbar and context menu tools.title=Unelte tools_label=Unelte first_page.title=Mergi la prima pagină first_page.label=Mergeți la prima pagină first_page_label=Mergi la prima pagină last_page.title=Mergi la ultima pagină last_page.label=Mergi la ultima pagină last_page_label=Mergi la ultima pagină page_rotate_cw.title=Rotește în sensul acelor de ceasornic page_rotate_cw.label=Rotește în sensul acelor de ceasornic page_rotate_cw_label=Rotește în sensul acelor de ceasornic page_rotate_ccw.title=Rotește în sens invers al acelor de ceasornic page_rotate_ccw.label=Rotate Counter-Clockwise page_rotate_ccw_label=Rotește în sens invers acelor de ceasornic hand_tool_enable.title=Activează instrumentul mână hand_tool_enable_label=Activează instrumentul mână hand_tool_disable.title=Dezactivează instrumentul mână hand_tool_disable_label=Dezactivează instrumentul mână # Document properties dialog box document_properties.title=Proprietățile documentului… document_properties_label=Proprietățile documentului… document_properties_file_name=Nume fișier: document_properties_file_size=Dimensiune fișier: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} byți) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} byți) document_properties_title=Titlu: document_properties_author=Autor: document_properties_subject=Subiect: document_properties_keywords=Cuvinte cheie: document_properties_creation_date=Data creării: document_properties_modification_date=Data modificării: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Autor: document_properties_producer=Producător PDF: document_properties_version=Versiune PDF: document_properties_page_count=Număr de pagini: document_properties_close=Închide # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Comută bara laterală toggle_sidebar_label=Comută bara laterală outline.title=Arată schița documentului outline_label=Schiță document attachments.title=Afișează atașamentele attachments_label=Atașamente thumbs.title=Arată miniaturi thumbs_label=Miniaturi findbar.title=Caută în document findbar_label=Căutați # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Pagina {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Miniatura paginii {{page}} # Find panel button title and messages find_label=Caută: find_previous.title=Găsește instanța anterioară în frază find_previous_label=Anterior find_next.title=Găstește următoarea instanță în frază find_next_label=Următor find_highlight=Evidențiază aparițiile find_match_case_label=Potrivește literele mari și mici find_reached_top=Am ajuns la începutul documentului, continuă de la sfârșit find_reached_bottom=Am ajuns la sfârșitul documentului, continuă de la început find_not_found=Nu s-a găsit textul # Error panel labels error_more_info=Mai multe informații error_less_info=Mai puține informații error_close=Închide # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (varianta: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Mesaj: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stivă: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Fișier: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Linie: {{line}} rendering_error=A intervenit o eroare la afișarea paginii. # Predefined zoom values page_scale_width=Lățime pagină page_scale_fit=Potrivire la pagină page_scale_auto=Dimensiune automată page_scale_actual=Dimensiune reală # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Eroare loading_error=A intervenit o eroare la încărcarea fișierului PDF. invalid_file_error=Fișier PDF invalid sau deteriorat. missing_file_error=Fișier PDF lipsă. unexpected_response_error=Răspuns neașteptat de la server. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Adnotare] password_label=Introduceți parola pentru a deschide acest fișier PDF. password_invalid=Parolă greșită. Vă rugăm să încercați din nou. password_ok=Ok password_cancel=Renunță printing_not_supported=Atenție: Tipărirea nu este suportată în totalitate de acest browser. printing_not_ready=Atenție: Fișierul PDF nu este încărcat complet pentru tipărire. web_fonts_disabled=Fonturile web sunt dezactivate: nu pot utiliza fonturile PDF încorporate. document_colors_not_allowed=Documentele PDF nu sunt autorizate să folosească propriile culori: 'Permite paginilor să aleagă propriile culori' este dezactivată în browser. manuskript-0.10.0/libs/pdf.js/web/locale/ru/000077500000000000000000000000001354442177200205555ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/ru/viewer.properties000066400000000000000000000150341354442177200241770ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. previous.title = Предыдущая страница previous_label = Предыдущая next.title = Следующая страница next_label = Следующая page_label = Страница: page_of = из {{pageCount}} zoom_out.title = Уменьшить zoom_out_label = Уменьшить zoom_in.title = Увеличить zoom_in_label = Увеличить zoom.title = Масштаб presentation_mode.title = Перейти в режим презентации presentation_mode_label = Режим презентации open_file.title = Открыть файл open_file_label = Открыть print.title = Печать print_label = Печать download.title = Загрузить download_label = Загрузить bookmark.title = Ссылка на текущий вид (скопировать или открыть в новом окне) bookmark_label = Текущий вид tools.title = Инструменты tools_label = Инструменты first_page.title = Перейти на первую страницу first_page.label = Перейти на первую страницу first_page_label = Перейти на первую страницу last_page.title = Перейти на последнюю страницу last_page.label = Перейти на последнюю страницу last_page_label = Перейти на последнюю страницу page_rotate_cw.title = Повернуть по часовой стрелке page_rotate_cw.label = Повернуть по часовой стрелке page_rotate_cw_label = Повернуть по часовой стрелке page_rotate_ccw.title = Повернуть против часовой стрелки page_rotate_ccw.label = Повернуть против часовой стрелки page_rotate_ccw_label = Повернуть против часовой стрелки hand_tool_enable.title = Включить Инструмент «Рука» hand_tool_enable_label = Включить Инструмент «Рука» hand_tool_disable.title = Отключить Инструмент «Рука» hand_tool_disable_label = Отключить Инструмент «Рука» document_properties.title = Свойства документа… document_properties_label = Свойства документа… document_properties_file_name = Имя файла: document_properties_file_size = Размер файла: document_properties_kb = {{size_kb}} КБ ({{size_b}} байт) document_properties_mb = {{size_mb}} МБ ({{size_b}} байт) document_properties_title = Заголовок: document_properties_author = Автор: document_properties_subject = Тема: document_properties_keywords = Ключевые слова: document_properties_creation_date = Дата создания: document_properties_modification_date = Дата изменения: document_properties_date_string = {{date}}, {{time}} document_properties_creator = Приложение: document_properties_producer = Производитель PDF: document_properties_version = Версия PDF: document_properties_page_count = Число страниц: document_properties_close = Закрыть toggle_sidebar.title = Открыть/закрыть боковую панель toggle_sidebar_label = Открыть/закрыть боковую панель outline.title = Показать содержание документа outline_label = Содержание документа attachments.title = Показать вложения attachments_label = Вложения thumbs.title = Показать миниатюры thumbs_label = Миниатюры findbar.title = Найти в документе findbar_label = Найти thumb_page_title = Страница {{page}} thumb_page_canvas = Миниатюра страницы {{page}} find_label = Найти: find_previous.title = Найти предыдущее вхождение фразы в текст find_previous_label = Назад find_next.title = Найти следующее вхождение фразы в текст find_next_label = Далее find_highlight = Подсветить все find_match_case_label = С учётом регистра find_reached_top = Достигнут верх документа, продолжено снизу find_reached_bottom = Достигнут конец документа, продолжено сверху find_not_found = Фраза не найдена error_more_info = Детали error_less_info = Скрыть детали error_close = Закрыть error_version_info = PDF.js v{{version}} (сборка: {{build}}) error_message = Сообщение: {{message}} error_stack = Стeк: {{stack}} error_file = Файл: {{file}} error_line = Строка: {{line}} rendering_error = При создании страницы произошла ошибка. page_scale_width = По ширине страницы page_scale_fit = По размеру страницы page_scale_auto = Автоматически page_scale_actual = Реальный размер page_scale_percent = {{scale}}% loading_error_indicator = Ошибка loading_error = При загрузке PDF произошла ошибка. invalid_file_error = Некорректный или повреждённый PDF-файл. missing_file_error = PDF-файл отсутствует. unexpected_response_error = Неожиданный ответ сервера. text_annotation_type.alt = [Аннотация {{type}}] password_label = Введите пароль, чтобы открыть этот PDF-файл. password_invalid = Неверный пароль. Пожалуйста, попробуйте снова. password_ok = OK password_cancel = Отмена printing_not_supported = Предупреждение: В этом браузере не полностью поддерживается печать. printing_not_ready = Предупреждение: PDF не полностью загружен для печати. web_fonts_disabled = Веб-шрифты отключены: невозможно использовать встроенные PDF-шрифты. document_colors_not_allowed = PDF-документам не разрешено использовать свои цвета: в браузере отключён параметр «Разрешить веб-сайтам использовать свои цвета». manuskript-0.10.0/libs/pdf.js/web/locale/rw/000077500000000000000000000000001354442177200205575ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/rw/viewer.properties000066400000000000000000000062451354442177200242050ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. zoom.title=Ihindurangano open_file.title=Gufungura Dosiye open_file_label=Gufungura # Secondary toolbar and context menu # Document properties dialog box # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_title=Umutwe: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) findbar_label=Gushakisha # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. # Find panel button title and messages find_label="Gushaka:" find_previous.title=Gushaka aho uyu murongo ugaruka mbere y'aha find_next.title=Gushaka aho uyu murongo wongera kugaruka find_not_found=Umurongo ntubonetse # Error panel labels # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number # Predefined zoom values # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. # Loading indicator messages loading_error_indicator=Ikosa # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" password_invalid=Ijambo ry'ibanga ridahari. Wakongera ukagerageza password_ok=YEGO password_cancel=Kureka manuskript-0.10.0/libs/pdf.js/web/locale/sah/000077500000000000000000000000001354442177200207025ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/sah/viewer.properties000066400000000000000000000205471354442177200243310ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Инники сирэй previous_label=Иннинээҕи next.title=Аныгыскы сирэй next_label=Аныгыскы # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Сирэй: page_of=мантан {{pageCount}} zoom_out.title=Куччат zoom_out_label=Куччат zoom_in.title=Улаатыннар zoom_in_label=Улаатыннар zoom.title=Улаатыннар presentation_mode.title=Көрдөрөр эрэсиимҥэ presentation_mode_label=Көрдөрөр эрэсиим open_file.title=Билэни арый open_file_label=Ас print.title=Бэчээт print_label=Бэчээт download.title=Хачайдааһын download_label=Хачайдааһын bookmark.title=Билиҥҥи көстүүтэ (хатылаа эбэтэр саҥа түннүккэ арый) bookmark_label=Билиҥҥи көстүүтэ # Secondary toolbar and context menu tools.title=Тэриллэр tools_label=Тэриллэр first_page.title=Бастакы сирэйгэ көс first_page.label=Бастакы сирэйгэ көс first_page_label=Бастакы сирэйгэ көс last_page.title=Тиһэх сирэйгэ көс last_page.label=Тиһэх сирэйгэ көс last_page_label=Тиһэх сирэйгэ көс page_rotate_cw.title=Чаһы хоту эргит page_rotate_cw.label=Чаһы хоту эргит page_rotate_cw_label=Чаһы хоту эргит page_rotate_ccw.title=Чаһы утары эргит page_rotate_ccw.label=Чаһы утары эргит page_rotate_ccw_label=Чаһы утары эргит hand_tool_enable.title=«Илии» диэн тэрили холбоо hand_tool_enable_label=«Илии» диэн тэрили холбоо hand_tool_disable.title=«Илии» диэн тэрили араар hand_tool_disable_label=«Илии» диэн тэрили араар # Document properties dialog box document_properties.title=Докумуон туруоруулара... document_properties_label=Докумуон туруоруулара...\u0020 document_properties_file_name=Билэ аата: document_properties_file_size=Билэ кээмэйэ: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} КБ ({{size_b}} баайт) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} МБ ({{size_b}} баайт) document_properties_title=Баһа: document_properties_author=Ааптар: document_properties_subject=Тиэмэ: document_properties_keywords=Күлүүс тыл: document_properties_creation_date=Оҥоһуллубут кэмэ: document_properties_modification_date=Уларытыллыбыт кэмэ: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_producer=PDF оҥорооччу: document_properties_version=PDF барыла: document_properties_page_count=Сирэй ахсаана: document_properties_close=Сап # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Ойоҕос хапталы арый/сап toggle_sidebar_label=Ойоҕос хапталы арый/сап outline.title=Дөкүмүөн иһинээҕитин көрдөр outline_label=Дөкүмүөн иһинээҕитэ attachments.title=Кыбытыктары көрдөр attachments_label=Кыбытык thumbs.title=Ойуучааннары көрдөр thumbs_label=Ойуучааннар findbar.title=Дөкүмүөнтэн бул findbar_label=Бул # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Сирэй {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Сирэй ойуучаана {{page}} # Find panel button title and messages find_label=Бул: find_previous.title=Этии тиэкискэ бу иннинээҕи киириитин бул find_previous_label=Иннинээҕи find_next.title=Этии тиэкискэ бу кэннинээҕи киириитин бул find_next_label=Аныгыскы find_highlight=Барытын сырдатан көрдөр find_match_case_label=Буукуба улаханын-кыратын араар find_reached_top=Сирэй үрдүгэр тиийдиҥ, салгыыта аллара find_reached_bottom=Сирэй бүттэ, үөһэ салҕанна find_not_found=Этии көстүбэтэ # Error panel labels error_more_info=Сиһилии error_less_info=Сиһилиитин кистээ error_close=Сап # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (хомуйуута: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Этии: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Стeк: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Билэ: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Устуруока: {{line}} rendering_error=Сирэйи айарга алҕас таҕыста. # Predefined zoom values page_scale_width=Сирэй кэтитинэн page_scale_fit=Сирэй кээмэйинэн page_scale_auto=Аптамаатынан page_scale_actual=Дьиҥнээх кээмэйэ # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. # Loading indicator messages loading_error_indicator=Алҕас loading_error=PDF-билэни хачайдыырга алҕас таҕыста. invalid_file_error=Туох эрэ алҕастаах эбэтэр алдьаммыт PDF-билэ. missing_file_error=PDF-билэ суох. unexpected_response_error=Сиэрбэр хоруйдаабат. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} туһунан] password_label=Бу PDF-билэни арыйарга көмүскэл тылы киллэриэхтээхин. password_invalid=Киирии тыл алҕастаах. Бука диэн, хатылаан көр. password_ok=СӨП password_cancel=Салҕаама printing_not_supported=Сэрэтии: Бу браузер бэчээттиири толору өйөөбөт. printing_not_ready=Сэрэтии: PDF бэчээттииргэ толору хачайдана илик. web_fonts_disabled=Ситим-бичиктэр араарыллыахтара: PDF бичиктэрэ кыайан көстүбэттэр. document_colors_not_allowed=PDF-дөкүмүөүннэргэ бэйэлэрин өҥнөрүн туттар көҥүллэммэтэ: "Ситим-сирдэр бэйэлэрин өҥнөрүн тутталларын көҥүллүүргэ" диэн браузерга арахса сылдьар эбит. manuskript-0.10.0/libs/pdf.js/web/locale/si/000077500000000000000000000000001354442177200205425ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/si/viewer.properties000066400000000000000000000234051354442177200241650ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=මීට පෙර පිටුව previous_label=පෙර next.title=මීළඟ පිටුව next_label=මීළඟ # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=පිටුව: page_of={{pageCount}} කින් zoom_out.title=කුඩා කරන්න zoom_out_label=කුඩා කරන්න zoom_in.title=විශාල කරන්න zoom_in_label=විශාල කරන්න zoom.title=විශාලණය presentation_mode.title=ඉදිරිපත්කිරීම් ප්‍රකාරය වෙත මාරුවන්න presentation_mode_label=ඉදිරිපත්කිරීම් ප්‍රකාරය open_file.title=ගොනුව විවෘත කරන්න open_file_label=විවෘත කරන්න print.title=මුද්‍රණය print_label=මුද්‍රණය download.title=බාගන්න download_label=බාගන්න bookmark.title=දැනට ඇති දසුන (පිටපත් කරන්න හෝ නව කවුළුවක විවෘත කරන්න) bookmark_label=දැනට ඇති දසුන # Secondary toolbar and context menu tools.title=මෙවලම් tools_label=මෙවලම් first_page.title=මුල් පිටුවට යන්න first_page.label=මුල් පිටුවට යන්න first_page_label=මුල් පිටුවට යන්න last_page.title=අවසන් පිටුවට යන්න last_page.label=අවසන් පිටුවට යන්න last_page_label=අවසන් පිටුවට යන්න page_rotate_cw.title=දක්ශිණාවර්තව භ්‍රමණය page_rotate_cw.label=දක්ශිණාවර්තව භ්‍රමණය page_rotate_cw_label=දක්ශිණාවර්තව භ්‍රමණය page_rotate_ccw.title=වාමාවර්තව භ්‍රමණය page_rotate_ccw.label=වාමාවර්තව භ්‍රමණය page_rotate_ccw_label=වාමාවර්තව භ්‍රමණය hand_tool_enable.title=හස්ත මෙවලම සක්‍රීය hand_tool_enable_label=හස්ත මෙවලම සක්‍රීය hand_tool_disable.title=හස්ත මෙවලම අක්‍රීය hand_tool_disable_label=හස්ත මෙවලම අක්‍රීය # Document properties dialog box document_properties.title=ලේඛන වත්කම්... document_properties_label=ලේඛන වත්කම්... document_properties_file_name=ගොනු නම: document_properties_file_size=ගොනු ප්‍රමාණය: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} බයිට) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} බයිට) document_properties_title=සිරස්තලය: document_properties_author=කතෲ document_properties_subject=මාතෘකාව: document_properties_keywords=යතුරු වදන්: document_properties_creation_date=නිර්මිත දිනය: document_properties_modification_date=වෙනස්කල දිනය: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=නිර්මාපක: document_properties_producer=PDF නිශ්පාදක: document_properties_version=PDF නිකුතුව: document_properties_page_count=පිටු ගණන: document_properties_close=වසන්න # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=පැති තීරුවට මාරුවන්න toggle_sidebar_label=පැති තීරුවට මාරුවන්න outline.title=ලේඛනයේ පිට මායිම පෙන්වන්න outline_label=ලේඛනයේ පිට මායිම attachments.title=ඇමිණුම් පෙන්වන්න attachments_label=ඇමිණුම් thumbs.title=සිඟිති රූ පෙන්වන්න thumbs_label=සිඟිති රූ findbar.title=ලේඛනය තුළ සොයන්න findbar_label=සොයන්න # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=පිටුව {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=පිටුවෙ සිඟිත රූව {{page}} # Find panel button title and messages find_label=සොයන්න: find_previous.title=මේ වාක්‍ය ඛණ්ඩය මීට පෙර යෙදුණු ස්ථානය සොයන්න find_previous_label=පෙර: find_next.title=මේ වාක්‍ය ඛණ්ඩය මීළඟට යෙදෙන ස්ථානය සොයන්න find_next_label=මීළඟ find_highlight=සියල්ල උද්දීපනය find_match_case_label=අකුරු ගළපන්න find_reached_top=පිටුවේ ඉහළ කෙළවරට ලගාවිය, පහළ සිට ඉදිරියට යමින් find_reached_bottom=පිටුවේ පහළ කෙළවරට ලගාවිය, ඉහළ සිට ඉදිරියට යමින් find_not_found=ඔබ සෙව් වචන හමු නොවීය # Error panel labels error_more_info=බොහෝ තොරතුරු error_less_info=අවම තොරතුරු error_close=වසන්න # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (නිකුතුව: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=පණිවිඩය: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stack: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=ගොනුව: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=පේළිය: {{line}} rendering_error=පිටුව රෙන්ඩර් විමේදි ගැටලුවක් හට ගැනුණි. # Predefined zoom values page_scale_width=පිටුවේ පළල page_scale_fit=පිටුවට සුදුසු ලෙස page_scale_auto=ස්වයංක්‍රීය විශාලණය page_scale_actual=නියමිත ප්‍රමාණය # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=දෝෂය loading_error=PDF පූරණය විමේදි දෝෂයක් හට ගැනුණි. invalid_file_error=දූශිත හෝ සාවද්‍ය PDF ගොනුව. missing_file_error=නැතිවූ PDF ගොනුව. unexpected_response_error=බලාපොරොත්තු නොවූ සේවාදායක ප්‍රතිචාරය. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} විස්තරය] password_label=මෙම PDF ගොනුව විවෘත කිරීමට මුරපදය ඇතුළත් කරන්න. password_invalid=වැරදි මුරපදයක්. කරුණාකර නැවත උත්සහ කරන්න. password_ok=හරි password_cancel=එපා printing_not_supported=අවවාදයයි: මෙම ගවේශකය මුද්‍රණය සඳහා සම්පූර්ණයෙන් සහය නොදක්වයි. printing_not_ready=අවවාදයයි: මුද්‍රණය සඳහා PDF සම්පූර්ණයෙන් පූර්ණය වී නොමැත. web_fonts_disabled=ජාල අකුරු අක්‍රීයයි: තිළැලි PDF අකුරු භාවිත කළ නොහැක. document_colors_disabled=PDF ලේඛනයට ඔවුන්ගේම වර්ණ භාවිතයට ඉඩ නොලැබේ: 'පිටු වෙත ඔවුන්ගේම වර්ණ භාවිතයට ඉඩදෙන්න' ගවේශකය මත අක්‍රීය කර ඇත. manuskript-0.10.0/libs/pdf.js/web/locale/sk/000077500000000000000000000000001354442177200205445ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/sk/viewer.properties000066400000000000000000000165151354442177200241730ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Predchádzajúca strana previous_label=Predchádzajúca next.title=Nasledujúca strana next_label=Nasledujúca # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Strana: page_of=z {{pageCount}} zoom_out.title=Vzdialiť zoom_out_label=Vzdialiť zoom_in.title=Priblížiť zoom_in_label=Priblížiť zoom.title=Lupa presentation_mode.title=Prepnúť na režim Prezentácia presentation_mode_label=Režim Prezentácia open_file.title=Otvoriť súbor open_file_label=Otvoriť print.title=Tlačiť print_label=Tlačiť download.title=Prevziať download_label=Prevziať bookmark.title=Aktuálne zobrazenie (kopírovať alebo otvoriť v novom okne) bookmark_label=Aktuálne zobrazenie # Secondary toolbar and context menu tools.title=Nástroje tools_label=Nástroje first_page.title=Prejsť na prvú stranu first_page.label=Prejsť na prvú stranu first_page_label=Prejsť na prvú stranu last_page.title=Prejsť na poslednú stranu last_page.label=Prejsť na poslednú stranu last_page_label=Prejsť na poslednú stranu page_rotate_cw.title=Otočiť v smere hodinových ručičiek page_rotate_cw.label=Otočiť v smere hodinových ručičiek page_rotate_cw_label=Otočiť v smere hodinových ručičiek page_rotate_ccw.title=Otočiť proti smeru hodinových ručičiek page_rotate_ccw.label=Otočiť proti smeru hodinových ručičiek page_rotate_ccw_label=Otočiť proti smeru hodinových ručičiek hand_tool_enable.title=Zapnúť nástroj Ruka hand_tool_enable_label=Zapnúť nástroj Ruka hand_tool_disable.title=Vypnúť nástroj Ruka hand_tool_disable_label=Vypnúť nástroj Ruka # Document properties dialog box document_properties.title=Vlastnosti dokumentu… document_properties_label=Vlastnosti dokumentu… document_properties_file_name=Názov súboru: document_properties_file_size=Veľkosť súboru: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} kB ({{size_b}} bajtov) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bajtov) document_properties_title=Názov: document_properties_author=Autor: document_properties_subject=Predmet: document_properties_keywords=Kľúčové slová: document_properties_creation_date=Dátum vytvorenia: document_properties_modification_date=Dátum úpravy: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Vytvoril: document_properties_producer=Tvorca PDF: document_properties_version=Verzia PDF: document_properties_page_count=Počet strán: document_properties_close=Zavrieť # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Prepnúť bočný panel toggle_sidebar_label=Prepnúť bočný panel outline.title=Zobraziť prehľad dokumentu outline_label=Prehľad dokumentu attachments.title=Zobraziť prílohy attachments_label=Prílohy thumbs.title=Zobraziť miniatúry thumbs_label=Miniatúry findbar.title=Hľadať v dokumente findbar_label=Hľadať # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Strana {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Miniatúra strany {{page}} # Find panel button title and messages find_label=Hľadať: find_previous.title=Vyhľadať predchádzajúci výskyt reťazca find_previous_label=Predchádzajúce find_next.title=Vyhľadať ďalší výskyt reťazca find_next_label=Ďalšie find_highlight=Zvýrazniť všetky find_match_case_label=Rozlišovať malé/veľké písmená find_reached_top=Bol dosiahnutý začiatok stránky, pokračuje sa od konca find_reached_bottom=Bol dosiahnutý koniec stránky, pokračuje sa od začiatku find_not_found=Výraz nebol nájdený # Error panel labels error_more_info=Viac informácií error_less_info=Menej informácií error_close=Zavrieť # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (zostavenie: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Správa: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Zásobník: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Súbor: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Riadok: {{line}} rendering_error=Pri vykresľovaní stránky sa vyskytla chyba. # Predefined zoom values page_scale_width=Na šírku strany page_scale_fit=Na veľkosť strany page_scale_auto=Automatická veľkosť page_scale_actual=Skutočná veľkosť # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Chyba loading_error=Počas načítavania dokumentu PDF sa vyskytla chyba. invalid_file_error=Neplatný alebo poškodený súbor PDF. missing_file_error=Chýbajúci súbor PDF. unexpected_response_error=Neočakávaná odpoveď zo servera. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Anotácia typu {{type}}] password_label=Ak chcete otvoriť tento súbor PDF, zadajte jeho heslo. password_invalid=Heslo nie je platné. Skúste to znova. password_ok=OK password_cancel=Zrušiť printing_not_supported=Upozornenie: tlač nie je v tomto prehliadači plne podporovaná. printing_not_ready=Upozornenie: súbor PDF nie je plne načítaný pre tlač. web_fonts_disabled=Webové písma sú vypnuté: nie je možné použiť písma vložené do súboru PDF. document_colors_not_allowed=Dokumenty PDF nemajú povolené používať vlastné farby, pretože voľba "Povoliť stránkam používať vlastné farby" je v nastaveniach prehliadača vypnutá. manuskript-0.10.0/libs/pdf.js/web/locale/sl/000077500000000000000000000000001354442177200205455ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/sl/viewer.properties000066400000000000000000000157501354442177200241740ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Prejšnja stran previous_label=Nazaj next.title=Naslednja stran next_label=Naprej # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Stran: page_of=od {{pageCount}} zoom_out.title=Pomanjšaj zoom_out_label=Pomanjšaj zoom_in.title=Povečaj zoom_in_label=Povečaj zoom.title=Povečava presentation_mode.title=Preklopi v način predstavitve presentation_mode_label=Način predstavitve open_file.title=Odpri datoteko open_file_label=Odpri print.title=Natisni print_label=Natisni download.title=Prenesi download_label=Prenesi bookmark.title=Trenutni pogled (kopiraj ali odpri v novem oknu) bookmark_label=Trenutni pogled # Secondary toolbar and context menu tools.title=Orodja tools_label=Orodja first_page.title=Pojdi na prvo stran first_page.label=Pojdi na prvo stran first_page_label=Pojdi na prvo stran last_page.title=Pojdi na zadnjo stran last_page.label=Pojdi na zadnjo stran last_page_label=Pojdi na zadnjo stran page_rotate_cw.title=Zavrti v smeri urninega kazalca page_rotate_cw.label=Zavrti v smeri urninega kazalca page_rotate_cw_label=Zavrti v smeri urninega kazalca page_rotate_ccw.title=Zavrti v nasprotni smeri urninega kazalca page_rotate_ccw.label=Zavrti v nasprotni smeri urninega kazalca page_rotate_ccw_label=Zavrti v nasprotni smeri urninega kazalca hand_tool_enable.title=Omogoči roko hand_tool_enable_label=Omogoči roko hand_tool_disable.title=Onemogoči roko hand_tool_disable_label=Onemogoči roko # Document properties dialog box document_properties.title=Lastnosti dokumenta … document_properties_label=Lastnosti dokumenta … document_properties_file_name=Ime datoteke: document_properties_file_size=Velikost datoteke: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bajtov) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bajtov) document_properties_title=Ime: document_properties_author=Avtor: document_properties_subject=Tema: document_properties_keywords=Ključne besede: document_properties_creation_date=Datum nastanka: document_properties_modification_date=Datum spremembe: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Ustvaril: document_properties_producer=Izdelovalec PDF: document_properties_version=Različica PDF: document_properties_page_count=Število strani: document_properties_close=Zapri # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Preklopi stransko vrstico toggle_sidebar_label=Preklopi stransko vrstico outline.title=Prikaži oris dokumenta outline_label=Oris dokumenta attachments.title=Prikaži priponke attachments_label=Priponke thumbs.title=Prikaži sličice thumbs_label=Sličice findbar.title=Iskanje po dokumentu findbar_label=Iskanje # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Stran {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Sličica strani {{page}} # Find panel button title and messages find_label=Najdi: find_previous.title=Najdi prejšnjo ponovitev iskanega find_previous_label=Najdi nazaj find_next.title=Najdi naslednjo ponovitev iskanega find_next_label=Najdi naprej find_highlight=Označi vse find_match_case_label=Razlikuj velike/male črke find_reached_top=Dosežen začetek dokumenta iz smeri konca find_reached_bottom=Doseženo konec dokumenta iz smeri začetka find_not_found=Iskanega ni mogoče najti # Error panel labels error_more_info=Več informacij error_less_info=Manj informacij error_close=Zapri # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js r{{version}} (graditev: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Sporočilo: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Sklad: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Datoteka: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Vrstica: {{line}} rendering_error=Med pripravljanjem strani je prišlo do napake! # Predefined zoom values page_scale_width=Širina strani page_scale_fit=Prilagodi stran page_scale_auto=Samodejno page_scale_actual=Dejanska velikost # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}} % # Loading indicator messages loading_error_indicator=Napaka loading_error=Med nalaganjem datoteke PDF je prišlo do napake. invalid_file_error=Neveljavna ali pokvarjena datoteka PDF. missing_file_error=Ni datoteke PDF. unexpected_response_error=Nepričakovan odgovor strežnika. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Opomba vrste {{type}}] password_label=Vnesite geslo za odpiranje te datoteke PDF. password_invalid=Neveljavno geslo. Poskusite znova. password_ok=V redu password_cancel=Prekliči printing_not_supported=Opozorilo: ta brskalnik ne podpira vseh možnosti tiskanja. printing_not_ready=Opozorilo: PDF ni v celoti naložen za tiskanje. web_fonts_disabled=Spletne pisave so onemogočene: vgradnih pisav za PDF ni mogoče uporabiti. document_colors_not_allowed=Dokumenti PDF ne smejo uporabljati svojih lastnih barv: možnost 'Dovoli stranem uporabo lastnih barv' je v brskalniku onemogočena. manuskript-0.10.0/libs/pdf.js/web/locale/son/000077500000000000000000000000001354442177200207265ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/son/viewer.properties000066400000000000000000000153631354442177200243550ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Moo bisante previous_label=Bisante next.title=Jinehere moo next_label=Jine # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=&Moo: page_of={{pageCount}} ga zoom_out.title=Nakasandi zoom_out_label=Nakasandi zoom_in.title=Bebbeerandi zoom_in_label=Bebbeerandi zoom.title=Bebbeerandi presentation_mode.title=Bere cebeyan alhaali presentation_mode_label=Cebeyan alhaali open_file.title=Tuku feeri open_file_label=Feeri print.title=Kar print_label=Kar download.title=Zumandi download_label=Zumandi bookmark.title=Sohõ gunarro (bere wala feeri zanfun taaga ra) bookmark_label=Sohõ gunaroo # Secondary toolbar and context menu tools.title=Goyjinawey tools_label=Goyjinawey first_page.title=Koy moo jinaa ga first_page.label=Koy moo jinaa ga first_page_label=Koy moo jinaa ga last_page.title=Koy moo koraa ga last_page.label=Koy moo koraa ga last_page_label=Koy moo koraa ga page_rotate_cw.title=Kuubi kanbe guma here page_rotate_cw.label=Kuubi kanbe guma here page_rotate_cw_label=Kuubi kanbe guma here page_rotate_ccw.title=Kuubi kanbe wowa here page_rotate_ccw.label=Kuubi kanbe wowa here page_rotate_ccw_label=Kuubi kanbe wowa here hand_tool_enable.title=Kanbe goyjinay tunandi hand_tool_enable_label=Kanbe goyjinay tunandi hand_tool_disable.title=Kanbe joyjinay kaa hand_tool_disable_label=Kanbe goyjinay kaa # Document properties dialog box document_properties.title=Takadda mayrawey… document_properties_label=Takadda mayrawey… document_properties_file_name=Tuku maa: document_properties_file_size=Tuku adadu: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb=KB {{size_kb}} (cebsu-ize {{size_b}}) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb=MB {{size_mb}} (cebsu-ize {{size_b}}) document_properties_title=Tiiramaa: document_properties_author=Hantumkaw: document_properties_subject=Dalil: document_properties_keywords=Kufalkalimawey: document_properties_creation_date=Teeyan han: document_properties_modification_date=Barmayan han: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Teekaw: document_properties_producer=PDF berandikaw: document_properties_version=PDF dumi: document_properties_page_count=Moo hinna: document_properties_close=Daabu # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Kanjari ceraw zuu toggle_sidebar_label=Kanjari ceraw zuu outline.title=Takadda filla-boŋ cebe outline_label=Takadda filla-boŋ attachments.title=Hangarey cebe attachments_label=Hangarey thumbs.title=Kabeboy biyey cebe thumbs_label=Kabeboy biyey findbar.title=Ceeci takaddaa ra findbar_label=Ceeci # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title={{page}} moo # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Kabeboy bii {{page}} moo še # Find panel button title and messages find_label=Ceeci: find_previous.title=Kalimaɲaŋoo bangayri bisantaa ceeci find_previous_label=Bisante find_next.title=Kalimaɲaŋoo hiino bangayroo ceeci find_next_label=Jine find_highlight=Ikul šilbay find_match_case_label=Harfu-beeriyan hawgay find_reached_top=A too moŋoo boŋoo, koy jine ka šinitin nda cewoo find_reached_bottom=A too moɲoo cewoo, koy jine šintioo ga find_not_found=Kalimaɲaa mana duwandi # Error panel labels error_more_info=Alhabar tontoni error_less_info=Alhabar tontoni error_close=Daabu # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Alhabar: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Dekeri: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Tuku: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Žeeri: {{line}} rendering_error=Firka bangay kaŋ moɲoo goo ma willandi. # Predefined zoom values page_scale_width=Mooo hayyan page_scale_fit=Moo sawayan page_scale_auto=Boŋše azzaati barmayyan page_scale_actual=Adadu cimi # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Firka loading_error=Firka bangay kaŋ PDF goo ma zumandi. invalid_file_error=PDF tuku laala wala laybante. missing_file_error=PDF tuku kumante. unexpected_response_error=Manti feršikaw tuuruyan maatante. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt={{type}} maasa-caw] password_label=Šennikufal dam ka PDF tukoo woo feeri. password_invalid=Šennikufal laalo. Ceeci koyne taare. password_ok=Ayyo password_cancel=Naŋ printing_not_supported=Yaamar: Karyan ši tee ka timme nda ceecikaa woo. printing_not_ready=Yaamar: PDF ši zunbu ka timme karyan še. web_fonts_disabled=Interneti šigirawey kay: ši hin ka goy nda PDF šigira hurantey. document_colors_not_allowed=PDF takaddawey ši duu fondo ka ngey boŋ noonawey zaa: 'Naŋ moɲey ma ngey boŋ noonawey suuba' ši dira ceecikaa ga. manuskript-0.10.0/libs/pdf.js/web/locale/sq/000077500000000000000000000000001354442177200205525ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/sq/viewer.properties000066400000000000000000000151031354442177200241710ustar00rootroot00000000000000# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # Main toolbar buttons (tooltips and alt text for images) previous.title=Faqja e Mëparshme previous_label=E mëparshmja next.title=Faqja Pasuese next_label=Pasuesja # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Faqja: page_of=nga {{pageCount}} zoom_out.title=Zmadhim zoom_out_label=Zmadhoji zoom_in.title=Zvogëlim zoom_in_label=Zvogëloji zoom.title=Zoom print.title=Shtypje print_label=Shtypeni presentation_mode.title=Kalo te Mënyra Paraqitje presentation_mode_label=Mënyra Paraqitje open_file.title=Hapni Kartelë open_file_label=Hapeni download.title=Shkarkim download_label=Shkarkojeni bookmark.title=Pamja e tanishme (kopjojeni ose hapeni në dritare të re) bookmark_label=Pamja e Tanishme # Secondary toolbar and context menu tools.title=Mjete tools_label=Mjete first_page.title=Shkoni te Faqja e Parë first_page.label=Shkoni te Faqja e Parë first_page_label=Shkoni te Faqja e Parë last_page.title=Shkoni te Faqja e Fundit last_page.label=Shkoni te Faqja e Fundit last_page_label=Shkoni te Faqja e Fundit page_rotate_cw.title=Rrotullojeni Në Kahun Orar page_rotate_cw.label=Rrotullojeni Në Kahun Orar page_rotate_cw_label=Rrotullojeni Në Kahun Orar page_rotate_ccw.title=Rrotullojeni Në Kahun Kundërorar page_rotate_ccw.label=Rrotullojeni Në Kahun Kundërorar page_rotate_ccw_label=Rrotullojeni Në Kahun Kundërorar hand_tool_enable.title=Aktivizoni mjet dore hand_tool_enable_label=Aktivizoni mjet dore hand_tool_disable.title=Çaktivizoni mjet dore hand_tool_disable_label=Çaktivizoni mjet dore # Document properties dialog box document_properties.title=Veti Dokumenti… document_properties_label=Veti Dokumenti… document_properties_file_name=Emër kartele: document_properties_file_size=Madhësi kartele: document_properties_kb={{size_kb}} KB ({{size_b}} bajte) document_properties_mb={{size_mb}} MB ({{size_b}} bajte) document_properties_title=Titull: document_properties_author=Autor: document_properties_subject=Subjekt: document_properties_keywords=Fjalëkyçe: document_properties_creation_date=Datë Krijimi: document_properties_modification_date=Datë Ndryshimi: document_properties_date_string={{date}}, {{time}} document_properties_creator=Krijues: document_properties_producer=Prodhues PDF-je: document_properties_version=Version PDF-je: document_properties_page_count=Numër Faqesh: document_properties_close=Mbylle # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Shfaqni/Fshihni Anështyllën toggle_sidebar_label=Shfaqni/Fshihni Anështyllën outline.title=Shfaq Përvijim Dokumenti outline_label=Shfaq Përvijim Dokumenti attachments.title=Shfaq Bashkëngjitje attachments_label=Bashkëngjitje thumbs.title=Shfaq Miniatura thumbs_label=Miniatura findbar.title=Gjej në Dokument findbar_label=Gjej # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Faqja {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Miniaturë e Faqes {{page}} # Context menu first_page.label=Kalo te Faqja e Parë last_page.label=Kalo te Faqja e Fundit page_rotate_cw.label=Rrotulloje Në Kahun Orar page_rotate_ccw.label=Rrotulloje Në Kahun Antiorar # Find panel button title and messages find_label=Gjej: find_previous.title=Gjeni hasjen e mëparshme të togfjalëshit find_previous_label=E mëparshmja find_next.title=Gjeni hasjen pasuese të togfjalëshit find_next_label=Pasuesja find_highlight=Theksoji të gjitha find_match_case_label=Siç është shkruar find_reached_top=U mbërrit në krye të dokumentit, vazhduar prej fundit find_reached_bottom=U mbërrit në fund të dokumentit, vazhduar prej kreut find_not_found=Nuk u gjet togfjalëshi # Error panel labels error_more_info=Më Tepër të Dhëna error_less_info=Më Pak të Dhëna error_close=Mbylle # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Mesazh: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stack: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Kartelë: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Rresht: {{line}} rendering_error=Ndodhi një gabim gjatë riprodhimit të faqes. # Predefined zoom values page_scale_width=Gjerësi Faqeje page_scale_fit=Sa Nxë Faqja page_scale_auto=Zoom i Vetvetishëm page_scale_actual=Madhësia Faktike # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages # LOCALIZATION NOTE (error_line): "{{[percent}}" will be replaced with a percentage loading_error_indicator=Gabim loading_error=Ndodhi një gabim gjatë ngarkimit të PDF-së. invalid_file_error=Kartelë PDF e pavlefshme ose e dëmtuar. missing_file_error=Kartelë PDF që mungon. unexpected_response_error=Përgjigje shërbyesi e papritur. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Nënvizim {{type}}] password_label=Jepni fjalëkalimin që të hapet kjo kartelë PDF. password_invalid=Fjalëkalim i pavlefshëm. Ju lutemi, riprovoni. password_ok=OK password_cancel=Anuloje printing_not_supported=Kujdes: Shtypja nuk mbulohet plotësisht nga ky shfletues. printing_not_ready=Kujdes: PDF-ja nuk është ngarkuar plotësisht që ta shtypni. web_fonts_disabled=Shkronjat Web janë të çaktivizuara: i pazoti të përdorë shkronja të trupëzuara në PDF. document_colors_not_allowed=Dokumenteve PDF s’u lejohet të përdorin ngjyrat e tyre: 'Lejoji faqet t'i zgjedhin vetë ngjyrat' është e çaktivizuar te shfletuesi. manuskript-0.10.0/libs/pdf.js/web/locale/sr/000077500000000000000000000000001354442177200205535ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/sr/viewer.properties000066400000000000000000000214601354442177200241750ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Претходна страница previous_label=Претходна next.title=Следећа страница next_label=Следећа # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Страница: page_of=од {{pageCount}} zoom_out.title=Умањи zoom_out_label=Умањи zoom_in.title=Увеличај zoom_in_label=Увеличај zoom.title=Увеличавање presentation_mode.title=Промени на приказ у режиму презентације presentation_mode_label=Режим презентације open_file.title=Отвори датотеку open_file_label=Отвори print.title=Штампај print_label=Штампај download.title=Преузми download_label=Преузми bookmark.title=Тренутни приказ (копирај или отвори нови прозор) bookmark_label=Тренутни приказ # Secondary toolbar and context menu tools.title=Алатке tools_label=Алатке first_page.title=Иди на прву страницу first_page.label=Иди на прву страницу first_page_label=Иди на прву страницу last_page.title=Иди на последњу страницу last_page.label=Иди на последњу страницу last_page_label=Иди на последњу страницу page_rotate_cw.title=Ротирај у смеру казаљке на сату page_rotate_cw.label=Ротирај у смеру казаљке на сату page_rotate_cw_label=Ротирај у смеру казаљке на сату page_rotate_ccw.title=Ротирај у смеру супротном од казаљке на сату page_rotate_ccw.label=Ротирај у смеру супротном од казаљке на сату page_rotate_ccw_label=Ротирај у смеру супротном од казаљке на сату hand_tool_enable.title=Омогући алатку за померање hand_tool_enable_label=Омогући алатку за померање hand_tool_disable.title=Онемогући алатку за померање hand_tool_disable_label=Онемогући алатку за померање # Document properties dialog box document_properties.title=Параметри документа… document_properties_label=Параметри документа… document_properties_file_name=Име датотеке: document_properties_file_size=Величина датотеке: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} B) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} B) document_properties_title=Наслов: document_properties_author=Аутор: document_properties_subject=Тема: document_properties_keywords=Кључне речи: document_properties_creation_date=Датум креирања: document_properties_modification_date=Датум модификације: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Стваралац: document_properties_producer=PDF произвођач: document_properties_version=PDF верзија: document_properties_page_count=Број страница: document_properties_close=Затвори # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Прикажи додатну палету toggle_sidebar_label=Прикажи додатну палету outline.title=Прикажи контуру документа outline_label=Контура документа attachments.title=Прикажи прилоге attachments_label=Прилози thumbs.title=Прикажи сличице thumbs_label=Сличице findbar.title=Пронађи у документу findbar_label=Пронађи # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Страница {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Сличица од странице {{page}} # Find panel button title and messages find_label=Пронађи: find_previous.title=Пронађи претходну појаву фразе find_previous_label=Претходна find_next.title=Пронађи следећу појаву фразе find_next_label=Следећа find_highlight=Истакнути све find_match_case_label=Подударања find_reached_top=Достигнут врх документа, наставио са дна find_reached_bottom=Достигнуто дно документа, наставио са врха find_not_found=Фраза није пронађена # Error panel labels error_more_info=Више информација error_less_info=Мање информација error_close=Затвори # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Порука: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Стек: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Датотека: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Линија: {{line}} rendering_error=Дошло је до грешке приликом рендеровања ове странице. # Predefined zoom values page_scale_width=Ширина странице page_scale_fit=Прилагоди страницу page_scale_auto=Аутоматско увеличавање page_scale_actual=Стварна величина # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Грешка loading_error=Дошло је до грешке приликом учитавања PDF-а. invalid_file_error=PDF датотека је оштећена или је неисправна. missing_file_error=PDF датотека није пронађена. unexpected_response_error=Неочекиван одговор од сервера. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} коментар] password_label=Унесите лозинку да бисте отворили овај PDF докуменат. password_invalid=Неисправна лозинка. Покушајте поново. password_ok=У реду password_cancel=Откажи printing_not_supported=Упозорење: Штампање није у потпуности подржано у овом прегледачу. printing_not_ready=Упозорење: PDF није у потпуности учитан за штампу. web_fonts_disabled=Веб фонтови су онемогућени: не могу користити уграђене PDF фонтове. document_colors_not_allowed=PDF документи не могу да користе сопствене боје: “Дозволи страницама да изаберу своје боје” је деактивирано у прегледачу. manuskript-0.10.0/libs/pdf.js/web/locale/sv-SE/000077500000000000000000000000001354442177200210645ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/sv-SE/viewer.properties000066400000000000000000000153571354442177200245160ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Föregående sida previous_label=Föregående next.title=Nästa sida next_label=Nästa # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Sida: page_of=av {{pageCount}} zoom_out.title=Zooma ut zoom_out_label=Zooma ut zoom_in.title=Zooma in zoom_in_label=Zooma in zoom.title=Zoom presentation_mode.title=Byt till presentationsläge presentation_mode_label=Presentationsläge open_file.title=Öppna fil open_file_label=Öppna print.title=Skriv ut print_label=Skriv ut download.title=Hämta download_label=Hämta bookmark.title=Aktuell vy (kopiera eller öppna i nytt fönster) bookmark_label=Aktuell vy # Secondary toolbar and context menu tools.title=Verktyg tools_label=Verktyg first_page.title=Gå till första sidan first_page.label=Gå till första sidan first_page_label=Gå till första sidan last_page.title=Gå till sista sidan last_page.label=Gå till sista sidan last_page_label=Gå till sista sidan page_rotate_cw.title=Rotera medurs page_rotate_cw.label=Rotera medurs page_rotate_cw_label=Rotera medurs page_rotate_ccw.title=Rotera moturs page_rotate_ccw.label=Rotera moturs page_rotate_ccw_label=Rotera moturs hand_tool_enable.title=Aktivera handverktyg hand_tool_enable_label=Aktivera handverktyg hand_tool_disable.title=Inaktivera handverktyg hand_tool_disable_label=Inaktivera handverktyg # Document properties dialog box document_properties.title=Dokumentegenskaper… document_properties_label=Dokumentegenskaper… document_properties_file_name=Filnamn: document_properties_file_size=Filstorlek: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} kB ({{size_b}} byte) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} byte) document_properties_title=Titel: document_properties_author=Författare: document_properties_subject=Ämne: document_properties_keywords=Nyckelord: document_properties_creation_date=Skapades: document_properties_modification_date=Ändrades: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Skapare: document_properties_producer=PDF-producent: document_properties_version=PDF-version: document_properties_page_count=Sidantal: document_properties_close=Stäng # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Visa/dölj sidofält toggle_sidebar_label=Visa/dölj sidofält outline.title=Visa dokumentöversikt outline_label=Dokumentöversikt attachments.title=Visa Bilagor attachments_label=Bilagor thumbs.title=Visa miniatyrer thumbs_label=Miniatyrer findbar.title=Sök i dokument findbar_label=Sök # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Sida {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Miniatyr av sida {{page}} # Find panel button title and messages find_label=Sök: find_previous.title=Hitta föregående förekomst av frasen find_previous_label=Föregående find_next.title=Hitta nästa förekomst av frasen find_next_label=Nästa find_highlight=Markera alla find_match_case_label=Matcha versal/gemen find_reached_top=Nådde början av dokumentet, började från slutet find_reached_bottom=Nådde slutet på dokumentet, började från början find_not_found=Frasen hittades inte # Error panel labels error_more_info=Mer information error_less_info=Mindre information error_close=Stäng # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Meddelande: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stack: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Fil: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Rad: {{line}} rendering_error=Ett fel uppstod vid visning av sidan. # Predefined zoom values page_scale_width=Sidbredd page_scale_fit=Anpassa sida page_scale_auto=Automatisk zoom page_scale_actual=Verklig storlek # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Fel loading_error=Ett fel uppstod vid laddning av PDF-filen. invalid_file_error=Ogiltig eller korrupt PDF-fil. missing_file_error=Saknad PDF-fil. unexpected_response_error=Oväntat svar från servern. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}}-annotering] password_label=Skriv in lösenordet för att öppna PDF-filen. password_invalid=Ogiltigt lösenord. Försök igen. password_ok=OK password_cancel=Avbryt printing_not_supported=Varning: Utskrifter stöds inte helt av den här webbläsaren. printing_not_ready=Varning: PDF:en är inte klar för utskrift. web_fonts_disabled=Webbtypsnitt är inaktiverade: kan inte använda inbäddade PDF-typsnitt. document_colors_not_allowed=PDF-dokument tillåts inte använda egna färger: 'Låt sidor använda egna färger' är inaktiverat i webbläsaren. manuskript-0.10.0/libs/pdf.js/web/locale/sw/000077500000000000000000000000001354442177200205605ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/sw/viewer.properties000066400000000000000000000117471354442177200242110ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Ukurasa Uliotangulia previous_label=Iliyotangulia next.title=Ukurasa Ufuatao next_label=Ifuatayo # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Ukurasa: page_of=ya {{Hesabu ya ukurasa}} zoom_out.title=Kuza Nje zoom_out_label=Kuza Nje zoom_in.title=Kuza Ndani zoom_in_label=Kuza Ndani zoom.title=Kuza presentation_mode.title=Badili kwa Hali ya Uwasilishaji presentation_mode_label=Hali ya Uwasilishaji open_file.title=Fungua Faili open_file_label=Fungua print.title=Chapisha print_label=Chapisha download.title=Pakua download_label=Pakua bookmark.title=Mwonekano wa sasa (nakili au ufungue katika dirisha mpya) bookmark_label=Mwonekano wa Sasa # Secondary toolbar and context menu # Document properties dialog box # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_title=Kichwa: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Kibiano cha Upau wa Kando toggle_sidebar_label=Kibiano cha Upau wa Kando outline.title=Onyesha Ufupisho wa Waraka outline_label=Ufupisho wa Waraka thumbs.title=Onyesha Kijipicha thumbs_label=Vijipicha findbar.title=Pata katika Waraka findbar_label=Tafuta # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Ukurasa {{ukurasa}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Kijipicha cha ukurasa {{ukurasa}} # Find panel button title and messages find_label=Tafuta: find_previous.title=Tafuta tukio kabla ya msemo huu find_previous_label=Iliyotangulia find_next.title=Tafuta tukio linalofuata la msemo find_next_label=Ifuatayo find_highlight=Angazia yote find_match_case_label=Linganisha herufi find_reached_top=Imefika juu ya waraka, imeendelea kutoka chini find_reached_bottom=Imefika mwisho wa waraka, imeendelea kutoka juu find_not_found=Msemo hukupatikana # Error panel labels error_more_info=Maelezo Zaidi error_less_info=Maelezo Kidogo # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (jenga: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Ujumbe: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Panganya: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Faili: {{faili}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Laini: {{laini}} rendering_error=Hitilafu lilitokea wajati wa kutoa ukurasa # Predefined zoom values page_scale_width=Upana wa Ukurasa page_scale_fit=Usawa wa Ukurasa page_scale_auto=Ukuzaji wa Kiotomatiki page_scale_actual=Ukubwa Halisi # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. # Loading indicator messages loading_error_indicator=Hitilafu loading_error=Hitilafu lilitokea wakati wa kupakia PDF. invalid_file_error=Faili ya PDF isiyohalali au potofu. missing_file_error=Faili ya PDF isiyopo. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Ufafanuzi] password_ok=SAWA password_cancel=Ghairi printing_not_supported=Onyo: Uchapishaji hauauniwi kabisa kwa kivinjari hiki. web_fonts_disabled=Fonti za tovuti zimelemazwa: haziwezi kutumia fonti za PDF zilizopachikwa. manuskript-0.10.0/libs/pdf.js/web/locale/ta-LK/000077500000000000000000000000001354442177200210375ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/ta-LK/viewer.properties000066400000000000000000000061461354442177200244650ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. zoom.title=அளவு open_file.title=கோப்பினைத் திறக்க open_file_label=திறக்க # Secondary toolbar and context menu # Document properties dialog box # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. # Find panel button title and messages find_previous.title=இந்த சொற்றொடரின் முன்னைய நிகழ்வை தேடு find_next.title=இந்த சொற்றொடரின் அடுத்த நிகழ்வைத் தேடு # Error panel labels # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number # Predefined zoom values # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. # Loading indicator messages # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" password_ok=ஆம் manuskript-0.10.0/libs/pdf.js/web/locale/ta/000077500000000000000000000000001354442177200205335ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/ta/viewer.properties000066400000000000000000000256201354442177200241570ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=முந்தைய பக்கம் previous_label=முந்தையது next.title=அடுத்த பக்கம் next_label=அடுத்து # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=பக்கம்: page_of=இல் {{pageCount}} zoom_out.title=சிறிதாக்கு zoom_out_label=சிறிதாக்கு zoom_in.title=பெரிதாக்கு zoom_in_label=பெரிதாக்கு zoom.title=பெரிதாக்கு presentation_mode.title=விளக்ககாட்சி பயன்முறைக்கு மாறு presentation_mode_label=விளக்ககாட்சி பயன்முறை open_file.title=கோப்பினை திற open_file_label=திற print.title=அச்சிடு print_label=அச்சிடு download.title=பதிவிறக்கு download_label=பதிவிறக்கு bookmark.title=தற்போதைய காட்சி (புதிய சாளரத்திற்கு நகலெடு அல்லது புதிய சாளரத்தில் திற) bookmark_label=தற்போதைய காட்சி # Secondary toolbar and context menu tools.title=கருவிகள் tools_label=கருவிகள் first_page.title=முதல் பக்கத்திற்கு செல்லவும் first_page.label=முதல் பக்கத்திற்கு செல்லவும் first_page_label=முதல் பக்கத்திற்கு செல்லவும் last_page.title=கடைசி பக்கத்திற்கு செல்லவும் last_page.label=கடைசி பக்கத்திற்கு செல்லவும் last_page_label=கடைசி பக்கத்திற்கு செல்லவும் page_rotate_cw.title=வலஞ்சுழியாக சுழற்று page_rotate_cw.label=வலஞ்சுழியாக சுழற்று page_rotate_cw_label=வலஞ்சுழியாக சுழற்று page_rotate_ccw.title=இடஞ்சுழியாக சுழற்று page_rotate_ccw.label=இடஞ்சுழியாக சுழற்று page_rotate_ccw_label=இடஞ்சுழியாக சுழற்று hand_tool_enable.title=கை கருவியை செயலாக்கு hand_tool_enable_label=கை கருவியை செயலாக்கு hand_tool_disable.title=கை கருவியை முடக்கு hand_tool_disable_label=கை கருவியை முடக்கு # Document properties dialog box document_properties.title=ஆவண பண்புகள்... document_properties_label=ஆவண பண்புகள்... document_properties_file_name=கோப்பு பெயர்: document_properties_file_size=கோப்பின் அளவு: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} கிபை ({{size_b}} பைட்டுகள்) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} மெபை ({{size_b}} பைட்டுகள்) document_properties_title=தலைப்பு: document_properties_author=எழுதியவர் document_properties_subject=பொருள்: document_properties_keywords=முக்கிய வார்த்தைகள்: document_properties_creation_date=படைத்த தேதி : document_properties_modification_date=திருத்திய தேதி: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=உருவாக்குபவர்: document_properties_producer=பிடிஎஃப் தயாரிப்பாளர்: document_properties_version=PDF பதிப்பு: document_properties_page_count=பக்க எண்ணிக்கை: document_properties_close=மூடுக # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=பக்கப் பட்டியை நிலைமாற்று toggle_sidebar_label=பக்கப் பட்டியை நிலைமாற்று outline.title=ஆவண வெளிவரையைக் காண்பி outline_label=ஆவண வெளிவரை attachments.title=இணைப்புகளை காண்பி attachments_label=இணைப்புகள் thumbs.title=சிறுபடங்களைக் காண்பி thumbs_label=சிறுபடங்கள் findbar.title=ஆவணத்தில் கண்டறி findbar_label=கண்டுபிடி # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=பக்கம் {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=பக்கத்தின் சிறுபடம் {{page}} # Find panel button title and messages find_label=கண்டறி: find_previous.title=இந்த சொற்றொடரின் முந்தைய நிகழ்வை தேடு find_previous_label=முந்தையது find_next.title=இந்த சொற்றொடரின் அடுத்த நிகழ்வை தேடு find_next_label=அடுத்து find_highlight=அனைத்தையும் தனிப்படுத்து find_match_case_label=பேரெழுத்தாக்கத்தை உணர் find_reached_top=ஆவணத்தின் மேல் பகுதியை அடைந்தது, அடிப்பக்கத்திலிருந்து தொடர்ந்தது find_reached_bottom=ஆவணத்தின் முடிவை அடைந்தது, மேலிருந்து தொடர்ந்தது find_not_found=சொற்றொடர் காணவில்லை # Error panel labels error_more_info=கூடுதல் தகவல் error_less_info=குறைந்த தகவல் error_close=மூடுக # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=செய்தி: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=ஸ்டேக்: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=கோப்பு: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=வரி: {{line}} rendering_error=இந்தப் பக்கத்தை காட்சிப்படுத்தும் போது ஒரு பிழை ஏற்பட்டது. # Predefined zoom values page_scale_width=பக்க அகலம் page_scale_fit=பக்கப் பொருத்தம் page_scale_auto=தானியக்க பெரிதாக்கல் page_scale_actual=உண்மையான அளவு # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=பிழை loading_error=PDF ஐ ஏற்றும் போது ஒரு பிழை ஏற்பட்டது. invalid_file_error=செல்லுபடியாகாத அல்லது சிதைந்த PDF கோப்பு. missing_file_error=PDF கோப்பு காணவில்லை. unexpected_response_error=சேவகன் பதில் எதிர்பாரதது. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} விளக்கம்] password_label=இந்த PDF கோப்பை திறக்க கடவுச்சொல்லை உள்ளிடவும். password_invalid=செல்லுபடியாகாத கடவுச்சொல், தயை செய்து மீண்டும் முயற்சி செய்க. password_ok=சரி password_cancel=இரத்து printing_not_supported=எச்சரிக்கை: இந்த உலாவி அச்சிடுதலை முழுமையாக ஆதரிக்கவில்லை. printing_not_ready=எச்சரிக்கை: PDF அச்சிட முழுவதுமாக ஏற்றப்படவில்லை. web_fonts_disabled=வலை எழுத்துருக்கள் முடக்கப்பட்டுள்ளன: உட்பொதிக்கப்பட்ட PDF எழுத்துருக்களைப் பயன்படுத்த முடியவில்லை. document_colors_not_allowed=PDF ஆவணங்களுக்கு அவற்றின் சொந்த நிறங்களைப் பயன்படுத்த அனுமதியில்லை: உலாவியில் 'பக்கங்கள் தங்கள் சொந்த நிறங்களைத் தேர்வு செய்துகொள்ள அனுமதி' என்னும் விருப்பம் முடக்கப்பட்டுள்ளது. manuskript-0.10.0/libs/pdf.js/web/locale/te/000077500000000000000000000000001354442177200205375ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/te/viewer.properties000066400000000000000000000240611354442177200241610ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=క్రితం పేజీ previous_label=క్రితం next.title=తరువాత పేజీ next_label=తరువాత # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=పేజీ: page_of=మొత్తం {{pageCount}} లో zoom_out.title=జూమ్ తగ్గించు zoom_out_label=జూమ్ తగ్గించు zoom_in.title=జూమ్ చేయి zoom_in_label=జూమ్ చేయి zoom.title=జూమ్ presentation_mode.title=ప్రదర్శనా రీతికి మారు presentation_mode_label=ప్రదర్శనా రీతి open_file.title=ఫైల్ తెరువు open_file_label=తెరువు print.title=ముద్రించు print_label=ముద్రించు download.title=డౌనులోడు download_label=డౌనులోడు bookmark.title=ప్రస్తుత దర్శనం (నకలుతీయి లేదా కొత్త విండోనందు తెరువుము) bookmark_label=ప్రస్తుత దర్శనం # Secondary toolbar and context menu tools.title=పనిముట్లు tools_label=పనిముట్లు first_page.title=మొదటి పేజీకి వెళ్ళు first_page.label=మొదటి పేజీకి వెళ్ళు first_page_label=మొదటి పేజీకి వెళ్ళు last_page.title=చివరి పేజీకి వెళ్ళు last_page.label=చివరి పేజీకి వెళ్ళు last_page_label=చివరి పేజీకి వెళ్ళు page_rotate_cw.title=సవ్యదిశలో తిప్పుము page_rotate_cw.label=సవ్యదిశలో తిప్పుము page_rotate_cw_label=సవ్యదిశలో తిప్పుము page_rotate_ccw.title=అపసవ్యదిశలో తిప్పుము page_rotate_ccw.label=అపసవ్యదిశలో తిప్పుము page_rotate_ccw_label=అపసవ్యదిశలో తిప్పుము hand_tool_enable.title=చేతి సాధనం చేతనించు hand_tool_enable_label=చేతి సాధనం చేతనించు hand_tool_disable.title=చేతి సాధనం అచేతనించు hand_tool_disable_label=చేతి సాధనం అచేతనించు # Document properties dialog box document_properties.title=పత్రము లక్షణాలు... document_properties_label=పత్రము లక్షణాలు... document_properties_file_name=దస్త్రం పేరు: document_properties_file_size=దస్త్రం పరిమాణం: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=శీర్షిక: document_properties_author=మూలకర్త: document_properties_subject=విషయం: document_properties_keywords=కీపదాలు: document_properties_creation_date=సృష్టించిన తేదీ: document_properties_modification_date=సవరించిన తేదీ: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=సృష్టికర్త: document_properties_producer=PDF ఉత్పాదకి: document_properties_version=PDF వర్షన్: document_properties_page_count=పేజీల సంఖ్య: document_properties_close=మూసివేయి # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=పక్కపట్టీ మార్చు toggle_sidebar_label=పక్కపట్టీ మార్చు outline.title=పత్రము అవుట్‌లైన్ చూపు outline_label=పత్రము అవుట్‌లైన్ attachments.title=అనుబంధాలు చూపు attachments_label=అనుబంధాలు thumbs.title=థంబ్‌నైల్స్ చూపు thumbs_label=థంబ్‌నైల్స్ findbar.title=ఈ పత్రమునందు కనుగొనుము findbar_label=కనుగొను # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=పేజీ {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=పేజీ {{page}} యొక్క థంబ్‌నైల్ # Find panel button title and messages find_label=కనుగొను: find_previous.title=పదంయొక్క ముందలి సంభవాన్ని కనుగొను find_previous_label=మునుపటి find_next.title=పదం యొక్క తర్వాతి సంభవాన్ని కనుగొను find_next_label=తరువాత find_highlight=అన్నిటిని ఉద్దీపనం చేయుము find_match_case_label=అక్షరములతేడాతో పోల్చుము find_reached_top=పేజీ పైకి చేరుకున్నది, క్రింది నుండి కొనసాగించండి find_reached_bottom=పేజీ చివరకు చేరుకున్నది, పైనుండి కొనసాగించండి find_not_found=పదం కనబడలేదు # Error panel labels error_more_info=మరింత సమాచారం error_less_info=తక్కువ సమాచారం error_close=మూసివేయి # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=సందేశం: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=స్టాక్: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=ఫైలు: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=వరుస: {{line}} rendering_error=పేజీను రెండర్ చేయుటలో వొక దోషం యెదురైంది. # Predefined zoom values page_scale_width=పేజీ వెడల్పు page_scale_fit=పేజీ అమర్పు page_scale_auto=స్వయంచాలక జూమ్ page_scale_actual=యథార్ధ పరిమాణం # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=దోషం loading_error=PDF లోడవుచున్నప్పుడు వొక దోషం యెదురైంది. invalid_file_error=చెల్లని లేదా పాడైన PDF ఫైలు. missing_file_error=దొరకని PDF ఫైలు. unexpected_response_error=అనుకోని సేవిక స్పందన. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} టీకా] password_label=ఈ PDF ఫైల్ తెరుచుటకు సంకేతపదం ప్రవేశపెట్టుము password_invalid=సంకేతపదం చెల్లదు. దయచేసి మళ్ళీ ప్రయత్నించండి. password_ok=సరే password_cancel=రద్దుచేయి printing_not_supported=హెచ్చరిక: ఈ విహారిణి చేత ముద్రణ పూర్తిగా తోడ్పాటునీయబడుట లేదు printing_not_ready=హెచ్చరిక: ముద్రణ కొరకు ఈ PDF పూర్తిగా లోడవలేదు. web_fonts_disabled=వెబ్ ఫాంట్లు అచేతనపరచ బడెను: ఎంబెడెడ్ PDF ఫాంట్లు వుపయోగించలేక పోయింది. document_colors_not_allowed=PDF పత్రాలు వాటి స్వంత రంగులను వుపయోగించుకొనుటకు అనుమతించబడవు: విహరణి నందు 'పేజీలను వాటి స్వంత రంగులను యెంచుకొనుటకు అనుమతించు' అనునది అచేతనం చేయబడివుంది. manuskript-0.10.0/libs/pdf.js/web/locale/th/000077500000000000000000000000001354442177200205425ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/th/viewer.properties000066400000000000000000000233701354442177200241660ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=หน้าก่อนหน้า previous_label=ก่อนหน้า next.title=หน้าถัดไป next_label=ถัดไป # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=หน้า: page_of=จาก {{pageCount}} zoom_out.title=ย่อ zoom_out_label=ย่อ Out zoom_in.title=ขยาย zoom_in_label=ขยาย zoom.title=ย่อ-ขยาย presentation_mode.title=สลับเข้าสู่รูปแบบการนำเสนอ presentation_mode_label=รูปแบบการนำเสนอ open_file.title=เปิดแฟ้ม open_file_label=เปิด print.title=พิมพ์ print_label=พิมพ์ download.title=ดาวน์โหลด download_label=ดาวน์โหลด bookmark.title=มุมมองปัจจุบัน (คัดลอกหรือเปิดในหน้าต่างใหม่) bookmark_label=มุมมองปัจจุบัน # Secondary toolbar and context menu tools.title=เครื่องมือ tools_label=เครื่องมือ first_page.title=ไปยังหน้าแรก first_page.label=ไปยังหน้าแรก first_page_label=ไปยังหน้าแรก last_page.title=ไปยังหน้าสุดท้าย last_page.label=ไปยังหน้าสุดท้าย last_page_label=ไปยังหน้าสุดท้าย page_rotate_cw.title=หมุนตามเข็มนาฬิกา page_rotate_cw.label=หมุนตามเข็มนาฬิกา page_rotate_cw_label=หมุนตามเข็มนาฬิกา page_rotate_ccw.title=หมุนทวนเข็มนาฬิกา page_rotate_ccw.label=หมุนทวนเข็มนาฬิกา page_rotate_ccw_label=หมุนทวนเข็มนาฬิกา hand_tool_enable.title=เปิดใช้งานเครื่องมือรูปมือ hand_tool_enable_label=เปิดใช้งานเครื่องมือรูปมือ hand_tool_disable.title=ปิดใช้งานเครื่องมือรูปมือ hand_tool_disable_label=ปิดใช้งานเครื่องมือรูปมือ # Document properties dialog box document_properties.title=คุณสมบัติเอกสาร… document_properties_label=คุณสมบัติเอกสาร… document_properties_file_name=ชื่อแฟ้ม : document_properties_file_size=ขนาดแฟ้ม : # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} กิโลไบต์ ({{size_b}} ไบต์) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} เมกะไบต์ ({{size_b}} ไบต์) document_properties_title=หัวเรื่อง : document_properties_author=ผู้แต่ง : document_properties_subject=หัวข้อ : document_properties_keywords=คำสำคัญ : document_properties_creation_date=วันที่สร้าง : document_properties_modification_date=วันที่แก้ไข : # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=สร้างโดย : document_properties_producer=ผู้ผลิต PDF : document_properties_version=รุ่น PDF : document_properties_page_count=จำนวนหน้า : document_properties_close=ปิด # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=สลับแถบข้าง toggle_sidebar_label=สลับแถบข้าง outline.title=แสดงโครงเอกสาร outline_label=โครงเอกสาร attachments.title=แสดงสิ่งที่แนบมา attachments_label=สิ่งที่แนบมา thumbs.title=แสดงภาพขนาดย่อ thumbs_label=ภาพขนาดย่อ findbar.title=ค้นหาในเอกสาร findbar_label=ค้นหา # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=หน้า {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=ภาพขนาดย่อของหน้า {{page}} # Find panel button title and messages find_label=ค้นหา: find_previous.title=หาตำแหน่งก่อนหน้าของคำค้น find_previous_label=ก่อนหน้า find_next.title=หาตำแหน่งถัดไปของคำค้น find_next_label=ถัดไป find_highlight=เน้นสีทั้งหมด find_match_case_label=ตัวพิมพ์ตรงกัน find_reached_top=ค้นหาถึงจุดเริ่มต้นของหน้า เริ่มค้นต่อจากด้านล่าง find_reached_bottom=ค้นหาถึงจุดสิ้นสุดหน้า เริ่มค้นต่อจากด้านบน find_not_found=ไม่พบวลีที่ต้องการ # Error panel labels error_more_info=ข้อมูลเพิ่มเติม error_less_info=ข้อมูลน้อย error_close=ปิด # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=ข้อความ: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=สแต็ก: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=แฟ้ม: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=บรรทัด: {{line}} rendering_error=เกิดข้อผิดพลาดขณะกำลังคำนวณการแสดงผลของหน้า # Predefined zoom values page_scale_width=ความกว้างหน้า page_scale_fit=พอดีหน้า page_scale_auto=ย่อ-ขยายอัตโนมัติ page_scale_actual=ขนาดเท่าจริง # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=ข้อผิดพลาด loading_error=เกิดข้อผิดพลาดขณะกำลังโหลด PDF invalid_file_error=แฟ้ม PDF ไม่ถูกต้องหรือไม่สมบูรณ์ missing_file_error=แฟ้ม PDF หาย unexpected_response_error=การตอบสนองเซิร์ฟเวอร์ที่ไม่คาดหวัง # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[คำอธิบายประกอบ {{type}}] password_label=ใส่รหัสผ่านเพื่อเปิดไฟล์ PDF นี้ password_invalid=รหัสผ่านไม่ถูกต้อง โปรดลองอีกครั้ง password_ok=ตกลง password_cancel=ยกเลิก printing_not_supported=คำเตือน: เบราว์เซอร์นี้ไม่ได้สนับสนุนการพิมพ์อย่างเต็มที่ printing_not_ready=คำเตือน: PDF ไม่ได้รับการโหลดอย่างเต็มที่สำหรับการพิมพ์ web_fonts_disabled=แบบอักษรเว็บถูกปิดการใช้งาน: ไม่สามารถใช้แบบอักษรฝังตัวใน PDF document_colors_not_allowed=เอกสาร PDF ไม่ได้รับอนุญาตให้ใช้สีของตัวเอง: 'อนุญาตให้หน้าเอกสารสามารถเลือกสีของตัวเอง' ถูกปิดใช้งานในเบราว์เซอร์ manuskript-0.10.0/libs/pdf.js/web/locale/tl/000077500000000000000000000000001354442177200205465ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/tl/viewer.properties000066400000000000000000000072721354442177200241750ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Naunang Pahina next.title=Sunod na Pahina # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Pahina: page_of=ng {{pageCount}} open_file.title=Magbukas ng file open_file_label=Buksan bookmark.title=Kasalukuyang tingin (kopyahin o buksan sa bagong window) bookmark_label=Kasalukuyang tingin # Secondary toolbar and context menu tools.title=Mga Tool tools_label=Mga Tool # Document properties dialog box # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_title=Pamagat: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) outline.title=Ipakita ang banghay ng dokumento outline_label=Banghay ng dokumento thumbs.title=Ipakita ang mga Thumbnails findbar_label=Hanapin # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Pahina {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Thumbnail ng Pahina {{page}} # Find panel button title and messages find_highlight=I-highlight lahat # Error panel labels error_more_info=Maraming Inpormasyon error_less_info=Maikling Inpormasyon # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Mensahe: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Linya: {{line}} rendering_error=May naganap na pagkakamali habang pagsasalin sa pahina. # Predefined zoom values page_scale_width=Haba ng Pahina page_scale_fit=ang pahina ay angkop page_scale_auto=awtomatikong pag-imbulog # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. # Loading indicator messages loading_error=May maling nangyari habang kinakarga ang PDF. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" password_ok=OK manuskript-0.10.0/libs/pdf.js/web/locale/tn/000077500000000000000000000000001354442177200205505ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/tn/viewer.properties000066400000000000000000000066521354442177200242000ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Tsebe: zoom.title=Zuma/gogela open_file.title=Bula Faele open_file_label=Bula # Secondary toolbar and context menu hand_tool_disable.title=Thibela go dira ga sediriswa sa seatla hand_tool_disable_label=Thibela go dira ga sediriswa sa seatla # Document properties dialog box document_properties_file_name=Leina la faele: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_title=Leina: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) findbar_label=Batla # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. # Find panel button title and messages find_previous.title=Batla tiragalo e e fetileng ya setlhopha sa mafoko find_next.title=Batla tiragalo e e latelang ya setlhopha sa mafoko find_not_found=Setlhopha sa mafoko ga se a bonwa # Error panel labels error_more_info=Tshedimosetso e Nngwe # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number # Predefined zoom values # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. # Loading indicator messages loading_error_indicator=Phoso # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" password_ok=Siame password_cancel=Khansela web_fonts_disabled=Mefutatlhaka ya Webo ga e dire: ga e kgone go dirisa mofutatlhaka wa PDF o tsentsweng. manuskript-0.10.0/libs/pdf.js/web/locale/tr/000077500000000000000000000000001354442177200205545ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/tr/viewer.properties000066400000000000000000000157211354442177200242010ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Önceki sayfa previous_label=Önceki next.title=Sonraki sayfa next_label=Sonraki # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Sayfa: page_of=/ {{pageCount}} zoom_out.title=Uzaklaș zoom_out_label=Uzaklaș zoom_in.title=Yaklaş zoom_in_label=Yaklaş zoom.title=Yakınlaştırma presentation_mode.title=Sunum moduna geç presentation_mode_label=Sunum Modu open_file.title=Dosya aç open_file_label=Aç print.title=Yazdır print_label=Yazdır download.title=İndir download_label=İndir bookmark.title=Geçerli görünüm (kopyala veya yeni pencerede aç) bookmark_label=Geçerli görünüm # Secondary toolbar and context menu tools.title=Araçlar tools_label=Araçlar first_page.title=İlk sayfaya git first_page.label=İlk sayfaya git first_page_label=İlk sayfaya git last_page.title=Son sayfaya git last_page.label=Son sayfaya git last_page_label=Son sayfaya git page_rotate_cw.title=Saat yönünde döndür page_rotate_cw.label=Saat yönünde döndür page_rotate_cw_label=Saat yönünde döndür page_rotate_ccw.title=Saat yönünün tersine döndür page_rotate_ccw.label=Saat yönünün tersine döndür page_rotate_ccw_label=Saat yönünün tersine döndür hand_tool_enable.title=El aracını etkinleştir hand_tool_enable_label=El aracını etkinleştir hand_tool_disable.title=El aracını kapat hand_tool_disable_label=El aracını kapat # Document properties dialog box document_properties.title=Belge özellikleri… document_properties_label=Belge özellikleri… document_properties_file_name=Dosya adı: document_properties_file_size=Dosya boyutu: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bayt) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bayt) document_properties_title=Başlık: document_properties_author=Yazar: document_properties_subject=Konu: document_properties_keywords=Anahtar kelimeler: document_properties_creation_date=Oluturma tarihi: document_properties_modification_date=Değiştirme tarihi: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}} {{time}} document_properties_creator=Oluşturan: document_properties_producer=PDF üreticisi: document_properties_version=PDF sürümü: document_properties_page_count=Sayfa sayısı: document_properties_close=Kapat # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Kenar çubuğunu aç/kapat toggle_sidebar_label=Kenar çubuğunu aç/kapat outline.title=Belge şemasını göster outline_label=Belge şeması attachments.title=Ekleri göster attachments_label=Ekler thumbs.title=Küçük resimleri göster thumbs_label=Küçük resimler findbar.title=Belgede bul findbar_label=Bul # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Sayfa {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas={{page}}. sayfanın küçük hâli # Find panel button title and messages find_label=Bul: find_previous.title=Önceki eşleşmeyi bul find_previous_label=Önceki find_next.title=Sonraki eşleşmeyi bul find_next_label=Sonraki find_highlight=Tümünü vurgula find_match_case_label=Büyük-küçük harf eşleştir find_reached_top=Belgenin başına ulaşıldı, sonundan devam edildi find_reached_bottom=Belgenin sonuna ulaşıldı, başından devam edildi find_not_found=Eşleşme bulunamadı # Error panel labels error_more_info=Daha fazla bilgi al error_less_info=Daha az bilgi error_close=Kapat # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js sürüm {{version}} (yapı: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=İleti: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Yığın: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Dosya: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Satır: {{line}} rendering_error=Sayfa yorumlanırken bir hata oluştu. # Predefined zoom values page_scale_width=Sayfa genişliği page_scale_fit=Sayfayı sığdır page_scale_auto=Otomatik yakınlaştır page_scale_actual=Gerçek boyut # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent=%{{scale}} # Loading indicator messages loading_error_indicator=Hata loading_error=PDF yüklenirken bir hata oluştu. invalid_file_error=Geçersiz veya bozulmuş PDF dosyası. missing_file_error=PDF dosyası eksik. unexpected_response_error=Beklenmeyen sunucu yanıtı. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} işareti] password_label=Bu PDF dosyasını açmak için parolasını girin. password_invalid=Geçersiz parola. Lütfen tekrar deneyin. password_ok=Tamam password_cancel=İptal printing_not_supported=Uyarı: Yazdırma bu tarayıcı tarafından tam olarak desteklenmemektedir. printing_not_ready=Uyarı: PDF tamamen yüklenmedi ve yazdırmaya hazır değil. web_fonts_disabled=Web fontları devre dışı: Gömülü PDF fontları kullanılamıyor. document_colors_not_allowed=PDF belgelerinin kendi renklerini kullanması için izin verilmiyor: 'Sayfalara kendi renklerini seçmesi için izin ver' tarayıcıda etkinleştirilmemiş. manuskript-0.10.0/libs/pdf.js/web/locale/uk/000077500000000000000000000000001354442177200205465ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/uk/viewer.properties000066400000000000000000000213401354442177200241650ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Попередня сторінка previous_label=Попередня next.title=Наступна сторінка next_label=Наступна # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Сторінка: page_of=з {{pageCount}} zoom_out.title=Зменшити zoom_out_label=Зменшити zoom_in.title=Збільшити zoom_in_label=Збільшити zoom.title=Масштаб presentation_mode.title=Перейти в режим презентації presentation_mode_label=Режим презентації open_file.title=Відкрити файл open_file_label=Відкрити print.title=Друк print_label=Друк download.title=Завантажити download_label=Завантажити bookmark.title=Поточний вигляд (копіювати чи відкрити у новому вікні) bookmark_label=Поточний вигляд # Secondary toolbar and context menu tools.title=Інструменти tools_label=Інструменти first_page.title=На першу сторінку first_page.label=На першу сторінку first_page_label=На першу сторінку last_page.title=На останню сторінку last_page.label=На останню сторінку last_page_label=На останню сторінку page_rotate_cw.title=Повернути за годинниковою стрілкою page_rotate_cw.label=Повернути за годинниковою стрілкою page_rotate_cw_label=Повернути за годинниковою стрілкою page_rotate_ccw.title=Повернути проти годинникової стрілки page_rotate_ccw.label=Повернути проти годинникової стрілки page_rotate_ccw_label=Повернути проти годинникової стрілки hand_tool_enable.title=Увімкнути інструмент «Рука» hand_tool_enable_label=Увімкнути інструмент «Рука» hand_tool_disable.title=Вимкнути інструмент «Рука» hand_tool_disable_label=Вимкнути інструмент «Рука» # Document properties dialog box document_properties.title=Властивості документа… document_properties_label=Властивості документа… document_properties_file_name=Назва файла: document_properties_file_size=Розмір файла: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} КБ ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} МБ ({{size_b}} bytes) document_properties_title=Заголовок: document_properties_author=Автор: document_properties_subject=Тема: document_properties_keywords=Ключові слова: document_properties_creation_date=Дата створення: document_properties_modification_date=Дата зміни: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Створено: document_properties_producer=Виробник PDF: document_properties_version=Версія PDF: document_properties_page_count=Кількість сторінок: document_properties_close=Закрити # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Бічна панель toggle_sidebar_label=Перемкнути бічну панель outline.title=Показувати схему документа outline_label=Схема документа attachments.title=Показати прикріплення attachments_label=Прикріплення thumbs.title=Показувати ескізи thumbs_label=Ескізи findbar.title=Шукати в документі findbar_label=Пошук # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Сторінка {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Ескіз сторінки {{page}} # Find panel button title and messages find_label=Знайти: find_previous.title=Знайти попереднє входження фрази find_previous_label=Попереднє find_next.title=Знайти наступне входження фрази find_next_label=Наступне find_highlight=Підсвітити все find_match_case_label=З урахуванням регістру find_reached_top=Досягнуто початку документу, продовжено з кінця find_reached_bottom=Досягнуто кінця документу, продовжено з початку find_not_found=Фразу не знайдено # Error panel labels error_more_info=Більше інформації error_less_info=Менше інформації error_close=Закрити # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Повідомлення: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Стек: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Файл: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Рядок: {{line}} rendering_error=Під час виведення сторінки сталася помилка. # Predefined zoom values page_scale_width=За шириною page_scale_fit=Умістити page_scale_auto=Авто-масштаб page_scale_actual=Дійсний розмір # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Помилка loading_error=Під час завантаження PDF сталася помилка. invalid_file_error=Недійсний або пошкоджений PDF-файл. missing_file_error=Відсутній PDF-файл. unexpected_response_error=Неочікувана відповідь сервера. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}}-аннотація] password_label=Введіть пароль для відкриття цього PDF-файла. password_invalid=Невірний пароль. Спробуйте ще. password_ok=Гаразд password_cancel=Скасувати printing_not_supported=Попередження: Цей браузер не повністю підтримує друк. printing_not_ready=Попередження: PDF не повністю завантажений для друку. web_fonts_disabled=Веб-шрифти вимкнено: неможливо використати вбудовані у PDF шрифти. document_colors_not_allowed=PDF-документам не дозволено використовувати власні кольори: в браузері вимкнено параметр «Дозволити сторінкам використовувати власні кольори». manuskript-0.10.0/libs/pdf.js/web/locale/ur/000077500000000000000000000000001354442177200205555ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/ur/viewer.properties000066400000000000000000000175721354442177200242100ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=پچھلا صفحہ previous_label=پچھلا next.title=اگلا صفحہ next_label=آگے # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=صفحہ: page_of={{pageCount}} کا zoom_out.title=باہر زوم کریں zoom_out_label=باہر زوم کریں zoom_in.title=اندر زوم کریں zoom_in_label=اندر زوم کریں zoom.title=زوم presentation_mode.title=پیشکش موڈ میں چلے جائیں presentation_mode_label=پیشکش موڈ open_file.title=مسل کھولیں open_file_label=کھولیں print.title=چھاپیں print_label=چھاپیں download.title=ڈاؤن لوڈ download_label=ڈاؤن لوڈ bookmark.title=حالیہ نظارہ (نۓ دریچہ میں نقل کریں یا کھولیں) bookmark_label=حالیہ نظارہ # Secondary toolbar and context menu tools.title=آلات tools_label=آلات first_page.title=پہلے صفحہ پر جائیں first_page.label=پہلے صفحہ پر جائیں first_page_label=پہلے صفحہ پر جائیں last_page.title=آخری صفحہ پر جائیں last_page.label=آخری صفحہ پر جائیں last_page_label=آخری صفحہ پر جائیں page_rotate_cw.title=گھڑی وار گھمائیں page_rotate_cw.label=گھڑی وار گھمائیں page_rotate_cw_label=گھڑی وار گھمائیں page_rotate_ccw.title=ضد گھڑی وار گھمائیں page_rotate_ccw.label=ضد گھڑی وار گھمائیں page_rotate_ccw_label=ضد گھڑی وار گھمائیں hand_tool_enable.title=ہاتھ ٹول اہل بنائیں hand_tool_enable_label=ہاتھ ٹول اہل بنائیں hand_tool_disable.title=ہاتھ ٹول nنااہل بنائیں\u0020 hand_tool_disable_label=ہاتھ ٹول نااہل بنائیں # Document properties dialog box document_properties.title=دستاویز خواص… document_properties_label=دستاویز خواص…\u0020 document_properties_file_name=نام مسل: document_properties_file_size=مسل سائز: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} bytes) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} bytes) document_properties_title=عنوان: document_properties_author=تخلیق کار: document_properties_subject=موضوع: document_properties_keywords=کلیدی الفاظ: document_properties_creation_date=تخلیق کی تاریخ: document_properties_modification_date=ترمیم کی تاریخ: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}، {{time}} document_properties_creator=تخلیق کار: document_properties_producer=PDF پیدا کار: document_properties_version=PDF ورژن: document_properties_page_count=صفحہ شمار: document_properties_close=بند کریں # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=سلائیڈ ٹوگل کریں toggle_sidebar_label=سلائیڈ ٹوگل کریں outline.title=دستاویز آؤٹ لائن دکھائیں outline_label=دستاویز آؤٹ لائن attachments.title=منسلکات دکھائیں attachments_label=منسلکات thumbs.title=تھمبنیل دکھائیں thumbs_label=مجمل findbar.title=دستاویز میں ڈھونڈیں findbar_label=ڈھونڈیں # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=صفحہ {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=صفحے کا مجمل {{page}} # Find panel button title and messages find_label=ڈھونڈیں: find_previous.title=فقرے کا پچھلا وقوع ڈھونڈیں find_previous_label=پچھلا find_next.title=فقرے کا اگلہ وقوع ڈھونڈیں find_next_label=آگے find_highlight=تمام نمایاں کریں find_match_case_label=حروف مشابہ کریں find_reached_top=صفحہ کے شروع پر پہنچ گیا، نیچے سے جاری کیا find_reached_bottom=صفحہ کے اختتام پر پہنچ گیا، اوپر سے جاری کیا find_not_found=فقرا نہیں ملا # Error panel labels error_more_info=مزید معلومات error_less_info=کم معلومات error_close=بند کریں # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=پیغام: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=سٹیک: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=مسل: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=لائن: {{line}} rendering_error=صفحہ بناتے ہوئے نقص آ گیا۔ # Predefined zoom values page_scale_width=صفحہ چوڑائی page_scale_fit=صفحہ فٹنگ page_scale_auto=خودکار زوم page_scale_actual=اصل سائز # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=نقص loading_error=PDF لوڈ کرتے وقت نقص آ گیا۔ invalid_file_error=ناجائز یا خراب PDF مسل missing_file_error=PDF مسل غائب ہے۔ unexpected_response_error=غیرمتوقع پیش کار جواب # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} نوٹ] password_label=PDF مسل کھولنے کے لیے پاس ورڈ داخل کریں. password_invalid=ناجائز پاس ورڈ. براےؑ کرم دوبارہ کوشش کریں. password_ok=سہی password_cancel=منسوخ کریں printing_not_supported=تنبیہ:چھاپنا اس براؤزر پر پوری طرح معاونت شدہ نہیں ہے۔ printing_not_ready=تنبیہ: PDF چھپائی کے لیے پوری طرح لوڈ نہیں ہوئی۔ web_fonts_disabled=ویب فانٹ نا اہل ہیں: شامل PDF فانٹ استعمال کرنے میں ناکام۔ document_colors_not_allowed=PDF دستاویزات کو اپنے رنگ استعمال کرنے کی اجازت نہیں: 'صفحات کو اپنے رنگ چنیں' کی اِجازت براؤزر میں بے عمل ہے۔ manuskript-0.10.0/libs/pdf.js/web/locale/vi/000077500000000000000000000000001354442177200205455ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/vi/viewer.properties000066400000000000000000000166241354442177200241750ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Trang Trước previous_label=Trước next.title=Trang Sau next_label=Tiếp # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Trang: page_of=trên {{pageCount}} zoom_out.title=Thu nhỏ zoom_out_label=Thu nhỏ zoom_in.title=Phóng to zoom_in_label=Phóng to zoom.title=Chỉnh kích thước presentation_mode.title=Chuyển sang chế độ trình chiếu presentation_mode_label=Chế độ trình chiếu open_file.title=Mở tập tin open_file_label=Mở tập tin print.title=In print_label=In download.title=Tải xuống download_label=Tải xuống bookmark.title=Góc nhìn hiện tại (copy hoặc mở trong cửa sổ mới) bookmark_label=Chế độ xem hiện tại # Secondary toolbar and context menu tools.title=Công cụ tools_label=Công cụ first_page.title=Về trang đầu first_page.label=Về trang đầu first_page_label=Về trang đầu last_page.title=Đến trang cuối last_page.label=Đến trang cuối last_page_label=Đến trang cuối page_rotate_cw.title=Xoay theo chiều kim đồng hồ page_rotate_cw.label=Xoay theo chiều kim đồng hồ page_rotate_cw_label=Xoay theo chiều kim đồng hồ page_rotate_ccw.title=Xoay ngược chiều kim đồng hồ page_rotate_ccw.label=Xoay ngược chiều kim đồng hồ page_rotate_ccw_label=Xoay ngược chiều kim đồng hồ hand_tool_enable.title=Cho phép kéo để cuộn trang hand_tool_enable_label=Cho phép kéo để cuộn trang hand_tool_disable.title=Tắt kéo để cuộn trang hand_tool_disable_label=Tắt kéo để cuộn trang # Document properties dialog box document_properties.title=Thuộc tính của tài liệu… document_properties_label=Thuộc tính của tài liệu… document_properties_file_name=Tên tập tin: document_properties_file_size=Kích thước: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} byte) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} byte) document_properties_title=Tiêu đề: document_properties_author=Tác giả: document_properties_subject=Chủ đề: document_properties_keywords=Từ khóa: document_properties_creation_date=Ngày tạo: document_properties_modification_date=Ngày sửa đổi: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Người tạo: document_properties_producer=Phần mềm tạo PDF: document_properties_version=Phiên bản PDF: document_properties_page_count=Tổng số trang: document_properties_close=Ðóng # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Bật/Tắt thanh lề toggle_sidebar_label=Bật/Tắt thanh lề outline.title=Hiển thị bản phác tài liệu outline_label=Bản phác tài liệu attachments.title=Hiện nội dung đính kèm attachments_label=Nội dung đính kèm thumbs.title=Hiển thị ảnh thu nhỏ thumbs_label=Ảnh thu nhỏ findbar.title=Tìm trong tài liệu findbar_label=Tìm # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Trang {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Ảnh thu nhỏ của trang {{page}} # Find panel button title and messages find_label=Tìm: find_previous.title=Tìm cụm từ ở phần trước find_previous_label=Trước find_next.title=Tìm cụm từ ở phần sau find_next_label=Tiếp find_highlight=Tô sáng tất cả find_match_case_label=Phân biệt hoa, thường find_reached_top=Đã đến phần đầu tài liệu, quay trở lại từ cuối find_reached_bottom=Đã đến phần cuối của tài liệu, quay trở lại từ đầu find_not_found=Không tìm thấy cụm từ này # Error panel labels error_more_info=Thông tin thêm error_less_info=Hiển thị ít thông tin hơn error_close=Đóng # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Thông điệp: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Stack: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Tập tin: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Dòng: {{line}} rendering_error=Lỗi khi hiển thị trang. # Predefined zoom values page_scale_width=Vừa chiều rộng page_scale_fit=Vừa chiều cao page_scale_auto=Tự động chọn kích thước page_scale_actual=Kích thước thực # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Lỗi loading_error=Lỗi khi tải tài liệu PDF. invalid_file_error=Tập tin PDF hỏng hoặc không hợp lệ. missing_file_error=Thiếu tập tin PDF. unexpected_response_error=Máy chủ có phản hồi lạ. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Chú thích] password_label=Nhập mật khẩu để mở tập tin PDF này. password_invalid=Mật khẩu không đúng. Vui lòng thử lại. password_ok=OK password_cancel=Hủy bỏ printing_not_supported=Cảnh báo: In ấn không được hỗ trợ đầy đủ ở trình duyệt này. printing_not_ready=Cảnh báo: PDF chưa được tải hết để in. web_fonts_disabled=Phông chữ Web bị vô hiệu hóa: không thể sử dụng các phông chữ PDF được nhúng. document_colors_not_allowed=Tài liệu PDF không được cho phép dùng màu riêng: 'Cho phép trang chọn màu riêng' đã bị tắt trên trình duyệt. manuskript-0.10.0/libs/pdf.js/web/locale/wo/000077500000000000000000000000001354442177200205545ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/wo/viewer.properties000066400000000000000000000111431354442177200241730ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Xët wi jiitu previous_label=Bi jiitu next.title=Xët wi ci topp next_label=Bi ci topp # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Xët: page_of=ci {{pageCount}} zoom_out.title=Wàññi zoom_out_label=Wàññi zoom_in.title=Yaatal zoom_in_label=Yaatal zoom.title=Yambalaŋ presentation_mode.title=Wañarñil ci anamu wone presentation_mode_label=Anamu Wone open_file.title=Ubbi benn dencukaay open_file_label=Ubbi print.title=Móol print_label=Móol download.title=Yeb yi download_label=Yeb yi bookmark.title=Wone bi taxaw (duppi walla ubbi palanteer bu bees) bookmark_label=Wone bi feeñ # Secondary toolbar and context menu # Document properties dialog box # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_title=Bopp: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) outline.title=Wone takku yi outline_label=Takku jukki yi thumbs.title=Wone nataal yu ndaw yi thumbs_label=Nataal yu ndaw yi findbar.title=Gis ci biir jukki bi findbar_label=Wut # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Xët {{xët}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Wiñet bu xët{{xët}} # Find panel button title and messages find_label=Wut: find_previous.title=Seet beneen kaddu bu ni mel te jiitu find_previous_label=Bi jiitu find_next.title=Seet beneen kaddu bu ni mel find_next_label=Bi ci topp find_highlight=Melaxal lépp find_match_case_label=Sàmm jëmmalin wi find_reached_top=Jot nañu ndorteel xët wi, kontine dale ko ci suuf find_reached_bottom=Jot nañu jeexitalu xët wi, kontine ci ndorte find_not_found=Gisiñu kaddu gi # Error panel labels error_more_info=Xibaar yu gën bari error_less_info=Xibaar yu gën bari # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Bataaxal: {{bataaxal}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Juug: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Dencukaay: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Rëdd : {{line}} rendering_error=Am njumte bu am bi xët bi di wonewu. # Predefined zoom values page_scale_width=Yaatuwaay bu mët page_scale_fit=Xët lëmm page_scale_auto=Yambalaŋ ci saa si page_scale_actual=Dayo bi am # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. # Loading indicator messages loading_error_indicator=Njumte loading_error=Am na njumte ci yebum dencukaay PDF bi. invalid_file_error=Dencukaay PDF bi baaxul walla mu sankar. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Karmat {{type}}] password_ok=OK password_cancel=Neenal printing_not_supported=Artu: Joowkat bii nanguwul lool mool. manuskript-0.10.0/libs/pdf.js/web/locale/xh/000077500000000000000000000000001354442177200205465ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/xh/viewer.properties000066400000000000000000000165301354442177200241720ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Iphepha langaphambili previous_label=Okwangaphambili next.title=Iphepha elilandelayo next_label=Okulandelayo # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Iphepha: page_of=kwali- {{pageCount}} zoom_out.title=Bhekelisela Kudana zoom_out_label=Bhekelisela Kudana zoom_in.title=Sondeza Kufuphi zoom_in_label=Sondeza Kufuphi zoom.title=Yandisa / Nciphisa presentation_mode.title=Tshintshela kwimo yonikezelo presentation_mode_label=Imo yonikezelo open_file.title=Vula Ifayile open_file_label=Vula print.title=Printa print_label=Printa download.title=Khuphela download_label=Khuphela bookmark.title=Imbonakalo ekhoyo (kopa okanye vula kwifestile entsha) bookmark_label=Imbonakalo ekhoyo # Secondary toolbar and context menu tools.title=Izixhobo zemiyalelo tools_label=Izixhobo zemiyalelo first_page.title=Yiya kwiphepha lokuqala first_page.label=Yiya kwiphepha lokuqala first_page_label=Yiya kwiphepha lokuqala last_page.title=Yiya kwiphepha lokugqibela last_page.label=Yiya kwiphepha lokugqibela last_page_label=Yiya kwiphepha lokugqibela page_rotate_cw.title=Jikelisa ngasekunene page_rotate_cw.label=Jikelisa ngasekunene page_rotate_cw_label=Jikelisa ngasekunene page_rotate_ccw.title=Jikelisa ngasekhohlo page_rotate_ccw.label=Jikelisa ngasekhohlo page_rotate_ccw_label=Jikelisa ngasekhohlo hand_tool_enable.title=Yenza isixhobo sesandla sisebenze hand_tool_enable_label=Yenza isixhobo sesandla sisebenze hand_tool_disable.title=Yenza isixhobo sesandla singasebenzi hand_tool_disable_label=Yenza isixhobo sesandla singasebenzi # Document properties dialog box document_properties.title=Iipropati zoxwebhu… document_properties_label=Iipropati zoxwebhu… document_properties_file_name=Igama lefayile: document_properties_file_size=Isayizi yefayile: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB (iibhayiti{{size_b}}) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB (iibhayithi{{size_b}}) document_properties_title=Umxholo: document_properties_author=Umbhali: document_properties_subject=Umbandela: document_properties_keywords=Amagama aphambili: document_properties_creation_date=Umhla wokwenziwa kwayo: document_properties_modification_date=Umhla wokulungiswa kwayo: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Umntu oyenzileyo: document_properties_producer=Umvelisi we-PDF: document_properties_version=Uhlelo lwe-PDF: document_properties_page_count=Inani lamaphepha: document_properties_close=Vala # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Togola ngebha eseCaleni toggle_sidebar_label=Togola ngebha eseCaleni outline.title=Bonisa isishwankathelo soxwebhu outline_label=Isishwankathelo soxwebhu attachments.title=Bonisa iziqhotyoshelwa attachments_label=Iziqhoboshelo thumbs.title=Bonisa ukrobiso kumfanekiso thumbs_label=Ukrobiso kumfanekiso findbar.title=Fumana kuXwebhu findbar_label=Fumana # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Iphepha {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Ukrobiso kumfanekiso wephepha {{page}} # Find panel button title and messages find_label=Fumanisa: find_previous.title=Fumanisa isenzeko sangaphambili sebinzana lamagama find_previous_label=Okwangaphambili find_next.title=Fumanisa isenzeko esilandelayo sebinzana lamagama find_next_label=Okulandelayo find_highlight=Qaqambisa konke find_match_case_label=Tshatisa ngobukhulu bukanobumba find_reached_top=Ufike ngaphezulu ephepheni, kusukwa ngezantsi find_reached_bottom=Ufike ekupheleni kwephepha, kusukwa ngaphezulu find_not_found=Ibinzana alifunyenwanga # Error panel labels error_more_info=Inkcazelo Engakumbi error_less_info=Inkcazelo Encinane error_close=Vala # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=I-PDF.js v{{version}} (yakha: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Umyalezo: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Imfumba: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Ifayile: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Umgca: {{line}} rendering_error=Imposiso yenzekile xa bekunikezelwa iphepha. # Predefined zoom values page_scale_width=Ububanzi bephepha page_scale_fit=Ukulinganiswa kwephepha page_scale_auto=Ukwandisa/Ukunciphisa Ngokwayo page_scale_actual=Ubungakanani bokwenene # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Imposiso loading_error=Imposiso yenzekile xa kulayishwa i-PDF. invalid_file_error=Ifayile ye-PDF engeyiyo okanye eyonakalisiweyo. missing_file_error=Ifayile ye-PDF edukileyo. unexpected_response_error=Impendulo yeseva engalindelekanga. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} Ubhalo-nqaku] password_label=Faka ipasiwedi ukuze uvule le fayile yePDF. password_invalid=Ipasiwedi ayisebenzi. Nceda uzame kwakhona. password_ok=KULUNGILE password_cancel=Rhoxisa printing_not_supported=Isilumkiso: Ukuprinta akuxhaswa ngokupheleleyo yile bhrawuza. printing_not_ready=Isilumkiso: IPDF ayihlohlwanga ngokupheleleyo ukwenzela ukuprinta. web_fonts_disabled=Iifonti zewebhu ziqhwalelisiwe: ayikwazi ukusebenzisa iifonti ze-PDF ezincanyathelisiweyo. document_colors_not_allowed=Amaxwebhu ePDF akavumelekanga ukuba asebenzise imibala yawo: 'Ukuvumela amaphepha ukuba asebenzise eyawo imibala' kuvaliwe ukuba kungasebenzi kwibhrawuza. manuskript-0.10.0/libs/pdf.js/web/locale/zh-CN/000077500000000000000000000000001354442177200210465ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/zh-CN/viewer.properties000066400000000000000000000151141354442177200244670ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=上一页 previous_label=上一页 next.title=下一页 next_label=下一页 # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=页面: page_of=/ {{pageCount}} zoom_out.title=缩小 zoom_out_label=缩小 zoom_in.title=放大 zoom_in_label=放大 zoom.title=缩放 presentation_mode.title=切换到演示模式 presentation_mode_label=演示模式 open_file.title=打开文件 open_file_label=打开 print.title=打印 print_label=打印 download.title=下载 download_label=下载 bookmark.title=当前视图(复制或在新窗口中打开) bookmark_label=当前视图 # Secondary toolbar and context menu tools.title=工具 tools_label=工具 first_page.title=转到第一页 first_page.label=转到第一页 first_page_label=转到第一页 last_page.title=转到最后一页 last_page.label=转到最后一页 last_page_label=转到最后一页 page_rotate_cw.title=顺时针旋转 page_rotate_cw.label=顺时针旋转 page_rotate_cw_label=顺时针旋转 page_rotate_ccw.title=逆时针旋转 page_rotate_ccw.label=逆时针旋转 page_rotate_ccw_label=逆时针旋转 hand_tool_enable.title=启用手形工具 hand_tool_enable_label=启用手形工具 hand_tool_disable.title=禁用手形工具 hand_tool_disable_label=禁用手形工具 # Document properties dialog box document_properties.title=文档属性… document_properties_label=文档属性… document_properties_file_name=文件名: document_properties_file_size=文件大小: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} 字节) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} 字节) document_properties_title=标题: document_properties_author=作者: document_properties_subject=主题: document_properties_keywords=关键词: document_properties_creation_date=创建日期: document_properties_modification_date=修改日期: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=创建者: document_properties_producer=PDF 制作者: document_properties_version=PDF 版本: document_properties_page_count=页数: document_properties_close=关闭 # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=切换侧栏 toggle_sidebar_label=切换侧栏 outline.title=显示文档大纲 outline_label=文档大纲 attachments.title=显示附件 attachments_label=附件 thumbs.title=显示缩略图 thumbs_label=缩略图 findbar.title=在文档中查找 findbar_label=查找 # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=页码 {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=页面 {{page}} 的缩略图 # Find panel button title and messages find_label=查找: find_previous.title=查找词语上一次出现的位置 find_previous_label=上一页 find_next.title=查找词语后一次出现的位置 find_next_label=下一页 find_highlight=全部高亮显示 find_match_case_label=区分大小写 find_reached_top=到达文档开头,从末尾继续 find_reached_bottom=到达文档末尾,从开头继续 find_not_found=词语未找到 # Error panel labels error_more_info=更多信息 error_less_info=更少信息 error_close=关闭 # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=信息:{{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=堆栈:{{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=文件:{{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=行号:{{line}} rendering_error=渲染页面时发生错误。 # Predefined zoom values page_scale_width=适合页宽 page_scale_fit=适合页面 page_scale_auto=自动缩放 page_scale_actual=实际大小 # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=错误 loading_error=载入PDF时发生错误。 invalid_file_error=无效或损坏的PDF文件。 missing_file_error=缺少PDF文件。 unexpected_response_error=意外的服务器响应。 # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} 注解] password_label=输入密码以打开此 PDF 文件。 password_invalid=密码无效。请重试。 password_ok=确定 password_cancel=取消 printing_not_supported=警告:打印功能不完全支持此浏览器。 printing_not_ready=警告:该 PDF 未完全加载以供打印。 web_fonts_disabled=Web 字体已被禁用:无法使用嵌入的PDF字体。 document_colors_not_allowed=不允许 PDF 文档使用自己的颜色:浏览器中“允许页面选择自己的颜色”的选项已停用。 manuskript-0.10.0/libs/pdf.js/web/locale/zh-TW/000077500000000000000000000000001354442177200211005ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/zh-TW/viewer.properties000066400000000000000000000152201354442177200245170ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=上一頁 previous_label=上一頁 next.title=下一頁 next_label=下一頁 # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=頁: page_of=/ {{pageCount}} zoom_out.title=縮小 zoom_out_label=縮小 zoom_in.title=放大 zoom_in_label=放大 zoom.title=縮放 presentation_mode.title=切換至簡報模式 presentation_mode_label=簡報模式 open_file.title=開啟檔案 open_file_label=開啟 print.title=列印 print_label=列印 download.title=下載 download_label=下載 bookmark.title=目前檢視的內容(複製或開啟於新視窗) bookmark_label=目前檢視 # Secondary toolbar and context menu tools.title=工具 tools_label=工具 first_page.title=跳到第一頁 first_page.label=跳到第一頁 first_page_label=跳到第一頁 last_page.title=跳到最後一頁 last_page.label=跳到最後一頁 last_page_label=跳到最後一頁 page_rotate_cw.title=順時針旋轉 page_rotate_cw.label=順時針旋轉 page_rotate_cw_label=順時針旋轉 page_rotate_ccw.title=逆時針旋轉 page_rotate_ccw.label=逆時針旋轉 page_rotate_ccw_label=逆時針旋轉 hand_tool_enable.title=啟用掌型工具 hand_tool_enable_label=啟用掌型工具 hand_tool_disable.title=停用掌型工具 hand_tool_disable_label=停用掌型工具 # Document properties dialog box document_properties.title=文件內容… document_properties_label=文件內容… document_properties_file_name=檔案名稱: document_properties_file_size=檔案大小: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB({{size_b}} 位元組) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB({{size_b}} 位元組) document_properties_title=標題: document_properties_author=作者: document_properties_subject=主旨: document_properties_keywords=關鍵字: document_properties_creation_date=建立日期: document_properties_modification_date=修改日期: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=建立者: document_properties_producer=PDF 產生器: document_properties_version=PDF 版本: document_properties_page_count=頁數: document_properties_close=關閉 # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=切換側邊欄 toggle_sidebar_label=切換側邊欄 outline.title=顯示文件大綱 outline_label=文件大綱 attachments.title=顯示附件 attachments_label=附件 thumbs.title=顯示縮圖 thumbs_label=縮圖 findbar.title=在文件中尋找 findbar_label=尋找 # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=頁 {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=頁 {{page}} 的縮圖 # Find panel button title and messages find_label=尋找: find_previous.title=尋找文字前次出現的位置 find_previous_label=上一個 find_next.title=尋找文字下次出現的位置 find_next_label=下一個 find_highlight=全部強調標示 find_match_case_label=區分大小寫 find_reached_top=已搜尋至文件頂端,自底端繼續搜尋 find_reached_bottom=已搜尋至文件底端,自頂端繼續搜尋 find_not_found=找不到指定文字 # Error panel labels error_more_info=更多資訊 error_less_info=更少資訊 error_close=關閉 # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=訊息: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=堆疊: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=檔案: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=行: {{line}} rendering_error=描繪頁面時發生錯誤。 # Predefined zoom values page_scale_width=頁面寬度 page_scale_fit=縮放至頁面大小 page_scale_auto=自動縮放 page_scale_actual=實際大小 # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=錯誤 loading_error=載入 PDF 時發生錯誤。 invalid_file_error=無效或毀損的 PDF 檔案。 missing_file_error=找不到 PDF 檔案。 unexpected_response_error=伺服器回應未預期的內容。 # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} 註解] password_label=請輸入用來開啟此 PDF 檔案的密碼。 password_invalid=密碼不正確,請再試一次。 password_ok=確定 password_cancel=取消 printing_not_supported=警告: 此瀏覽器未完整支援列印功能。 printing_not_ready=警告: 此 PDF 未完成下載以供列印。 web_fonts_disabled=已停用網路字型 (Web fonts): 無法使用 PDF 內嵌字型。 document_colors_not_allowed=不允許 PDF 文件使用自訂色彩: 已停用瀏覽器的「優先使用網頁指定的色彩」設定。 manuskript-0.10.0/libs/pdf.js/web/locale/zu/000077500000000000000000000000001354442177200205655ustar00rootroot00000000000000manuskript-0.10.0/libs/pdf.js/web/locale/zu/viewer.properties000066400000000000000000000125751354442177200242160ustar00rootroot00000000000000# Copyright 2012 Mozilla Foundation # # 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. # Main toolbar buttons (tooltips and alt text for images) previous.title=Ikhasi eledlule previous_label=Okudlule next.title=Ikhasi elilandelayo next_label=Okulandelayo # LOCALIZATION NOTE (page_label, page_of): # These strings are concatenated to form the "Page: X of Y" string. # Do not translate "{{pageCount}}", it will be substituted with a number # representing the total number of pages. page_label=Ikhasi: page_of=kwe-{{pageCount}} zoom_out.title=Hlehlisela emuva zoom_out_label=Hlehlisela emuva zoom_in.title=Sondeza eduze zoom_in_label=Sondeza eduze zoom.title=Lwiza presentation_mode.title=Guqulela kwindlela yesethulo presentation_mode_label=Indlelo yesethulo open_file.title=Vula ifayela open_file_label=Vula print.title=Phrinta print_label=Phrinta download.title=Landa download_label=Landa bookmark.title=Ukubuka kwamanje (kopisha noma vula kwifasitela elisha) bookmark_label=Ukubuka kwamanje # Secondary toolbar and context menu # Document properties dialog box document_properties_file_name=Igama lefayela: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_title=Isihloko: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=I-toggle yebha yaseceleni toggle_sidebar_label=i-toggle yebha yaseceleni outline.title=Bonisa umugqa waseceleni wedokhumenti outline_label=Umugqa waseceleni wedokhumenti thumbs.title=Bonisa izithombe ezincane thumbs_label=Izithonjana findbar.title=Thola kwidokhumenti findbar_label=Thola # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=Ikhasi {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=Isithonjana sekhasi {{page}} # Find panel button title and messages find_label=Thola find_previous.title=Thola indawo eyandulelayo okuvela kuyo lomshwana find_previous_label=Okudlulile find_next.title=Thola enye indawo okuvela kuyo lomshwana find_next_label=Okulandelayo find_highlight=Gqamisa konke find_match_case_label=Fanisa ikheyisi find_reached_top=Finyelele phezulu kwidokhumenti, qhubeka kusukaphansi find_reached_bottom=Ifinyelele ekupheleni kwedokhumenti, qhubeka kusukaphezulu find_not_found=Umshwana awutholakali # Error panel labels error_more_info=Ukwaziswa Okwengeziwe error_less_info=Ukwazi okuncane # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=Umlayezo: {{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=Isitaki: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Ifayela: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Umugqa: {{line}} rendering_error=Iphutha lenzekile uma kunikwa ikhasi. # Predefined zoom values page_scale_width=Ububanzi bekhasi page_scale_fit=Ukulingana kwekhasi page_scale_auto=Ukulwiza okuzenzekalelayo page_scale_actual=Usayizi Wangempela # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. # Loading indicator messages loading_error_indicator=Iphutha loading_error=Kwenzeke iphutha uma kulayishwa i-PDF. invalid_file_error=Ifayela le-PDF elingavumelekile noma elonakele. missing_file_error=Ifayela le-PDF elilahlekile. # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Amazwibela e-{{type}}] password_ok=Kulungile password_cancel=Khansela printing_not_supported=Isixwayiso: Ukuphrinta akuxhasiwe yilesisiphequluli ngokugcwele. printing_not_ready=Isixwayiso: I-PDF ayikalayishwa ngokuphelele yiPhrinta. web_fonts_disabled=Amafonti e-webhu akutshaziwe: ayikwazi ukusebenzisa amafonti abekiwe e-PDF.\u0020 document_colors_not_allowed=Amadokhumenti we-PDF awavumelekile ukusebenzisa imibalo yayo: 'Vumela amakhasi ukukhetha imibala yayo' ayisebenzi kusiphequluli. manuskript-0.10.0/libs/pdf.js/web/viewer.css000066400000000000000000001376461354442177200207240ustar00rootroot00000000000000/* Copyright 2014 Mozilla Foundation * * 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. */ .textLayer { position: absolute; left: 0; top: 0; right: 0; bottom: 0; overflow: hidden; opacity: 0.2; line-height: 1.0; } .textLayer > div { color: transparent; position: absolute; white-space: pre; cursor: text; -webkit-transform-origin: 0% 0%; -moz-transform-origin: 0% 0%; -o-transform-origin: 0% 0%; -ms-transform-origin: 0% 0%; transform-origin: 0% 0%; } .textLayer .highlight { margin: -1px; padding: 1px; background-color: rgb(180, 0, 170); border-radius: 4px; } .textLayer .highlight.begin { border-radius: 4px 0px 0px 4px; } .textLayer .highlight.end { border-radius: 0px 4px 4px 0px; } .textLayer .highlight.middle { border-radius: 0px; } .textLayer .highlight.selected { background-color: rgb(0, 100, 0); } .textLayer ::selection { background: rgb(0,0,255); } .textLayer ::-moz-selection { background: rgb(0,0,255); } .textLayer .endOfContent { display: block; position: absolute; left: 0px; top: 100%; right: 0px; bottom: 0px; z-index: -1; cursor: default; -webkit-user-select: none; -ms-user-select: none; -moz-user-select: none; } .textLayer .endOfContent.active { top: 0px; } .annotationLayer section { position: absolute; } .annotationLayer .linkAnnotation > a { position: absolute; font-size: 1em; top: 0; left: 0; width: 100%; height: 100%; } .annotationLayer .linkAnnotation > a /* -ms-a */ { background: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7") 0 0 repeat; } .annotationLayer .linkAnnotation > a:hover { opacity: 0.2; background: #ff0; box-shadow: 0px 2px 10px #ff0; } .annotationLayer .textAnnotation img { position: absolute; cursor: pointer; } .annotationLayer .popupWrapper { position: absolute; width: 20em; } .annotationLayer .popup { position: absolute; z-index: 200; max-width: 20em; background-color: #FFFF99; box-shadow: 0px 2px 5px #333; border-radius: 2px; padding: 0.6em; margin-left: 5px; cursor: pointer; word-wrap: break-word; } .annotationLayer .popup h1 { font-size: 1em; border-bottom: 1px solid #000000; padding-bottom: 0.2em; } .annotationLayer .popup p { padding-top: 0.2em; } .annotationLayer .highlightAnnotation, .annotationLayer .underlineAnnotation, .annotationLayer .squigglyAnnotation, .annotationLayer .strikeoutAnnotation, .annotationLayer .fileAttachmentAnnotation { cursor: pointer; } .pdfViewer .canvasWrapper { overflow: hidden; } .pdfViewer .page { direction: ltr; width: 816px; height: 1056px; margin: 1px auto -8px auto; position: relative; overflow: visible; border: 9px solid transparent; background-clip: content-box; border-image: url(images/shadow.png) 9 9 repeat; background-color: white; } .pdfViewer.removePageBorders .page { margin: 0px auto 10px auto; border: none; } .pdfViewer .page canvas { margin: 0; display: block; } .pdfViewer .page .loadingIcon { position: absolute; display: block; left: 0; top: 0; right: 0; bottom: 0; background: url('images/loading-icon.gif') center no-repeat; } .pdfPresentationMode:-webkit-full-screen .pdfViewer .page { margin-bottom: 100%; border: 0; } .pdfPresentationMode:-moz-full-screen .pdfViewer .page { margin-bottom: 100%; border: 0; } .pdfPresentationMode:-ms-fullscreen .pdfViewer .page { margin-bottom: 100% !important; border: 0; } .pdfPresentationMode:fullscreen .pdfViewer .page { margin-bottom: 100%; border: 0; } * { padding: 0; margin: 0; } html { height: 100%; width: 100%; /* Font size is needed to make the activity bar the correct size. */ font-size: 10px; } body { height: 100%; width: 100%; background-color: #404040; background-image: url(images/texture.png); } body, input, button, select { font: message-box; outline: none; } .hidden { display: none !important; } [hidden] { display: none !important; } #viewerContainer.pdfPresentationMode:-webkit-full-screen { top: 0px; border-top: 2px solid transparent; background-color: #000; width: 100%; height: 100%; overflow: hidden; cursor: none; -webkit-user-select: none; } #viewerContainer.pdfPresentationMode:-moz-full-screen { top: 0px; border-top: 2px solid transparent; background-color: #000; width: 100%; height: 100%; overflow: hidden; cursor: none; -moz-user-select: none; } #viewerContainer.pdfPresentationMode:-ms-fullscreen { top: 0px !important; border-top: 2px solid transparent; width: 100%; height: 100%; overflow: hidden !important; cursor: none; -ms-user-select: none; } #viewerContainer.pdfPresentationMode:-ms-fullscreen::-ms-backdrop { background-color: #000; } #viewerContainer.pdfPresentationMode:fullscreen { top: 0px; border-top: 2px solid transparent; background-color: #000; width: 100%; height: 100%; overflow: hidden; cursor: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; } .pdfPresentationMode:-webkit-full-screen a:not(.internalLink) { display: none; } .pdfPresentationMode:-moz-full-screen a:not(.internalLink) { display: none; } .pdfPresentationMode:-ms-fullscreen a:not(.internalLink) { display: none !important; } .pdfPresentationMode:fullscreen a:not(.internalLink) { display: none; } .pdfPresentationMode:-webkit-full-screen .textLayer > div { cursor: none; } .pdfPresentationMode:-moz-full-screen .textLayer > div { cursor: none; } .pdfPresentationMode:-ms-fullscreen .textLayer > div { cursor: none; } .pdfPresentationMode:fullscreen .textLayer > div { cursor: none; } .pdfPresentationMode.pdfPresentationModeControls > *, .pdfPresentationMode.pdfPresentationModeControls .textLayer > div { cursor: default; } /* outer/inner center provides horizontal center */ .outerCenter { pointer-events: none; position: relative; } html[dir='ltr'] .outerCenter { float: right; right: 50%; } html[dir='rtl'] .outerCenter { float: left; left: 50%; } .innerCenter { pointer-events: auto; position: relative; } html[dir='ltr'] .innerCenter { float: right; right: -50%; } html[dir='rtl'] .innerCenter { float: left; left: -50%; } #outerContainer { width: 100%; height: 100%; position: relative; } #sidebarContainer { position: absolute; top: 0; bottom: 0; width: 200px; visibility: hidden; -webkit-transition-duration: 200ms; -webkit-transition-timing-function: ease; transition-duration: 200ms; transition-timing-function: ease; } html[dir='ltr'] #sidebarContainer { -webkit-transition-property: left; transition-property: left; left: -200px; } html[dir='rtl'] #sidebarContainer { -webkit-transition-property: right; transition-property: right; right: -200px; } #outerContainer.sidebarMoving > #sidebarContainer, #outerContainer.sidebarOpen > #sidebarContainer { visibility: visible; } html[dir='ltr'] #outerContainer.sidebarOpen > #sidebarContainer { left: 0px; } html[dir='rtl'] #outerContainer.sidebarOpen > #sidebarContainer { right: 0px; } #mainContainer { position: absolute; top: 0; right: 0; bottom: 0; left: 0; min-width: 320px; -webkit-transition-duration: 200ms; -webkit-transition-timing-function: ease; transition-duration: 200ms; transition-timing-function: ease; } html[dir='ltr'] #outerContainer.sidebarOpen > #mainContainer { -webkit-transition-property: left; transition-property: left; left: 200px; } html[dir='rtl'] #outerContainer.sidebarOpen > #mainContainer { -webkit-transition-property: right; transition-property: right; right: 200px; } #sidebarContent { top: 32px; bottom: 0; overflow: auto; -webkit-overflow-scrolling: touch; position: absolute; width: 200px; background-color: hsla(0,0%,0%,.1); } html[dir='ltr'] #sidebarContent { left: 0; box-shadow: inset -1px 0 0 hsla(0,0%,0%,.25); } html[dir='rtl'] #sidebarContent { right: 0; box-shadow: inset 1px 0 0 hsla(0,0%,0%,.25); } #viewerContainer { overflow: auto; -webkit-overflow-scrolling: touch; position: absolute; top: 32px; right: 0; bottom: 0; left: 0; outline: none; } html[dir='ltr'] #viewerContainer { box-shadow: inset 1px 0 0 hsla(0,0%,100%,.05); } html[dir='rtl'] #viewerContainer { box-shadow: inset -1px 0 0 hsla(0,0%,100%,.05); } .toolbar { position: relative; left: 0; right: 0; z-index: 9999; cursor: default; } #toolbarContainer { width: 100%; } #toolbarSidebar { width: 200px; height: 32px; background-color: #424242; /* fallback */ background-image: url(images/texture.png), linear-gradient(hsla(0,0%,30%,.99), hsla(0,0%,25%,.95)); } html[dir='ltr'] #toolbarSidebar { box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.25), inset 0 -1px 0 hsla(0,0%,100%,.05), 0 1px 0 hsla(0,0%,0%,.15), 0 0 1px hsla(0,0%,0%,.1); } html[dir='rtl'] #toolbarSidebar { box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.25), inset 0 1px 0 hsla(0,0%,100%,.05), 0 1px 0 hsla(0,0%,0%,.15), 0 0 1px hsla(0,0%,0%,.1); } #toolbarContainer, .findbar, .secondaryToolbar { position: relative; height: 32px; background-color: #474747; /* fallback */ background-image: url(images/texture.png), linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95)); } html[dir='ltr'] #toolbarContainer, .findbar, .secondaryToolbar { box-shadow: inset 1px 0 0 hsla(0,0%,100%,.08), inset 0 1px 1px hsla(0,0%,0%,.15), inset 0 -1px 0 hsla(0,0%,100%,.05), 0 1px 0 hsla(0,0%,0%,.15), 0 1px 1px hsla(0,0%,0%,.1); } html[dir='rtl'] #toolbarContainer, .findbar, .secondaryToolbar { box-shadow: inset -1px 0 0 hsla(0,0%,100%,.08), inset 0 1px 1px hsla(0,0%,0%,.15), inset 0 -1px 0 hsla(0,0%,100%,.05), 0 1px 0 hsla(0,0%,0%,.15), 0 1px 1px hsla(0,0%,0%,.1); } #toolbarViewer { height: 32px; } #loadingBar { position: relative; width: 100%; height: 4px; background-color: #333; border-bottom: 1px solid #333; } #loadingBar .progress { position: absolute; top: 0; left: 0; width: 0%; height: 100%; background-color: #ddd; overflow: hidden; -webkit-transition: width 200ms; transition: width 200ms; } @-webkit-keyframes progressIndeterminate { 0% { left: -142px; } 100% { left: 0; } } @keyframes progressIndeterminate { 0% { left: -142px; } 100% { left: 0; } } #loadingBar .progress.indeterminate { background-color: #999; -webkit-transition: none; transition: none; } #loadingBar .progress.indeterminate .glimmer { position: absolute; top: 0; left: 0; height: 100%; width: calc(100% + 150px); background: repeating-linear-gradient(135deg, #bbb 0, #999 5px, #999 45px, #ddd 55px, #ddd 95px, #bbb 100px); -webkit-animation: progressIndeterminate 950ms linear infinite; animation: progressIndeterminate 950ms linear infinite; } .findbar, .secondaryToolbar { top: 32px; position: absolute; z-index: 10000; height: 32px; min-width: 16px; padding: 0px 6px 0px 6px; margin: 4px 2px 4px 2px; color: hsl(0,0%,85%); font-size: 12px; line-height: 14px; text-align: left; cursor: default; } html[dir='ltr'] .findbar { left: 68px; } html[dir='rtl'] .findbar { right: 68px; } .findbar label { -webkit-user-select: none; -moz-user-select: none; } #findInput[data-status="pending"] { background-image: url(images/loading-small.png); background-repeat: no-repeat; background-position: right; } html[dir='rtl'] #findInput[data-status="pending"] { background-position: left; } .secondaryToolbar { padding: 6px; height: auto; z-index: 30000; } html[dir='ltr'] .secondaryToolbar { right: 4px; } html[dir='rtl'] .secondaryToolbar { left: 4px; } #secondaryToolbarButtonContainer { max-width: 200px; max-height: 400px; overflow-y: auto; -webkit-overflow-scrolling: touch; margin-bottom: -4px; } .doorHanger, .doorHangerRight { border: 1px solid hsla(0,0%,0%,.5); border-radius: 2px; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); } .doorHanger:after, .doorHanger:before, .doorHangerRight:after, .doorHangerRight:before { bottom: 100%; border: solid transparent; content: " "; height: 0; width: 0; position: absolute; pointer-events: none; } .doorHanger:after, .doorHangerRight:after { border-bottom-color: hsla(0,0%,32%,.99); border-width: 8px; } .doorHanger:before, .doorHangerRight:before { border-bottom-color: hsla(0,0%,0%,.5); border-width: 9px; } html[dir='ltr'] .doorHanger:after, html[dir='rtl'] .doorHangerRight:after { left: 13px; margin-left: -8px; } html[dir='ltr'] .doorHanger:before, html[dir='rtl'] .doorHangerRight:before { left: 13px; margin-left: -9px; } html[dir='rtl'] .doorHanger:after, html[dir='ltr'] .doorHangerRight:after { right: 13px; margin-right: -8px; } html[dir='rtl'] .doorHanger:before, html[dir='ltr'] .doorHangerRight:before { right: 13px; margin-right: -9px; } #findResultsCount { background-color: hsl(0, 0%, 85%); color: hsl(0, 0%, 32%); text-align: center; padding: 3px 4px; } #findMsg { font-style: italic; color: #A6B7D0; } #findInput.notFound { background-color: rgb(255, 102, 102); } html[dir='ltr'] #toolbarViewerLeft { margin-left: -1px; } html[dir='rtl'] #toolbarViewerRight { margin-right: -1px; } html[dir='ltr'] #toolbarViewerLeft, html[dir='rtl'] #toolbarViewerRight { position: absolute; top: 0; left: 0; } html[dir='ltr'] #toolbarViewerRight, html[dir='rtl'] #toolbarViewerLeft { position: absolute; top: 0; right: 0; } html[dir='ltr'] #toolbarViewerLeft > *, html[dir='ltr'] #toolbarViewerMiddle > *, html[dir='ltr'] #toolbarViewerRight > *, html[dir='ltr'] .findbar > * { position: relative; float: left; } html[dir='rtl'] #toolbarViewerLeft > *, html[dir='rtl'] #toolbarViewerMiddle > *, html[dir='rtl'] #toolbarViewerRight > *, html[dir='rtl'] .findbar > * { position: relative; float: right; } html[dir='ltr'] .splitToolbarButton { margin: 3px 2px 4px 0; display: inline-block; } html[dir='rtl'] .splitToolbarButton { margin: 3px 0 4px 2px; display: inline-block; } html[dir='ltr'] .splitToolbarButton > .toolbarButton { border-radius: 0; float: left; } html[dir='rtl'] .splitToolbarButton > .toolbarButton { border-radius: 0; float: right; } .toolbarButton, .secondaryToolbarButton, .overlayButton { border: 0 none; background: none; width: 32px; height: 25px; } .toolbarButton > span { display: inline-block; width: 0; height: 0; overflow: hidden; } .toolbarButton[disabled], .secondaryToolbarButton[disabled], .overlayButton[disabled] { opacity: .5; } .toolbarButton.group { margin-right: 0; } .splitToolbarButton.toggled .toolbarButton { margin: 0; } .splitToolbarButton:hover > .toolbarButton, .splitToolbarButton:focus > .toolbarButton, .splitToolbarButton.toggled > .toolbarButton, .toolbarButton.textButton { background-color: hsla(0,0%,0%,.12); background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); background-clip: padding-box; border: 1px solid hsla(0,0%,0%,.35); border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42); box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset, 0 0 1px hsla(0,0%,100%,.15) inset, 0 1px 0 hsla(0,0%,100%,.05); -webkit-transition-property: background-color, border-color, box-shadow; -webkit-transition-duration: 150ms; -webkit-transition-timing-function: ease; transition-property: background-color, border-color, box-shadow; transition-duration: 150ms; transition-timing-function: ease; } .splitToolbarButton > .toolbarButton:hover, .splitToolbarButton > .toolbarButton:focus, .dropdownToolbarButton:hover, .overlayButton:hover, .overlayButton:focus, .toolbarButton.textButton:hover, .toolbarButton.textButton:focus { background-color: hsla(0,0%,0%,.2); box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset, 0 0 1px hsla(0,0%,100%,.15) inset, 0 0 1px hsla(0,0%,0%,.05); z-index: 199; } .splitToolbarButton > .toolbarButton { position: relative; } html[dir='ltr'] .splitToolbarButton > .toolbarButton:first-child, html[dir='rtl'] .splitToolbarButton > .toolbarButton:last-child { position: relative; margin: 0; margin-right: -1px; border-top-left-radius: 2px; border-bottom-left-radius: 2px; border-right-color: transparent; } html[dir='ltr'] .splitToolbarButton > .toolbarButton:last-child, html[dir='rtl'] .splitToolbarButton > .toolbarButton:first-child { position: relative; margin: 0; margin-left: -1px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-left-color: transparent; } .splitToolbarButtonSeparator { padding: 8px 0; width: 1px; background-color: hsla(0,0%,0%,.5); z-index: 99; box-shadow: 0 0 0 1px hsla(0,0%,100%,.08); display: inline-block; margin: 5px 0; } html[dir='ltr'] .splitToolbarButtonSeparator { float: left; } html[dir='rtl'] .splitToolbarButtonSeparator { float: right; } .splitToolbarButton:hover > .splitToolbarButtonSeparator, .splitToolbarButton.toggled > .splitToolbarButtonSeparator { padding: 12px 0; margin: 1px 0; box-shadow: 0 0 0 1px hsla(0,0%,100%,.03); -webkit-transition-property: padding; -webkit-transition-duration: 10ms; -webkit-transition-timing-function: ease; transition-property: padding; transition-duration: 10ms; transition-timing-function: ease; } .toolbarButton, .dropdownToolbarButton, .secondaryToolbarButton, .overlayButton { min-width: 16px; padding: 2px 6px 0; border: 1px solid transparent; border-radius: 2px; color: hsla(0,0%,100%,.8); font-size: 12px; line-height: 14px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; /* Opera does not support user-select, use <... unselectable="on"> instead */ cursor: default; -webkit-transition-property: background-color, border-color, box-shadow; -webkit-transition-duration: 150ms; -webkit-transition-timing-function: ease; transition-property: background-color, border-color, box-shadow; transition-duration: 150ms; transition-timing-function: ease; } html[dir='ltr'] .toolbarButton, html[dir='ltr'] .overlayButton, html[dir='ltr'] .dropdownToolbarButton { margin: 3px 2px 4px 0; } html[dir='rtl'] .toolbarButton, html[dir='rtl'] .overlayButton, html[dir='rtl'] .dropdownToolbarButton { margin: 3px 0 4px 2px; } .toolbarButton:hover, .toolbarButton:focus, .dropdownToolbarButton, .overlayButton, .secondaryToolbarButton:hover, .secondaryToolbarButton:focus { background-color: hsla(0,0%,0%,.12); background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); background-clip: padding-box; border: 1px solid hsla(0,0%,0%,.35); border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42); box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset, 0 0 1px hsla(0,0%,100%,.15) inset, 0 1px 0 hsla(0,0%,100%,.05); } .toolbarButton:hover:active, .overlayButton:hover:active, .dropdownToolbarButton:hover:active, .secondaryToolbarButton:hover:active { background-color: hsla(0,0%,0%,.2); background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); border-color: hsla(0,0%,0%,.35) hsla(0,0%,0%,.4) hsla(0,0%,0%,.45); box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset, 0 0 1px hsla(0,0%,0%,.2) inset, 0 1px 0 hsla(0,0%,100%,.05); -webkit-transition-property: background-color, border-color, box-shadow; -webkit-transition-duration: 10ms; -webkit-transition-timing-function: linear; transition-property: background-color, border-color, box-shadow; transition-duration: 10ms; transition-timing-function: linear; } .toolbarButton.toggled, .splitToolbarButton.toggled > .toolbarButton.toggled, .secondaryToolbarButton.toggled { background-color: hsla(0,0%,0%,.3); background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.45) hsla(0,0%,0%,.5); box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset, 0 0 1px hsla(0,0%,0%,.2) inset, 0 1px 0 hsla(0,0%,100%,.05); -webkit-transition-property: background-color, border-color, box-shadow; -webkit-transition-duration: 10ms; -webkit-transition-timing-function: linear; transition-property: background-color, border-color, box-shadow; transition-duration: 10ms; transition-timing-function: linear; } .toolbarButton.toggled:hover:active, .splitToolbarButton.toggled > .toolbarButton.toggled:hover:active, .secondaryToolbarButton.toggled:hover:active { background-color: hsla(0,0%,0%,.4); border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.5) hsla(0,0%,0%,.55); box-shadow: 0 1px 1px hsla(0,0%,0%,.2) inset, 0 0 1px hsla(0,0%,0%,.3) inset, 0 1px 0 hsla(0,0%,100%,.05); } .dropdownToolbarButton { width: 120px; max-width: 120px; padding: 0; overflow: hidden; background: url(images/toolbarButton-menuArrows.png) no-repeat; } html[dir='ltr'] .dropdownToolbarButton { background-position: 95%; } html[dir='rtl'] .dropdownToolbarButton { background-position: 5%; } .dropdownToolbarButton > select { min-width: 140px; font-size: 12px; color: hsl(0,0%,95%); margin: 0; padding: 3px 2px 2px; border: none; background: rgba(0,0,0,0); /* Opera does not support 'transparent'

Current View
manuskript-0.10.0/libs/pdf.js/web/viewer.js000066400000000000000000010526711354442177200205430ustar00rootroot00000000000000/* Copyright 2016 Mozilla Foundation * * 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. */ /*globals require, chrome */ 'use strict'; var DEFAULT_URL = ''; var pdfjsWebLibs = { pdfjsWebPDFJS: window.pdfjsDistBuildPdf }; (function () { (function (root, factory) { { factory((root.pdfjsWebGrabToPan = {})); } }(this, function (exports) { /** * Construct a GrabToPan instance for a given HTML element. * @param options.element {Element} * @param options.ignoreTarget {function} optional. See `ignoreTarget(node)` * @param options.onActiveChanged {function(boolean)} optional. Called * when grab-to-pan is (de)activated. The first argument is a boolean that * shows whether grab-to-pan is activated. */ function GrabToPan(options) { this.element = options.element; this.document = options.element.ownerDocument; if (typeof options.ignoreTarget === 'function') { this.ignoreTarget = options.ignoreTarget; } this.onActiveChanged = options.onActiveChanged; // Bind the contexts to ensure that `this` always points to // the GrabToPan instance. this.activate = this.activate.bind(this); this.deactivate = this.deactivate.bind(this); this.toggle = this.toggle.bind(this); this._onmousedown = this._onmousedown.bind(this); this._onmousemove = this._onmousemove.bind(this); this._endPan = this._endPan.bind(this); // This overlay will be inserted in the document when the mouse moves during // a grab operation, to ensure that the cursor has the desired appearance. var overlay = this.overlay = document.createElement('div'); overlay.className = 'grab-to-pan-grabbing'; } GrabToPan.prototype = { /** * Class name of element which can be grabbed */ CSS_CLASS_GRAB: 'grab-to-pan-grab', /** * Bind a mousedown event to the element to enable grab-detection. */ activate: function GrabToPan_activate() { if (!this.active) { this.active = true; this.element.addEventListener('mousedown', this._onmousedown, true); this.element.classList.add(this.CSS_CLASS_GRAB); if (this.onActiveChanged) { this.onActiveChanged(true); } } }, /** * Removes all events. Any pending pan session is immediately stopped. */ deactivate: function GrabToPan_deactivate() { if (this.active) { this.active = false; this.element.removeEventListener('mousedown', this._onmousedown, true); this._endPan(); this.element.classList.remove(this.CSS_CLASS_GRAB); if (this.onActiveChanged) { this.onActiveChanged(false); } } }, toggle: function GrabToPan_toggle() { if (this.active) { this.deactivate(); } else { this.activate(); } }, /** * Whether to not pan if the target element is clicked. * Override this method to change the default behaviour. * * @param node {Element} The target of the event * @return {boolean} Whether to not react to the click event. */ ignoreTarget: function GrabToPan_ignoreTarget(node) { // Use matchesSelector to check whether the clicked element // is (a child of) an input element / link return node[matchesSelector]( 'a[href], a[href] *, input, textarea, button, button *, select, option' ); }, /** * @private */ _onmousedown: function GrabToPan__onmousedown(event) { if (event.button !== 0 || this.ignoreTarget(event.target)) { return; } if (event.originalTarget) { try { /* jshint expr:true */ event.originalTarget.tagName; } catch (e) { // Mozilla-specific: element is a scrollbar (XUL element) return; } } this.scrollLeftStart = this.element.scrollLeft; this.scrollTopStart = this.element.scrollTop; this.clientXStart = event.clientX; this.clientYStart = event.clientY; this.document.addEventListener('mousemove', this._onmousemove, true); this.document.addEventListener('mouseup', this._endPan, true); // When a scroll event occurs before a mousemove, assume that the user // dragged a scrollbar (necessary for Opera Presto, Safari and IE) // (not needed for Chrome/Firefox) this.element.addEventListener('scroll', this._endPan, true); event.preventDefault(); event.stopPropagation(); this.document.documentElement.classList.add(this.CSS_CLASS_GRABBING); var focusedElement = document.activeElement; if (focusedElement && !focusedElement.contains(event.target)) { focusedElement.blur(); } }, /** * @private */ _onmousemove: function GrabToPan__onmousemove(event) { this.element.removeEventListener('scroll', this._endPan, true); if (isLeftMouseReleased(event)) { this._endPan(); return; } var xDiff = event.clientX - this.clientXStart; var yDiff = event.clientY - this.clientYStart; this.element.scrollTop = this.scrollTopStart - yDiff; this.element.scrollLeft = this.scrollLeftStart - xDiff; if (!this.overlay.parentNode) { document.body.appendChild(this.overlay); } }, /** * @private */ _endPan: function GrabToPan__endPan() { this.element.removeEventListener('scroll', this._endPan, true); this.document.removeEventListener('mousemove', this._onmousemove, true); this.document.removeEventListener('mouseup', this._endPan, true); if (this.overlay.parentNode) { this.overlay.parentNode.removeChild(this.overlay); } } }; // Get the correct (vendor-prefixed) name of the matches method. var matchesSelector; ['webkitM', 'mozM', 'msM', 'oM', 'm'].some(function(prefix) { var name = prefix + 'atches'; if (name in document.documentElement) { matchesSelector = name; } name += 'Selector'; if (name in document.documentElement) { matchesSelector = name; } return matchesSelector; // If found, then truthy, and [].some() ends. }); // Browser sniffing because it's impossible to feature-detect // whether event.which for onmousemove is reliable var isNotIEorIsIE10plus = !document.documentMode || document.documentMode > 9; var chrome = window.chrome; var isChrome15OrOpera15plus = chrome && (chrome.webstore || chrome.app); // ^ Chrome 15+ ^ Opera 15+ var isSafari6plus = /Apple/.test(navigator.vendor) && /Version\/([6-9]\d*|[1-5]\d+)/.test(navigator.userAgent); /** * Whether the left mouse is not pressed. * @param event {MouseEvent} * @return {boolean} True if the left mouse button is not pressed. * False if unsure or if the left mouse button is pressed. */ function isLeftMouseReleased(event) { if ('buttons' in event && isNotIEorIsIE10plus) { // http://www.w3.org/TR/DOM-Level-3-Events/#events-MouseEvent-buttons // Firefox 15+ // Internet Explorer 10+ return !(event.buttons | 1); } if (isChrome15OrOpera15plus || isSafari6plus) { // Chrome 14+ // Opera 15+ // Safari 6.0+ return event.which === 0; } } exports.GrabToPan = GrabToPan; })); (function (root, factory) { { factory((root.pdfjsWebMozPrintCallbackPolyfill = {})); } }(this, function (exports) { if ('mozPrintCallback' in document.createElement('canvas')) { return; } // Cause positive result on feature-detection: HTMLCanvasElement.prototype.mozPrintCallback = undefined; var canvases; // During print task: non-live NodeList of elements var index; // Index of element that is being processed var print = window.print; window.print = function print() { if (canvases) { console.warn('Ignored window.print() because of a pending print job.'); return; } try { dispatchEvent('beforeprint'); } finally { canvases = document.querySelectorAll('canvas'); index = -1; next(); } }; function dispatchEvent(eventType) { var event = document.createEvent('CustomEvent'); event.initCustomEvent(eventType, false, false, 'custom'); window.dispatchEvent(event); } function next() { if (!canvases) { return; // Print task cancelled by user (state reset in abort()) } renderProgress(); if (++index < canvases.length) { var canvas = canvases[index]; if (typeof canvas.mozPrintCallback === 'function') { canvas.mozPrintCallback({ context: canvas.getContext('2d'), abort: abort, done: next }); } else { next(); } } else { renderProgress(); print.call(window); setTimeout(abort, 20); // Tidy-up } } function abort() { if (canvases) { canvases = null; renderProgress(); dispatchEvent('afterprint'); } } function renderProgress() { var progressContainer = document.getElementById('mozPrintCallback-shim'); if (canvases && canvases.length) { var progress = Math.round(100 * index / canvases.length); var progressBar = progressContainer.querySelector('progress'); var progressPerc = progressContainer.querySelector('.relative-progress'); progressBar.value = progress; progressPerc.textContent = progress + '%'; progressContainer.removeAttribute('hidden'); progressContainer.onclick = abort; } else { progressContainer.setAttribute('hidden', ''); } } var hasAttachEvent = !!document.attachEvent; window.addEventListener('keydown', function(event) { // Intercept Cmd/Ctrl + P in all browsers. // Also intercept Cmd/Ctrl + Shift + P in Chrome and Opera if (event.keyCode === 80/*P*/ && (event.ctrlKey || event.metaKey) && !event.altKey && (!event.shiftKey || window.chrome || window.opera)) { window.print(); if (hasAttachEvent) { // Only attachEvent can cancel Ctrl + P dialog in IE <=10 // attachEvent is gone in IE11, so the dialog will re-appear in IE11. return; } event.preventDefault(); if (event.stopImmediatePropagation) { event.stopImmediatePropagation(); } else { event.stopPropagation(); } return; } if (event.keyCode === 27 && canvases) { // Esc abort(); } }, true); if (hasAttachEvent) { document.attachEvent('onkeydown', function(event) { event = event || window.event; if (event.keyCode === 80/*P*/ && event.ctrlKey) { event.keyCode = 0; return false; } }); } if ('onbeforeprint' in window) { // Do not propagate before/afterprint events when they are not triggered // from within this polyfill. (FF/IE). var stopPropagationIfNeeded = function(event) { if (event.detail !== 'custom' && event.stopImmediatePropagation) { event.stopImmediatePropagation(); } }; window.addEventListener('beforeprint', stopPropagationIfNeeded, false); window.addEventListener('afterprint', stopPropagationIfNeeded, false); } })); (function (root, factory) { { factory((root.pdfjsWebOverlayManager = {})); } }(this, function (exports) { var OverlayManager = { overlays: {}, active: null, /** * @param {string} name The name of the overlay that is registered. This must * be equal to the ID of the overlay's DOM element. * @param {function} callerCloseMethod (optional) The method that, if present, * will call OverlayManager.close from the Object * registering the overlay. Access to this method is * necessary in order to run cleanup code when e.g. * the overlay is force closed. The default is null. * @param {boolean} canForceClose (optional) Indicates if opening the overlay * will close an active overlay. The default is false. * @returns {Promise} A promise that is resolved when the overlay has been * registered. */ register: function overlayManagerRegister(name, callerCloseMethod, canForceClose) { return new Promise(function (resolve) { var element, container; if (!name || !(element = document.getElementById(name)) || !(container = element.parentNode)) { throw new Error('Not enough parameters.'); } else if (this.overlays[name]) { throw new Error('The overlay is already registered.'); } this.overlays[name] = { element: element, container: container, callerCloseMethod: (callerCloseMethod || null), canForceClose: (canForceClose || false) }; resolve(); }.bind(this)); }, /** * @param {string} name The name of the overlay that is unregistered. * @returns {Promise} A promise that is resolved when the overlay has been * unregistered. */ unregister: function overlayManagerUnregister(name) { return new Promise(function (resolve) { if (!this.overlays[name]) { throw new Error('The overlay does not exist.'); } else if (this.active === name) { throw new Error('The overlay cannot be removed while it is active.'); } delete this.overlays[name]; resolve(); }.bind(this)); }, /** * @param {string} name The name of the overlay that should be opened. * @returns {Promise} A promise that is resolved when the overlay has been * opened. */ open: function overlayManagerOpen(name) { return new Promise(function (resolve) { if (!this.overlays[name]) { throw new Error('The overlay does not exist.'); } else if (this.active) { if (this.overlays[name].canForceClose) { this._closeThroughCaller(); } else if (this.active === name) { throw new Error('The overlay is already active.'); } else { throw new Error('Another overlay is currently active.'); } } this.active = name; this.overlays[this.active].element.classList.remove('hidden'); this.overlays[this.active].container.classList.remove('hidden'); window.addEventListener('keydown', this._keyDown); resolve(); }.bind(this)); }, /** * @param {string} name The name of the overlay that should be closed. * @returns {Promise} A promise that is resolved when the overlay has been * closed. */ close: function overlayManagerClose(name) { return new Promise(function (resolve) { if (!this.overlays[name]) { throw new Error('The overlay does not exist.'); } else if (!this.active) { throw new Error('The overlay is currently not active.'); } else if (this.active !== name) { throw new Error('Another overlay is currently active.'); } this.overlays[this.active].container.classList.add('hidden'); this.overlays[this.active].element.classList.add('hidden'); this.active = null; window.removeEventListener('keydown', this._keyDown); resolve(); }.bind(this)); }, /** * @private */ _keyDown: function overlayManager_keyDown(evt) { var self = OverlayManager; if (self.active && evt.keyCode === 27) { // Esc key. self._closeThroughCaller(); evt.preventDefault(); } }, /** * @private */ _closeThroughCaller: function overlayManager_closeThroughCaller() { if (this.overlays[this.active].callerCloseMethod) { this.overlays[this.active].callerCloseMethod(); } if (this.active) { this.close(this.active); } } }; exports.OverlayManager = OverlayManager; })); (function (root, factory) { { factory((root.pdfjsWebPDFHistory = {})); } }(this, function (exports) { function PDFHistory(options) { this.linkService = options.linkService; this.initialized = false; this.initialDestination = null; this.initialBookmark = null; } PDFHistory.prototype = { /** * @param {string} fingerprint * @param {IPDFLinkService} linkService */ initialize: function pdfHistoryInitialize(fingerprint) { this.initialized = true; this.reInitialized = false; this.allowHashChange = true; this.historyUnlocked = true; this.isViewerInPresentationMode = false; this.previousHash = window.location.hash.substring(1); this.currentBookmark = ''; this.currentPage = 0; this.updatePreviousBookmark = false; this.previousBookmark = ''; this.previousPage = 0; this.nextHashParam = ''; this.fingerprint = fingerprint; this.currentUid = this.uid = 0; this.current = {}; var state = window.history.state; if (this._isStateObjectDefined(state)) { // This corresponds to navigating back to the document // from another page in the browser history. if (state.target.dest) { this.initialDestination = state.target.dest; } else { this.initialBookmark = state.target.hash; } this.currentUid = state.uid; this.uid = state.uid + 1; this.current = state.target; } else { // This corresponds to the loading of a new document. if (state && state.fingerprint && this.fingerprint !== state.fingerprint) { // Reinitialize the browsing history when a new document // is opened in the web viewer. this.reInitialized = true; } this._pushOrReplaceState({fingerprint: this.fingerprint}, true); } var self = this; window.addEventListener('popstate', function pdfHistoryPopstate(evt) { if (!self.historyUnlocked) { return; } if (evt.state) { // Move back/forward in the history. self._goTo(evt.state); return; } // If the state is not set, then the user tried to navigate to a // different hash by manually editing the URL and pressing Enter, or by // clicking on an in-page link (e.g. the "current view" link). // Save the current view state to the browser history. // Note: In Firefox, history.null could also be null after an in-page // navigation to the same URL, and without dispatching the popstate // event: https://bugzilla.mozilla.org/show_bug.cgi?id=1183881 if (self.uid === 0) { // Replace the previous state if it was not explicitly set. var previousParams = (self.previousHash && self.currentBookmark && self.previousHash !== self.currentBookmark) ? {hash: self.currentBookmark, page: self.currentPage} : {page: 1}; replacePreviousHistoryState(previousParams, function() { updateHistoryWithCurrentHash(); }); } else { updateHistoryWithCurrentHash(); } }, false); function updateHistoryWithCurrentHash() { self.previousHash = window.location.hash.slice(1); self._pushToHistory({hash: self.previousHash}, false, true); self._updatePreviousBookmark(); } function replacePreviousHistoryState(params, callback) { // To modify the previous history entry, the following happens: // 1. history.back() // 2. _pushToHistory, which calls history.replaceState( ... ) // 3. history.forward() // Because a navigation via the history API does not immediately update // the history state, the popstate event is used for synchronization. self.historyUnlocked = false; // Suppress the hashchange event to avoid side effects caused by // navigating back and forward. self.allowHashChange = false; window.addEventListener('popstate', rewriteHistoryAfterBack); history.back(); function rewriteHistoryAfterBack() { window.removeEventListener('popstate', rewriteHistoryAfterBack); window.addEventListener('popstate', rewriteHistoryAfterForward); self._pushToHistory(params, false, true); history.forward(); } function rewriteHistoryAfterForward() { window.removeEventListener('popstate', rewriteHistoryAfterForward); self.allowHashChange = true; self.historyUnlocked = true; callback(); } } function pdfHistoryBeforeUnload() { var previousParams = self._getPreviousParams(null, true); if (previousParams) { var replacePrevious = (!self.current.dest && self.current.hash !== self.previousHash); self._pushToHistory(previousParams, false, replacePrevious); self._updatePreviousBookmark(); } // Remove the event listener when navigating away from the document, // since 'beforeunload' prevents Firefox from caching the document. window.removeEventListener('beforeunload', pdfHistoryBeforeUnload, false); } window.addEventListener('beforeunload', pdfHistoryBeforeUnload, false); window.addEventListener('pageshow', function pdfHistoryPageShow(evt) { // If the entire viewer (including the PDF file) is cached in // the browser, we need to reattach the 'beforeunload' event listener // since the 'DOMContentLoaded' event is not fired on 'pageshow'. window.addEventListener('beforeunload', pdfHistoryBeforeUnload, false); }, false); window.addEventListener('presentationmodechanged', function(e) { self.isViewerInPresentationMode = !!e.detail.active; }); }, clearHistoryState: function pdfHistory_clearHistoryState() { this._pushOrReplaceState(null, true); }, _isStateObjectDefined: function pdfHistory_isStateObjectDefined(state) { return (state && state.uid >= 0 && state.fingerprint && this.fingerprint === state.fingerprint && state.target && state.target.hash) ? true : false; }, _pushOrReplaceState: function pdfHistory_pushOrReplaceState(stateObj, replace) { if (replace) { window.history.replaceState(stateObj, '', document.URL); } else { window.history.pushState(stateObj, '', document.URL); } }, get isHashChangeUnlocked() { if (!this.initialized) { return true; } return this.allowHashChange; }, _updatePreviousBookmark: function pdfHistory_updatePreviousBookmark() { if (this.updatePreviousBookmark && this.currentBookmark && this.currentPage) { this.previousBookmark = this.currentBookmark; this.previousPage = this.currentPage; this.updatePreviousBookmark = false; } }, updateCurrentBookmark: function pdfHistoryUpdateCurrentBookmark(bookmark, pageNum) { if (this.initialized) { this.currentBookmark = bookmark.substring(1); this.currentPage = pageNum | 0; this._updatePreviousBookmark(); } }, updateNextHashParam: function pdfHistoryUpdateNextHashParam(param) { if (this.initialized) { this.nextHashParam = param; } }, push: function pdfHistoryPush(params, isInitialBookmark) { if (!(this.initialized && this.historyUnlocked)) { return; } if (params.dest && !params.hash) { params.hash = (this.current.hash && this.current.dest && this.current.dest === params.dest) ? this.current.hash : this.linkService.getDestinationHash(params.dest).split('#')[1]; } if (params.page) { params.page |= 0; } if (isInitialBookmark) { var target = window.history.state.target; if (!target) { // Invoked when the user specifies an initial bookmark, // thus setting initialBookmark, when the document is loaded. this._pushToHistory(params, false); this.previousHash = window.location.hash.substring(1); } this.updatePreviousBookmark = this.nextHashParam ? false : true; if (target) { // If the current document is reloaded, // avoid creating duplicate entries in the history. this._updatePreviousBookmark(); } return; } if (this.nextHashParam) { if (this.nextHashParam === params.hash) { this.nextHashParam = null; this.updatePreviousBookmark = true; return; } else { this.nextHashParam = null; } } if (params.hash) { if (this.current.hash) { if (this.current.hash !== params.hash) { this._pushToHistory(params, true); } else { if (!this.current.page && params.page) { this._pushToHistory(params, false, true); } this.updatePreviousBookmark = true; } } else { this._pushToHistory(params, true); } } else if (this.current.page && params.page && this.current.page !== params.page) { this._pushToHistory(params, true); } }, _getPreviousParams: function pdfHistory_getPreviousParams(onlyCheckPage, beforeUnload) { if (!(this.currentBookmark && this.currentPage)) { return null; } else if (this.updatePreviousBookmark) { this.updatePreviousBookmark = false; } if (this.uid > 0 && !(this.previousBookmark && this.previousPage)) { // Prevent the history from getting stuck in the current state, // effectively preventing the user from going back/forward in // the history. // // This happens if the current position in the document didn't change // when the history was previously updated. The reasons for this are // either: // 1. The current zoom value is such that the document does not need to, // or cannot, be scrolled to display the destination. // 2. The previous destination is broken, and doesn't actally point to a // position within the document. // (This is either due to a bad PDF generator, or the user making a // mistake when entering a destination in the hash parameters.) return null; } if ((!this.current.dest && !onlyCheckPage) || beforeUnload) { if (this.previousBookmark === this.currentBookmark) { return null; } } else if (this.current.page || onlyCheckPage) { if (this.previousPage === this.currentPage) { return null; } } else { return null; } var params = {hash: this.currentBookmark, page: this.currentPage}; if (this.isViewerInPresentationMode) { params.hash = null; } return params; }, _stateObj: function pdfHistory_stateObj(params) { return {fingerprint: this.fingerprint, uid: this.uid, target: params}; }, _pushToHistory: function pdfHistory_pushToHistory(params, addPrevious, overwrite) { if (!this.initialized) { return; } if (!params.hash && params.page) { params.hash = ('page=' + params.page); } if (addPrevious && !overwrite) { var previousParams = this._getPreviousParams(); if (previousParams) { var replacePrevious = (!this.current.dest && this.current.hash !== this.previousHash); this._pushToHistory(previousParams, false, replacePrevious); } } this._pushOrReplaceState(this._stateObj(params), (overwrite || this.uid === 0)); this.currentUid = this.uid++; this.current = params; this.updatePreviousBookmark = true; }, _goTo: function pdfHistory_goTo(state) { if (!(this.initialized && this.historyUnlocked && this._isStateObjectDefined(state))) { return; } if (!this.reInitialized && state.uid < this.currentUid) { var previousParams = this._getPreviousParams(true); if (previousParams) { this._pushToHistory(this.current, false); this._pushToHistory(previousParams, false); this.currentUid = state.uid; window.history.back(); return; } } this.historyUnlocked = false; if (state.target.dest) { this.linkService.navigateTo(state.target.dest); } else { this.linkService.setHash(state.target.hash); } this.currentUid = state.uid; if (state.uid > this.uid) { this.uid = state.uid; } this.current = state.target; this.updatePreviousBookmark = true; var currentHash = window.location.hash.substring(1); if (this.previousHash !== currentHash) { this.allowHashChange = false; } this.previousHash = currentHash; this.historyUnlocked = true; }, back: function pdfHistoryBack() { this.go(-1); }, forward: function pdfHistoryForward() { this.go(1); }, go: function pdfHistoryGo(direction) { if (this.initialized && this.historyUnlocked) { var state = window.history.state; if (direction === -1 && state && state.uid > 0) { window.history.back(); } else if (direction === 1 && state && state.uid < (this.uid - 1)) { window.history.forward(); } } } }; exports.PDFHistory = PDFHistory; })); (function (root, factory) { { factory((root.pdfjsWebPDFPresentationMode = {})); } }(this, function (exports) { var DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS = 1500; // in ms var DELAY_BEFORE_HIDING_CONTROLS = 3000; // in ms var ACTIVE_SELECTOR = 'pdfPresentationMode'; var CONTROLS_SELECTOR = 'pdfPresentationModeControls'; /** * @typedef {Object} PDFPresentationModeOptions * @property {HTMLDivElement} container - The container for the viewer element. * @property {HTMLDivElement} viewer - (optional) The viewer element. * @property {PDFViewer} pdfViewer - The document viewer. * @property {Array} contextMenuItems - (optional) The menuitems that are added * to the context menu in Presentation Mode. */ /** * @class */ var PDFPresentationMode = (function PDFPresentationModeClosure() { /** * @constructs PDFPresentationMode * @param {PDFPresentationModeOptions} options */ function PDFPresentationMode(options) { this.container = options.container; this.viewer = options.viewer || options.container.firstElementChild; this.pdfViewer = options.pdfViewer; var contextMenuItems = options.contextMenuItems || null; this.active = false; this.args = null; this.contextMenuOpen = false; this.mouseScrollTimeStamp = 0; this.mouseScrollDelta = 0; if (contextMenuItems) { for (var i = 0, ii = contextMenuItems.length; i < ii; i++) { var item = contextMenuItems[i]; item.element.addEventListener('click', function (handler) { this.contextMenuOpen = false; handler(); }.bind(this, item.handler)); } } } PDFPresentationMode.prototype = { /** * Request the browser to enter fullscreen mode. * @returns {boolean} Indicating if the request was successful. */ request: function PDFPresentationMode_request() { if (this.switchInProgress || this.active || !this.viewer.hasChildNodes()) { return false; } this._addFullscreenChangeListeners(); this._setSwitchInProgress(); this._notifyStateChange(); if (this.container.requestFullscreen) { this.container.requestFullscreen(); } else if (this.container.mozRequestFullScreen) { this.container.mozRequestFullScreen(); } else if (this.container.webkitRequestFullscreen) { this.container.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); } else if (this.container.msRequestFullscreen) { this.container.msRequestFullscreen(); } else { return false; } this.args = { page: this.pdfViewer.currentPageNumber, previousScale: this.pdfViewer.currentScaleValue, }; return true; }, /** * Switches page when the user scrolls (using a scroll wheel or a touchpad) * with large enough motion, to prevent accidental page switches. * @param {number} delta - The delta value from the mouse event. */ mouseScroll: function PDFPresentationMode_mouseScroll(delta) { if (!this.active) { return; } var MOUSE_SCROLL_COOLDOWN_TIME = 50; var PAGE_SWITCH_THRESHOLD = 120; var PageSwitchDirection = { UP: -1, DOWN: 1 }; var currentTime = (new Date()).getTime(); var storedTime = this.mouseScrollTimeStamp; // If we've already switched page, avoid accidentally switching again. if (currentTime > storedTime && currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) { return; } // If the scroll direction changed, reset the accumulated scroll delta. if ((this.mouseScrollDelta > 0 && delta < 0) || (this.mouseScrollDelta < 0 && delta > 0)) { this._resetMouseScrollState(); } this.mouseScrollDelta += delta; if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) { var pageSwitchDirection = (this.mouseScrollDelta > 0) ? PageSwitchDirection.UP : PageSwitchDirection.DOWN; var page = this.pdfViewer.currentPageNumber; this._resetMouseScrollState(); // If we're at the first/last page, we don't need to do anything. if ((page === 1 && pageSwitchDirection === PageSwitchDirection.UP) || (page === this.pdfViewer.pagesCount && pageSwitchDirection === PageSwitchDirection.DOWN)) { return; } this.pdfViewer.currentPageNumber = (page + pageSwitchDirection); this.mouseScrollTimeStamp = currentTime; } }, get isFullscreen() { return !!(document.fullscreenElement || document.mozFullScreen || document.webkitIsFullScreen || document.msFullscreenElement); }, /** * @private */ _notifyStateChange: function PDFPresentationMode_notifyStateChange() { var event = document.createEvent('CustomEvent'); event.initCustomEvent('presentationmodechanged', true, true, { active: this.active, switchInProgress: !!this.switchInProgress }); window.dispatchEvent(event); }, /** * Used to initialize a timeout when requesting Presentation Mode, * i.e. when the browser is requested to enter fullscreen mode. * This timeout is used to prevent the current page from being scrolled * partially, or completely, out of view when entering Presentation Mode. * NOTE: This issue seems limited to certain zoom levels (e.g. page-width). * @private */ _setSwitchInProgress: function PDFPresentationMode_setSwitchInProgress() { if (this.switchInProgress) { clearTimeout(this.switchInProgress); } this.switchInProgress = setTimeout(function switchInProgressTimeout() { this._removeFullscreenChangeListeners(); delete this.switchInProgress; this._notifyStateChange(); }.bind(this), DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS); }, /** * @private */ _resetSwitchInProgress: function PDFPresentationMode_resetSwitchInProgress() { if (this.switchInProgress) { clearTimeout(this.switchInProgress); delete this.switchInProgress; } }, /** * @private */ _enter: function PDFPresentationMode_enter() { this.active = true; this._resetSwitchInProgress(); this._notifyStateChange(); this.container.classList.add(ACTIVE_SELECTOR); // Ensure that the correct page is scrolled into view when entering // Presentation Mode, by waiting until fullscreen mode in enabled. setTimeout(function enterPresentationModeTimeout() { this.pdfViewer.currentPageNumber = this.args.page; this.pdfViewer.currentScaleValue = 'page-fit'; }.bind(this), 0); this._addWindowListeners(); this._showControls(); this.contextMenuOpen = false; this.container.setAttribute('contextmenu', 'viewerContextMenu'); // Text selection is disabled in Presentation Mode, thus it's not possible // for the user to deselect text that is selected (e.g. with "Select all") // when entering Presentation Mode, hence we remove any active selection. window.getSelection().removeAllRanges(); }, /** * @private */ _exit: function PDFPresentationMode_exit() { var page = this.pdfViewer.currentPageNumber; this.container.classList.remove(ACTIVE_SELECTOR); // Ensure that the correct page is scrolled into view when exiting // Presentation Mode, by waiting until fullscreen mode is disabled. setTimeout(function exitPresentationModeTimeout() { this.active = false; this._removeFullscreenChangeListeners(); this._notifyStateChange(); this.pdfViewer.currentScaleValue = this.args.previousScale; this.pdfViewer.currentPageNumber = page; this.args = null; }.bind(this), 0); this._removeWindowListeners(); this._hideControls(); this._resetMouseScrollState(); this.container.removeAttribute('contextmenu'); this.contextMenuOpen = false; }, /** * @private */ _mouseDown: function PDFPresentationMode_mouseDown(evt) { if (this.contextMenuOpen) { this.contextMenuOpen = false; evt.preventDefault(); return; } if (evt.button === 0) { // Enable clicking of links in presentation mode. Please note: // Only links pointing to destinations in the current PDF document work. var isInternalLink = (evt.target.href && evt.target.classList.contains('internalLink')); if (!isInternalLink) { // Unless an internal link was clicked, advance one page. evt.preventDefault(); this.pdfViewer.currentPageNumber += (evt.shiftKey ? -1 : 1); } } }, /** * @private */ _contextMenu: function PDFPresentationMode_contextMenu() { this.contextMenuOpen = true; }, /** * @private */ _showControls: function PDFPresentationMode_showControls() { if (this.controlsTimeout) { clearTimeout(this.controlsTimeout); } else { this.container.classList.add(CONTROLS_SELECTOR); } this.controlsTimeout = setTimeout(function showControlsTimeout() { this.container.classList.remove(CONTROLS_SELECTOR); delete this.controlsTimeout; }.bind(this), DELAY_BEFORE_HIDING_CONTROLS); }, /** * @private */ _hideControls: function PDFPresentationMode_hideControls() { if (!this.controlsTimeout) { return; } clearTimeout(this.controlsTimeout); this.container.classList.remove(CONTROLS_SELECTOR); delete this.controlsTimeout; }, /** * Resets the properties used for tracking mouse scrolling events. * @private */ _resetMouseScrollState: function PDFPresentationMode_resetMouseScrollState() { this.mouseScrollTimeStamp = 0; this.mouseScrollDelta = 0; }, /** * @private */ _addWindowListeners: function PDFPresentationMode_addWindowListeners() { this.showControlsBind = this._showControls.bind(this); this.mouseDownBind = this._mouseDown.bind(this); this.resetMouseScrollStateBind = this._resetMouseScrollState.bind(this); this.contextMenuBind = this._contextMenu.bind(this); window.addEventListener('mousemove', this.showControlsBind); window.addEventListener('mousedown', this.mouseDownBind); window.addEventListener('keydown', this.resetMouseScrollStateBind); window.addEventListener('contextmenu', this.contextMenuBind); }, /** * @private */ _removeWindowListeners: function PDFPresentationMode_removeWindowListeners() { window.removeEventListener('mousemove', this.showControlsBind); window.removeEventListener('mousedown', this.mouseDownBind); window.removeEventListener('keydown', this.resetMouseScrollStateBind); window.removeEventListener('contextmenu', this.contextMenuBind); delete this.showControlsBind; delete this.mouseDownBind; delete this.resetMouseScrollStateBind; delete this.contextMenuBind; }, /** * @private */ _fullscreenChange: function PDFPresentationMode_fullscreenChange() { if (this.isFullscreen) { this._enter(); } else { this._exit(); } }, /** * @private */ _addFullscreenChangeListeners: function PDFPresentationMode_addFullscreenChangeListeners() { this.fullscreenChangeBind = this._fullscreenChange.bind(this); window.addEventListener('fullscreenchange', this.fullscreenChangeBind); window.addEventListener('mozfullscreenchange', this.fullscreenChangeBind); window.addEventListener('webkitfullscreenchange', this.fullscreenChangeBind); window.addEventListener('MSFullscreenChange', this.fullscreenChangeBind); }, /** * @private */ _removeFullscreenChangeListeners: function PDFPresentationMode_removeFullscreenChangeListeners() { window.removeEventListener('fullscreenchange', this.fullscreenChangeBind); window.removeEventListener('mozfullscreenchange', this.fullscreenChangeBind); window.removeEventListener('webkitfullscreenchange', this.fullscreenChangeBind); window.removeEventListener('MSFullscreenChange', this.fullscreenChangeBind); delete this.fullscreenChangeBind; } }; return PDFPresentationMode; })(); exports.PDFPresentationMode = PDFPresentationMode; })); (function (root, factory) { { factory((root.pdfjsWebPDFRenderingQueue = {})); } }(this, function (exports) { var CLEANUP_TIMEOUT = 30000; var RenderingStates = { INITIAL: 0, RUNNING: 1, PAUSED: 2, FINISHED: 3 }; /** * Controls rendering of the views for pages and thumbnails. * @class */ var PDFRenderingQueue = (function PDFRenderingQueueClosure() { /** * @constructs */ function PDFRenderingQueue() { this.pdfViewer = null; this.pdfThumbnailViewer = null; this.onIdle = null; this.highestPriorityPage = null; this.idleTimeout = null; this.printing = false; this.isThumbnailViewEnabled = false; } PDFRenderingQueue.prototype = /** @lends PDFRenderingQueue.prototype */ { /** * @param {PDFViewer} pdfViewer */ setViewer: function PDFRenderingQueue_setViewer(pdfViewer) { this.pdfViewer = pdfViewer; }, /** * @param {PDFThumbnailViewer} pdfThumbnailViewer */ setThumbnailViewer: function PDFRenderingQueue_setThumbnailViewer(pdfThumbnailViewer) { this.pdfThumbnailViewer = pdfThumbnailViewer; }, /** * @param {IRenderableView} view * @returns {boolean} */ isHighestPriority: function PDFRenderingQueue_isHighestPriority(view) { return this.highestPriorityPage === view.renderingId; }, renderHighestPriority: function PDFRenderingQueue_renderHighestPriority(currentlyVisiblePages) { if (this.idleTimeout) { clearTimeout(this.idleTimeout); this.idleTimeout = null; } // Pages have a higher priority than thumbnails, so check them first. if (this.pdfViewer.forceRendering(currentlyVisiblePages)) { return; } // No pages needed rendering so check thumbnails. if (this.pdfThumbnailViewer && this.isThumbnailViewEnabled) { if (this.pdfThumbnailViewer.forceRendering()) { return; } } if (this.printing) { // If printing is currently ongoing do not reschedule cleanup. return; } if (this.onIdle) { this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT); } }, getHighestPriority: function PDFRenderingQueue_getHighestPriority(visible, views, scrolledDown) { // The state has changed figure out which page has the highest priority to // render next (if any). // Priority: // 1 visible pages // 2 if last scrolled down page after the visible pages // 2 if last scrolled up page before the visible pages var visibleViews = visible.views; var numVisible = visibleViews.length; if (numVisible === 0) { return false; } for (var i = 0; i < numVisible; ++i) { var view = visibleViews[i].view; if (!this.isViewFinished(view)) { return view; } } // All the visible views have rendered, try to render next/previous pages. if (scrolledDown) { var nextPageIndex = visible.last.id; // ID's start at 1 so no need to add 1. if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex])) { return views[nextPageIndex]; } } else { var previousPageIndex = visible.first.id - 2; if (views[previousPageIndex] && !this.isViewFinished(views[previousPageIndex])) { return views[previousPageIndex]; } } // Everything that needs to be rendered has been. return null; }, /** * @param {IRenderableView} view * @returns {boolean} */ isViewFinished: function PDFRenderingQueue_isViewFinished(view) { return view.renderingState === RenderingStates.FINISHED; }, /** * Render a page or thumbnail view. This calls the appropriate function * based on the views state. If the view is already rendered it will return * false. * @param {IRenderableView} view */ renderView: function PDFRenderingQueue_renderView(view) { var state = view.renderingState; switch (state) { case RenderingStates.FINISHED: return false; case RenderingStates.PAUSED: this.highestPriorityPage = view.renderingId; view.resume(); break; case RenderingStates.RUNNING: this.highestPriorityPage = view.renderingId; break; case RenderingStates.INITIAL: this.highestPriorityPage = view.renderingId; var continueRendering = function () { this.renderHighestPriority(); }.bind(this); view.draw().then(continueRendering, continueRendering); break; } return true; }, }; return PDFRenderingQueue; })(); exports.RenderingStates = RenderingStates; exports.PDFRenderingQueue = PDFRenderingQueue; })); (function (root, factory) { { factory((root.pdfjsWebPreferences = {})); } }(this, function (exports) { var DEFAULT_PREFERENCES = { showPreviousViewOnLoad: true, defaultZoomValue: '', sidebarViewOnLoad: 0, enableHandToolOnLoad: false, enableWebGL: false, pdfBugEnabled: false, disableRange: false, disableStream: false, disableAutoFetch: false, disableFontFace: false, disableTextLayer: false, useOnlyCssZoom: false, externalLinkTarget: 0, }; /** * Preferences - Utility for storing persistent settings. * Used for settings that should be applied to all opened documents, * or every time the viewer is loaded. */ var Preferences = { prefs: Object.create(DEFAULT_PREFERENCES), isInitializedPromiseResolved: false, initializedPromise: null, /** * Initialize and fetch the current preference values from storage. * @return {Promise} A promise that is resolved when the preferences * have been initialized. */ initialize: function preferencesInitialize() { return this.initializedPromise = this._readFromStorage(DEFAULT_PREFERENCES).then(function(prefObj) { this.isInitializedPromiseResolved = true; if (prefObj) { this.prefs = prefObj; } }.bind(this)); }, /** * Stub function for writing preferences to storage. * NOTE: This should be overridden by a build-specific function defined below. * @param {Object} prefObj The preferences that should be written to storage. * @return {Promise} A promise that is resolved when the preference values * have been written. */ _writeToStorage: function preferences_writeToStorage(prefObj) { return Promise.resolve(); }, /** * Stub function for reading preferences from storage. * NOTE: This should be overridden by a build-specific function defined below. * @param {Object} prefObj The preferences that should be read from storage. * @return {Promise} A promise that is resolved with an {Object} containing * the preferences that have been read. */ _readFromStorage: function preferences_readFromStorage(prefObj) { return Promise.resolve(); }, /** * Reset the preferences to their default values and update storage. * @return {Promise} A promise that is resolved when the preference values * have been reset. */ reset: function preferencesReset() { return this.initializedPromise.then(function() { this.prefs = Object.create(DEFAULT_PREFERENCES); return this._writeToStorage(DEFAULT_PREFERENCES); }.bind(this)); }, /** * Replace the current preference values with the ones from storage. * @return {Promise} A promise that is resolved when the preference values * have been updated. */ reload: function preferencesReload() { return this.initializedPromise.then(function () { this._readFromStorage(DEFAULT_PREFERENCES).then(function(prefObj) { if (prefObj) { this.prefs = prefObj; } }.bind(this)); }.bind(this)); }, /** * Set the value of a preference. * @param {string} name The name of the preference that should be changed. * @param {boolean|number|string} value The new value of the preference. * @return {Promise} A promise that is resolved when the value has been set, * provided that the preference exists and the types match. */ set: function preferencesSet(name, value) { return this.initializedPromise.then(function () { if (DEFAULT_PREFERENCES[name] === undefined) { throw new Error('preferencesSet: \'' + name + '\' is undefined.'); } else if (value === undefined) { throw new Error('preferencesSet: no value is specified.'); } var valueType = typeof value; var defaultType = typeof DEFAULT_PREFERENCES[name]; if (valueType !== defaultType) { if (valueType === 'number' && defaultType === 'string') { value = value.toString(); } else { throw new Error('Preferences_set: \'' + value + '\' is a \"' + valueType + '\", expected \"' + defaultType + '\".'); } } else { if (valueType === 'number' && (value | 0) !== value) { throw new Error('Preferences_set: \'' + value + '\' must be an \"integer\".'); } } this.prefs[name] = value; return this._writeToStorage(this.prefs); }.bind(this)); }, /** * Get the value of a preference. * @param {string} name The name of the preference whose value is requested. * @return {Promise} A promise that is resolved with a {boolean|number|string} * containing the value of the preference. */ get: function preferencesGet(name) { return this.initializedPromise.then(function () { var defaultValue = DEFAULT_PREFERENCES[name]; if (defaultValue === undefined) { throw new Error('preferencesGet: \'' + name + '\' is undefined.'); } else { var prefValue = this.prefs[name]; if (prefValue !== undefined) { return prefValue; } } return defaultValue; }.bind(this)); } }; Preferences._writeToStorage = function (prefObj) { return new Promise(function (resolve) { localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj)); resolve(); }); }; Preferences._readFromStorage = function (prefObj) { return new Promise(function (resolve) { var readPrefs = JSON.parse(localStorage.getItem('pdfjs.preferences')); resolve(readPrefs); }); }; exports.Preferences = Preferences; })); (function (root, factory) { { factory((root.pdfjsWebViewHistory = {})); } }(this, function (exports) { var DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20; /** * View History - This is a utility for saving various view parameters for * recently opened files. * * The way that the view parameters are stored depends on how PDF.js is built, * for 'gulp ' the following cases exist: * - FIREFOX or MOZCENTRAL - uses sessionStorage. * - GENERIC or CHROME - uses localStorage, if it is available. */ var ViewHistory = (function ViewHistoryClosure() { function ViewHistory(fingerprint, cacheSize) { this.fingerprint = fingerprint; this.cacheSize = cacheSize || DEFAULT_VIEW_HISTORY_CACHE_SIZE; this.isInitializedPromiseResolved = false; this.initializedPromise = this._readFromStorage().then(function (databaseStr) { this.isInitializedPromiseResolved = true; var database = JSON.parse(databaseStr || '{}'); if (!('files' in database)) { database.files = []; } if (database.files.length >= this.cacheSize) { database.files.shift(); } var index; for (var i = 0, length = database.files.length; i < length; i++) { var branch = database.files[i]; if (branch.fingerprint === this.fingerprint) { index = i; break; } } if (typeof index !== 'number') { index = database.files.push({fingerprint: this.fingerprint}) - 1; } this.file = database.files[index]; this.database = database; }.bind(this)); } ViewHistory.prototype = { _writeToStorage: function ViewHistory_writeToStorage() { return new Promise(function (resolve) { var databaseStr = JSON.stringify(this.database); localStorage.setItem('database', databaseStr); resolve(); }.bind(this)); }, _readFromStorage: function ViewHistory_readFromStorage() { return new Promise(function (resolve) { resolve(localStorage.getItem('database')); }); }, set: function ViewHistory_set(name, val) { if (!this.isInitializedPromiseResolved) { return; } this.file[name] = val; return this._writeToStorage(); }, setMultiple: function ViewHistory_setMultiple(properties) { if (!this.isInitializedPromiseResolved) { return; } for (var name in properties) { this.file[name] = properties[name]; } return this._writeToStorage(); }, get: function ViewHistory_get(name, defaultValue) { if (!this.isInitializedPromiseResolved) { return defaultValue; } return this.file[name] || defaultValue; } }; return ViewHistory; })(); exports.ViewHistory = ViewHistory; })); (function (root, factory) { { factory((root.pdfjsWebDownloadManager = {}), root.pdfjsWebPDFJS); } }(this, function (exports, pdfjsLib) { function download(blobUrl, filename) { var a = document.createElement('a'); if (a.click) { // Use a.click() if available. Otherwise, Chrome might show // "Unsafe JavaScript attempt to initiate a navigation change // for frame with URL" and not open the PDF at all. // Supported by (not mentioned = untested): // - Firefox 6 - 19 (4- does not support a.click, 5 ignores a.click) // - Chrome 19 - 26 (18- does not support a.click) // - Opera 9 - 12.15 // - Internet Explorer 6 - 10 // - Safari 6 (5.1- does not support a.click) a.href = blobUrl; a.target = '_parent'; // Use a.download if available. This increases the likelihood that // the file is downloaded instead of opened by another PDF plugin. if ('download' in a) { a.download = filename; } // must be in the document for IE and recent Firefox versions. // (otherwise .click() is ignored) (document.body || document.documentElement).appendChild(a); a.click(); a.parentNode.removeChild(a); } else { if (window.top === window && blobUrl.split('#')[0] === window.location.href.split('#')[0]) { // If _parent == self, then opening an identical URL with different // location hash will only cause a navigation, not a download. var padCharacter = blobUrl.indexOf('?') === -1 ? '?' : '&'; blobUrl = blobUrl.replace(/#|$/, padCharacter + '$&'); } window.open(blobUrl, '_parent'); } } function DownloadManager() {} DownloadManager.prototype = { downloadUrl: function DownloadManager_downloadUrl(url, filename) { if (!pdfjsLib.isValidUrl(url, true)) { return; // restricted/invalid URL } download(url + '#pdfjs.action=download', filename); }, downloadData: function DownloadManager_downloadData(data, filename, contentType) { if (navigator.msSaveBlob) { // IE10 and above return navigator.msSaveBlob(new Blob([data], { type: contentType }), filename); } var blobUrl = pdfjsLib.createObjectURL(data, contentType, pdfjsLib.PDFJS.disableCreateObjectURL); download(blobUrl, filename); }, download: function DownloadManager_download(blob, url, filename) { if (!URL) { // URL.createObjectURL is not supported this.downloadUrl(url, filename); return; } if (navigator.msSaveBlob) { // IE10 / IE11 if (!navigator.msSaveBlob(blob, filename)) { this.downloadUrl(url, filename); } return; } var blobUrl = URL.createObjectURL(blob); download(blobUrl, filename); } }; exports.DownloadManager = DownloadManager; })); (function (root, factory) { { factory((root.pdfjsWebFirefoxCom = {}), root.pdfjsWebPreferences, root.pdfjsWebPDFJS); } }(this, function (exports, preferences, pdfjsLib) { })); (function (root, factory) { { factory((root.pdfjsWebPDFAttachmentViewer = {}), root.pdfjsWebPDFJS); } }(this, function (exports, pdfjsLib) { /** * @typedef {Object} PDFAttachmentViewerOptions * @property {HTMLDivElement} container - The viewer element. * @property {DownloadManager} downloadManager - The download manager. */ /** * @typedef {Object} PDFAttachmentViewerRenderParameters * @property {Array|null} attachments - An array of attachment objects. */ /** * @class */ var PDFAttachmentViewer = (function PDFAttachmentViewerClosure() { /** * @constructs PDFAttachmentViewer * @param {PDFAttachmentViewerOptions} options */ function PDFAttachmentViewer(options) { this.attachments = null; this.container = options.container; this.downloadManager = options.downloadManager; } PDFAttachmentViewer.prototype = { reset: function PDFAttachmentViewer_reset() { this.attachments = null; var container = this.container; while (container.firstChild) { container.removeChild(container.firstChild); } }, /** * @private */ _dispatchEvent: function PDFAttachmentViewer_dispatchEvent(attachmentsCount) { var event = document.createEvent('CustomEvent'); event.initCustomEvent('attachmentsloaded', true, true, { attachmentsCount: attachmentsCount }); this.container.dispatchEvent(event); }, /** * @private */ _bindLink: function PDFAttachmentViewer_bindLink(button, content, filename) { button.onclick = function downloadFile(e) { this.downloadManager.downloadData(content, filename, ''); return false; }.bind(this); }, /** * @param {PDFAttachmentViewerRenderParameters} params */ render: function PDFAttachmentViewer_render(params) { var attachments = (params && params.attachments) || null; var attachmentsCount = 0; if (this.attachments) { this.reset(); } this.attachments = attachments; if (!attachments) { this._dispatchEvent(attachmentsCount); return; } var names = Object.keys(attachments).sort(function(a, b) { return a.toLowerCase().localeCompare(b.toLowerCase()); }); attachmentsCount = names.length; for (var i = 0; i < attachmentsCount; i++) { var item = attachments[names[i]]; var filename = pdfjsLib.getFilenameFromUrl(item.filename); var div = document.createElement('div'); div.className = 'attachmentsItem'; var button = document.createElement('button'); this._bindLink(button, item.content, filename); button.textContent = pdfjsLib.removeNullCharacters(filename); div.appendChild(button); this.container.appendChild(div); } this._dispatchEvent(attachmentsCount); } }; return PDFAttachmentViewer; })(); exports.PDFAttachmentViewer = PDFAttachmentViewer; })); (function (root, factory) { { factory((root.pdfjsWebPDFOutlineViewer = {}), root.pdfjsWebPDFJS); } }(this, function (exports, pdfjsLib) { var DEFAULT_TITLE = '\u2013'; /** * @typedef {Object} PDFOutlineViewerOptions * @property {HTMLDivElement} container - The viewer element. * @property {IPDFLinkService} linkService - The navigation/linking service. */ /** * @typedef {Object} PDFOutlineViewerRenderParameters * @property {Array|null} outline - An array of outline objects. */ /** * @class */ var PDFOutlineViewer = (function PDFOutlineViewerClosure() { /** * @constructs PDFOutlineViewer * @param {PDFOutlineViewerOptions} options */ function PDFOutlineViewer(options) { this.outline = null; this.lastToggleIsShow = true; this.container = options.container; this.linkService = options.linkService; } PDFOutlineViewer.prototype = { reset: function PDFOutlineViewer_reset() { this.outline = null; this.lastToggleIsShow = true; var container = this.container; while (container.firstChild) { container.removeChild(container.firstChild); } }, /** * @private */ _dispatchEvent: function PDFOutlineViewer_dispatchEvent(outlineCount) { var event = document.createEvent('CustomEvent'); event.initCustomEvent('outlineloaded', true, true, { outlineCount: outlineCount }); this.container.dispatchEvent(event); }, /** * @private */ _bindLink: function PDFOutlineViewer_bindLink(element, item) { if (item.url) { pdfjsLib.addLinkAttributes(element, { url: item.url }); return; } var linkService = this.linkService; element.href = linkService.getDestinationHash(item.dest); element.onclick = function goToDestination(e) { linkService.navigateTo(item.dest); return false; }; }, /** * @private */ _setStyles: function PDFOutlineViewer_setStyles(element, item) { var styleStr = ''; if (item.bold) { styleStr += 'font-weight: bold;'; } if (item.italic) { styleStr += 'font-style: italic;'; } if (styleStr) { element.setAttribute('style', styleStr); } }, /** * Prepend a button before an outline item which allows the user to toggle * the visibility of all outline items at that level. * * @private */ _addToggleButton: function PDFOutlineViewer_addToggleButton(div) { var toggler = document.createElement('div'); toggler.className = 'outlineItemToggler'; toggler.onclick = function(event) { event.stopPropagation(); toggler.classList.toggle('outlineItemsHidden'); if (event.shiftKey) { var shouldShowAll = !toggler.classList.contains('outlineItemsHidden'); this._toggleOutlineItem(div, shouldShowAll); } }.bind(this); div.insertBefore(toggler, div.firstChild); }, /** * Toggle the visibility of the subtree of an outline item. * * @param {Element} root - the root of the outline (sub)tree. * @param {boolean} state - whether to show the outline (sub)tree. If false, * the outline subtree rooted at |root| will be collapsed. * * @private */ _toggleOutlineItem: function PDFOutlineViewer_toggleOutlineItem(root, show) { this.lastToggleIsShow = show; var togglers = root.querySelectorAll('.outlineItemToggler'); for (var i = 0, ii = togglers.length; i < ii; ++i) { togglers[i].classList[show ? 'remove' : 'add']('outlineItemsHidden'); } }, /** * Collapse or expand all subtrees of the outline. */ toggleOutlineTree: function PDFOutlineViewer_toggleOutlineTree() { if (!this.outline) { return; } this._toggleOutlineItem(this.container, !this.lastToggleIsShow); }, /** * @param {PDFOutlineViewerRenderParameters} params */ render: function PDFOutlineViewer_render(params) { var outline = (params && params.outline) || null; var outlineCount = 0; if (this.outline) { this.reset(); } this.outline = outline; if (!outline) { this._dispatchEvent(outlineCount); return; } var fragment = document.createDocumentFragment(); var queue = [{ parent: fragment, items: this.outline }]; var hasAnyNesting = false; while (queue.length > 0) { var levelData = queue.shift(); for (var i = 0, len = levelData.items.length; i < len; i++) { var item = levelData.items[i]; var div = document.createElement('div'); div.className = 'outlineItem'; var element = document.createElement('a'); this._bindLink(element, item); this._setStyles(element, item); element.textContent = pdfjsLib.removeNullCharacters(item.title) || DEFAULT_TITLE; div.appendChild(element); if (item.items.length > 0) { hasAnyNesting = true; this._addToggleButton(div); var itemsDiv = document.createElement('div'); itemsDiv.className = 'outlineItems'; div.appendChild(itemsDiv); queue.push({ parent: itemsDiv, items: item.items }); } levelData.parent.appendChild(div); outlineCount++; } } if (hasAnyNesting) { this.container.classList.add('outlineWithDeepNesting'); } this.container.appendChild(fragment); this._dispatchEvent(outlineCount); } }; return PDFOutlineViewer; })(); exports.PDFOutlineViewer = PDFOutlineViewer; })); (function (root, factory) { { factory((root.pdfjsWebPDFSidebar = {}), root.pdfjsWebPDFRenderingQueue); } }(this, function (exports, pdfRenderingQueue) { var RenderingStates = pdfRenderingQueue.RenderingStates; var SidebarView = { NONE: 0, THUMBS: 1, OUTLINE: 2, ATTACHMENTS: 3 }; /** * @typedef {Object} PDFSidebarOptions * @property {PDFViewer} - The document viewer. * @property {PDFThumbnailViewer} - The thumbnail viewer. * @property {PDFOutlineViewer} - The outline viewer. * @property {HTMLDivElement} mainContainer - The main container * (in which the viewer element is placed). * @property {HTMLDivElement} outerContainer - The outer container * (encasing both the viewer and sidebar elements). * @property {HTMLButtonElement} toggleButton - The button used for * opening/closing the sidebar. * @property {HTMLButtonElement} thumbnailButton - The button used to show * the thumbnail view. * @property {HTMLButtonElement} outlineButton - The button used to show * the outline view. * @property {HTMLButtonElement} attachmentsButton - The button used to show * the attachments view. * @property {HTMLDivElement} thumbnailView - The container in which * the thumbnails are placed. * @property {HTMLDivElement} outlineView - The container in which * the outline is placed. * @property {HTMLDivElement} attachmentsView - The container in which * the attachments are placed. */ /** * @class */ var PDFSidebar = (function PDFSidebarClosure() { /** * @constructs PDFSidebar * @param {PDFSidebarOptions} options */ function PDFSidebar(options) { this.isOpen = false; this.active = SidebarView.THUMBS; this.isInitialViewSet = false; /** * Callback used when the sidebar has been opened/closed, to ensure that * the viewers (PDFViewer/PDFThumbnailViewer) are updated correctly. */ this.onToggled = null; this.pdfViewer = options.pdfViewer; this.pdfThumbnailViewer = options.pdfThumbnailViewer; this.pdfOutlineViewer = options.pdfOutlineViewer; this.mainContainer = options.mainContainer; this.outerContainer = options.outerContainer; this.toggleButton = options.toggleButton; this.thumbnailButton = options.thumbnailButton; this.outlineButton = options.outlineButton; this.attachmentsButton = options.attachmentsButton; this.thumbnailView = options.thumbnailView; this.outlineView = options.outlineView; this.attachmentsView = options.attachmentsView; this._addEventListeners(); } PDFSidebar.prototype = { reset: function PDFSidebar_reset() { this.isInitialViewSet = false; this.close(); this.switchView(SidebarView.THUMBS); this.outlineButton.disabled = false; this.attachmentsButton.disabled = false; }, /** * @returns {number} One of the values in {SidebarView}. */ get visibleView() { return (this.isOpen ? this.active : SidebarView.NONE); }, get isThumbnailViewVisible() { return (this.isOpen && this.active === SidebarView.THUMBS); }, get isOutlineViewVisible() { return (this.isOpen && this.active === SidebarView.OUTLINE); }, get isAttachmentsViewVisible() { return (this.isOpen && this.active === SidebarView.ATTACHMENTS); }, /** * @param {number} view - The sidebar view that should become visible, * must be one of the values in {SidebarView}. */ setInitialView: function PDFSidebar_setInitialView(view) { if (this.isInitialViewSet) { return; } this.isInitialViewSet = true; if (this.isOpen && view === SidebarView.NONE) { // If the user has already manually opened the sidebar, // immediately closing it would be bad UX. return; } this.switchView(view, true); }, /** * @param {number} view - The sidebar view that should be switched to, * must be one of the values in {SidebarView}. * @param {boolean} forceOpen - Ensure that the sidebar is opened. * The default value is false. */ switchView: function PDFSidebar_switchView(view, forceOpen) { if (view === SidebarView.NONE) { this.close(); return; } if (forceOpen) { this.open(); } var shouldForceRendering = false; switch (view) { case SidebarView.THUMBS: this.thumbnailButton.classList.add('toggled'); this.outlineButton.classList.remove('toggled'); this.attachmentsButton.classList.remove('toggled'); this.thumbnailView.classList.remove('hidden'); this.outlineView.classList.add('hidden'); this.attachmentsView.classList.add('hidden'); if (this.isOpen && view !== this.active) { this._updateThumbnailViewer(); shouldForceRendering = true; } break; case SidebarView.OUTLINE: if (this.outlineButton.disabled) { return; } this.thumbnailButton.classList.remove('toggled'); this.outlineButton.classList.add('toggled'); this.attachmentsButton.classList.remove('toggled'); this.thumbnailView.classList.add('hidden'); this.outlineView.classList.remove('hidden'); this.attachmentsView.classList.add('hidden'); break; case SidebarView.ATTACHMENTS: if (this.attachmentsButton.disabled) { return; } this.thumbnailButton.classList.remove('toggled'); this.outlineButton.classList.remove('toggled'); this.attachmentsButton.classList.add('toggled'); this.thumbnailView.classList.add('hidden'); this.outlineView.classList.add('hidden'); this.attachmentsView.classList.remove('hidden'); break; default: console.error('PDFSidebar_switchView: "' + view + '" is an unsupported value.'); return; } // Update the active view *after* it has been validated above, // in order to prevent setting it to an invalid state. this.active = view | 0; if (shouldForceRendering) { this._forceRendering(); } }, open: function PDFSidebar_open() { if (this.isOpen) { return; } this.isOpen = true; this.toggleButton.classList.add('toggled'); this.outerContainer.classList.add('sidebarMoving'); this.outerContainer.classList.add('sidebarOpen'); if (this.active === SidebarView.THUMBS) { this._updateThumbnailViewer(); } this._forceRendering(); }, close: function PDFSidebar_close() { if (!this.isOpen) { return; } this.isOpen = false; this.toggleButton.classList.remove('toggled'); this.outerContainer.classList.add('sidebarMoving'); this.outerContainer.classList.remove('sidebarOpen'); this._forceRendering(); }, toggle: function PDFSidebar_toggle() { if (this.isOpen) { this.close(); } else { this.open(); } }, /** * @private */ _forceRendering: function PDFSidebar_forceRendering() { if (this.onToggled) { this.onToggled(); } else { // Fallback this.pdfViewer.forceRendering(); this.pdfThumbnailViewer.forceRendering(); } }, /** * @private */ _updateThumbnailViewer: function PDFSidebar_updateThumbnailViewer() { var pdfViewer = this.pdfViewer; var thumbnailViewer = this.pdfThumbnailViewer; // Use the rendered pages to set the corresponding thumbnail images. var pagesCount = pdfViewer.pagesCount; for (var pageIndex = 0; pageIndex < pagesCount; pageIndex++) { var pageView = pdfViewer.getPageView(pageIndex); if (pageView && pageView.renderingState === RenderingStates.FINISHED) { var thumbnailView = thumbnailViewer.getThumbnail(pageIndex); thumbnailView.setImage(pageView); } } thumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber); }, /** * @private */ _addEventListeners: function PDFSidebar_addEventListeners() { var self = this; self.mainContainer.addEventListener('transitionend', function(evt) { if (evt.target === /* mainContainer */ this) { self.outerContainer.classList.remove('sidebarMoving'); } }); // Buttons for switching views. self.thumbnailButton.addEventListener('click', function() { self.switchView(SidebarView.THUMBS); }); self.outlineButton.addEventListener('click', function() { self.switchView(SidebarView.OUTLINE); }); self.outlineButton.addEventListener('dblclick', function() { self.pdfOutlineViewer.toggleOutlineTree(); }); self.attachmentsButton.addEventListener('click', function() { self.switchView(SidebarView.ATTACHMENTS); }); // Disable/enable views. self.outlineView.addEventListener('outlineloaded', function(evt) { var outlineCount = evt.detail.outlineCount; self.outlineButton.disabled = !outlineCount; if (!outlineCount && self.active === SidebarView.OUTLINE) { self.switchView(SidebarView.THUMBS); } }); self.attachmentsView.addEventListener('attachmentsloaded', function(evt) { var attachmentsCount = evt.detail.attachmentsCount; self.attachmentsButton.disabled = !attachmentsCount; if (!attachmentsCount && self.active === SidebarView.ATTACHMENTS) { self.switchView(SidebarView.THUMBS); } }); // Update the thumbnailViewer, if visible, when exiting presentation mode. window.addEventListener('presentationmodechanged', function(evt) { if (!evt.detail.active && !evt.detail.switchInProgress && self.isThumbnailViewVisible) { self._updateThumbnailViewer(); } }); }, }; return PDFSidebar; })(); exports.SidebarView = SidebarView; exports.PDFSidebar = PDFSidebar; })); (function (root, factory) { { factory((root.pdfjsWebTextLayerBuilder = {}), root.pdfjsWebPDFJS); } }(this, function (exports, pdfjsLib) { /** * @typedef {Object} TextLayerBuilderOptions * @property {HTMLDivElement} textLayerDiv - The text layer container. * @property {number} pageIndex - The page index. * @property {PageViewport} viewport - The viewport of the text layer. * @property {PDFFindController} findController */ /** * TextLayerBuilder provides text-selection functionality for the PDF. * It does this by creating overlay divs over the PDF text. These divs * contain text that matches the PDF text they are overlaying. This object * also provides a way to highlight text that is being searched for. * @class */ var TextLayerBuilder = (function TextLayerBuilderClosure() { function TextLayerBuilder(options) { this.textLayerDiv = options.textLayerDiv; this.renderingDone = false; this.divContentDone = false; this.pageIdx = options.pageIndex; this.pageNumber = this.pageIdx + 1; this.matches = []; this.viewport = options.viewport; this.textDivs = []; this.findController = options.findController || null; this.textLayerRenderTask = null; this._bindMouse(); } TextLayerBuilder.prototype = { _finishRendering: function TextLayerBuilder_finishRendering() { this.renderingDone = true; var endOfContent = document.createElement('div'); endOfContent.className = 'endOfContent'; this.textLayerDiv.appendChild(endOfContent); var event = document.createEvent('CustomEvent'); event.initCustomEvent('textlayerrendered', true, true, { pageNumber: this.pageNumber }); this.textLayerDiv.dispatchEvent(event); }, /** * Renders the text layer. * @param {number} timeout (optional) if specified, the rendering waits * for specified amount of ms. */ render: function TextLayerBuilder_render(timeout) { if (!this.divContentDone || this.renderingDone) { return; } if (this.textLayerRenderTask) { this.textLayerRenderTask.cancel(); this.textLayerRenderTask = null; } this.textDivs = []; var textLayerFrag = document.createDocumentFragment(); this.textLayerRenderTask = pdfjsLib.renderTextLayer({ textContent: this.textContent, container: textLayerFrag, viewport: this.viewport, textDivs: this.textDivs, timeout: timeout }); this.textLayerRenderTask.promise.then(function () { this.textLayerDiv.appendChild(textLayerFrag); this._finishRendering(); this.updateMatches(); }.bind(this), function (reason) { // canceled or failed to render text layer -- skipping errors }); }, setTextContent: function TextLayerBuilder_setTextContent(textContent) { if (this.textLayerRenderTask) { this.textLayerRenderTask.cancel(); this.textLayerRenderTask = null; } this.textContent = textContent; this.divContentDone = true; }, convertMatches: function TextLayerBuilder_convertMatches(matches) { var i = 0; var iIndex = 0; var bidiTexts = this.textContent.items; var end = bidiTexts.length - 1; var queryLen = (this.findController === null ? 0 : this.findController.state.query.length); var ret = []; for (var m = 0, len = matches.length; m < len; m++) { // Calculate the start position. var matchIdx = matches[m]; // Loop over the divIdxs. while (i !== end && matchIdx >= (iIndex + bidiTexts[i].str.length)) { iIndex += bidiTexts[i].str.length; i++; } if (i === bidiTexts.length) { console.error('Could not find a matching mapping'); } var match = { begin: { divIdx: i, offset: matchIdx - iIndex } }; // Calculate the end position. matchIdx += queryLen; // Somewhat the same array as above, but use > instead of >= to get // the end position right. while (i !== end && matchIdx > (iIndex + bidiTexts[i].str.length)) { iIndex += bidiTexts[i].str.length; i++; } match.end = { divIdx: i, offset: matchIdx - iIndex }; ret.push(match); } return ret; }, renderMatches: function TextLayerBuilder_renderMatches(matches) { // Early exit if there is nothing to render. if (matches.length === 0) { return; } var bidiTexts = this.textContent.items; var textDivs = this.textDivs; var prevEnd = null; var pageIdx = this.pageIdx; var isSelectedPage = (this.findController === null ? false : (pageIdx === this.findController.selected.pageIdx)); var selectedMatchIdx = (this.findController === null ? -1 : this.findController.selected.matchIdx); var highlightAll = (this.findController === null ? false : this.findController.state.highlightAll); var infinity = { divIdx: -1, offset: undefined }; function beginText(begin, className) { var divIdx = begin.divIdx; textDivs[divIdx].textContent = ''; appendTextToDiv(divIdx, 0, begin.offset, className); } function appendTextToDiv(divIdx, fromOffset, toOffset, className) { var div = textDivs[divIdx]; var content = bidiTexts[divIdx].str.substring(fromOffset, toOffset); var node = document.createTextNode(content); if (className) { var span = document.createElement('span'); span.className = className; span.appendChild(node); div.appendChild(span); return; } div.appendChild(node); } var i0 = selectedMatchIdx, i1 = i0 + 1; if (highlightAll) { i0 = 0; i1 = matches.length; } else if (!isSelectedPage) { // Not highlighting all and this isn't the selected page, so do nothing. return; } for (var i = i0; i < i1; i++) { var match = matches[i]; var begin = match.begin; var end = match.end; var isSelected = (isSelectedPage && i === selectedMatchIdx); var highlightSuffix = (isSelected ? ' selected' : ''); if (this.findController) { this.findController.updateMatchPosition(pageIdx, i, textDivs, begin.divIdx, end.divIdx); } // Match inside new div. if (!prevEnd || begin.divIdx !== prevEnd.divIdx) { // If there was a previous div, then add the text at the end. if (prevEnd !== null) { appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); } // Clear the divs and set the content until the starting point. beginText(begin); } else { appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset); } if (begin.divIdx === end.divIdx) { appendTextToDiv(begin.divIdx, begin.offset, end.offset, 'highlight' + highlightSuffix); } else { appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, 'highlight begin' + highlightSuffix); for (var n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) { textDivs[n0].className = 'highlight middle' + highlightSuffix; } beginText(end, 'highlight end' + highlightSuffix); } prevEnd = end; } if (prevEnd) { appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); } }, updateMatches: function TextLayerBuilder_updateMatches() { // Only show matches when all rendering is done. if (!this.renderingDone) { return; } // Clear all matches. var matches = this.matches; var textDivs = this.textDivs; var bidiTexts = this.textContent.items; var clearedUntilDivIdx = -1; // Clear all current matches. for (var i = 0, len = matches.length; i < len; i++) { var match = matches[i]; var begin = Math.max(clearedUntilDivIdx, match.begin.divIdx); for (var n = begin, end = match.end.divIdx; n <= end; n++) { var div = textDivs[n]; div.textContent = bidiTexts[n].str; div.className = ''; } clearedUntilDivIdx = match.end.divIdx + 1; } if (this.findController === null || !this.findController.active) { return; } // Convert the matches on the page controller into the match format // used for the textLayer. this.matches = this.convertMatches(this.findController === null ? [] : (this.findController.pageMatches[this.pageIdx] || [])); this.renderMatches(this.matches); }, /** * Fixes text selection: adds additional div where mouse was clicked. * This reduces flickering of the content if mouse slowly dragged down/up. * @private */ _bindMouse: function TextLayerBuilder_bindMouse() { var div = this.textLayerDiv; div.addEventListener('mousedown', function (e) { var end = div.querySelector('.endOfContent'); if (!end) { return; } // On non-Firefox browsers, the selection will feel better if the height // of the endOfContent div will be adjusted to start at mouse click // location -- this will avoid flickering when selections moves up. // However it does not work when selection started on empty space. var adjustTop = e.target !== div; adjustTop = adjustTop && window.getComputedStyle(end). getPropertyValue('-moz-user-select') !== 'none'; if (adjustTop) { var divBounds = div.getBoundingClientRect(); var r = Math.max(0, (e.pageY - divBounds.top) / divBounds.height); end.style.top = (r * 100).toFixed(2) + '%'; } end.classList.add('active'); }); div.addEventListener('mouseup', function (e) { var end = div.querySelector('.endOfContent'); if (!end) { return; } end.style.top = ''; end.classList.remove('active'); }); }, }; return TextLayerBuilder; })(); /** * @constructor * @implements IPDFTextLayerFactory */ function DefaultTextLayerFactory() {} DefaultTextLayerFactory.prototype = { /** * @param {HTMLDivElement} textLayerDiv * @param {number} pageIndex * @param {PageViewport} viewport * @returns {TextLayerBuilder} */ createTextLayerBuilder: function (textLayerDiv, pageIndex, viewport) { return new TextLayerBuilder({ textLayerDiv: textLayerDiv, pageIndex: pageIndex, viewport: viewport }); } }; exports.TextLayerBuilder = TextLayerBuilder; exports.DefaultTextLayerFactory = DefaultTextLayerFactory; })); (function (root, factory) { { factory((root.pdfjsWebUIUtils = {}), root.pdfjsWebPDFJS); } }(this, function (exports, pdfjsLib) { var CSS_UNITS = 96.0 / 72.0; var DEFAULT_SCALE_VALUE = 'auto'; var DEFAULT_SCALE = 1.0; var UNKNOWN_SCALE = 0; var MAX_AUTO_SCALE = 1.25; var SCROLLBAR_PADDING = 40; var VERTICAL_PADDING = 5; var mozL10n = document.mozL10n || document.webL10n; var PDFJS = pdfjsLib.PDFJS; /** * Disables fullscreen support, and by extension Presentation Mode, * in browsers which support the fullscreen API. * @var {boolean} */ PDFJS.disableFullscreen = (PDFJS.disableFullscreen === undefined ? false : PDFJS.disableFullscreen); /** * Enables CSS only zooming. * @var {boolean} */ PDFJS.useOnlyCssZoom = (PDFJS.useOnlyCssZoom === undefined ? false : PDFJS.useOnlyCssZoom); /** * The maximum supported canvas size in total pixels e.g. width * height. * The default value is 4096 * 4096. Use -1 for no limit. * @var {number} */ PDFJS.maxCanvasPixels = (PDFJS.maxCanvasPixels === undefined ? 16777216 : PDFJS.maxCanvasPixels); /** * Disables saving of the last position of the viewed PDF. * @var {boolean} */ PDFJS.disableHistory = (PDFJS.disableHistory === undefined ? false : PDFJS.disableHistory); /** * Disables creation of the text layer that used for text selection and search. * @var {boolean} */ PDFJS.disableTextLayer = (PDFJS.disableTextLayer === undefined ? false : PDFJS.disableTextLayer); /** * Disables maintaining the current position in the document when zooming. */ PDFJS.ignoreCurrentPositionOnZoom = (PDFJS.ignoreCurrentPositionOnZoom === undefined ? false : PDFJS.ignoreCurrentPositionOnZoom); /** * Interface locale settings. * @var {string} */ PDFJS.locale = (PDFJS.locale === undefined ? navigator.language : PDFJS.locale); /** * Returns scale factor for the canvas. It makes sense for the HiDPI displays. * @return {Object} The object with horizontal (sx) and vertical (sy) scales. The scaled property is set to false if scaling is not required, true otherwise. */ function getOutputScale(ctx) { var devicePixelRatio = window.devicePixelRatio || 1; var backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1; var pixelRatio = devicePixelRatio / backingStoreRatio; return { sx: pixelRatio, sy: pixelRatio, scaled: pixelRatio !== 1 }; } /** * Scrolls specified element into view of its parent. * @param {Object} element - The element to be visible. * @param {Object} spot - An object with optional top and left properties, * specifying the offset from the top left edge. * @param {boolean} skipOverflowHiddenElements - Ignore elements that have * the CSS rule `overflow: hidden;` set. The default is false. */ function scrollIntoView(element, spot, skipOverflowHiddenElements) { // Assuming offsetParent is available (it's not available when viewer is in // hidden iframe or object). We have to scroll: if the offsetParent is not set // producing the error. See also animationStartedClosure. var parent = element.offsetParent; if (!parent) { console.error('offsetParent is not set -- cannot scroll'); return; } var checkOverflow = skipOverflowHiddenElements || false; var offsetY = element.offsetTop + element.clientTop; var offsetX = element.offsetLeft + element.clientLeft; while (parent.clientHeight === parent.scrollHeight || (checkOverflow && getComputedStyle(parent).overflow === 'hidden')) { if (parent.dataset._scaleY) { offsetY /= parent.dataset._scaleY; offsetX /= parent.dataset._scaleX; } offsetY += parent.offsetTop; offsetX += parent.offsetLeft; parent = parent.offsetParent; if (!parent) { return; // no need to scroll } } if (spot) { if (spot.top !== undefined) { offsetY += spot.top; } if (spot.left !== undefined) { offsetX += spot.left; parent.scrollLeft = offsetX; } } parent.scrollTop = offsetY; } /** * Helper function to start monitoring the scroll event and converting them into * PDF.js friendly one: with scroll debounce and scroll direction. */ function watchScroll(viewAreaElement, callback) { var debounceScroll = function debounceScroll(evt) { if (rAF) { return; } // schedule an invocation of scroll for next animation frame. rAF = window.requestAnimationFrame(function viewAreaElementScrolled() { rAF = null; var currentY = viewAreaElement.scrollTop; var lastY = state.lastY; if (currentY !== lastY) { state.down = currentY > lastY; } state.lastY = currentY; callback(state); }); }; var state = { down: true, lastY: viewAreaElement.scrollTop, _eventHandler: debounceScroll }; var rAF = null; viewAreaElement.addEventListener('scroll', debounceScroll, true); return state; } /** * Helper function to parse query string (e.g. ?param1=value&parm2=...). */ function parseQueryString(query) { var parts = query.split('&'); var params = {}; for (var i = 0, ii = parts.length; i < ii; ++i) { var param = parts[i].split('='); var key = param[0].toLowerCase(); var value = param.length > 1 ? param[1] : null; params[decodeURIComponent(key)] = decodeURIComponent(value); } return params; } /** * Use binary search to find the index of the first item in a given array which * passes a given condition. The items are expected to be sorted in the sense * that if the condition is true for one item in the array, then it is also true * for all following items. * * @returns {Number} Index of the first array element to pass the test, * or |items.length| if no such element exists. */ function binarySearchFirstItem(items, condition) { var minIndex = 0; var maxIndex = items.length - 1; if (items.length === 0 || !condition(items[maxIndex])) { return items.length; } if (condition(items[minIndex])) { return minIndex; } while (minIndex < maxIndex) { var currentIndex = (minIndex + maxIndex) >> 1; var currentItem = items[currentIndex]; if (condition(currentItem)) { maxIndex = currentIndex; } else { minIndex = currentIndex + 1; } } return minIndex; /* === maxIndex */ } /** * Approximates float number as a fraction using Farey sequence (max order * of 8). * @param {number} x - Positive float number. * @returns {Array} Estimated fraction: the first array item is a numerator, * the second one is a denominator. */ function approximateFraction(x) { // Fast paths for int numbers or their inversions. if (Math.floor(x) === x) { return [x, 1]; } var xinv = 1 / x; var limit = 8; if (xinv > limit) { return [1, limit]; } else if (Math.floor(xinv) === xinv) { return [1, xinv]; } var x_ = x > 1 ? xinv : x; // a/b and c/d are neighbours in Farey sequence. var a = 0, b = 1, c = 1, d = 1; // Limiting search to order 8. while (true) { // Generating next term in sequence (order of q). var p = a + c, q = b + d; if (q > limit) { break; } if (x_ <= p / q) { c = p; d = q; } else { a = p; b = q; } } // Select closest of the neighbours to x. if (x_ - a / b < c / d - x_) { return x_ === x ? [a, b] : [b, a]; } else { return x_ === x ? [c, d] : [d, c]; } } function roundToDivide(x, div) { var r = x % div; return r === 0 ? x : Math.round(x - r + div); } /** * Generic helper to find out what elements are visible within a scroll pane. */ function getVisibleElements(scrollEl, views, sortByVisibility) { var top = scrollEl.scrollTop, bottom = top + scrollEl.clientHeight; var left = scrollEl.scrollLeft, right = left + scrollEl.clientWidth; function isElementBottomBelowViewTop(view) { var element = view.div; var elementBottom = element.offsetTop + element.clientTop + element.clientHeight; return elementBottom > top; } var visible = [], view, element; var currentHeight, viewHeight, hiddenHeight, percentHeight; var currentWidth, viewWidth; var firstVisibleElementInd = (views.length === 0) ? 0 : binarySearchFirstItem(views, isElementBottomBelowViewTop); for (var i = firstVisibleElementInd, ii = views.length; i < ii; i++) { view = views[i]; element = view.div; currentHeight = element.offsetTop + element.clientTop; viewHeight = element.clientHeight; if (currentHeight > bottom) { break; } currentWidth = element.offsetLeft + element.clientLeft; viewWidth = element.clientWidth; if (currentWidth + viewWidth < left || currentWidth > right) { continue; } hiddenHeight = Math.max(0, top - currentHeight) + Math.max(0, currentHeight + viewHeight - bottom); percentHeight = ((viewHeight - hiddenHeight) * 100 / viewHeight) | 0; visible.push({ id: view.id, x: currentWidth, y: currentHeight, view: view, percent: percentHeight }); } var first = visible[0]; var last = visible[visible.length - 1]; if (sortByVisibility) { visible.sort(function(a, b) { var pc = a.percent - b.percent; if (Math.abs(pc) > 0.001) { return -pc; } return a.id - b.id; // ensure stability }); } return {first: first, last: last, views: visible}; } /** * Event handler to suppress context menu. */ function noContextMenuHandler(e) { e.preventDefault(); } /** * Returns the filename or guessed filename from the url (see issue 3455). * url {String} The original PDF location. * @return {String} Guessed PDF file name. */ function getPDFFileNameFromURL(url) { var reURI = /^(?:([^:]+:)?\/\/[^\/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/; // SCHEME HOST 1.PATH 2.QUERY 3.REF // Pattern to get last matching NAME.pdf var reFilename = /[^\/?#=]+\.pdf\b(?!.*\.pdf\b)/i; var splitURI = reURI.exec(url); var suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]); if (suggestedFilename) { suggestedFilename = suggestedFilename[0]; if (suggestedFilename.indexOf('%') !== -1) { // URL-encoded %2Fpath%2Fto%2Ffile.pdf should be file.pdf try { suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0]; } catch(e) { // Possible (extremely rare) errors: // URIError "Malformed URI", e.g. for "%AA.pdf" // TypeError "null has no properties", e.g. for "%2F.pdf" } } } return suggestedFilename || 'document.pdf'; } var ProgressBar = (function ProgressBarClosure() { function clamp(v, min, max) { return Math.min(Math.max(v, min), max); } function ProgressBar(id, opts) { this.visible = true; // Fetch the sub-elements for later. this.div = document.querySelector(id + ' .progress'); // Get the loading bar element, so it can be resized to fit the viewer. this.bar = this.div.parentNode; // Get options, with sensible defaults. this.height = opts.height || 100; this.width = opts.width || 100; this.units = opts.units || '%'; // Initialize heights. this.div.style.height = this.height + this.units; this.percent = 0; } ProgressBar.prototype = { updateBar: function ProgressBar_updateBar() { if (this._indeterminate) { this.div.classList.add('indeterminate'); this.div.style.width = this.width + this.units; return; } this.div.classList.remove('indeterminate'); var progressSize = this.width * this._percent / 100; this.div.style.width = progressSize + this.units; }, get percent() { return this._percent; }, set percent(val) { this._indeterminate = isNaN(val); this._percent = clamp(val, 0, 100); this.updateBar(); }, setWidth: function ProgressBar_setWidth(viewer) { if (viewer) { var container = viewer.parentNode; var scrollbarWidth = container.offsetWidth - viewer.offsetWidth; if (scrollbarWidth > 0) { this.bar.setAttribute('style', 'width: calc(100% - ' + scrollbarWidth + 'px);'); } } }, hide: function ProgressBar_hide() { if (!this.visible) { return; } this.visible = false; this.bar.classList.add('hidden'); document.body.classList.remove('loadingInProgress'); }, show: function ProgressBar_show() { if (this.visible) { return; } this.visible = true; document.body.classList.add('loadingInProgress'); this.bar.classList.remove('hidden'); } }; return ProgressBar; })(); exports.CSS_UNITS = CSS_UNITS; exports.DEFAULT_SCALE_VALUE = DEFAULT_SCALE_VALUE; exports.DEFAULT_SCALE = DEFAULT_SCALE; exports.UNKNOWN_SCALE = UNKNOWN_SCALE; exports.MAX_AUTO_SCALE = MAX_AUTO_SCALE; exports.SCROLLBAR_PADDING = SCROLLBAR_PADDING; exports.VERTICAL_PADDING = VERTICAL_PADDING; exports.mozL10n = mozL10n; exports.ProgressBar = ProgressBar; exports.getPDFFileNameFromURL = getPDFFileNameFromURL; exports.noContextMenuHandler = noContextMenuHandler; exports.parseQueryString = parseQueryString; exports.getVisibleElements = getVisibleElements; exports.roundToDivide = roundToDivide; exports.approximateFraction = approximateFraction; exports.getOutputScale = getOutputScale; exports.scrollIntoView = scrollIntoView; exports.watchScroll = watchScroll; exports.binarySearchFirstItem = binarySearchFirstItem; })); (function (root, factory) { { factory((root.pdfjsWebPasswordPrompt = {}), root.pdfjsWebUIUtils, root.pdfjsWebOverlayManager, root.pdfjsWebPDFJS); } }(this, function (exports, uiUtils, overlayManager, pdfjsLib) { var mozL10n = uiUtils.mozL10n; var OverlayManager = overlayManager.OverlayManager; var PasswordPrompt = { overlayName: null, updatePassword: null, reason: null, passwordField: null, passwordText: null, passwordSubmit: null, passwordCancel: null, initialize: function secondaryToolbarInitialize(options) { this.overlayName = options.overlayName; this.passwordField = options.passwordField; this.passwordText = options.passwordText; this.passwordSubmit = options.passwordSubmit; this.passwordCancel = options.passwordCancel; // Attach the event listeners. this.passwordSubmit.addEventListener('click', this.verifyPassword.bind(this)); this.passwordCancel.addEventListener('click', this.close.bind(this)); this.passwordField.addEventListener('keydown', function (e) { if (e.keyCode === 13) { // Enter key this.verifyPassword(); } }.bind(this)); OverlayManager.register(this.overlayName, this.close.bind(this), true); }, open: function passwordPromptOpen() { OverlayManager.open(this.overlayName).then(function () { this.passwordField.type = 'password'; this.passwordField.focus(); var promptString = mozL10n.get('password_label', null, 'Enter the password to open this PDF file.'); if (this.reason === pdfjsLib.PasswordResponses.INCORRECT_PASSWORD) { promptString = mozL10n.get('password_invalid', null, 'Invalid password. Please try again.'); } this.passwordText.textContent = promptString; }.bind(this)); }, close: function passwordPromptClose() { OverlayManager.close(this.overlayName).then(function () { this.passwordField.value = ''; this.passwordField.type = ''; }.bind(this)); }, verifyPassword: function passwordPromptVerifyPassword() { var password = this.passwordField.value; if (password && password.length > 0) { this.close(); return this.updatePassword(password); } } }; exports.PasswordPrompt = PasswordPrompt; })); (function (root, factory) { { factory((root.pdfjsWebPDFDocumentProperties = {}), root.pdfjsWebUIUtils, root.pdfjsWebOverlayManager); } }(this, function (exports, uiUtils, overlayManager) { var getPDFFileNameFromURL = uiUtils.getPDFFileNameFromURL; var mozL10n = uiUtils.mozL10n; var OverlayManager = overlayManager.OverlayManager; /** * @typedef {Object} PDFDocumentPropertiesOptions * @property {string} overlayName - Name/identifier for the overlay. * @property {Object} fields - Names and elements of the overlay's fields. * @property {HTMLButtonElement} closeButton - Button for closing the overlay. */ /** * @class */ var PDFDocumentProperties = (function PDFDocumentPropertiesClosure() { /** * @constructs PDFDocumentProperties * @param {PDFDocumentPropertiesOptions} options */ function PDFDocumentProperties(options) { this.fields = options.fields; this.overlayName = options.overlayName; this.rawFileSize = 0; this.url = null; this.pdfDocument = null; // Bind the event listener for the Close button. if (options.closeButton) { options.closeButton.addEventListener('click', this.close.bind(this)); } this.dataAvailablePromise = new Promise(function (resolve) { this.resolveDataAvailable = resolve; }.bind(this)); OverlayManager.register(this.overlayName, this.close.bind(this)); } PDFDocumentProperties.prototype = { /** * Open the document properties overlay. */ open: function PDFDocumentProperties_open() { Promise.all([OverlayManager.open(this.overlayName), this.dataAvailablePromise]).then(function () { this._getProperties(); }.bind(this)); }, /** * Close the document properties overlay. */ close: function PDFDocumentProperties_close() { OverlayManager.close(this.overlayName); }, /** * Set the file size of the PDF document. This method is used to * update the file size in the document properties overlay once it * is known so we do not have to wait until the entire file is loaded. * * @param {number} fileSize - The file size of the PDF document. */ setFileSize: function PDFDocumentProperties_setFileSize(fileSize) { if (fileSize > 0) { this.rawFileSize = fileSize; } }, /** * Set a reference to the PDF document and the URL in order * to populate the overlay fields with the document properties. * Note that the overlay will contain no information if this method * is not called. * * @param {Object} pdfDocument - A reference to the PDF document. * @param {string} url - The URL of the document. */ setDocumentAndUrl: function PDFDocumentProperties_setDocumentAndUrl(pdfDocument, url) { this.pdfDocument = pdfDocument; this.url = url; this.resolveDataAvailable(); }, /** * @private */ _getProperties: function PDFDocumentProperties_getProperties() { if (!OverlayManager.active) { // If the dialog was closed before dataAvailablePromise was resolved, // don't bother updating the properties. return; } // Get the file size (if it hasn't already been set). this.pdfDocument.getDownloadInfo().then(function(data) { if (data.length === this.rawFileSize) { return; } this.setFileSize(data.length); this._updateUI(this.fields['fileSize'], this._parseFileSize()); }.bind(this)); // Get the document properties. this.pdfDocument.getMetadata().then(function(data) { var content = { 'fileName': getPDFFileNameFromURL(this.url), 'fileSize': this._parseFileSize(), 'title': data.info.Title, 'author': data.info.Author, 'subject': data.info.Subject, 'keywords': data.info.Keywords, 'creationDate': this._parseDate(data.info.CreationDate), 'modificationDate': this._parseDate(data.info.ModDate), 'creator': data.info.Creator, 'producer': data.info.Producer, 'version': data.info.PDFFormatVersion, 'pageCount': this.pdfDocument.numPages }; // Show the properties in the dialog. for (var identifier in content) { this._updateUI(this.fields[identifier], content[identifier]); } }.bind(this)); }, /** * @private */ _updateUI: function PDFDocumentProperties_updateUI(field, content) { if (field && content !== undefined && content !== '') { field.textContent = content; } }, /** * @private */ _parseFileSize: function PDFDocumentProperties_parseFileSize() { var fileSize = this.rawFileSize, kb = fileSize / 1024; if (!kb) { return; } else if (kb < 1024) { return mozL10n.get('document_properties_kb', { size_kb: (+kb.toPrecision(3)).toLocaleString(), size_b: fileSize.toLocaleString() }, '{{size_kb}} KB ({{size_b}} bytes)'); } else { return mozL10n.get('document_properties_mb', { size_mb: (+(kb / 1024).toPrecision(3)).toLocaleString(), size_b: fileSize.toLocaleString() }, '{{size_mb}} MB ({{size_b}} bytes)'); } }, /** * @private */ _parseDate: function PDFDocumentProperties_parseDate(inputDate) { // This is implemented according to the PDF specification, but note that // Adobe Reader doesn't handle changing the date to universal time // and doesn't use the user's time zone (they're effectively ignoring // the HH' and mm' parts of the date string). var dateToParse = inputDate; if (dateToParse === undefined) { return ''; } // Remove the D: prefix if it is available. if (dateToParse.substring(0,2) === 'D:') { dateToParse = dateToParse.substring(2); } // Get all elements from the PDF date string. // JavaScript's Date object expects the month to be between // 0 and 11 instead of 1 and 12, so we're correcting for this. var year = parseInt(dateToParse.substring(0,4), 10); var month = parseInt(dateToParse.substring(4,6), 10) - 1; var day = parseInt(dateToParse.substring(6,8), 10); var hours = parseInt(dateToParse.substring(8,10), 10); var minutes = parseInt(dateToParse.substring(10,12), 10); var seconds = parseInt(dateToParse.substring(12,14), 10); var utRel = dateToParse.substring(14,15); var offsetHours = parseInt(dateToParse.substring(15,17), 10); var offsetMinutes = parseInt(dateToParse.substring(18,20), 10); // As per spec, utRel = 'Z' means equal to universal time. // The other cases ('-' and '+') have to be handled here. if (utRel === '-') { hours += offsetHours; minutes += offsetMinutes; } else if (utRel === '+') { hours -= offsetHours; minutes -= offsetMinutes; } // Return the new date format from the user's locale. var date = new Date(Date.UTC(year, month, day, hours, minutes, seconds)); var dateString = date.toLocaleDateString(); var timeString = date.toLocaleTimeString(); return mozL10n.get('document_properties_date_string', {date: dateString, time: timeString}, '{{date}}, {{time}}'); } }; return PDFDocumentProperties; })(); exports.PDFDocumentProperties = PDFDocumentProperties; })); (function (root, factory) { { factory((root.pdfjsWebPDFFindController = {}), root.pdfjsWebUIUtils, root.pdfjsWebFirefoxCom); } }(this, function (exports, uiUtils, firefoxCom) { var scrollIntoView = uiUtils.scrollIntoView; var FirefoxCom = firefoxCom.FirefoxCom; var FindStates = { FIND_FOUND: 0, FIND_NOTFOUND: 1, FIND_WRAPPED: 2, FIND_PENDING: 3 }; var FIND_SCROLL_OFFSET_TOP = -50; var FIND_SCROLL_OFFSET_LEFT = -400; var CHARACTERS_TO_NORMALIZE = { '\u2018': '\'', // Left single quotation mark '\u2019': '\'', // Right single quotation mark '\u201A': '\'', // Single low-9 quotation mark '\u201B': '\'', // Single high-reversed-9 quotation mark '\u201C': '"', // Left double quotation mark '\u201D': '"', // Right double quotation mark '\u201E': '"', // Double low-9 quotation mark '\u201F': '"', // Double high-reversed-9 quotation mark '\u00BC': '1/4', // Vulgar fraction one quarter '\u00BD': '1/2', // Vulgar fraction one half '\u00BE': '3/4', // Vulgar fraction three quarters }; /** * Provides "search" or "find" functionality for the PDF. * This object actually performs the search for a given string. */ var PDFFindController = (function PDFFindControllerClosure() { function PDFFindController(options) { this.pdfViewer = options.pdfViewer || null; this.integratedFind = options.integratedFind || false; this.findBar = options.findBar || null; this.reset(); // Compile the regular expression for text normalization once. var replace = Object.keys(CHARACTERS_TO_NORMALIZE).join(''); this.normalizationRegex = new RegExp('[' + replace + ']', 'g'); var events = [ 'find', 'findagain', 'findhighlightallchange', 'findcasesensitivitychange' ]; this.handleEvent = this.handleEvent.bind(this); for (var i = 0, len = events.length; i < len; i++) { window.addEventListener(events[i], this.handleEvent); } } PDFFindController.prototype = { setFindBar: function PDFFindController_setFindBar(findBar) { this.findBar = findBar; }, reset: function PDFFindController_reset() { this.startedTextExtraction = false; this.extractTextPromises = []; this.pendingFindMatches = Object.create(null); this.active = false; // If active, find results will be highlighted. this.pageContents = []; // Stores the text for each page. this.pageMatches = []; this.matchCount = 0; this.selected = { // Currently selected match. pageIdx: -1, matchIdx: -1 }; this.offset = { // Where the find algorithm currently is in the document. pageIdx: null, matchIdx: null }; this.pagesToSearch = null; this.resumePageIdx = null; this.state = null; this.dirtyMatch = false; this.findTimeout = null; this.firstPagePromise = new Promise(function (resolve) { this.resolveFirstPage = resolve; }.bind(this)); }, normalize: function PDFFindController_normalize(text) { return text.replace(this.normalizationRegex, function (ch) { return CHARACTERS_TO_NORMALIZE[ch]; }); }, calcFindMatch: function PDFFindController_calcFindMatch(pageIndex) { var pageContent = this.normalize(this.pageContents[pageIndex]); var query = this.normalize(this.state.query); var caseSensitive = this.state.caseSensitive; var queryLen = query.length; if (queryLen === 0) { // Do nothing: the matches should be wiped out already. return; } if (!caseSensitive) { pageContent = pageContent.toLowerCase(); query = query.toLowerCase(); } var matches = []; var matchIdx = -queryLen; while (true) { matchIdx = pageContent.indexOf(query, matchIdx + queryLen); if (matchIdx === -1) { break; } matches.push(matchIdx); } this.pageMatches[pageIndex] = matches; this.updatePage(pageIndex); if (this.resumePageIdx === pageIndex) { this.resumePageIdx = null; this.nextPageMatch(); } // Update the matches count if (matches.length > 0) { this.matchCount += matches.length; this.updateUIResultsCount(); } }, extractText: function PDFFindController_extractText() { if (this.startedTextExtraction) { return; } this.startedTextExtraction = true; this.pageContents = []; var extractTextPromisesResolves = []; var numPages = this.pdfViewer.pagesCount; for (var i = 0; i < numPages; i++) { this.extractTextPromises.push(new Promise(function (resolve) { extractTextPromisesResolves.push(resolve); })); } var self = this; function extractPageText(pageIndex) { self.pdfViewer.getPageTextContent(pageIndex).then( function textContentResolved(textContent) { var textItems = textContent.items; var str = []; for (var i = 0, len = textItems.length; i < len; i++) { str.push(textItems[i].str); } // Store the pageContent as a string. self.pageContents.push(str.join('')); extractTextPromisesResolves[pageIndex](pageIndex); if ((pageIndex + 1) < self.pdfViewer.pagesCount) { extractPageText(pageIndex + 1); } } ); } extractPageText(0); }, handleEvent: function PDFFindController_handleEvent(e) { if (this.state === null || e.type !== 'findagain') { this.dirtyMatch = true; } this.state = e.detail; this.updateUIState(FindStates.FIND_PENDING); this.firstPagePromise.then(function() { this.extractText(); clearTimeout(this.findTimeout); if (e.type === 'find') { // Only trigger the find action after 250ms of silence. this.findTimeout = setTimeout(this.nextMatch.bind(this), 250); } else { this.nextMatch(); } }.bind(this)); }, updatePage: function PDFFindController_updatePage(index) { if (this.selected.pageIdx === index) { // If the page is selected, scroll the page into view, which triggers // rendering the page, which adds the textLayer. Once the textLayer is // build, it will scroll onto the selected match. this.pdfViewer.scrollPageIntoView(index + 1); } var page = this.pdfViewer.getPageView(index); if (page.textLayer) { page.textLayer.updateMatches(); } }, nextMatch: function PDFFindController_nextMatch() { var previous = this.state.findPrevious; var currentPageIndex = this.pdfViewer.currentPageNumber - 1; var numPages = this.pdfViewer.pagesCount; this.active = true; if (this.dirtyMatch) { // Need to recalculate the matches, reset everything. this.dirtyMatch = false; this.selected.pageIdx = this.selected.matchIdx = -1; this.offset.pageIdx = currentPageIndex; this.offset.matchIdx = null; this.hadMatch = false; this.resumePageIdx = null; this.pageMatches = []; this.matchCount = 0; var self = this; for (var i = 0; i < numPages; i++) { // Wipe out any previous highlighted matches. this.updatePage(i); // As soon as the text is extracted start finding the matches. if (!(i in this.pendingFindMatches)) { this.pendingFindMatches[i] = true; this.extractTextPromises[i].then(function(pageIdx) { delete self.pendingFindMatches[pageIdx]; self.calcFindMatch(pageIdx); }); } } } // If there's no query there's no point in searching. if (this.state.query === '') { this.updateUIState(FindStates.FIND_FOUND); return; } // If we're waiting on a page, we return since we can't do anything else. if (this.resumePageIdx) { return; } var offset = this.offset; // Keep track of how many pages we should maximally iterate through. this.pagesToSearch = numPages; // If there's already a matchIdx that means we are iterating through a // page's matches. if (offset.matchIdx !== null) { var numPageMatches = this.pageMatches[offset.pageIdx].length; if ((!previous && offset.matchIdx + 1 < numPageMatches) || (previous && offset.matchIdx > 0)) { // The simple case; we just have advance the matchIdx to select // the next match on the page. this.hadMatch = true; offset.matchIdx = (previous ? offset.matchIdx - 1 : offset.matchIdx + 1); this.updateMatch(true); return; } // We went beyond the current page's matches, so we advance to // the next page. this.advanceOffsetPage(previous); } // Start searching through the page. this.nextPageMatch(); }, matchesReady: function PDFFindController_matchesReady(matches) { var offset = this.offset; var numMatches = matches.length; var previous = this.state.findPrevious; if (numMatches) { // There were matches for the page, so initialize the matchIdx. this.hadMatch = true; offset.matchIdx = (previous ? numMatches - 1 : 0); this.updateMatch(true); return true; } else { // No matches, so attempt to search the next page. this.advanceOffsetPage(previous); if (offset.wrapped) { offset.matchIdx = null; if (this.pagesToSearch < 0) { // No point in wrapping again, there were no matches. this.updateMatch(false); // while matches were not found, searching for a page // with matches should nevertheless halt. return true; } } // Matches were not found (and searching is not done). return false; } }, /** * The method is called back from the text layer when match presentation * is updated. * @param {number} pageIndex - page index. * @param {number} index - match index. * @param {Array} elements - text layer div elements array. * @param {number} beginIdx - start index of the div array for the match. * @param {number} endIdx - end index of the div array for the match. */ updateMatchPosition: function PDFFindController_updateMatchPosition( pageIndex, index, elements, beginIdx, endIdx) { if (this.selected.matchIdx === index && this.selected.pageIdx === pageIndex) { var spot = { top: FIND_SCROLL_OFFSET_TOP, left: FIND_SCROLL_OFFSET_LEFT }; scrollIntoView(elements[beginIdx], spot, /* skipOverflowHiddenElements = */ true); } }, nextPageMatch: function PDFFindController_nextPageMatch() { if (this.resumePageIdx !== null) { console.error('There can only be one pending page.'); } do { var pageIdx = this.offset.pageIdx; var matches = this.pageMatches[pageIdx]; if (!matches) { // The matches don't exist yet for processing by "matchesReady", // so set a resume point for when they do exist. this.resumePageIdx = pageIdx; break; } } while (!this.matchesReady(matches)); }, advanceOffsetPage: function PDFFindController_advanceOffsetPage(previous) { var offset = this.offset; var numPages = this.extractTextPromises.length; offset.pageIdx = (previous ? offset.pageIdx - 1 : offset.pageIdx + 1); offset.matchIdx = null; this.pagesToSearch--; if (offset.pageIdx >= numPages || offset.pageIdx < 0) { offset.pageIdx = (previous ? numPages - 1 : 0); offset.wrapped = true; } }, updateMatch: function PDFFindController_updateMatch(found) { var state = FindStates.FIND_NOTFOUND; var wrapped = this.offset.wrapped; this.offset.wrapped = false; if (found) { var previousPage = this.selected.pageIdx; this.selected.pageIdx = this.offset.pageIdx; this.selected.matchIdx = this.offset.matchIdx; state = (wrapped ? FindStates.FIND_WRAPPED : FindStates.FIND_FOUND); // Update the currently selected page to wipe out any selected matches. if (previousPage !== -1 && previousPage !== this.selected.pageIdx) { this.updatePage(previousPage); } } this.updateUIState(state, this.state.findPrevious); if (this.selected.pageIdx !== -1) { this.updatePage(this.selected.pageIdx); } }, updateUIResultsCount: function PDFFindController_updateUIResultsCount() { if (this.findBar === null) { throw new Error('PDFFindController is not initialized with a ' + 'PDFFindBar instance.'); } this.findBar.updateResultsCount(this.matchCount); }, updateUIState: function PDFFindController_updateUIState(state, previous) { if (this.integratedFind) { FirefoxCom.request('updateFindControlState', { result: state, findPrevious: previous }); return; } if (this.findBar === null) { throw new Error('PDFFindController is not initialized with a ' + 'PDFFindBar instance.'); } this.findBar.updateUIState(state, previous, this.matchCount); } }; return PDFFindController; })(); exports.FindStates = FindStates; exports.PDFFindController = PDFFindController; })); (function (root, factory) { { factory((root.pdfjsWebPDFLinkService = {}), root.pdfjsWebUIUtils); } }(this, function (exports, uiUtils) { var parseQueryString = uiUtils.parseQueryString; /** * Performs navigation functions inside PDF, such as opening specified page, * or destination. * @class * @implements {IPDFLinkService} */ var PDFLinkService = (function () { /** * @constructs PDFLinkService */ function PDFLinkService() { this.baseUrl = null; this.pdfDocument = null; this.pdfViewer = null; this.pdfHistory = null; this._pagesRefCache = null; } PDFLinkService.prototype = { setDocument: function PDFLinkService_setDocument(pdfDocument, baseUrl) { this.baseUrl = baseUrl; this.pdfDocument = pdfDocument; this._pagesRefCache = Object.create(null); }, setViewer: function PDFLinkService_setViewer(pdfViewer) { this.pdfViewer = pdfViewer; }, setHistory: function PDFLinkService_setHistory(pdfHistory) { this.pdfHistory = pdfHistory; }, /** * @returns {number} */ get pagesCount() { return this.pdfDocument.numPages; }, /** * @returns {number} */ get page() { return this.pdfViewer.currentPageNumber; }, /** * @param {number} value */ set page(value) { this.pdfViewer.currentPageNumber = value; }, /** * @param dest - The PDF destination object. */ navigateTo: function PDFLinkService_navigateTo(dest) { var destString = ''; var self = this; var goToDestination = function(destRef) { // dest array looks like that: var pageNumber = destRef instanceof Object ? self._pagesRefCache[destRef.num + ' ' + destRef.gen + ' R'] : (destRef + 1); if (pageNumber) { if (pageNumber > self.pagesCount) { pageNumber = self.pagesCount; } self.pdfViewer.scrollPageIntoView(pageNumber, dest); if (self.pdfHistory) { // Update the browsing history. self.pdfHistory.push({ dest: dest, hash: destString, page: pageNumber }); } } else { self.pdfDocument.getPageIndex(destRef).then(function (pageIndex) { var pageNum = pageIndex + 1; var cacheKey = destRef.num + ' ' + destRef.gen + ' R'; self._pagesRefCache[cacheKey] = pageNum; goToDestination(destRef); }); } }; var destinationPromise; if (typeof dest === 'string') { destString = dest; destinationPromise = this.pdfDocument.getDestination(dest); } else { destinationPromise = Promise.resolve(dest); } destinationPromise.then(function(destination) { dest = destination; if (!(destination instanceof Array)) { return; // invalid destination } goToDestination(destination[0]); }); }, /** * @param dest - The PDF destination object. * @returns {string} The hyperlink to the PDF object. */ getDestinationHash: function PDFLinkService_getDestinationHash(dest) { if (typeof dest === 'string') { return this.getAnchorUrl('#' + escape(dest)); } if (dest instanceof Array) { var destRef = dest[0]; // see navigateTo method for dest format var pageNumber = destRef instanceof Object ? this._pagesRefCache[destRef.num + ' ' + destRef.gen + ' R'] : (destRef + 1); if (pageNumber) { var pdfOpenParams = this.getAnchorUrl('#page=' + pageNumber); var destKind = dest[1]; if (typeof destKind === 'object' && 'name' in destKind && destKind.name === 'XYZ') { var scale = (dest[4] || this.pdfViewer.currentScaleValue); var scaleNumber = parseFloat(scale); if (scaleNumber) { scale = scaleNumber * 100; } pdfOpenParams += '&zoom=' + scale; if (dest[2] || dest[3]) { pdfOpenParams += ',' + (dest[2] || 0) + ',' + (dest[3] || 0); } } return pdfOpenParams; } } return this.getAnchorUrl(''); }, /** * Prefix the full url on anchor links to make sure that links are resolved * relative to the current URL instead of the one defined in . * @param {String} anchor The anchor hash, including the #. * @returns {string} The hyperlink to the PDF object. */ getAnchorUrl: function PDFLinkService_getAnchorUrl(anchor) { return (this.baseUrl || '') + anchor; }, /** * @param {string} hash */ setHash: function PDFLinkService_setHash(hash) { if (hash.indexOf('=') >= 0) { var params = parseQueryString(hash); // borrowing syntax from "Parameters for Opening PDF Files" if ('nameddest' in params) { if (this.pdfHistory) { this.pdfHistory.updateNextHashParam(params.nameddest); } this.navigateTo(params.nameddest); return; } var pageNumber, dest; if ('page' in params) { pageNumber = (params.page | 0) || 1; } if ('zoom' in params) { // Build the destination array. var zoomArgs = params.zoom.split(','); // scale,left,top var zoomArg = zoomArgs[0]; var zoomArgNumber = parseFloat(zoomArg); if (zoomArg.indexOf('Fit') === -1) { // If the zoomArg is a number, it has to get divided by 100. If it's // a string, it should stay as it is. dest = [null, { name: 'XYZ' }, zoomArgs.length > 1 ? (zoomArgs[1] | 0) : null, zoomArgs.length > 2 ? (zoomArgs[2] | 0) : null, (zoomArgNumber ? zoomArgNumber / 100 : zoomArg)]; } else { if (zoomArg === 'Fit' || zoomArg === 'FitB') { dest = [null, { name: zoomArg }]; } else if ((zoomArg === 'FitH' || zoomArg === 'FitBH') || (zoomArg === 'FitV' || zoomArg === 'FitBV')) { dest = [null, { name: zoomArg }, zoomArgs.length > 1 ? (zoomArgs[1] | 0) : null]; } else if (zoomArg === 'FitR') { if (zoomArgs.length !== 5) { console.error('PDFLinkService_setHash: ' + 'Not enough parameters for \'FitR\'.'); } else { dest = [null, { name: zoomArg }, (zoomArgs[1] | 0), (zoomArgs[2] | 0), (zoomArgs[3] | 0), (zoomArgs[4] | 0)]; } } else { console.error('PDFLinkService_setHash: \'' + zoomArg + '\' is not a valid zoom value.'); } } } if (dest) { this.pdfViewer.scrollPageIntoView(pageNumber || this.page, dest); } else if (pageNumber) { this.page = pageNumber; // simple page } if ('pagemode' in params) { var event = document.createEvent('CustomEvent'); event.initCustomEvent('pagemode', true, true, { mode: params.pagemode, }); this.pdfViewer.container.dispatchEvent(event); } } else if (/^\d+$/.test(hash)) { // page number this.page = hash; } else { // named destination if (this.pdfHistory) { this.pdfHistory.updateNextHashParam(unescape(hash)); } this.navigateTo(unescape(hash)); } }, /** * @param {string} action */ executeNamedAction: function PDFLinkService_executeNamedAction(action) { // See PDF reference, table 8.45 - Named action switch (action) { case 'GoBack': if (this.pdfHistory) { this.pdfHistory.back(); } break; case 'GoForward': if (this.pdfHistory) { this.pdfHistory.forward(); } break; case 'NextPage': this.page++; break; case 'PrevPage': this.page--; break; case 'LastPage': this.page = this.pagesCount; break; case 'FirstPage': this.page = 1; break; default: break; // No action according to spec } var event = document.createEvent('CustomEvent'); event.initCustomEvent('namedaction', true, true, { action: action }); this.pdfViewer.container.dispatchEvent(event); }, /** * @param {number} pageNum - page number. * @param {Object} pageRef - reference to the page. */ cachePageRef: function PDFLinkService_cachePageRef(pageNum, pageRef) { var refStr = pageRef.num + ' ' + pageRef.gen + ' R'; this._pagesRefCache[refStr] = pageNum; } }; return PDFLinkService; })(); var SimpleLinkService = (function SimpleLinkServiceClosure() { function SimpleLinkService() {} SimpleLinkService.prototype = { /** * @returns {number} */ get page() { return 0; }, /** * @param {number} value */ set page(value) {}, /** * @param dest - The PDF destination object. */ navigateTo: function (dest) {}, /** * @param dest - The PDF destination object. * @returns {string} The hyperlink to the PDF object. */ getDestinationHash: function (dest) { return '#'; }, /** * @param hash - The PDF parameters/hash. * @returns {string} The hyperlink to the PDF object. */ getAnchorUrl: function (hash) { return '#'; }, /** * @param {string} hash */ setHash: function (hash) {}, /** * @param {string} action */ executeNamedAction: function (action) {}, /** * @param {number} pageNum - page number. * @param {Object} pageRef - reference to the page. */ cachePageRef: function (pageNum, pageRef) {} }; return SimpleLinkService; })(); exports.PDFLinkService = PDFLinkService; exports.SimpleLinkService = SimpleLinkService; })); (function (root, factory) { { factory((root.pdfjsWebPDFPageView = {}), root.pdfjsWebUIUtils, root.pdfjsWebPDFRenderingQueue, root.pdfjsWebPDFJS); } }(this, function (exports, uiUtils, pdfRenderingQueue, pdfjsLib) { var CSS_UNITS = uiUtils.CSS_UNITS; var DEFAULT_SCALE = uiUtils.DEFAULT_SCALE; var getOutputScale = uiUtils.getOutputScale; var approximateFraction = uiUtils.approximateFraction; var roundToDivide = uiUtils.roundToDivide; var RenderingStates = pdfRenderingQueue.RenderingStates; var TEXT_LAYER_RENDER_DELAY = 200; // ms /** * @typedef {Object} PDFPageViewOptions * @property {HTMLDivElement} container - The viewer element. * @property {number} id - The page unique ID (normally its number). * @property {number} scale - The page scale display. * @property {PageViewport} defaultViewport - The page viewport. * @property {PDFRenderingQueue} renderingQueue - The rendering queue object. * @property {IPDFTextLayerFactory} textLayerFactory * @property {IPDFAnnotationLayerFactory} annotationLayerFactory */ /** * @class * @implements {IRenderableView} */ var PDFPageView = (function PDFPageViewClosure() { /** * @constructs PDFPageView * @param {PDFPageViewOptions} options */ function PDFPageView(options) { var container = options.container; var id = options.id; var scale = options.scale; var defaultViewport = options.defaultViewport; var renderingQueue = options.renderingQueue; var textLayerFactory = options.textLayerFactory; var annotationLayerFactory = options.annotationLayerFactory; this.id = id; this.renderingId = 'page' + id; this.rotation = 0; this.scale = scale || DEFAULT_SCALE; this.viewport = defaultViewport; this.pdfPageRotate = defaultViewport.rotation; this.hasRestrictedScaling = false; this.renderingQueue = renderingQueue; this.textLayerFactory = textLayerFactory; this.annotationLayerFactory = annotationLayerFactory; this.renderingState = RenderingStates.INITIAL; this.resume = null; this.onBeforeDraw = null; this.onAfterDraw = null; this.textLayer = null; this.zoomLayer = null; this.annotationLayer = null; var div = document.createElement('div'); div.id = 'pageContainer' + this.id; div.className = 'page'; div.style.width = Math.floor(this.viewport.width) + 'px'; div.style.height = Math.floor(this.viewport.height) + 'px'; div.setAttribute('data-page-number', this.id); this.div = div; container.appendChild(div); } PDFPageView.prototype = { setPdfPage: function PDFPageView_setPdfPage(pdfPage) { this.pdfPage = pdfPage; this.pdfPageRotate = pdfPage.rotate; var totalRotation = (this.rotation + this.pdfPageRotate) % 360; this.viewport = pdfPage.getViewport(this.scale * CSS_UNITS, totalRotation); this.stats = pdfPage.stats; this.reset(); }, destroy: function PDFPageView_destroy() { this.zoomLayer = null; this.reset(); if (this.pdfPage) { this.pdfPage.cleanup(); } }, reset: function PDFPageView_reset(keepZoomLayer, keepAnnotations) { if (this.renderTask) { this.renderTask.cancel(); } this.resume = null; this.renderingState = RenderingStates.INITIAL; var div = this.div; div.style.width = Math.floor(this.viewport.width) + 'px'; div.style.height = Math.floor(this.viewport.height) + 'px'; var childNodes = div.childNodes; var currentZoomLayerNode = (keepZoomLayer && this.zoomLayer) || null; var currentAnnotationNode = (keepAnnotations && this.annotationLayer && this.annotationLayer.div) || null; for (var i = childNodes.length - 1; i >= 0; i--) { var node = childNodes[i]; if (currentZoomLayerNode === node || currentAnnotationNode === node) { continue; } div.removeChild(node); } div.removeAttribute('data-loaded'); if (currentAnnotationNode) { // Hide annotationLayer until all elements are resized // so they are not displayed on the already-resized page this.annotationLayer.hide(); } else { this.annotationLayer = null; } if (this.canvas && !currentZoomLayerNode) { // Zeroing the width and height causes Firefox to release graphics // resources immediately, which can greatly reduce memory consumption. this.canvas.width = 0; this.canvas.height = 0; delete this.canvas; } this.loadingIconDiv = document.createElement('div'); this.loadingIconDiv.className = 'loadingIcon'; div.appendChild(this.loadingIconDiv); }, update: function PDFPageView_update(scale, rotation) { this.scale = scale || this.scale; if (typeof rotation !== 'undefined') { this.rotation = rotation; } var totalRotation = (this.rotation + this.pdfPageRotate) % 360; this.viewport = this.viewport.clone({ scale: this.scale * CSS_UNITS, rotation: totalRotation }); var isScalingRestricted = false; if (this.canvas && pdfjsLib.PDFJS.maxCanvasPixels > 0) { var outputScale = this.outputScale; var pixelsInViewport = this.viewport.width * this.viewport.height; if (((Math.floor(this.viewport.width) * outputScale.sx) | 0) * ((Math.floor(this.viewport.height) * outputScale.sy) | 0) > pdfjsLib.PDFJS.maxCanvasPixels) { isScalingRestricted = true; } } if (this.canvas) { if (pdfjsLib.PDFJS.useOnlyCssZoom || (this.hasRestrictedScaling && isScalingRestricted)) { this.cssTransform(this.canvas, true); var event = document.createEvent('CustomEvent'); event.initCustomEvent('pagerendered', true, true, { pageNumber: this.id, cssTransform: true, }); this.div.dispatchEvent(event); return; } if (!this.zoomLayer) { this.zoomLayer = this.canvas.parentNode; this.zoomLayer.style.position = 'absolute'; } } if (this.zoomLayer) { this.cssTransform(this.zoomLayer.firstChild); } this.reset(/* keepZoomLayer = */ true, /* keepAnnotations = */ true); }, /** * Called when moved in the parent's container. */ updatePosition: function PDFPageView_updatePosition() { if (this.textLayer) { this.textLayer.render(TEXT_LAYER_RENDER_DELAY); } }, cssTransform: function PDFPageView_transform(canvas, redrawAnnotations) { var CustomStyle = pdfjsLib.CustomStyle; // Scale canvas, canvas wrapper, and page container. var width = this.viewport.width; var height = this.viewport.height; var div = this.div; canvas.style.width = canvas.parentNode.style.width = div.style.width = Math.floor(width) + 'px'; canvas.style.height = canvas.parentNode.style.height = div.style.height = Math.floor(height) + 'px'; // The canvas may have been originally rotated, rotate relative to that. var relativeRotation = this.viewport.rotation - canvas._viewport.rotation; var absRotation = Math.abs(relativeRotation); var scaleX = 1, scaleY = 1; if (absRotation === 90 || absRotation === 270) { // Scale x and y because of the rotation. scaleX = height / width; scaleY = width / height; } var cssTransform = 'rotate(' + relativeRotation + 'deg) ' + 'scale(' + scaleX + ',' + scaleY + ')'; CustomStyle.setProp('transform', canvas, cssTransform); if (this.textLayer) { // Rotating the text layer is more complicated since the divs inside the // the text layer are rotated. // TODO: This could probably be simplified by drawing the text layer in // one orientation then rotating overall. var textLayerViewport = this.textLayer.viewport; var textRelativeRotation = this.viewport.rotation - textLayerViewport.rotation; var textAbsRotation = Math.abs(textRelativeRotation); var scale = width / textLayerViewport.width; if (textAbsRotation === 90 || textAbsRotation === 270) { scale = width / textLayerViewport.height; } var textLayerDiv = this.textLayer.textLayerDiv; var transX, transY; switch (textAbsRotation) { case 0: transX = transY = 0; break; case 90: transX = 0; transY = '-' + textLayerDiv.style.height; break; case 180: transX = '-' + textLayerDiv.style.width; transY = '-' + textLayerDiv.style.height; break; case 270: transX = '-' + textLayerDiv.style.width; transY = 0; break; default: console.error('Bad rotation value.'); break; } CustomStyle.setProp('transform', textLayerDiv, 'rotate(' + textAbsRotation + 'deg) ' + 'scale(' + scale + ', ' + scale + ') ' + 'translate(' + transX + ', ' + transY + ')'); CustomStyle.setProp('transformOrigin', textLayerDiv, '0% 0%'); } if (redrawAnnotations && this.annotationLayer) { this.annotationLayer.render(this.viewport, 'display'); } }, get width() { return this.viewport.width; }, get height() { return this.viewport.height; }, getPagePoint: function PDFPageView_getPagePoint(x, y) { return this.viewport.convertToPdfPoint(x, y); }, draw: function PDFPageView_draw() { if (this.renderingState !== RenderingStates.INITIAL) { console.error('Must be in new state before drawing'); } this.renderingState = RenderingStates.RUNNING; var pdfPage = this.pdfPage; var viewport = this.viewport; var div = this.div; // Wrap the canvas so if it has a css transform for highdpi the overflow // will be hidden in FF. var canvasWrapper = document.createElement('div'); canvasWrapper.style.width = div.style.width; canvasWrapper.style.height = div.style.height; canvasWrapper.classList.add('canvasWrapper'); var canvas = document.createElement('canvas'); canvas.id = 'page' + this.id; // Keep the canvas hidden until the first draw callback, or until drawing // is complete when `!this.renderingQueue`, to prevent black flickering. canvas.setAttribute('hidden', 'hidden'); var isCanvasHidden = true; canvasWrapper.appendChild(canvas); if (this.annotationLayer && this.annotationLayer.div) { // annotationLayer needs to stay on top div.insertBefore(canvasWrapper, this.annotationLayer.div); } else { div.appendChild(canvasWrapper); } this.canvas = canvas; canvas.mozOpaque = true; var ctx = canvas.getContext('2d', {alpha: false}); var outputScale = getOutputScale(ctx); this.outputScale = outputScale; if (pdfjsLib.PDFJS.useOnlyCssZoom) { var actualSizeViewport = viewport.clone({scale: CSS_UNITS}); // Use a scale that will make the canvas be the original intended size // of the page. outputScale.sx *= actualSizeViewport.width / viewport.width; outputScale.sy *= actualSizeViewport.height / viewport.height; outputScale.scaled = true; } if (pdfjsLib.PDFJS.maxCanvasPixels > 0) { var pixelsInViewport = viewport.width * viewport.height; var maxScale = Math.sqrt(pdfjsLib.PDFJS.maxCanvasPixels / pixelsInViewport); if (outputScale.sx > maxScale || outputScale.sy > maxScale) { outputScale.sx = maxScale; outputScale.sy = maxScale; outputScale.scaled = true; this.hasRestrictedScaling = true; } else { this.hasRestrictedScaling = false; } } var sfx = approximateFraction(outputScale.sx); var sfy = approximateFraction(outputScale.sy); canvas.width = roundToDivide(viewport.width * outputScale.sx, sfx[0]); canvas.height = roundToDivide(viewport.height * outputScale.sy, sfy[0]); canvas.style.width = roundToDivide(viewport.width, sfx[1]) + 'px'; canvas.style.height = roundToDivide(viewport.height, sfy[1]) + 'px'; // Add the viewport so it's known what it was originally drawn with. canvas._viewport = viewport; var textLayerDiv = null; var textLayer = null; if (this.textLayerFactory) { textLayerDiv = document.createElement('div'); textLayerDiv.className = 'textLayer'; textLayerDiv.style.width = canvasWrapper.style.width; textLayerDiv.style.height = canvasWrapper.style.height; if (this.annotationLayer && this.annotationLayer.div) { // annotationLayer needs to stay on top div.insertBefore(textLayerDiv, this.annotationLayer.div); } else { div.appendChild(textLayerDiv); } textLayer = this.textLayerFactory.createTextLayerBuilder(textLayerDiv, this.id - 1, this.viewport); } this.textLayer = textLayer; var resolveRenderPromise, rejectRenderPromise; var promise = new Promise(function (resolve, reject) { resolveRenderPromise = resolve; rejectRenderPromise = reject; }); // Rendering area var self = this; function pageViewDrawCallback(error) { // The renderTask may have been replaced by a new one, so only remove // the reference to the renderTask if it matches the one that is // triggering this callback. if (renderTask === self.renderTask) { self.renderTask = null; } if (error === 'cancelled') { rejectRenderPromise(error); return; } self.renderingState = RenderingStates.FINISHED; if (isCanvasHidden) { self.canvas.removeAttribute('hidden'); isCanvasHidden = false; } if (self.loadingIconDiv) { div.removeChild(self.loadingIconDiv); delete self.loadingIconDiv; } if (self.zoomLayer) { // Zeroing the width and height causes Firefox to release graphics // resources immediately, which can greatly reduce memory consumption. var zoomLayerCanvas = self.zoomLayer.firstChild; zoomLayerCanvas.width = 0; zoomLayerCanvas.height = 0; div.removeChild(self.zoomLayer); self.zoomLayer = null; } self.error = error; self.stats = pdfPage.stats; if (self.onAfterDraw) { self.onAfterDraw(); } var event = document.createEvent('CustomEvent'); event.initCustomEvent('pagerendered', true, true, { pageNumber: self.id, cssTransform: false, }); div.dispatchEvent(event); if (!error) { resolveRenderPromise(undefined); } else { rejectRenderPromise(error); } } var renderContinueCallback = null; if (this.renderingQueue) { renderContinueCallback = function renderContinueCallback(cont) { if (!self.renderingQueue.isHighestPriority(self)) { self.renderingState = RenderingStates.PAUSED; self.resume = function resumeCallback() { self.renderingState = RenderingStates.RUNNING; cont(); }; return; } if (isCanvasHidden) { self.canvas.removeAttribute('hidden'); isCanvasHidden = false; } cont(); }; } var transform = !outputScale.scaled ? null : [outputScale.sx, 0, 0, outputScale.sy, 0, 0]; var renderContext = { canvasContext: ctx, transform: transform, viewport: this.viewport, // intent: 'default', // === 'display' }; var renderTask = this.renderTask = this.pdfPage.render(renderContext); renderTask.onContinue = renderContinueCallback; this.renderTask.promise.then( function pdfPageRenderCallback() { pageViewDrawCallback(null); if (textLayer) { self.pdfPage.getTextContent({ normalizeWhitespace: true }).then( function textContentResolved(textContent) { textLayer.setTextContent(textContent); textLayer.render(TEXT_LAYER_RENDER_DELAY); } ); } }, function pdfPageRenderError(error) { pageViewDrawCallback(error); } ); if (this.annotationLayerFactory) { if (!this.annotationLayer) { this.annotationLayer = this.annotationLayerFactory. createAnnotationLayerBuilder(div, this.pdfPage); } this.annotationLayer.render(this.viewport, 'display'); } div.setAttribute('data-loaded', true); if (self.onBeforeDraw) { self.onBeforeDraw(); } return promise; }, beforePrint: function PDFPageView_beforePrint() { var CustomStyle = pdfjsLib.CustomStyle; var pdfPage = this.pdfPage; var viewport = pdfPage.getViewport(1); // Use the same hack we use for high dpi displays for printing to get // better output until bug 811002 is fixed in FF. var PRINT_OUTPUT_SCALE = 2; var canvas = document.createElement('canvas'); // The logical size of the canvas. canvas.width = Math.floor(viewport.width) * PRINT_OUTPUT_SCALE; canvas.height = Math.floor(viewport.height) * PRINT_OUTPUT_SCALE; // The rendered size of the canvas, relative to the size of canvasWrapper. canvas.style.width = (PRINT_OUTPUT_SCALE * 100) + '%'; var cssScale = 'scale(' + (1 / PRINT_OUTPUT_SCALE) + ', ' + (1 / PRINT_OUTPUT_SCALE) + ')'; CustomStyle.setProp('transform' , canvas, cssScale); CustomStyle.setProp('transformOrigin' , canvas, '0% 0%'); var printContainer = document.getElementById('printContainer'); var canvasWrapper = document.createElement('div'); canvasWrapper.appendChild(canvas); printContainer.appendChild(canvasWrapper); canvas.mozPrintCallback = function(obj) { var ctx = obj.context; ctx.save(); ctx.fillStyle = 'rgb(255, 255, 255)'; ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.restore(); // Used by the mozCurrentTransform polyfill in src/display/canvas.js. ctx._transformMatrix = [PRINT_OUTPUT_SCALE, 0, 0, PRINT_OUTPUT_SCALE, 0, 0]; ctx.scale(PRINT_OUTPUT_SCALE, PRINT_OUTPUT_SCALE); var renderContext = { canvasContext: ctx, viewport: viewport, intent: 'print' }; pdfPage.render(renderContext).promise.then(function() { // Tell the printEngine that rendering this canvas/page has finished. obj.done(); }, function(error) { console.error(error); // Tell the printEngine that rendering this canvas/page has failed. // This will make the print proces stop. if ('abort' in obj) { obj.abort(); } else { obj.done(); } }); }; }, }; return PDFPageView; })(); exports.PDFPageView = PDFPageView; })); (function (root, factory) { { factory((root.pdfjsWebPDFThumbnailView = {}), root.pdfjsWebUIUtils, root.pdfjsWebPDFRenderingQueue); } }(this, function (exports, uiUtils, pdfRenderingQueue) { var mozL10n = uiUtils.mozL10n; var getOutputScale = uiUtils.getOutputScale; var RenderingStates = pdfRenderingQueue.RenderingStates; var THUMBNAIL_WIDTH = 98; // px var THUMBNAIL_CANVAS_BORDER_WIDTH = 1; // px /** * @typedef {Object} PDFThumbnailViewOptions * @property {HTMLDivElement} container - The viewer element. * @property {number} id - The thumbnail's unique ID (normally its number). * @property {PageViewport} defaultViewport - The page viewport. * @property {IPDFLinkService} linkService - The navigation/linking service. * @property {PDFRenderingQueue} renderingQueue - The rendering queue object. * @property {boolean} disableCanvasToImageConversion - (optional) Don't convert * the canvas thumbnails to images. This prevents `toDataURL` calls, * but increases the overall memory usage. The default value is false. */ /** * @class * @implements {IRenderableView} */ var PDFThumbnailView = (function PDFThumbnailViewClosure() { function getTempCanvas(width, height) { var tempCanvas = PDFThumbnailView.tempImageCache; if (!tempCanvas) { tempCanvas = document.createElement('canvas'); PDFThumbnailView.tempImageCache = tempCanvas; } tempCanvas.width = width; tempCanvas.height = height; // Since this is a temporary canvas, we need to fill the canvas with a white // background ourselves. `_getPageDrawContext` uses CSS rules for this. tempCanvas.mozOpaque = true; var ctx = tempCanvas.getContext('2d', {alpha: false}); ctx.save(); ctx.fillStyle = 'rgb(255, 255, 255)'; ctx.fillRect(0, 0, width, height); ctx.restore(); return tempCanvas; } /** * @constructs PDFThumbnailView * @param {PDFThumbnailViewOptions} options */ function PDFThumbnailView(options) { var container = options.container; var id = options.id; var defaultViewport = options.defaultViewport; var linkService = options.linkService; var renderingQueue = options.renderingQueue; var disableCanvasToImageConversion = options.disableCanvasToImageConversion || false; this.id = id; this.renderingId = 'thumbnail' + id; this.pdfPage = null; this.rotation = 0; this.viewport = defaultViewport; this.pdfPageRotate = defaultViewport.rotation; this.linkService = linkService; this.renderingQueue = renderingQueue; this.resume = null; this.renderingState = RenderingStates.INITIAL; this.disableCanvasToImageConversion = disableCanvasToImageConversion; this.pageWidth = this.viewport.width; this.pageHeight = this.viewport.height; this.pageRatio = this.pageWidth / this.pageHeight; this.canvasWidth = THUMBNAIL_WIDTH; this.canvasHeight = (this.canvasWidth / this.pageRatio) | 0; this.scale = this.canvasWidth / this.pageWidth; var anchor = document.createElement('a'); anchor.href = linkService.getAnchorUrl('#page=' + id); anchor.title = mozL10n.get('thumb_page_title', {page: id}, 'Page {{page}}'); anchor.onclick = function stopNavigation() { linkService.page = id; return false; }; var div = document.createElement('div'); div.id = 'thumbnailContainer' + id; div.className = 'thumbnail'; this.div = div; if (id === 1) { // Highlight the thumbnail of the first page when no page number is // specified (or exists in cache) when the document is loaded. div.classList.add('selected'); } var ring = document.createElement('div'); ring.className = 'thumbnailSelectionRing'; var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH; ring.style.width = this.canvasWidth + borderAdjustment + 'px'; ring.style.height = this.canvasHeight + borderAdjustment + 'px'; this.ring = ring; div.appendChild(ring); anchor.appendChild(div); container.appendChild(anchor); } PDFThumbnailView.prototype = { setPdfPage: function PDFThumbnailView_setPdfPage(pdfPage) { this.pdfPage = pdfPage; this.pdfPageRotate = pdfPage.rotate; var totalRotation = (this.rotation + this.pdfPageRotate) % 360; this.viewport = pdfPage.getViewport(1, totalRotation); this.reset(); }, reset: function PDFThumbnailView_reset() { if (this.renderTask) { this.renderTask.cancel(); } this.resume = null; this.renderingState = RenderingStates.INITIAL; this.pageWidth = this.viewport.width; this.pageHeight = this.viewport.height; this.pageRatio = this.pageWidth / this.pageHeight; this.canvasHeight = (this.canvasWidth / this.pageRatio) | 0; this.scale = (this.canvasWidth / this.pageWidth); this.div.removeAttribute('data-loaded'); var ring = this.ring; var childNodes = ring.childNodes; for (var i = childNodes.length - 1; i >= 0; i--) { ring.removeChild(childNodes[i]); } var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH; ring.style.width = this.canvasWidth + borderAdjustment + 'px'; ring.style.height = this.canvasHeight + borderAdjustment + 'px'; if (this.canvas) { // Zeroing the width and height causes Firefox to release graphics // resources immediately, which can greatly reduce memory consumption. this.canvas.width = 0; this.canvas.height = 0; delete this.canvas; } if (this.image) { this.image.removeAttribute('src'); delete this.image; } }, update: function PDFThumbnailView_update(rotation) { if (typeof rotation !== 'undefined') { this.rotation = rotation; } var totalRotation = (this.rotation + this.pdfPageRotate) % 360; this.viewport = this.viewport.clone({ scale: 1, rotation: totalRotation }); this.reset(); }, /** * @private */ _getPageDrawContext: function PDFThumbnailView_getPageDrawContext(noCtxScale) { var canvas = document.createElement('canvas'); // Keep the no-thumbnail outline visible, i.e. `data-loaded === false`, // until rendering/image conversion is complete, to avoid display issues. this.canvas = canvas; canvas.mozOpaque = true; var ctx = canvas.getContext('2d', {alpha: false}); var outputScale = getOutputScale(ctx); canvas.width = (this.canvasWidth * outputScale.sx) | 0; canvas.height = (this.canvasHeight * outputScale.sy) | 0; canvas.style.width = this.canvasWidth + 'px'; canvas.style.height = this.canvasHeight + 'px'; if (!noCtxScale && outputScale.scaled) { ctx.scale(outputScale.sx, outputScale.sy); } return ctx; }, /** * @private */ _convertCanvasToImage: function PDFThumbnailView_convertCanvasToImage() { if (!this.canvas) { return; } if (this.renderingState !== RenderingStates.FINISHED) { return; } var id = this.renderingId; var className = 'thumbnailImage'; var ariaLabel = mozL10n.get('thumb_page_canvas', { page: this.id }, 'Thumbnail of Page {{page}}'); if (this.disableCanvasToImageConversion) { this.canvas.id = id; this.canvas.className = className; this.canvas.setAttribute('aria-label', ariaLabel); this.div.setAttribute('data-loaded', true); this.ring.appendChild(this.canvas); return; } var image = document.createElement('img'); image.id = id; image.className = className; image.setAttribute('aria-label', ariaLabel); image.style.width = this.canvasWidth + 'px'; image.style.height = this.canvasHeight + 'px'; image.src = this.canvas.toDataURL(); this.image = image; this.div.setAttribute('data-loaded', true); this.ring.appendChild(image); // Zeroing the width and height causes Firefox to release graphics // resources immediately, which can greatly reduce memory consumption. this.canvas.width = 0; this.canvas.height = 0; delete this.canvas; }, draw: function PDFThumbnailView_draw() { if (this.renderingState !== RenderingStates.INITIAL) { console.error('Must be in new state before drawing'); return Promise.resolve(undefined); } this.renderingState = RenderingStates.RUNNING; var resolveRenderPromise, rejectRenderPromise; var promise = new Promise(function (resolve, reject) { resolveRenderPromise = resolve; rejectRenderPromise = reject; }); var self = this; function thumbnailDrawCallback(error) { // The renderTask may have been replaced by a new one, so only remove // the reference to the renderTask if it matches the one that is // triggering this callback. if (renderTask === self.renderTask) { self.renderTask = null; } if (error === 'cancelled') { rejectRenderPromise(error); return; } self.renderingState = RenderingStates.FINISHED; self._convertCanvasToImage(); if (!error) { resolveRenderPromise(undefined); } else { rejectRenderPromise(error); } } var ctx = this._getPageDrawContext(); var drawViewport = this.viewport.clone({ scale: this.scale }); var renderContinueCallback = function renderContinueCallback(cont) { if (!self.renderingQueue.isHighestPriority(self)) { self.renderingState = RenderingStates.PAUSED; self.resume = function resumeCallback() { self.renderingState = RenderingStates.RUNNING; cont(); }; return; } cont(); }; var renderContext = { canvasContext: ctx, viewport: drawViewport }; var renderTask = this.renderTask = this.pdfPage.render(renderContext); renderTask.onContinue = renderContinueCallback; renderTask.promise.then( function pdfPageRenderCallback() { thumbnailDrawCallback(null); }, function pdfPageRenderError(error) { thumbnailDrawCallback(error); } ); return promise; }, setImage: function PDFThumbnailView_setImage(pageView) { if (this.renderingState !== RenderingStates.INITIAL) { return; } var img = pageView.canvas; if (!img) { return; } if (!this.pdfPage) { this.setPdfPage(pageView.pdfPage); } this.renderingState = RenderingStates.FINISHED; var ctx = this._getPageDrawContext(true); var canvas = ctx.canvas; if (img.width <= 2 * canvas.width) { ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height); this._convertCanvasToImage(); return; } // drawImage does an awful job of rescaling the image, doing it gradually. var MAX_NUM_SCALING_STEPS = 3; var reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS; var reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS; var reducedImage = getTempCanvas(reducedWidth, reducedHeight); var reducedImageCtx = reducedImage.getContext('2d'); while (reducedWidth > img.width || reducedHeight > img.height) { reducedWidth >>= 1; reducedHeight >>= 1; } reducedImageCtx.drawImage(img, 0, 0, img.width, img.height, 0, 0, reducedWidth, reducedHeight); while (reducedWidth > 2 * canvas.width) { reducedImageCtx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, reducedWidth >> 1, reducedHeight >> 1); reducedWidth >>= 1; reducedHeight >>= 1; } ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, canvas.width, canvas.height); this._convertCanvasToImage(); } }; return PDFThumbnailView; })(); PDFThumbnailView.tempImageCache = null; exports.PDFThumbnailView = PDFThumbnailView; })); (function (root, factory) { { factory((root.pdfjsWebSecondaryToolbar = {}), root.pdfjsWebUIUtils); } }(this, function (exports, uiUtils) { var SCROLLBAR_PADDING = uiUtils.SCROLLBAR_PADDING; var app; // Avoiding circular reference, see _setApp function below. var PDFViewerApplication = null; // = app.PDFViewerApplication; var SecondaryToolbar = { opened: false, previousContainerHeight: null, newContainerHeight: null, initialize: function secondaryToolbarInitialize(options) { this.toolbar = options.toolbar; this.buttonContainer = this.toolbar.firstElementChild; // Define the toolbar buttons. this.toggleButton = options.toggleButton; this.presentationModeButton = options.presentationModeButton; this.openFile = options.openFile; this.print = options.print; this.download = options.download; this.viewBookmark = options.viewBookmark; this.firstPage = options.firstPage; this.lastPage = options.lastPage; this.pageRotateCw = options.pageRotateCw; this.pageRotateCcw = options.pageRotateCcw; this.documentPropertiesButton = options.documentPropertiesButton; // Attach the event listeners. var elements = [ // Button to toggle the visibility of the secondary toolbar: { element: this.toggleButton, handler: this.toggle }, // All items within the secondary toolbar // (except for toggleHandTool, hand_tool.js is responsible for it): { element: this.presentationModeButton, handler: this.presentationModeClick }, { element: this.openFile, handler: this.openFileClick }, { element: this.print, handler: this.printClick }, { element: this.download, handler: this.downloadClick }, { element: this.viewBookmark, handler: this.viewBookmarkClick }, { element: this.firstPage, handler: this.firstPageClick }, { element: this.lastPage, handler: this.lastPageClick }, { element: this.pageRotateCw, handler: this.pageRotateCwClick }, { element: this.pageRotateCcw, handler: this.pageRotateCcwClick }, { element: this.documentPropertiesButton, handler: this.documentPropertiesClick } ]; for (var item in elements) { var element = elements[item].element; if (element) { element.addEventListener('click', elements[item].handler.bind(this)); } } }, // Event handling functions. presentationModeClick: function secondaryToolbarPresentationModeClick(evt) { PDFViewerApplication.requestPresentationMode(); this.close(); }, openFileClick: function secondaryToolbarOpenFileClick(evt) { document.getElementById('fileInput').click(); this.close(); }, printClick: function secondaryToolbarPrintClick(evt) { window.print(); this.close(); }, downloadClick: function secondaryToolbarDownloadClick(evt) { PDFViewerApplication.download(); this.close(); }, viewBookmarkClick: function secondaryToolbarViewBookmarkClick(evt) { this.close(); }, firstPageClick: function secondaryToolbarFirstPageClick(evt) { PDFViewerApplication.page = 1; this.close(); }, lastPageClick: function secondaryToolbarLastPageClick(evt) { if (PDFViewerApplication.pdfDocument) { PDFViewerApplication.page = PDFViewerApplication.pagesCount; } this.close(); }, pageRotateCwClick: function secondaryToolbarPageRotateCwClick(evt) { PDFViewerApplication.rotatePages(90); }, pageRotateCcwClick: function secondaryToolbarPageRotateCcwClick(evt) { PDFViewerApplication.rotatePages(-90); }, documentPropertiesClick: function secondaryToolbarDocumentPropsClick(evt) { PDFViewerApplication.pdfDocumentProperties.open(); this.close(); }, // Misc. functions for interacting with the toolbar. setMaxHeight: function secondaryToolbarSetMaxHeight(container) { if (!container || !this.buttonContainer) { return; } this.newContainerHeight = container.clientHeight; if (this.previousContainerHeight === this.newContainerHeight) { return; } this.buttonContainer.setAttribute('style', 'max-height: ' + (this.newContainerHeight - SCROLLBAR_PADDING) + 'px;'); this.previousContainerHeight = this.newContainerHeight; }, open: function secondaryToolbarOpen() { if (this.opened) { return; } this.opened = true; this.toggleButton.classList.add('toggled'); this.toolbar.classList.remove('hidden'); }, close: function secondaryToolbarClose(target) { if (!this.opened) { return; } else if (target && !this.toolbar.contains(target)) { return; } this.opened = false; this.toolbar.classList.add('hidden'); this.toggleButton.classList.remove('toggled'); }, toggle: function secondaryToolbarToggle() { if (this.opened) { this.close(); } else { this.open(); } } }; function _setApp(app_) { app = app_; PDFViewerApplication = app.PDFViewerApplication; } exports.SecondaryToolbar = SecondaryToolbar; exports._setApp = _setApp; })); (function (root, factory) { { factory((root.pdfjsWebAnnotationLayerBuilder = {}), root.pdfjsWebUIUtils, root.pdfjsWebPDFLinkService, root.pdfjsWebPDFJS); } }(this, function (exports, uiUtils, pdfLinkService, pdfjsLib) { var mozL10n = uiUtils.mozL10n; var SimpleLinkService = pdfLinkService.SimpleLinkService; /** * @typedef {Object} AnnotationLayerBuilderOptions * @property {HTMLDivElement} pageDiv * @property {PDFPage} pdfPage * @property {IPDFLinkService} linkService * @property {DownloadManager} downloadManager */ /** * @class */ var AnnotationLayerBuilder = (function AnnotationLayerBuilderClosure() { /** * @param {AnnotationLayerBuilderOptions} options * @constructs AnnotationLayerBuilder */ function AnnotationLayerBuilder(options) { this.pageDiv = options.pageDiv; this.pdfPage = options.pdfPage; this.linkService = options.linkService; this.downloadManager = options.downloadManager; this.div = null; } AnnotationLayerBuilder.prototype = /** @lends AnnotationLayerBuilder.prototype */ { /** * @param {PageViewport} viewport * @param {string} intent (default value is 'display') */ render: function AnnotationLayerBuilder_render(viewport, intent) { var self = this; var parameters = { intent: (intent === undefined ? 'display' : intent), }; this.pdfPage.getAnnotations(parameters).then(function (annotations) { viewport = viewport.clone({ dontFlip: true }); parameters = { viewport: viewport, div: self.div, annotations: annotations, page: self.pdfPage, linkService: self.linkService, downloadManager: self.downloadManager }; if (self.div) { // If an annotationLayer already exists, refresh its children's // transformation matrices. pdfjsLib.AnnotationLayer.update(parameters); } else { // Create an annotation layer div and render the annotations // if there is at least one annotation. if (annotations.length === 0) { return; } self.div = document.createElement('div'); self.div.className = 'annotationLayer'; self.pageDiv.appendChild(self.div); parameters.div = self.div; pdfjsLib.AnnotationLayer.render(parameters); if (typeof mozL10n !== 'undefined') { mozL10n.translate(self.div); } } }); }, hide: function AnnotationLayerBuilder_hide() { if (!this.div) { return; } this.div.setAttribute('hidden', 'true'); } }; return AnnotationLayerBuilder; })(); /** * @constructor * @implements IPDFAnnotationLayerFactory */ function DefaultAnnotationLayerFactory() {} DefaultAnnotationLayerFactory.prototype = { /** * @param {HTMLDivElement} pageDiv * @param {PDFPage} pdfPage * @returns {AnnotationLayerBuilder} */ createAnnotationLayerBuilder: function (pageDiv, pdfPage) { return new AnnotationLayerBuilder({ pageDiv: pageDiv, pdfPage: pdfPage, linkService: new SimpleLinkService(), }); } }; exports.AnnotationLayerBuilder = AnnotationLayerBuilder; exports.DefaultAnnotationLayerFactory = DefaultAnnotationLayerFactory; })); (function (root, factory) { { factory((root.pdfjsWebHandTool = {}), root.pdfjsWebUIUtils, root.pdfjsWebGrabToPan, root.pdfjsWebPreferences, root.pdfjsWebSecondaryToolbar); } }(this, function (exports, uiUtils, grabToPan, preferences, secondaryToolbar) { var mozL10n = uiUtils.mozL10n; var GrabToPan = grabToPan.GrabToPan; var Preferences = preferences.Preferences; var SecondaryToolbar = secondaryToolbar.SecondaryToolbar; var HandTool = { initialize: function handToolInitialize(options) { var toggleHandTool = options.toggleHandTool; this.handTool = new GrabToPan({ element: options.container, onActiveChanged: function(isActive) { if (!toggleHandTool) { return; } if (isActive) { toggleHandTool.title = mozL10n.get('hand_tool_disable.title', null, 'Disable hand tool'); toggleHandTool.firstElementChild.textContent = mozL10n.get('hand_tool_disable_label', null, 'Disable hand tool'); } else { toggleHandTool.title = mozL10n.get('hand_tool_enable.title', null, 'Enable hand tool'); toggleHandTool.firstElementChild.textContent = mozL10n.get('hand_tool_enable_label', null, 'Enable hand tool'); } } }); if (toggleHandTool) { toggleHandTool.addEventListener('click', this.toggle.bind(this), false); window.addEventListener('localized', function (evt) { Preferences.get('enableHandToolOnLoad').then(function resolved(value) { if (value) { this.handTool.activate(); } }.bind(this), function rejected(reason) {}); }.bind(this)); window.addEventListener('presentationmodechanged', function (evt) { if (evt.detail.switchInProgress) { return; } if (evt.detail.active) { this.enterPresentationMode(); } else { this.exitPresentationMode(); } }.bind(this)); } }, toggle: function handToolToggle() { this.handTool.toggle(); SecondaryToolbar.close(); }, enterPresentationMode: function handToolEnterPresentationMode() { if (this.handTool.active) { this.wasActive = true; this.handTool.deactivate(); } }, exitPresentationMode: function handToolExitPresentationMode() { if (this.wasActive) { this.wasActive = null; this.handTool.activate(); } } }; exports.HandTool = HandTool; })); (function (root, factory) { { factory((root.pdfjsWebPDFFindBar = {}), root.pdfjsWebUIUtils, root.pdfjsWebPDFFindController); } }(this, function (exports, uiUtils, pdfFindController) { var mozL10n = uiUtils.mozL10n; var FindStates = pdfFindController.FindStates; /** * Creates a "search bar" given a set of DOM elements that act as controls * for searching or for setting search preferences in the UI. This object * also sets up the appropriate events for the controls. Actual searching * is done by PDFFindController. */ var PDFFindBar = (function PDFFindBarClosure() { function PDFFindBar(options) { this.opened = false; this.bar = options.bar || null; this.toggleButton = options.toggleButton || null; this.findField = options.findField || null; this.highlightAll = options.highlightAllCheckbox || null; this.caseSensitive = options.caseSensitiveCheckbox || null; this.findMsg = options.findMsg || null; this.findResultsCount = options.findResultsCount || null; this.findStatusIcon = options.findStatusIcon || null; this.findPreviousButton = options.findPreviousButton || null; this.findNextButton = options.findNextButton || null; this.findController = options.findController || null; if (this.findController === null) { throw new Error('PDFFindBar cannot be used without a ' + 'PDFFindController instance.'); } // Add event listeners to the DOM elements. var self = this; this.toggleButton.addEventListener('click', function() { self.toggle(); }); this.findField.addEventListener('input', function() { self.dispatchEvent(''); }); this.bar.addEventListener('keydown', function(evt) { switch (evt.keyCode) { case 13: // Enter if (evt.target === self.findField) { self.dispatchEvent('again', evt.shiftKey); } break; case 27: // Escape self.close(); break; } }); this.findPreviousButton.addEventListener('click', function() { self.dispatchEvent('again', true); }); this.findNextButton.addEventListener('click', function() { self.dispatchEvent('again', false); }); this.highlightAll.addEventListener('click', function() { self.dispatchEvent('highlightallchange'); }); this.caseSensitive.addEventListener('click', function() { self.dispatchEvent('casesensitivitychange'); }); } PDFFindBar.prototype = { reset: function PDFFindBar_reset() { this.updateUIState(); }, dispatchEvent: function PDFFindBar_dispatchEvent(type, findPrev) { var event = document.createEvent('CustomEvent'); event.initCustomEvent('find' + type, true, true, { query: this.findField.value, caseSensitive: this.caseSensitive.checked, highlightAll: this.highlightAll.checked, findPrevious: findPrev }); return window.dispatchEvent(event); }, updateUIState: function PDFFindBar_updateUIState(state, previous, matchCount) { var notFound = false; var findMsg = ''; var status = ''; switch (state) { case FindStates.FIND_FOUND: break; case FindStates.FIND_PENDING: status = 'pending'; break; case FindStates.FIND_NOTFOUND: findMsg = mozL10n.get('find_not_found', null, 'Phrase not found'); notFound = true; break; case FindStates.FIND_WRAPPED: if (previous) { findMsg = mozL10n.get('find_reached_top', null, 'Reached top of document, continued from bottom'); } else { findMsg = mozL10n.get('find_reached_bottom', null, 'Reached end of document, continued from top'); } break; } if (notFound) { this.findField.classList.add('notFound'); } else { this.findField.classList.remove('notFound'); } this.findField.setAttribute('data-status', status); this.findMsg.textContent = findMsg; this.updateResultsCount(matchCount); }, updateResultsCount: function(matchCount) { if (!this.findResultsCount) { return; // no UI control is provided } // If there are no matches, hide the counter if (!matchCount) { this.findResultsCount.classList.add('hidden'); return; } // Create the match counter this.findResultsCount.textContent = matchCount.toLocaleString(); // Show the counter this.findResultsCount.classList.remove('hidden'); }, open: function PDFFindBar_open() { if (!this.opened) { this.opened = true; this.toggleButton.classList.add('toggled'); this.bar.classList.remove('hidden'); } this.findField.select(); this.findField.focus(); }, close: function PDFFindBar_close() { if (!this.opened) { return; } this.opened = false; this.toggleButton.classList.remove('toggled'); this.bar.classList.add('hidden'); this.findController.active = false; }, toggle: function PDFFindBar_toggle() { if (this.opened) { this.close(); } else { this.open(); } } }; return PDFFindBar; })(); exports.PDFFindBar = PDFFindBar; })); (function (root, factory) { { factory((root.pdfjsWebPDFThumbnailViewer = {}), root.pdfjsWebUIUtils, root.pdfjsWebPDFThumbnailView); } }(this, function (exports, uiUtils, pdfThumbnailView) { var watchScroll = uiUtils.watchScroll; var getVisibleElements = uiUtils.getVisibleElements; var scrollIntoView = uiUtils.scrollIntoView; var PDFThumbnailView = pdfThumbnailView.PDFThumbnailView; var THUMBNAIL_SCROLL_MARGIN = -19; /** * @typedef {Object} PDFThumbnailViewerOptions * @property {HTMLDivElement} container - The container for the thumbnail * elements. * @property {IPDFLinkService} linkService - The navigation/linking service. * @property {PDFRenderingQueue} renderingQueue - The rendering queue object. */ /** * Simple viewer control to display thumbnails for pages. * @class * @implements {IRenderableView} */ var PDFThumbnailViewer = (function PDFThumbnailViewerClosure() { /** * @constructs PDFThumbnailViewer * @param {PDFThumbnailViewerOptions} options */ function PDFThumbnailViewer(options) { this.container = options.container; this.renderingQueue = options.renderingQueue; this.linkService = options.linkService; this.scroll = watchScroll(this.container, this._scrollUpdated.bind(this)); this._resetView(); } PDFThumbnailViewer.prototype = { /** * @private */ _scrollUpdated: function PDFThumbnailViewer_scrollUpdated() { this.renderingQueue.renderHighestPriority(); }, getThumbnail: function PDFThumbnailViewer_getThumbnail(index) { return this.thumbnails[index]; }, /** * @private */ _getVisibleThumbs: function PDFThumbnailViewer_getVisibleThumbs() { return getVisibleElements(this.container, this.thumbnails); }, scrollThumbnailIntoView: function PDFThumbnailViewer_scrollThumbnailIntoView(page) { var selected = document.querySelector('.thumbnail.selected'); if (selected) { selected.classList.remove('selected'); } var thumbnail = document.getElementById('thumbnailContainer' + page); if (thumbnail) { thumbnail.classList.add('selected'); } var visibleThumbs = this._getVisibleThumbs(); var numVisibleThumbs = visibleThumbs.views.length; // If the thumbnail isn't currently visible, scroll it into view. if (numVisibleThumbs > 0) { var first = visibleThumbs.first.id; // Account for only one thumbnail being visible. var last = (numVisibleThumbs > 1 ? visibleThumbs.last.id : first); if (page <= first || page >= last) { scrollIntoView(thumbnail, { top: THUMBNAIL_SCROLL_MARGIN }); } } }, get pagesRotation() { return this._pagesRotation; }, set pagesRotation(rotation) { this._pagesRotation = rotation; for (var i = 0, l = this.thumbnails.length; i < l; i++) { var thumb = this.thumbnails[i]; thumb.update(rotation); } }, cleanup: function PDFThumbnailViewer_cleanup() { var tempCanvas = PDFThumbnailView.tempImageCache; if (tempCanvas) { // Zeroing the width and height causes Firefox to release graphics // resources immediately, which can greatly reduce memory consumption. tempCanvas.width = 0; tempCanvas.height = 0; } PDFThumbnailView.tempImageCache = null; }, /** * @private */ _resetView: function PDFThumbnailViewer_resetView() { this.thumbnails = []; this._pagesRotation = 0; this._pagesRequests = []; }, setDocument: function PDFThumbnailViewer_setDocument(pdfDocument) { if (this.pdfDocument) { // cleanup of the elements and views var thumbsView = this.container; while (thumbsView.hasChildNodes()) { thumbsView.removeChild(thumbsView.lastChild); } this._resetView(); } this.pdfDocument = pdfDocument; if (!pdfDocument) { return Promise.resolve(); } return pdfDocument.getPage(1).then(function (firstPage) { var pagesCount = pdfDocument.numPages; var viewport = firstPage.getViewport(1.0); for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) { var thumbnail = new PDFThumbnailView({ container: this.container, id: pageNum, defaultViewport: viewport.clone(), linkService: this.linkService, renderingQueue: this.renderingQueue, disableCanvasToImageConversion: false, }); this.thumbnails.push(thumbnail); } }.bind(this)); }, /** * @param {PDFPageView} pageView * @returns {PDFPage} * @private */ _ensurePdfPageLoaded: function PDFThumbnailViewer_ensurePdfPageLoaded(thumbView) { if (thumbView.pdfPage) { return Promise.resolve(thumbView.pdfPage); } var pageNumber = thumbView.id; if (this._pagesRequests[pageNumber]) { return this._pagesRequests[pageNumber]; } var promise = this.pdfDocument.getPage(pageNumber).then( function (pdfPage) { thumbView.setPdfPage(pdfPage); this._pagesRequests[pageNumber] = null; return pdfPage; }.bind(this)); this._pagesRequests[pageNumber] = promise; return promise; }, forceRendering: function () { var visibleThumbs = this._getVisibleThumbs(); var thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, this.thumbnails, this.scroll.down); if (thumbView) { this._ensurePdfPageLoaded(thumbView).then(function () { this.renderingQueue.renderView(thumbView); }.bind(this)); return true; } return false; } }; return PDFThumbnailViewer; })(); exports.PDFThumbnailViewer = PDFThumbnailViewer; })); (function (root, factory) { { factory((root.pdfjsWebPDFViewer = {}), root.pdfjsWebUIUtils, root.pdfjsWebPDFPageView, root.pdfjsWebPDFRenderingQueue, root.pdfjsWebTextLayerBuilder, root.pdfjsWebAnnotationLayerBuilder, root.pdfjsWebPDFLinkService, root.pdfjsWebPDFJS); } }(this, function (exports, uiUtils, pdfPageView, pdfRenderingQueue, textLayerBuilder, annotationLayerBuilder, pdfLinkService, pdfjsLib) { var UNKNOWN_SCALE = uiUtils.UNKNOWN_SCALE; var SCROLLBAR_PADDING = uiUtils.SCROLLBAR_PADDING; var VERTICAL_PADDING = uiUtils.VERTICAL_PADDING; var MAX_AUTO_SCALE = uiUtils.MAX_AUTO_SCALE; var CSS_UNITS = uiUtils.CSS_UNITS; var DEFAULT_SCALE = uiUtils.DEFAULT_SCALE; var DEFAULT_SCALE_VALUE = uiUtils.DEFAULT_SCALE_VALUE; var scrollIntoView = uiUtils.scrollIntoView; var watchScroll = uiUtils.watchScroll; var getVisibleElements = uiUtils.getVisibleElements; var PDFPageView = pdfPageView.PDFPageView; var RenderingStates = pdfRenderingQueue.RenderingStates; var PDFRenderingQueue = pdfRenderingQueue.PDFRenderingQueue; var TextLayerBuilder = textLayerBuilder.TextLayerBuilder; var AnnotationLayerBuilder = annotationLayerBuilder.AnnotationLayerBuilder; var SimpleLinkService = pdfLinkService.SimpleLinkService; var PresentationModeState = { UNKNOWN: 0, NORMAL: 1, CHANGING: 2, FULLSCREEN: 3, }; var DEFAULT_CACHE_SIZE = 10; /** * @typedef {Object} PDFViewerOptions * @property {HTMLDivElement} container - The container for the viewer element. * @property {HTMLDivElement} viewer - (optional) The viewer element. * @property {IPDFLinkService} linkService - The navigation/linking service. * @property {DownloadManager} downloadManager - (optional) The download * manager component. * @property {PDFRenderingQueue} renderingQueue - (optional) The rendering * queue object. * @property {boolean} removePageBorders - (optional) Removes the border shadow * around the pages. The default is false. */ /** * Simple viewer control to display PDF content/pages. * @class * @implements {IRenderableView} */ var PDFViewer = (function pdfViewer() { function PDFPageViewBuffer(size) { var data = []; this.push = function cachePush(view) { var i = data.indexOf(view); if (i >= 0) { data.splice(i, 1); } data.push(view); if (data.length > size) { data.shift().destroy(); } }; this.resize = function (newSize) { size = newSize; while (data.length > size) { data.shift().destroy(); } }; } function isSameScale(oldScale, newScale) { if (newScale === oldScale) { return true; } if (Math.abs(newScale - oldScale) < 1e-15) { // Prevent unnecessary re-rendering of all pages when the scale // changes only because of limited numerical precision. return true; } return false; } /** * @constructs PDFViewer * @param {PDFViewerOptions} options */ function PDFViewer(options) { this.container = options.container; this.viewer = options.viewer || options.container.firstElementChild; this.linkService = options.linkService || new SimpleLinkService(); this.downloadManager = options.downloadManager || null; this.removePageBorders = options.removePageBorders || false; this.defaultRenderingQueue = !options.renderingQueue; if (this.defaultRenderingQueue) { // Custom rendering queue is not specified, using default one this.renderingQueue = new PDFRenderingQueue(); this.renderingQueue.setViewer(this); } else { this.renderingQueue = options.renderingQueue; } this.scroll = watchScroll(this.container, this._scrollUpdate.bind(this)); this.updateInProgress = false; this.presentationModeState = PresentationModeState.UNKNOWN; this._resetView(); if (this.removePageBorders) { this.viewer.classList.add('removePageBorders'); } } PDFViewer.prototype = /** @lends PDFViewer.prototype */{ get pagesCount() { return this._pages.length; }, getPageView: function (index) { return this._pages[index]; }, get currentPageNumber() { return this._currentPageNumber; }, set currentPageNumber(val) { if (!this.pdfDocument) { this._currentPageNumber = val; return; } var event = document.createEvent('UIEvents'); event.initUIEvent('pagechange', true, true, window, 0); event.updateInProgress = this.updateInProgress; if (!(0 < val && val <= this.pagesCount)) { event.pageNumber = this._currentPageNumber; event.previousPageNumber = val; this.container.dispatchEvent(event); return; } event.previousPageNumber = this._currentPageNumber; this._currentPageNumber = val; event.pageNumber = val; this.container.dispatchEvent(event); // Check if the caller is `PDFViewer_update`, to avoid breaking scrolling. if (this.updateInProgress) { return; } this.scrollPageIntoView(val); }, /** * @returns {number} */ get currentScale() { return this._currentScale !== UNKNOWN_SCALE ? this._currentScale : DEFAULT_SCALE; }, /** * @param {number} val - Scale of the pages in percents. */ set currentScale(val) { if (isNaN(val)) { throw new Error('Invalid numeric scale'); } if (!this.pdfDocument) { this._currentScale = val; this._currentScaleValue = val !== UNKNOWN_SCALE ? val.toString() : null; return; } this._setScale(val, false); }, /** * @returns {string} */ get currentScaleValue() { return this._currentScaleValue; }, /** * @param val - The scale of the pages (in percent or predefined value). */ set currentScaleValue(val) { if (!this.pdfDocument) { this._currentScale = isNaN(val) ? UNKNOWN_SCALE : val; this._currentScaleValue = val; return; } this._setScale(val, false); }, /** * @returns {number} */ get pagesRotation() { return this._pagesRotation; }, /** * @param {number} rotation - The rotation of the pages (0, 90, 180, 270). */ set pagesRotation(rotation) { this._pagesRotation = rotation; for (var i = 0, l = this._pages.length; i < l; i++) { var pageView = this._pages[i]; pageView.update(pageView.scale, rotation); } this._setScale(this._currentScaleValue, true); if (this.defaultRenderingQueue) { this.update(); } }, /** * @param pdfDocument {PDFDocument} */ setDocument: function (pdfDocument) { if (this.pdfDocument) { this._resetView(); } this.pdfDocument = pdfDocument; if (!pdfDocument) { return; } var pagesCount = pdfDocument.numPages; var self = this; var resolvePagesPromise; var pagesPromise = new Promise(function (resolve) { resolvePagesPromise = resolve; }); this.pagesPromise = pagesPromise; pagesPromise.then(function () { var event = document.createEvent('CustomEvent'); event.initCustomEvent('pagesloaded', true, true, { pagesCount: pagesCount }); self.container.dispatchEvent(event); }); var isOnePageRenderedResolved = false; var resolveOnePageRendered = null; var onePageRendered = new Promise(function (resolve) { resolveOnePageRendered = resolve; }); this.onePageRendered = onePageRendered; var bindOnAfterAndBeforeDraw = function (pageView) { pageView.onBeforeDraw = function pdfViewLoadOnBeforeDraw() { // Add the page to the buffer at the start of drawing. That way it can // be evicted from the buffer and destroyed even if we pause its // rendering. self._buffer.push(this); }; // when page is painted, using the image as thumbnail base pageView.onAfterDraw = function pdfViewLoadOnAfterDraw() { if (!isOnePageRenderedResolved) { isOnePageRenderedResolved = true; resolveOnePageRendered(); } }; }; var firstPagePromise = pdfDocument.getPage(1); this.firstPagePromise = firstPagePromise; // Fetch a single page so we can get a viewport that will be the default // viewport for all pages return firstPagePromise.then(function(pdfPage) { var scale = this.currentScale; var viewport = pdfPage.getViewport(scale * CSS_UNITS); for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) { var textLayerFactory = null; if (!pdfjsLib.PDFJS.disableTextLayer) { textLayerFactory = this; } var pageView = new PDFPageView({ container: this.viewer, id: pageNum, scale: scale, defaultViewport: viewport.clone(), renderingQueue: this.renderingQueue, textLayerFactory: textLayerFactory, annotationLayerFactory: this }); bindOnAfterAndBeforeDraw(pageView); this._pages.push(pageView); } var linkService = this.linkService; // Fetch all the pages since the viewport is needed before printing // starts to create the correct size canvas. Wait until one page is // rendered so we don't tie up too many resources early on. onePageRendered.then(function () { if (!pdfjsLib.PDFJS.disableAutoFetch) { var getPagesLeft = pagesCount; for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) { pdfDocument.getPage(pageNum).then(function (pageNum, pdfPage) { var pageView = self._pages[pageNum - 1]; if (!pageView.pdfPage) { pageView.setPdfPage(pdfPage); } linkService.cachePageRef(pageNum, pdfPage.ref); getPagesLeft--; if (!getPagesLeft) { resolvePagesPromise(); } }.bind(null, pageNum)); } } else { // XXX: Printing is semi-broken with auto fetch disabled. resolvePagesPromise(); } }); var event = document.createEvent('CustomEvent'); event.initCustomEvent('pagesinit', true, true, null); self.container.dispatchEvent(event); if (this.defaultRenderingQueue) { this.update(); } if (this.findController) { this.findController.resolveFirstPage(); } }.bind(this)); }, _resetView: function () { this._pages = []; this._currentPageNumber = 1; this._currentScale = UNKNOWN_SCALE; this._currentScaleValue = null; this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE); this._location = null; this._pagesRotation = 0; this._pagesRequests = []; var container = this.viewer; while (container.hasChildNodes()) { container.removeChild(container.lastChild); } }, _scrollUpdate: function PDFViewer_scrollUpdate() { if (this.pagesCount === 0) { return; } this.update(); for (var i = 0, ii = this._pages.length; i < ii; i++) { this._pages[i].updatePosition(); } }, _setScaleDispatchEvent: function pdfViewer_setScaleDispatchEvent( newScale, newValue, preset) { var event = document.createEvent('UIEvents'); event.initUIEvent('scalechange', true, true, window, 0); event.scale = newScale; if (preset) { event.presetValue = newValue; } this.container.dispatchEvent(event); }, _setScaleUpdatePages: function pdfViewer_setScaleUpdatePages( newScale, newValue, noScroll, preset) { this._currentScaleValue = newValue; if (isSameScale(this._currentScale, newScale)) { if (preset) { this._setScaleDispatchEvent(newScale, newValue, true); } return; } for (var i = 0, ii = this._pages.length; i < ii; i++) { this._pages[i].update(newScale); } this._currentScale = newScale; if (!noScroll) { var page = this._currentPageNumber, dest; if (this._location && !pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom && !(this.isInPresentationMode || this.isChangingPresentationMode)) { page = this._location.pageNumber; dest = [null, { name: 'XYZ' }, this._location.left, this._location.top, null]; } this.scrollPageIntoView(page, dest); } this._setScaleDispatchEvent(newScale, newValue, preset); if (this.defaultRenderingQueue) { this.update(); } }, _setScale: function pdfViewer_setScale(value, noScroll) { var scale = parseFloat(value); if (scale > 0) { this._setScaleUpdatePages(scale, value, noScroll, false); } else { var currentPage = this._pages[this._currentPageNumber - 1]; if (!currentPage) { return; } var hPadding = (this.isInPresentationMode || this.removePageBorders) ? 0 : SCROLLBAR_PADDING; var vPadding = (this.isInPresentationMode || this.removePageBorders) ? 0 : VERTICAL_PADDING; var pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale; var pageHeightScale = (this.container.clientHeight - vPadding) / currentPage.height * currentPage.scale; switch (value) { case 'page-actual': scale = 1; break; case 'page-width': scale = pageWidthScale; break; case 'page-height': scale = pageHeightScale; break; case 'page-fit': scale = Math.min(pageWidthScale, pageHeightScale); break; case 'auto': var isLandscape = (currentPage.width > currentPage.height); // For pages in landscape mode, fit the page height to the viewer // *unless* the page would thus become too wide to fit horizontally. var horizontalScale = isLandscape ? Math.min(pageHeightScale, pageWidthScale) : pageWidthScale; scale = Math.min(MAX_AUTO_SCALE, horizontalScale); break; default: console.error('pdfViewSetScale: \'' + value + '\' is an unknown zoom value.'); return; } this._setScaleUpdatePages(scale, value, noScroll, true); } }, /** * Scrolls page into view. * @param {number} pageNumber * @param {Array} dest - (optional) original PDF destination array: * */ scrollPageIntoView: function PDFViewer_scrollPageIntoView(pageNumber, dest) { if (!this.pdfDocument) { return; } var pageView = this._pages[pageNumber - 1]; if (this.isInPresentationMode) { if (this._currentPageNumber !== pageView.id) { // Avoid breaking getVisiblePages in presentation mode. this.currentPageNumber = pageView.id; return; } dest = null; // Fixes the case when PDF has different page sizes. this._setScale(this._currentScaleValue, true); } if (!dest) { scrollIntoView(pageView.div); return; } var x = 0, y = 0; var width = 0, height = 0, widthScale, heightScale; var changeOrientation = (pageView.rotation % 180 === 0 ? false : true); var pageWidth = (changeOrientation ? pageView.height : pageView.width) / pageView.scale / CSS_UNITS; var pageHeight = (changeOrientation ? pageView.width : pageView.height) / pageView.scale / CSS_UNITS; var scale = 0; switch (dest[1].name) { case 'XYZ': x = dest[2]; y = dest[3]; scale = dest[4]; // If x and/or y coordinates are not supplied, default to // _top_ left of the page (not the obvious bottom left, // since aligning the bottom of the intended page with the // top of the window is rarely helpful). x = x !== null ? x : 0; y = y !== null ? y : pageHeight; break; case 'Fit': case 'FitB': scale = 'page-fit'; break; case 'FitH': case 'FitBH': y = dest[2]; scale = 'page-width'; // According to the PDF spec, section 12.3.2.2, a `null` value in the // parameter should maintain the position relative to the new page. if (y === null && this._location) { x = this._location.left; y = this._location.top; } break; case 'FitV': case 'FitBV': x = dest[2]; width = pageWidth; height = pageHeight; scale = 'page-height'; break; case 'FitR': x = dest[2]; y = dest[3]; width = dest[4] - x; height = dest[5] - y; var hPadding = this.removePageBorders ? 0 : SCROLLBAR_PADDING; var vPadding = this.removePageBorders ? 0 : VERTICAL_PADDING; widthScale = (this.container.clientWidth - hPadding) / width / CSS_UNITS; heightScale = (this.container.clientHeight - vPadding) / height / CSS_UNITS; scale = Math.min(Math.abs(widthScale), Math.abs(heightScale)); break; default: return; } if (scale && scale !== this._currentScale) { this.currentScaleValue = scale; } else if (this._currentScale === UNKNOWN_SCALE) { this.currentScaleValue = DEFAULT_SCALE_VALUE; } if (scale === 'page-fit' && !dest[4]) { scrollIntoView(pageView.div); return; } var boundingRect = [ pageView.viewport.convertToViewportPoint(x, y), pageView.viewport.convertToViewportPoint(x + width, y + height) ]; var left = Math.min(boundingRect[0][0], boundingRect[1][0]); var top = Math.min(boundingRect[0][1], boundingRect[1][1]); scrollIntoView(pageView.div, { left: left, top: top }); }, _updateLocation: function (firstPage) { var currentScale = this._currentScale; var currentScaleValue = this._currentScaleValue; var normalizedScaleValue = parseFloat(currentScaleValue) === currentScale ? Math.round(currentScale * 10000) / 100 : currentScaleValue; var pageNumber = firstPage.id; var pdfOpenParams = '#page=' + pageNumber; pdfOpenParams += '&zoom=' + normalizedScaleValue; var currentPageView = this._pages[pageNumber - 1]; var container = this.container; var topLeft = currentPageView.getPagePoint( (container.scrollLeft - firstPage.x), (container.scrollTop - firstPage.y)); var intLeft = Math.round(topLeft[0]); var intTop = Math.round(topLeft[1]); pdfOpenParams += ',' + intLeft + ',' + intTop; this._location = { pageNumber: pageNumber, scale: normalizedScaleValue, top: intTop, left: intLeft, pdfOpenParams: pdfOpenParams }; }, update: function PDFViewer_update() { var visible = this._getVisiblePages(); var visiblePages = visible.views; if (visiblePages.length === 0) { return; } this.updateInProgress = true; var suggestedCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * visiblePages.length + 1); this._buffer.resize(suggestedCacheSize); this.renderingQueue.renderHighestPriority(visible); var currentId = this._currentPageNumber; var firstPage = visible.first; for (var i = 0, ii = visiblePages.length, stillFullyVisible = false; i < ii; ++i) { var page = visiblePages[i]; if (page.percent < 100) { break; } if (page.id === currentId) { stillFullyVisible = true; break; } } if (!stillFullyVisible) { currentId = visiblePages[0].id; } if (!this.isInPresentationMode) { this.currentPageNumber = currentId; } this._updateLocation(firstPage); this.updateInProgress = false; var event = document.createEvent('UIEvents'); event.initUIEvent('updateviewarea', true, true, window, 0); event.location = this._location; this.container.dispatchEvent(event); }, containsElement: function (element) { return this.container.contains(element); }, focus: function () { this.container.focus(); }, get isInPresentationMode() { return this.presentationModeState === PresentationModeState.FULLSCREEN; }, get isChangingPresentationMode() { return this.presentationModeState === PresentationModeState.CHANGING; }, get isHorizontalScrollbarEnabled() { return (this.isInPresentationMode ? false : (this.container.scrollWidth > this.container.clientWidth)); }, _getVisiblePages: function () { if (!this.isInPresentationMode) { return getVisibleElements(this.container, this._pages, true); } else { // The algorithm in getVisibleElements doesn't work in all browsers and // configurations when presentation mode is active. var visible = []; var currentPage = this._pages[this._currentPageNumber - 1]; visible.push({ id: currentPage.id, view: currentPage }); return { first: currentPage, last: currentPage, views: visible }; } }, cleanup: function () { for (var i = 0, ii = this._pages.length; i < ii; i++) { if (this._pages[i] && this._pages[i].renderingState !== RenderingStates.FINISHED) { this._pages[i].reset(); } } }, /** * @param {PDFPageView} pageView * @returns {PDFPage} * @private */ _ensurePdfPageLoaded: function (pageView) { if (pageView.pdfPage) { return Promise.resolve(pageView.pdfPage); } var pageNumber = pageView.id; if (this._pagesRequests[pageNumber]) { return this._pagesRequests[pageNumber]; } var promise = this.pdfDocument.getPage(pageNumber).then( function (pdfPage) { pageView.setPdfPage(pdfPage); this._pagesRequests[pageNumber] = null; return pdfPage; }.bind(this)); this._pagesRequests[pageNumber] = promise; return promise; }, forceRendering: function (currentlyVisiblePages) { var visiblePages = currentlyVisiblePages || this._getVisiblePages(); var pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, this.scroll.down); if (pageView) { this._ensurePdfPageLoaded(pageView).then(function () { this.renderingQueue.renderView(pageView); }.bind(this)); return true; } return false; }, getPageTextContent: function (pageIndex) { return this.pdfDocument.getPage(pageIndex + 1).then(function (page) { return page.getTextContent({ normalizeWhitespace: true }); }); }, /** * @param {HTMLDivElement} textLayerDiv * @param {number} pageIndex * @param {PageViewport} viewport * @returns {TextLayerBuilder} */ createTextLayerBuilder: function (textLayerDiv, pageIndex, viewport) { return new TextLayerBuilder({ textLayerDiv: textLayerDiv, pageIndex: pageIndex, viewport: viewport, findController: this.isInPresentationMode ? null : this.findController }); }, /** * @param {HTMLDivElement} pageDiv * @param {PDFPage} pdfPage * @returns {AnnotationLayerBuilder} */ createAnnotationLayerBuilder: function (pageDiv, pdfPage) { return new AnnotationLayerBuilder({ pageDiv: pageDiv, pdfPage: pdfPage, linkService: this.linkService, downloadManager: this.downloadManager }); }, setFindController: function (findController) { this.findController = findController; }, }; return PDFViewer; })(); exports.PresentationModeState = PresentationModeState; exports.PDFViewer = PDFViewer; })); (function (root, factory) { { factory((root.pdfjsWebApp = {}), root.pdfjsWebUIUtils, root.pdfjsWebFirefoxCom, root.pdfjsWebDownloadManager, root.pdfjsWebPDFHistory, root.pdfjsWebPreferences, root.pdfjsWebPDFSidebar, root.pdfjsWebViewHistory, root.pdfjsWebPDFThumbnailViewer, root.pdfjsWebSecondaryToolbar, root.pdfjsWebPasswordPrompt, root.pdfjsWebPDFPresentationMode, root.pdfjsWebPDFDocumentProperties, root.pdfjsWebHandTool, root.pdfjsWebPDFViewer, root.pdfjsWebPDFRenderingQueue, root.pdfjsWebPDFLinkService, root.pdfjsWebPDFOutlineViewer, root.pdfjsWebOverlayManager, root.pdfjsWebPDFAttachmentViewer, root.pdfjsWebPDFFindController, root.pdfjsWebPDFFindBar, root.pdfjsWebMozPrintCallbackPolyfill, root.pdfjsWebPDFJS); } }(this, function (exports, uiUtilsLib, firefoxComLib, downloadManagerLib, pdfHistoryLib, preferencesLib, pdfSidebarLib, viewHistoryLib, pdfThumbnailViewerLib, secondaryToolbarLib, passwordPromptLib, pdfPresentationModeLib, pdfDocumentPropertiesLib, handToolLib, pdfViewerLib, pdfRenderingQueueLib, pdfLinkServiceLib, pdfOutlineViewerLib, overlayManagerLib, pdfAttachmentViewerLib, pdfFindControllerLib, pdfFindBarLib, mozPrintCallbackPolyfillLib, pdfjsLib) { var FirefoxCom = firefoxComLib.FirefoxCom; var UNKNOWN_SCALE = uiUtilsLib.UNKNOWN_SCALE; var DEFAULT_SCALE_VALUE = uiUtilsLib.DEFAULT_SCALE_VALUE; var ProgressBar = uiUtilsLib.ProgressBar; var getPDFFileNameFromURL = uiUtilsLib.getPDFFileNameFromURL; var noContextMenuHandler = uiUtilsLib.noContextMenuHandler; var mozL10n = uiUtilsLib.mozL10n; var parseQueryString = uiUtilsLib.parseQueryString; var DownloadManager = downloadManagerLib.DownloadManager || firefoxComLib.DownloadManager; var PDFHistory = pdfHistoryLib.PDFHistory; var Preferences = preferencesLib.Preferences; var SidebarView = pdfSidebarLib.SidebarView; var PDFSidebar = pdfSidebarLib.PDFSidebar; var ViewHistory = viewHistoryLib.ViewHistory; var PDFThumbnailViewer = pdfThumbnailViewerLib.PDFThumbnailViewer; var SecondaryToolbar = secondaryToolbarLib.SecondaryToolbar; var PasswordPrompt = passwordPromptLib.PasswordPrompt; var PDFPresentationMode = pdfPresentationModeLib.PDFPresentationMode; var PDFDocumentProperties = pdfDocumentPropertiesLib.PDFDocumentProperties; var HandTool = handToolLib.HandTool; var PresentationModeState = pdfViewerLib.PresentationModeState; var PDFViewer = pdfViewerLib.PDFViewer; var RenderingStates = pdfRenderingQueueLib.RenderingStates; var PDFRenderingQueue = pdfRenderingQueueLib.PDFRenderingQueue; var PDFLinkService = pdfLinkServiceLib.PDFLinkService; var PDFOutlineViewer = pdfOutlineViewerLib.PDFOutlineViewer; var OverlayManager = overlayManagerLib.OverlayManager; var PDFAttachmentViewer = pdfAttachmentViewerLib.PDFAttachmentViewer; var PDFFindController = pdfFindControllerLib.PDFFindController; var PDFFindBar = pdfFindBarLib.PDFFindBar; var DEFAULT_SCALE_DELTA = 1.1; var MIN_SCALE = 0.25; var MAX_SCALE = 10.0; var SCALE_SELECT_CONTAINER_PADDING = 8; var SCALE_SELECT_PADDING = 22; var PAGE_NUMBER_LOADING_INDICATOR = 'visiblePageIsLoading'; var DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000; function configure(PDFJS) { PDFJS.imageResourcesPath = './images/'; PDFJS.workerSrc = '../build/pdf.worker.js'; PDFJS.cMapUrl = '../web/cmaps/'; PDFJS.cMapPacked = true; } var PDFViewerApplication = { initialBookmark: document.location.hash.substring(1), initialDestination: null, initialized: false, fellback: false, pdfDocument: null, pdfLoadingTask: null, printing: false, /** @type {PDFViewer} */ pdfViewer: null, /** @type {PDFThumbnailViewer} */ pdfThumbnailViewer: null, /** @type {PDFRenderingQueue} */ pdfRenderingQueue: null, /** @type {PDFPresentationMode} */ pdfPresentationMode: null, /** @type {PDFDocumentProperties} */ pdfDocumentProperties: null, /** @type {PDFLinkService} */ pdfLinkService: null, /** @type {PDFHistory} */ pdfHistory: null, /** @type {PDFSidebar} */ pdfSidebar: null, /** @type {PDFOutlineViewer} */ pdfOutlineViewer: null, /** @type {PDFAttachmentViewer} */ pdfAttachmentViewer: null, pageRotation: 0, isInitialViewSet: false, animationStartedPromise: null, preferenceSidebarViewOnLoad: SidebarView.NONE, preferencePdfBugEnabled: false, preferenceShowPreviousViewOnLoad: true, preferenceDefaultZoomValue: '', isViewerEmbedded: (window.parent !== window), url: '', // called once when the document is loaded initialize: function pdfViewInitialize() { configure(pdfjsLib.PDFJS); var pdfRenderingQueue = new PDFRenderingQueue(); pdfRenderingQueue.onIdle = this.cleanup.bind(this); this.pdfRenderingQueue = pdfRenderingQueue; var pdfLinkService = new PDFLinkService(); this.pdfLinkService = pdfLinkService; var container = document.getElementById('viewerContainer'); var viewer = document.getElementById('viewer'); this.pdfViewer = new PDFViewer({ container: container, viewer: viewer, renderingQueue: pdfRenderingQueue, linkService: pdfLinkService, downloadManager: new DownloadManager() }); pdfRenderingQueue.setViewer(this.pdfViewer); pdfLinkService.setViewer(this.pdfViewer); var thumbnailContainer = document.getElementById('thumbnailView'); this.pdfThumbnailViewer = new PDFThumbnailViewer({ container: thumbnailContainer, renderingQueue: pdfRenderingQueue, linkService: pdfLinkService }); pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer); Preferences.initialize(); this.pdfHistory = new PDFHistory({ linkService: pdfLinkService }); pdfLinkService.setHistory(this.pdfHistory); this.findController = new PDFFindController({ pdfViewer: this.pdfViewer, integratedFind: this.supportsIntegratedFind }); this.pdfViewer.setFindController(this.findController); this.findBar = new PDFFindBar({ bar: document.getElementById('findbar'), toggleButton: document.getElementById('viewFind'), findField: document.getElementById('findInput'), highlightAllCheckbox: document.getElementById('findHighlightAll'), caseSensitiveCheckbox: document.getElementById('findMatchCase'), findMsg: document.getElementById('findMsg'), findResultsCount: document.getElementById('findResultsCount'), findStatusIcon: document.getElementById('findStatusIcon'), findPreviousButton: document.getElementById('findPrevious'), findNextButton: document.getElementById('findNext'), findController: this.findController }); this.findController.setFindBar(this.findBar); HandTool.initialize({ container: container, toggleHandTool: document.getElementById('toggleHandTool') }); this.pdfDocumentProperties = new PDFDocumentProperties({ overlayName: 'documentPropertiesOverlay', closeButton: document.getElementById('documentPropertiesClose'), fields: { 'fileName': document.getElementById('fileNameField'), 'fileSize': document.getElementById('fileSizeField'), 'title': document.getElementById('titleField'), 'author': document.getElementById('authorField'), 'subject': document.getElementById('subjectField'), 'keywords': document.getElementById('keywordsField'), 'creationDate': document.getElementById('creationDateField'), 'modificationDate': document.getElementById('modificationDateField'), 'creator': document.getElementById('creatorField'), 'producer': document.getElementById('producerField'), 'version': document.getElementById('versionField'), 'pageCount': document.getElementById('pageCountField') } }); SecondaryToolbar.initialize({ toolbar: document.getElementById('secondaryToolbar'), toggleButton: document.getElementById('secondaryToolbarToggle'), presentationModeButton: document.getElementById('secondaryPresentationMode'), openFile: document.getElementById('secondaryOpenFile'), print: document.getElementById('secondaryPrint'), download: document.getElementById('secondaryDownload'), viewBookmark: document.getElementById('secondaryViewBookmark'), firstPage: document.getElementById('firstPage'), lastPage: document.getElementById('lastPage'), pageRotateCw: document.getElementById('pageRotateCw'), pageRotateCcw: document.getElementById('pageRotateCcw'), documentPropertiesButton: document.getElementById('documentProperties') }); if (this.supportsFullscreen) { var toolbar = SecondaryToolbar; this.pdfPresentationMode = new PDFPresentationMode({ container: container, viewer: viewer, pdfViewer: this.pdfViewer, contextMenuItems: [ { element: document.getElementById('contextFirstPage'), handler: toolbar.firstPageClick.bind(toolbar) }, { element: document.getElementById('contextLastPage'), handler: toolbar.lastPageClick.bind(toolbar) }, { element: document.getElementById('contextPageRotateCw'), handler: toolbar.pageRotateCwClick.bind(toolbar) }, { element: document.getElementById('contextPageRotateCcw'), handler: toolbar.pageRotateCcwClick.bind(toolbar) } ] }); } PasswordPrompt.initialize({ overlayName: 'passwordOverlay', passwordField: document.getElementById('password'), passwordText: document.getElementById('passwordText'), passwordSubmit: document.getElementById('passwordSubmit'), passwordCancel: document.getElementById('passwordCancel') }); this.pdfOutlineViewer = new PDFOutlineViewer({ container: document.getElementById('outlineView'), linkService: pdfLinkService, }); this.pdfAttachmentViewer = new PDFAttachmentViewer({ container: document.getElementById('attachmentsView'), downloadManager: new DownloadManager(), }); this.pdfSidebar = new PDFSidebar({ pdfViewer: this.pdfViewer, pdfThumbnailViewer: this.pdfThumbnailViewer, pdfOutlineViewer: this.pdfOutlineViewer, // Divs (and sidebar button) mainContainer: document.getElementById('mainContainer'), outerContainer: document.getElementById('outerContainer'), toggleButton: document.getElementById('sidebarToggle'), // Buttons thumbnailButton: document.getElementById('viewThumbnail'), outlineButton: document.getElementById('viewOutline'), attachmentsButton: document.getElementById('viewAttachments'), // Views thumbnailView: document.getElementById('thumbnailView'), outlineView: document.getElementById('outlineView'), attachmentsView: document.getElementById('attachmentsView'), }); this.pdfSidebar.onToggled = this.forceRendering.bind(this); var self = this; var PDFJS = pdfjsLib.PDFJS; var initializedPromise = Promise.all([ Preferences.get('enableWebGL').then(function resolved(value) { PDFJS.disableWebGL = !value; }), Preferences.get('sidebarViewOnLoad').then(function resolved(value) { self.preferenceSidebarViewOnLoad = value; }), Preferences.get('pdfBugEnabled').then(function resolved(value) { self.preferencePdfBugEnabled = value; }), Preferences.get('showPreviousViewOnLoad').then(function resolved(value) { self.preferenceShowPreviousViewOnLoad = value; }), Preferences.get('defaultZoomValue').then(function resolved(value) { self.preferenceDefaultZoomValue = value; }), Preferences.get('disableTextLayer').then(function resolved(value) { if (PDFJS.disableTextLayer === true) { return; } PDFJS.disableTextLayer = value; }), Preferences.get('disableRange').then(function resolved(value) { if (PDFJS.disableRange === true) { return; } PDFJS.disableRange = value; }), Preferences.get('disableStream').then(function resolved(value) { if (PDFJS.disableStream === true) { return; } PDFJS.disableStream = value; }), Preferences.get('disableAutoFetch').then(function resolved(value) { PDFJS.disableAutoFetch = value; }), Preferences.get('disableFontFace').then(function resolved(value) { if (PDFJS.disableFontFace === true) { return; } PDFJS.disableFontFace = value; }), Preferences.get('useOnlyCssZoom').then(function resolved(value) { PDFJS.useOnlyCssZoom = value; }), Preferences.get('externalLinkTarget').then(function resolved(value) { if (PDFJS.isExternalLinkTargetSet()) { return; } PDFJS.externalLinkTarget = value; }), // TODO move more preferences and other async stuff here ]).catch(function (reason) { }); return initializedPromise.then(function () { if (self.isViewerEmbedded && !PDFJS.isExternalLinkTargetSet()) { // Prevent external links from "replacing" the viewer, // when it's embedded in e.g. an iframe or an object. PDFJS.externalLinkTarget = PDFJS.LinkTarget.TOP; } self.initialized = true; }); }, run: function pdfViewRun() { this.initialize().then(webViewerInitialized); }, zoomIn: function pdfViewZoomIn(ticks) { var newScale = this.pdfViewer.currentScale; do { newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2); newScale = Math.ceil(newScale * 10) / 10; newScale = Math.min(MAX_SCALE, newScale); } while (--ticks > 0 && newScale < MAX_SCALE); this.pdfViewer.currentScaleValue = newScale; }, zoomOut: function pdfViewZoomOut(ticks) { var newScale = this.pdfViewer.currentScale; do { newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2); newScale = Math.floor(newScale * 10) / 10; newScale = Math.max(MIN_SCALE, newScale); } while (--ticks > 0 && newScale > MIN_SCALE); this.pdfViewer.currentScaleValue = newScale; }, get pagesCount() { return this.pdfDocument.numPages; }, set page(val) { this.pdfLinkService.page = val; }, get page() { // TODO remove return this.pdfLinkService.page; }, get supportsPrinting() { var canvas = document.createElement('canvas'); var value = 'mozPrintCallback' in canvas; return pdfjsLib.shadow(this, 'supportsPrinting', value); }, get supportsFullscreen() { var doc = document.documentElement; var support = !!(doc.requestFullscreen || doc.mozRequestFullScreen || doc.webkitRequestFullScreen || doc.msRequestFullscreen); if (document.fullscreenEnabled === false || document.mozFullScreenEnabled === false || document.webkitFullscreenEnabled === false || document.msFullscreenEnabled === false) { support = false; } if (support && pdfjsLib.PDFJS.disableFullscreen === true) { support = false; } return pdfjsLib.shadow(this, 'supportsFullscreen', support); }, get supportsIntegratedFind() { var support = false; return pdfjsLib.shadow(this, 'supportsIntegratedFind', support); }, get supportsDocumentFonts() { var support = true; return pdfjsLib.shadow(this, 'supportsDocumentFonts', support); }, get supportsDocumentColors() { var support = true; return pdfjsLib.shadow(this, 'supportsDocumentColors', support); }, get loadingBar() { var bar = new ProgressBar('#loadingBar', {}); return pdfjsLib.shadow(this, 'loadingBar', bar); }, get supportedMouseWheelZoomModifierKeys() { var support = { ctrlKey: true, metaKey: true, }; return pdfjsLib.shadow(this, 'supportedMouseWheelZoomModifierKeys', support); }, setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) { this.url = url; try { this.setTitle(decodeURIComponent( pdfjsLib.getFilenameFromUrl(url)) || url); } catch (e) { // decodeURIComponent may throw URIError, // fall back to using the unprocessed url in that case this.setTitle(url); } }, setTitle: function pdfViewSetTitle(title) { if (this.isViewerEmbedded) { // Embedded PDF viewers should not be changing their parent page's title. return; } document.title = title; }, /** * Closes opened PDF document. * @returns {Promise} - Returns the promise, which is resolved when all * destruction is completed. */ close: function pdfViewClose() { var errorWrapper = document.getElementById('errorWrapper'); errorWrapper.setAttribute('hidden', 'true'); if (!this.pdfLoadingTask) { return Promise.resolve(); } var promise = this.pdfLoadingTask.destroy(); this.pdfLoadingTask = null; if (this.pdfDocument) { this.pdfDocument = null; this.pdfThumbnailViewer.setDocument(null); this.pdfViewer.setDocument(null); this.pdfLinkService.setDocument(null, null); } this.pdfSidebar.reset(); this.pdfOutlineViewer.reset(); this.pdfAttachmentViewer.reset(); this.findController.reset(); this.findBar.reset(); if (typeof PDFBug !== 'undefined') { PDFBug.cleanup(); } return promise; }, /** * Opens PDF document specified by URL or array with additional arguments. * @param {string|TypedArray|ArrayBuffer} file - PDF location or binary data. * @param {Object} args - (optional) Additional arguments for the getDocument * call, e.g. HTTP headers ('httpHeaders') or * alternative data transport ('range'). * @returns {Promise} - Returns the promise, which is resolved when document * is opened. */ open: function pdfViewOpen(file, args) { var scale = 0; if (arguments.length > 2 || typeof args === 'number') { console.warn('Call of open() with obsolete signature.'); if (typeof args === 'number') { scale = args; // scale argument was found } args = arguments[4] || null; if (arguments[3] && typeof arguments[3] === 'object') { // The pdfDataRangeTransport argument is present. args = Object.create(args); args.range = arguments[3]; } if (typeof arguments[2] === 'string') { // The password argument is present. args = Object.create(args); args.password = arguments[2]; } } if (this.pdfLoadingTask) { // We need to destroy already opened document. return this.close().then(function () { // Reload the preferences if a document was previously opened. Preferences.reload(); // ... and repeat the open() call. return this.open(file, args); }.bind(this)); } var parameters = Object.create(null); if (typeof file === 'string') { // URL this.setTitleUsingUrl(file); parameters.url = file; } else if (file && 'byteLength' in file) { // ArrayBuffer parameters.data = file; } else if (file.url && file.originalUrl) { this.setTitleUsingUrl(file.originalUrl); parameters.url = file.url; } if (args) { for (var prop in args) { parameters[prop] = args[prop]; } } var self = this; self.downloadComplete = false; var loadingTask = pdfjsLib.getDocument(parameters); this.pdfLoadingTask = loadingTask; loadingTask.onPassword = function passwordNeeded(updatePassword, reason) { PasswordPrompt.updatePassword = updatePassword; PasswordPrompt.reason = reason; PasswordPrompt.open(); }; loadingTask.onProgress = function getDocumentProgress(progressData) { self.progress(progressData.loaded / progressData.total); }; // Listen for unsupported features to trigger the fallback UI. loadingTask.onUnsupportedFeature = this.fallback.bind(this); var result = loadingTask.promise.then( function getDocumentCallback(pdfDocument) { self.load(pdfDocument, scale); }, function getDocumentError(exception) { var message = exception && exception.message; var loadingErrorMessage = mozL10n.get('loading_error', null, 'An error occurred while loading the PDF.'); if (exception instanceof pdfjsLib.InvalidPDFException) { // change error message also for other builds loadingErrorMessage = mozL10n.get('invalid_file_error', null, 'Invalid or corrupted PDF file.'); } else if (exception instanceof pdfjsLib.MissingPDFException) { // special message for missing PDF's loadingErrorMessage = mozL10n.get('missing_file_error', null, 'Missing PDF file.'); } else if (exception instanceof pdfjsLib.UnexpectedResponseException) { loadingErrorMessage = mozL10n.get('unexpected_response_error', null, 'Unexpected server response.'); } var moreInfo = { message: message }; self.error(loadingErrorMessage, moreInfo); throw new Error(loadingErrorMessage); } ); if (args && args.length) { PDFViewerApplication.pdfDocumentProperties.setFileSize(args.length); } return result; }, download: function pdfViewDownload() { function downloadByUrl() { downloadManager.downloadUrl(url, filename); } var url = this.url.split('#')[0]; var filename = getPDFFileNameFromURL(url); var downloadManager = new DownloadManager(); downloadManager.onerror = function (err) { // This error won't really be helpful because it's likely the // fallback won't work either (or is already open). PDFViewerApplication.error('PDF failed to download.'); }; if (!this.pdfDocument) { // the PDF is not ready yet downloadByUrl(); return; } if (!this.downloadComplete) { // the PDF is still downloading downloadByUrl(); return; } this.pdfDocument.getData().then( function getDataSuccess(data) { var blob = pdfjsLib.createBlob(data, 'application/pdf'); downloadManager.download(blob, url, filename); }, downloadByUrl // Error occurred try downloading with just the url. ).then(null, downloadByUrl); }, fallback: function pdfViewFallback(featureId) { }, /** * Show the error box. * @param {String} message A message that is human readable. * @param {Object} moreInfo (optional) Further information about the error * that is more technical. Should have a 'message' * and optionally a 'stack' property. */ error: function pdfViewError(message, moreInfo) { var moreInfoText = mozL10n.get('error_version_info', {version: pdfjsLib.version || '?', build: pdfjsLib.build || '?'}, 'PDF.js v{{version}} (build: {{build}})') + '\n'; if (moreInfo) { moreInfoText += mozL10n.get('error_message', {message: moreInfo.message}, 'Message: {{message}}'); if (moreInfo.stack) { moreInfoText += '\n' + mozL10n.get('error_stack', {stack: moreInfo.stack}, 'Stack: {{stack}}'); } else { if (moreInfo.filename) { moreInfoText += '\n' + mozL10n.get('error_file', {file: moreInfo.filename}, 'File: {{file}}'); } if (moreInfo.lineNumber) { moreInfoText += '\n' + mozL10n.get('error_line', {line: moreInfo.lineNumber}, 'Line: {{line}}'); } } } var errorWrapper = document.getElementById('errorWrapper'); errorWrapper.removeAttribute('hidden'); var errorMessage = document.getElementById('errorMessage'); errorMessage.textContent = message; var closeButton = document.getElementById('errorClose'); closeButton.onclick = function() { errorWrapper.setAttribute('hidden', 'true'); }; var errorMoreInfo = document.getElementById('errorMoreInfo'); var moreInfoButton = document.getElementById('errorShowMore'); var lessInfoButton = document.getElementById('errorShowLess'); moreInfoButton.onclick = function() { errorMoreInfo.removeAttribute('hidden'); moreInfoButton.setAttribute('hidden', 'true'); lessInfoButton.removeAttribute('hidden'); errorMoreInfo.style.height = errorMoreInfo.scrollHeight + 'px'; }; lessInfoButton.onclick = function() { errorMoreInfo.setAttribute('hidden', 'true'); moreInfoButton.removeAttribute('hidden'); lessInfoButton.setAttribute('hidden', 'true'); }; moreInfoButton.oncontextmenu = noContextMenuHandler; lessInfoButton.oncontextmenu = noContextMenuHandler; closeButton.oncontextmenu = noContextMenuHandler; moreInfoButton.removeAttribute('hidden'); lessInfoButton.setAttribute('hidden', 'true'); errorMoreInfo.value = moreInfoText; }, progress: function pdfViewProgress(level) { var percent = Math.round(level * 100); // When we transition from full request to range requests, it's possible // that we discard some of the loaded data. This can cause the loading // bar to move backwards. So prevent this by only updating the bar if it // increases. if (percent > this.loadingBar.percent || isNaN(percent)) { this.loadingBar.percent = percent; // When disableAutoFetch is enabled, it's not uncommon for the entire file // to never be fetched (depends on e.g. the file structure). In this case // the loading bar will not be completely filled, nor will it be hidden. // To prevent displaying a partially filled loading bar permanently, we // hide it when no data has been loaded during a certain amount of time. if (pdfjsLib.PDFJS.disableAutoFetch && percent) { if (this.disableAutoFetchLoadingBarTimeout) { clearTimeout(this.disableAutoFetchLoadingBarTimeout); this.disableAutoFetchLoadingBarTimeout = null; } this.loadingBar.show(); this.disableAutoFetchLoadingBarTimeout = setTimeout(function () { this.loadingBar.hide(); this.disableAutoFetchLoadingBarTimeout = null; }.bind(this), DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT); } } }, load: function pdfViewLoad(pdfDocument, scale) { var self = this; scale = scale || UNKNOWN_SCALE; this.pdfDocument = pdfDocument; this.pdfDocumentProperties.setDocumentAndUrl(pdfDocument, this.url); var downloadedPromise = pdfDocument.getDownloadInfo().then(function() { self.downloadComplete = true; self.loadingBar.hide(); }); var pagesCount = pdfDocument.numPages; document.getElementById('numPages').textContent = mozL10n.get('page_of', {pageCount: pagesCount}, 'of {{pageCount}}'); document.getElementById('pageNumber').max = pagesCount; var id = this.documentFingerprint = pdfDocument.fingerprint; var store = this.store = new ViewHistory(id); var baseDocumentUrl = null; this.pdfLinkService.setDocument(pdfDocument, baseDocumentUrl); var pdfViewer = this.pdfViewer; pdfViewer.currentScale = scale; pdfViewer.setDocument(pdfDocument); var firstPagePromise = pdfViewer.firstPagePromise; var pagesPromise = pdfViewer.pagesPromise; var onePageRendered = pdfViewer.onePageRendered; this.pageRotation = 0; this.isInitialViewSet = false; this.pdfThumbnailViewer.setDocument(pdfDocument); firstPagePromise.then(function(pdfPage) { downloadedPromise.then(function () { var event = document.createEvent('CustomEvent'); event.initCustomEvent('documentload', true, true, {}); window.dispatchEvent(event); }); self.loadingBar.setWidth(document.getElementById('viewer')); if (!pdfjsLib.PDFJS.disableHistory && !self.isViewerEmbedded) { // The browsing history is only enabled when the viewer is standalone, // i.e. not when it is embedded in a web page. if (!self.preferenceShowPreviousViewOnLoad) { self.pdfHistory.clearHistoryState(); } self.pdfHistory.initialize(self.documentFingerprint); if (self.pdfHistory.initialDestination) { self.initialDestination = self.pdfHistory.initialDestination; } else if (self.pdfHistory.initialBookmark) { self.initialBookmark = self.pdfHistory.initialBookmark; } } var initialParams = { destination: self.initialDestination, bookmark: self.initialBookmark, hash: null, }; store.initializedPromise.then(function resolved() { var storedHash = null; if (self.preferenceShowPreviousViewOnLoad && store.get('exists', false)) { var pageNum = store.get('page', '1'); var zoom = self.preferenceDefaultZoomValue || store.get('zoom', DEFAULT_SCALE_VALUE); var left = store.get('scrollLeft', '0'); var top = store.get('scrollTop', '0'); storedHash = 'page=' + pageNum + '&zoom=' + zoom + ',' + left + ',' + top; } else if (self.preferenceDefaultZoomValue) { storedHash = 'page=1&zoom=' + self.preferenceDefaultZoomValue; } self.setInitialView(storedHash, scale); initialParams.hash = storedHash; // Make all navigation keys work on document load, // unless the viewer is embedded in a web page. if (!self.isViewerEmbedded) { self.pdfViewer.focus(); } }, function rejected(reason) { console.error(reason); self.setInitialView(null, scale); }); // For documents with different page sizes, // ensure that the correct location becomes visible on load. pagesPromise.then(function resolved() { if (!initialParams.destination && !initialParams.bookmark && !initialParams.hash) { return; } if (self.hasEqualPageSizes) { return; } self.initialDestination = initialParams.destination; self.initialBookmark = initialParams.bookmark; self.pdfViewer.currentScaleValue = self.pdfViewer.currentScaleValue; self.setInitialView(initialParams.hash, scale); }); }); pagesPromise.then(function() { if (self.supportsPrinting) { pdfDocument.getJavaScript().then(function(javaScript) { if (javaScript.length) { console.warn('Warning: JavaScript is not supported'); self.fallback(pdfjsLib.UNSUPPORTED_FEATURES.javaScript); } // Hack to support auto printing. var regex = /\bprint\s*\(/; for (var i = 0, ii = javaScript.length; i < ii; i++) { var js = javaScript[i]; if (js && regex.test(js)) { setTimeout(function() { window.print(); }); return; } } }); } }); // outline depends on pagesRefMap var promises = [pagesPromise, this.animationStartedPromise]; Promise.all(promises).then(function() { pdfDocument.getOutline().then(function(outline) { self.pdfOutlineViewer.render({ outline: outline }); }); pdfDocument.getAttachments().then(function(attachments) { self.pdfAttachmentViewer.render({ attachments: attachments }); }); }); pdfDocument.getMetadata().then(function(data) { var info = data.info, metadata = data.metadata; self.documentInfo = info; self.metadata = metadata; // Provides some basic debug information console.log('PDF ' + pdfDocument.fingerprint + ' [' + info.PDFFormatVersion + ' ' + (info.Producer || '-').trim() + ' / ' + (info.Creator || '-').trim() + ']' + ' (PDF.js: ' + (pdfjsLib.version || '-') + (!pdfjsLib.PDFJS.disableWebGL ? ' [WebGL]' : '') + ')'); var pdfTitle; if (metadata && metadata.has('dc:title')) { var title = metadata.get('dc:title'); // Ghostscript sometimes return 'Untitled', sets the title to 'Untitled' if (title !== 'Untitled') { pdfTitle = title; } } if (!pdfTitle && info && info['Title']) { pdfTitle = info['Title']; } if (pdfTitle) { self.setTitle(pdfTitle + ' - ' + document.title); } if (info.IsAcroFormPresent) { console.warn('Warning: AcroForm/XFA is not supported'); self.fallback(pdfjsLib.UNSUPPORTED_FEATURES.forms); } }); }, setInitialView: function pdfViewSetInitialView(storedHash, scale) { this.isInitialViewSet = true; // When opening a new file, when one is already loaded in the viewer, // ensure that the 'pageNumber' element displays the correct value. document.getElementById('pageNumber').value = this.pdfViewer.currentPageNumber; this.pdfSidebar.setInitialView(this.preferenceSidebarViewOnLoad); if (this.initialDestination) { this.pdfLinkService.navigateTo(this.initialDestination); this.initialDestination = null; } else if (this.initialBookmark) { this.pdfLinkService.setHash(this.initialBookmark); this.pdfHistory.push({ hash: this.initialBookmark }, true); this.initialBookmark = null; } else if (storedHash) { this.pdfLinkService.setHash(storedHash); } else if (scale) { this.pdfViewer.currentScaleValue = scale; this.page = 1; } if (!this.pdfViewer.currentScaleValue) { // Scale was not initialized: invalid bookmark or scale was not specified. // Setting the default one. this.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE; } }, cleanup: function pdfViewCleanup() { if (!this.pdfDocument) { return; // run cleanup when document is loaded } this.pdfViewer.cleanup(); this.pdfThumbnailViewer.cleanup(); this.pdfDocument.cleanup(); }, forceRendering: function pdfViewForceRendering() { this.pdfRenderingQueue.printing = this.printing; this.pdfRenderingQueue.isThumbnailViewEnabled = this.pdfSidebar.isThumbnailViewVisible; this.pdfRenderingQueue.renderHighestPriority(); }, beforePrint: function pdfViewSetupBeforePrint() { if (!this.supportsPrinting) { var printMessage = mozL10n.get('printing_not_supported', null, 'Warning: Printing is not fully supported by this browser.'); this.error(printMessage); return; } var alertNotReady = false; var i, ii; if (!this.pdfDocument || !this.pagesCount) { alertNotReady = true; } else { for (i = 0, ii = this.pagesCount; i < ii; ++i) { if (!this.pdfViewer.getPageView(i).pdfPage) { alertNotReady = true; break; } } } if (alertNotReady) { var notReadyMessage = mozL10n.get('printing_not_ready', null, 'Warning: The PDF is not fully loaded for printing.'); window.alert(notReadyMessage); return; } this.printing = true; this.forceRendering(); var body = document.querySelector('body'); body.setAttribute('data-mozPrintCallback', true); if (!this.hasEqualPageSizes) { console.warn('Not all pages have the same size. The printed result ' + 'may be incorrect!'); } // Insert a @page + size rule to make sure that the page size is correctly // set. Note that we assume that all pages have the same size, because // variable-size pages are not supported yet (at least in Chrome & Firefox). // TODO(robwu): Use named pages when size calculation bugs get resolved // (e.g. https://crbug.com/355116) AND when support for named pages is // added (http://www.w3.org/TR/css3-page/#using-named-pages). // In browsers where @page + size is not supported (such as Firefox, // https://bugzil.la/851441), the next stylesheet will be ignored and the // user has to select the correct paper size in the UI if wanted. this.pageStyleSheet = document.createElement('style'); var pageSize = this.pdfViewer.getPageView(0).pdfPage.getViewport(1); this.pageStyleSheet.textContent = // "size: " is what we need. But also add "A4" because // Firefox incorrectly reports support for the other value. '@supports ((size:A4) and (size:1pt 1pt)) {' + '@page { size: ' + pageSize.width + 'pt ' + pageSize.height + 'pt;}' + '}'; body.appendChild(this.pageStyleSheet); for (i = 0, ii = this.pagesCount; i < ii; ++i) { this.pdfViewer.getPageView(i).beforePrint(); } }, // Whether all pages of the PDF have the same width and height. get hasEqualPageSizes() { var firstPage = this.pdfViewer.getPageView(0); for (var i = 1, ii = this.pagesCount; i < ii; ++i) { var pageView = this.pdfViewer.getPageView(i); if (pageView.width !== firstPage.width || pageView.height !== firstPage.height) { return false; } } return true; }, afterPrint: function pdfViewSetupAfterPrint() { var div = document.getElementById('printContainer'); while (div.hasChildNodes()) { div.removeChild(div.lastChild); } if (this.pageStyleSheet && this.pageStyleSheet.parentNode) { this.pageStyleSheet.parentNode.removeChild(this.pageStyleSheet); this.pageStyleSheet = null; } this.printing = false; this.forceRendering(); }, rotatePages: function pdfViewRotatePages(delta) { var pageNumber = this.page; this.pageRotation = (this.pageRotation + 360 + delta) % 360; this.pdfViewer.pagesRotation = this.pageRotation; this.pdfThumbnailViewer.pagesRotation = this.pageRotation; this.forceRendering(); this.pdfViewer.scrollPageIntoView(pageNumber); }, requestPresentationMode: function pdfViewRequestPresentationMode() { if (!this.pdfPresentationMode) { return; } this.pdfPresentationMode.request(); }, /** * @param {number} delta - The delta value from the mouse event. */ scrollPresentationMode: function pdfViewScrollPresentationMode(delta) { if (!this.pdfPresentationMode) { return; } this.pdfPresentationMode.mouseScroll(delta); } }; var HOSTED_VIEWER_ORIGINS = ['null', 'http://mozilla.github.io', 'https://mozilla.github.io']; function validateFileURL(file) { try { var viewerOrigin = new URL(window.location.href).origin || 'null'; if (HOSTED_VIEWER_ORIGINS.indexOf(viewerOrigin) >= 0) { // Hosted or local viewer, allow for any file locations return; } var fileOrigin = new URL(file, window.location.href).origin; // Removing of the following line will not guarantee that the viewer will // start accepting URLs from foreign origin -- CORS headers on the remote // server must be properly configured. if (fileOrigin !== viewerOrigin) { throw new Error('file origin does not match viewer\'s'); } } catch (e) { var message = e && e.message; var loadingErrorMessage = mozL10n.get('loading_error', null, 'An error occurred while loading the PDF.'); var moreInfo = { message: message }; PDFViewerApplication.error(loadingErrorMessage, moreInfo); throw e; } } function webViewerInitialized() { var queryString = document.location.search.substring(1); var params = parseQueryString(queryString); var file = 'file' in params ? params.file : DEFAULT_URL; validateFileURL(file); var fileInput = document.createElement('input'); fileInput.id = 'fileInput'; fileInput.className = 'fileInput'; fileInput.setAttribute('type', 'file'); fileInput.oncontextmenu = noContextMenuHandler; document.body.appendChild(fileInput); if (!window.File || !window.FileReader || !window.FileList || !window.Blob) { document.getElementById('openFile').setAttribute('hidden', 'true'); document.getElementById('secondaryOpenFile').setAttribute('hidden', 'true'); } else { document.getElementById('fileInput').value = null; } var PDFJS = pdfjsLib.PDFJS; if (PDFViewerApplication.preferencePdfBugEnabled) { // Special debugging flags in the hash section of the URL. var hash = document.location.hash.substring(1); var hashParams = parseQueryString(hash); if ('disableworker' in hashParams) { PDFJS.disableWorker = (hashParams['disableworker'] === 'true'); } if ('disablerange' in hashParams) { PDFJS.disableRange = (hashParams['disablerange'] === 'true'); } if ('disablestream' in hashParams) { PDFJS.disableStream = (hashParams['disablestream'] === 'true'); } if ('disableautofetch' in hashParams) { PDFJS.disableAutoFetch = (hashParams['disableautofetch'] === 'true'); } if ('disablefontface' in hashParams) { PDFJS.disableFontFace = (hashParams['disablefontface'] === 'true'); } if ('disablehistory' in hashParams) { PDFJS.disableHistory = (hashParams['disablehistory'] === 'true'); } if ('webgl' in hashParams) { PDFJS.disableWebGL = (hashParams['webgl'] !== 'true'); } if ('useonlycsszoom' in hashParams) { PDFJS.useOnlyCssZoom = (hashParams['useonlycsszoom'] === 'true'); } if ('verbosity' in hashParams) { PDFJS.verbosity = hashParams['verbosity'] | 0; } if ('ignorecurrentpositiononzoom' in hashParams) { PDFJS.ignoreCurrentPositionOnZoom = (hashParams['ignorecurrentpositiononzoom'] === 'true'); } if ('locale' in hashParams) { PDFJS.locale = hashParams['locale']; } if ('textlayer' in hashParams) { switch (hashParams['textlayer']) { case 'off': PDFJS.disableTextLayer = true; break; case 'visible': case 'shadow': case 'hover': var viewer = document.getElementById('viewer'); viewer.classList.add('textLayer-' + hashParams['textlayer']); break; } } if ('pdfbug' in hashParams) { PDFJS.pdfBug = true; var pdfBug = hashParams['pdfbug']; var enabled = pdfBug.split(','); PDFBug.enable(enabled); PDFBug.init(pdfjsLib); } } mozL10n.setLanguage(PDFJS.locale); if (!PDFViewerApplication.supportsPrinting) { document.getElementById('print').classList.add('hidden'); document.getElementById('secondaryPrint').classList.add('hidden'); } if (!PDFViewerApplication.supportsFullscreen) { document.getElementById('presentationMode').classList.add('hidden'); document.getElementById('secondaryPresentationMode'). classList.add('hidden'); } if (PDFViewerApplication.supportsIntegratedFind) { document.getElementById('viewFind').classList.add('hidden'); } // Suppress context menus for some controls document.getElementById('scaleSelect').oncontextmenu = noContextMenuHandler; document.getElementById('mainContainer').addEventListener('transitionend', function(e) { if (e.target === /* mainContainer */ this) { var event = document.createEvent('UIEvents'); event.initUIEvent('resize', false, false, window, 0); window.dispatchEvent(event); } }, true); document.getElementById('sidebarToggle').addEventListener('click', function() { PDFViewerApplication.pdfSidebar.toggle(); }); document.getElementById('previous').addEventListener('click', function() { PDFViewerApplication.page--; }); document.getElementById('next').addEventListener('click', function() { PDFViewerApplication.page++; }); document.getElementById('zoomIn').addEventListener('click', function() { PDFViewerApplication.zoomIn(); }); document.getElementById('zoomOut').addEventListener('click', function() { PDFViewerApplication.zoomOut(); }); document.getElementById('pageNumber').addEventListener('click', function() { this.select(); }); document.getElementById('pageNumber').addEventListener('change', function() { // Handle the user inputting a floating point number. PDFViewerApplication.page = (this.value | 0); if (this.value !== (this.value | 0).toString()) { this.value = PDFViewerApplication.page; } }); document.getElementById('scaleSelect').addEventListener('change', function() { if (this.value === 'custom') { return; } PDFViewerApplication.pdfViewer.currentScaleValue = this.value; }); document.getElementById('presentationMode').addEventListener('click', SecondaryToolbar.presentationModeClick.bind(SecondaryToolbar)); document.getElementById('openFile').addEventListener('click', SecondaryToolbar.openFileClick.bind(SecondaryToolbar)); document.getElementById('print').addEventListener('click', SecondaryToolbar.printClick.bind(SecondaryToolbar)); document.getElementById('download').addEventListener('click', SecondaryToolbar.downloadClick.bind(SecondaryToolbar)); if (file && file.lastIndexOf('file:', 0) === 0) { // file:-scheme. Load the contents in the main thread because QtWebKit // cannot load file:-URLs in a Web Worker. file:-URLs are usually loaded // very quickly, so there is no need to set up progress event listeners. PDFViewerApplication.setTitleUsingUrl(file); var xhr = new XMLHttpRequest(); xhr.onload = function() { PDFViewerApplication.open(new Uint8Array(xhr.response)); }; try { xhr.open('GET', file); xhr.responseType = 'arraybuffer'; xhr.send(); } catch (e) { PDFViewerApplication.error(mozL10n.get('loading_error', null, 'An error occurred while loading the PDF.'), e); } return; } if (file) { PDFViewerApplication.open(file); } } document.addEventListener('pagerendered', function (e) { var pageNumber = e.detail.pageNumber; var pageIndex = pageNumber - 1; var pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex); // Use the rendered page to set the corresponding thumbnail image. if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) { var thumbnailView = PDFViewerApplication.pdfThumbnailViewer. getThumbnail(pageIndex); thumbnailView.setImage(pageView); } if (pdfjsLib.PDFJS.pdfBug && Stats.enabled && pageView.stats) { Stats.add(pageNumber, pageView.stats); } if (pageView.error) { PDFViewerApplication.error(mozL10n.get('rendering_error', null, 'An error occurred while rendering the page.'), pageView.error); } // If the page is still visible when it has finished rendering, // ensure that the page number input loading indicator is hidden. if (pageNumber === PDFViewerApplication.page) { var pageNumberInput = document.getElementById('pageNumber'); pageNumberInput.classList.remove(PAGE_NUMBER_LOADING_INDICATOR); } }, true); document.addEventListener('textlayerrendered', function (e) { var pageIndex = e.detail.pageNumber - 1; var pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex); }, true); document.addEventListener('pagemode', function (evt) { if (!PDFViewerApplication.initialized) { return; } // Handle the 'pagemode' hash parameter, see also `PDFLinkService_setHash`. var mode = evt.detail.mode, view; switch (mode) { case 'thumbs': view = SidebarView.THUMBS; break; case 'bookmarks': case 'outline': view = SidebarView.OUTLINE; break; case 'attachments': view = SidebarView.ATTACHMENTS; break; case 'none': view = SidebarView.NONE; break; default: console.error('Invalid "pagemode" hash parameter: ' + mode); return; } PDFViewerApplication.pdfSidebar.switchView(view, /* forceOpen = */ true); }, true); document.addEventListener('namedaction', function (e) { if (!PDFViewerApplication.initialized) { return; } // Processing couple of named actions that might be useful. // See also PDFLinkService.executeNamedAction var action = e.detail.action; switch (action) { case 'GoToPage': document.getElementById('pageNumber').focus(); break; case 'Find': if (!PDFViewerApplication.supportsIntegratedFind) { PDFViewerApplication.findBar.toggle(); } break; } }, true); window.addEventListener('presentationmodechanged', function (e) { var active = e.detail.active; var switchInProgress = e.detail.switchInProgress; PDFViewerApplication.pdfViewer.presentationModeState = switchInProgress ? PresentationModeState.CHANGING : active ? PresentationModeState.FULLSCREEN : PresentationModeState.NORMAL; }); window.addEventListener('updateviewarea', function (evt) { if (!PDFViewerApplication.initialized) { return; } var location = evt.location; PDFViewerApplication.store.initializedPromise.then(function() { PDFViewerApplication.store.setMultiple({ 'exists': true, 'page': location.pageNumber, 'zoom': location.scale, 'scrollLeft': location.left, 'scrollTop': location.top }).catch(function() { // unable to write to storage }); }); var href = PDFViewerApplication.pdfLinkService.getAnchorUrl(location.pdfOpenParams); document.getElementById('viewBookmark').href = href; document.getElementById('secondaryViewBookmark').href = href; // Update the current bookmark in the browsing history. PDFViewerApplication.pdfHistory.updateCurrentBookmark(location.pdfOpenParams, location.pageNumber); // Show/hide the loading indicator in the page number input element. var pageNumberInput = document.getElementById('pageNumber'); var currentPage = PDFViewerApplication.pdfViewer.getPageView(PDFViewerApplication.page - 1); if (currentPage.renderingState === RenderingStates.FINISHED) { pageNumberInput.classList.remove(PAGE_NUMBER_LOADING_INDICATOR); } else { pageNumberInput.classList.add(PAGE_NUMBER_LOADING_INDICATOR); } }, true); window.addEventListener('resize', function webViewerResize(evt) { if (PDFViewerApplication.initialized) { var currentScaleValue = PDFViewerApplication.pdfViewer.currentScaleValue; if (currentScaleValue === 'auto' || currentScaleValue === 'page-fit' || currentScaleValue === 'page-width') { // Note: the scale is constant for 'page-actual'. PDFViewerApplication.pdfViewer.currentScaleValue = currentScaleValue; } else if (!currentScaleValue) { // Normally this shouldn't happen, but if the scale wasn't initialized // we set it to the default value in order to prevent any issues. // (E.g. the document being rendered with the wrong scale on load.) PDFViewerApplication.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE; } PDFViewerApplication.pdfViewer.update(); } // Set the 'max-height' CSS property of the secondary toolbar. SecondaryToolbar.setMaxHeight(document.getElementById('viewerContainer')); }); window.addEventListener('hashchange', function webViewerHashchange(evt) { if (PDFViewerApplication.pdfHistory.isHashChangeUnlocked) { var hash = document.location.hash.substring(1); if (!hash) { return; } if (!PDFViewerApplication.isInitialViewSet) { PDFViewerApplication.initialBookmark = hash; } else { PDFViewerApplication.pdfLinkService.setHash(hash); } } }); window.addEventListener('change', function webViewerChange(evt) { var files = evt.target.files; if (!files || files.length === 0) { return; } var file = files[0]; if (!pdfjsLib.PDFJS.disableCreateObjectURL && typeof URL !== 'undefined' && URL.createObjectURL) { PDFViewerApplication.open(URL.createObjectURL(file)); } else { // Read the local file into a Uint8Array. var fileReader = new FileReader(); fileReader.onload = function webViewerChangeFileReaderOnload(evt) { var buffer = evt.target.result; var uint8Array = new Uint8Array(buffer); PDFViewerApplication.open(uint8Array); }; fileReader.readAsArrayBuffer(file); } PDFViewerApplication.setTitleUsingUrl(file.name); // URL does not reflect proper document location - hiding some icons. document.getElementById('viewBookmark').setAttribute('hidden', 'true'); document.getElementById('secondaryViewBookmark'). setAttribute('hidden', 'true'); document.getElementById('download').setAttribute('hidden', 'true'); document.getElementById('secondaryDownload').setAttribute('hidden', 'true'); }, true); function selectScaleOption(value) { var options = document.getElementById('scaleSelect').options; var predefinedValueFound = false; for (var i = 0, ii = options.length; i < ii; i++) { var option = options[i]; if (option.value !== value) { option.selected = false; continue; } option.selected = true; predefinedValueFound = true; } return predefinedValueFound; } window.addEventListener('localized', function localized(evt) { document.getElementsByTagName('html')[0].dir = mozL10n.getDirection(); PDFViewerApplication.animationStartedPromise.then(function() { // Adjust the width of the zoom box to fit the content. // Note: If the window is narrow enough that the zoom box is not visible, // we temporarily show it to be able to adjust its width. var container = document.getElementById('scaleSelectContainer'); if (container.clientWidth === 0) { container.setAttribute('style', 'display: inherit;'); } if (container.clientWidth > 0) { var select = document.getElementById('scaleSelect'); select.setAttribute('style', 'min-width: inherit;'); var width = select.clientWidth + SCALE_SELECT_CONTAINER_PADDING; select.setAttribute('style', 'min-width: ' + (width + SCALE_SELECT_PADDING) + 'px;'); container.setAttribute('style', 'min-width: ' + width + 'px; ' + 'max-width: ' + width + 'px;'); } // Set the 'max-height' CSS property of the secondary toolbar. SecondaryToolbar.setMaxHeight(document.getElementById('viewerContainer')); }); }, true); window.addEventListener('scalechange', function scalechange(evt) { document.getElementById('zoomOut').disabled = (evt.scale === MIN_SCALE); document.getElementById('zoomIn').disabled = (evt.scale === MAX_SCALE); // Update the 'scaleSelect' DOM element. var predefinedValueFound = selectScaleOption(evt.presetValue || '' + evt.scale); if (!predefinedValueFound) { var customScaleOption = document.getElementById('customScaleOption'); var customScale = Math.round(evt.scale * 10000) / 100; customScaleOption.textContent = mozL10n.get('page_scale_percent', { scale: customScale }, '{{scale}}%'); customScaleOption.selected = true; } if (!PDFViewerApplication.initialized) { return; } PDFViewerApplication.pdfViewer.update(); }, true); window.addEventListener('pagechange', function pagechange(evt) { var page = evt.pageNumber; if (evt.previousPageNumber !== page) { document.getElementById('pageNumber').value = page; if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) { PDFViewerApplication.pdfThumbnailViewer.scrollThumbnailIntoView(page); } } var numPages = PDFViewerApplication.pagesCount; document.getElementById('previous').disabled = (page <= 1); document.getElementById('next').disabled = (page >= numPages); document.getElementById('firstPage').disabled = (page <= 1); document.getElementById('lastPage').disabled = (page >= numPages); // we need to update stats if (pdfjsLib.PDFJS.pdfBug && Stats.enabled) { var pageView = PDFViewerApplication.pdfViewer.getPageView(page - 1); if (pageView.stats) { Stats.add(page, pageView.stats); } } }, true); var zoomDisabled = false, zoomDisabledTimeout; function handleMouseWheel(evt) { var MOUSE_WHEEL_DELTA_FACTOR = 40; var ticks = (evt.type === 'DOMMouseScroll') ? -evt.detail : evt.wheelDelta / MOUSE_WHEEL_DELTA_FACTOR; var direction = (ticks < 0) ? 'zoomOut' : 'zoomIn'; var pdfViewer = PDFViewerApplication.pdfViewer; if (pdfViewer.isInPresentationMode) { evt.preventDefault(); PDFViewerApplication.scrollPresentationMode(ticks * MOUSE_WHEEL_DELTA_FACTOR); } else if (evt.ctrlKey || evt.metaKey) { var support = PDFViewerApplication.supportedMouseWheelZoomModifierKeys; if ((evt.ctrlKey && !support.ctrlKey) || (evt.metaKey && !support.metaKey)) { return; } // Only zoom the pages, not the entire viewer. evt.preventDefault(); // NOTE: this check must be placed *after* preventDefault. if (zoomDisabled) { return; } var previousScale = pdfViewer.currentScale; PDFViewerApplication[direction](Math.abs(ticks)); var currentScale = pdfViewer.currentScale; if (previousScale !== currentScale) { // After scaling the page via zoomIn/zoomOut, the position of the upper- // left corner is restored. When the mouse wheel is used, the position // under the cursor should be restored instead. var scaleCorrectionFactor = currentScale / previousScale - 1; var rect = pdfViewer.container.getBoundingClientRect(); var dx = evt.clientX - rect.left; var dy = evt.clientY - rect.top; pdfViewer.container.scrollLeft += dx * scaleCorrectionFactor; pdfViewer.container.scrollTop += dy * scaleCorrectionFactor; } } else { zoomDisabled = true; clearTimeout(zoomDisabledTimeout); zoomDisabledTimeout = setTimeout(function () { zoomDisabled = false; }, 1000); } } window.addEventListener('DOMMouseScroll', handleMouseWheel); window.addEventListener('mousewheel', handleMouseWheel); window.addEventListener('click', function click(evt) { if (SecondaryToolbar.opened && PDFViewerApplication.pdfViewer.containsElement(evt.target)) { SecondaryToolbar.close(); } }, false); window.addEventListener('keydown', function keydown(evt) { if (OverlayManager.active) { return; } var handled = false; var cmd = (evt.ctrlKey ? 1 : 0) | (evt.altKey ? 2 : 0) | (evt.shiftKey ? 4 : 0) | (evt.metaKey ? 8 : 0); var pdfViewer = PDFViewerApplication.pdfViewer; var isViewerInPresentationMode = pdfViewer && pdfViewer.isInPresentationMode; // First, handle the key bindings that are independent whether an input // control is selected or not. if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) { // either CTRL or META key with optional SHIFT. switch (evt.keyCode) { case 70: // f if (!PDFViewerApplication.supportsIntegratedFind) { PDFViewerApplication.findBar.open(); handled = true; } break; case 71: // g if (!PDFViewerApplication.supportsIntegratedFind) { PDFViewerApplication.findBar.dispatchEvent('again', cmd === 5 || cmd === 12); handled = true; } break; case 61: // FF/Mac '=' case 107: // FF '+' and '=' case 187: // Chrome '+' case 171: // FF with German keyboard if (!isViewerInPresentationMode) { PDFViewerApplication.zoomIn(); } handled = true; break; case 173: // FF/Mac '-' case 109: // FF '-' case 189: // Chrome '-' if (!isViewerInPresentationMode) { PDFViewerApplication.zoomOut(); } handled = true; break; case 48: // '0' case 96: // '0' on Numpad of Swedish keyboard if (!isViewerInPresentationMode) { // keeping it unhandled (to restore page zoom to 100%) setTimeout(function () { // ... and resetting the scale after browser adjusts its scale pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE; }); handled = false; } break; } } // CTRL or META without shift if (cmd === 1 || cmd === 8) { switch (evt.keyCode) { case 83: // s PDFViewerApplication.download(); handled = true; break; } } // CTRL+ALT or Option+Command if (cmd === 3 || cmd === 10) { switch (evt.keyCode) { case 80: // p PDFViewerApplication.requestPresentationMode(); handled = true; break; case 71: // g // focuses input#pageNumber field document.getElementById('pageNumber').select(); handled = true; break; } } if (handled) { evt.preventDefault(); return; } // Some shortcuts should not get handled if a control/input element // is selected. var curElement = document.activeElement || document.querySelector(':focus'); var curElementTagName = curElement && curElement.tagName.toUpperCase(); if (curElementTagName === 'INPUT' || curElementTagName === 'TEXTAREA' || curElementTagName === 'SELECT') { // Make sure that the secondary toolbar is closed when Escape is pressed. if (evt.keyCode !== 27) { // 'Esc' return; } } var ensureViewerFocused = false; if (cmd === 0) { // no control key pressed at all. switch (evt.keyCode) { case 38: // up arrow case 33: // pg up case 8: // backspace if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== 'page-fit') { break; } /* in presentation mode */ /* falls through */ case 37: // left arrow // horizontal scrolling using arrow keys if (pdfViewer.isHorizontalScrollbarEnabled) { break; } /* falls through */ case 75: // 'k' case 80: // 'p' PDFViewerApplication.page--; handled = true; break; case 27: // esc key if (SecondaryToolbar.opened) { SecondaryToolbar.close(); handled = true; } if (!PDFViewerApplication.supportsIntegratedFind && PDFViewerApplication.findBar.opened) { PDFViewerApplication.findBar.close(); handled = true; } break; case 40: // down arrow case 34: // pg down case 32: // spacebar if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== 'page-fit') { break; } /* falls through */ case 39: // right arrow // horizontal scrolling using arrow keys if (pdfViewer.isHorizontalScrollbarEnabled) { break; } /* falls through */ case 74: // 'j' case 78: // 'n' PDFViewerApplication.page++; handled = true; break; case 36: // home if (isViewerInPresentationMode || PDFViewerApplication.page > 1) { PDFViewerApplication.page = 1; handled = true; ensureViewerFocused = true; } break; case 35: // end if (isViewerInPresentationMode || (PDFViewerApplication.pdfDocument && PDFViewerApplication.page < PDFViewerApplication.pagesCount)) { PDFViewerApplication.page = PDFViewerApplication.pagesCount; handled = true; ensureViewerFocused = true; } break; case 72: // 'h' if (!isViewerInPresentationMode) { HandTool.toggle(); } break; case 82: // 'r' PDFViewerApplication.rotatePages(90); break; } } if (cmd === 4) { // shift-key switch (evt.keyCode) { case 32: // spacebar if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== 'page-fit') { break; } PDFViewerApplication.page--; handled = true; break; case 82: // 'r' PDFViewerApplication.rotatePages(-90); break; } } if (!handled && !isViewerInPresentationMode) { // 33=Page Up 34=Page Down 35=End 36=Home // 37=Left 38=Up 39=Right 40=Down // 32=Spacebar if ((evt.keyCode >= 33 && evt.keyCode <= 40) || (evt.keyCode === 32 && curElementTagName !== 'BUTTON')) { ensureViewerFocused = true; } } if (cmd === 2) { // alt-key switch (evt.keyCode) { case 37: // left arrow if (isViewerInPresentationMode) { PDFViewerApplication.pdfHistory.back(); handled = true; } break; case 39: // right arrow if (isViewerInPresentationMode) { PDFViewerApplication.pdfHistory.forward(); handled = true; } break; } } if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) { // The page container is not focused, but a page navigation key has been // pressed. Change the focus to the viewer container to make sure that // navigation by keyboard works as expected. pdfViewer.focus(); } if (handled) { evt.preventDefault(); } }); window.addEventListener('beforeprint', function beforePrint(evt) { PDFViewerApplication.beforePrint(); }); window.addEventListener('afterprint', function afterPrint(evt) { PDFViewerApplication.afterPrint(); }); (function animationStartedClosure() { // The offsetParent is not set until the pdf.js iframe or object is visible. // Waiting for first animation. PDFViewerApplication.animationStartedPromise = new Promise( function (resolve) { window.requestAnimationFrame(resolve); }); })(); exports.PDFViewerApplication = PDFViewerApplication; // TODO remove circular reference of pdfjs-web/secondary_toolbar on app. secondaryToolbarLib._setApp(exports); })); }).call(pdfjsWebLibs); function webViewerLoad() { window.PDFViewerApplication = pdfjsWebLibs.pdfjsWebApp.PDFViewerApplication; pdfjsWebLibs.pdfjsWebApp.PDFViewerApplication.run(); } document.addEventListener('DOMContentLoaded', webViewerLoad, true); manuskript-0.10.0/makefile000066400000000000000000000017561354442177200155070ustar00rootroot00000000000000UI := $(wildcard manuskript/ui/*.ui) $(wildcard manuskript/ui/*/*.ui) $(wildcard manuskript/ui/*/*/*.ui) $(wildcard manuskript/ui/*.qrc) UIs= $(UI:.ui=.py) $(UI:.qrc=_rc.py) TS := $(wildcard i18n/*.ts) QMs= $(TS:.ts=.qm) ui: $(UIs) run: $(UIs) # python3 manuskript/main.py bin/manuskript debug: $(UIs) gdb --args python3 bin/manuskript lineprof: kernprof -l -v bin/manuskript profile: python3 -m cProfile -s 'cumtime' bin/manuskript | more compile: cd manuskript && python3 setup.py build_ext --inplace callgraph: cd manuskript; pycallgraph myoutput -- main.py translation: pylupdate5 -noobsolete i18n/manuskript.pro linguist: linguist i18n/manuskript_fr.ts lrelease i18n/manuskript_fr.ts i18n: $(QMs) pyinstaller: python3 /usr/local/bin/pyinstaller manuskript.spec snappkg: snapcraft snap stats: python3 libs/gh-release-stats.py olivierkes manuskript -d %_rc.py : %.qrc pyrcc5 "$<" -o "$@" %.py : %.ui # pyuic4 "$<" > "$@" pyuic5 "$<" > "$@" %.qm: %.ts lrelease "$<" manuskript-0.10.0/manuskript.spec000066400000000000000000000021401354442177200170440ustar00rootroot00000000000000# -*- mode: python -*- block_cipher = None a = Analysis(['bin/manuskript'], pathex=['.'], binaries=None, datas=[ ("icons", "icons"), ("libs", "libs"), ("resources", "resources"), ("sample-projects", "sample-projects"), ("i18n", "i18n"), ], hiddenimports=["xml.dom"], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, exclude_binaries=True, name='manuskript', debug=False, strip=False, upx=True, console=True, icon=os.path.join(SPECPATH, 'icons/Manuskript/manuskript.ico') ) coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, name='manuskript') manuskript-0.10.0/manuskript/000077500000000000000000000000001354442177200161735ustar00rootroot00000000000000manuskript-0.10.0/manuskript/__init__.py000066400000000000000000000000001354442177200202720ustar00rootroot00000000000000manuskript-0.10.0/manuskript/converters/000077500000000000000000000000001354442177200203655ustar00rootroot00000000000000manuskript-0.10.0/manuskript/converters/__init__.py000066400000000000000000000020031354442177200224710ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- """ The converters package provide functions to quickly convert on the fly from one format to another. It is responsible to check what external library are present, and do the job as best as possible with what we have in hand. """ from manuskript.converters.abstractConverter import abstractConverter from manuskript.converters.pandocConverter import pandocConverter #from manuskript.converters.markdownConverter import markdownConverter def HTML2MD(html): # Convert using pandoc if pandocConverter.isValid(): return pandocConverter.convert(html, _from="html", to="markdown") # Convert to plain text using QTextEdit return HTML2PlainText(html) def HTML2PlainText(html): """ Convert from HTML to plain text. """ if pandocConverter.isValid(): return pandocConverter.convert(html, _from="html", to="plain") # Last resort: probably resource inefficient e = QTextEdit() e.setHtml(html) return e.toPlainText() manuskript-0.10.0/manuskript/converters/abstractConverter.py000066400000000000000000000010151354442177200244270ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- class abstractConverter: """ A converter is used to convert (duh) between stuff. They provide access to external libraries that may or may not be present. Now, things are a bit messy, since classes in `exporter` (and `importer` to a lesser extent) do the same. In a better world, classes from `exporter` and `importer` would use converters to do their stuff. (TODO) """ name = "" @classmethod def isValid(cls): return False manuskript-0.10.0/manuskript/converters/markdownConverter.py000066400000000000000000000014461354442177200244560ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import os import shutil import subprocess from PyQt5.QtCore import Qt from PyQt5.QtWidgets import qApp, QMessageBox from PyQt5.QtGui import QCursor from manuskript.converters import abstractConverter from manuskript.functions import mainWindow try: import markdown as MD except ImportError: MD = None class markdownConverter(abstractConverter): """ Converter using python module markdown. """ name = "python module markdown" @classmethod def isValid(self): return MD is not None @classmethod def convert(self, markdown): if not self.isValid: print("ERROR: markdownConverter is called but not valid.") return "" html = MD.markdown(markdown) return html manuskript-0.10.0/manuskript/converters/pandocConverter.py000066400000000000000000000041131354442177200240720ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import os import shutil import subprocess from PyQt5.QtCore import Qt from PyQt5.QtWidgets import qApp, QMessageBox from PyQt5.QtGui import QCursor from manuskript.converters import abstractConverter from manuskript.functions import mainWindow class pandocConverter(abstractConverter): name = "pandoc" cmd = "pandoc" @classmethod def isValid(self): if self.path() != None: return 2 elif self.customPath() and os.path.exists(self.customPath): return 1 else: return 0 @classmethod def customPath(self): settings = QSettings() return settings.value("Exporters/{}_customPath".format(self.name), "") @classmethod def path(self): return shutil.which(self.cmd) @classmethod def convert(self, src, _from="markdown", to="html", args=None, outputfile=None): if not self.isValid: print("ERROR: pandocConverter is called but not valid.") return "" cmd = [self.runCmd()] cmd += ["--from={}".format(_from)] cmd += ["--to={}".format(to)] if args: cmd += args if outputfile: cmd.append("--output={}".format(outputfile)) qApp.setOverrideCursor(QCursor(Qt.WaitCursor)) p = subprocess.Popen( cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) if not type(src) == bytes: src = src.encode("utf-8") # assumes utf-8 stdout, stderr = p.communicate(src) qApp.restoreOverrideCursor() if stderr: err = stderr.decode("utf-8") print(err) QMessageBox.critical(mainWindow().dialog, qApp.translate("Export", "Error"), err) return None return stdout.decode("utf-8") @classmethod def runCmd(self): if self.isValid() == 2: return self.cmd elif self.isValid() == 1: return self.customPath manuskript-0.10.0/manuskript/enums.py000066400000000000000000000021651354442177200177000ustar00rootroot00000000000000#!/usr/bin/env python #--!-- coding: utf8 --!-- from enum import IntEnum class Character(IntEnum): name = 0 ID = 1 importance = 2 motivation = 3 goal = 4 conflict = 5 epiphany = 6 summarySentence = 7 summaryPara = 8 summaryFull = 9 notes = 10 class Plot(IntEnum): name = 0 ID = 1 importance = 2 characters = 3 description = 4 result = 5 steps = 6 summary = 7 class PlotStep(IntEnum): name = 0 ID = 1 meta = 2 summary = 3 class World(IntEnum): name = 0 ID = 1 description = 2 passion = 3 conflict = 4 class Outline(IntEnum): title = 0 ID = 1 type = 2 summarySentence = 3 summaryFull = 4 POV = 5 notes = 6 label = 7 status = 8 compile = 9 text = 10 wordCount = 11 goal = 12 goalPercentage = 13 setGoal = 14 # The goal set by the user, if any. Can be different from goal which can be computed # (sum of all sub-items' goals) textFormat = 15 revisions = 16 customIcon = 17 class Abstract(IntEnum): title = 0 ID = 1 type = 2 manuskript-0.10.0/manuskript/exporter/000077500000000000000000000000001354442177200200435ustar00rootroot00000000000000manuskript-0.10.0/manuskript/exporter/__init__.py000066400000000000000000000005351354442177200221570ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from manuskript.exporter.manuskript import manuskriptExporter from manuskript.exporter.pandoc import pandocExporter exporters = [ manuskriptExporter(), pandocExporter() ] def getExporterByName(name): for e in exporters: if e.name == name: return e return None manuskript-0.10.0/manuskript/exporter/basic.py000066400000000000000000000064241354442177200215040ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import os import shutil import subprocess from PyQt5.QtCore import QSettings from PyQt5.QtWidgets import QWidget from manuskript.models import outlineItem from manuskript.functions import mainWindow class basicExporter: name = "" description = "" exportTo = [] cmd = "" customPath = "" icon = "" absentTip = "" # A tip displayed when exporter is absent. absentURL = "" # URL to open if exporter is absent. def __init__(self): settings = QSettings() self.customPath = settings.value("Exporters/{}_customPath".format(self.name), "") def setCustomPath(self, path): self.customPath = path settings = QSettings() settings.setValue("Exporters/{}_customPath".format(self.name), self.customPath) def getFormatByName(self, name): for f in self.exportTo: if f.name == name: return f return None def isValid(self): if self.path() != None: return 2 elif self.customPath and os.path.exists(self.customPath): return 1 else: return 0 def version(self): return "" def path(self): return shutil.which(self.cmd) def run(self, args): if self.isValid() == 2: run = self.cmd elif self.isValid() == 1: run = self.customPath else: print("Error: no command for", self.name) return None r = subprocess.check_output([run] + args) # timeout=.2 return r.decode("utf-8") # Example of how to run a command # # cmdl = ['txt2tags', '-t', target, '--enc=utf-8', '--no-headers', '-o', '-', '-'] # # cmd = subprocess.Popen(('echo', text), stdout=subprocess.PIPE) # try: # output = subprocess.check_output(cmdl, stdin=cmd.stdout, stderr=subprocess.STDOUT) # , cwd="/tmp" # except subprocess.CalledProcessError as e: # print("Error!") # return text # cmd.wait() # # return output.decode("utf-8") class basicFormat: implemented = False InvalidBecause = "" requires = { "Settings": False, "Preview": False, } icon = "" def __init__(self, name, description="", icon=""): self.name = name self.description = description self.icon = icon @classmethod def settingsWidget(cls): return QWidget() @classmethod def previewWidget(cls): return QWidget() @classmethod def preview(cls, settingsWidget, previewWidget): pass @classmethod def export(cls, settingsWidget): pass @classmethod def shortcodes(cls): return [ ("\n", "\\n") ] @classmethod def escapes(cls, text): for A, B in cls.shortcodes(): text = text.replace(A, B) return text @classmethod def descapes(cls, text): """How do we call that?""" for A, B in cls.shortcodes(): text = text.replace(B, A) return text @classmethod def isValid(cls): return True @classmethod def projectPath(cls): return os.path.dirname(os.path.abspath(mainWindow().currentProject)) manuskript-0.10.0/manuskript/exporter/manuskript/000077500000000000000000000000001354442177200222405ustar00rootroot00000000000000manuskript-0.10.0/manuskript/exporter/manuskript/HTML.py000066400000000000000000000054331354442177200233630ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import Qt, QUrl from PyQt5.QtWidgets import QPlainTextEdit, qApp, QTabWidget, QFrame, QTextEdit from manuskript.exporter.manuskript.markdown import markdown, markdownSettings from manuskript.ui.views.webView import webView from manuskript.ui.exporters.manuskript.plainTextSettings import exporterSettings import os try: import markdown as MD except ImportError: MD = None class HTML(markdown): name = "HTML" description = qApp.translate("Export", "Basic HTML output using the Python module 'markdown'.") InvalidBecause = qApp.translate("Export", "Python module 'markdown'.") icon = "text-html" exportVarName = "lastManuskriptHTML" exportFilter = "HTML files (*.html);; Any files (*)" exportDefaultSuffix = ".html" def isValid(self): return MD is not None def settingsWidget(self): w = markdownSettings(self) w.loadSettings() return w def previewWidget(self): t = QTabWidget() t.setDocumentMode(True) t.setStyleSheet(""" QTabBar::tab{ background-color: #BBB; padding: 3px 25px; border: none; } QTabBar::tab:selected, QTabBar::tab:hover{ background-color:skyblue; } """) w0 = QPlainTextEdit() w0.setFrameShape(QFrame.NoFrame) w0.setReadOnly(True) w1 = QPlainTextEdit() w1.setFrameShape(QFrame.NoFrame) w1.setReadOnly(True) t.addTab(w0, qApp.translate("Export", "Markdown source")) t.addTab(w1, qApp.translate("Export", "HTML Source")) if webView: w2 = webView() t.addTab(w2, qApp.translate("Export", "HTML Output")) t.setCurrentIndex(2) return t def output(self, settingsWidget): html = MD.markdown(markdown.output(self, settingsWidget)) return html def preview(self, settingsWidget, previewWidget): settings = settingsWidget.getSettings() # Save settings settingsWidget.writeSettings() md = markdown.output(self, settingsWidget) html = MD.markdown(md) path = os.path.join(self.projectPath(), "dummy.html") self.preparesTextEditView(previewWidget.widget(0), settings["Preview"]["PreviewFont"]) self.preparesTextEditViewMarkdown(previewWidget.widget(0), settings) previewWidget.widget(0).setPlainText(md) self.preparesTextEditView(previewWidget.widget(1), settings["Preview"]["PreviewFont"]) previewWidget.widget(1).setPlainText(html) w2 = previewWidget.widget(2) if isinstance(w2, QTextEdit): w2.setHtml(html) else: w2.setHtml(html, QUrl.fromLocalFile(path)) manuskript-0.10.0/manuskript/exporter/manuskript/__init__.py000066400000000000000000000014421354442177200243520ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtWidgets import QTextEdit, qApp from manuskript.exporter.basic import basicExporter, basicFormat from manuskript.exporter.manuskript.HTML import HTML from manuskript.exporter.manuskript.markdown import markdown from manuskript.exporter.manuskript.plainText import plainText from manuskript.functions import appPath class manuskriptExporter(basicExporter): name = "Manuskript" description = qApp.translate("Export", "Default exporter, provides basic formats used by other exporters.") exportTo = [ plainText(), markdown(), HTML(), basicFormat("OPML", icon="text-x-opml+xml") ] icon = appPath("icons/Manuskript/icon-256px.png") @classmethod def isValid(cls): return Truemanuskript-0.10.0/manuskript/exporter/manuskript/markdown.py000066400000000000000000000053251354442177200244410ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtGui import QTextCharFormat, QFont from PyQt5.QtWidgets import QPlainTextEdit, QGroupBox, qApp, QVBoxLayout, QCheckBox from manuskript.exporter.manuskript.plainText import plainText from manuskript.functions import mainWindow from manuskript.ui.highlighters import MMDHighlighter from manuskript.ui.exporters.manuskript.plainTextSettings import exporterSettings class markdown(plainText): name = "Markdown" description = qApp.translate("Export", """Just like plain text, excepts adds markdown titles. Presupposes that texts are formatted in markdown.""") exportVarName = "lastManuskriptMarkdown" exportFilter = "Markdown files (*.md);; Any files (*)" exportDefaultSuffix = ".md" icon = "text-x-markdown" def settingsWidget(self): w = markdownSettings(self) w.loadSettings() return w def preparesTextEditViewMarkdown(self, view, settings): if settings["Preview"]["MarkdownHighlighter"]: self.highlighter = MMDHighlighter(view) else: self.highlighter = None def preview(self, settingsWidget, previewWidget): settings = settingsWidget.getSettings() # Save settings settingsWidget.writeSettings() # Prepares text edit self.preparesTextEditViewMarkdown(previewWidget, settingsWidget.settings) self.preparesTextEditView(previewWidget, settings["Preview"]["PreviewFont"]) previewWidget.setPlainText(self.output(settingsWidget)) def processTitle(self, text, level, settings): return "{} {}\n".format( "#" * (level + 1), text ) class markdownSettings(exporterSettings): def __init__(self, _format, parent=None): exporterSettings.__init__(self, _format, parent) # Adds markdown syntax highlighter setting w = self.toolBox.widget(self.toolBox.count() - 1) self.grpMarkdown = QGroupBox(self.tr("Markdown")) self.grpMarkdown.setLayout(QVBoxLayout()) self.chkMarkdownHighlighter = QCheckBox(qApp.translate("Export", "Preview with highlighter.")) self.grpMarkdown.layout().addWidget(self.chkMarkdownHighlighter) w.layout().insertWidget(w.layout().count() - 1, self.grpMarkdown) def updateFromSettings(self): exporterSettings.updateFromSettings(self) s = self.settings["Preview"] val = s.get("MarkdownHighlighter", False) self.chkMarkdownHighlighter.setChecked(val) def getSettings(self): self.settings = exporterSettings.getSettings(self) self.settings["Preview"]["MarkdownHighlighter"] = self.chkMarkdownHighlighter.isChecked() return self.settings manuskript-0.10.0/manuskript/exporter/manuskript/plainText.py000066400000000000000000000153311354442177200245650ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import re from PyQt5.QtGui import QFont, QTextCharFormat from PyQt5.QtWidgets import QPlainTextEdit, qApp, QFrame, QFileDialog, QMessageBox from manuskript.exporter.basic import basicFormat from manuskript.functions import mainWindow, getSaveFileNameWithSuffix from manuskript.models import outlineItem from manuskript.ui.exporters.manuskript.plainTextSettings import exporterSettings import codecs class plainText(basicFormat): name = qApp.translate("Export", "Plain text") description = qApp.translate("Export", """Simplest export to plain text. Allows you to use your own markup not understood by Manuskript, for example Fountain.""") implemented = True requires = { "Settings": True, "Preview": True, } icon = "text-plain" # Default settings used in self.getExportFilename. For easy subclassing when exporting plaintext. exportVarName = "lastPlainText" exportFilter = "Text files (*.txt);; Any files (*)" exportDefaultSuffix = ".txt" # qt ignores the period, but it is clearer in our code to have it def __init__(self): pass def settingsWidget(self): w = exporterSettings(self) w.loadSettings() return w def previewWidget(self): w = QPlainTextEdit() w.setFrameShape(QFrame.NoFrame) w.setReadOnly(True) return w def output(self, settingsWidget): settings = settingsWidget.getSettings() try: return self.concatenate(mainWindow().mdlOutline.rootItem, settings) except re.error as e: QMessageBox.warning(mainWindow().dialog, qApp.translate("Export", "Error"), qApp.translate("Export", "Could not process regular expression: \n{}").format(str(e))) return "" def getExportFilename(self, settingsWidget, varName=None, filter=None): if varName is None: varName = self.exportVarName if filter is None: filter = self.exportFilter settings = settingsWidget.getSettings() s = settings.get("Output", {}) if varName in s: filename = s[varName] else: filename = "" filename, filter = getSaveFileNameWithSuffix(settingsWidget.parent(), caption=qApp.translate("Export", "Choose output file…"), filter=filter, directory=filename, defaultSuffix=self.exportDefaultSuffix) if filename: s[varName] = filename settingsWidget.settings["Output"] = s # Save settings settingsWidget.writeSettings() return filename def export(self, settingsWidget): settings = settingsWidget.getSettings() filename = self.getExportFilename(settingsWidget) if filename: settingsWidget.writeSettings() content = self.output(settingsWidget) if not content: print("Error: No content. Nothing saved.") return with open(filename, "w", encoding='utf8') as f: f.write(content) def preview(self, settingsWidget, previewWidget): settings = settingsWidget.getSettings() # Save settings settingsWidget.writeSettings() r = self.output(settingsWidget) # Set preview font self.preparesTextEditView(previewWidget, settings["Preview"]["PreviewFont"]) previewWidget.setPlainText(r) def preparesTextEditView(self, view, textFont): cf = QTextCharFormat() f = QFont() f.fromString(textFont) cf.setFont(f) view.setCurrentCharFormat(cf) def concatenate(self, item: outlineItem, settings) -> str: s = settings r = "" # Do we include item if not item.compile() or s["Content"]["IgnoreCompile"]: return "" # What do we include l = item.level() if l >= 0: # item is not root if item.isFolder(): if not s["Content"]["More"] and s["Content"]["FolderTitle"] or\ s["Content"]["More"] and s["Content"]["FolderTitle"][l]: r += self.processTitle(item.title(), l, settings) elif item.isText(): if not s["Content"]["More"] and s["Content"]["TextTitle"] or \ s["Content"]["More"] and s["Content"]["TextTitle"][l]: r += self.processTitle(item.title(), l, settings) if not s["Content"]["More"] and s["Content"]["TextText"] or \ s["Content"]["More"] and s["Content"]["TextText"][l]: r += self.processText(item.text(), settings) content = "" # Add item children last = None for c in item.children(): # Separator if last: # Between folder if last == c.type() == "folder": content += s["Separator"]["FF"] elif last == c.type() == "md": content += s["Separator"]["TT"] elif last == "folder" and c.type() == "md": content += s["Separator"]["FT"] elif last == "md" and c.type() == "folder": content += s["Separator"]["TF"] content += self.concatenate(c, settings) last = c.type() # r += self.processContent(content, settings) r += content return r def processTitle(self, text, level, settings): return text + "\n" def processText(self, content, settings): s = settings["Transform"] if s["Dash"]: content = content.replace("---", "—") if s["Ellipse"]: content = content.replace("...", "…") if s["Spaces"]: o = "" while o != content: o = content content = content.replace(" ", " ") if s["DoubleQuotes"]: q = s["DoubleQuotes"].split("___") s["Custom"].append([True, '"(.*?)"', "{}\\1{}".format(q[0], q[1]), True]) if s["SingleQuote"]: q = s["SingleQuote"].split("___") s["Custom"].append([True, "'(.*?)'", "{}\\1{}".format(q[0], q[1]), True]) for enabled, A, B, reg in s["Custom"]: if not enabled: continue if not reg: content = content.replace(A, B) else: content = re.sub(A, B, content) content += "\n" return content manuskript-0.10.0/manuskript/exporter/pandoc/000077500000000000000000000000001354442177200213075ustar00rootroot00000000000000manuskript-0.10.0/manuskript/exporter/pandoc/HTML.py000066400000000000000000000031271354442177200224300ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtWidgets import qApp, QTextEdit from PyQt5.QtCore import QUrl from manuskript.exporter.manuskript import HTML as MskHTML from manuskript.exporter.pandoc.abstractPlainText import abstractPlainText import os class HTML(abstractPlainText): name = "HTML" description = qApp.translate("Export", """A little known format modestly used. You know, web sites for example.""") icon = "text-html" exportVarName = "lastPandocHTML" toFormat = "html" exportFilter = "HTML files (*.html);; Any files (*)" exportDefaultSuffix = ".html" requires = { "Settings": True, "Preview": True, } def previewWidget(self): return MskHTML.previewWidget(self) def preview(self, settingsWidget, previewWidget): settings = settingsWidget.getSettings() # Save settings settingsWidget.writeSettings() src = self.src(settingsWidget) html = self.output(settingsWidget) path = os.path.join(self.projectPath(), "dummy.html") self.preparesTextEditView(previewWidget.widget(0), settings["Preview"]["PreviewFont"]) self.preparesTextEditViewMarkdown(previewWidget.widget(0), settings) previewWidget.widget(0).setPlainText(src) self.preparesTextEditView(previewWidget.widget(1), settings["Preview"]["PreviewFont"]) previewWidget.widget(1).setPlainText(html) w2 = previewWidget.widget(2) if isinstance(w2, QTextEdit): w2.setHtml(html) else: w2.setHtml(html, QUrl.fromLocalFile(path)) manuskript-0.10.0/manuskript/exporter/pandoc/PDF.py000066400000000000000000000033251354442177200222750ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import random import shutil from PyQt5.QtCore import QUrl from PyQt5.QtWidgets import qApp from manuskript.exporter.pandoc.abstractOutput import abstractOutput from manuskript.functions import tempFile from manuskript.ui.views.PDFViewer import PDFViewer class PDF(abstractOutput): """PDF Viewer using PDF.js. Cf. https://github.com/mozilla/pdf.js/wiki/Setup-PDF.js-in-a-website""" name = "PDF" description = qApp.translate("Export", "Needs LaTeX to be installed.") InvalidBecause = qApp.translate("Export", """a valid LaTeX installation. Pandoc recommendations can be found on: pandoc.org/installing.html. If you want Unicode support, you need XeLaTeX.""") icon = "application-pdf" exportVarName = "lastPandocPDF" toFormat = "pdf" exportFilter = "PDF files (*.pdf);; Any files (*)" exportDefaultSuffix = ".pdf" requires = { "Settings": True, "Preview": True, } def isValid(self): path = shutil.which("pdflatex") or shutil.which("xelatex") return path is not None def output(self, settingsWidget, outputfile=None): args = settingsWidget.runnableSettings() args.remove("--to=pdf") args.append("--to=latex") src = self.src(settingsWidget) return self.exporter.convert(src, args, outputfile) def previewWidget(self): return PDFViewer() def preview(self, settingsWidget, previewWidget): filename = tempFile("msk_pdfpreview.pdf") settingsWidget.writeSettings() content = self.output(settingsWidget, outputfile=filename) previewWidget.loadPDF(filename) manuskript-0.10.0/manuskript/exporter/pandoc/__init__.py000066400000000000000000000066561354442177200234350ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import subprocess from PyQt5.QtCore import Qt from PyQt5.QtGui import QCursor from PyQt5.QtWidgets import qApp, QMessageBox from manuskript.exporter.basic import basicExporter, basicFormat from manuskript.exporter.pandoc.HTML import HTML from manuskript.exporter.pandoc.PDF import PDF from manuskript.exporter.pandoc.outputFormats import ePub, OpenDocument, DocX from manuskript.exporter.pandoc.plainText import reST, markdown, latex, OPML from manuskript.functions import mainWindow class pandocExporter(basicExporter): name = "Pandoc" description = qApp.translate("Export", """

A universal document converter. Can be used to convert Markdown to a wide range of other formats.

Website: http://pandoc.org/

""") cmd = "pandoc" absentTip = "Install pandoc to benefit from a wide range of export formats (DocX, ePub, PDF, etc.)" absentURL = "http://pandoc.org/installing.html" def __init__(self): basicExporter.__init__(self) self.exportTo = [ markdown(self), latex(self), HTML(self), ePub(self), OpenDocument(self), DocX(self), PDF(self), reST(self), OPML(self), ] def version(self): if self.isValid(): r = self.run(["--version"]) return r.split("\n")[0] else: return "" def convert(self, src, args, outputfile=None): if self.isValid() == 2: run = self.cmd elif self.isValid() == 1: run = self.customPath else: print("Error: no command for pandoc") return None args = [run] + args if outputfile: args.append("--output={}".format(outputfile)) for name, col, var in [ ("Title", 0, "title"), ("Subtitle", 1, "subtitle"), ("Serie", 2, ""), ("Volume", 3, ""), ("Genre", 4, ""), ("License", 5, ""), ("Author", 6, "author"), ("Email", 7, ""), ]: item = mainWindow().mdlFlatData.item(0, col) if var and item and item.text().strip(): args.append("--variable={}:{}".format(var, item.text().strip())) # Add title metadata required for pandoc >= 2.x title = "Untitled" if mainWindow().mdlFlatData.item(0, 0): title = mainWindow().mdlFlatData.item(0, 0).text().strip() args.append("--metadata=title:{}".format(title)) qApp.setOverrideCursor(QCursor(Qt.WaitCursor)) p = subprocess.Popen( args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) if not type(src) == bytes: src = src.encode("utf-8") # assumes utf-8 stdout, stderr = p.communicate(src) qApp.restoreOverrideCursor() if stderr or p.returncode != 0: err = "ERROR on export" + "\n" \ + "Return code" + ": %d\n" % (p.returncode) \ + "Command and parameters" + ":\n%s\n" % (p.args) \ + "Stderr content" + ":\n" + stderr.decode("utf-8") print(err) QMessageBox.critical(mainWindow().dialog, qApp.translate("Export", "Error"), err) return None return stdout.decode("utf-8") manuskript-0.10.0/manuskript/exporter/pandoc/abstractOutput.py000066400000000000000000000012531354442177200247060ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from manuskript.exporter.pandoc.abstractPlainText import abstractPlainText class abstractOutput(abstractPlainText): name = "SUBCLASSME" description = "SUBCLASSME" exportVarName = "SUBCLASSME" toFormat = "SUBCLASSME" icon = "SUBCLASSME" exportFilter = "SUBCLASSME" exportDefaultSuffix = ".SUBCLASSME" requires = { "Settings": True, "Preview": False, } def export(self, settingsWidget): filename = self.getExportFilename(settingsWidget) settingsWidget.writeSettings() if filename: content = self.output(settingsWidget, outputfile=filename) manuskript-0.10.0/manuskript/exporter/pandoc/abstractPlainText.py000066400000000000000000000326511354442177200253240ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import re from PyQt5.QtGui import QTextCharFormat, QFont from PyQt5.QtWidgets import qApp, QVBoxLayout, QCheckBox, QWidget, QHBoxLayout, QLabel, QSpinBox, QComboBox from manuskript.exporter.manuskript.markdown import markdown, markdownSettings from manuskript.ui.collapsibleGroupBox2 import collapsibleGroupBox2 class abstractPlainText(markdown): name = "SUBCLASSME" description = "SUBCLASSME" exportVarName = "SUBCLASSME" toFormat = "SUBCLASSME" icon = "SUBCLASSME" exportFilter = "SUBCLASSME" exportDefaultSuffix = ".SUBCLASSME" def __init__(self, exporter): self.exporter = exporter def settingsWidget(self): # Get pandoc major version to determine valid command line options p = re.compile(r'pandoc (\d+)\..*') m = p.match(self.exporter.version()) if m: majorVersion = m.group(1) else: majorVersion = "" w = pandocSettings(self, majorVersion, toFormat=self.toFormat) w.loadSettings() return w def src(self, settingsWidget): return markdown.output(self, settingsWidget) def output(self, settingsWidget, outputfile=None): args = settingsWidget.runnableSettings() src = self.src(settingsWidget) return self.exporter.convert(src, args, outputfile) def preview(self, settingsWidget, previewWidget): settings = settingsWidget.getSettings() # Save settings settingsWidget.writeSettings() # Prepares text edit self.preparesTextEditViewMarkdown(previewWidget, settingsWidget.settings) self.preparesTextEditView(previewWidget, settings["Preview"]["PreviewFont"]) r = self.output(settingsWidget) previewWidget.setPlainText(r) class pandocSetting: def __init__(self, arg, type, format, label, widget=None, default=None, min=None, max=None, vals=None, suffix=""): self.arg = arg # start with EXT for extensions self.type = type self.label = label self.formats = format if "html" in self.formats: self.formats += " slidy dzslides revealjs slideous s5 html5" self.widget = widget self.default = default self.min = min self.max = max self.vals = vals.split("|") if vals else [] self.suffix = suffix def isValid(self, format): """Return whether the specific setting is active with the given format.""" # Empty formats means all if self.formats is "": return True # "html" in "html markdown latex" elif format in self.formats: return True # "markdown_strict" in "html markdown latex" elif [f for f in self.formats.split(" ") if format in f]: return True return False class pandocSettings(markdownSettings): settingsList = { # General "standalone": pandocSetting("--standalone", "checkbox", "", qApp.translate("Export", "Standalone document (not just a fragment)"), default=True), "TOC": pandocSetting("--toc", "checkbox", "", qApp.translate("Export", "Include a table of contents.")), "TOC-depth": pandocSetting("--toc-depth=", "number", "", qApp.translate("Export", "Number of sections level to include in TOC: "), default=3, min=1, max=6), # pandoc v1 only "smart": pandocSetting("--smart", "checkbox", "", qApp.translate("Export", "Typographically correct output")), # pandoc v1 only "normalize": pandocSetting("--normalize", "checkbox", "", qApp.translate("Export", "Normalize the document (cleaner)")), "base-header": pandocSetting("--base-header-level=", "number", "", qApp.translate("Export", "Specify the base level for headers: "), default=1, min=1), "disable-YAML": pandocSetting("EXT-yaml_metadata_block", "checkbox", "", qApp.translate("Export", "Disable YAML metadata block.\nUse that if you get YAML related error.")), # Specific "ref-link": pandocSetting("--reference-links", "checkbox", "markdown rst", qApp.translate("Export", "Use reference-style links instead of inline links")), "atx": pandocSetting("--atx-headers", "checkbox", "markdown asciidoc", qApp.translate("Export", "Use ATX-style headers")), "self-contained": pandocSetting("--self-contained", "checkbox", "html", qApp.translate("Export", "Self-contained HTML files, with no dependencies")), "q-tags": pandocSetting("--html-q-tags", "checkbox", "html", qApp.translate("Export", "Use tags for quotes in HTML")), # pandoc v1 only "latex-engine": pandocSetting("--latex-engine=", "combo", "pdf", qApp.translate("Export", "LaTeX engine used to produce the PDF."), vals="pdflatex|lualatex|xelatex"), # pandoc v2 "pdf-engine": pandocSetting("--pdf-engine=", "combo", "pdf", qApp.translate("Export", "LaTeX engine used to produce the PDF."), vals="pdflatex|lualatex|xelatex"), "epub3": pandocSetting("EXTepub3", "checkbox", "epub", qApp.translate("Export", "Convert to ePUB3")), } pdfSettings = { # PDF "latex-ps": pandocSetting("--variable=papersize:", "combo", "pdf latex", # FIXME: does not work with default template qApp.translate("Export", "Paper size:"), vals="letter|A4|A5"), "latex-fs": pandocSetting("--variable=fontsize:", "number", "pdf latex", # FIXME: does not work with default template qApp.translate("Export", "Font size:"), min=8, max=88, default=12, suffix="pt"), "latex-class": pandocSetting("--variable=documentclass:", "combo", "pdf latex", qApp.translate("Export", "Class:"), vals="article|report|book|memoir"), "latex-ls": pandocSetting("--variable=linestretch:", "combo", "pdf latex", qApp.translate("Export", "Line spacing:"), vals="1|1.25|1.5|2"), # FIXME: complete with http://pandoc.org/README.html#variables-for-latex } def __init__(self, _format, majorVersion="", toFormat=None, parent=None): markdownSettings.__init__(self, _format, parent) self.format = toFormat self.majorVersion = majorVersion w = QWidget(self) w.setLayout(QVBoxLayout()) self.grpPandocGeneral = self.collapsibleGroupBox(self.tr("General"), w) if majorVersion == "1": # pandoc v1 only self.addSettingsWidget("smart", self.grpPandocGeneral) self.addSettingsWidget("normalize", self.grpPandocGeneral) else: # pandoc v2 self.settingsList.pop("smart", None) self.settingsList.pop("normalize", None) self.addSettingsWidget("base-header", self.grpPandocGeneral) self.addSettingsWidget("standalone", self.grpPandocGeneral) self.addSettingsWidget("disable-YAML", self.grpPandocGeneral) self.grpPandocTOC = self.collapsibleGroupBox(self.tr("Table of Content"), w) self.addSettingsWidget("TOC", self.grpPandocTOC) self.addSettingsWidget("TOC-depth", self.grpPandocTOC) self.grpPandocSpecific = self.collapsibleGroupBox(self.tr("Custom settings for {}").format(self.format), w) self.addSettingsWidget("ref-link", self.grpPandocSpecific) self.addSettingsWidget("atx", self.grpPandocSpecific) self.addSettingsWidget("self-contained", self.grpPandocSpecific) self.addSettingsWidget("q-tags", self.grpPandocSpecific) if majorVersion == "1": # pandoc v1 only self.addSettingsWidget("latex-engine", self.grpPandocSpecific) self.settingsList.pop("pdf-engine", None) else: # pandoc v2 self.settingsList.pop("latex-engine", None) self.addSettingsWidget("pdf-engine", self.grpPandocSpecific) self.addSettingsWidget("epub3", self.grpPandocSpecific) # PDF settings self.settingsList.update(self.pdfSettings) for i in self.pdfSettings: self.addSettingsWidget(i, self.grpPandocSpecific) self.toolBox.insertItem(self.toolBox.count() - 1, w, "Pandoc") self.toolBox.layout().setSpacing(0) # Not sure why this is needed, but hey... self.getSettings() def collapsibleGroupBox(self, title, parent): g = collapsibleGroupBox2(title=title) parent.layout().addWidget(g) g.setLayout(QVBoxLayout()) return g def addSettingsWidget(self, settingsName, parent): if not settingsName in self.settingsList: return s = self.settingsList[settingsName] if not s.isValid(self.format): # That setting is not available for that export format return if "checkbox" in s.type: s.widget = QCheckBox(s.label) if s.default: s.widget.setChecked(True) parent.layout().addWidget(s.widget) elif "number" in s.type: l = QHBoxLayout() label = QLabel(s.label, parent) label.setWordWrap(True) l.addWidget(label, 8) s.widget = QSpinBox() s.widget.setValue(s.default if s.default else 0) if s.min: s.widget.setMinimum(s.min) if s.max: s.widget.setMaximum(s.max) if s.suffix: s.widget.setSuffix(s.suffix) l.addWidget(s.widget, 2) parent.layout().addLayout(l) elif "combo" in s.type: l = QHBoxLayout() label = QLabel(s.label, parent) label.setWordWrap(True) l.addWidget(label, 6) s.widget = QComboBox() s.widget.addItems(s.vals) l.addWidget(s.widget, 2) parent.layout().addLayout(l) def updateFromSettings(self): markdownSettings.updateFromSettings(self) # s = self.settings["Preview"] # val = s.get("MarkdownHighlighter", False) # self.chkMarkdownHighlighter.setChecked(val) if not "Pandoc" in self.settings: return for name in self.settingsList: s = self.settingsList[name] if s.isValid(self.format): if s.type == "checkbox" and name in self.settings["Pandoc"]: s.widget.setChecked(self.settings["Pandoc"][name]) elif s.type == "number" and name in self.settings["Pandoc"]: s.widget.setValue(int(self.settings["Pandoc"][name])) elif s.type == "combo" and name in self.settings["Pandoc"]: s.widget.setCurrentText(self.settings["Pandoc"][name]) def getSettings(self): self.settings = markdownSettings.getSettings(self) P = self.settings.get("Pandoc", {}) for name in self.settingsList: s = self.settingsList[name] if s.isValid(self.format): if s.type == "checkbox": P[name] = s.widget.isChecked() elif s.type == "number": P[name] = str(s.widget.value()) elif s.type == "combo": P[name] = s.widget.currentText() self.settings["Pandoc"] = P return self.settings def runnableSettings(self): # First we get extensions (where arg starts with EXT) extensions = "" toFormat = self.format for name in self.settingsList: s = self.settingsList[name] if s.arg[:3] == "EXT" and s.isValid(self.format): if name == "disable-YAML" and s.widget.isChecked(): extensions += "-yaml_metadata_block" if name == "epub3" and s.widget.isChecked(): toFormat = "epub3" r = ["--from=markdown" + extensions, "--to={}".format(toFormat)] # Add every command for name in self.settingsList: s = self.settingsList[name] if s.arg[:3] == "EXT": continue if s.isValid(self.format): rr = "" if s.type == "checkbox": if s.widget.isChecked(): rr = s.arg elif s.type == "number": rr = "{}{}".format( s.arg, str(s.widget.value()) ) elif s.type == "combo": rr = "{}{}".format( s.arg, s.widget.currentText() ) if rr: r.append(rr+s.suffix) return r manuskript-0.10.0/manuskript/exporter/pandoc/outputFormats.py000066400000000000000000000022621354442177200245570ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtWidgets import qApp from manuskript.exporter.pandoc.abstractOutput import abstractOutput class ePub(abstractOutput): name = "ePub" description = qApp.translate("Export", """Books that don't kill trees.""") icon = "application-epub+zip" exportVarName = "lastPandocePub" toFormat = "epub" exportFilter = "ePub files (*.epub);; Any files (*)" exportDefaultSuffix = ".epub" class OpenDocument(abstractOutput): name = "OpenDocument" description = qApp.translate("Export", "OpenDocument format. Used by LibreOffice for example.") exportVarName = "lastPandocODT" toFormat = "odt" icon = "application-vnd.oasis.opendocument.text" exportFilter = "OpenDocument files (*.odt);; Any files (*)" exportDefaultSuffix = ".odt" class DocX(abstractOutput): name = "DocX" description = qApp.translate("Export", "Microsoft Office (.docx) document.") exportVarName = "lastPandocDocX" toFormat = "docx" icon = "application-vnd.openxmlformats-officedocument.wordprocessingml.document" exportFilter = "DocX files (*.docx);; Any files (*)" exportDefaultSuffix = ".docx" manuskript-0.10.0/manuskript/exporter/pandoc/plainText.py000066400000000000000000000034561354442177200236410ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtWidgets import qApp from manuskript.exporter.pandoc.abstractPlainText import abstractPlainText class markdown(abstractPlainText): name = "Markdown" description = qApp.translate("Export", """Export to markdown, using pandoc. Allows more formatting options than the basic manuskript exporter.""") icon = "text-x-markdown" exportVarName = "lastPandocMarkdown" toFormat = "markdown" exportFilter = "Markdown files (*.md);; Any files (*)" exportDefaultSuffix = ".md" class reST(abstractPlainText): name = "reST" description = qApp.translate("Export", """reStructuredText is a lightweight markup language.""") exportVarName = "lastPandocreST" toFormat = "rst" icon = "text-plain" exportFilter = "reST files (*.rst);; Any files (*)" exportDefaultSuffix = ".rst" class latex(abstractPlainText): name = "LaTeX" description = qApp.translate("Export", """LaTeX is a word processor and document markup language used to create beautiful documents.""") exportVarName = "lastPandocLatex" toFormat = "latex" icon = "text-x-tex" exportFilter = "Tex files (*.tex);; Any files (*)" exportDefaultSuffix = ".tex" class OPML(abstractPlainText): name = "OPML" description = qApp.translate("Export", """The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner.""") exportVarName = "lastPandocOPML" toFormat = "opml" icon = "text-x-opml+xml" exportFilter = "OPML files (*.opml);; Any files (*)" exportDefaultSuffix = ".opml" manuskript-0.10.0/manuskript/functions/000077500000000000000000000000001354442177200202035ustar00rootroot00000000000000manuskript-0.10.0/manuskript/functions/__init__.py000066400000000000000000000332011354442177200223130ustar00rootroot00000000000000#!/usr/bin/env python #--!-- coding: utf8 --!-- import os import re from random import * from PyQt5.QtCore import Qt, QRect, QStandardPaths, QObject, QRegExp, QDir from PyQt5.QtCore import QUrl, QTimer from PyQt5.QtGui import QBrush, QIcon, QPainter, QColor, QImage, QPixmap from PyQt5.QtGui import QDesktopServices from PyQt5.QtWidgets import qApp, QFileDialog, QTextEdit from manuskript.enums import Outline # Used to detect multiple connections AUC = Qt.AutoConnection | Qt.UniqueConnection MW = None def wordCount(text): t = text.strip().replace(" ", "\n").split("\n") t = [l for l in t if l] return len(t) validate_ok = lambda *args, **kwargs: True def uiParse(input, default, converter, validator=validate_ok): """ uiParse is a utility function that intends to make it easy to convert user input to data that falls in the range of expected values the program is expecting to handle. It swallows all exceptions that happen during conversion. The validator should return True to permit the converted value. """ result = default try: result = converter(input) except: pass # failed to convert # Whitelist default value in case default type differs from converter output. if (result != default) and not validator(result): result = default return result def toInt(text): if text: try: return int(text) except ValueError: pass return 0 def toFloat(text): if text: return float(text) else: return 0. def toString(text): if text in [None, "None"]: return "" else: return str(text) def drawProgress(painter, rect, progress, radius=0): from manuskript.ui import style as S progress = toFloat(progress) # handle invalid input (issue #561) painter.setPen(Qt.NoPen) painter.setBrush(QColor(S.base)) # "#dddddd" painter.drawRoundedRect(rect, radius, radius) painter.setBrush(QBrush(colorFromProgress(progress))) r2 = QRect(rect) r2.setWidth(r2.width() * min(progress, 1)) painter.drawRoundedRect(r2, radius, radius) def colorFromProgress(progress): progress = toFloat(progress) c1 = QColor(Qt.red) c2 = QColor(Qt.blue) c3 = QColor(Qt.darkGreen) c4 = QColor("#FFA500") if progress < 0.3: return c1 elif progress < 0.8: return c2 elif progress > 1.2: return c4 else: return c3 def mainWindow(): global MW if not MW: for i in qApp.topLevelWidgets(): if i.objectName() == "MainWindow": MW = i return MW return None else: return MW def iconColor(icon): """Returns a QRgb from a QIcon, assuming its all the same color""" px = icon.pixmap(5, 5) if px.width() != 0: return QColor(QImage(px).pixel(2, 2)) else: return QColor(Qt.transparent) def iconFromColor(color): px = QPixmap(32, 32) px.fill(color) return QIcon(px) def iconFromColorString(string): return iconFromColor(QColor(string)) def themeIcon(name): "Returns an icon for the given name." db = { "character": "stock_people", "characters": "stock_people", "plot": "stock_shuffle", "plots": "stock_shuffle", "world": "emblem-web", #stock_timezone applications-internet "outline": "gtk-index", #applications-versioncontrol "label": "folder_color_picker", "status": "applications-development", "text": "view-text", "card": "view-card", "outline": "view-outline", "tree": "view-list-tree", "spelling": "tools-check-spelling" } if name in db: return QIcon.fromTheme(db[name]) else: return QIcon() def randomColor(mix=None): """Generates a random color. If mix (QColor) is given, mixes the random color and mix.""" r = randint(0, 255) g = randint(0, 255) b = randint(0, 255) if mix: r = (r + mix.red()) / 2 g = (g + mix.green()) / 2 b = (b + mix.blue()) / 2 return QColor(r, g, b) def mixColors(col1, col2, f=.5): fromString = False if type(col1) == str: fromString = True col1 = QColor(col1) if type(col2) == str: col2 = QColor(col2) f2 = 1-f r = col1.red() * f + col2.red() * f2 g = col1.green() * f + col2.green() * f2 b = col1.blue() * f + col2.blue() * f2 return QColor(r, g, b) if not fromString else QColor(r, g, b).name() def outlineItemColors(item): from manuskript.ui import style as S """Takes an OutlineItem and returns a dict of colors.""" colors = {} mw = mainWindow() # POV colors["POV"] = QColor(Qt.transparent) POV = item.data(Outline.POV) if POV == "": col = QColor(Qt.transparent) else: for i in range(mw.mdlCharacter.rowCount()): if mw.mdlCharacter.ID(i) == POV: colors["POV"] = iconColor(mw.mdlCharacter.icon(i)) # Label lbl = item.data(Outline.label) if lbl == "": col = QColor(Qt.transparent) else: col = iconColor(mw.mdlLabels.item(toInt(lbl)).icon()) # if col == Qt.black: # # Don't know why, but transparent is rendered as black # col = QColor(Qt.transparent) colors["Label"] = col # Progress pg = item.data(Outline.goalPercentage) colors["Progress"] = colorFromProgress(pg) # Compile if item.compile() in [0, "0"]: colors["Compile"] = mixColors(QColor(S.text), QColor(S.window)) else: colors["Compile"] = QColor(Qt.transparent) # will use default return colors def colorifyPixmap(pixmap, color): # FIXME: ugly p = QPainter(pixmap) p.setCompositionMode(p.CompositionMode_Overlay) p.fillRect(pixmap.rect(), color) return pixmap def appPath(suffix=None): p = os.path.realpath(os.path.join(os.path.split(__file__)[0], "../..")) if suffix: p = os.path.join(p, suffix) return p def writablePath(suffix=None): if hasattr(QStandardPaths, "AppLocalDataLocation"): p = QStandardPaths.writableLocation(QStandardPaths.AppLocalDataLocation) else: # Qt < 5.4 p = QStandardPaths.writableLocation(QStandardPaths.DataLocation) if suffix: p = os.path.join(p, suffix) if not os.path.exists(p): os.makedirs(p) return p def allPaths(suffix=None): paths = [] # src directory paths.append(appPath(suffix)) # user writable directory paths.append(writablePath(suffix)) return paths def tempFile(name): "Returns a temp file." return os.path.join(QDir.tempPath(), name) def totalObjects(): return len(mainWindow().findChildren(QObject)) def printObjects(): print("Objects:", str(totalObjects())) def findWidgetsOfClass(cls): """ Returns all widgets, children of MainWindow, whose class is cls. @param cls: a class @return: list of QWidgets """ return mainWindow().findChildren(cls, QRegExp()) def findBackground(filename): """ Returns the full path to a background file of name filename within resources folders. """ return findFirstFile(re.escape(filename), "resources/backgrounds") def findFirstFile(regex, path="resources"): """ Returns full path of first file matching regular expression regex within folder path, otherwise returns full path of last file in folder path. """ paths = allPaths(path) for p in paths: lst = os.listdir(p) for l in lst: if re.match(regex, l): return os.path.join(p, l) def customIcons(): """ Returns a list of possible customIcons. String from theme. """ r = [ "text-plain", "gnome-settings", "applications-internet", "applications-debugging", "applications-development", "system-help", "info", "dialog-question", "dialog-warning", "stock_timezone", "stock_people", "stock_shuffle", "gtk-index", "folder_color_picker", "applications-versioncontrol", "stock_home", "stock_trash_empty", "stock_trash_full", "stock_yes", "stock_no", "stock_notes", "stock_calendar", "stock_mic", 'stock_score-lowest', 'stock_score-lower', 'stock_score-low', 'stock_score-normal', 'stock_score-high', 'stock_score-higher', 'stock_score-highest', "stock_task", "stock_refresh", "application-community", "applications-chat", "application-menu", "applications-education", "applications-science", "applications-puzzles", "applications-roleplaying", "applications-sports", "applications-libraries", "applications-publishing", "applications-development", "applications-games", "applications-boardgames", "applications-geography", "applications-physics", "package_multimedia", "media-flash", "media-optical", "media-floppy", "media-playback-start", "media-playback-pause", "media-playback-stop", "media-playback-record", "media-playback-start-rtl", "media-eject", "document-save", "gohome", 'purple-folder', 'yellow-folder', 'red-folder', 'custom-folder', 'grey-folder', 'blue-folder', 'default-folder', 'pink-folder', 'orange-folder', 'green-folder', 'brown-folder', 'folder-home', 'folder-remote', 'folder-music', 'folder-saved-search', 'folder-projects', 'folder-sound', 'folder-publicshare', 'folder-pictures', 'folder-saved-search-alt', 'folder-tag', 'calendar-01', 'calendar-02', 'calendar-03', 'calendar-04', 'calendar-05', 'calendar-06', 'calendar-07', 'calendar-08', 'calendar-09', 'calendar-10', 'arrow-down', 'arrow-left', 'arrow-right', 'arrow-up', 'arrow-down-double', 'arrow-left-double', 'arrow-right-double', 'arrow-up-double', 'emblem-added', 'emblem-checked', 'emblem-downloads', 'emblem-dropbox-syncing', 'emblem-danger', 'emblem-development', 'emblem-dropbox-app', 'emblem-art', 'emblem-camera', 'emblem-dropbox-selsync', 'emblem-insync-des-error', 'emblem-insync-error', 'emblem-generic', 'emblem-favorites', 'emblem-error', 'emblem-dropbox-uptodate', 'emblem-marketing', 'emblem-money', 'emblem-music', 'emblem-noread', 'emblem-people', 'emblem-personal', 'emblem-sound', 'emblem-shared', 'emblem-sales', 'emblem-presentation', 'emblem-plan', 'emblem-system', 'emblem-urgent', 'emblem-videos', 'emblem-web', 'face-angel', 'face-clown', 'face-angry', 'face-cool', 'face-devilish', 'face-sick', 'face-sleeping', 'face-uncertain', 'face-monkey', 'face-ninja', 'face-pirate', 'face-glasses', 'face-in-love', 'face-confused', 'feed-marked-symbolic', 'feed-non-starred', 'feed-starred', 'feed-unmarked-symbolic', 'notification-new-symbolic', ] return sorted(r) def statusMessage(message, duration=5000, importance=1): """ Shows a message in MainWindow's status bar. Importance: 0 = low, 1 = normal, 2 = important, 3 = critical. """ from manuskript.ui import style as S MW.statusBar().hide() MW.statusLabel.setText(message) if importance == 0: MW.statusLabel.setStyleSheet("color:{};".format(S.textLighter)) elif importance == 1: MW.statusLabel.setStyleSheet("color:{};".format(S.textLight)) elif importance == 2: MW.statusLabel.setStyleSheet("color:{}; font-weight: bold;".format(S.text)) elif importance == 3: MW.statusLabel.setStyleSheet("color:red; font-weight: bold;") MW.statusLabel.adjustSize() g = MW.statusLabel.geometry() # g.moveCenter(MW.mapFromGlobal(MW.geometry().center())) s = MW.layout().spacing() / 2 g.setLeft(s) g.moveBottom(MW.mapFromGlobal(MW.geometry().bottomLeft()).y() - s) MW.statusLabel.setGeometry(g) MW.statusLabel.show() QTimer.singleShot(duration, MW.statusLabel.hide) def openURL(url): """ Opens url (string) in browser using desktop default application. """ QDesktopServices.openUrl(QUrl(url)) def getSaveFileNameWithSuffix(parent, caption, directory, filter, options=None, selectedFilter=None, defaultSuffix=None): """ A reimplemented version of QFileDialog.getSaveFileName() because we would like to make use of the QFileDialog.defaultSuffix property that getSaveFileName() does not let us adjust. Note: knowing the selected filter is not an invitation to change the chosen filename later. """ dialog = QFileDialog(parent=parent, caption=caption, directory=directory, filter=filter) if options: dialog.setOptions(options) if defaultSuffix: dialog.setDefaultSuffix(defaultSuffix) dialog.setFileMode(QFileDialog.AnyFile) if hasattr(dialog, 'setSupportedSchemes'): # Pre-Qt5.6 lacks this. dialog.setSupportedSchemes(("file",)) dialog.setAcceptMode(QFileDialog.AcceptSave) if selectedFilter: dialog.selectNameFilter(selectedFilter) if (dialog.exec() == QFileDialog.Accepted): return dialog.selectedFiles()[0], dialog.selectedNameFilter() return None, None def inspect(): """ Debugging tool. Call it to see a stack of calls up to that point. """ import inspect, os print("-----------------------") for s in inspect.stack()[1:]: print(" * {}:{} // {}".format( os.path.basename(s.filename), s.lineno, s.function)) print(" " + "".join(s.code_context)) # Spellchecker loads writablePath from this file, so we need to load it after they get defined from manuskript.functions.spellchecker import Spellchecker manuskript-0.10.0/manuskript/functions/spellchecker.py000066400000000000000000000314131354442177200232230ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import os, gzip, json, glob from PyQt5.QtCore import QLocale from collections import OrderedDict from manuskript.functions import writablePath try: import enchant except ImportError: enchant = None try: import spellchecker as pyspellchecker except ImportError: pyspellchecker = None SYMSPELLPY_MIN_VERSION = "6.3.8" try: import symspellpy import distutils.version if distutils.version.LooseVersion(symspellpy.__version__) < SYMSPELLPY_MIN_VERSION: symspellpy = None except ImportError: symspellpy = None class Spellchecker: dictionaries = {} # In order of priority implementations = [] def __init__(self): pass @staticmethod def registerImplementation(impl): Spellchecker.implementations.append(impl) @staticmethod def isInstalled(): for impl in Spellchecker.implementations: if impl.isInstalled(): return True return False @staticmethod def supportedLibraries(): libs = OrderedDict() for impl in Spellchecker.implementations: libs[impl.getLibraryName()] = impl.getLibraryRequirement() return libs @staticmethod def availableLibraries(): ret = [] for impl in Spellchecker.implementations: if impl.isInstalled(): ret.append(impl.getLibraryName()) return ret @staticmethod def availableDictionaries(): dictionaries = OrderedDict() for impl in Spellchecker.implementations: if impl.isInstalled(): dictionaries[impl.getLibraryName()] = impl.availableDictionaries() return dictionaries @staticmethod def normalizeDictName(lib, dictionary): return "{}:{}".format(lib, dictionary) @staticmethod def getDefaultDictionary(): for impl in Spellchecker.implementations: default = impl.getDefaultDictionary() if default: return Spellchecker.normalizeDictName(impl.getLibraryName(), default) return None @staticmethod def getLibraryURL(lib=None): urls = {} for impl in Spellchecker.implementations: urls[impl.getLibraryName()] = impl.getLibraryURL() if lib: return urls.get(lib, None) return urls @staticmethod def getDictionary(dictionary): if not dictionary: dictionary = Spellchecker.getDefaultDictionary() if not dictionary: return None values = dictionary.split(":", 1) if len(values) == 1: (lib, name) = (Spellchecker.implementations[0].getLibraryName(), dictionary) dictionary = Spellchecker.normalizeDictName(lib, name) else: (lib, name) = values try: d = Spellchecker.dictionaries.get(dictionary, None) if d is None: for impl in Spellchecker.implementations: if impl.isInstalled() and lib == impl.getLibraryName(): d = impl(name) Spellchecker.dictionaries[dictionary] = d break return d except Exception as e: pass return None class BasicDictionary: def __init__(self, name): self._lang = name if not self._lang: self._lang = self.getDefaultDictionary() self._customDict = set() customPath = self.getCustomDictionaryPath() try: with gzip.open(customPath, "rt", encoding='utf-8') as f: self._customDict = set(json.loads(f.read())) for word in self._customDict: self._dict.create_dictionary_entry(word, self.CUSTOM_COUNT) except: # If error loading the file, overwrite with empty dictionary self._saveCustomDict() @property def name(self): return self._lang @staticmethod def getLibraryName(): raise NotImplemented @staticmethod def getLibraryRequirement(): return None @staticmethod def getLibraryURL(): raise NotImplemented @staticmethod def isInstalled(): raise NotImplemented @staticmethod def getDefaultDictionary(): raise NotImplemented @staticmethod def availableDictionaries(): raise NotImplemented def isMisspelled(self, word): raise NotImplemented def getSuggestions(self, word): raise NotImplemented def isCustomWord(self, word): return word.lower() in self._customDict def addWord(self, word): word = word.lower() if not word in self._customDict: self._customDict.add(word) self._saveCustomDict() def removeWord(self, word): word = word.lower() if word in self._customDict: self._customDict.remove(word) self._saveCustomDict() @classmethod def getResourcesPath(cls): path = os.path.join(writablePath(), "resources", "dictionaries", cls.getLibraryName()) if not os.path.exists(path): os.makedirs(path) return path def getCustomDictionaryPath(self): return os.path.join(self.getResourcesPath(), "{}.json.gz".format(self._lang)) def _saveCustomDict(self): customPath = self.getCustomDictionaryPath() with gzip.open(customPath, "wt") as f: f.write(json.dumps(list(self._customDict))) class EnchantDictionary(BasicDictionary): def __init__(self, name): self._lang = name if not (self._lang and enchant.dict_exists(self._lang)): self._lang = self.getDefaultDictionary() self._dict = enchant.DictWithPWL(self._lang, self.getCustomDictionaryPath()) @staticmethod def getLibraryName(): return "PyEnchant" @staticmethod def getLibraryURL(): return "https://pypi.org/project/pyenchant/" @staticmethod def isInstalled(): return enchant is not None @staticmethod def availableDictionaries(): if EnchantDictionary.isInstalled(): return list(map(lambda i: str(i[0]), enchant.list_dicts())) return [] @staticmethod def getDefaultDictionary(): if not EnchantDictionary.isInstalled(): return None default_locale = enchant.get_default_language() if default_locale and not enchant.dict_exists(default_locale): default_locale = None if default_locale is None: default_locale = QLocale.system().name() if default_locale is None: default_locale = self.availableDictionaries()[0] return default_locale def isMisspelled(self, word): return not self._dict.check(word) def getSuggestions(self, word): return self._dict.suggest(word) def isCustomWord(self, word): return self._dict.is_added(word) def addWord(self, word): self._dict.add(word) def removeWord(self, word): self._dict.remove(word) def getCustomDictionaryPath(self): return os.path.join(self.getResourcesPath(), "{}.txt".format(self.name)) class PySpellcheckerDictionary(BasicDictionary): def __init__(self, name): BasicDictionary.__init__(self, name) self._dict = pyspellchecker.SpellChecker(self.name) self._dict.word_frequency.load_words(self._customDict) @staticmethod def getLibraryName(): return "pyspellchecker" @staticmethod def getLibraryURL(): return "https://pyspellchecker.readthedocs.io/en/latest/" @staticmethod def isInstalled(): return pyspellchecker is not None @staticmethod def availableDictionaries(): if PySpellcheckerDictionary.isInstalled(): dictionaries = [] files = glob.glob(os.path.join(pyspellchecker.__path__[0], "resources", "*.json.gz")) for file in files: dictionaries.append(os.path.basename(file)[:-8]) return dictionaries return [] @staticmethod def getDefaultDictionary(): if not PySpellcheckerDictionary.isInstalled(): return None default_locale = QLocale.system().name() if default_locale: default_locale = default_locale[0:2] if default_locale is None: default_locale = "en" return default_locale def isMisspelled(self, word): return len(self._dict.unknown([word])) > 0 def getSuggestions(self, word): candidates = self._dict.candidates(word) if word in candidates: candidates.remove(word) return candidates def addWord(self, word): BasicDictionary.addWord(self, word) self._dict.word_frequency.add(word.lower()) def removeWord(self, word): BasicDictionary.removeWord(self, word) self._dict.word_frequency.remove(word.lower()) class SymSpellDictionary(BasicDictionary): CUSTOM_COUNT = 1 DISTANCE = 2 def __init__(self, name): BasicDictionary.__init__(self, name) self._dict = symspellpy.SymSpell(self.DISTANCE) cachePath = self.getCachedDictionaryPath() try: if not self._dict.load_pickle(cachePath, False): raise Exception("Can't load cached dictionary. " + "File might be corrupted or incompatible with installed symspellpy version") except: if pyspellchecker: path = os.path.join(pyspellchecker.__path__[0], "resources", "{}.json.gz".format(self.name)) if os.path.exists(path): with gzip.open(path, "rt", encoding='utf-8') as f: data = json.loads(f.read()) for key in data: self._dict.create_dictionary_entry(key, data[key]) self._dict.save_pickle(cachePath, False) for word in self._customDict: self._dict.create_dictionary_entry(word, self.CUSTOM_COUNT) def getCachedDictionaryPath(self): return os.path.join(self.getResourcesPath(), "{}.sym".format(self.name)) @staticmethod def getLibraryName(): return "symspellpy" @staticmethod def getLibraryRequirement(): return ">= " + SYMSPELLPY_MIN_VERSION @staticmethod def getLibraryURL(): return "https://github.com/mammothb/symspellpy" @staticmethod def isInstalled(): return symspellpy is not None @classmethod def availableDictionaries(cls): if SymSpellDictionary.isInstalled(): files = glob.glob(os.path.join(cls.getResourcesPath(), "*.sym")) dictionaries = [] for file in files: dictionaries.append(os.path.basename(file)[:-4]) for sp_dict in PySpellcheckerDictionary.availableDictionaries(): if not sp_dict in dictionaries: dictionaries.append(sp_dict) return dictionaries return [] @staticmethod def getDefaultDictionary(): if not SymSpellDictionary.isInstalled(): return None return PySpellcheckerDictionary.getDefaultDictionary() def isMisspelled(self, word): suggestions = self._dict.lookup(word.lower(), symspellpy.Verbosity.TOP) if len(suggestions) > 0 and suggestions[0].distance == 0: return False # Try the word as is, since a dictionary might have uppercase letter as part # of it's spelling ("I'm" or "January" for example) suggestions = self._dict.lookup(word, symspellpy.Verbosity.TOP) if len(suggestions) > 0 and suggestions[0].distance == 0: return False return True def getSuggestions(self, word): upper = word.isupper() upper1 = word[0].isupper() suggestions = self._dict.lookup_compound(word, 2) suggestions.extend(self._dict.lookup(word, symspellpy.Verbosity.CLOSEST)) candidates = [] for sug in suggestions: if upper: term = sug.term.upper() elif upper1: term = sug.term[0].upper() + sug.term[1:] else: term = sug.term if sug.distance > 0 and not term in candidates: candidates.append(term) return candidates def addWord(self, word): BasicDictionary.addWord(self, word) self._dict.create_dictionary_entry(word.lower(), self.CUSTOM_COUNT) def removeWord(self, word): BasicDictionary.removeWord(self, word) # Since 6.3.8 self._dict.delete_dictionary_entry(word) # Register the implementations in order of priority Spellchecker.implementations.append(EnchantDictionary) Spellchecker.registerImplementation(SymSpellDictionary) Spellchecker.registerImplementation(PySpellcheckerDictionary) manuskript-0.10.0/manuskript/importer/000077500000000000000000000000001354442177200200345ustar00rootroot00000000000000manuskript-0.10.0/manuskript/importer/__init__.py000066400000000000000000000015201354442177200221430ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from manuskript.importer.folderImporter import folderImporter from manuskript.importer.markdownImporter import markdownImporter from manuskript.importer.opmlImporter import opmlImporter from manuskript.importer.mindMapImporter import mindMapImporter from manuskript.importer.pandocImporters import markdownPandocImporter, \ odtPandocImporter, ePubPandocImporter, docXPandocImporter, HTMLPandocImporter, \ rstPandocImporter, LaTeXPandocImporter, OPMLPandocImporter importers = [ # Internal markdownImporter, folderImporter, opmlImporter, mindMapImporter, # Pandoc markdownPandocImporter, odtPandocImporter, ePubPandocImporter, docXPandocImporter, HTMLPandocImporter, rstPandocImporter, LaTeXPandocImporter, OPMLPandocImporter, ] manuskript-0.10.0/manuskript/importer/abstractImporter.py000066400000000000000000000155641354442177200237460ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import os import shutil import subprocess from PyQt5.QtCore import QSettings from PyQt5.QtWidgets import QWidget, QVBoxLayout, QCheckBox, QHBoxLayout, \ QLabel, QSpinBox, QComboBox, QLineEdit from manuskript.ui.collapsibleGroupBox2 import collapsibleGroupBox2 from manuskript.ui import style class abstractImporter: """ abstractImporter is used to import documents into manuskript. The startImport function must be subclassed. It takes a filePath (str to the document to import), and must return `outlineItem`s. """ name = "" description = "" fileFormat = "" # File format accepted. For example: "OPML Files (*.opml)" # For folder, use "<>" icon = "" engine = "Internal" def __init__(self): self.settingsList = [] # Keep the name of the settings in order self.settings = {} def startImport(self, filePath, parentItem, settingsWidget): """ Takes a str path to the file/folder to import, and the settingsWidget returned by `self.settingsWidget()` containing the user set settings, and return `outlineItem`s. """ pass @classmethod def isValid(cls): return False def settingsWidget(self, widget): """ Takes a QWidget that can be modified and must be returned. """ return widget def addPage(self, widget, title): """ Convenience function to add a page to the settingsWidget `widget`, at the end. Returns the page widget. """ w = QWidget(widget) w.setLayout(QVBoxLayout()) widget.toolBox.insertItem(widget.toolBox.count(), w, title) widget.toolBox.layout().setSpacing(0) return w def addGroup(self, parent, title): """ Adds a collapsible group to the given widget. """ g = collapsibleGroupBox2(title=title) parent.layout().addWidget(g) g.setLayout(QVBoxLayout()) return g def addSetting(self, name, type, label, widget=None, default=None, tooltip=None, min=None, max=None, vals=None, suffix=""): self.settingsList.append(name) self.settings[name] = self.setting(name, type, label, widget, default, tooltip, min, max, vals, suffix) def widget(self, name): if name in self.settings: return self.settings[name].widget() def getSetting(self, name): if name in self.settings: return self.settings[name] def addSettingsTo(self, widget): """ Adds all the settings to the given widget. Assume that the settings have not been called yet, so calling `.widget()` will create their widgets. """ for name in self.settingsList: self.settings[name].widget(widget) class setting: """ A class used to store setting, and display a widget for the user to modify it. """ def __init__(self, name, type, label, widget=None, default=None, tooltip=None, min=None, max=None, vals=None, suffix=""): self.name = name self.type = type self.label = label self._widget = widget self.default = default self.min = min self.max = max self.vals = vals.split("|") if vals else [] self.suffix = suffix self.tooltip = tooltip def widget(self, parent=None): """ Returns the widget used, or creates it if not done yet. If parent is given, widget is inserted in parent's layout. """ if self._widget: return self._widget else: if "checkbox" in self.type: self._widget = QCheckBox(self.label) if self.default: self._widget.setChecked(True) if parent: parent.layout().addWidget(self._widget) elif "number" in self.type: l = QHBoxLayout() label = QLabel(self.label, parent) label.setWordWrap(True) l.addWidget(label, 8) self._widget = QSpinBox() self._widget.setValue(self.default if self.default else 0) if self.min: self._widget.setMinimum(self.min) if self.max: self._widget.setMaximum(self.max) if self.suffix: self._widget.setSuffix(self.suffix) l.addWidget(self._widget, 2) if parent: parent.layout().addLayout(l) elif "combo" in self.type: l = QHBoxLayout() label = QLabel(self.label, parent) label.setWordWrap(True) l.addWidget(label, 6) self._widget = QComboBox() self._widget.addItems(self.vals) if self.default: self._widget.setCurrentText(self.default) l.addWidget(self._widget, 2) if parent: parent.layout().addLayout(l) elif "text" in self.type: l = QHBoxLayout() label = QLabel(self.label, parent) label.setWordWrap(True) l.addWidget(label, 5) self._widget = QLineEdit() self._widget.setStyleSheet(style.lineEditSS()) if self.default: self._widget.setText(self.default) l.addWidget(self._widget, 3) if parent: parent.layout().addLayout(l) elif "label" in self.type: self._widget = QLabel(self.label, parent) self._widget.setWordWrap(True) if parent: parent.layout().addWidget(self._widget) if self.tooltip: self._widget.setToolTip(self.tooltip) return self._widget def value(self): """ Return the value contained in the widget. """ if not self._widget: return self.default else: if "checkbox" in self.type: return self._widget.isChecked() elif "number" in self.type: return self._widget.value() elif "combo" in self.type: return self._widget.currentText() elif "text" in self.type: return self._widget.text() manuskript-0.10.0/manuskript/importer/folderImporter.py000066400000000000000000000101611354442177200234020ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import os from manuskript.importer.abstractImporter import abstractImporter from manuskript.models import outlineItem from manuskript.enums import Outline from PyQt5.QtWidgets import qApp class folderImporter(abstractImporter): name = "Folder" description = "" fileFormat = "<>" icon = "folder" @classmethod def isValid(cls): return True def startImport(self, filePath, parentItem, settingsWidget, fromString=None): """ Imports from a folder. """ ext = self.getSetting("ext").value() ext = [e.strip().replace("*", "").lower() for e in ext.split(",")] sorting = self.getSetting("sortItems").value() items = [] stack = {} for dirpath, dirnames, filenames in os.walk(filePath): if dirpath in stack: item = stack[dirpath] else: # It's the parent folder, and we are not including it # so every item is attached to parentItem item = parentItem def addFile(f): fName, fExt = os.path.splitext(f) if fExt.lower() in ext: try: with open(os.path.join(dirpath, f), "r", encoding="utf-8") as fr: content = fr.read() child = outlineItem(title=fName, _type="md", parent=item) child._data[Outline.text] = content items.append(child) except UnicodeDecodeError: # Probably not a text file pass def addFolder(d): child = outlineItem(title=d, parent=item) items.append(child) stack[os.path.join(dirpath, d)] = child if not self.getSetting("separateFolderFiles").value(): # Import folder and files together (only makes differences if # they are sorted, really) allFiles = dirnames + filenames if sorting: allFiles = sorted(allFiles) for f in allFiles: if f in dirnames: addFolder(f) else: addFile(f) else: # Import first folders, then files if sorting: dirnames = sorted(dirnames) filenames = sorted(filenames) # Import folders for d in dirnames: addFolder(d) # Import files for f in filenames: addFile(f) return items def settingsWidget(self, widget): """ Takes a QWidget that can be modified and must be returned. """ # Add group group = self.addGroup(widget.toolBox.widget(0), qApp.translate("Import", "Folder import")) #group = cls.addPage(widget, "Folder import") self.addSetting("info", "label", qApp.translate("Import", """

Info: Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.

Only text files are supported (not images, binary or others).

""")) self.addSetting("ext", "text", qApp.translate("Import", "Include only those extensions:"), default="*.txt, *.md", tooltip=qApp.translate("Import", "Comma separated values")), self.addSetting("sortItems", "checkbox", qApp.translate("Import", "Sort items by name"), default=True), self.addSetting("separateFolderFiles", "checkbox", qApp.translate("Import", "Import folder then files"), default=True), self.addSettingsTo(group) return widget manuskript-0.10.0/manuskript/importer/markdownImporter.py000066400000000000000000000126471354442177200237640ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from manuskript.importer.abstractImporter import abstractImporter from manuskript.models import outlineItem from manuskript.enums import Outline from PyQt5.QtWidgets import qApp import re, os class markdownImporter(abstractImporter): name = "Markdown" description = "" fileFormat = "Markdown files (*.md *.txt *)" icon = "text-x-markdown" @classmethod def isValid(cls): return True def startImport(self, filePath, parentItem, settingsWidget, fromString=None): """ Very simple import from markdown. We just look at ATX headers (we ignore setext for the sake of simplicity, for now.) **A difficulty:** in the following example, we can do things with markdown headers (like go from level 1 to level 4 and back to level 2) that we cannot do in an outline. ``` # Level 1 # Level 1 ## Level 2 ### Level 3 #### Level 4 ##### Level 5 ### Level 3 # Level 1 #### Level 4? → Level 2 ### Level 3? → Level 2 ## Level 2 → Level 2 #### Level 4? → Level 3 ``` I think the current version of the imported manages that quite well. **A question:** In the following sample, the first Level 1 becomes a text element, because it has no other sub elements. But the content of second Level 1 becomes a text element, with no name. What name should we give it? ``` # Level 1 Some text content. Level 1 will become a text element. # Level 1 This content has no name. ## Level 2 ... ``` """ if not fromString: # Read file with open(filePath, "r", encoding="utf-8") as f: txt = f.read() else: txt = fromString items = [] parent = parentItem lastLevel = 0 content = "" def saveContent(content, parent): if content.strip(): child = outlineItem(title=parent.title(), parent=parent, _type="md") child._data[Outline.text] = content items.append(child) return "" def addTitle(name, parent, level): child = outlineItem(title=name, parent=parent) child.__miLevel = level items.append(child) return child ATXHeader = re.compile(r"(\#+)\s*(.+?)\s*\#*$") setextHeader1 = re.compile(r"([^\#-=].+)\n(===+)$", re.MULTILINE) setextHeader2 = re.compile(r"([^\#-=].+)\n(---+)$", re.MULTILINE) # We store the level of each item in a temporary var parent.__miLevel = 0 # markdown importer header level txt = txt.split("\n") skipNextLine = False for i in range(len(txt)): l = txt[i] l2 = "\n".join(txt[i:i+2]) header = False if skipNextLine: # Last line was a setext-style header. skipNextLine = False continue # Check ATX Header m = ATXHeader.match(l) if m: header = True level = len(m.group(1)) name = m.group(2) # Check setext header m = setextHeader1.match(l2) if not header and m and len(m.group(1)) == len(m.group(2)): header = True level = 1 name = m.group(1) skipNextLine = True m = setextHeader2.match(l2) if not header and m and len(m.group(1)) == len(m.group(2)): header = True level = 2 name = m.group(1) skipNextLine = True if header: # save content content = saveContent(content, parent) # get parent level while parent.__miLevel >= level: parent = parent.parent() # create title child = addTitle(name, parent, level) child.__miLevel = level # title becomes the new parent parent = child lastLevel = level else: content += l + "\n" saveContent(content, parent) # Clean up for i in items: if i.childCount() == 1 and i.children()[0].isText(): # We have a folder with only one text item # So we make it a text item i._data[Outline.type] = "md" i._data[Outline.text] = i.children()[0].text() c = i.removeChild(0) items.remove(c) return items def settingsWidget(self, widget): """ Takes a QWidget that can be modified and must be returned. """ # Add group group = self.addGroup(widget.toolBox.widget(0), qApp.translate("Import", "Markdown import")) #group = cls.addPage(widget, "Folder import") self.addSetting("info", "label", qApp.translate("Import", """Info: A very simple parser that will go through a markdown document and create items for each titles.
 """)) for s in self.settings: self.settings[s].widget(group) return widget manuskript-0.10.0/manuskript/importer/mindMapImporter.py000066400000000000000000000107101354442177200235140ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtWidgets import qApp, QMessageBox from manuskript.models import outlineItem from manuskript.enums import Outline from lxml import etree as ET from manuskript.functions import mainWindow from manuskript.importer.abstractImporter import abstractImporter from manuskript.converters import HTML2MD, HTML2PlainText class mindMapImporter(abstractImporter): name = "Mind Map" description = "" fileFormat = "Mind map Files (*.mm)" icon = "text-x-opml+xml" @classmethod def isValid(cls): return True def startImport(self, filePath, parentItem, settingsWidget, fromString=None): """ Import/export outline cards in mind map free plane. """ ret = False if filePath != "": # We have a filePath, so we read the file try: with open(filePath, 'rb') as f: content = f.read() except: return None elif fromString == "": # We have neither filePath nor fromString, so we leave return None else: # We load from string content = bytes(fromString, "utf-8") root = ET.fromstring(content) node = root.find("node") items = [] if node is not None: items.extend(self.parseItems(node, parentItem)) ret = True if not ret: QMessageBox.critical( settingsWidget, qApp.translate("Import", "Mind Map Import"), qApp.translate("Import", "This does not appear to be a valid Mind Map file.")) return None return items def settingsWidget(self, widget): """ Takes a QWidget that can be modified and must be returned. """ # Add group group = self.addGroup(widget.toolBox.widget(0), qApp.translate("Import", "Mind Map import")) self.addSetting("importTipAs", "combo", qApp.translate("Import", "Import tip as:"), vals="Text|Folder", ) for s in self.settings: self.settings[s].widget(group) return widget def parseItems(self, underElement, parentItem=None): items = [] # Title title = underElement.get('TEXT', "").replace("\n", " ") if not title: title = qApp.translate("Import", "Untitled") item = outlineItem(parent=parentItem, title=title) items.append(item) # URL url = underElement.get('LINK', None) # Rich text content content = "" content = underElement.find("richcontent") if content is not None: # In Freemind, can be note or node # Note: it's a note # Node: it's the title of the node, in rich text content_type = content.get("TYPE", "NOTE") content = ET.tostring(content.find("html")) if content and content_type == "NODE": # Content is title # convert rich text title (in html) to plain text title = HTML2PlainText(content) #.replace("\n", " ").strip() # Count the number of lines lines = [l.strip() for l in title.split("\n") if l.strip()] # If there is one line, we use it as title. # Otherwise we leave it to be inserted as a note. if len(lines) == 1: item.setData(Outline.title, "".join(lines)) content = "" if content: # Set the note content as text value content = HTML2MD(content) item.setData(Outline.notes, content) if url: # Set the url in notes item.setData(Outline.notes, item.data(Outline.notes) + "\n\n" + url) children = underElement.findall('node') # Process children if children is not None and len(children) > 0: for c in children: items.extend(self.parseItems(c, item)) # Process if no children elif self.getSetting("importTipAs").value() == "Text": # Transform item to text item.setData(Outline.type, 'md') # Move notes to text if item.data(Outline.notes): item.setData(Outline.text, item.data(Outline.notes)) item.setData(Outline.notes, "") return items manuskript-0.10.0/manuskript/importer/opmlImporter.py000066400000000000000000000072501354442177200231030ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtWidgets import qApp, QMessageBox from manuskript.models import outlineItem from manuskript.enums import Outline from lxml import etree as ET from manuskript.functions import mainWindow from manuskript.importer.abstractImporter import abstractImporter class opmlImporter(abstractImporter): name = "OPML" description = "" fileFormat = "OPML Files (*.opml *.xml)" icon = "text-x-opml+xml" @classmethod def isValid(cls): return True @classmethod def startImport(cls, filePath, parentItem, settingsWidget, fromString=None): """ Import/export outline cards in OPML format. """ ret = False if filePath != "": # We have a filePath, so we read the file try: with open(filePath, 'rb') as opmlFile: #opmlContent = cls.saveNewlines(opmlFile.read()) opmlContent = opmlFile.read() except: QMessageBox.critical(settingsWidget, qApp.translate("Import", "OPML Import"), qApp.translate("Import", "File open failed.")) return None elif fromString == "": # We have neither filePath nor fromString, so we leave return None else: # We load from string opmlContent = bytes(fromString, "utf-8") parsed = ET.fromstring(opmlContent) opmlNode = parsed bodyNode = opmlNode.find("body") items = [] if bodyNode is not None: outlineEls = bodyNode.findall("outline") if outlineEls is not None: for element in outlineEls: items.extend(cls.parseItems(element, parentItem)) ret = True if not ret: QMessageBox.critical( settingsWidget, qApp.translate("Import", "OPML Import"), qApp.translate("Import", "This does not appear to be a valid OPML file.")) return None return items @classmethod def parseItems(cls, underElement, parentItem=None): items = [] title = underElement.get('text') if title is not None: card = outlineItem(parent=parentItem, title=title) items.append(card) body = "" note = underElement.get('_note') if note is not None and not cls.isWhitespaceOnly(note): #body = cls.restoreNewLines(note) body = note children = underElement.findall('outline') if children is not None and len(children) > 0: for el in children: items.extend(cls.parseItems(el, card)) else: card.setData(Outline.type, 'md') card.setData(Outline.text, body) return items @classmethod def saveNewlines(cls, inString): """ Since XML parsers are notorious for stripping out significant newlines, save them in a form we can restore after the parse. """ inString = inString.replace("\r\n", "\n") inString = inString.replace("\n", "{{lf}}") return inString @classmethod def restoreNewLines(cls, inString): """ Restore any significant newlines """ return inString.replace("{{lf}}", "\n") @classmethod def isWhitespaceOnly(cls, inString): """ Determine whether or not a string only contains whitespace. """ s = cls.restoreNewLines(inString) s = ''.join(s.split()) return len(s) is 0 manuskript-0.10.0/manuskript/importer/pandocImporters.py000066400000000000000000000114031354442177200235560ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from manuskript.importer.abstractImporter import abstractImporter from manuskript.exporter.pandoc import pandocExporter from manuskript.importer.opmlImporter import opmlImporter from manuskript.importer.markdownImporter import markdownImporter from PyQt5.QtWidgets import qApp class pandocImporter(abstractImporter): formatFrom = "" engine = "Pandoc" extraArgs = [] @classmethod def isValid(cls): return pandocExporter().isValid() def startImport(self, filePath, parentItem, settingsWidget): formatTo = self.getSetting("formatTo").value().lower() wrap = self.getSetting("wrap").value().lower() # pandoc --from=markdown filename --to=opml --standalone args = [ "--from={}".format(self.formatFrom), filePath, "--to={}".format(formatTo), "--wrap={}".format(wrap), ] if formatTo == "opml": args.append("--standalone") args += self.extraArgs r = pandocExporter().run(args) if r is None: return None if formatTo == "opml": return self.opmlImporter.startImport("", parentItem, settingsWidget, fromString=r) elif formatTo == "markdown": return self.mdImporter.startImport(filePath, parentItem, settingsWidget, fromString=r) def settingsWidget(self, widget): """ Takes a QWidget that can be modified and must be returned. """ # Add group group = self.addGroup(widget.toolBox.widget(0), qApp.translate("Import", "Pandoc import")) self.addSetting("info", "label", qApp.translate("Import", """Info: Manuskript can import from markdown or OPML. Pandoc will convert your document to either (see option below), and then it will be imported in manuskript. One or the other might give better result depending on your document.
 """)) self.addSetting("formatTo", "combo", qApp.translate("Import", "Import using:"), vals="markdown|OPML") self.addSetting("wrap", "combo", qApp.translate("Import", "Wrap lines:"), vals="auto|none|preserve", default="none", tooltip=qApp.translate("Import", """

Should pandoc create cosmetic / non-semantic line-breaks?

auto: wraps at 72 characters.
none: no line wrap.
preserve: tries to preserves line wrap from the original document.

""")) for s in self.settings: self.settings[s].widget(group) self.mdImporter = markdownImporter() widget = self.mdImporter.settingsWidget(widget) self.opmlImporter = opmlImporter() widget = self.opmlImporter.settingsWidget(widget) return widget class markdownPandocImporter(pandocImporter): name = "Markdown" description = "Markdown, using pandoc" fileFormat = "Markdown files (*.md *.txt *)" icon = "text-x-markdown" formatFrom = "markdown" class ePubPandocImporter(pandocImporter): name = "ePub" description = "" fileFormat = "ePub files (*.epub)" icon = "application-epub+zip" formatFrom = "epub" class docXPandocImporter(pandocImporter): name = "DocX" description = "" fileFormat = "DocX files (*.docx)" icon = "application-vnd.openxmlformats-officedocument.wordprocessingml.document" formatFrom = "docx" class odtPandocImporter(pandocImporter): name = "ODT" description = "" fileFormat = "Open Document files (*.odt)" icon = "application-vnd.oasis.opendocument.text" formatFrom = "odt" class rstPandocImporter(pandocImporter): name = "reStructuredText" description = "" fileFormat = "reStructuredText files (*.rst)" icon = "text-plain" formatFrom = "rst" class HTMLPandocImporter(pandocImporter): name = "HTML" description = "" fileFormat = "HTML files (*.htm *.html)" icon = "text-html" formatFrom = "html" class LaTeXPandocImporter(pandocImporter): name = "LaTeX" description = "" fileFormat = "LaTeX files (*.tex)" icon = "text-x-tex" formatFrom = "latex" class OPMLPandocImporter(pandocImporter): name = "OPML" description = "" fileFormat = "OPML files (*.opml *.xml)" icon = "text-x-opml+xml" formatFrom = "opml" manuskript-0.10.0/manuskript/loadSave.py000066400000000000000000000030541354442177200203050ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- # The loadSave file calls the proper functions to load and save file # trying to detect the proper file format if it comes from an older version import os import zipfile import manuskript.load_save.version_0 as v0 import manuskript.load_save.version_1 as v1 def saveProject(version=None): # While debugging, we don't save the project # return if version == 0: return v0.saveProject() else: return v1.saveProject() def clearSaveCache(): v1.cache = {} def loadProject(project): # Detect version isZip = False version = 0 # Is it a zip? try: zf = zipfile.ZipFile(project) isZip = True except zipfile.BadZipFile: isZip = False # Does it have a VERSION in zip root? # Was used in transition between 0.2.0 and 0.3.0 # So VERSION part can be deleted for manuskript 0.4.0 if isZip and "VERSION" in zf.namelist(): version = int(zf.read("VERSION")) # Does it have a MANUSKRIPT in zip root? elif isZip and "MANUSKRIPT" in zf.namelist(): version = int(zf.read("MANUSKRIPT")) # Zip but no VERSION/MANUSKRIPT: oldest file format elif isZip: version = 0 # Not a zip else: with open(project, "r", encoding="utf-8") as f: version = int(f.read()) print("Loading:", project) print("Detected file format version: {}. Zip: {}.".format(version, isZip)) if version == 0: v0.loadProject(project) else: v1.loadProject(project, zip=isZip) manuskript-0.10.0/manuskript/load_save/000077500000000000000000000000001354442177200201305ustar00rootroot00000000000000manuskript-0.10.0/manuskript/load_save/__init__.py000066400000000000000000000000001354442177200222270ustar00rootroot00000000000000manuskript-0.10.0/manuskript/load_save/version_0.py000066400000000000000000000224361354442177200224150ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- # Version 0 of file saving format. # Was used at the beginning and up until version XXX when # it was superseded by Version 1, which is more open and flexible import os import zipfile from PyQt5.QtCore import QModelIndex, Qt from PyQt5.QtGui import QColor, QStandardItem from PyQt5.QtWidgets import qApp from lxml import etree as ET from manuskript import settings from manuskript.functions import iconColor, iconFromColorString, mainWindow from manuskript.models.characterModel import Character, CharacterInfo try: import zlib # Used with zipfile for compression compression = zipfile.ZIP_DEFLATED except: compression = zipfile.ZIP_STORED ########################################################################################### # SAVE ########################################################################################### def saveProject(): """ Saves the whole project. Call this function to save the project in Version 0 format. """ files = [] mw = mainWindow() files.append((saveStandardItemModelXML(mw.mdlFlatData), "flatModel.xml")) print("ERROR: file format 0 does not save characters !") # files.append((saveStandardItemModelXML(mw.mdlCharacter), # "perso.xml")) files.append((saveStandardItemModelXML(mw.mdlWorld), "world.xml")) files.append((saveStandardItemModelXML(mw.mdlLabels), "labels.xml")) files.append((saveStandardItemModelXML(mw.mdlStatus), "status.xml")) files.append((saveStandardItemModelXML(mw.mdlPlots), "plots.xml")) files.append((mw.mdlOutline.saveToXML(), "outline.xml")) files.append((settings.save(), "settings.pickle")) saveFilesToZip(files, mw.currentProject) def saveFilesToZip(files, zipname): """Saves given files to zipname. files is actually a list of (content, filename).""" zf = zipfile.ZipFile(zipname, mode="w") for content, filename in files: zf.writestr(filename, content, compress_type=compression) zf.close() def saveStandardItemModelXML(mdl, xml=None): """Saves the given QStandardItemModel to XML. If xml (filename) is given, saves to xml. Otherwise returns as string.""" root = ET.Element("model") root.attrib["version"] = qApp.applicationVersion() # Header header = ET.SubElement(root, "header") vHeader = ET.SubElement(header, "vertical") for x in range(mdl.rowCount()): vH = ET.SubElement(vHeader, "label") vH.attrib["row"] = str(x) vH.attrib["text"] = str(mdl.headerData(x, Qt.Vertical)) hHeader = ET.SubElement(header, "horizontal") for y in range(mdl.columnCount()): hH = ET.SubElement(hHeader, "label") hH.attrib["row"] = str(y) hH.attrib["text"] = str(mdl.headerData(y, Qt.Horizontal)) # Data data = ET.SubElement(root, "data") saveItem(data, mdl) # print(qApp.tr("Saving to {}.").format(xml)) if xml: ET.ElementTree(root).write(xml, encoding="UTF-8", xml_declaration=True, pretty_print=True) else: return ET.tostring(root, encoding="UTF-8", xml_declaration=True, pretty_print=True) def saveItem(root, mdl, parent=QModelIndex()): for x in range(mdl.rowCount(parent)): row = ET.SubElement(root, "row") row.attrib["row"] = str(x) for y in range(mdl.columnCount(parent)): col = ET.SubElement(row, "col") col.attrib["col"] = str(y) if mdl.data(mdl.index(x, y, parent), Qt.DecorationRole) != None: color = iconColor(mdl.data(mdl.index(x, y, parent), Qt.DecorationRole)).name(QColor.HexArgb) col.attrib["color"] = color if color != "#ff000000" else "#00000000" if mdl.data(mdl.index(x, y, parent)) != "": col.text = mdl.data(mdl.index(x, y, parent)) if mdl.hasChildren(mdl.index(x, y, parent)): saveItem(col, mdl, mdl.index(x, y, parent)) ########################################################################################### # LOAD ########################################################################################### def loadProject(project): files = loadFilesFromZip(project) mw = mainWindow() errors = [] if "flatModel.xml" in files: loadStandardItemModelXML(mw.mdlFlatData, files["flatModel.xml"], fromString=True) else: errors.append("flatModel.xml") if "perso.xml" in files: loadStandardItemModelXMLForCharacters(mw.mdlCharacter, files["perso.xml"]) else: errors.append("perso.xml") if "world.xml" in files: loadStandardItemModelXML(mw.mdlWorld, files["world.xml"], fromString=True) else: errors.append("world.xml") if "labels.xml" in files: loadStandardItemModelXML(mw.mdlLabels, files["labels.xml"], fromString=True) else: errors.append("labels.xml") if "status.xml" in files: loadStandardItemModelXML(mw.mdlStatus, files["status.xml"], fromString=True) else: errors.append("status.xml") if "plots.xml" in files: loadStandardItemModelXML(mw.mdlPlots, files["plots.xml"], fromString=True) else: errors.append("plots.xml") if "outline.xml" in files: mw.mdlOutline.loadFromXML(files["outline.xml"], fromString=True) else: errors.append("outline.xml") if "settings.pickle" in files: settings.load(files["settings.pickle"], fromString=True) else: errors.append("settings.pickle") return errors def loadFilesFromZip(zipname): """Returns the content of zipfile as a dict of filename:content.""" zf = zipfile.ZipFile(zipname) files = {} for f in zf.namelist(): # Some archiving programs (e.g. 7-Zip) also store entries for the directories when # creating an archive. We have no use for these entries; skip them entirely. if f[-1:] != '/': files[os.path.normpath(f)] = zf.read(f) return files def loadStandardItemModelXML(mdl, xml, fromString=False): """Load data to a QStandardItemModel mdl from xml. By default xml is a filename. If fromString=True, xml is a string containing the data.""" # print(qApp.tr("Loading {}... ").format(xml), end="") if not fromString: try: tree = ET.parse(xml) except: print("Failed.") return else: root = ET.fromstring(xml) # root = tree.getroot() # Header hLabels = [] vLabels = [] for l in root.find("header").find("horizontal").findall("label"): hLabels.append(l.attrib["text"]) for l in root.find("header").find("vertical").findall("label"): vLabels.append(l.attrib["text"]) # print(root.find("header").find("vertical").text) # mdl.setVerticalHeaderLabels(vLabels) # mdl.setHorizontalHeaderLabels(hLabels) # Populates with empty items for i in enumerate(vLabels): row = [] for r in enumerate(hLabels): row.append(QStandardItem()) mdl.appendRow(row) # Data data = root.find("data") loadItem(data, mdl) return True def loadItem(root, mdl, parent=QModelIndex()): for row in root: r = int(row.attrib["row"]) for col in row: c = int(col.attrib["col"]) item = mdl.itemFromIndex(mdl.index(r, c, parent)) if not item: item = QStandardItem() mdl.itemFromIndex(parent).setChild(r, c, item) if col.text: # mdl.setData(mdl.index(r, c, parent), col.text) item.setText(col.text) if "color" in col.attrib: # mdl.itemFromIndex(mdl.index(r, c, parent)).setIcon(iconFromColorString(col.attrib["color"])) item.setIcon(iconFromColorString(col.attrib["color"])) if len(col) != 0: # loadItem(col, mdl, mdl.index(r, c, parent)) loadItem(col, mdl, mdl.indexFromItem(item)) def loadStandardItemModelXMLForCharacters(mdl, xml): """ Loads a standardItemModel saved to XML by version 0, but for the new characterModel. @param mdl: characterModel @param xml: the content of the xml @return: nothing """ mdl = mainWindow().mdlCharacter root = ET.fromstring(xml) data = root.find("data") for row in data: char = Character(mdl) for col in row: c = int(col.attrib["col"]) # Value if col.text: char._data[c] = col.text # Color if "color" in col.attrib: char.setColor(QColor(col.attrib["color"])) # Infos if len(col) != 0: for rrow in col: info = CharacterInfo(char) for ccol in rrow: cc = int(ccol.attrib["col"]) if cc == 11 and ccol.text: info.description = ccol.text if cc == 12 and ccol.text: info.value = ccol.text char.infos.append(info) mdl.characters.append(char) manuskript-0.10.0/manuskript/load_save/version_1.py000066400000000000000000001032671354442177200224200ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- # Version 1 of file saving format. # Aims at providing a plain-text way of saving a project # (except for some elements), allowing collaborative work # versioning and third-party editing. import os import re import shutil import string import zipfile from collections import OrderedDict from PyQt5.QtCore import Qt, QModelIndex from PyQt5.QtGui import QColor, QStandardItem from manuskript import settings from manuskript.enums import Character, World, Plot, PlotStep, Outline from manuskript.functions import mainWindow, iconColor, iconFromColorString from manuskript.converters import HTML2PlainText from lxml import etree as ET from manuskript.load_save.version_0 import loadFilesFromZip from manuskript.models.characterModel import CharacterInfo from manuskript.models import outlineItem try: import zlib # Used with zipfile for compression compression = zipfile.ZIP_DEFLATED except: compression = zipfile.ZIP_STORED cache = {} characterMap = OrderedDict([ (Character.name, "Name"), (Character.ID, "ID"), (Character.importance, "Importance"), (Character.motivation, "Motivation"), (Character.goal, "Goal"), (Character.conflict, "Conflict"), (Character.epiphany, "Epiphany"), (Character.summarySentence, "Phrase Summary"), (Character.summaryPara, "Paragraph Summary"), (Character.summaryFull, "Full Summary"), (Character.notes, "Notes"), ]) # If true, logs infos while saving and loading. LOG = False def formatMetaData(name, value, tabLength=10): # Multiline formatting if len(value.split("\n")) > 1: value = "\n".join([" " * (tabLength + 1) + l for l in value.split("\n")])[tabLength + 1:] # Avoid empty description (don't know how much MMD loves that) if name == "": name = "None" # Escapes ":" in name name = name.replace(":", "_.._") return "{name}:{spaces}{value}\n".format( name=name, spaces=" " * (tabLength - len(name)), value=value ) def slugify(name): """ A basic slug function, that escapes all spaces to "_" and all non letters/digits to "-". @param name: name to slugify (str) @return: str """ valid = string.ascii_letters + string.digits newName = "" for c in name: if c in valid: newName += c elif c in string.whitespace: newName += "_" else: newName += "-" return newName def log(*args): if LOG: print(" ".join(str(a) for a in args)) def saveProject(zip=None): """ Saves the project. If zip is False, the project is saved as a multitude of plain-text files for the most parts and some XML or zip? for settings and stuff. If zip is True, everything is saved as a single zipped file. Easier to carry around, but does not allow collaborative work, versioning, or third-party editing. @param zip: if True, saves as a single file. If False, saves as plain-text. If None, tries to determine based on settings. @return: True if successful, False otherwise. """ if zip is None: zip = settings.saveToZip log("\n\nSaving to:", "zip" if zip else "folder") # List of files to be written files = [] # List of files to be removed removes = [] # List of files to be moved moves = [] # MainWindow interaction things. mw = mainWindow() project = mw.currentProject # Sanity check (see PR-583): make sure we actually have a current project. if project is None: print("Error: cannot save project because there is no current project in the UI.") return False # File format version files.append(("MANUSKRIPT", "1")) # General infos (book and author) # Saved in plain text, in infos.txt path = "infos.txt" content = "" for name, col in [ ("Title", 0), ("Subtitle", 1), ("Serie", 2), ("Volume", 3), ("Genre", 4), ("License", 5), ("Author", 6), ("Email", 7), ]: item = mw.mdlFlatData.item(0, col) if item: val = item.text().strip() else: val = "" if val: content += "{name}:{spaces}{value}\n".format( name=name, spaces=" " * (15 - len(name)), value=val ) files.append((path, content)) #################################################################################################################### # Summary # In plain text, in summary.txt path = "summary.txt" content = "" for name, col in [ ("Situation", 0), ("Sentence", 1), ("Paragraph", 2), ("Page", 3), ("Full", 4), ]: item = mw.mdlFlatData.item(1, col) if item: val = item.text().strip() else: val = "" if val: content += formatMetaData(name, val, 12) files.append((path, content)) #################################################################################################################### # Label & Status # In plain text for mdl, path in [ (mw.mdlStatus, "status.txt"), (mw.mdlLabels, "labels.txt") ]: content = "" # We skip the first row, which is empty and transparent for i in range(1, mdl.rowCount()): color = "" if mdl.data(mdl.index(i, 0), Qt.DecorationRole) is not None: color = iconColor(mdl.data(mdl.index(i, 0), Qt.DecorationRole)).name(QColor.HexRgb) color = color if color != "#ff000000" else "#00000000" text = mdl.data(mdl.index(i, 0)) if text: content += "{name}{color}\n".format( name=text, color="" if color == "" else ":" + " " * (20 - len(text)) + color ) files.append((path, content)) #################################################################################################################### # Characters # In a character folder path = os.path.join("characters", "{name}.txt") mdl = mw.mdlCharacter # Review characters for c in mdl.characters: # Generates file's content content = "" for m in characterMap: val = mdl.data(c.index(m.value)).strip() if val: content += formatMetaData(characterMap[m], val, 20) # Character's color: content += formatMetaData("Color", c.color().name(QColor.HexRgb), 20) # Character's infos for info in c.infos: content += formatMetaData(info.description, info.value, 20) # generate file's path cpath = path.format(name="{ID}-{slugName}".format( ID=c.ID(), slugName=slugify(c.name()) )) # Has the character been renamed? if c.lastPath and cpath != c.lastPath: moves.append((c.lastPath, cpath)) # Update character's path c.lastPath = cpath files.append((cpath, content)) #################################################################################################################### # Texts # In an outline folder mdl = mw.mdlOutline # Go through the tree f, m, r = exportOutlineItem(mdl.rootItem) files += f moves += m removes += r # Writes revisions (if asked for) if settings.revisions["keep"]: files.append(("revisions.xml", mdl.saveToXML())) #################################################################################################################### # World # Either in an XML file, or in lots of plain texts? # More probably text, since there might be writing done in third-party. path = "world.opml" mdl = mw.mdlWorld root = ET.Element("opml") root.attrib["version"] = "1.0" body = ET.SubElement(root, "body") addWorldItem(body, mdl) content = ET.tostring(root, encoding="UTF-8", xml_declaration=True, pretty_print=True) files.append((path, content)) #################################################################################################################### # Plots (mw.mdlPlots) # Either in XML or lots of plain texts? # More probably XML since there is not really a lot if writing to do (third-party) path = "plots.xml" mdl = mw.mdlPlots root = ET.Element("root") addPlotItem(root, mdl) content = ET.tostring(root, encoding="UTF-8", xml_declaration=True, pretty_print=True) files.append((path, content)) #################################################################################################################### # Settings # Saved in readable text (json) for easier versioning. But they mustn't be shared, it seems. # Maybe include them only if zipped? # Well, for now, we keep them here... files.append(("settings.txt", settings.save(protocol=0))) # We check if the file exist and we have write access. If the file does # not exist, we check the parent folder, because it might be a new project. if os.path.exists(project) and not os.access(project, os.W_OK) or \ not os.path.exists(project) and not os.access(os.path.dirname(project), os.W_OK): print("Error: you don't have write access to save this project there.") return False #################################################################################################################### # Save to zip if zip: # project = os.path.join( # os.path.dirname(project), # "_" + os.path.basename(project) # ) zf = zipfile.ZipFile(project, mode="w") for filename, content in files: zf.writestr(filename, content, compress_type=compression) zf.close() return True #################################################################################################################### # Save to plain text else: global cache # Project path dir = os.path.dirname(project) # Folder containing file: name of the project file (without .msk extension) folder = os.path.splitext(os.path.basename(project))[0] # Debug log("\nSaving to folder", folder) # If cache is empty (meaning we haven't loaded from disk), we wipe folder, just to be sure. if not cache: if os.path.exists(os.path.join(dir, folder)): shutil.rmtree(os.path.join(dir, folder)) # Moving files that have been renamed for old, new in moves: # Get full path oldPath = os.path.join(dir, folder, old) newPath = os.path.join(dir, folder, new) # Move the old file to the new place try: os.replace(oldPath, newPath) log("* Renaming/moving {} to {}".format(old, new)) except FileNotFoundError: # Maybe parent folder has been renamed pass # Update cache cache2 = {} for f in cache: f2 = f.replace(old, new) if f2 != f: log(" * Updating cache:", f, f2) cache2[f2] = cache[f] cache = cache2 # Writing files for path, content in files: filename = os.path.join(dir, folder, path) os.makedirs(os.path.dirname(filename), exist_ok=True) # Check if content is in cache, and write if necessary if path not in cache or cache[path] != content: log("* Writing file {} ({})".format(path, "not in cache" if path not in cache else "different")) # mode = "w" + ("b" if type(content) == bytes else "") if type(content) == bytes: with open(filename, "wb") as f: f.write(content) else: with open(filename, "w", encoding='utf8') as f: f.write(content) cache[path] = content # Removing phantoms for path in [p for p in cache if p not in [p for p, c in files]]: filename = os.path.join(dir, folder, path) log("* Removing", path) if os.path.isdir(filename): shutil.rmtree(filename) else: # elif os.path.exists(filename) os.remove(filename) # Clear cache cache.pop(path, 0) # Removing empty directories for root, dirs, files in os.walk(os.path.join(dir, folder, "outline")): for dir in dirs: newDir = os.path.join(root, dir) try: os.removedirs(newDir) log("* Removing empty directory:", newDir) except: # Directory not empty, we don't remove. pass # Write the project file's content with open(project, "w", encoding='utf8') as f: f.write("1") # Format number return True def addWorldItem(root, mdl, parent=QModelIndex()): """ Lists elements in a world model and create an OPML xml file. @param root: an Etree element @param mdl: a worldModel @param parent: the parent index in the world model @return: root, to which sub element have been added """ # List every row (every world item) for x in range(mdl.rowCount(parent)): # For each row, create an outline item. outline = ET.SubElement(root, "outline") for y in range(mdl.columnCount(parent)): val = mdl.data(mdl.index(x, y, parent)) if not val: continue for w in World: if y == w.value: outline.attrib[w.name] = val if mdl.hasChildren(mdl.index(x, y, parent)): addWorldItem(outline, mdl, mdl.index(x, y, parent)) return root def addPlotItem(root, mdl, parent=QModelIndex()): """ Lists elements in a plot model and create an xml file. @param root: an Etree element @param mdl: a plotModel @param parent: the parent index in the plot model @return: root, to which sub element have been added """ # List every row (every plot item) for x in range(mdl.rowCount(parent)): # For each row, create an outline item. outline = ET.SubElement(root, "plot") for y in range(mdl.columnCount(parent)): index = mdl.index(x, y, parent) val = mdl.data(index) # # if not val: # continue for w in Plot: if y == w.value and val: outline.attrib[w.name] = val # List characters as attrib if y == Plot.characters: if mdl.hasChildren(index): characters = [] for cX in range(mdl.rowCount(index)): for cY in range(mdl.columnCount(index)): cIndex = mdl.index(cX, cY, index) characters.append(mdl.data(cIndex)) outline.attrib[Plot.characters.name] = ",".join(characters) elif Plot.characters.name in outline.attrib: outline.attrib.pop(Plot.characters.name) # List resolution steps as sub items elif y == Plot.steps: if mdl.hasChildren(index): for cX in range(mdl.rowCount(index)): step = ET.SubElement(outline, "step") for cY in range(mdl.columnCount(index)): cIndex = mdl.index(cX, cY, index) # If empty, returns None, which creates trouble later with lxml, so default to "" val = mdl.data(cIndex) or "" for w in PlotStep: if cY == w.value and w.name: step.attrib[w.name] = val elif Plot.steps.name in outline.attrib: outline.attrib.pop(Plot.steps.name) return root def exportOutlineItem(root): """ Takes an outline item, and returns three lists: 1. of (`filename`, `content`), representing the whole tree of files to be written, in multimarkdown. 2. of (`filename`, `filename`) listing files to be moved 3. of `filename`, representing files to be removed. @param root: OutlineItem @return: [(str, str)], [(str, str)], [str] """ files = [] moves = [] removes = [] k = 0 for child in root.children(): spath = os.path.join(*outlineItemPath(child)) k += 1 # Has the item been renamed? lp = child._lastPath if lp and spath != lp: moves.append((lp, spath)) log(child.title(), "has been renamed (", lp, " → ", spath, ")") log(" → We mark for moving:", lp) # Updates item last's path child._lastPath = spath # Generating content if child.type() == "folder": fpath = os.path.join(spath, "folder.txt") content = outlineToMMD(child) files.append((fpath, content)) elif child.type() == "md": content = outlineToMMD(child) files.append((spath, content)) else: log("Unknown type") f, m, r = exportOutlineItem(child) files += f moves += m removes += r return files, moves, removes def outlineItemPath(item): """ Returns the outlineItem file path (like the path where it will be written on the disk). As a list of folder's name. To be joined by os.path.join. @param item: outlineItem @return: list of folder's names """ # Root item if not item.parent(): return ["outline"] else: # Count the number of siblings for padding '0' siblings = item.parent().childCount() # We check if multiple items have the same name # If so, we add "-ID" to their name siblingsNames = [s.title() for s in item.parent().children()] if siblingsNames.count(item.title()) > 1: title = "{}-{}".format(item.title(), item.ID()) else: title = item.title() name = "{ID}-{name}{ext}".format( ID=str(item.row()).zfill(len(str(siblings))), name=slugify(title), ext="" if item.type() == "folder" else ".md" ) return outlineItemPath(item.parent()) + [name] def outlineToMMD(item): content = "" # We don't want to write some datas (computed) exclude = [Outline.wordCount, Outline.goal, Outline.goalPercentage, Outline.revisions, Outline.text] # We want to force some data even if they're empty force = [Outline.compile] for attrib in Outline: if attrib in exclude: continue val = item.data(attrib.value) if val or attrib in force: content += formatMetaData(attrib.name, str(val), 15) content += "\n\n" content += item.data(Outline.text) return content ######################################################################################################################## # LOAD ######################################################################################################################## def loadProject(project, zip=None): """ Loads a project. @param project: the filename of the project to open. @param zip: whether the project is a zipped or not. @return: an array of errors, empty if None. """ mw = mainWindow() errors = [] #################################################################################################################### # Read and store everything in a dict log("\nLoading {} ({})".format(project, "ZIP" if zip else "not zip")) if zip: files = loadFilesFromZip(project) # Decode files for f in files: if f[-4:] not in [".xml", "opml"]: files[f] = files[f].decode("utf-8") else: # Project path dir = os.path.dirname(project) # Folder containing file: name of the project file (without .msk extension) folder = os.path.splitext(os.path.basename(project))[0] # The full path towards the folder containing files path = os.path.join(dir, folder, "") files = {} for dirpath, dirnames, filenames in os.walk(path): p = dirpath.replace(path, "") # Skip directories that begin with a period if p[:1] == ".": continue for f in filenames: # Skip filenames that begin with a period if f[:1] == ".": continue # mode = "r" + ("b" if f[-4:] in [".xml", "opml"] else "") if f[-4:] in [".xml", "opml"]: with open(os.path.join(dirpath, f), "rb") as fo: files[os.path.join(p, f)] = fo.read() else: with open(os.path.join(dirpath, f), "r", encoding="utf8") as fo: files[os.path.join(p, f)] = fo.read() # Saves to cache (only if we loaded from disk and not zip) global cache cache = files # FIXME: watch directory for changes # Sort files by keys files = OrderedDict(sorted(files.items())) #################################################################################################################### # Settings if "settings.txt" in files: settings.load(files["settings.txt"], fromString=True, protocol=0) else: errors.append("settings.txt") # Just to be sure settings.saveToZip = zip settings.defaultTextType = "md" #################################################################################################################### # Labels mdl = mw.mdlLabels mdl.appendRow(QStandardItem("")) # Empty = No labels if "labels.txt" in files: log("\nReading labels:") for s in files["labels.txt"].split("\n"): if not s: continue m = re.search(r"^(.*?):\s*(.*)$", s) txt = m.group(1) col = m.group(2) log("* Add status: {} ({})".format(txt, col)) icon = iconFromColorString(col) mdl.appendRow(QStandardItem(icon, txt)) else: errors.append("labels.txt") #################################################################################################################### # Status mdl = mw.mdlStatus mdl.appendRow(QStandardItem("")) # Empty = No status if "status.txt" in files: log("\nReading Status:") for s in files["status.txt"].split("\n"): if not s: continue log("* Add status:", s) mdl.appendRow(QStandardItem(s)) else: errors.append("status.txt") #################################################################################################################### # Infos mdl = mw.mdlFlatData if "infos.txt" in files: md, body = parseMMDFile(files["infos.txt"], asDict=True) row = [] for name in ["Title", "Subtitle", "Serie", "Volume", "Genre", "License", "Author", "Email"]: row.append(QStandardItem(md.get(name, ""))) mdl.appendRow(row) else: errors.append("infos.txt") #################################################################################################################### # Summary mdl = mw.mdlFlatData if "summary.txt" in files: md, body = parseMMDFile(files["summary.txt"], asDict=True) row = [] for name in ["Situation", "Sentence", "Paragraph", "Page", "Full"]: row.append(QStandardItem(md.get(name, ""))) mdl.appendRow(row) else: errors.append("summary.txt") #################################################################################################################### # Plots mdl = mw.mdlPlots if "plots.xml" in files: log("\nReading plots:") # xml = bytearray(files["plots.xml"], "utf-8") root = ET.fromstring(files["plots.xml"]) for plot in root: # Create row row = getStandardItemRowFromXMLEnum(plot, Plot) # Log log("* Add plot: ", row[0].text()) # Characters if row[Plot.characters].text(): IDs = row[Plot.characters].text().split(",") item = QStandardItem() for ID in IDs: item.appendRow(QStandardItem(ID.strip())) row[Plot.characters] = item # Subplots for step in plot: row[Plot.steps].appendRow( getStandardItemRowFromXMLEnum(step, PlotStep) ) # Add row to the model mdl.appendRow(row) else: errors.append("plots.xml") #################################################################################################################### # World mdl = mw.mdlWorld if "world.opml" in files: log("\nReading World:") # xml = bytearray(files["plots.xml"], "utf-8") root = ET.fromstring(files["world.opml"]) body = root.find("body") for outline in body: row = getOutlineItem(outline, World) mdl.appendRow(row) else: errors.append("world.opml") #################################################################################################################### # Characters mdl = mw.mdlCharacter log("\nReading Characters:") for f in [f for f in files if "characters" in f]: md, body = parseMMDFile(files[f]) c = mdl.addCharacter() c.lastPath = f color = False for desc, val in md: # Base infos if desc in characterMap.values(): key = [key for key, value in characterMap.items() if value == desc][0] index = c.index(key.value) mdl.setData(index, val) # Character color elif desc == "Color" and not color: c.setColor(QColor(val)) # We remember the first time we found "Color": it is the icon color. # If "Color" comes a second time, it is a Character's info. color = True # Character's infos else: c.infos.append(CharacterInfo(c, desc, val)) log("* Adds {} ({})".format(c.name(), c.ID())) #################################################################################################################### # Texts # We read outline form the outline folder. If revisions are saved, then there's also a revisions.xml which contains # everything, but the outline folder takes precedence (in cases it's been edited outside of manuskript. mdl = mw.mdlOutline log("\nReading outline:") paths = [f for f in files if "outline" in f] outline = OrderedDict() # We create a structure of imbricated OrderedDict to store the whole tree. for f in paths: split = f.split(os.path.sep)[1:] # log("* ", split) last = "" parent = outline parentLastPath = "outline" for i in split: if last: parent = parent[last] parentLastPath = os.path.join(parentLastPath, last) last = i if not i in parent: # If not last item, then it is a folder if i != split[-1]: parent[i] = OrderedDict() # If file, we store it else: parent[i] = files[f] # We store f to add it later as lastPath parent[i + ":lastPath"] = os.path.join(parentLastPath, i) # We now just have to recursively add items. addTextItems(mdl, outline) # Adds revisions if "revisions.xml" in files: root = ET.fromstring(files["revisions.xml"]) appendRevisions(mdl, root) # Check IDS mdl.rootItem.checkIDs() return errors def addTextItems(mdl, odict, parent=None): """ Adds a text / outline items from an OrderedDict. @param mdl: model to add to @param odict: OrderedDict @return: nothing """ if parent is None: parent = mdl.rootItem for k in odict: # In case k is a folder: if type(odict[k]) == OrderedDict and "folder.txt" in odict[k]: # Adds folder log("{}* Adds {} to {} (folder)".format(" " * parent.level(), k, parent.title())) item = outlineFromMMD(odict[k]["folder.txt"], parent=parent) item._lastPath = odict[k + ":lastPath"] # Read content addTextItems(mdl, odict[k], parent=item) # k is not a folder elif type(odict[k]) == str and k != "folder.txt" and not ":lastPath" in k: log("{}* Adds {} to {} (file)".format(" " * parent.level(), k, parent.title())) item = outlineFromMMD(odict[k], parent=parent) item._lastPath = odict[k + ":lastPath"] elif not ":lastPath" in k and k != "folder.txt": print("* Strange things in file {}".format(k)) def outlineFromMMD(text, parent): """ Creates outlineItem from multimarkdown file. @param text: content of the file @param parent: appends item to parent (outlineItem) @return: outlineItem """ item = outlineItem(parent=parent) md, body = parseMMDFile(text, asDict=True) # Store metadata for k in md: if k in Outline.__members__: item.setData(Outline.__members__[k], str(md[k])) # Store body item.setData(Outline.text, str(body)) # Set file format to "md" # (Old version of manuskript had different file formats: text, t2t, html and md) # If file format is html, convert to plain text: if item.type() == "html": item.setData(Outline.text, HTML2PlainText(body)) if item.type() in ["txt", "t2t", "html"]: item.setData(Outline.type, "md") return item def appendRevisions(mdl, root): """ Parse etree item to find outlineItem's with revisions, and adds them to model `mdl`. @param mdl: outlineModel @param root: etree @return: nothing """ for child in root: # Recursively go through items if child.tag == "outlineItem": appendRevisions(mdl, child) # Revision found. elif child.tag == "revision": # Get root's ID ID = root.attrib["ID"] if not ID: log("* Serious problem: no ID!") continue # Find outline item in model item = mdl.getItemByID(ID) if not item: log("* Error: no item whose ID is", ID) continue # Store revision log("* Appends revision ({}) to {}".format(child.attrib["timestamp"], item.title())) item.appendRevision(child.attrib["timestamp"], child.attrib["text"]) def getOutlineItem(item, enum): """ Reads outline items from an opml file. Returns a row of QStandardItem, easy to add to a QStandardItemModel. @param item: etree item @param enum: enum to read keys from @return: [QStandardItem] """ row = getStandardItemRowFromXMLEnum(item, enum) log("* Add worldItem:", row[0].text()) for child in item: sub = getOutlineItem(child, enum) row[0].appendRow(sub) return row def getStandardItemRowFromXMLEnum(item, enum): """ Reads and etree item and creates a row of QStandardItems by cross-referencing an enum. Returns a list of QStandardItems that can be added to a QStandardItemModel by appendRow. @param item: the etree item @param enum: the enum @return: list of QStandardItems """ row = [] for i in range(len(enum)): row.append(QStandardItem("")) for name in item.attrib: if name in enum.__members__: row[enum[name].value] = QStandardItem(item.attrib[name]) return row def parseMMDFile(text, asDict=False): """ Takes the content of a MultiMarkDown file (str) and returns: 1. A list containing metadatas: (description, value) if asDict is False. If asDict is True, returns metadatas as an OrderedDict. Be aware that if multiple metadatas have the same description (which is stupid, but hey), they will be lost except the last one. 2. The body of the file @param text: the content of the file @return: (list, str) or (OrderedDict, str) """ md = [] mdd = OrderedDict() body = [] descr = "" val = "" inBody = False for s in text.split("\n"): if not inBody: m = re.match(r"^([^\s].*?):\s*(.*)$", s) if m: # Commit last metadata if descr: if descr == "None": descr = "" md.append((descr, val)) mdd[descr] = val descr = "" val = "" # Store new values descr = m.group(1) val = m.group(2) elif s[:4] == " ": val += "\n" + s.strip() elif s == "": # End of metadatas inBody = True # Commit last metadata if descr: if descr == "None": descr = "" md.append((descr, val)) mdd[descr] = val else: body.append(s) # We remove the second empty line (since we save with two empty lines) if body and body[0] == "": body = body[1:] body = "\n".join(body) if not asDict: return md, body else: return mdd, body manuskript-0.10.0/manuskript/main.py000066400000000000000000000241761354442177200175030ustar00rootroot00000000000000# -*- coding: utf-8 -*- import faulthandler import os import platform import sys import manuskript.ui.views.webView from PyQt5.QtCore import QLocale, QTranslator, QSettings, Qt from PyQt5.QtGui import QIcon, QColor, QPalette from PyQt5.QtWidgets import QApplication, qApp, QStyleFactory from manuskript.functions import appPath, writablePath from manuskript.version import getVersion faulthandler.enable() def prepare(tests=False): app = QApplication(sys.argv) app.setOrganizationName("manuskript"+("_tests" if tests else "")) app.setOrganizationDomain("www.theologeek.ch") app.setApplicationName("manuskript"+("_tests" if tests else "")) app.setApplicationVersion(getVersion()) print("Running manuskript version {}.".format(getVersion())) icon = QIcon() for i in [16, 32, 64, 128, 256, 512]: icon.addFile(appPath("icons/Manuskript/icon-{}px.png".format(i))) qApp.setWindowIcon(icon) app.setStyle("Fusion") # Load style from QSettings settings = QSettings(app.organizationName(), app.applicationName()) if settings.contains("applicationStyle"): style = settings.value("applicationStyle") app.setStyle(style) # Translation process appTranslator = QTranslator(app) # By default: locale def tryLoadTranslation(translation, source): """Tries to load and activate a given translation for use.""" if appTranslator.load(translation, appPath("i18n")): app.installTranslator(appTranslator) print("Loaded translation: {}".format(translation)) # Note: QTranslator.load() does some fancy heuristics where it simplifies # the given locale until it is 'close enough' if the given filename does # not work out. For example, if given 'i18n/manuskript_en_US.qm', it tries: # * i18n/manuskript_en_US.qm.qm # * i18n/manuskript_en_US.qm # * i18n/manuskript_en_US # * i18n/manuskript_en.qm # * i18n/manuskript_en # * i18n/manuskript.qm # * i18n/manuskript # We have no way to determining what it eventually went with, so mind your # filenames when you observe strange behaviour with the loaded translations. return True else: print("No translation found or loaded. ({})".format(translation)) return False def activateTranslation(translation, source): """Loads the most suitable translation based on the available information.""" using_builtin_translation = True if (translation != ""): # empty string == 'no translation, use builtin' if isinstance(translation, str): if tryLoadTranslation(translation, source): using_builtin_translation = False else: # A list of language codes to try. Once something works, we're done. # This logic is loosely based on the working of QTranslator.load(QLocale, ...); # it allows us to more accurately detect the language used for the user interface. for language_code in translation: lc = language_code.replace('-', '_') if lc.lower() == 'en_US'.lower(): break if tryLoadTranslation("manuskript_{}.qm".format(lc), source): using_builtin_translation = False break if using_builtin_translation: print("Using the builtin translation.") # Load application translation translation = "" source = "default" if settings.contains("applicationTranslation"): # Use the language configured by the user. translation = settings.value("applicationTranslation") source = "user setting" else: # Auto-detect based on system locale. translation = QLocale().uiLanguages() source = "available ui languages" print("Preferred translation: {} (based on {})".format(("builtin" if translation == "" else translation), source)) activateTranslation(translation, source) def respectSystemDarkThemeSetting(): """Adjusts the Qt theme to match the OS 'dark theme' setting configured by the user.""" if platform.system() is not 'Windows': return # Basic Windows 10 Dark Theme support. # Source: https://forum.qt.io/topic/101391/windows-10-dark-theme/4 themeSettings = QSettings("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", QSettings.NativeFormat) if themeSettings.value("AppsUseLightTheme") == 0: darkPalette = QPalette() darkColor = QColor(45,45,45) disabledColor = QColor(127,127,127) darkPalette.setColor(QPalette.Window, darkColor) darkPalette.setColor(QPalette.WindowText, Qt.GlobalColor.white) darkPalette.setColor(QPalette.Base, QColor(18,18,18)) darkPalette.setColor(QPalette.AlternateBase, darkColor) darkPalette.setColor(QPalette.ToolTipBase, Qt.GlobalColor.white) darkPalette.setColor(QPalette.ToolTipText, Qt.GlobalColor.white) darkPalette.setColor(QPalette.Text, Qt.GlobalColor.white) darkPalette.setColor(QPalette.Disabled, QPalette.Text, disabledColor) darkPalette.setColor(QPalette.Button, darkColor) darkPalette.setColor(QPalette.ButtonText, Qt.GlobalColor.white) darkPalette.setColor(QPalette.Disabled, QPalette.ButtonText, disabledColor) darkPalette.setColor(QPalette.BrightText, Qt.GlobalColor.red) darkPalette.setColor(QPalette.Link, QColor(42, 130, 218)) darkPalette.setColor(QPalette.Highlight, QColor(42, 130, 218)) darkPalette.setColor(QPalette.HighlightedText, Qt.GlobalColor.black) darkPalette.setColor(QPalette.Disabled, QPalette.HighlightedText, disabledColor) # Fixes ugly (not to mention hard to read) disabled menu items. # Source: https://bugreports.qt.io/browse/QTBUG-10322?focusedCommentId=371060#comment-371060 darkPalette.setColor(QPalette.Disabled, QPalette.Light, Qt.GlobalColor.transparent) app.setPalette(darkPalette) # This broke the Settings Dialog at one point... and then it stopped breaking it. # TODO: Why'd it break? Check if tooltips look OK... and if not, make them look OK. #app.setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }") respectSystemDarkThemeSetting() QIcon.setThemeSearchPaths(QIcon.themeSearchPaths() + [appPath("icons")]) QIcon.setThemeName("NumixMsk") # Font siue if settings.contains("appFontSize"): f = qApp.font() f.setPointSize(settings.value("appFontSize", type=int)) app.setFont(f) # Main window from manuskript.mainWindow import MainWindow MW = MainWindow() # We store the system default cursor flash time to be able to restore it # later if necessary MW._defaultCursorFlashTime = qApp.cursorFlashTime() # Command line project if len(sys.argv) > 1 and sys.argv[1][-4:] == ".msk": if os.path.exists(sys.argv[1]): path = os.path.abspath(sys.argv[1]) MW._autoLoadProject = path return app, MW def launch(app, MW = None): if MW is None: from manuskript.functions import mainWindow MW = mainWindow() MW.show() # Support for IPython Jupyter QT Console as a debugging aid. # Last argument must be --console to enable it # Code reference : # https://github.com/ipython/ipykernel/blob/master/examples/embedding/ipkernel_qtapp.py # https://github.com/ipython/ipykernel/blob/master/examples/embedding/internal_ipkernel.py if len(sys.argv) > 1 and sys.argv[-1] == "--console": try: from IPython.lib.kernel import connect_qtconsole from ipykernel.kernelapp import IPKernelApp # Only to ensure matplotlib QT mainloop integration is available import matplotlib # Create IPython kernel within our application kernel = IPKernelApp.instance() # Initialize it and use matplotlib for main event loop integration with QT kernel.initialize(['python', '--matplotlib=qt']) # Create the console in a new process and connect console = connect_qtconsole(kernel.abs_connection_file, profile=kernel.profile) # Export MW and app variable to the console's namespace kernel.shell.user_ns['MW'] = MW kernel.shell.user_ns['app'] = app kernel.shell.user_ns['kernel'] = kernel kernel.shell.user_ns['console'] = console # When we close manuskript, make sure we close the console process and stop the # IPython kernel's mainloop, otherwise the app will never finish. def console_cleanup(): app.quit() console.kill() kernel.io_loop.stop() app.lastWindowClosed.connect(console_cleanup) # Very important, IPython-specific step: this gets GUI event loop # integration going, and it replaces calling app.exec_() kernel.start() except Exception as e: print("Console mode requested but error initializing IPython : %s" % str(e)) print("To make use of the Interactive IPython QT Console, make sure you install : ") print("$ pip3 install ipython qtconsole matplotlib") qApp.exec_() else: qApp.exec_() qApp.deleteLater() def run(): """ Run separates prepare and launch for two reasons: 1. I've read somewhere it helps with potential segfault (see comment below) 2. So that prepare can be used in tests, without running the whole thing """ # Need to return and keep `app` otherwise it gets deleted. app, MW = prepare() # Separating launch to avoid segfault, so it seem. # Cf. http://stackoverflow.com/questions/12433491/is-this-pyqt-4-python-bug-or-wrongly-behaving-code launch(app, MW) if __name__ == "__main__": run() manuskript-0.10.0/manuskript/mainWindow.py000066400000000000000000002032601354442177200206640ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import imp import os import re from PyQt5.Qt import qVersion, PYQT_VERSION_STR from PyQt5.QtCore import (pyqtSignal, QSignalMapper, QTimer, QSettings, Qt, QPoint, QRegExp, QUrl, QSize, QModelIndex) from PyQt5.QtGui import QStandardItemModel, QIcon, QColor from PyQt5.QtWidgets import QMainWindow, QHeaderView, qApp, QMenu, QActionGroup, QAction, QStyle, QListWidgetItem, \ QLabel, QDockWidget, QWidget, QMessageBox from manuskript import settings from manuskript.enums import Character, PlotStep, Plot, World, Outline from manuskript.functions import wordCount, appPath, findWidgetsOfClass import manuskript.functions as F from manuskript import loadSave from manuskript.models.characterModel import characterModel from manuskript.models import outlineModel from manuskript.models.plotModel import plotModel from manuskript.models.worldModel import worldModel from manuskript.settingsWindow import settingsWindow from manuskript.ui import style from manuskript.ui.about import aboutDialog from manuskript.ui.collapsibleDockWidgets import collapsibleDockWidgets from manuskript.ui.importers.importer import importerDialog from manuskript.ui.exporters.exporter import exporterDialog from manuskript.ui.helpLabel import helpLabel from manuskript.ui.mainWindow import Ui_MainWindow from manuskript.ui.tools.frequencyAnalyzer import frequencyAnalyzer from manuskript.ui.views.outlineDelegates import outlineCharacterDelegate from manuskript.ui.views.plotDelegate import plotDelegate from manuskript.ui.views.MDEditView import MDEditView from manuskript.ui.statusLabel import statusLabel # Spellcheck support from manuskript.ui.views.textEditView import textEditView from manuskript.functions import Spellchecker class MainWindow(QMainWindow, Ui_MainWindow): # dictChanged = pyqtSignal(str) # Tab indexes TabInfos = 0 TabSummary = 1 TabPersos = 2 TabPlots = 3 TabWorld = 4 TabOutline = 5 TabRedac = 6 TabDebug = 7 SHOW_DEBUG_TAB = False def __init__(self): QMainWindow.__init__(self) self.setupUi(self) # Var self.currentProject = None self.projectDirty = None # has the user made any unsaved changes ? self._lastFocus = None self._lastMDEditView = None self._defaultCursorFlashTime = 1000 # Overridden at startup with system # value. In manuskript.main. self._autoLoadProject = None # Used to load a command line project self.readSettings() # UI self.setupMoreUi() self.statusLabel = statusLabel(parent=self) self.statusLabel.setAutoFillBackground(True) self.statusLabel.hide() # Welcome self.welcome.updateValues() self.switchToWelcome() # Word count self.mprWordCount = QSignalMapper(self) for t, i in [ (self.txtSummarySentence, 0), (self.txtSummaryPara, 1), (self.txtSummaryPage, 2), (self.txtSummaryFull, 3) ]: t.textChanged.connect(self.mprWordCount.map) self.mprWordCount.setMapping(t, i) self.mprWordCount.mapped.connect(self.wordCount) # Snowflake Method Cycle self.mapperCycle = QSignalMapper(self) for t, i in [ (self.btnStepTwo, 0), (self.btnStepThree, 1), (self.btnStepFour, 2), (self.btnStepFive, 3), (self.btnStepSix, 4), (self.btnStepSeven, 5), (self.btnStepEight, 6) ]: t.clicked.connect(self.mapperCycle.map) self.mapperCycle.setMapping(t, i) self.mapperCycle.mapped.connect(self.clickCycle) self.cmbSummary.currentIndexChanged.connect(self.summaryPageChanged) self.cmbSummary.setCurrentIndex(0) self.cmbSummary.currentIndexChanged.emit(0) # Main Menu for i in [self.actSave, self.actSaveAs, self.actCloseProject, self.menuEdit, self.menuView, self.menuOrganize, self.menuTools, self.menuHelp, self.actImport, self.actCompile, self.actSettings]: i.setEnabled(False) # Main Menu:: File self.actOpen.triggered.connect(self.welcome.openFile) self.actSave.triggered.connect(self.saveDatas) self.actSaveAs.triggered.connect(self.welcome.saveAsFile) self.actImport.triggered.connect(self.doImport) self.actCompile.triggered.connect(self.doCompile) self.actCloseProject.triggered.connect(self.closeProject) self.actQuit.triggered.connect(self.close) # Main menu:: Edit self.actCopy.triggered.connect(self.documentsCopy) self.actCut.triggered.connect(self.documentsCut) self.actPaste.triggered.connect(self.documentsPaste) self.actRename.triggered.connect(self.documentsRename) self.actDuplicate.triggered.connect(self.documentsDuplicate) self.actDelete.triggered.connect(self.documentsDelete) self.actLabels.triggered.connect(self.settingsLabel) self.actStatus.triggered.connect(self.settingsStatus) self.actSettings.triggered.connect(self.settingsWindow) # Main menu:: Edit:: Format self.actHeaderSetextL1.triggered.connect(self.formatSetext1) self.actHeaderSetextL2.triggered.connect(self.formatSetext2) self.actHeaderAtxL1.triggered.connect(self.formatAtx1) self.actHeaderAtxL2.triggered.connect(self.formatAtx2) self.actHeaderAtxL3.triggered.connect(self.formatAtx3) self.actHeaderAtxL4.triggered.connect(self.formatAtx4) self.actHeaderAtxL5.triggered.connect(self.formatAtx5) self.actHeaderAtxL6.triggered.connect(self.formatAtx6) self.actFormatBold.triggered.connect(self.formatBold) self.actFormatItalic.triggered.connect(self.formatItalic) self.actFormatStrike.triggered.connect(self.formatStrike) self.actFormatVerbatim.triggered.connect(self.formatVerbatim) self.actFormatSuperscript.triggered.connect(self.formatSuperscript) self.actFormatSubscript.triggered.connect(self.formatSubscript) self.actFormatCommentLines.triggered.connect(self.formatCommentLines) self.actFormatList.triggered.connect(self.formatList) self.actFormatOrderedList.triggered.connect(self.formatOrderedList) self.actFormatBlockquote.triggered.connect(self.formatBlockquote) self.actFormatCommentBlock.triggered.connect(self.formatCommentBlock) self.actFormatClear.triggered.connect(self.formatClear) # Main menu:: Organize self.actMoveUp.triggered.connect(self.documentsMoveUp) self.actMoveDown.triggered.connect(self.documentsMoveDown) self.actSplitDialog.triggered.connect(self.documentsSplitDialog) self.actSplitCursor.triggered.connect(self.documentsSplitCursor) self.actMerge.triggered.connect(self.documentsMerge) # Main Menu:: view self.generateViewMenu() self.actModeGroup = QActionGroup(self) self.actModeSimple.setActionGroup(self.actModeGroup) self.actModeFiction.setActionGroup(self.actModeGroup) self.actModeSimple.triggered.connect(self.setViewModeSimple) self.actModeFiction.triggered.connect(self.setViewModeFiction) # Main Menu:: Tool self.actToolFrequency.triggered.connect(self.frequencyAnalyzer) self.actAbout.triggered.connect(self.about) self.makeUIConnections() # self.loadProject(os.path.join(appPath(), "test_project.zip")) def updateDockVisibility(self, restore=False): """ Saves the state of the docks visibility. Or if `restore` is True, restores from `self._dckVisibility`. This allows to hide the docks while showing the welcome screen, and then restore them as they were. If `self._dckVisibility` contains "LOCK", then we don't override values with current visibility state. This is used the first time we load. "LOCK" is then removed. """ docks = [ self.dckCheatSheet, self.dckNavigation, self.dckSearch, ] for d in docks: if not restore: # We store the values, but only if "LOCK" is not present if not "LOCK" in self._dckVisibility: self._dckVisibility[d.objectName()] = d.isVisible() # Hide the dock d.setVisible(False) else: # Restore the dock's visibility based on stored value d.setVisible(self._dckVisibility[d.objectName()]) # Lock is used only once, at start up. We can remove it if "LOCK" in self._dckVisibility: self._dckVisibility.pop("LOCK") def switchToWelcome(self): """ While switching to welcome screen, we have to hide all the docks. Otherwise one could use the search dock, and manuskript would crash. Plus it's unnecessary distraction. But we also want to restore them to their visibility prior to switching, so we store states. """ # Stores the state of docks self.updateDockVisibility() # Hides the toolbar self.toolbar.setVisible(False) # Switch to welcome screen self.stack.setCurrentIndex(0) def switchToProject(self): """Restores docks and toolbar visibility, and switch to project.""" # Restores the docks visibility self.updateDockVisibility(restore=True) # Show the toolbar self.toolbar.setVisible(True) self.stack.setCurrentIndex(1) ############################################################################### # GENERAL / UI STUFF ############################################################################### def tabMainChanged(self): "Called when main tab changes." tabIsEditor = self.tabMain.currentIndex() == self.TabRedac self.menuOrganize.menuAction().setEnabled(tabIsEditor) for i in [self.actCut, self.actCopy, self.actPaste, self.actDelete, self.actRename]: i.setEnabled(tabIsEditor) def focusChanged(self, old, new): """ We get notified by qApp when focus changes, from old to new widget. """ # If new is a MDEditView, we keep it in memory if issubclass(type(new), MDEditView): self._lastMDEditView = new else: self._lastMDEditView = None # Determine which view had focus last, to send the keyboard shortcuts # to the right place targets = [ self.treeRedacOutline, self.mainEditor ] while new is not None: if new in targets: self._lastFocus = new break new = new.parent() def projectName(self): """ Returns a user-friendly name for the loaded project. """ pName = os.path.split(self.currentProject)[1] if pName.endswith('.msk'): pName=pName[:-4] return pName ############################################################################### # SUMMARY ############################################################################### def summaryPageChanged(self, index): fractalButtons = [ self.btnStepTwo, self.btnStepThree, self.btnStepFive, self.btnStepSeven, ] for b in fractalButtons: b.setVisible(fractalButtons.index(b) == index) ############################################################################### # OUTLINE ############################################################################### def outlineRemoveItemsRedac(self): self.treeRedacOutline.delete() def outlineRemoveItemsOutline(self): self.treeOutlineOutline.delete() ############################################################################### # CHARACTERS ############################################################################### def changeCurrentCharacter(self, trash=None): """ @return: """ c = self.lstCharacters.currentCharacter() if not c: self.tabPersos.setEnabled(False) return self.tabPersos.setEnabled(True) index = c.index() for w in [ self.txtPersoName, self.sldPersoImportance, self.txtPersoMotivation, self.txtPersoGoal, self.txtPersoConflict, self.txtPersoEpiphany, self.txtPersoSummarySentence, self.txtPersoSummaryPara, self.txtPersoSummaryFull, self.txtPersoNotes, ]: w.setCurrentModelIndex(index) # Button color self.updateCharacterColor(c.ID()) # Slider importance self.updateCharacterImportance(c.ID()) # Character Infos self.tblPersoInfos.setRootIndex(index) if self.mdlCharacter.rowCount(index): self.updatePersoInfoView() def updatePersoInfoView(self): self.tblPersoInfos.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents) self.tblPersoInfos.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch) self.tblPersoInfos.verticalHeader().hide() def updateCharacterColor(self, ID): c = self.mdlCharacter.getCharacterByID(ID) color = c.color().name() self.btnPersoColor.setStyleSheet("background:{};".format(color)) def updateCharacterImportance(self, ID): c = self.mdlCharacter.getCharacterByID(ID) self.sldPersoImportance.setValue(int(c.importance())) ############################################################################### # PLOTS ############################################################################### def changeCurrentPlot(self): index = self.lstPlots.currentPlotIndex() if not index.isValid(): self.tabPlot.setEnabled(False) return self.tabPlot.setEnabled(True) self.txtPlotName.setCurrentModelIndex(index) self.txtPlotDescription.setCurrentModelIndex(index) self.txtPlotResult.setCurrentModelIndex(index) self.sldPlotImportance.setCurrentModelIndex(index) self.lstPlotPerso.setRootIndex(index.sibling(index.row(), Plot.characters)) # Slider importance self.updatePlotImportance(index.row()) subplotindex = index.sibling(index.row(), Plot.steps) self.lstSubPlots.setRootIndex(subplotindex) if self.mdlPlots.rowCount(subplotindex): self.updateSubPlotView() self.txtSubPlotSummary.setCurrentModelIndex(QModelIndex()) self.lstPlotPerso.selectionModel().clear() def updateSubPlotView(self): # Hide columns # FIXME: when columns are hidden, and drag and drop InternalMove is enabled # as well as selectionBehavior=SelectRows, then when moving a row # hidden cells (here: summary and ID) are deleted... # So instead we set their width to 0. #for i in range(self.mdlPlots.columnCount()): #self.lstSubPlots.hideColumn(i) #self.lstSubPlots.showColumn(PlotStep.name) #self.lstSubPlots.showColumn(PlotStep.meta) self.lstSubPlots.horizontalHeader().setSectionResizeMode( PlotStep.ID, QHeaderView.Fixed) self.lstSubPlots.horizontalHeader().setSectionResizeMode( PlotStep.summary, QHeaderView.Fixed) self.lstSubPlots.horizontalHeader().resizeSection( PlotStep.ID, 0) self.lstSubPlots.horizontalHeader().resizeSection( PlotStep.summary, 0) self.lstSubPlots.horizontalHeader().setSectionResizeMode( PlotStep.name, QHeaderView.Stretch) self.lstSubPlots.horizontalHeader().setSectionResizeMode( PlotStep.meta, QHeaderView.ResizeToContents) self.lstSubPlots.verticalHeader().hide() def updatePlotImportance(self, row): imp = self.mdlPlots.getPlotImportanceByRow(row) self.sldPlotImportance.setValue(int(imp)) def changeCurrentSubPlot(self, index): index = index.sibling(index.row(), PlotStep.summary) self.txtSubPlotSummary.setColumn(PlotStep.summary) self.txtSubPlotSummary.setCurrentModelIndex(index) def plotPersoSelectionChanged(self): "Enables or disables remove plot perso button." self.btnRmPlotPerso.setEnabled( len(self.lstPlotPerso.selectedIndexes()) != 0) ############################################################################### # WORLD ############################################################################### def changeCurrentWorld(self): index = self.mdlWorld.selectedIndex() if not index.isValid(): self.tabWorld.setEnabled(False) return self.tabWorld.setEnabled(True) self.txtWorldName.setCurrentModelIndex(index) self.txtWorldDescription.setCurrentModelIndex(index) self.txtWorldPassion.setCurrentModelIndex(index) self.txtWorldConflict.setCurrentModelIndex(index) ############################################################################### # EDITOR ############################################################################### def openIndex(self, index): self.treeRedacOutline.setCurrentIndex(index) def openIndexes(self, indexes, newTab=True): self.mainEditor.openIndexes(indexes, newTab=True) # Menu ############################################################# # Functions called by the menus # self._lastFocus is the last editor that had focus (either treeView or # mainEditor). So we just pass along the signal. # Edit def documentsCopy(self): "Copy selected item(s)." if self._lastFocus: self._lastFocus.copy() def documentsCut(self): "Cut selected item(s)." if self._lastFocus: self._lastFocus.cut() def documentsPaste(self): "Paste clipboard item(s) into selected item." if self._lastFocus: self._lastFocus.paste() def documentsRename(self): "Rename selected item." if self._lastFocus: self._lastFocus.rename() def documentsDuplicate(self): "Duplicate selected item(s)." if self._lastFocus: self._lastFocus.duplicate() def documentsDelete(self): "Delete selected item(s)." if self._lastFocus: self._lastFocus.delete() # Formats def callLastMDEditView(self, functionName, param=[]): """ If last focused widget was MDEditView, call the given function. """ if self._lastMDEditView: function = getattr(self._lastMDEditView, functionName) function(*param) def formatSetext1(self): self.callLastMDEditView("titleSetext", [1]) def formatSetext2(self): self.callLastMDEditView("titleSetext", [2]) def formatAtx1(self): self.callLastMDEditView("titleATX", [1]) def formatAtx2(self): self.callLastMDEditView("titleATX", [2]) def formatAtx3(self): self.callLastMDEditView("titleATX", [3]) def formatAtx4(self): self.callLastMDEditView("titleATX", [4]) def formatAtx5(self): self.callLastMDEditView("titleATX", [5]) def formatAtx6(self): self.callLastMDEditView("titleATX", [6]) def formatBold(self): self.callLastMDEditView("bold") def formatItalic(self): self.callLastMDEditView("italic") def formatStrike(self): self.callLastMDEditView("strike") def formatVerbatim(self): self.callLastMDEditView("verbatim") def formatSuperscript(self): self.callLastMDEditView("superscript") def formatSubscript(self): self.callLastMDEditView("subscript") def formatCommentLines(self): self.callLastMDEditView("commentLine") def formatList(self): self.callLastMDEditView("unorderedList") def formatOrderedList(self): self.callLastMDEditView("orderedList") def formatBlockquote(self): self.callLastMDEditView("blockquote") def formatCommentBlock(self): self.callLastMDEditView("comment") def formatClear(self): self.callLastMDEditView("clearFormat") # Organize def documentsMoveUp(self): "Move up selected item(s)." if self._lastFocus: self._lastFocus.moveUp() def documentsMoveDown(self): "Move Down selected item(s)." if self._lastFocus: self._lastFocus.moveDown() def documentsSplitDialog(self): "Opens a dialog to split selected items." if self._lastFocus: self._lastFocus.splitDialog() # current items or selected items? pass # use outlineBasics, to do that on all selected items. # use editorWidget to do that on selected text. def documentsSplitCursor(self): """ Split current item (open in text editor) at cursor position. If there is a text selection, that selection becomes the title of the new scene. """ if self._lastFocus and self._lastFocus == self.mainEditor: self.mainEditor.splitCursor() def documentsMerge(self): "Merges selected item(s)." if self._lastFocus: self._lastFocus.merge() ############################################################################### # LOAD AND SAVE ############################################################################### def loadProject(self, project, loadFromFile=True): """Loads the project ``project``. If ``loadFromFile`` is False, then it does not load datas from file. It assumes that the datas have been populated in a different way.""" if loadFromFile and not os.path.exists(project): print(self.tr("The file {} does not exist. Has it been moved or deleted?").format(project)) F.statusMessage( self.tr("The file {} does not exist. Has it been moved or deleted?").format(project), importance=3) return if loadFromFile: # Load empty settings imp.reload(settings) settings.initDefaultValues() # Load data self.loadEmptyDatas() self.loadDatas(project) self.makeConnections() # Load settings if settings.openIndexes and settings.openIndexes != [""]: self.mainEditor.tabSplitter.restoreOpenIndexes(settings.openIndexes) self.generateViewMenu() self.mainEditor.sldCorkSizeFactor.setValue(settings.corkSizeFactor) self.actSpellcheck.setChecked(settings.spellcheck) self.toggleSpellcheck(settings.spellcheck) self.updateMenuDict() self.setDictionary() iconSize = settings.viewSettings["Tree"]["iconSize"] self.treeRedacOutline.setIconSize(QSize(iconSize, iconSize)) self.mainEditor.setFolderView(settings.folderView) self.mainEditor.updateFolderViewButtons(settings.folderView) self.mainEditor.tabSplitter.updateStyleSheet() self.tabMain.setCurrentIndex(settings.lastTab) self.mainEditor.updateCorkBackground() if settings.viewMode == "simple": self.setViewModeSimple() else: self.setViewModeFiction() # Set autosave self.saveTimer = QTimer() self.saveTimer.setInterval(settings.autoSaveDelay * 60 * 1000) self.saveTimer.setSingleShot(False) self.saveTimer.timeout.connect(self.saveDatas) if settings.autoSave: self.saveTimer.start() # Set autosave if no changes self.saveTimerNoChanges = QTimer() self.saveTimerNoChanges.setInterval(settings.autoSaveNoChangesDelay * 1000) self.saveTimerNoChanges.setSingleShot(True) self.mdlFlatData.dataChanged.connect(self.startTimerNoChanges) self.mdlOutline.dataChanged.connect(self.startTimerNoChanges) self.mdlCharacter.dataChanged.connect(self.startTimerNoChanges) self.mdlPlots.dataChanged.connect(self.startTimerNoChanges) self.mdlWorld.dataChanged.connect(self.startTimerNoChanges) # self.mdlPersosInfos.dataChanged.connect(self.startTimerNoChanges) self.mdlStatus.dataChanged.connect(self.startTimerNoChanges) self.mdlLabels.dataChanged.connect(self.startTimerNoChanges) self.saveTimerNoChanges.timeout.connect(self.saveDatas) self.saveTimerNoChanges.stop() # UI for i in [self.actOpen, self.menuRecents]: i.setEnabled(False) for i in [self.actSave, self.actSaveAs, self.actCloseProject, self.menuEdit, self.menuView, self.menuOrganize, self.menuTools, self.menuHelp, self.actImport, self.actCompile, self.actSettings]: i.setEnabled(True) # We force to emit even if it opens on the current tab self.tabMain.currentChanged.emit(settings.lastTab) # Make sure we can update the window title later. self.currentProject = project self.projectDirty = False QSettings().setValue("lastProject", project) # Add project name to Window's name self.setWindowTitle(self.projectName() + " - " + self.tr("Manuskript")) # Stuff # self.checkPersosID() # Shouldn't be necessary any longer # Show main Window self.switchToProject() def handleUnsavedChanges(self): """ There may be some currently unsaved changes, but the action the user triggered will result in the project or application being closed. To save, or not to save? Or just bail out entirely? Sometimes it is best to just ask. """ if not self.projectDirty: return True # no unsaved changes, all is good msg = QMessageBox(QMessageBox.Question, self.tr("Save project?"), "

" + self.tr("Save changes to project \"{}\" before closing?").format(self.projectName()) + "

" + "

" + self.tr("Your changes will be lost if you don't save them.") + "

", QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel) ret = msg.exec() if ret == QMessageBox.Cancel: return False # the situation has not been handled, cancel action if ret == QMessageBox.Save: self.saveDatas() return True # the situation has been handled def closeProject(self): if not self.currentProject: return # Make sure data is saved. if (self.projectDirty and settings.saveOnQuit == True): self.saveDatas() elif not self.handleUnsavedChanges(): return # user cancelled action # Close open tabs in editor self.mainEditor.closeAllTabs() self.currentProject = None self.projectDirty = None QSettings().setValue("lastProject", "") # Clear datas self.loadEmptyDatas() self.saveTimer.stop() self.saveTimerNoChanges.stop() loadSave.clearSaveCache() self.breakConnections() # UI for i in [self.actOpen, self.menuRecents]: i.setEnabled(True) for i in [self.actSave, self.actSaveAs, self.actCloseProject, self.menuEdit, self.menuView, self.menuOrganize, self.menuTools, self.menuHelp, self.actImport, self.actCompile, self.actSettings]: i.setEnabled(False) # Set Window's name - no project loaded self.setWindowTitle(self.tr("Manuskript")) # Reload recent files self.welcome.updateValues() # Show welcome dialog self.switchToWelcome() def readSettings(self): # Load State and geometry sttgns = QSettings(qApp.organizationName(), qApp.applicationName()) if sttgns.contains("geometry"): self.restoreGeometry(sttgns.value("geometry")) if sttgns.contains("windowState"): self.restoreState(sttgns.value("windowState")) if sttgns.contains("docks"): self._dckVisibility = {} vals = sttgns.value("docks") for name in vals: self._dckVisibility[name] = vals[name] else: # Create default settings self._dckVisibility = { self.dckNavigation.objectName() : True, self.dckCheatSheet.objectName() : False, self.dckSearch.objectName() : False, } self._dckVisibility["LOCK"] = True # prevent overriding loaded values if sttgns.contains("metadataState"): state = [False if v == "false" else True for v in sttgns.value("metadataState")] self.redacMetadata.restoreState(state) if sttgns.contains("revisionsState"): state = [False if v == "false" else True for v in sttgns.value("revisionsState")] self.redacMetadata.revisions.restoreState(state) if sttgns.contains("splitterRedacH"): self.splitterRedacH.restoreState(sttgns.value("splitterRedacH")) if sttgns.contains("splitterRedacV"): self.splitterRedacV.restoreState(sttgns.value("splitterRedacV")) if sttgns.contains("toolbar"): # self.toolbar is not initialized yet, so we just store value self._toolbarState = sttgns.value("toolbar") else: self._toolbarState = "" def closeEvent(self, event): # Specific settings to save before quitting settings.lastTab = self.tabMain.currentIndex() if self.currentProject: # Remembering the current items (stores outlineItem's ID) settings.openIndexes = self.mainEditor.tabSplitter.openIndexes() # Save data from models if settings.saveOnQuit: self.saveDatas() elif not self.handleUnsavedChanges(): event.ignore() # user opted to cancel the close action # closeEvent # QMainWindow.closeEvent(self, event) # Causing segfaults? # User may have canceled close event, so make sure we indeed want to close. # This is necessary because self.updateDockVisibility() hides UI elements. if event.isAccepted(): # Save State and geometry and other things appSettings = QSettings(qApp.organizationName(), qApp.applicationName()) appSettings.setValue("geometry", self.saveGeometry()) appSettings.setValue("windowState", self.saveState()) appSettings.setValue("metadataState", self.redacMetadata.saveState()) appSettings.setValue("revisionsState", self.redacMetadata.revisions.saveState()) appSettings.setValue("splitterRedacH", self.splitterRedacH.saveState()) appSettings.setValue("splitterRedacV", self.splitterRedacV.saveState()) appSettings.setValue("toolbar", self.toolbar.saveState()) # If we are not in the welcome window, we update the visibility # of the docks widgets if self.stack.currentIndex() == 1: self.updateDockVisibility() # Storing the visibility of docks to restore it on restart appSettings.setValue("docks", self._dckVisibility) def startTimerNoChanges(self): """ Something changed in the project that requires auto-saving. """ self.projectDirty = True if settings.autoSaveNoChanges: self.saveTimerNoChanges.start() def saveDatas(self, projectName=None): """Saves the current project (in self.currentProject). If ``projectName`` is given, currentProject becomes projectName. In other words, it "saves as...". """ if projectName: self.currentProject = projectName QSettings().setValue("lastProject", projectName) # Stop the timer before saving: if auto-saving fails (bugs out?) we don't want it # to keep trying and continuously hitting the failure condition. Nor do we want to # risk a scenario where the timer somehow triggers a new save while saving. self.saveTimerNoChanges.stop() if self.currentProject is None: # No UI feedback here as this code path indicates a race condition that happens # after the user has already closed the project through some way. But in that # scenario, this code should not be reachable to begin with. print("Bug: there is no current project to save.") return r = loadSave.saveProject() # version=0 projectName = os.path.basename(self.currentProject) if r: self.projectDirty = False # successful save, clear dirty flag feedback = self.tr("Project {} saved.").format(projectName) F.statusMessage(feedback, importance=0) else: feedback = self.tr("WARNING: Project {} not saved.").format(projectName) F.statusMessage(feedback, importance=3) # Giving some feedback in console print(feedback) def loadEmptyDatas(self): self.mdlFlatData = QStandardItemModel(self) self.mdlCharacter = characterModel(self) # self.mdlPersosProxy = persosProxyModel(self) # self.mdlPersosInfos = QStandardItemModel(self) self.mdlLabels = QStandardItemModel(self) self.mdlStatus = QStandardItemModel(self) self.mdlPlots = plotModel(self) self.mdlOutline = outlineModel(self) self.mdlWorld = worldModel(self) def loadDatas(self, project): errors = loadSave.loadProject(project) # Giving some feedback if not errors: print(self.tr("Project {} loaded.").format(project)) F.statusMessage( self.tr("Project {} loaded.").format(project), 2000) else: print(self.tr("Project {} loaded with some errors:").format(project)) for e in errors: print(self.tr(" * {} wasn't found in project file.").format(e)) F.statusMessage( self.tr("Project {} loaded with some errors.").format(project), 5000, importance = 3) ############################################################################### # MAIN CONNECTIONS ############################################################################### def makeUIConnections(self): "Connections that have to be made once only, even when a new project is loaded." self.lstCharacters.currentItemChanged.connect(self.changeCurrentCharacter, F.AUC) self.txtPlotFilter.textChanged.connect(self.lstPlots.setFilter, F.AUC) self.lstPlots.currentItemChanged.connect(self.changeCurrentPlot, F.AUC) self.lstSubPlots.clicked.connect(self.changeCurrentSubPlot, F.AUC) self.btnRedacAddFolder.clicked.connect(self.treeRedacOutline.addFolder, F.AUC) self.btnOutlineAddFolder.clicked.connect(self.treeOutlineOutline.addFolder, F.AUC) self.btnRedacAddText.clicked.connect(self.treeRedacOutline.addText, F.AUC) self.btnOutlineAddText.clicked.connect(self.treeOutlineOutline.addText, F.AUC) self.btnRedacRemoveItem.clicked.connect(self.outlineRemoveItemsRedac, F.AUC) self.btnOutlineRemoveItem.clicked.connect(self.outlineRemoveItemsOutline, F.AUC) self.tabMain.currentChanged.connect(self.toolbar.setCurrentGroup) self.tabMain.currentChanged.connect(self.tabMainChanged) qApp.focusChanged.connect(self.focusChanged) def makeConnections(self): # Flat datas (Summary and general infos) for widget, col in [ (self.txtSummarySituation, 0), (self.txtSummarySentence, 1), (self.txtSummarySentence_2, 1), (self.txtSummaryPara, 2), (self.txtSummaryPara_2, 2), (self.txtPlotSummaryPara, 2), (self.txtSummaryPage, 3), (self.txtSummaryPage_2, 3), (self.txtPlotSummaryPage, 3), (self.txtSummaryFull, 4), (self.txtPlotSummaryFull, 4), ]: widget.setModel(self.mdlFlatData) widget.setColumn(col) widget.setCurrentModelIndex(self.mdlFlatData.index(1, col)) for widget, col in [ (self.txtGeneralTitle, 0), (self.txtGeneralSubtitle, 1), (self.txtGeneralSerie, 2), (self.txtGeneralVolume, 3), (self.txtGeneralGenre, 4), (self.txtGeneralLicense, 5), (self.txtGeneralAuthor, 6), (self.txtGeneralEmail, 7), ]: widget.setModel(self.mdlFlatData) widget.setColumn(col) widget.setCurrentModelIndex(self.mdlFlatData.index(0, col)) # Characters self.lstCharacters.setCharactersModel(self.mdlCharacter) self.tblPersoInfos.setModel(self.mdlCharacter) self.btnAddPerso.clicked.connect(self.mdlCharacter.addCharacter, F.AUC) try: self.btnRmPerso.clicked.connect(self.lstCharacters.removeCharacter, F.AUC) self.btnPersoColor.clicked.connect(self.lstCharacters.choseCharacterColor, F.AUC) self.btnPersoAddInfo.clicked.connect(self.lstCharacters.addCharacterInfo, F.AUC) self.btnPersoRmInfo.clicked.connect(self.lstCharacters.removeCharacterInfo, F.AUC) except TypeError: # Connection has already been made pass for w, c in [ (self.txtPersoName, Character.name), (self.sldPersoImportance, Character.importance), (self.txtPersoMotivation, Character.motivation), (self.txtPersoGoal, Character.goal), (self.txtPersoConflict, Character.conflict), (self.txtPersoEpiphany, Character.epiphany), (self.txtPersoSummarySentence, Character.summarySentence), (self.txtPersoSummaryPara, Character.summaryPara), (self.txtPersoSummaryFull, Character.summaryFull), (self.txtPersoNotes, Character.notes) ]: w.setModel(self.mdlCharacter) w.setColumn(c) self.tabPersos.setEnabled(False) # Plots self.lstSubPlots.setModel(self.mdlPlots) self.lstPlotPerso.setModel(self.mdlPlots) self.lstPlots.setPlotModel(self.mdlPlots) self._updatingSubPlot = False self.btnAddPlot.clicked.connect(self.mdlPlots.addPlot, F.AUC) self.btnRmPlot.clicked.connect(lambda: self.mdlPlots.removePlot(self.lstPlots.currentPlotIndex()), F.AUC) self.btnAddSubPlot.clicked.connect(self.mdlPlots.addSubPlot, F.AUC) self.btnAddSubPlot.clicked.connect(self.updateSubPlotView, F.AUC) self.btnRmSubPlot.clicked.connect(self.mdlPlots.removeSubPlot, F.AUC) self.lstPlotPerso.selectionModel().selectionChanged.connect(self.plotPersoSelectionChanged) self.btnRmPlotPerso.clicked.connect(self.mdlPlots.removePlotPerso, F.AUC) self.lstSubPlots.selectionModel().currentRowChanged.connect(self.changeCurrentSubPlot, F.AUC) for w, c in [ (self.txtPlotName, Plot.name), (self.txtPlotDescription, Plot.description), (self.txtPlotResult, Plot.result), (self.sldPlotImportance, Plot.importance), ]: w.setModel(self.mdlPlots) w.setColumn(c) self.tabPlot.setEnabled(False) self.mdlPlots.updatePlotPersoButton() self.mdlCharacter.dataChanged.connect(self.mdlPlots.updatePlotPersoButton) self.lstOutlinePlots.setPlotModel(self.mdlPlots) self.lstOutlinePlots.setShowSubPlot(True) self.plotCharacterDelegate = outlineCharacterDelegate(self.mdlCharacter, self) self.lstPlotPerso.setItemDelegate(self.plotCharacterDelegate) self.plotDelegate = plotDelegate(self) self.lstSubPlots.setItemDelegateForColumn(PlotStep.meta, self.plotDelegate) # World self.treeWorld.setModel(self.mdlWorld) for i in range(self.mdlWorld.columnCount()): self.treeWorld.hideColumn(i) self.treeWorld.showColumn(0) self.btnWorldEmptyData.setMenu(self.mdlWorld.emptyDataMenu()) self.treeWorld.selectionModel().selectionChanged.connect(self.changeCurrentWorld, F.AUC) self.btnAddWorld.clicked.connect(self.mdlWorld.addItem, F.AUC) self.btnRmWorld.clicked.connect(self.mdlWorld.removeItem, F.AUC) for w, c in [ (self.txtWorldName, World.name), (self.txtWorldDescription, World.description), (self.txtWorldPassion, World.passion), (self.txtWorldConflict, World.conflict), ]: w.setModel(self.mdlWorld) w.setColumn(c) self.tabWorld.setEnabled(False) self.treeWorld.expandAll() # Outline self.treeRedacOutline.setModel(self.mdlOutline) self.treeOutlineOutline.setModelCharacters(self.mdlCharacter) self.treeOutlineOutline.setModelLabels(self.mdlLabels) self.treeOutlineOutline.setModelStatus(self.mdlStatus) self.redacMetadata.setModels(self.mdlOutline, self.mdlCharacter, self.mdlLabels, self.mdlStatus) self.outlineItemEditor.setModels(self.mdlOutline, self.mdlCharacter, self.mdlLabels, self.mdlStatus) self.treeOutlineOutline.setModel(self.mdlOutline) # self.redacEditor.setModel(self.mdlOutline) self.storylineView.setModels(self.mdlOutline, self.mdlCharacter, self.mdlPlots) self.treeOutlineOutline.selectionModel().selectionChanged.connect(self.outlineItemEditor.selectionChanged, F.AUC) self.treeOutlineOutline.clicked.connect(self.outlineItemEditor.selectionChanged, F.AUC) # Sync selection self.treeRedacOutline.selectionModel().selectionChanged.connect(self.redacMetadata.selectionChanged, F.AUC) self.treeRedacOutline.clicked.connect(self.redacMetadata.selectionChanged, F.AUC) self.treeRedacOutline.selectionModel().selectionChanged.connect(self.mainEditor.selectionChanged, F.AUC) # Cheat Sheet self.cheatSheet.setModels() # Debug self.mdlFlatData.setVerticalHeaderLabels(["General info", "Summary"]) self.tblDebugFlatData.setModel(self.mdlFlatData) self.tblDebugPersos.setModel(self.mdlCharacter) self.tblDebugPersosInfos.setModel(self.mdlCharacter) self.tblDebugPersos.selectionModel().currentChanged.connect( lambda: self.tblDebugPersosInfos.setRootIndex(self.mdlCharacter.index( self.tblDebugPersos.selectionModel().currentIndex().row(), Character.name)), F.AUC) self.tblDebugPlots.setModel(self.mdlPlots) self.tblDebugPlotsPersos.setModel(self.mdlPlots) self.tblDebugSubPlots.setModel(self.mdlPlots) self.tblDebugPlots.selectionModel().currentChanged.connect( lambda: self.tblDebugPlotsPersos.setRootIndex(self.mdlPlots.index( self.tblDebugPlots.selectionModel().currentIndex().row(), Plot.characters)), F.AUC) self.tblDebugPlots.selectionModel().currentChanged.connect( lambda: self.tblDebugSubPlots.setRootIndex(self.mdlPlots.index( self.tblDebugPlots.selectionModel().currentIndex().row(), Plot.steps)), F.AUC) self.treeDebugWorld.setModel(self.mdlWorld) self.treeDebugOutline.setModel(self.mdlOutline) self.lstDebugLabels.setModel(self.mdlLabels) self.lstDebugStatus.setModel(self.mdlStatus) def disconnectAll(self, signal, oldHandler=None): # Disconnect all "oldHandler" slot connections for a signal # # Ref: PyQt Widget connect() and disconnect() # https://stackoverflow.com/questions/21586643/pyqt-widget-connect-and-disconnect # # The loop is needed for safely disconnecting a specific handler, # because it may have been connected multiple times, and # disconnect only removes one connection at a time. while True: try: if oldHandler is not None: signal.disconnect(oldHandler) else: signal.disconnect() except TypeError: break def breakConnections(self): # Break connections for UI elements that were connected in makeConnections() # Characters self.disconnectAll(self.btnAddPerso.clicked, self.mdlCharacter.addCharacter) self.disconnectAll(self.btnRmPerso.clicked, self.lstCharacters.removeCharacter) self.disconnectAll(self.btnPersoColor.clicked, self.lstCharacters.choseCharacterColor) self.disconnectAll(self.btnPersoAddInfo.clicked, self.lstCharacters.addCharacterInfo) self.disconnectAll(self.btnPersoRmInfo.clicked, self.lstCharacters.removeCharacterInfo) # Plots self._updatingSubPlot = False self.disconnectAll(self.btnAddPlot.clicked, self.mdlPlots.addPlot) self.disconnectAll(self.btnRmPlot.clicked, lambda: self.mdlPlots.removePlot(self.lstPlots.currentPlotIndex())) self.disconnectAll(self.btnAddSubPlot.clicked, self.mdlPlots.addSubPlot) self.disconnectAll(self.btnAddSubPlot.clicked, self.updateSubPlotView) self.disconnectAll(self.btnRmSubPlot.clicked, self.mdlPlots.removeSubPlot) self.disconnectAll(self.lstPlotPerso.selectionModel().selectionChanged, self.plotPersoSelectionChanged) self.disconnectAll(self.lstSubPlots.selectionModel().currentRowChanged, self.changeCurrentSubPlot) self.disconnectAll(self.btnRmPlotPerso.clicked, self.mdlPlots.removePlotPerso) self.disconnectAll(self.mdlCharacter.dataChanged, self.mdlPlots.updatePlotPersoButton) # World self.disconnectAll(self.treeWorld.selectionModel().selectionChanged, self.changeCurrentWorld) self.disconnectAll(self.btnAddWorld.clicked, self.mdlWorld.addItem) self.disconnectAll(self.btnRmWorld.clicked, self.mdlWorld.removeItem) # Outline self.disconnectAll(self.treeOutlineOutline.selectionModel().selectionChanged, self.outlineItemEditor.selectionChanged) self.disconnectAll(self.treeOutlineOutline.clicked, self.outlineItemEditor.selectionChanged) # Sync selection self.disconnectAll(self.treeRedacOutline.selectionModel().selectionChanged, self.redacMetadata.selectionChanged) self.disconnectAll(self.treeRedacOutline.clicked, self.redacMetadata.selectionChanged) self.disconnectAll(self.treeRedacOutline.selectionModel().selectionChanged, self.mainEditor.selectionChanged) # Debug self.disconnectAll(self.tblDebugPersos.selectionModel().currentChanged, lambda: self.tblDebugPersosInfos.setRootIndex(self.mdlCharacter.index( self.tblDebugPersos.selectionModel().currentIndex().row(), Character.name))) self.disconnectAll(self.tblDebugPlots.selectionModel().currentChanged, lambda: self.tblDebugPlotsPersos.setRootIndex(self.mdlPlots.index( self.tblDebugPlots.selectionModel().currentIndex().row(), Plot.characters))) self.disconnectAll(self.tblDebugPlots.selectionModel().currentChanged, lambda: self.tblDebugSubPlots.setRootIndex(self.mdlPlots.index( self.tblDebugPlots.selectionModel().currentIndex().row(), Plot.steps))) ############################################################################### # HELP ############################################################################### def centerChildWindow(self, win): r = win.geometry() r2 = self.geometry() win.move(r2.center() - QPoint(r.width()/2, r.height()/2)) def about(self): self.dialog = aboutDialog(mw=self) self.dialog.setFixedSize(self.dialog.size()) self.dialog.show() # Center about dialog self.centerChildWindow(self.dialog) ############################################################################### # GENERAL AKA UNSORTED ############################################################################### def clickCycle(self, i): if i == 0: # step 2 - paragraph summary self.tabMain.setCurrentIndex(self.TabSummary) self.tabSummary.setCurrentIndex(1) if i == 1: # step 3 - characters summary self.tabMain.setCurrentIndex(self.TabPersos) self.tabPersos.setCurrentIndex(0) if i == 2: # step 4 - page summary self.tabMain.setCurrentIndex(self.TabSummary) self.tabSummary.setCurrentIndex(2) if i == 3: # step 5 - characters description self.tabMain.setCurrentIndex(self.TabPersos) self.tabPersos.setCurrentIndex(1) if i == 4: # step 6 - four page synopsis self.tabMain.setCurrentIndex(self.TabSummary) self.tabSummary.setCurrentIndex(3) if i == 5: # step 7 - full character charts self.tabMain.setCurrentIndex(self.TabPersos) self.tabPersos.setCurrentIndex(2) if i == 6: # step 8 - scene list self.tabMain.setCurrentIndex(self.TabPlots) def wordCount(self, i): src = { 0: self.txtSummarySentence, 1: self.txtSummaryPara, 2: self.txtSummaryPage, 3: self.txtSummaryFull }[i] lbl = { 0: self.lblSummaryWCSentence, 1: self.lblSummaryWCPara, 2: self.lblSummaryWCPage, 3: self.lblSummaryWCFull }[i] wc = wordCount(src.toPlainText()) if i in [2, 3]: pages = self.tr(" (~{} pages)").format(int(wc / 25) / 10.) else: pages = "" lbl.setText(self.tr("Words: {}{}").format(wc, pages)) def setupMoreUi(self): style.styleMainWindow(self) # Tool bar on the right self.toolbar = collapsibleDockWidgets(Qt.RightDockWidgetArea, self) self.toolbar.addCustomWidget(self.tr("Book summary"), self.grpPlotSummary, self.TabPlots, False) self.toolbar.addCustomWidget(self.tr("Project tree"), self.treeRedacWidget, self.TabRedac, True) self.toolbar.addCustomWidget(self.tr("Metadata"), self.redacMetadata, self.TabRedac, False) self.toolbar.addCustomWidget(self.tr("Story line"), self.storylineView, self.TabRedac, False) if self._toolbarState: self.toolbar.restoreState(self._toolbarState) # Hides navigation dock title bar self.dckNavigation.setTitleBarWidget(QWidget(None)) # Custom "tab" bar on the left self.lstTabs.setIconSize(QSize(48, 48)) for i in range(self.tabMain.count()): icons = [QIcon.fromTheme("stock_view-details"), #info QIcon.fromTheme("application-text-template"), #applications-publishing F.themeIcon("characters"), F.themeIcon("plots"), F.themeIcon("world"), F.themeIcon("outline"), QIcon.fromTheme("gtk-edit"), QIcon.fromTheme("applications-debugging") ] self.tabMain.setTabIcon(i, icons[i]) item = QListWidgetItem(self.tabMain.tabIcon(i), self.tabMain.tabText(i)) item.setSizeHint(QSize(item.sizeHint().width(), 64)) item.setToolTip(self.tabMain.tabText(i)) item.setTextAlignment(Qt.AlignCenter) self.lstTabs.addItem(item) self.tabMain.tabBar().hide() self.lstTabs.currentRowChanged.connect(self.tabMain.setCurrentIndex) self.lstTabs.item(self.TabDebug).setHidden(not self.SHOW_DEBUG_TAB) self.tabMain.setTabEnabled(self.TabDebug, self.SHOW_DEBUG_TAB) self.tabMain.currentChanged.connect(self.lstTabs.setCurrentRow) # Splitters self.splitterPersos.setStretchFactor(0, 25) self.splitterPersos.setStretchFactor(1, 75) self.splitterPlot.setStretchFactor(0, 20) self.splitterPlot.setStretchFactor(1, 60) self.splitterPlot.setStretchFactor(2, 30) self.splitterWorld.setStretchFactor(0, 25) self.splitterWorld.setStretchFactor(1, 75) self.splitterOutlineH.setStretchFactor(0, 25) self.splitterOutlineH.setStretchFactor(1, 75) self.splitterOutlineV.setStretchFactor(0, 75) self.splitterOutlineV.setStretchFactor(1, 25) self.splitterRedacV.setStretchFactor(0, 75) self.splitterRedacV.setStretchFactor(1, 25) self.splitterRedacH.setStretchFactor(0, 30) self.splitterRedacH.setStretchFactor(1, 40) self.splitterRedacH.setStretchFactor(2, 30) # QFormLayout stretch for w in [self.txtWorldDescription, self.txtWorldPassion, self.txtWorldConflict]: s = w.sizePolicy() s.setVerticalStretch(1) w.setSizePolicy(s) # Help box references = [ (self.lytTabOverview, self.tr("Enter information about your book, and yourself."), 0), (self.lytSituation, self.tr( """The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard wasn't able to kill a baby?' (Harry Potter)"""), 1), (self.lytSummary, self.tr( """Take time to think about a one sentence (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary."""), 1), (self.lytTabPersos, self.tr("Create your characters."), 0), (self.lytTabPlot, self.tr("Develop plots."), 0), (self.lytTabContext, self.tr("Build worlds. Create hierarchy of broad categories down to specific details."), 0), (self.lytTabOutline, self.tr("Create the outline of your masterpiece."), 0), (self.lytTabRedac, self.tr("Write."), 0), (self.lytTabDebug, self.tr("Debug info. Sometimes useful."), 0) ] for widget, text, pos in references: label = helpLabel(text, self) self.actShowHelp.toggled.connect(label.setVisible, F.AUC) widget.layout().insertWidget(pos, label) self.actShowHelp.setChecked(False) # Spellcheck if Spellchecker.isInstalled(): self.menuDict = QMenu(self.tr("Dictionary")) self.menuDictGroup = QActionGroup(self) self.updateMenuDict() self.menuTools.addMenu(self.menuDict) self.actSpellcheck.toggled.connect(self.toggleSpellcheck, F.AUC) # self.dictChanged.connect(self.mainEditor.setDict, F.AUC) # self.dictChanged.connect(self.redacMetadata.setDict, F.AUC) # self.dictChanged.connect(self.outlineItemEditor.setDict, F.AUC) else: # No Spell check support self.actSpellcheck.setVisible(False) for lib, requirement in Spellchecker.supportedLibraries().items(): a = QAction(self.tr("Install {}{} to use spellcheck").format(lib, requirement or ""), self) a.setIcon(self.style().standardIcon(QStyle.SP_MessageBoxWarning)) # Need to bound the lib argument otherwise the lambda uses the same lib value across all calls def gen_slot_cb(l): return lambda: self.openSpellcheckWebPage(l) a.triggered.connect(gen_slot_cb(lib), F.AUC) self.menuTools.addAction(a) ############################################################################### # SPELLCHECK ############################################################################### def updateMenuDict(self): if not Spellchecker.isInstalled(): return self.menuDict.clear() dictionaries = Spellchecker.availableDictionaries() # Set first run dictionary if settings.dict is None: settings.dict = Spellchecker.getDefaultDictionary() # Check if project dict is unavailable on this machine dict_available = False for lib, dicts in dictionaries.items(): if dict_available: break for i in dicts: if Spellchecker.normalizeDictName(lib, i) == settings.dict: dict_available = True break # Reset dict to default one if it's unavailable if not dict_available: settings.dict = Spellchecker.getDefaultDictionary() for lib, dicts in dictionaries.items(): if len(dicts) > 0: a = QAction(lib, self) else: a = QAction(self.tr("{} has no installed dictionaries").format(lib), self) a.setEnabled(False) self.menuDict.addAction(a) for i in dicts: a = QAction(i, self) a.data = lib a.setCheckable(True) if Spellchecker.normalizeDictName(lib, i) == settings.dict: a.setChecked(True) a.triggered.connect(self.setDictionary, F.AUC) self.menuDictGroup.addAction(a) self.menuDict.addAction(a) self.menuDict.addSeparator() # If a new dictionary was chosen, apply the change and re-enable spellcheck if it was enabled. if not dict_available: self.setDictionary() self.toggleSpellcheck(settings.spellcheck) for lib, requirement in Spellchecker.supportedLibraries().items(): if lib not in dictionaries: a = QAction(self.tr("{}{} is not installed").format(lib, requirement or ""), self) a.setEnabled(False) self.menuDict.addAction(a) self.menuDict.addSeparator() def setDictionary(self): if not Spellchecker.isInstalled(): return for i in self.menuDictGroup.actions(): if i.isChecked(): # self.dictChanged.emit(i.text().replace("&", "")) settings.dict = Spellchecker.normalizeDictName(i.data, i.text().replace("&", "")) # Find all textEditView from self, and toggle spellcheck for w in self.findChildren(textEditView, QRegExp(".*"), Qt.FindChildrenRecursively): w.setDict(settings.dict) def openSpellcheckWebPage(self, lib): F.openURL(Spellchecker.getLibraryURL(lib)) def toggleSpellcheck(self, val): settings.spellcheck = val # Find all textEditView from self, and toggle spellcheck for w in self.findChildren(textEditView, QRegExp(".*"), Qt.FindChildrenRecursively): w.toggleSpellcheck(val) ############################################################################### # SETTINGS ############################################################################### def settingsLabel(self): self.settingsWindow(3) def settingsStatus(self): self.settingsWindow(4) def settingsWindow(self, tab=None): self.sw = settingsWindow(self) self.sw.hide() self.sw.setWindowModality(Qt.ApplicationModal) self.sw.setWindowFlags(Qt.Dialog) self.centerChildWindow(self.sw) if tab: self.sw.setTab(tab) self.sw.show() ############################################################################### # TOOLS ############################################################################### def frequencyAnalyzer(self): self.fw = frequencyAnalyzer(self) self.fw.show() self.centerChildWindow(self.fw) ############################################################################### # VIEW MENU ############################################################################### def generateViewMenu(self): values = [ (self.tr("Nothing"), "Nothing"), (self.tr("POV"), "POV"), (self.tr("Label"), "Label"), (self.tr("Progress"), "Progress"), (self.tr("Compile"), "Compile"), ] menus = [ (self.tr("Tree"), "Tree", "view-list-tree"), (self.tr("Index cards"), "Cork", "view-cards"), (self.tr("Outline"), "Outline", "view-outline") ] submenus = { "Tree": [ (self.tr("Icon color"), "Icon"), (self.tr("Text color"), "Text"), (self.tr("Background color"), "Background"), ], "Cork": [ (self.tr("Icon"), "Icon"), (self.tr("Text"), "Text"), (self.tr("Background"), "Background"), (self.tr("Border"), "Border"), (self.tr("Corner"), "Corner"), ], "Outline": [ (self.tr("Icon color"), "Icon"), (self.tr("Text color"), "Text"), (self.tr("Background color"), "Background"), ], } self.menuView.clear() self.menuView.addMenu(self.menuMode) self.menuView.addSeparator() # print("Generating menus with", settings.viewSettings) for mnu, mnud, icon in menus: m = QMenu(mnu, self.menuView) if icon: m.setIcon(QIcon.fromTheme(icon)) for s, sd in submenus[mnud]: m2 = QMenu(s, m) agp = QActionGroup(m2) for v, vd in values: a = QAction(v, m) a.setCheckable(True) a.setData("{},{},{}".format(mnud, sd, vd)) if settings.viewSettings[mnud][sd] == vd: a.setChecked(True) a.triggered.connect(self.setViewSettingsAction, F.AUC) agp.addAction(a) m2.addAction(a) m.addMenu(m2) self.menuView.addMenu(m) def setViewSettingsAction(self): action = self.sender() item, part, element = action.data().split(",") self.setViewSettings(item, part, element) def setViewSettings(self, item, part, element): settings.viewSettings[item][part] = element if item == "Cork": self.mainEditor.updateCorkView() if item == "Outline": self.mainEditor.updateTreeView() self.treeOutlineOutline.viewport().update() if item == "Tree": self.treeRedacOutline.viewport().update() ############################################################################### # VIEW MODES ############################################################################### def setViewModeSimple(self): settings.viewMode = "simple" self.tabMain.setCurrentIndex(self.TabRedac) self.viewModeFictionVisibilitySwitch(False) self.actModeSimple.setChecked(True) def setViewModeFiction(self): settings.viewMode = "fiction" self.viewModeFictionVisibilitySwitch(True) self.actModeFiction.setChecked(True) def viewModeFictionVisibilitySwitch(self, val): """ Switches the visibility of some UI components useful for fiction only @param val: sets visibility to val """ # Menu navigation & button in toolbar self.toolbar.setDockVisibility(self.dckNavigation, val) # POV in metadata from manuskript.ui.views.propertiesView import propertiesView for w in findWidgetsOfClass(propertiesView): w.lblPOV.setVisible(val) w.cmbPOV.setVisible(val) # POV in outline view if val is None and Outline.POV in settings.outlineViewColumns: settings.outlineViewColumns.remove(Outline.POV) from manuskript.ui.views.outlineView import outlineView for w in findWidgetsOfClass(outlineView): w.hideColumns() # TODO: clean up all other fiction things in non-fiction view mode # Character in search widget # POV in settings / views ############################################################################### # IMPORT / EXPORT ############################################################################### def doImport(self): # Warn about buggy Qt versions and import crash # # (Py)Qt 5.11 and 5.12 have a bug that can cause crashes when simply # setting up various UI elements. # This has been reported and verified to happen with File -> Import. # See PR #611. if re.match("^5\\.1[12](\\.?|$)", qVersion()): warning1 = self.tr("PyQt / Qt versions 5.11 and 5.12 are known to cause a crash which might result in a loss of data.") warning2 = self.tr("PyQt {} and Qt {} are in use.").format(qVersion(), PYQT_VERSION_STR) # Don't translate for debug log. print("WARNING:", warning1, warning2) msg = QMessageBox(QMessageBox.Warning, self.tr("Proceeding might crash and lose data"), "

" + warning1 + "

" + "

" + warning2 + "

", QMessageBox.Abort | QMessageBox.Ignore) msg.setDefaultButton(QMessageBox.Abort) # Return because user heeds warning if msg.exec() == QMessageBox.Abort: return # Proceed with Import self.dialog = importerDialog(mw=self) self.dialog.show() self.centerChildWindow(self.dialog) def doCompile(self): self.dialog = exporterDialog(mw=self) self.dialog.show() self.centerChildWindow(self.dialog) manuskript-0.10.0/manuskript/models/000077500000000000000000000000001354442177200174565ustar00rootroot00000000000000manuskript-0.10.0/manuskript/models/__init__.py000066400000000000000000000002401354442177200215630ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from manuskript.models.outlineItem import outlineItem from manuskript.models.outlineModel import outlineModel manuskript-0.10.0/manuskript/models/abstractItem.py000066400000000000000000000230751354442177200224610ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import QAbstractItemModel, QMimeData from PyQt5.QtCore import QModelIndex from PyQt5.QtCore import QSize from PyQt5.QtCore import QVariant from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon, QFont from PyQt5.QtWidgets import QTextEdit, qApp from lxml import etree as ET import re from manuskript import enums class abstractItem(): # Enum kept on the class for easier access enum = enums.Abstract # Used for XML export name = "abstractItem" # Regexp from https://stackoverflow.com/questions/8733233/filtering-out-certain-bytes-in-python valid_xml_re = re.compile(u'[^\u0020-\uD7FF\u0009\u000A\u000D\uE000-\uFFFD\U00010000-\U0010FFFF]+') def __init__(self, model=None, title="", _type="abstract", xml=None, parent=None, ID=None): self._data = {} self.childItems = [] self._parent = None self._model = model self.IDs = ["0"] # used by root item to store unique IDs self._lastPath = "" # used by loadSave version_1 to remember which files the items comes from, # in case it is renamed / removed self._data[self.enum.title] = title self._data[self.enum.type] = _type if xml is not None: self.setFromXML(xml) if ID: self._data[self.enum.ID] = ID if parent: parent.appendChild(self) ####################################################################### # Model ####################################################################### def setModel(self, model): self._model = model for c in self.children(): c.setModel(model) def index(self, column=0): if self._model: return self._model.indexFromItem(self, column) else: return QModelIndex() def emitDataChanged(self, cols=None, recursive=False): """ Emits the dataChanged signal of the model, to signal views that data have changed. @param cols: an array of int (or None). The columns of the index that have been changed. @param recursive: boolean. If true, all children will also emit the dataChanged signal. """ idx = self.index() if idx and self._model: if not cols: # Emit data changed for the whole item (all columns) self._model.dataChanged.emit(idx, self.index(len(self.enum))) else: # Emit only for the specified columns for c in cols: self._model.dataChanged.emit(self.index(c), self.index(c)) if recursive: for c in self.children(): c.emitDataChanged(cols, recursive=True) ####################################################################### # Properties ####################################################################### def title(self): return self._data.get(self.enum.title, "") def ID(self): return self._data.get(self.enum.ID) def columnCount(self): return len(self.enum) def type(self): return self._data[self.enum.type] ####################################################################### # Parent / Children management ####################################################################### def child(self, row): return self.childItems[row] def childCount(self): return len(self.childItems) def childCountRecursive(self): n = self.childCount() for c in self.children(): n += c.childCountRecursive() return n def children(self): return self.childItems def row(self): if self.parent(): return self.parent().childItems.index(self) return None def appendChild(self, child): self.insertChild(self.childCount(), child) def insertChild(self, row, child): self.childItems.insert(row, child) child._parent = self child.setModel(self._model) if not child.ID(): child.getUniqueID() def removeChild(self, row): """ Removes child at position `row` and returns it. @param row: index (int) of the child to remove. @return: the removed abstractItem """ r = self.childItems.pop(row) # Disassociate the child from its parent and the model. r._parent = None r.setModel(None) return r def parent(self): return self._parent def path(self, sep=" > "): "Returns path to item as string." if self.parent().parent(): return "{parent}{sep}{title}".format( parent=self.parent().path(), sep=sep, title=self.title()) else: return self.title() def pathID(self): "Returns path to item as list of (ID, title)." if self.parent() and self.parent().parent(): return self.parent().pathID() + [(self.ID(), self.title())] else: return [(self.ID(), self.title())] def level(self): """Returns the level of the current item. Root item returns -1.""" if self.parent(): return self.parent().level() + 1 else: return -1 def copy(self): """ Returns a copy of item, with no parent, and no ID. """ item = self.__class__(xml=self.toXML()) item.setData(self.enum.ID, None) return item def siblings(self): if self.parent(): return self.parent().children() return [] ############################################################################### # IDS ############################################################################### def getUniqueID(self, recursive=False): self.setData(self.enum.ID, self._model.rootItem.findUniqueID()) if recursive: for c in self.children(): c.getUniqueID(recursive) def checkIDs(self): """This is called when a model is loaded. Makes a list of all sub-items IDs, that is used to generate unique IDs afterwards. """ self.IDs = self.listAllIDs() if max([self.IDs.count(i) for i in self.IDs if i]) != 1: print("WARNING ! There are some items with same IDs:", [i for i in self.IDs if i and self.IDs.count(i) != 1]) def checkChildren(item): for c in item.children(): _id = c.ID() if not _id or _id == "0": c.getUniqueID() checkChildren(c) checkChildren(self) def listAllIDs(self): IDs = [self.ID()] for c in self.children(): IDs.extend(c.listAllIDs()) return IDs def findUniqueID(self): IDs = [int(i) for i in self.IDs] k = 1 while k in IDs: k += 1 self.IDs.append(str(k)) return str(k) ####################################################################### # Data ####################################################################### def data(self, column, role=Qt.DisplayRole): # Return value in self._data if role == Qt.DisplayRole or role == Qt.EditRole: return self._data.get(column, "") # Or return QVariant return QVariant() def setData(self, column, data, role=Qt.DisplayRole): # Setting data self._data[column] = data # Emit signal self.emitDataChanged(cols=[column]) # new in 0.5.0 ############################################################################### # XML ############################################################################### # We don't want to write some datas (computed) XMLExclude = [] # We want to force some data even if they're empty XMLForce = [] def cleanTextForXML(self, text): return self.valid_xml_re.sub('', text) def toXML(self): """ Returns a string containing the item (and children) in XML. By default, saves all attributes from self.enum and lastPath. You can define in XMLExclude and XMLForce what you want to be excluded or forcibly included. """ item = ET.Element(self.name) for attrib in self.enum: if attrib in self.XMLExclude: continue val = self.data(attrib) if val or attrib in self.XMLForce: item.set(attrib.name, self.cleanTextForXML(str(val))) # Saving lastPath item.set("lastPath", self._lastPath) # Additional stuff for subclasses item = self.toXMLProcessItem(item) for i in self.childItems: item.append(ET.XML(i.toXML())) return ET.tostring(item) def toXMLProcessItem(self, item): """ Subclass this to change the behavior of `toXML`. """ return item def setFromXML(self, xml): root = ET.XML(xml) for k in self.enum: if k.name in root.attrib: self.setData(k, str(root.attrib[k.name])) if "lastPath" in root.attrib: self._lastPath = root.attrib["lastPath"] self.setFromXMLProcessMore(root) for child in root: if child.tag == self.name: item = self.__class__(self._model, xml=ET.tostring(child), parent=self) def setFromXMLProcessMore(self, root): """ Additional stuff that subclasses must do with the XML to restore item. """ return manuskript-0.10.0/manuskript/models/abstractModel.py000066400000000000000000000437431354442177200226270ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import locale from PyQt5.QtCore import QAbstractItemModel, QMimeData from PyQt5.QtCore import QModelIndex from PyQt5.QtCore import QSize from PyQt5.QtCore import QVariant from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon, QFont from PyQt5.QtWidgets import QTextEdit, qApp from manuskript import settings from lxml import etree as ET from manuskript.enums import Outline from manuskript.functions import mainWindow, toInt, wordCount from manuskript.models import outlineItem try: locale.setlocale(locale.LC_ALL, '') except: # Invalid locale, but not really a big deal because it's used only for # number formatting pass import time, os class abstractModel(QAbstractItemModel): """ Abstract model is the base class for all others models we use. It's main responsibilities are: - Interface with QModelIndex and stuff - XML Import / Export - Drag'n'drop """ def __init__(self, parent): QAbstractItemModel.__init__(self, parent) self.rootItem = outlineItem(self, title="Root", ID="0") # Stores removed item, in order to remove them on disk when saving, depending on the file format. self.removed = [] self._removingRows = False def index(self, row, column, parent): if not self.hasIndex(row, column, parent): return QModelIndex() if not parent.isValid(): parentItem = self.rootItem else: parentItem = parent.internalPointer() childItem = parentItem.child(row) if childItem: return self.createIndex(row, column, childItem) else: return QModelIndex() def indexFromItem(self, item, column=0): if item == self.rootItem: return QModelIndex() parent = item.parent() if not parent: parent = self.rootItem if len(parent.children()) == 0: return None # print(item.title(), [i.title() for i in parent.children()]) row = parent.children().index(item) col = column return self.createIndex(row, col, item) def ID(self, index): if index.isValid(): item = index.internalPointer() return item.ID() def findItemsContaining(self, text, columns, caseSensitive=False): """ Returns a list of IDs of all items containing `text` in columns `columns` (being a list of int). """ return self.rootItem.findItemsContaining(text, columns, mainWindow(), caseSensitive) def getItemByID(self, ID, ignore=None): """Returns the item whose ID is `ID`, unless this item matches `ignore`.""" def search(item): if item.ID() == ID: if item == ignore: # The item we really want won't be found in the children of this # particular item anymore; stop searching this branch entirely. return None return item for c in item.children(): r = search(c) if r: return r item = search(self.rootItem) return item def getIndexByID(self, ID, column=0, ignore=None): """Returns the index of item whose ID is `ID`. If none, returns QModelIndex(). If `ignore` is set, it will not return that item if found as valid match for the ID""" item = self.getItemByID(ID, ignore=ignore) if not item: return QModelIndex() else: return self.indexFromItem(item, column) def parent(self, index=QModelIndex()): if not index.isValid(): return QModelIndex() childItem = index.internalPointer() parentItem = childItem.parent() # Check whether the parent is the root, or is otherwise invalid. # That is to say: no parent or the parent lacks a parent. if (parentItem == self.rootItem) or \ (parentItem is None) or (parentItem.parent() is None): return QModelIndex() return self.createIndex(parentItem.row(), 0, parentItem) def rowCount(self, parent=QModelIndex()): if parent.column() > 0: return 0 if not parent.isValid(): parentItem = self.rootItem else: parentItem = parent.internalPointer() return parentItem.childCount() def columnCount(self, parent=QModelIndex()): if parent.isValid(): return parent.internalPointer().columnCount() else: return self.rootItem.columnCount() def data(self, index, role=Qt.DisplayRole): if not index.isValid(): return QVariant() item = index.internalPointer() return item.data(index.column(), role) def setData(self, index, value, role=Qt.EditRole): item = index.internalPointer() if item.data(index.column(), role) != value: item.setData(index.column(), value, role) # self.dataChanged.emit(index.sibling(index.row(), 0), # index.sibling(index.row(), max([i.value for i in Outline]))) # print("Model emit", index.row(), index.column()) self.dataChanged.emit(index, index) if index.column() == Outline.type: # If type changed, then the icon of title changed. # Some views might be glad to know it. self.dataChanged.emit(index.sibling(index.row(), Outline.title), index.sibling(index.row(), Outline.title)) return True def headerData(self, section, orientation, role=Qt.DisplayRole): if orientation == Qt.Horizontal and role in [Qt.DisplayRole, Qt.ToolTipRole]: if section == Outline.title: return self.tr("Title") elif section == Outline.POV: return self.tr("POV") elif section == Outline.label: return self.tr("Label") elif section == Outline.status: return self.tr("Status") elif section == Outline.compile: return self.tr("Compile") elif section == Outline.wordCount: return self.tr("Word count") elif section == Outline.goal: return self.tr("Goal") elif section == Outline.goalPercentage: return "%" else: return [i.name for i in Outline][section] elif role == Qt.SizeHintRole: if section == Outline.compile: return QSize(40, 30) elif section == Outline.goalPercentage: return QSize(100, 30) else: return QVariant() else: return QVariant() return True def maxLevel(self): """Returns the max depth of the model.""" def depth(item, d=-1): d += 1 r = d for c in item.children(): r = max(r, depth(c, d)) return r d = depth(self.rootItem) return d #################### DRAG AND DROP ######################## # http://doc.qt.io/qt-5/model-view-programming.html#using-drag-and-drop-with-item-views def flags(self, index): # FIXME when dragging folders, sometimes flags is not called flags = QAbstractItemModel.flags(self, index) | Qt.ItemIsEditable if index.isValid() and index.internalPointer().isFolder() and index.column() == 0: flags |= Qt.ItemIsDragEnabled | Qt.ItemIsDropEnabled elif index.isValid() and index.column() == 0: flags |= Qt.ItemIsDragEnabled elif not index.isValid(): flags |= Qt.ItemIsDropEnabled if index.isValid() and index.column() == Outline.compile: flags |= Qt.ItemIsUserCheckable if index.column() in [i.value for i in [Outline.wordCount, Outline.goalPercentage]]: flags &= ~ Qt.ItemIsEditable return flags def mimeTypes(self): return ["application/xml"] def mimeData(self, indexes): mimeData = QMimeData() encodedData = "" root = ET.Element("outlineItems") for index in indexes: if index.isValid() and index.column() == 0: item = ET.XML(index.internalPointer().toXML()) root.append(item) encodedData = ET.tostring(root) mimeData.setData("application/xml", encodedData) return mimeData def supportedDropActions(self): return Qt.CopyAction | Qt.MoveAction def canDropMimeData(self, data, action, row, column, parent): """Ensures that we are not dropping an item into itself.""" if not data.hasFormat("application/xml"): return False if column > 0: return False # # Gets encoded mime data to retrieve the item items = self.decodeMimeData(data) if items is None: return False # We check if parent is not a child of one of the items if self.isParentAChildOfItems(parent, items): return False return True def isParentAChildOfItems(self, parent, items): """ Takes a parent index, and a list of outlineItems items. Check whether parent is in a child of one of the items. Return True in that case, False if not. """ # Get the parent item if not parent.isValid(): parentItem = self.rootItem else: parentItem = parent.internalPointer() for item in items: # Get parentItem's parents IDs in a list path = parentItem.pathID() # path to item in the form [(ID, title), ...] path = [ID for ID, title in path] # Is item in the path? It would mean that it tries to get dropped # as a children of himself. if item.ID() in path: return True return False def decodeMimeData(self, data): if not data.hasFormat("application/xml"): return None encodedData = bytes(data.data("application/xml")).decode() root = ET.XML(encodedData) if root is None: return None if root.tag != "outlineItems": return None items = [] for child in root: if child.tag == "outlineItem": item = outlineItem(xml=ET.tostring(child)) items.append(item) # We remove every item whose parent is also in items, otherwise it gets # duplicated. (https://github.com/olivierkes/manuskript/issues/169) # For example if selecting: # - Parent # - Child # And dragging them, items encoded in mime data are: [Parent, Child], # but Child is already contained in Parent, so if we do nothing we end # up with: # - Parent # - Child # - Child newItems = items[:] IDs = [i.ID() for i in items] def checkIfChildIsPresent(item): # Recursively check every children of item, to see if any is in # the list of items to copy. If so, we remove it from the list. for c in item.children(): # We check if children is in the selection # and if it hasn't been removed yet if c.ID() in IDs and c.ID() in [i.ID() for i in newItems]: # Remove item by ID newItems.remove([i for i in newItems if i.ID() == c.ID()][0]) checkIfChildIsPresent(c) for i in items: checkIfChildIsPresent(i) items = newItems return items def dropMimeData(self, data, action, row, column, parent): if action == Qt.IgnoreAction: return True # What is that? if action == Qt.MoveAction: # Strangely, on some cases, we get a call to dropMimeData though # self.canDropMimeData returned False. # See https://github.com/olivierkes/manuskript/issues/169 to reproduce. # So we double check for safety. if not self.canDropMimeData(data, action, row, column, parent): return False items = self.decodeMimeData(data) if items is None: return False if column > 0: column = 0 if row != -1: beginRow = row elif parent.isValid(): beginRow = self.rowCount(parent) + 1 else: beginRow = self.rowCount() + 1 if action == Qt.CopyAction: # Behavior if parent is a text item # For example, we select a text and do: CTRL+C CTRL+V if parent.isValid() and not parent.internalPointer().isFolder(): # We insert copy in parent folder, just below beginRow = parent.row() + 1 parent = parent.parent() if parent.isValid() and parent.internalPointer().isFolder(): while self.isParentAChildOfItems(parent, items): # We are copying a folder on itself. Assume duplicates. # Copy not in, but next to beginRow = parent.row() + 1 parent = parent.parent() if not items: return False # In case of copy actions, items might be duplicates, so we need new IDs. # But they might not be, if we cut, then paste. Paste is a Copy Action. # The first paste would not need new IDs. But subsequent ones will. if action == Qt.CopyAction: IDs = self.rootItem.listAllIDs() for item in items: if item.ID() in IDs: # Recursively remove ID. So will get a new one when inserted. def stripID(item): item.setData(Outline.ID, None) for c in item.children(): stripID(c) stripID(item) r = self.insertItems(items, beginRow, parent) return r ################# ADDING AND REMOVING ################# def insertItem(self, item, row, parent=QModelIndex()): return self.insertItems([item], row, parent) def insertItems(self, items, row, parent=QModelIndex()): if not parent.isValid(): parentItem = self.rootItem else: parentItem = parent.internalPointer() if parent.isValid() and parent.column() != 0: parent = parentItem.index() # Insert only if parent is folder if parentItem.isFolder(): self.beginInsertRows(parent, row, row + len(items) - 1) for i in items: parentItem.insertChild(row + items.index(i), i) self.endInsertRows() return True else: return False def appendItem(self, item, parent=QModelIndex()): if not parent.isValid(): parentItem = self.rootItem else: parentItem = parent.internalPointer() if parent.isValid() and parent.column() != 0: parent = parentItem.index() # If parent is folder, write into if parentItem.isFolder(): self.insertItem(item, self.rowCount(parent), parent) # If parent is not folder, write next to else: self.insertItem(item, parent.row() + 1, parent.parent()) def removeIndex(self, index): item = index.internalPointer() self.removeRow(item.row(), index.parent()) def removeIndexes(self, indexes): levels = {} for i in indexes: item = i.internalPointer() level = item.level() if not level in levels: levels[level] = [] levels[level].append([i.row(), i]) # Sort by level then by row for l in reversed(sorted(levels.keys())): rows = levels[l] rows = list(reversed(sorted(rows, key=lambda x: x[0]))) for r in rows: self.removeIndex(r[1]) def removeRow(self, row, parent=QModelIndex()): return self.removeRows(row, 1, parent) def removeRows(self, row, count, parent=QModelIndex()): if not parent.isValid(): parentItem = self.rootItem else: parentItem = parent.internalPointer() self._removingRows = True # Views that are updating can easily know # if this is due to row removal. self.beginRemoveRows(parent, row, row + count - 1) for i in range(count): item = parentItem.removeChild(row) self.removed.append(item) self._removingRows = False self.endRemoveRows() return True # def insertRow(self, row, item, parent=QModelIndex()): # self.beginInsertRows(parent, row, row) # if not parent.isValid(): # parentItem = self.rootItem # else: # parentItem = parent.internalPointer() # parentItem.insertChild(row, item) # self.endInsertRows() ################# XML / saving / loading ################# def saveToXML(self, xml=None): "If xml (filename) is given, saves the items to xml. Otherwise returns as string." root = ET.XML(self.rootItem.toXML()) if xml: ET.ElementTree(root).write(xml, encoding="UTF-8", xml_declaration=True, pretty_print=True) else: return ET.tostring(root, encoding="UTF-8", xml_declaration=True, pretty_print=True) def loadFromXML(self, xml, fromString=False): "Load from xml. Assume that xml is a filename. If fromString=True, xml is the content." if not fromString: root = ET.parse(xml) else: root = ET.fromstring(xml) self.rootItem = outlineItem(model=self, xml=ET.tostring(root), ID="0") self.rootItem.checkIDs() def indexFromPath(self, path): path = path.split(",") item = self.rootItem for p in path: if p != "" and int(p) < item.childCount(): item = item.child(int(p)) return self.indexFromItem(item) manuskript-0.10.0/manuskript/models/characterModel.py000066400000000000000000000216441354442177200227540ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import QModelIndex, Qt, QAbstractItemModel, QVariant from PyQt5.QtGui import QIcon, QPixmap, QColor from manuskript.functions import randomColor, iconColor, mainWindow from manuskript.enums import Character as C class characterModel(QAbstractItemModel): def __init__(self, parent): QAbstractItemModel.__init__(self, parent) # CharacterItems are stored in this list self.characters = [] ############################################################################### # QAbstractItemModel subclassed ############################################################################### def rowCount(self, parent=QModelIndex()): if parent.isValid(): c = parent.internalPointer() return len(c.infos) else: return len(self.characters) def columnCount(self, parent=QModelIndex()): if parent.isValid(): # Returns characters infos return 2 else: return len(C) def data(self, index, role=Qt.DisplayRole): c = index.internalPointer() if type(c) == Character: if role == Qt.DisplayRole: if index.column() in c._data: return c._data[index.column()] else: return "" elif role == Qt.DecorationRole: if index.column() == C.name.value: return c.icon else: return QVariant() elif type(c) == CharacterInfo: if role == Qt.DisplayRole or role == Qt.EditRole: if index.column() == 0: return c.description elif index.column() == 1: return c.value def setData(self, index, value, role=Qt.EditRole): c = index.internalPointer() if type(c) == Character: if role == Qt.EditRole: # We update only if data is different if index.column() not in c._data or c._data[index.column()] != value: c._data[index.column()] = value self.dataChanged.emit(index, index) return True elif type(c) == CharacterInfo: if role == Qt.EditRole: if index.column() == 0: c.description = value elif index.column() == 1: c.value = value self.dataChanged.emit(index, index) return True return False def index(self, row, column, parent=QModelIndex()): if not parent.isValid(): return self.createIndex(row, column, self.characters[row]) else: c = parent.internalPointer() if row < len(c.infos): return self.createIndex(row, column, c.infos[row]) else: return QModelIndex() def indexFromItem(self, item, column=0): if not item: return QModelIndex() row = self.characters.index(item) col = column return self.createIndex(row, col, item) def parent(self, index): if not index.isValid(): return QModelIndex() child = index.internalPointer() if type(child) == Character: return QModelIndex() elif type(child) == CharacterInfo: return child.character.index() def flags(self, index): if index.parent().isValid(): return QAbstractItemModel.flags(self, index) | Qt.ItemIsEditable else: return QAbstractItemModel.flags(self, index) ############################################################################### # CHARACTER QUERIES ############################################################################### def character(self, row): return self.characters[row] def name(self, row): return self.character(row).name() def icon(self, row): return self.character(row).icon def ID(self, row): return self.character(row).ID() def importance(self, row): return self.character(row).importance() ############################################################################### # MODEL QUERIES ############################################################################### def getCharactersByImportance(self): """ Lists characters by importance. @return: array of array of ´character´, by importance. """ r = [[], [], []] for c in self.characters: r[2-int(c.importance())].append(c) return r def getCharacterByID(self, ID): if ID is not None: ID = str(ID) for c in self.characters: if c.ID() == ID: return c return None ############################################################################### # ADDING / REMOVING ############################################################################### def addCharacter(self): """ Creates a new character @return: the character """ c = Character(model=self, name=self.tr("New character")) self.beginInsertRows(QModelIndex(), len(self.characters), len(self.characters)) self.characters.append(c) self.endInsertRows() return c def removeCharacter(self, ID): """ Removes character whose ID is ID... @param ID: the ID of the character to remove @return: nothing """ c = self.getCharacterByID(ID) self.beginRemoveRows(QModelIndex(), self.characters.index(c), self.characters.index(c)) self.characters.remove(c) self.endRemoveRows() ############################################################################### # CHARACTER INFOS ############################################################################### def headerData(self, section, orientation, role=Qt.DisplayRole): if role == Qt.DisplayRole and orientation == Qt.Horizontal: if section == 0: return self.tr("Name") elif section == 1: return self.tr("Value") else: return C(section).name def addCharacterInfo(self, ID): c = self.getCharacterByID(ID) self.beginInsertRows(c.index(), len(c.infos), len(c.infos)) c.infos.append(CharacterInfo(c, description="Description", value="Value")) self.endInsertRows() mainWindow().updatePersoInfoView() def removeCharacterInfo(self, ID): c = self.getCharacterByID(ID) rm = [] for idx in mainWindow().tblPersoInfos.selectedIndexes(): if not idx.row() in rm: rm.append(idx.row()) rm.sort() rm.reverse() for r in rm: self.beginRemoveRows(c.index(), r, r) c.infos.pop(r) self.endRemoveRows() ############################################################################### # CHARACTER ############################################################################### class Character(): def __init__(self, model, name="No name"): self._model = model self.lastPath = "" self._data = {} self._data[C.name.value] = name self.assignUniqueID() self.assignRandomColor() self._data[C.importance.value] = "0" self.infos = [] def name(self): return self._data[C.name.value] def importance(self): return self._data[C.importance.value] def ID(self): return self._data[C.ID.value] def index(self, column=0): return self._model.indexFromItem(self, column) def assignRandomColor(self): """ Assigns a random color the the character. """ color = randomColor(QColor(Qt.white)) self.setColor(color) def setColor(self, color): """ Sets the character's color @param color: QColor. """ px = QPixmap(32, 32) px.fill(color) self.icon = QIcon(px) try: self._model.dataChanged.emit(self.index(), self.index()) except: # If it is the initialisation, won't be able to emit pass def color(self): """ Returns character's color in QColor @return: QColor """ return iconColor(self.icon) def assignUniqueID(self, parent=QModelIndex()): """Assigns an unused character ID.""" vals = [] for c in self._model.characters: vals.append(int(c.ID())) k = 0 while k in vals: k += 1 self._data[C.ID.value] = str(k) def listInfos(self): r = [] for i in self.infos: r.append((i.description, i.value)) return r class CharacterInfo(): def __init__(self, character, description="", value=""): self.description = description self.value = value self.character = character manuskript-0.10.0/manuskript/models/outlineItem.py000066400000000000000000000375371354442177200223450ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import time import locale from PyQt5.QtCore import Qt from PyQt5.QtGui import QFont, QIcon from PyQt5.QtWidgets import qApp from lxml import etree as ET from manuskript.models.abstractItem import abstractItem from manuskript import enums from manuskript import functions as F from manuskript import settings from manuskript.converters import HTML2PlainText try: locale.setlocale(locale.LC_ALL, '') except: # Invalid locale, but not really a big deal because it's used only for # number formatting pass class outlineItem(abstractItem): enum = enums.Outline # Used for XML export name = "outlineItem" def __init__(self, model=None, title="", _type="folder", xml=None, parent=None, ID=None): abstractItem.__init__(self, model, title, _type, xml, parent, ID) self.defaultTextType = None if not self._data.get(self.enum.compile): self._data[self.enum.compile] = 2 ####################################################################### # Properties ####################################################################### def isFolder(self): return self._data[self.enum.type] == "folder" def isText(self): return self._data[self.enum.type] == "md" def isMD(self): return self._data[self.enum.type] == "md" def isMMD(self): return self._data[self.enum.type] == "md" def text(self): return self.data(self.enum.text) def compile(self): if self._data.get(self.enum.compile, 1) in ["0", 0]: return False elif self.parent(): return self.parent().compile() else: return True # rootItem always compile def POV(self): return self.data(self.enum.POV) def status(self): return self.data(self.enum.status) def label(self): return self.data(self.enum.label) def customIcon(self): return self.data(self.enum.customIcon) def setCustomIcon(self, customIcon): self.setData(self.enum.customIcon, customIcon) def wordCount(self): return self._data.get(self.enum.wordCount, 0) def __str__(self): return "{id}: {folder}{title}{children}".format( id=self.ID(), folder="*" if self.isFolder() else "", title=self.data(self.enum.title), children="" if self.isText() else "({})".format(self.childCount()) ) __repr__ = __str__ ####################################################################### # Data ####################################################################### def data(self, column, role=Qt.DisplayRole): data = abstractItem.data(self, column, role) E = self.enum if role == Qt.DisplayRole or role == Qt.EditRole: if data == "" and column == E.revisions: return [] else: return data elif role == Qt.DecorationRole and column == E.title: if self.customIcon(): return QIcon.fromTheme(self.data(E.customIcon)) if self.isFolder(): return QIcon.fromTheme("folder") elif self.isText(): return QIcon.fromTheme("text-x-generic") elif role == Qt.CheckStateRole and column == E.compile: return Qt.Checked if self.compile() else Qt.Unchecked elif role == Qt.FontRole: f = QFont() if column == E.wordCount and self.isFolder(): f.setItalic(True) elif column == E.goal and self.isFolder() and not self.data(E.setGoal): f.setItalic(True) if self.isFolder(): f.setBold(True) return f def setData(self, column, data, role=Qt.DisplayRole): E = self.enum if column == E.text and self.isFolder(): # Folder have no text return if column == E.goal: self._data[E.setGoal] = F.toInt(data) if F.toInt(data) > 0 else "" # Checking if we will have to recount words updateWordCount = False if column in [E.wordCount, E.goal, E.setGoal]: updateWordCount = not column in self._data or self._data[column] != data # Stuff to do before if column == E.text: self.addRevision() # Calling base class implementation abstractItem.setData(self, column, data, role) # Stuff to do afterwards if column == E.text: wc = F.wordCount(data) self.setData(E.wordCount, wc) if column == E.compile: # Title changes when compile changes self.emitDataChanged(cols=[E.title, E.compile], recursive=True) if column == E.customIcon: # If custom icon changed, we tell views to update title (so that # icons will be updated as well) self.emitDataChanged(cols=[E.title]) if updateWordCount: self.updateWordCount() ####################################################################### # Wordcount ####################################################################### def insertChild(self, row, child): abstractItem.insertChild(self, row, child) self.updateWordCount() def removeChild(self, row): r = abstractItem.removeChild(self, row) self.updateWordCount() return r def updateWordCount(self): """Update word count for item and parents.""" if not self.isFolder(): setGoal = F.toInt(self.data(self.enum.setGoal)) goal = F.toInt(self.data(self.enum.goal)) if goal != setGoal: self._data[self.enum.goal] = setGoal if setGoal: wc = F.toInt(self.data(self.enum.wordCount)) self.setData(self.enum.goalPercentage, wc / float(setGoal)) else: wc = 0 for c in self.children(): wc += F.toInt(c.data(self.enum.wordCount)) self._data[self.enum.wordCount] = wc setGoal = F.toInt(self.data(self.enum.setGoal)) goal = F.toInt(self.data(self.enum.goal)) if setGoal: if goal != setGoal: self._data[self.enum.goal] = setGoal goal = setGoal else: goal = 0 for c in self.children(): goal += F.toInt(c.data(self.enum.goal)) self._data[self.enum.goal] = goal if goal: self.setData(self.enum.goalPercentage, wc / float(goal)) else: self.setData(self.enum.goalPercentage, "") self.emitDataChanged([self.enum.goal, self.enum.setGoal, self.enum.wordCount, self.enum.goalPercentage]) if self.parent(): self.parent().updateWordCount() def stats(self): wc = self.data(enums.Outline.wordCount) goal = self.data(enums.Outline.goal) progress = self.data(enums.Outline.goalPercentage) if not wc: wc = 0 if goal: return qApp.translate("outlineItem", "{} words / {} ({})").format( locale.format_string("%d", wc, grouping=True), locale.format_string("%d", goal, grouping=True), "{}%".format(str(int(progress * 100)))) else: return qApp.translate("outlineItem", "{} words").format( locale.format_string("%d", wc, grouping=True)) ####################################################################### # Tools: split and merge ####################################################################### def split(self, splitMark, recursive=True): """ Split scene at splitMark. If multiple splitMark, multiple splits. If called on a folder and recursive is True, then it is recursively applied to every children. """ if self.isFolder() and recursive: for c in self.children(): c.split(splitMark) else: txt = self.text().split(splitMark) if len(txt) == 1: # Mark not found return False else: # Stores the new text self.setData(self.enum.text, txt[0]) k = 1 for subTxt in txt[1:]: # Create a copy item = self.copy() # Change title adding _k item.setData(self.enum.title, "{}_{}".format(item.title(), k+1)) # Set text item.setData(self.enum.text, subTxt) # Inserting item #self.parent().insertChild(self.row()+k, item) self._model.insertItem(item, self.row()+k, self.parent().index()) k += 1 def splitAt(self, position, length=0): """ Splits note at position p. If length is bigger than 0, it describes the length of the title, made from the character following position. """ txt = self.text() # Stores the new text self.setData(self.enum.text, txt[:position]) # Create a copy item = self.copy() # Update title if length > 0: title = txt[position:position+length].replace("\n", "") else: title = "{}_{}".format(item.title(), 2) item.setData(self.enum.title, title) # Set text item.setData(self.enum.text, txt[position+length:]) # Inserting item using the model to signal views self._model.insertItem(item, self.row()+1, self.parent().index()) def mergeWith(self, items, sep="\n\n"): """ Merges item with several other items. Merge is basic, it merges only the text. @param items: list of `outlineItem`s. @param sep: a text added between each item's text. """ # Merges the texts text = [self.text()] text.extend([i.text() for i in items]) self.setData(self.enum.text, sep.join(text)) # Removes other items self._model.removeIndexes([i.index() for i in items]) ####################################################################### # Search ####################################################################### def findItemsByPOV(self, POV): "Returns a list of IDs of all subitems whose POV is ``POV``." lst = [] if self.POV() == POV: lst.append(self.ID()) for c in self.children(): lst.extend(c.findItemsByPOV(POV)) return lst def findItemsContaining(self, text, columns, mainWindow=F.mainWindow(), caseSensitive=False, recursive=True): """Returns a list if IDs of all subitems containing ``text`` in columns ``columns`` (being a list of int). """ lst = self.itemContains(text, columns, mainWindow, caseSensitive) if recursive: for c in self.children(): lst.extend(c.findItemsContaining(text, columns, mainWindow, caseSensitive)) return lst def itemContains(self, text, columns, mainWindow=F.mainWindow(), caseSensitive=False): lst = [] text = text.lower() if not caseSensitive else text for c in columns: if c == self.enum.POV and self.POV(): c = mainWindow.mdlCharacter.getCharacterByID(self.POV()) if c: searchIn = c.name() else: searchIn = "" print("Character POV not found:", self.POV()) elif c == self.enum.status: searchIn = mainWindow.mdlStatus.item(F.toInt(self.status()), 0).text() elif c == self.enum.label: searchIn = mainWindow.mdlLabels.item(F.toInt(self.label()), 0).text() else: searchIn = self.data(c) searchIn = searchIn.lower() if not caseSensitive else searchIn if text in searchIn: if not self.ID() in lst: lst.append(self.ID()) return lst ############################################################################### # REVISIONS ############################################################################### def revisions(self): return self.data(self.enum.revisions) def appendRevision(self, ts, text): if not self.enum.revisions in self._data: self._data[self.enum.revisions] = [] self._data[self.enum.revisions].append(( int(ts), text)) def addRevision(self): if not settings.revisions["keep"]: return if not self.enum.text in self._data: return self.appendRevision( time.time(), self.text()) if settings.revisions["smartremove"]: self.cleanRevisions() self.emitDataChanged([self.enum.revisions]) def deleteRevision(self, ts): self._data[self.enum.revisions] = [r for r in self._data[self.enum.revisions] if r[0] != ts] self.emitDataChanged([self.enum.revisions]) def clearAllRevisions(self): self._data[self.enum.revisions] = [] self.emitDataChanged([self.enum.revisions]) def cleanRevisions(self): "Keep only one some the revisions." rev = self.revisions() rev2 = [] now = time.time() rule = settings.revisions["rules"] revs = {} for i in rule: revs[i] = [] for r in rev: # Have to put the lambda key otherwise cannot order when one element is None for span in sorted(rule, key=lambda x: x if x else 60 * 60 * 24 * 30 * 365): if not span or now - r[0] < span: revs[span].append(r) break for span in revs: sortedRev = sorted(revs[span], key=lambda x: x[0]) last = None for r in sortedRev: if not last: rev2.append(r) last = r[0] elif r[0] - last >= rule[span]: rev2.append(r) last = r[0] if rev2 != rev: self._data[self.enum.revisions] = rev2 self.emitDataChanged([self.enum.revisions]) ####################################################################### # XML ####################################################################### # We don't want to write some datas (computed) XMLExclude = [enums.Outline.wordCount, enums.Outline.goal, enums.Outline.goalPercentage, enums.Outline.revisions] # We want to force some data even if they're empty XMLForce = [enums.Outline.compile] def toXMLProcessItem(self, item): # Saving revisions rev = self.revisions() for r in rev: revItem = ET.Element("revision") revItem.set("timestamp", str(r[0])) revItem.set("text", self.cleanTextForXML(r[1])) item.append(revItem) return item def setFromXMLProcessMore(self, root): # If loading from an old file format, convert to md and # remove html markup if self.type() in ["txt", "t2t"]: self.setData(Outline.type, "md") elif self.type() == "html": self.setData(Outline.type, "md") self.setData(Outline.text, HTML2PlainText(self.data(Outline.text))) self.setData(Outline.notes, HTML2PlainText(self.data(Outline.notes))) # Revisions for child in root: if child.tag == "revision": self.appendRevision(child.attrib["timestamp"], child.attrib["text"]) manuskript-0.10.0/manuskript/models/outlineModel.py000066400000000000000000000005661354442177200224770ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from manuskript.models.abstractModel import abstractModel class outlineModel(abstractModel): def __init__(self, parent): abstractModel.__init__(self, parent) def findItemsByPOV(self, POV): "Returns a list of IDs of all items whose POV is ``POV``." return self.rootItem.findItemsByPOV(POV) manuskript-0.10.0/manuskript/models/persosProxyModel.py000066400000000000000000000103111354442177200233620ustar00rootroot00000000000000#!/usr/bin/env python #--!-- coding: utf8 --!-- from manuskript import enums from manuskript.ui import style as S class persosProxyModel(QSortFilterProxyModel): newStatuses = pyqtSignal() def __init__(self, parent=None): QSortFilterProxyModel.__init__(self, parent) #self.rootItem = QStandardItem() self.p1 = QStandardItem(self.tr("Main")) self.p2 = QStandardItem(self.tr("Secondary")) self.p3 = QStandardItem(self.tr("Minors")) self._cats = [ self.p1, self.p2, self.p3 ] def mapFromSource(self, sourceIndex): if not sourceIndex.isValid(): return QModelIndex() row = self._map.index(sourceIndex.row()) #item = sourceIndex.internalPointer() item = self.sourceModel().itemFromIndex(sourceIndex) return self.createIndex(row, sourceIndex.column(), item) def flags(self, index): if not index.isValid(): return Qt.NoItemFlags if index.isValid() and not self.mapToSource(index).isValid(): return Qt.NoItemFlags#Qt.ItemIsEnabled else: return Qt.ItemIsEnabled | Qt.ItemIsSelectable def mapToSource(self, proxyIndex): if not proxyIndex.isValid(): return QModelIndex() row = self._map[proxyIndex.row()] if type(row) != int: return QModelIndex() #item = proxyIndex.internalPointer() item = self.sourceModel().item(row, proxyIndex.column()) return self.sourceModel().indexFromItem(item) def setSourceModel(self, model): QSortFilterProxyModel.setSourceModel(self, model) self.sourceModel().dataChanged.connect(self.mapModelMaybe) self.sourceModel().rowsInserted.connect(self.mapModel) self.sourceModel().rowsRemoved.connect(self.mapModel) self.sourceModel().rowsMoved.connect(self.mapModel) self.mapModel() def mapModelMaybe(self, topLeft, bottomRight): if topLeft.column() <= Perso.importance.value <= bottomRight.column(): self.mapModel() def mapModel(self): self.beginResetModel() src = self.sourceModel() self._map = [] for i, cat in enumerate(self._cats): self._map.append(cat) for p in range(src.rowCount()): item = src.item(p, Perso.importance.value) if item and item.text(): imp = int(item.text()) else: imp = 0 if 2-imp == i: self._map.append(p) self.endResetModel() def data(self, index, role=Qt.DisplayRole): if index.isValid() and not self.mapToSource(index).isValid(): row = index.row() if role == Qt.DisplayRole: return self._map[row].text() elif role == Qt.ForegroundRole: return QBrush(QColor(S.highlightedTextDark)) elif role == Qt.BackgroundRole: return QBrush(QColor(S.highlightLight)) elif role == Qt.TextAlignmentRole: return Qt.AlignCenter elif role == Qt.FontRole: f = QFont() #f.setPointSize(f.pointSize() + 1) f.setWeight(QFont.Bold) return f else: #FIXME: sometimes, the name of the character is not displayed return self.sourceModel().data(self.mapToSource(index), role) def index(self, row, column, parent): i = self._map[row] if type(i) != int: return self.createIndex(row, column, i) else: return self.mapFromSource(self.sourceModel().index(i, column, QModelIndex())) def parent(self, index=QModelIndex()): return QModelIndex() def rowCount(self, parent=QModelIndex()): return len(self._map) def columnCount(self, parent=QModelIndex()): return self.sourceModel().columnCount(QModelIndex()) def item(self, row, col, parent=QModelIndex()): idx = self.mapToSource(self.index(row, col, parent)) return self.sourceModel().item(idx.row(), idx.column()) #def setData(self, index, value, role=Qt.EditRole): #pass manuskript-0.10.0/manuskript/models/plotModel.py000066400000000000000000000225121354442177200217710ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import QModelIndex from PyQt5.QtCore import QSignalMapper from PyQt5.QtCore import Qt from PyQt5.QtGui import QBrush from PyQt5.QtGui import QStandardItem from PyQt5.QtGui import QStandardItemModel from PyQt5.QtWidgets import QAction, QMenu from manuskript.enums import Plot from manuskript.enums import PlotStep from manuskript.functions import toInt, mainWindow class plotModel(QStandardItemModel): def __init__(self, parent): QStandardItemModel.__init__(self, 0, 3, parent) self.setHorizontalHeaderLabels([i.name for i in Plot]) self.mw = mainWindow() self.updatePlotPersoButton() ############################################################################### # QUERIES ############################################################################### def getPlotsByImportance(self): plots = [[], [], []] for i in range(self.rowCount()): importance = self.item(i, Plot.importance).text() ID = self.item(i, Plot.ID).text() plots[2 - toInt(importance)].append(ID) return plots def getSubPlotsByID(self, ID): index = self.getIndexFromID(ID) if not index.isValid(): return index = index.sibling(index.row(), Plot.steps) item = self.itemFromIndex(index) lst = [] for i in range(item.rowCount()): if item.child(i, PlotStep.ID): _ID = item.child(i, PlotStep.ID).text() # Don't know why sometimes name is None (while drag'n'dropping # several items) if item.child(i, PlotStep.name): name = item.child(i, PlotStep.name).text() else: name = "" # Don't know why sometimes summary is None if item.child(i, PlotStep.summary): summary = item.child(i, PlotStep.summary).text() else: summary = "" lst.append((_ID, name, summary)) return lst def getPlotNameByID(self, ID): for i in range(self.rowCount()): _ID = self.item(i, Plot.ID).text() if _ID == ID or toInt(_ID) == ID: name = self.item(i, Plot.name).text() return name return None def getPlotImportanceByRow(self, row): for i in range(self.rowCount()): if i == row: importance = self.item(i, Plot.importance).text() return importance return "0" # Default to "Minor" def getSubPlotTextsByID(self, plotID, subplotRaw): """Returns a tuple (name, summary) for the subplot whose raw in the model is ``subplotRaw``, of plot whose ID is ``plotID``. """ plotIndex = self.getIndexFromID(plotID) name = plotIndex.child(subplotRaw, PlotStep.name).data() summary = plotIndex.child(subplotRaw, PlotStep.summary).data() return name, summary def getIndexFromID(self, ID): for i in range(self.rowCount()): _ID = self.item(i, Plot.ID).text() if _ID == ID or toInt(_ID) == ID: return self.index(i, 0) return QModelIndex() def currentIndex(self): i = self.mw.lstPlots.currentIndex() if i.isValid(): return i else: return None ############################################################################### # ADDING / REMOVING ############################################################################### def addPlot(self): p = QStandardItem(self.tr("New plot")) _id = QStandardItem(self.getUniqueID()) importance = QStandardItem(str(0)) self.appendRow([p, _id, importance, QStandardItem("Characters"), QStandardItem(), QStandardItem(), QStandardItem("Resolution steps")]) def getUniqueID(self, parent=QModelIndex()): """Returns an unused ID""" parentItem = self.itemFromIndex(parent) vals = [] for i in range(self.rowCount(parent)): index = self.index(i, Plot.ID, parent) # item = self.item(i, Plot.ID) if index.isValid() and index.data(): vals.append(int(index.data())) k = 0 while k in vals: k += 1 return str(k) def removePlot(self, index): self.takeRow(index.row()) ############################################################################### # SUBPLOTS ############################################################################### def headerData(self, section, orientation, role=Qt.DisplayRole): if role == Qt.DisplayRole: if orientation == Qt.Horizontal: if section == PlotStep.name: return self.tr("Name") elif section == PlotStep.meta: return self.tr("Meta") else: return "" else: return "" else: return QStandardItemModel.headerData(self, section, orientation, role) def data(self, index, role=Qt.DisplayRole): if index.parent().isValid() and \ index.parent().column() == Plot.steps and \ index.column() == PlotStep.meta: if role == Qt.TextAlignmentRole: return Qt.AlignRight | Qt.AlignVCenter elif role == Qt.ForegroundRole: return QBrush(Qt.gray) else: return QStandardItemModel.data(self, index, role) else: return QStandardItemModel.data(self, index, role) def addSubPlot(self): index = self.mw.lstPlots.currentPlotIndex() if not index.isValid(): return parent = index.sibling(index.row(), Plot.steps) parentItem = self.item(index.row(), Plot.steps) if not parentItem: return p = QStandardItem(self.tr("New step")) _id = QStandardItem(self.getUniqueID(parent)) summary = QStandardItem() currentIndex = self.mw.lstSubPlots.selectionModel().selectedIndexes() if currentIndex: # We use last item of selection in case of many currentIndex = currentIndex[-1] row = currentIndex.row() + 1 parentItem.insertRow(row, [p, _id, QStandardItem(), summary]) # Select last index self.mw.lstSubPlots.setCurrentIndex(currentIndex.sibling(row, 0)) else: # Don't know why, if summary is in third position, then drag/drop deletes it... parentItem.appendRow([p, _id, QStandardItem(), summary]) # Select last index self.mw.lstSubPlots.setCurrentIndex(parent.child(self.rowCount(parent) - 1, 0)) def removeSubPlot(self): """ Remove all selected subplots / plot steps, in mw.lstSubPlots. """ parent = self.mw.lstSubPlots.rootIndex() if not parent.isValid(): return parentItem = self.itemFromIndex(parent) while self.mw.lstSubPlots.selectionModel().selectedRows(): i = self.mw.lstSubPlots.selectionModel().selectedRows()[0] parentItem.takeRow(i.row()) def flags(self, index): parent = index.parent() if parent.isValid(): # this is a subitem return Qt.ItemIsEnabled | Qt.ItemIsEditable | Qt.ItemIsSelectable | Qt.ItemIsDragEnabled else: return QStandardItemModel.flags(self, index) ############################################################################### # PLOT PERSOS ############################################################################### def addPlotPerso(self, v): index = self.mw.lstPlots.currentPlotIndex() if index.isValid(): if not self.item(index.row(), Plot.characters): self.setItem(index.row(), Plot.characters, QStandardItem()) item = self.item(index.row(), Plot.characters) # We check that the PersoID is not in the list yet for i in range(item.rowCount()): if item.child(i).text() == str(v): return item.appendRow(QStandardItem(str(v))) def removePlotPerso(self): index = self.mw.lstPlotPerso.currentIndex() if not index.isValid(): return parent = index.parent() parentItem = self.itemFromIndex(parent) parentItem.takeRow(index.row()) def updatePlotPersoButton(self): menu = QMenu(self.mw) menus = [] for i in [self.tr("Main"), self.tr("Secondary"), self.tr("Minor")]: m = QMenu(i, menu) menus.append(m) menu.addMenu(m) mpr = QSignalMapper(menu) for i in range(self.mw.mdlCharacter.rowCount()): a = QAction(self.mw.mdlCharacter.name(i), menu) a.setIcon(self.mw.mdlCharacter.icon(i)) a.triggered.connect(mpr.map) mpr.setMapping(a, int(self.mw.mdlCharacter.ID(i))) imp = toInt(self.mw.mdlCharacter.importance(i)) menus[2 - imp].addAction(a) # Disabling empty menus for m in menus: if not m.actions(): m.setEnabled(False) mpr.mapped.connect(self.addPlotPerso) self.mw.btnAddPlotPerso.setMenu(menu) manuskript-0.10.0/manuskript/models/plotsProxyModel.py000066400000000000000000000105571354442177200232240ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import QModelIndex from PyQt5.QtCore import QSortFilterProxyModel from PyQt5.QtCore import Qt from PyQt5.QtCore import pyqtSignal from PyQt5.QtGui import QBrush, QFont from PyQt5.QtGui import QColor from PyQt5.QtGui import QStandardItem from manuskript.enums import Plot from manuskript.ui import style as S class plotsProxyModel(QSortFilterProxyModel): newStatuses = pyqtSignal() def __init__(self, parent=None): QSortFilterProxyModel.__init__(self, parent) # self.rootItem = QStandardItem() self.p1 = QStandardItem(self.tr("Main")) self.p2 = QStandardItem(self.tr("Secondary")) self.p3 = QStandardItem(self.tr("Minors")) self._cats = [ self.p1, self.p2, self.p3 ] def mapFromSource(self, sourceIndex): if not sourceIndex.isValid(): return QModelIndex() row = self._map.index(sourceIndex.row()) # item = sourceIndex.internalPointer() item = self.sourceModel().itemFromIndex(sourceIndex) return self.createIndex(row, sourceIndex.column(), item) def flags(self, index): if not index.isValid(): return Qt.NoItemFlags if index.isValid() and not self.mapToSource(index).isValid(): return Qt.NoItemFlags # Qt.ItemIsEnabled else: return Qt.ItemIsEnabled | Qt.ItemIsSelectable def mapToSource(self, proxyIndex): if not proxyIndex.isValid(): return QModelIndex() row = self._map[proxyIndex.row()] if type(row) != int: return QModelIndex() # item = proxyIndex.internalPointer() item = self.sourceModel().item(row, proxyIndex.column()) return self.sourceModel().indexFromItem(item) def setSourceModel(self, model): QSortFilterProxyModel.setSourceModel(self, model) self.sourceModel().dataChanged.connect(self.mapModelMaybe) self.sourceModel().rowsInserted.connect(self.mapModel) self.sourceModel().rowsRemoved.connect(self.mapModel) self.sourceModel().rowsMoved.connect(self.mapModel) self.mapModel() def mapModelMaybe(self, topLeft, bottomRight): if topLeft.column() <= Plot.importance <= bottomRight.column(): self.mapModel() def mapModel(self): self.beginResetModel() src = self.sourceModel() self._map = [] for i in range(len(self._cats)): self._map.append(self._cats[i]) for p in range(src.rowCount()): item = src.item(p, Plot.importance) if item: imp = int(item.text()) else: imp = 0 if 2 - imp == i: self._map.append(p) self.endResetModel() def data(self, index, role=Qt.DisplayRole): if index.isValid() and not self.mapToSource(index).isValid(): row = index.row() if role == Qt.DisplayRole: return self._map[row].text() elif role == Qt.ForegroundRole: return QBrush(QColor(S.highlightedTextDark)) elif role == Qt.BackgroundRole: return QBrush(QColor(S.highlightLight)) elif role == Qt.TextAlignmentRole: return Qt.AlignCenter elif role == Qt.FontRole: f = QFont() # f.setPointSize(f.pointSize() + 1) f.setWeight(QFont.Bold) return f else: # FIXME: sometimes, the name of the character is not displayed return self.sourceModel().data(self.mapToSource(index), role) def index(self, row, column, parent): i = self._map[row] if type(i) != int: return self.createIndex(row, column, i) else: return self.mapFromSource(self.sourceModel().index(i, column, QModelIndex())) def parent(self, index=QModelIndex()): return QModelIndex() def rowCount(self, parent=QModelIndex()): return len(self._map) def columnCount(self, parent=QModelIndex()): return self.sourceModel().columnCount(QModelIndex()) def item(self, row, col, parent=QModelIndex()): idx = self.mapToSource(self.index(row, col, parent)) return self.sourceModel().item(idx.row(), idx.column()) manuskript-0.10.0/manuskript/models/references.py000066400000000000000000000525341354442177200221620ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import re ############################################################################### # SHORT REFERENCES ############################################################################### # A regex used to match references from PyQt5.QtWidgets import qApp from PyQt5.QtGui import QColor from PyQt5.QtCore import Qt from manuskript.enums import Outline from manuskript.enums import Character from manuskript.enums import Plot from manuskript.enums import PlotStep from manuskript.functions import mainWindow, mixColors from manuskript.ui import style as S RegEx = r"{(\w):(\d+):?.*?}" # A non-capturing regex used to identify references RegExNonCapturing = r"{\w:\d+:?.*?}" # The basic format of the references EmptyRef = "{{{}:{}:{}}}" EmptyRefSearchable = "{{{}:{}:" CharacterLetter = "C" TextLetter = "T" PlotLetter = "P" WorldLetter = "W" # Colors TextHighlightColor = QColor(mixColors(QColor(Qt.blue).name(), S.window, .3)) CharacterHighlightColor = QColor(mixColors(QColor(Qt.yellow).name(), S.window, .3)) PlotHighlightColor = QColor(mixColors(QColor(Qt.red).name(), S.window, .3)) WorldHighlightColor = QColor(mixColors(QColor(Qt.green).name(), S.window, .3)) def plotReference(ID, searchable=False): """Takes the ID of a plot and returns a reference for that plot. @searchable: returns a stripped version that allows simple text search.""" if not searchable: return EmptyRef.format(PlotLetter, ID, "") else: return EmptyRefSearchable.format(PlotLetter, ID, "") def characterReference(ID, searchable=False): """Takes the ID of a character and returns a reference for that character. @searchable: returns a stripped version that allows simple text search.""" if not searchable: return EmptyRef.format(CharacterLetter, ID, "") else: return EmptyRefSearchable.format(CharacterLetter, ID, "") def textReference(ID, searchable=False): """Takes the ID of an outline item and returns a reference for that item. @searchable: returns a stripped version that allows simple text search.""" if not searchable: return EmptyRef.format(TextLetter, ID, "") else: return EmptyRefSearchable.format(TextLetter, ID, "") def worldReference(ID, searchable=False): """Takes the ID of a world item and returns a reference for that item. @searchable: returns a stripped version that allows simple text search.""" if not searchable: return EmptyRef.format(WorldLetter, ID, "") else: return EmptyRefSearchable.format(WorldLetter, ID, "") ############################################################################### # READABLE INFOS ############################################################################### def infos(ref): """Returns a full paragraph in HTML format containing detailed infos about the reference ``ref``. """ match = re.fullmatch(RegEx, ref) if not match: return qApp.translate("references", "Not a reference: {}.").format(ref) _type = match.group(1) _ref = match.group(2) # A text or outline item if _type == TextLetter: m = mainWindow().mdlOutline idx = m.getIndexByID(_ref) if not idx.isValid(): return qApp.translate("references", "Unknown reference: {}.").format(ref) item = idx.internalPointer() # Titles pathTitle = qApp.translate("references", "Path:") statsTitle = qApp.translate("references", "Stats:") POVTitle = qApp.translate("references", "POV:") statusTitle = qApp.translate("references", "Status:") labelTitle = qApp.translate("references", "Label:") ssTitle = qApp.translate("references", "Short summary:") lsTitle = qApp.translate("references", "Long summary:") notesTitle = qApp.translate("references", "Notes:") # The POV of the scene POV = "" if item.POV(): POV = "{text}".format( ref=characterReference(item.POV()), text=mainWindow().mdlCharacter.getCharacterByID(item.POV()).name()) # The status of the scene status = item.status() if status: status = mainWindow().mdlStatus.item(int(status), 0).text() else: status = "" # The label of the scene label = item.label() if label: label = mainWindow().mdlLabels.item(int(label), 0).text() else: label = "" # The path of the scene path = item.pathID() pathStr = [] for _id, title in path: pathStr.append("{text}".format( ref=textReference(_id), text=title)) path = " > ".join(pathStr) # Summaries and notes ss = item.data(Outline.summarySentence) ls = item.data(Outline.summaryFull) notes = item.data(Outline.notes) text = """

{title}

{pathTitle} {path}

{statsTitle} {stats}
{POV} {status} {label}

{ss} {ls} {notes} {references} """.format( title=item.title(), pathTitle=pathTitle, path=path, statsTitle=statsTitle, stats=item.stats(), POV="{POVTitle} {POV}
".format( POVTitle=POVTitle, POV=POV) if POV else "", status="{statusTitle} {status}
".format( statusTitle=statusTitle, status=status) if status else "", label="{labelTitle} {label}

".format( labelTitle=labelTitle, label=label) if label else "", ss="

{ssTitle} {ss}

".format( ssTitle=ssTitle, ss=ss.replace("\n", "
")) if ss.strip() else "", ls="

{lsTitle}
{ls}

".format( lsTitle=lsTitle, ls=ls.replace("\n", "
")) if ls.strip() else "", notes="

{notesTitle}
{notes}

".format( notesTitle=notesTitle, notes=linkifyAllRefs(notes)) if notes.strip() else "", references=listReferences(ref) ) return text # A character elif _type == CharacterLetter: m = mainWindow().mdlCharacter c = m.getCharacterByID(int(_ref)) if c is None: return qApp.translate("references", "Unknown reference: {}.").format(ref) index = c.index() name = c.name() # Titles basicTitle = qApp.translate("references", "Basic info") detailedTitle = qApp.translate("references", "Detailed info") POVof = qApp.translate("references", "POV of:") # Goto (link) goto = qApp.translate("references", "Go to {}.") goto = goto.format(refToLink(ref)) # basic infos basic = [] for i in [ (Character.motivation, qApp.translate("references", "Motivation"), False), (Character.goal, qApp.translate("references", "Goal"), False), (Character.conflict, qApp.translate("references", "Conflict"), False), (Character.epiphany, qApp.translate("references", "Epiphany"), False), (Character.summarySentence, qApp.translate("references", "Short summary"), True), (Character.summaryPara, qApp.translate("references", "Longer summary"), True), ]: val = m.data(index.sibling(index.row(), i[0].value)) if val: basic.append("{title}:{n}{val}".format( title=i[1], n="\n" if i[2] else " ", val=val)) basic = "
".join(basic) # detailed infos detailed = [] for _name, _val in c.listInfos(): detailed.append("{}: {}".format( _name, _val)) detailed = "
".join(detailed) # list scenes of which it is POV oM = mainWindow().mdlOutline lst = oM.findItemsByPOV(_ref) listPOV = "" for t in lst: idx = oM.getIndexByID(t) listPOV += "
  • {text}
  • ".format( link=textReference(t), text=oM.data(idx, Outline.title)) text = """

    {name}

    {goto} {basicInfos} {detailedInfos} {POV} {references} """.format( name=name, goto=goto, basicInfos="

    {basicTitle}

    {basic}".format( basicTitle=basicTitle, basic=basic) if basic else "", detailedInfos="

    {detailedTitle}

    {detailed}".format( detailedTitle=detailedTitle, detailed=detailed) if detailed else "", POV="

    {POVof}

      {listPOV}
    ".format( POVof=POVof, listPOV=listPOV) if listPOV else "", references=listReferences(ref) ) return text # A plot elif _type == PlotLetter: m = mainWindow().mdlPlots index = m.getIndexFromID(_ref) name = m.getPlotNameByID(_ref) if not index.isValid(): return qApp.translate("references", "Unknown reference: {}.").format(ref) # Titles descriptionTitle = qApp.translate("references", "Description") resultTitle = qApp.translate("references", "Result") charactersTitle = qApp.translate("references", "Characters") stepsTitle = qApp.translate("references", "Resolution steps") # Goto (link) goto = qApp.translate("references", "Go to {}.") goto = goto.format(refToLink(ref)) # Description description = m.data(index.sibling(index.row(), Plot.description)) # Result result = m.data(index.sibling(index.row(), Plot.result)) # Characters pM = mainWindow().mdlCharacter item = m.item(index.row(), Plot.characters) characters = "" if item: for r in range(item.rowCount()): ID = item.child(r, 0).text() characters += "
  • {text}".format( link=characterReference(ID), text=pM.getCharacterByID(ID).name()) # Resolution steps steps = "" item = m.item(index.row(), Plot.steps) if item: for r in range(item.rowCount()): title = item.child(r, PlotStep.name).text() summary = item.child(r, PlotStep.summary).text() meta = item.child(r, PlotStep.meta).text() if meta: meta = " ({})".format(meta) steps += "
  • {title}{summary}{meta}
  • ".format( title=title, summary=": {}".format(summary) if summary else "", meta=meta if meta else "") text = """

    {name}

    {goto} {characters} {description} {result} {steps} {references} """.format( name=name, goto=goto, description="

    {title}

    {text}".format( title=descriptionTitle, text=description) if description else "", result="

    {title}

    {text}".format( title=resultTitle, text=result) if result else "", characters="

    {title}

      {lst}
    ".format( title=charactersTitle, lst=characters) if characters else "", steps="

    {title}

      {steps}
    ".format( title=stepsTitle, steps=steps) if steps else "", references=listReferences(ref) ) return text # A World item elif _type == WorldLetter: m = mainWindow().mdlWorld index = m.indexByID(_ref) name = m.name(index) if not index.isValid(): return qApp.translate("references", "Unknown reference: {}.").format(ref) # Titles descriptionTitle = qApp.translate("references", "Description") passionTitle = qApp.translate("references", "Passion") conflictTitle = qApp.translate("references", "Conflict") # Goto (link) goto = qApp.translate("references", "Go to {}.") goto = goto.format(refToLink(ref)) # Description description = basicFormat(m.description(index)) # Passion passion = basicFormat(m.passion(index)) # Conflict conflict = basicFormat(m.conflict(index)) text = """

    {name}

    {goto} {description} {passion} {conflict} {references} """.format( name=name, goto=goto, description="

    {title}

    {text}".format( title=descriptionTitle, text=description) if description else "", passion="

    {title}

    {text}".format( title=passionTitle, text=passion) if passion else "", conflict="

    {title}

      {lst}
    ".format( title=conflictTitle, lst=conflict) if conflict else "", references=listReferences(ref) ) return text else: return qApp.translate("references", "Unknown reference: {}.").format(ref) def shortInfos(ref): """Returns infos about reference ``ref``. Returns -1 if ``ref`` is not a valid reference, and None if it is valid but unknown.""" match = re.fullmatch(RegEx, ref) if not match: return -1 _type = match.group(1) _ref = match.group(2) infos = {} infos["ID"] = _ref if _type == TextLetter: infos["type"] = TextLetter m = mainWindow().mdlOutline idx = m.getIndexByID(_ref) if not idx.isValid(): return None item = idx.internalPointer() if item.isFolder(): infos["text_type"] = "folder" else: infos["text_type"] = "text" infos["title"] = item.title() infos["path"] = item.path() return infos elif _type == CharacterLetter: infos["type"] = CharacterLetter m = mainWindow().mdlCharacter c = m.getCharacterByID(_ref) if c: infos["title"] = c.name() infos["name"] = c.name() return infos elif _type == PlotLetter: infos["type"] = PlotLetter m = mainWindow().mdlPlots name = m.getPlotNameByID(_ref) if name: infos["title"] = name return infos elif _type == WorldLetter: infos["type"] = WorldLetter m = mainWindow().mdlWorld item = m.itemByID(_ref) if item: name = item.text() path = m.path(item) infos["title"] = name infos["path"] = path return infos return None def title(ref): """Returns a the title (or name) for the reference ``ref``.""" infos = shortInfos(ref) if infos and infos != -1 and "title" in infos: return infos["title"] else: return None def type(ref): infos = shortInfos(ref) if infos and infos != -1: return infos["type"] def ID(ref): infos = shortInfos(ref) if infos and infos != -1: return infos["ID"] def tooltip(ref): """Returns a tooltip in HTML for the reference ``ref``.""" infos = shortInfos(ref) if not infos: return qApp.translate("references", "Unknown reference: {}.").format(ref) if infos == -1: return qApp.translate("references", "Not a reference: {}.").format(ref) if infos["type"] == TextLetter: if infos["text_type"] == "folder": tt = qApp.translate("references", "Folder: {}").format(infos["title"]) else: tt = qApp.translate("references", "Text: {}").format(infos["title"]) tt += "
    {}".format(infos["path"]) return tt elif infos["type"] == CharacterLetter: return qApp.translate("references", "Character: {}").format(infos["title"]) elif infos["type"] == PlotLetter: return qApp.translate("references", "Plot: {}").format(infos["title"]) elif infos["type"] == WorldLetter: return qApp.translate("references", "World: {name}{path}").format( name=infos["title"], path=" ({})".format(infos["path"]) if infos["path"] else "") ############################################################################### # FUNCTIONS ############################################################################### def refToLink(ref): """Transforms the reference ``ref`` in a link displaying useful infos about that reference. For character, character's name. For text item, item's name, etc. """ match = re.fullmatch(RegEx, ref) if match: _type = match.group(1) _ref = match.group(2) text = "" if _type == TextLetter: m = mainWindow().mdlOutline idx = m.getIndexByID(_ref) if idx.isValid(): item = idx.internalPointer() text = item.title() elif _type == CharacterLetter: m = mainWindow().mdlCharacter c = m.getCharacterByID(int(_ref)) if c: text = c.name() elif _type == PlotLetter: m = mainWindow().mdlPlots text = m.getPlotNameByID(_ref) elif _type == WorldLetter: m = mainWindow().mdlWorld item = m.itemByID(_ref) if item: text = item.text() if text: return "{text}".format( ref=ref, text=text) else: return ref def linkifyAllRefs(text): """Takes all the references in ``text`` and transform them into HMTL links.""" return re.sub(RegEx, lambda m: refToLink(m.group(0)), text) def findReferencesTo(ref, parent=None, recursive=True): """List of text items containing references ref, and returns IDs. Starts from item parent. If None, starts from root.""" oM = mainWindow().mdlOutline if parent == None: parent = oM.rootItem # Removes everything after the second ':': '{L:ID:random text}' → '{L:ID:' ref = ref[:ref.index(":", ref.index(":") + 1)+1] # Bare form '{L:ID}' ref2 = ref[:-1] + "}" # Since it's a simple search (no regex), we search for both. lst = parent.findItemsContaining(ref, [Outline.notes], recursive=recursive) lst += parent.findItemsContaining(ref2, [Outline.notes], recursive=recursive) return lst def listReferences(ref, title=qApp.translate("references", "Referenced in:")): oM = mainWindow().mdlOutline listRefs = "" lst = findReferencesTo(ref) for t in lst: idx = oM.getIndexByID(t) listRefs += "
  • {text}
  • ".format( link=textReference(t), text=oM.data(idx, Outline.title)) return "

    {title}

      {ref}
    ".format( title=title, ref=listRefs) if listRefs else "" def basicFormat(text): if not text: return "" text = text.replace("\n", "
    ") text = linkifyAllRefs(text) return text def open(ref): """Identify ``ref`` and open it.""" match = re.fullmatch(RegEx, ref) if not match: return _type = match.group(1) _ref = match.group(2) if _type == CharacterLetter: mw = mainWindow() item = mw.lstCharacters.getItemByID(_ref) if item: mw.tabMain.setCurrentIndex(mw.TabPersos) mw.lstCharacters.setCurrentItem(item) return True print("Error: Ref {} not found".format(ref)) return False elif _type == TextLetter: mw = mainWindow() index = mw.mdlOutline.getIndexByID(_ref) if index.isValid(): mw.tabMain.setCurrentIndex(mw.TabRedac) mw.mainEditor.setCurrentModelIndex(index, newTab=True) return True else: print("Ref not found") return False elif _type == PlotLetter: mw = mainWindow() item = mw.lstPlots.getItemByID(_ref) if item: mw.tabMain.setCurrentIndex(mw.TabPlots) mw.lstPlots.setCurrentItem(item) return True print("Ref not found") return False elif _type == WorldLetter: mw = mainWindow() item = mw.mdlWorld.itemByID(_ref) if item: mw.tabMain.setCurrentIndex(mw.TabWorld) mw.treeWorld.setCurrentIndex( mw.mdlWorld.indexFromItem(item)) return True print("Ref not found") return False print("Ref not implemented") return False manuskript-0.10.0/manuskript/models/worldModel.py000066400000000000000000000273271354442177200221530ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import QModelIndex from PyQt5.QtCore import QSize from PyQt5.QtCore import Qt, QMimeData, QByteArray from PyQt5.QtGui import QStandardItem, QBrush, QFontMetrics from PyQt5.QtGui import QStandardItemModel, QColor from PyQt5.QtWidgets import QMenu, QAction, qApp from manuskript.enums import World from manuskript.functions import mainWindow from manuskript.ui import style as S class worldModel(QStandardItemModel): def __init__(self, parent): QStandardItemModel.__init__(self, 0, len(World), parent) self.mw = mainWindow() ############################################################################### # SELECTION ############################################################################### def selectedItem(self): """Returns the item selected in mw.treeWorld. invisibleRootItem if None.""" index = self.selectedIndex() item = self.itemFromIndex(index) if item: return item else: return self.invisibleRootItem() def selectedIndex(self): """Returns the selected index in the treeView.""" if self.mw.treeWorld.selectedIndexes(): return self.mw.treeWorld.currentIndex() else: return QModelIndex() def selectedIndexes(self): return self.mw.treeWorld.selectedIndexes() ############################################################################### # GETTERS ############################################################################### def ID(self, index): """Returns the ID of the given index.""" index = index.sibling(index.row(), World.ID) return self.data(index) def name(self, index): """Returns the name of the given index.""" index = index.sibling(index.row(), World.name) return self.data(index) def description(self, index): index = index.sibling(index.row(), World.description) return self.data(index) def conflict(self, index): index = index.sibling(index.row(), World.conflict) return self.data(index) def passion(self, index): index = index.sibling(index.row(), World.passion) return self.data(index) def itemID(self, item): """Returns the ID of the given item.""" index = self.indexFromItem(item) return self.ID(index) def children(self, item): """Returns a list of all item's children.""" c = [] for i in range(item.rowCount()): c.append(item.child(i)) return c def listAll(self): """Returns a list of tuple ``(name, ID, path)`` for all items.""" lst = [] def readAll(item): name = item.text() ID = self.itemID(item) path = self.path(item) if name and ID: lst.append((name, ID, path)) for c in self.children(item): readAll(c) readAll(self.invisibleRootItem()) return lst def indexByID(self, ID): """Returns the index of item whose ID is ID.""" return self.indexFromItem(self.itemByID(ID)) def itemByID(self, ID): """Returns the item whose ID is ID.""" def browse(item): if self.itemID(item) == ID: return item for c in self.children(item): r = browse(c) if r: return r r = browse(self.invisibleRootItem()) return r if r else None def path(self, item): """Returns the path to the item in the form of 'ancestor > ... > grand-parent > parent'.""" path = [] while item.parent(): item = item.parent() path.append(item.text()) path = " > ".join(path) return path ############################################################################### # ADDING AND REMOVE ############################################################################### def addItem(self, title=None, parent=None): """Adds an item, and returns it.""" if not parent: parent = self.selectedItem() if not title: title = self.tr("New item") name = QStandardItem(title) _id = QStandardItem(self.getUniqueID()) row = [name, _id] + [QStandardItem() for i in range(2, len(World))] parent.appendRow(row) return name def getUniqueID(self): """Returns an unused ID""" parentItem = self.invisibleRootItem() vals = [] def collectIDs(item): vals.append(int(self.itemID(item))) for c in self.children(item): collectIDs(c) for c in self.children(parentItem): collectIDs(c) k = 0 while k in vals: k += 1 return str(k) def removeItem(self): while self.selectedIndexes(): index = self.selectedIndexes()[0] self.removeRows(index.row(), 1, index.parent()) ############################################################################### # DRAG & DROP ############################################################################### """Mime type for worldModel""" MIME_TYPE = "application/x.manuskript.worldmodel" def mimeTypes(self): """Returns available MIME types Returns only worldModel MIME type to allow only internal drag & drop""" return [self.MIME_TYPE] def mimeData(self, indexes): """Returns dragged data as MIME data""" mime_data = QMimeData() """set MIME type""" mime_data.setData(self.MIME_TYPE, QByteArray()) """row index is just a pair of item parent and row number""" row_indexes = [] for index in indexes: item = self.itemFromIndex(index) parent = item.parent() if parent is None: parent = self.invisibleRootItem() row_indexes.append((parent, item.row())) def copyRowWithChildren(row_index): """copy row and its children except for those that are in row_indexes to avoid duplicates""" parent, row_i = row_index row = [] for column_i in range(parent.columnCount()): original = parent.child(row_i, column_i) copy = original.clone() for child_row_i in range(original.rowCount()): child_row_index = (original, child_row_i) if child_row_index not in row_indexes: child_row = copyRowWithChildren(child_row_index) copy.appendRow(child_row) row.append(copy) return row rows = [] for i in row_indexes: """copy not move, because these rows will be deleted automatically after dropMimeData""" rows.append(copyRowWithChildren(i)) """mime_data.rows available only in the application""" mime_data.rows = rows return mime_data def dropMimeData(self, mime_data, action, row_i, column_i, parent): """insert MIME data""" parent_item = self.itemFromIndex(parent) if not parent_item: parent_item = self.invisibleRootItem() """if place for drop is not specified row_i equals -1""" if row_i == -1: for row in mime_data.rows: parent_item.appendRow(row) else: """reverse list of rows, because QStandardItem::insertRow inserts before the index""" for row in reversed(mime_data.rows): parent_item.insertRow(row_i, row) return True ############################################################################### # TEMPLATES ############################################################################### def dataSets(self): """Returns sets of empty data that can guide the writer for world building.""" dataset = { self.tr("Fantasy world building"): [ (self.tr("Physical"), [ self.tr("Climate"), self.tr("Topography"), self.tr("Astronomy"), self.tr("Natural resources"), self.tr("Wild life"), self.tr("Flora"), self.tr("History"), self.tr("Races"), self.tr("Diseases"), ]), (self.tr("Cultural"), [ self.tr("Customs"), self.tr("Food"), self.tr("Languages"), self.tr("Education"), self.tr("Dresses"), self.tr("Science"), self.tr("Calendar"), self.tr("Bodily language"), self.tr("Ethics"), self.tr("Religion"), self.tr("Government"), self.tr("Politics"), self.tr("Gender roles"), self.tr("Music and arts"), self.tr("Architecture"), self.tr("Military"), self.tr("Technology"), self.tr("Courtship"), self.tr("Demography"), self.tr("Transportation"), self.tr("Medicine"), ]), (self.tr("Magic system"), [ self.tr("Rules"), self.tr("Organization"), self.tr("Magical objects"), self.tr("Magical places"), self.tr("Magical races"), ]), self.tr("Important places"), self.tr("Important objects"), ] } return dataset def emptyDataMenu(self): """Returns a menu with the empty data sets.""" self.menu = QMenu("menu") for name in self.dataSets(): a = QAction(name, self.menu) a.triggered.connect(self.setEmptyData) self.menu.addAction(a) return self.menu def setEmptyData(self): """Called from the menu generated with ``emptyDataMenu``.""" act = self.sender() data = self.dataSets()[act.text()] def addItems(data, parent): for d in data: if len(d) == 1 or type(d) == str: self.addItem(d, parent) else: i = self.addItem(d[0], parent) addItems(d[1], i) addItems(data, None) self.mw.treeWorld.expandAll() ############################################################################### # APPEARANCE ############################################################################### def data(self, index, role=Qt.EditRole): level = 0 i = index while i.parent() != QModelIndex(): i = i.parent() level += 1 if role == Qt.BackgroundRole: if level == 0: return QBrush(QColor(S.highlightLight)) if role == Qt.TextAlignmentRole: if level == 0: return Qt.AlignCenter if role == Qt.FontRole: if level in [0, 1]: f = qApp.font() f.setBold(True) return f if role == Qt.ForegroundRole: if level == 0: return QBrush(QColor(S.highlightedTextDark)) if role == Qt.SizeHintRole: fm = QFontMetrics(qApp.font()) h = fm.height() if level == 0: return QSize(0, h + 12) elif level == 1: return QSize(0, h + 6) return QStandardItemModel.data(self, index, role) manuskript-0.10.0/manuskript/settings.py000066400000000000000000000240141354442177200204060ustar00rootroot00000000000000# -*- coding: utf-8 -*- import collections import json import pickle from PyQt5.QtWidgets import qApp from manuskript.enums import Outline # TODO: move some/all of those settings to application settings and not project settings # in order to allow a shared project between several writers viewSettings = { "Tree": { "Icon": "Nothing", "Text": "Compile", "Background": "Nothing", "InfoFolder": "Nothing", "InfoText": "Nothing", "iconSize": 24, }, "Cork": { "Icon": "Nothing", "Text": "Nothing", "Background": "Nothing", "Corner": "Label", "Border": "Nothing", }, "Outline": { "Icon": "Nothing", "Text": "Compile", "Background": "Nothing", }, } fullscreenSettings = { "autohide-top": True, "autohide-bottom": True, "autohide-left": True, } # Application spellcheck = False dict = None corkSizeFactor = 100 folderView = "cork" lastTab = 0 openIndexes = [""] autoSave = False autoSaveDelay = 5 autoSaveNoChanges = True autoSaveNoChangesDelay = 5 saveOnQuit = True outlineViewColumns = [Outline.title, Outline.POV, Outline.status, Outline.compile, Outline.wordCount, Outline.goal, Outline.goalPercentage, Outline.label] corkBackground = { "color": "#926239", "image": "writingdesk" } corkStyle = "new" defaultTextType = "md" fullScreenTheme = "spacedreams" textEditor = { "background": "", "fontColor": "", "font": qApp.font().toString(), "misspelled": "#F00", "lineSpacing": 100, "tabWidth": 20, "indent": False, "spacingAbove": 5, "spacingBelow": 5, "textAlignment": 0, # 0: left, 1: center, 2: right, 3: justify "cursorWidth": 1, "cursorNotBlinking": False, "maxWidth": 600, "marginsLR": 0, "marginsTB": 20, "backgroundTransparent": False, "alwaysCenter": False, "focusMode": False # "line", "paragraph", "sentence" } revisions = { "keep": False, "smartremove": True, "rules": collections.OrderedDict({ 10 * 60: 60, # One per minute for the last 10mn 60 * 60: 60 * 10, # One per 10mn for the last hour 60 * 60 * 24: 60 * 60, # One per hour for the last day 60 * 60 * 24 * 30: 60 * 60 * 24, # One per day for the last month None: 60 * 60 * 24 * 7, # One per week for eternity }) } frequencyAnalyzer = { "wordMin": 1, "wordExclude": "a, and, or", "phraseMin": 2, "phraseMax": 5 } viewMode = "fiction" # simple, fiction saveToZip = True dontShowDeleteWarning = False def initDefaultValues(): """ Load some default values based on system's settings. Is called anytime we open/create a project. """ global textEditor if not textEditor["background"]: from manuskript.ui import style as S textEditor["background"] = S.base if not textEditor["fontColor"]: from manuskript.ui import style as S textEditor["fontColor"] = S.text def save(filename=None, protocol=None): global spellcheck, dict, corkSliderFactor, viewSettings, corkSizeFactor, folderView, lastTab, openIndexes, \ autoSave, autoSaveDelay, saveOnQuit, autoSaveNoChanges, autoSaveNoChangesDelay, outlineViewColumns, \ corkBackground, corkStyle, fullScreenTheme, defaultTextType, textEditor, revisions, frequencyAnalyzer, viewMode, \ saveToZip, dontShowDeleteWarning, fullscreenSettings allSettings = { "viewSettings": viewSettings, "fullscreenSettings": fullscreenSettings, "dict": dict, "spellcheck": spellcheck, "corkSizeFactor": corkSizeFactor, "folderView": folderView, "lastTab": lastTab, "openIndexes": openIndexes, "autoSave":autoSave, "autoSaveDelay":autoSaveDelay, # TODO: Settings Cleanup Task -- Rename saveOnQuit to saveOnProjectClose -- see PR #615 "saveOnQuit":saveOnQuit, "autoSaveNoChanges":autoSaveNoChanges, "autoSaveNoChangesDelay":autoSaveNoChangesDelay, "outlineViewColumns":outlineViewColumns, "corkBackground":corkBackground, "corkStyle": corkStyle, "fullScreenTheme":fullScreenTheme, "defaultTextType":defaultTextType, "textEditor":textEditor, "revisions":revisions, "frequencyAnalyzer": frequencyAnalyzer, "viewMode": viewMode, "saveToZip": saveToZip, "dontShowDeleteWarning": dontShowDeleteWarning, } #pp=pprint.PrettyPrinter(indent=4, compact=False) #print("Saving:") #pp.pprint(allSettings) if filename: f = open(filename, "wb") pickle.dump(allSettings, f) else: if protocol == 0: # This looks stupid # But a simple json.dumps with sort_keys will throw a TypeError # because of unorderable types. return json.dumps(json.loads(json.dumps(allSettings)), indent=4, sort_keys=True) else: return pickle.dumps(allSettings) def load(string, fromString=False, protocol=None): """Load settings from 'string'. 'string' is the filename of the pickle dump. If fromString=True, string is the data of the pickle dumps.""" global allSettings if not fromString: try: f = open(string, "rb") allSettings = pickle.load(f) except: print("{} doesn't exist, cannot load settings.".format(string)) return else: if protocol == 0: allSettings = json.loads(string) else: allSettings = pickle.loads(string) #pp=pprint.PrettyPrinter(indent=4, compact=False) #print("Loading:") #pp.pprint(allSettings) # FIXME: use dict.update(dict) to update settings in newer versions. if "viewSettings" in allSettings: global viewSettings viewSettings = allSettings["viewSettings"] for cat, name, default in [ ("Tree", "iconSize", 24), # Added in 0.6.0 ]: if not name in viewSettings[cat]: viewSettings[cat][name] = default if "fullscreenSettings" in allSettings: global fullscreenSettings fullscreenSettings = allSettings["fullscreenSettings"] if "dict" in allSettings: global dict dict = allSettings["dict"] if "spellcheck" in allSettings: global spellcheck spellcheck = allSettings["spellcheck"] if "corkSizeFactor" in allSettings: global corkSizeFactor corkSizeFactor = allSettings["corkSizeFactor"] if "folderView" in allSettings: global folderView folderView = allSettings["folderView"] if "lastTab" in allSettings: global lastTab lastTab = allSettings["lastTab"] if "openIndexes" in allSettings: global openIndexes openIndexes = allSettings["openIndexes"] if "autoSave" in allSettings: global autoSave autoSave = allSettings["autoSave"] if "autoSaveDelay" in allSettings: global autoSaveDelay autoSaveDelay = allSettings["autoSaveDelay"] if "saveOnQuit" in allSettings: global saveOnQuit saveOnQuit = allSettings["saveOnQuit"] if "autoSaveNoChanges" in allSettings: global autoSaveNoChanges autoSaveNoChanges = allSettings["autoSaveNoChanges"] if "autoSaveNoChangesDelay" in allSettings: global autoSaveNoChangesDelay autoSaveNoChangesDelay = allSettings["autoSaveNoChangesDelay"] if "outlineViewColumns" in allSettings: global outlineViewColumns outlineViewColumns = allSettings["outlineViewColumns"] if "corkBackground" in allSettings: global corkBackground corkBackground = allSettings["corkBackground"] if "corkStyle" in allSettings: global corkStyle corkStyle = allSettings["corkStyle"] if "fullScreenTheme" in allSettings: global fullScreenTheme fullScreenTheme = allSettings["fullScreenTheme"] if "defaultTextType" in allSettings: global defaultTextType defaultTextType = allSettings["defaultTextType"] if "textEditor" in allSettings: global textEditor textEditor = allSettings["textEditor"] added = { "textAlignment": 0, # Added in 0.5.0 "cursorWidth": 1, "cursorNotBlinking": False, # Added in 0.6.0 "maxWidth": 600, "marginsLR": 0, "marginsTB": 20, "backgroundTransparent": False, # Added in 0.6.0 "alwaysCenter": False, # Added in 0.7.0 "focusMode": False, } for k in added: if not k in textEditor: textEditor[k] = added[k] if textEditor["cursorNotBlinking"]: qApp.setCursorFlashTime(0) else: from manuskript.functions import mainWindow qApp.setCursorFlashTime(mainWindow()._defaultCursorFlashTime) if "revisions" in allSettings: global revisions revisions = allSettings["revisions"] # With JSON we had to convert int keys to str, and None to "null", so we roll back. r = {} for i in revisions["rules"]: if i == "null": r[None] = revisions["rules"]["null"] elif i == None: r[None] = revisions["rules"][None] else: r[int(i)] = revisions["rules"][i] revisions["rules"] = r if "frequencyAnalyzer" in allSettings: global frequencyAnalyzer frequencyAnalyzer = allSettings["frequencyAnalyzer"] if "viewMode" in allSettings: global viewMode viewMode = allSettings["viewMode"] if "saveToZip" in allSettings: global saveToZip saveToZip = allSettings["saveToZip"] if "dontShowDeleteWarning" in allSettings: global dontShowDeleteWarning dontShowDeleteWarning = allSettings["dontShowDeleteWarning"] manuskript-0.10.0/manuskript/settingsWindow.py000066400000000000000000001307141354442177200216030ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import os import shutil from collections import OrderedDict from PyQt5.QtCore import QSize, QSettings, QRegExp, QTranslator, QObject from PyQt5.QtCore import Qt, QTimer from PyQt5.QtGui import QIntValidator, QIcon, QFont, QColor, QPixmap, QStandardItem, QPainter from PyQt5.QtGui import QStyleHints from PyQt5.QtWidgets import QStyleFactory, QWidget, QStyle, QColorDialog, QListWidgetItem, QMessageBox from PyQt5.QtWidgets import qApp, QFileDialog # Spell checker support from manuskript import settings from manuskript.enums import Outline from manuskript.functions import allPaths, iconColor, writablePath, appPath, findWidgetsOfClass from manuskript.functions import mainWindow, findBackground, themeIcon from manuskript.ui.editors.tabSplitter import tabSplitter from manuskript.ui.editors.themes import createThemePreview from manuskript.ui.editors.themes import getThemeName from manuskript.ui.editors.themes import loadThemeDatas from manuskript.ui.settings_ui import Ui_Settings from manuskript.ui.views.outlineView import outlineView from manuskript.ui.views.textEditView import textEditView from manuskript.ui.welcome import welcome from manuskript.ui import style as S class settingsWindow(QWidget, Ui_Settings): def __init__(self, mainWindow): QWidget.__init__(self) self.setupUi(self) self.mw = mainWindow # UI for l in [self.lblTitleGeneral, self.lblTitleGeneral_2, self.lblTitleViews, self.lblTitleLabels, self.lblTitleStatus, self.lblTitleFullscreen, ]: l.setStyleSheet(S.titleLabelSS()) icons = [QIcon.fromTheme("configure"), QIcon.fromTheme("history-view"), QIcon.fromTheme("gnome-settings"), themeIcon("label"), themeIcon("status"), QIcon.fromTheme("preferences-desktop-theme") ] for i in range(self.lstMenu.count()): item = self.lstMenu.item(i) item.setSizeHint(QSize(item.sizeHint().width(), 42)) item.setTextAlignment(Qt.AlignCenter) if icons[i]: item.setIcon(icons[i]) self.lstMenu.setMaximumWidth(140) self.lstMenu.setMinimumWidth(140) # General self.cmbStyle.addItems(list(QStyleFactory.keys())) self.cmbStyle.setCurrentIndex( [i.lower() for i in list(QStyleFactory.keys())] .index(qApp.style().objectName())) self.cmbStyle.currentIndexChanged[str].connect(self.setStyle) self.cmbTranslation.clear() tr = OrderedDict() tr["English"] = "" tr["Arabic (Saudi Arabia)"] = "manuskript_ar_SA.qm" tr["Deutsch"] = "manuskript_de.qm" tr["English (Great Britain)"] = "manuskript_en_GB.qm" tr["Español"] = "manuskript_es.qm" tr["Persian"] = "manuskript_fa.qm" tr["Français"] = "manuskript_fr.qm" tr["Hungarian"] = "manuskript_hu.qm" tr["Indonesian"] = "manuskript_id.qm" tr["Italian"] = "manuskript_it.qm" tr["Japanese"] = "manuskript_ja.qm" tr["Norwegian Bokmål"] = "manuskript_nb_NO.qm" tr["Dutch"] = "manuskript_nl.qm" tr["Polish"] = "manuskript_pl.qm" tr["Portuguese (Brazil)"] = "manuskript_pt_BR.qm" tr["Portuguese (Portugal)"] = "manuskript_pt_PT.qm" tr["Russian"] = "manuskript_ru.qm" tr["Svenska"] = "manuskript_sv.qm" tr["Turkish"] = "manuskript_tr.qm" tr["Ukrainian"] = "manuskript_uk.qm" tr["Chinese (Simplified)"] = "manuskript_zh_CN.qm" tr["Chinese (Traditional)"] = "manuskript_zh_HANT.qm" self.translations = tr for name in tr: self.cmbTranslation.addItem(name, tr[name]) sttgs = QSettings(qApp.organizationName(), qApp.applicationName()) if (sttgs.contains("applicationTranslation") and sttgs.value("applicationTranslation") in tr.values()): # Sets the correct translation self.cmbTranslation.setCurrentText( [i for i in tr if tr[i] == sttgs.value("applicationTranslation")][0]) self.cmbTranslation.currentIndexChanged.connect(self.setTranslation) f = qApp.font() self.spnGeneralFontSize.setValue(f.pointSize()) self.spnGeneralFontSize.valueChanged.connect(self.setAppFontSize) self.txtAutoSave.setValidator(QIntValidator(0, 999, self)) self.txtAutoSaveNoChanges.setValidator(QIntValidator(0, 999, self)) self.chkAutoSave.setChecked(settings.autoSave) self.chkAutoSaveNoChanges.setChecked(settings.autoSaveNoChanges) self.txtAutoSave.setText(str(settings.autoSaveDelay)) self.txtAutoSaveNoChanges.setText(str(settings.autoSaveNoChangesDelay)) self.chkSaveOnQuit.setChecked(settings.saveOnQuit) self.chkSaveToZip.setChecked(settings.saveToZip) self.chkAutoSave.stateChanged.connect(self.saveSettingsChanged) self.chkAutoSaveNoChanges.stateChanged.connect(self.saveSettingsChanged) self.chkSaveOnQuit.stateChanged.connect(self.saveSettingsChanged) self.chkSaveToZip.stateChanged.connect(self.saveSettingsChanged) self.txtAutoSave.textEdited.connect(self.saveSettingsChanged) self.txtAutoSaveNoChanges.textEdited.connect(self.saveSettingsChanged) autoLoad, last = self.mw.welcome.getAutoLoadValues() self.chkAutoLoad.setChecked(autoLoad) self.chkAutoLoad.stateChanged.connect(self.saveSettingsChanged) # Revisions opt = settings.revisions self.chkRevisionsKeep.setChecked(opt["keep"]) self.chkRevisionsKeep.stateChanged.connect(self.revisionsSettingsChanged) self.chkRevisionRemove.setChecked(opt["smartremove"]) self.chkRevisionRemove.toggled.connect(self.revisionsSettingsChanged) self.spnRevisions10Mn.setValue(60 / opt["rules"][10 * 60]) self.spnRevisions10Mn.valueChanged.connect(self.revisionsSettingsChanged) self.spnRevisionsHour.setValue(60 * 10 / opt["rules"][60 * 60]) self.spnRevisionsHour.valueChanged.connect(self.revisionsSettingsChanged) self.spnRevisionsDay.setValue(60 * 60 / opt["rules"][60 * 60 * 24]) self.spnRevisionsDay.valueChanged.connect(self.revisionsSettingsChanged) self.spnRevisionsMonth.setValue(60 * 60 * 24 / opt["rules"][60 * 60 * 24 * 30]) self.spnRevisionsMonth.valueChanged.connect(self.revisionsSettingsChanged) self.spnRevisionsEternity.setValue(60 * 60 * 24 * 7 / opt["rules"][None]) self.spnRevisionsEternity.valueChanged.connect(self.revisionsSettingsChanged) # Views self.tabViews.setCurrentIndex(0) lst = ["Nothing", "POV", "Label", "Progress", "Compile"] for cmb in self.viewSettingsDatas(): item, part = self.viewSettingsDatas()[cmb] cmb.setCurrentIndex(lst.index(settings.viewSettings[item][part])) cmb.currentIndexChanged.connect(self.viewSettingsChanged) for chk in self.outlineColumnsData(): col = self.outlineColumnsData()[chk] chk.setChecked(col in settings.outlineViewColumns) chk.stateChanged.connect(self.outlineColumnsChanged) self.chkOutlinePOV.setVisible(settings.viewMode != "simple") # Hides checkbox if non-fiction view mode for item, what, value in [ (self.rdoTreeItemCount, "InfoFolder", "Count"), (self.rdoTreeWC, "InfoFolder", "WC"), (self.rdoTreeProgress, "InfoFolder", "Progress"), (self.rdoTreeSummary, "InfoFolder", "Summary"), (self.rdoTreeNothing, "InfoFolder", "Nothing"), (self.rdoTreeTextWC, "InfoText", "WC"), (self.rdoTreeTextProgress, "InfoText", "Progress"), (self.rdoTreeTextSummary, "InfoText", "Summary"), (self.rdoTreeTextNothing, "InfoText", "Nothing"), ]: item.setChecked(settings.viewSettings["Tree"][what] == value) item.toggled.connect(self.treeViewSettignsChanged) self.sldTreeIconSize.valueChanged.connect(self.treeViewSettignsChanged) self.sldTreeIconSize.valueChanged.connect( lambda v: self.lblTreeIconSize.setText("{}x{}".format(v, v))) self.sldTreeIconSize.setValue(settings.viewSettings["Tree"]["iconSize"]) self.rdoCorkOldStyle.setChecked(settings.corkStyle == "old") self.rdoCorkNewStyle.setChecked(settings.corkStyle == "new") self.rdoCorkNewStyle.toggled.connect(self.setCorkStyle) self.rdoCorkOldStyle.toggled.connect(self.setCorkStyle) self.populatesCmbBackgrounds(self.cmbCorkImage) self.setCorkImageDefault() self.updateCorkColor() self.cmbCorkImage.currentIndexChanged.connect(self.setCorkBackground) self.btnCorkColor.clicked.connect(self.setCorkColor) # Text editor opt = settings.textEditor # Font self.setButtonColor(self.btnEditorFontColor, opt["fontColor"]) self.btnEditorFontColor.clicked.connect(self.choseEditorFontColor) self.setButtonColor(self.btnEditorMisspelledColor, opt["misspelled"]) self.btnEditorMisspelledColor.clicked.connect(self.choseEditorMisspelledColor) self.setButtonColor(self.btnEditorBackgroundColor, opt["background"]) self.btnEditorBackgroundColor.clicked.connect(self.choseEditorBackgroundColor) self.chkEditorBackgroundTransparent.setChecked(opt["backgroundTransparent"]) self.chkEditorBackgroundTransparent.stateChanged.connect(self.updateEditorSettings) self.btnEditorColorDefault.clicked.connect(self.restoreEditorColors) f = QFont() f.fromString(opt["font"]) self.cmbEditorFontFamily.setCurrentFont(f) self.cmbEditorFontFamily.currentFontChanged.connect(self.updateEditorSettings) self.spnEditorFontSize.setValue(f.pointSize()) self.spnEditorFontSize.valueChanged.connect(self.updateEditorSettings) # Cursor self.chkEditorCursorWidth.setChecked(opt["cursorWidth"] != 1) self.chkEditorCursorWidth.stateChanged.connect(self.updateEditorSettings) self.spnEditorCursorWidth.setValue(opt["cursorWidth"] if opt["cursorWidth"] != 1 else 9) self.spnEditorCursorWidth.valueChanged.connect(self.updateEditorSettings) self.spnEditorCursorWidth.setEnabled(opt["cursorWidth"] != 1) self.chkEditorNoBlinking.setChecked(opt["cursorNotBlinking"]) self.chkEditorNoBlinking.stateChanged.connect(self.setApplicationCursorBlinking) self.chkEditorTypeWriterMode.setChecked(opt["alwaysCenter"]) self.chkEditorTypeWriterMode.stateChanged.connect(self.updateEditorSettings) self.cmbEditorFocusMode.setCurrentIndex( 0 if not opt["focusMode"] else 1 if opt["focusMode"] == "sentence" else 2 if opt["focusMode"] == "line" else 3) self.cmbEditorFocusMode.currentIndexChanged.connect(self.updateEditorSettings) # Text areas self.chkEditorMaxWidth.setChecked(opt["maxWidth"] != 0) self.chkEditorMaxWidth.stateChanged.connect(self.updateEditorSettings) self.spnEditorMaxWidth.setEnabled(opt["maxWidth"] != 0) self.spnEditorMaxWidth.setValue(500 if opt["maxWidth"] == 0 else opt["maxWidth"]) self.spnEditorMaxWidth.valueChanged.connect(self.updateEditorSettings) self.spnEditorMarginsLR.setValue(opt["marginsLR"]) self.spnEditorMarginsLR.valueChanged.connect(self.updateEditorSettings) self.spnEditorMarginsTB.setValue(opt["marginsTB"]) self.spnEditorMarginsTB.valueChanged.connect(self.updateEditorSettings) # Paragraphs self.cmbEditorAlignment.setCurrentIndex(opt["textAlignment"]) self.cmbEditorAlignment.currentIndexChanged.connect(self.updateEditorSettings) self.cmbEditorLineSpacing.setCurrentIndex( 0 if opt["lineSpacing"] == 100 else 1 if opt["lineSpacing"] == 150 else 2 if opt["lineSpacing"] == 200 else 3) self.cmbEditorLineSpacing.currentIndexChanged.connect(self.updateEditorSettings) self.spnEditorLineSpacing.setValue(opt["lineSpacing"]) self.spnEditorLineSpacing.valueChanged.connect(self.updateEditorSettings) self.spnEditorLineSpacing.setEnabled(opt["lineSpacing"] not in [100, 150, 200]) self.spnEditorLineSpacing.valueChanged.connect(self.updateEditorSettings) self.spnEditorTabWidth.setValue(opt["tabWidth"]) self.spnEditorTabWidth.valueChanged.connect(self.updateEditorSettings) self.chkEditorIndent.setChecked(opt["indent"]) self.chkEditorIndent.stateChanged.connect(self.updateEditorSettings) self.spnEditorParaAbove.setValue(opt["spacingAbove"]) self.spnEditorParaAbove.valueChanged.connect(self.updateEditorSettings) self.spnEditorParaBelow.setValue(opt["spacingBelow"]) self.spnEditorParaBelow.valueChanged.connect(self.updateEditorSettings) self.timerUpdateWidgets = QTimer() self.timerUpdateWidgets.setSingleShot(True) self.timerUpdateWidgets.setInterval(250) self.timerUpdateWidgets.timeout.connect(self.updateAllWidgets) # Labels self.lstLabels.setModel(self.mw.mdlLabels) self.lstLabels.setRowHidden(0, True) self.lstLabels.clicked.connect(self.updateLabelColor) self.btnLabelAdd.clicked.connect(self.addLabel) self.btnLabelRemove.clicked.connect(self.removeLabel) self.btnLabelColor.clicked.connect(self.setLabelColor) # Statuses self.lstStatus.setModel(self.mw.mdlStatus) self.lstStatus.setRowHidden(0, True) self.btnStatusAdd.clicked.connect(self.addStatus) self.btnStatusRemove.clicked.connect(self.removeStatus) # Fullscreen self._editingTheme = None self.btnThemeEditOK.setIcon(qApp.style().standardIcon(QStyle.SP_DialogApplyButton)) self.btnThemeEditOK.clicked.connect(self.saveTheme) self.btnThemeEditCancel.setIcon(qApp.style().standardIcon(QStyle.SP_DialogCancelButton)) self.btnThemeEditCancel.clicked.connect(self.cancelEdit) self.cmbThemeEdit.currentIndexChanged.connect(self.themeEditStack.setCurrentIndex) self.cmbThemeEdit.setCurrentIndex(0) self.cmbThemeEdit.currentIndexChanged.emit(0) self.themeStack.setCurrentIndex(0) self.lstThemes.currentItemChanged.connect(self.themeSelected) self.populatesThemesList() self.btnThemeAdd.clicked.connect(self.newTheme) self.btnThemeEdit.clicked.connect(self.editTheme) self.btnThemeRemove.clicked.connect(self.removeTheme) self.timerUpdateFSPreview = QTimer() self.timerUpdateFSPreview.setSingleShot(True) self.timerUpdateFSPreview.setInterval(250) self.timerUpdateFSPreview.timeout.connect(self.updatePreview) def setTab(self, tab): tabs = { "General": 0, "Views": 1, "Labels": 2, "Status": 3, "Fullscreen": 4, } if tab in tabs: self.lstMenu.setCurrentRow(tabs[tab]) else: self.lstMenu.setCurrentRow(tab) #################################################################################################### # GENERAL # #################################################################################################### def setStyle(self, style): # Save style to Qt Settings sttgs = QSettings(qApp.organizationName(), qApp.applicationName()) sttgs.setValue("applicationStyle", style) qApp.setStyle(style) def setTranslation(self, index): path = self.cmbTranslation.currentData() # Save settings sttgs = QSettings(qApp.organizationName(), qApp.applicationName()) sttgs.setValue("applicationTranslation", path) # QMessageBox.information(self, "Warning", "You'll have to restart manuskript.") def setAppFontSize(self, val): """ Set application default font point size. """ f = qApp.font() f.setPointSize(val) qApp.setFont(f) mainWindow().setFont(f) sttgs = QSettings(qApp.organizationName(), qApp.applicationName()) sttgs.setValue("appFontSize", val) def saveSettingsChanged(self): if self.txtAutoSave.text() in ["", "0"]: self.txtAutoSave.setText("1") if self.txtAutoSaveNoChanges.text() in ["", "0"]: self.txtAutoSaveNoChanges.setText("1") sttgs = QSettings() sttgs.setValue("autoLoad", True if self.chkAutoLoad.checkState() else False) sttgs.sync() settings.autoSave = True if self.chkAutoSave.checkState() else False settings.autoSaveNoChanges = True if self.chkAutoSaveNoChanges.checkState() else False settings.saveOnQuit = True if self.chkSaveOnQuit.checkState() else False settings.saveToZip = True if self.chkSaveToZip.checkState() else False settings.autoSaveDelay = int(self.txtAutoSave.text()) settings.autoSaveNoChangesDelay = int(self.txtAutoSaveNoChanges.text()) self.mw.saveTimer.setInterval(settings.autoSaveDelay * 60 * 1000) self.mw.saveTimerNoChanges.setInterval(settings.autoSaveNoChangesDelay * 1000) #################################################################################################### # REVISION # #################################################################################################### def revisionsSettingsChanged(self): opt = settings.revisions opt["keep"] = True if self.chkRevisionsKeep.checkState() else False opt["smartremove"] = self.chkRevisionRemove.isChecked() opt["rules"][10 * 60] = 60 / self.spnRevisions10Mn.value() opt["rules"][60 * 60] = 60 * 10 / self.spnRevisionsHour.value() opt["rules"][60 * 60 * 24] = 60 * 60 / self.spnRevisionsDay.value() opt["rules"][60 * 60 * 24 * 30] = 60 * 60 * 24 / self.spnRevisionsMonth.value() opt["rules"][None] = 60 * 60 * 24 * 7 / self.spnRevisionsEternity.value() #################################################################################################### # VIEWS # #################################################################################################### def viewSettingsDatas(self): return { self.cmbTreeIcon: ("Tree", "Icon"), self.cmbTreeText: ("Tree", "Text"), self.cmbTreeBackground: ("Tree", "Background"), self.cmbOutlineIcon: ("Outline", "Icon"), self.cmbOutlineText: ("Outline", "Text"), self.cmbOutlineBackground: ("Outline", "Background"), self.cmbCorkIcon: ("Cork", "Icon"), self.cmbCorkText: ("Cork", "Text"), self.cmbCorkBackground: ("Cork", "Background"), self.cmbCorkBorder: ("Cork", "Border"), self.cmbCorkCorner: ("Cork", "Corner") } def viewSettingsChanged(self): cmb = self.sender() lst = ["Nothing", "POV", "Label", "Progress", "Compile"] item, part = self.viewSettingsDatas()[cmb] element = lst[cmb.currentIndex()] self.mw.setViewSettings(item, part, element) self.mw.generateViewMenu() def outlineColumnsData(self): return { self.chkOutlineTitle: Outline.title, self.chkOutlinePOV: Outline.POV, self.chkOutlineLabel: Outline.label, self.chkOutlineStatus: Outline.status, self.chkOutlineCompile: Outline.compile, self.chkOutlineWordCount: Outline.wordCount, self.chkOutlineGoal: Outline.goal, self.chkOutlinePercentage: Outline.goalPercentage, } def outlineColumnsChanged(self): chk = self.sender() val = True if chk.checkState() else False col = self.outlineColumnsData()[chk] if val and not col in settings.outlineViewColumns: settings.outlineViewColumns.append(col) elif not val and col in settings.outlineViewColumns: settings.outlineViewColumns.remove(col) # Update views for w in findWidgetsOfClass(outlineView): w.hideColumns() def treeViewSettignsChanged(self): for item, what, value in [ (self.rdoTreeItemCount, "InfoFolder", "Count"), (self.rdoTreeWC, "InfoFolder", "WC"), (self.rdoTreeProgress, "InfoFolder", "Progress"), (self.rdoTreeSummary, "InfoFolder", "Summary"), (self.rdoTreeNothing, "InfoFolder", "Nothing"), (self.rdoTreeTextWC, "InfoText", "WC"), (self.rdoTreeTextProgress, "InfoText", "Progress"), (self.rdoTreeTextSummary, "InfoText", "Summary"), (self.rdoTreeTextNothing, "InfoText", "Nothing"), ]: if item.isChecked(): settings.viewSettings["Tree"][what] = value iconSize = self.sldTreeIconSize.value() if iconSize != settings.viewSettings["Tree"]["iconSize"]: settings.viewSettings["Tree"]["iconSize"] = iconSize self.mw.treeRedacOutline.setIconSize(QSize(iconSize, iconSize)) self.mw.treeRedacOutline.viewport().update() def setCorkColor(self): color = QColor(settings.corkBackground["color"]) self.colorDialog = QColorDialog(color, self) color = self.colorDialog.getColor(color) if color.isValid(): settings.corkBackground["color"] = color.name() self.updateCorkColor() # Update Cork view self.mw.mainEditor.updateCorkBackground() def setCorkStyle(self): settings.corkStyle = "new" if self.rdoCorkNewStyle.isChecked() else "old" self.mw.mainEditor.updateCorkView() def updateCorkColor(self): self.btnCorkColor.setStyleSheet("background:{};".format(settings.corkBackground["color"])) def setCorkBackground(self, i): # Check if combobox was reset if i == -1: return img = self.cmbCorkImage.itemData(i) img = os.path.basename(img) if img: settings.corkBackground["image"] = img else: txt = self.cmbCorkImage.itemText(i) if txt == "": settings.corkBackground["image"] = "" else: img = self.addBackgroundImage() if img: self.populatesCmbBackgrounds(self.cmbCorkImage) settings.corkBackground["image"] = img self.setCorkImageDefault() # Update Cork view self.mw.mainEditor.updateCorkBackground() def populatesCmbBackgrounds(self, cmb): # self.cmbDelegate = cmbPixmapDelegate() # self.cmbCorkImage.setItemDelegate(self.cmbDelegate) paths = allPaths("resources/backgrounds") cmb.clear() cmb.addItem(QIcon.fromTheme("list-remove"), "", "") for p in paths: lst = os.listdir(p) for l in lst: if l.lower()[-4:] in [".jpg", ".png"] or \ l.lower()[-5:] in [".jpeg"]: px = QPixmap(os.path.join(p, l)).scaled(128, 64, Qt.KeepAspectRatio) cmb.addItem(QIcon(px), "", os.path.join(p, l)) cmb.addItem(QIcon.fromTheme("list-add"), " ", "") cmb.setIconSize(QSize(128, 64)) def addBackgroundImage(self): lastDirectory = self.mw.welcome.getLastAccessedDirectory() """File dialog that request an existing file. For opening an image.""" filename = QFileDialog.getOpenFileName(self, self.tr("Open Image"), lastDirectory, self.tr("Image files (*.jpg; *.jpeg; *.png)"))[0] if filename: try: px = QPixmap() valid = px.load(filename) del px if valid: shutil.copy(filename, writablePath("resources/backgrounds")) return os.path.basename(filename) else: QMessageBox.warning(self, self.tr("Error"), self.tr("Unable to load selected file")) except Exception as e: QMessageBox.warning(self, self.tr("Error"), self.tr("Unable to add selected image:\n{}").format(str(e))) return None def setCorkImageDefault(self): if settings.corkBackground["image"] != "": i = self.cmbCorkImage.findData(findBackground(settings.corkBackground["image"])) if i != -1: self.cmbCorkImage.setCurrentIndex(i) #################################################################################################### # VIEWS / EDITOR #################################################################################################### def updateEditorSettings(self): """ Stores settings for editor appearance. """ # Background settings.textEditor["backgroundTransparent"] = True if self.chkEditorBackgroundTransparent.checkState() else False # Font f = self.cmbEditorFontFamily.currentFont() f.setPointSize(self.spnEditorFontSize.value()) settings.textEditor["font"] = f.toString() # Cursor settings.textEditor["cursorWidth"] = \ 1 if not self.chkEditorCursorWidth.isChecked() else \ self.spnEditorCursorWidth.value() self.spnEditorCursorWidth.setEnabled(self.chkEditorCursorWidth.isChecked()) settings.textEditor["alwaysCenter"] = self.chkEditorTypeWriterMode.isChecked() settings.textEditor["focusMode"] = \ False if self.cmbEditorFocusMode.currentIndex() == 0 else \ "sentence" if self.cmbEditorFocusMode.currentIndex() == 1 else \ "line" if self.cmbEditorFocusMode.currentIndex() == 2 else \ "paragraph" # Text area settings.textEditor["maxWidth"] = \ 0 if not self.chkEditorMaxWidth.isChecked() else \ self.spnEditorMaxWidth.value() self.spnEditorMaxWidth.setEnabled(self.chkEditorMaxWidth.isChecked()) settings.textEditor["marginsLR"] = self.spnEditorMarginsLR.value() settings.textEditor["marginsTB"] = self.spnEditorMarginsTB.value() # Paragraphs settings.textEditor["textAlignment"] = self.cmbEditorAlignment.currentIndex() settings.textEditor["lineSpacing"] = \ 100 if self.cmbEditorLineSpacing.currentIndex() == 0 else \ 150 if self.cmbEditorLineSpacing.currentIndex() == 1 else \ 200 if self.cmbEditorLineSpacing.currentIndex() == 2 else \ self.spnEditorLineSpacing.value() self.spnEditorLineSpacing.setEnabled(self.cmbEditorLineSpacing.currentIndex() == 3) settings.textEditor["tabWidth"] = self.spnEditorTabWidth.value() settings.textEditor["indent"] = True if self.chkEditorIndent.checkState() else False settings.textEditor["spacingAbove"] = self.spnEditorParaAbove.value() settings.textEditor["spacingBelow"] = self.spnEditorParaBelow.value() self.timerUpdateWidgets.start() def updateAllWidgets(self): # Update font and defaultBlockFormat to all textEditView. Drastically. for w in mainWindow().findChildren(textEditView, QRegExp(".*")): w.loadFontSettings() # Update background color in all tabSplitter (tabs) for w in mainWindow().findChildren(tabSplitter, QRegExp(".*")): w.updateStyleSheet() # Update background color in all folder text view: for w in mainWindow().findChildren(QWidget, QRegExp("editorWidgetFolderText")): w.setStyleSheet("background: {};".format(settings.textEditor["background"])) def setApplicationCursorBlinking(self): settings.textEditor["cursorNotBlinking"] = self.chkEditorNoBlinking.isChecked() if settings.textEditor["cursorNotBlinking"]: qApp.setCursorFlashTime(0) else: # Load default system value, that we cached at startup qApp.setCursorFlashTime(self.mw._defaultCursorFlashTime) def choseEditorFontColor(self): color = settings.textEditor["fontColor"] self.colorDialog = QColorDialog(QColor(color), self) color = self.colorDialog.getColor(QColor(color)) if color.isValid(): settings.textEditor["fontColor"] = color.name() self.setButtonColor(self.btnEditorFontColor, color.name()) self.updateEditorSettings() def choseEditorMisspelledColor(self): color = settings.textEditor["misspelled"] self.colorDialog = QColorDialog(QColor(color), self) color = self.colorDialog.getColor(QColor(color)) if color.isValid(): settings.textEditor["misspelled"] = color.name() self.setButtonColor(self.btnEditorMisspelledColor, color.name()) self.updateEditorSettings() def choseEditorBackgroundColor(self): color = settings.textEditor["background"] self.colorDialog = QColorDialog(QColor(color), self) color = self.colorDialog.getColor(QColor(color)) if color.isValid(): settings.textEditor["background"] = color.name() self.setButtonColor(self.btnEditorBackgroundColor, color.name()) self.updateEditorSettings() def restoreEditorColors(self): settings.textEditor["background"] = S.base self.setButtonColor(self.btnEditorBackgroundColor, S.base) settings.textEditor["fontColor"] = S.text self.setButtonColor(self.btnEditorFontColor, S.text) self.updateEditorSettings() #################################################################################################### # STATUS # #################################################################################################### def addStatus(self): self.mw.mdlStatus.appendRow(QStandardItem(self.tr("New status"))) def removeStatus(self): for i in self.lstStatus.selectedIndexes(): self.mw.mdlStatus.removeRows(i.row(), 1) #################################################################################################### # LABELS # #################################################################################################### def updateLabelColor(self, index): # px = QPixmap(64, 64) # px.fill(iconColor(self.mw.mdlLabels.item(index.row()).icon())) # self.btnLabelColor.setIcon(QIcon(px)) self.btnLabelColor.setStyleSheet("background:{};".format( iconColor(self.mw.mdlLabels.item(index.row()).icon()).name())) self.btnLabelColor.setEnabled(True) def addLabel(self): px = QPixmap(32, 32) px.fill(Qt.transparent) self.mw.mdlLabels.appendRow(QStandardItem(QIcon(px), self.tr("New label"))) def removeLabel(self): for i in self.lstLabels.selectedIndexes(): self.mw.mdlLabels.removeRows(i.row(), 1) def setLabelColor(self): index = self.lstLabels.currentIndex() color = iconColor(self.mw.mdlLabels.item(index.row()).icon()) self.colorDialog = QColorDialog(color, self) color = self.colorDialog.getColor(color) if color.isValid(): px = QPixmap(32, 32) px.fill(color) self.mw.mdlLabels.item(index.row()).setIcon(QIcon(px)) self.updateLabelColor(index) #################################################################################################### # FULLSCREEN # #################################################################################################### def themeSelected(self, current, previous): if current: # UI updates self.btnThemeEdit.setEnabled(current.data(Qt.UserRole + 1)) self.btnThemeRemove.setEnabled(current.data(Qt.UserRole + 1)) # Save settings theme = current.data(Qt.UserRole) settings.fullScreenTheme = os.path.splitext(os.path.split(theme)[1])[0] else: # UI updates self.btnThemeEdit.setEnabled(False) self.btnThemeRemove.setEnabled(False) def newTheme(self): path = writablePath("resources/themes") name = self.tr("newtheme") if os.path.exists(os.path.join(path, "{}.theme".format(name))): i = 1 while os.path.exists(os.path.join(path, "{}_{}.theme".format(name, i))): i += 1 name = os.path.join(path, "{}_{}.theme".format(name, i)) else: name = os.path.join(path, "{}.theme".format(name)) settings = QSettings(name, QSettings.IniFormat) settings.setValue("Name", self.tr("New theme")) settings.sync() self.populatesThemesList() def editTheme(self): item = self.lstThemes.currentItem() theme = item.data(Qt.UserRole) self.loadTheme(theme) self.themeStack.setCurrentIndex(1) def removeTheme(self): item = self.lstThemes.currentItem() theme = item.data(Qt.UserRole) os.remove(theme) self.populatesThemesList() def populatesThemesList(self): paths = allPaths("resources/themes") current = settings.fullScreenTheme self.lstThemes.clear() for p in paths: lst = [i for i in os.listdir(p) if os.path.splitext(i)[1] == ".theme"] for t in lst: theme = os.path.join(p, t) editable = not appPath() in theme n = getThemeName(theme) item = QListWidgetItem(n) item.setData(Qt.UserRole, theme) item.setData(Qt.UserRole + 1, editable) item.setToolTip("{}{}".format( n, self.tr(" (read-only)") if not editable else "")) thumb = os.path.join(p, t.replace(".theme", ".jpg")) px = QPixmap(200, 120) px.fill(Qt.white) if not os.path.exists(thumb): currentScreen = qApp.desktop().screenNumber(self) screenRect = qApp.desktop().screenGeometry(currentScreen) thumb = createThemePreview(theme, screenRect) icon = QPixmap(thumb).scaled(200, 120, Qt.KeepAspectRatio) painter = QPainter(px) painter.drawPixmap(px.rect().center() - icon.rect().center(), icon) painter.end() item.setIcon(QIcon(px)) self.lstThemes.addItem(item) if current and current in t: self.lstThemes.setCurrentItem(item) current = None self.lstThemes.setIconSize(QSize(200, 120)) if current: # the theme from settings wasn't found # select the last from the list self.lstThemes.setCurrentRow(self.lstThemes.count() - 1) def loadTheme(self, theme): self._editingTheme = theme self._loadingTheme = True # So we don't generate preview while loading # Load datas self._themeData = loadThemeDatas(theme) # Window Background self.btnThemWindowBackgroundColor.clicked.connect(lambda: self.getThemeColor("Background/Color")) try: self.cmbThemeBackgroundImage.disconnect() except: pass self.populatesCmbBackgrounds(self.cmbThemeBackgroundImage) self.cmbThemeBackgroundImage.currentIndexChanged.connect(self.updateThemeBackground) self.cmbThemBackgroundType.currentIndexChanged.connect(lambda i: self.setSetting("Background/Type", i)) # Text Background self.btnThemeTextBackgroundColor.clicked.connect(lambda: self.getThemeColor("Foreground/Color")) self.spnThemeTextBackgroundOpacity.valueChanged.connect(lambda v: self.setSetting("Foreground/Opacity", v)) self.spnThemeTextMargins.valueChanged.connect(lambda v: self.setSetting("Foreground/Margin", v)) self.spnThemeTextPadding.valueChanged.connect(lambda v: self.setSetting("Foreground/Padding", v)) self.cmbThemeTextPosition.currentIndexChanged.connect(lambda i: self.setSetting("Foreground/Position", i)) self.spnThemeTextRadius.valueChanged.connect(lambda v: self.setSetting("Foreground/Rounding", v)) self.spnThemeTextWidth.valueChanged.connect(lambda v: self.setSetting("Foreground/Width", v)) # Text Options self.btnThemeTextColor.clicked.connect(lambda: self.getThemeColor("Text/Color")) self.cmbThemeFont.currentFontChanged.connect(self.updateThemeFont) try: self.cmbThemeFontSize.currentIndexChanged.disconnect(self.updateThemeFont) except: pass self.populatesFontSize() self.cmbThemeFontSize.currentIndexChanged.connect(self.updateThemeFont) self.btnThemeMisspelledColor.clicked.connect(lambda: self.getThemeColor("Text/Misspelled")) # Paragraph Options self.chkThemeIndent.stateChanged.connect(lambda v: self.setSetting("Spacings/IndentFirstLine", v != 0)) self.cmbThemeAlignment.currentIndexChanged.connect(lambda i: self.setSetting("Spacings/Alignment", i)) self.cmbThemeLineSpacing.currentIndexChanged.connect(self.updateLineSpacing) self.cmbThemeLineSpacing.currentIndexChanged.connect(self.updateLineSpacing) self.spnThemeLineSpacing.valueChanged.connect(lambda v: self.setSetting("Spacings/LineSpacing", v)) self.spnThemeParaAbove.valueChanged.connect(lambda v: self.setSetting("Spacings/ParagraphAbove", v)) self.spnThemeParaBelow.valueChanged.connect(lambda v: self.setSetting("Spacings/ParagraphBelow", v)) self.spnThemeTabWidth.valueChanged.connect(lambda v: self.setSetting("Spacings/TabWidth", v)) # Update UI self.updateUIFromTheme() # Generate preview self._loadingTheme = False self.updatePreview() def setSetting(self, key, val): self._themeData[key] = val self.timerUpdateFSPreview.start() def updateUIFromTheme(self): self.txtThemeName.setText(self._themeData["Name"]) # Window Background self.setButtonColor(self.btnThemWindowBackgroundColor, self._themeData["Background/Color"]) i = self.cmbThemeBackgroundImage.findData(self._themeData["Background/ImageFile"], flags=Qt.MatchContains) if i != -1: self.cmbThemeBackgroundImage.setCurrentIndex(i) self.cmbThemBackgroundType.setCurrentIndex(self._themeData["Background/Type"]) # Text background self.setButtonColor(self.btnThemeTextBackgroundColor, self._themeData["Foreground/Color"]) self.spnThemeTextBackgroundOpacity.setValue(self._themeData["Foreground/Opacity"]) self.spnThemeTextMargins.setValue(self._themeData["Foreground/Margin"]) self.spnThemeTextPadding.setValue(self._themeData["Foreground/Padding"]) self.cmbThemeTextPosition.setCurrentIndex(self._themeData["Foreground/Position"]) self.spnThemeTextRadius.setValue(self._themeData["Foreground/Rounding"]) self.spnThemeTextWidth.setValue(self._themeData["Foreground/Width"]) # Text Options self.setButtonColor(self.btnThemeTextColor, self._themeData["Text/Color"]) f = QFont() f.fromString(self._themeData["Text/Font"]) self.cmbThemeFont.setCurrentFont(f) i = self.cmbThemeFontSize.findText(str(f.pointSize())) if i != -1: self.cmbThemeFontSize.setCurrentIndex(i) else: self.cmbThemeFontSize.addItem(str(f.pointSize())) self.cmbThemeFontSize.setCurrentIndex(self.cmbThemeFontSize.count() - 1) self.setButtonColor(self.btnThemeMisspelledColor, self._themeData["Text/Misspelled"]) # Paragraph Options self.chkThemeIndent.setCheckState(Qt.Checked if self._themeData["Spacings/IndentFirstLine"] else Qt.Unchecked) self.spnThemeLineSpacing.setEnabled(False) self.cmbThemeAlignment.setCurrentIndex(self._themeData["Spacings/Alignment"]) if self._themeData["Spacings/LineSpacing"] == 100: self.cmbThemeLineSpacing.setCurrentIndex(0) elif self._themeData["Spacings/LineSpacing"] == 150: self.cmbThemeLineSpacing.setCurrentIndex(1) elif self._themeData["Spacings/LineSpacing"] == 200: self.cmbThemeLineSpacing.setCurrentIndex(2) else: self.cmbThemeLineSpacing.setCurrentIndex(3) self.spnThemeLineSpacing.setEnabled(True) self.spnThemeLineSpacing.setValue(self._themeData["Spacings/LineSpacing"]) self.spnThemeParaAbove.setValue(self._themeData["Spacings/ParagraphAbove"]) self.spnThemeParaBelow.setValue(self._themeData["Spacings/ParagraphBelow"]) self.spnThemeTabWidth.setValue(self._themeData["Spacings/TabWidth"]) def populatesFontSize(self): self.cmbThemeFontSize.clear() s = list(range(6, 13)) + list(range(14, 29, 2)) + [36, 48, 72] for i in s: self.cmbThemeFontSize.addItem(str(i)) def updateThemeFont(self, v): f = self.cmbThemeFont.currentFont() s = self.cmbThemeFontSize.itemText(self.cmbThemeFontSize.currentIndex()) if s: f.setPointSize(int(s)) self._themeData["Text/Font"] = f.toString() self.timerUpdateFSPreview.start() def updateLineSpacing(self, i): if i == 0: self._themeData["Spacings/LineSpacing"] = 100 elif i == 1: self._themeData["Spacings/LineSpacing"] = 150 elif i == 2: self._themeData["Spacings/LineSpacing"] = 200 elif i == 3: self._themeData["Spacings/LineSpacing"] = self.spnThemeLineSpacing.value() self.spnThemeLineSpacing.setEnabled(i == 3) self.timerUpdateFSPreview.start() def updateThemeBackground(self, i): # Check if combobox was reset if i == -1: return img = self.cmbThemeBackgroundImage.itemData(i) if img: self._themeData["Background/ImageFile"] = os.path.split(img)[1] else: txt = self.cmbThemeBackgroundImage.itemText(i) if txt == "": self._themeData["Background/ImageFile"] = "" else: img = self.addBackgroundImage() if img: self.populatesCmbBackgrounds(self.cmbThemeBackgroundImage) self._themeData["Background/ImageFile"] = img i = self.cmbThemeBackgroundImage.findData(self._themeData["Background/ImageFile"], flags=Qt.MatchContains) if i != -1: self.cmbThemeBackgroundImage.setCurrentIndex(i) self.updatePreview() def getThemeColor(self, key): color = self._themeData[key] self.colorDialog = QColorDialog(QColor(color), self) color = self.colorDialog.getColor(QColor(color)) if color.isValid(): self._themeData[key] = color.name() self.updateUIFromTheme() self.updatePreview() def updatePreview(self): if self._loadingTheme: return currentScreen = qApp.desktop().screenNumber(self) screen = qApp.desktop().screenGeometry(currentScreen) px = createThemePreview(self._themeData, screen, self.lblPreview.size()) self.lblPreview.setPixmap(px) def setButtonColor(self, btn, color): btn.setStyleSheet("background:{};".format(color)) def saveTheme(self): settings = QSettings(self._editingTheme, QSettings.IniFormat) self._themeData["Name"] = self.txtThemeName.text() for key in self._themeData: settings.setValue(key, self._themeData[key]) settings.sync() self.populatesThemesList() self.themeStack.setCurrentIndex(0) self._editingTheme = None def cancelEdit(self): self.themeStack.setCurrentIndex(0) self._editingTheme = None def resizeEvent(self, event): QWidget.resizeEvent(self, event) if self._editingTheme: self.updatePreview() manuskript-0.10.0/manuskript/tests/000077500000000000000000000000001354442177200173355ustar00rootroot00000000000000manuskript-0.10.0/manuskript/tests/__init__.py000066400000000000000000000027271354442177200214560ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- """Tests.""" # METHOD 1 # ======== # Don't know why, this causes seg fault on SemaphoreCI # Seg fault in app = QApplication(...) # Workaround: create and discard an app first... from PyQt5.QtWidgets import QApplication QApplication([]) # Create app and mainWindow from manuskript import main app, MW = main.prepare(tests=True) # FIXME: Again, don't know why, but when closing a project and then reopening # one, we get a `TypeError: connection is not unique` in MainWindow: # self.btnAddSubPlot.clicked.connect(self.updateSubPlotView, F.AUC) # Yet the disconnectAll() function has been called. # Workaround: we remove the necessity for connection to be unique. This # works for now, but could create issues later on when we want to test # this specific functionality. Maybe it will be called several times? # At that moment, we will need to catch the exception in the MainWindow, # or better: understand why it happens at all, and only on some signals. from manuskript import functions as F from PyQt5.QtCore import Qt F.AUC = Qt.AutoConnection # METHOD 2 # ======== # We need a qApplication to be running, or all the calls to qApp # will throw a seg fault. # from PyQt5.QtWidgets import QApplication # app = QApplication([]) # app.setOrganizationName("manuskript_tests") # app.setApplicationName("manuskript_tests") # from manuskript.mainWindow import MainWindow # MW = MainWindow() manuskript-0.10.0/manuskript/tests/conftest.py000066400000000000000000000033631354442177200215410ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- """Fixtures.""" import pytest @pytest.fixture def MW(): """ Returns the mainWindow """ from manuskript import functions as F MW = F.mainWindow() assert MW is not None assert MW == F.MW return MW @pytest.fixture def MWNoProject(MW): """ Take the MainWindow and close andy possibly open project. """ MW.closeProject() assert MW.currentProject is None return MW @pytest.fixture def MWEmptyProject(MW): """ Creates a MainWindow and load an empty project. """ import tempfile tf = tempfile.NamedTemporaryFile(suffix=".msk") MW.closeProject() assert MW.currentProject is None MW.welcome.createFile(tf.name, overwrite=True) assert MW.currentProject is not None return MW # If using with: @pytest.fixture(scope='session', autouse=True) # yield MW # # Properly destructed after. Otherwise: seg fault. # MW.deleteLater() @pytest.fixture def MWSampleProject(MW): """ Creates a MainWindow and load a copy of the Acts sample project. """ from manuskript import functions as F import os # Get the path of the first sample project. We assume it is here. spDir = F.appPath("sample-projects") lst = os.listdir(spDir) # We assume it's saved in folder, so there is a `name.msk` file and a # `name` folder. src = [f for f in lst if f[-4:] == ".msk" and f[:-4] in lst][0] src = os.path.join(spDir, src) # Copy to a temp file import tempfile tf = tempfile.NamedTemporaryFile(suffix=".msk") import shutil shutil.copyfile(src, tf.name) shutil.copytree(src[:-4], tf.name[:-4]) MW.loadProject(tf.name) assert MW.currentProject is not None return MW manuskript-0.10.0/manuskript/tests/models/000077500000000000000000000000001354442177200206205ustar00rootroot00000000000000manuskript-0.10.0/manuskript/tests/models/__init__.py000066400000000000000000000001121354442177200227230ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- """Tests for models.""" manuskript-0.10.0/manuskript/tests/models/conftest.py000066400000000000000000000010251354442177200230150ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- """Conf for models.""" import pytest @pytest.fixture def outlineModelBasic(MWEmptyProject): """Returns an outlineModel with a few items: * Folder * Text * Text """ from manuskript.models import outlineItem mdl = MWEmptyProject.mdlOutline root = mdl.rootItem f = outlineItem(title="Folder", parent=root) t1 = outlineItem(title="Text", _type="md", parent=f) t2 = outlineItem(title="Text", _type="md", parent=root) return mdl manuskript-0.10.0/manuskript/tests/models/test_outlineItem.py000066400000000000000000000107561354442177200245400ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- """Tests for outlineItem""" import pytest @pytest.fixture def outlineItemFolder(): '''Returns a folder outlineItem title "Folder".''' from manuskript.models import outlineItem return outlineItem(title="Folder") @pytest.fixture def outlineItemText(): '''Returns a text outlineItem title "Text".''' from manuskript.models import outlineItem return outlineItem(title="Text", _type="md") def test_outlineItemsProperties(outlineItemFolder, outlineItemText): """ Tests with simple items, without parent or models. """ from PyQt5.QtCore import Qt # Simplification folder = outlineItemFolder text = outlineItemText # getters assert folder.isFolder() == True assert text.isFolder() == False assert text.isText() == True assert text.isMD() == text.isMMD() == True assert text.title() == "Text" assert text.compile() == True assert folder.POV() == "" assert folder.status() == "" assert folder.label() == "" assert folder.customIcon() == "" assert folder.data(42) == "" assert folder.data(folder.enum.title, role=Qt.CheckStateRole) == None # setData and other setters assert text.data(text.enum.compile, role=Qt.CheckStateRole) == Qt.Checked text.setData(text.enum.compile, 0) assert text.compile() == False assert text.data(text.enum.compile, role=Qt.CheckStateRole) == Qt.Unchecked folder.setCustomIcon("custom") assert folder.customIcon() == "custom" folder.setData(folder.enum.text, "Some text") assert folder.text() == "" # folders have no text # wordCount text.setData(text.enum.text, "Sample **text**.") assert text.wordCount() == 2 text.setData(text.enum.goal, 4) assert text.data(text.enum.goalPercentage) == .5 def test_modelStuff(outlineModelBasic): """ Tests with children items. """ # Simplification model = outlineModelBasic # Child count root = model.rootItem assert len(root.children()) == 2 folder = root.child(0) text1 = folder.child(0) text2 = root.child(1) # Compile assert text1.compile() == True folder.setData(folder.enum.compile, 0) assert text1.compile() == False # Word count text1.setData(text1.enum.text, "Sample text.") assert text1.wordCount() == 2 assert folder.wordCount() == 2 statsWithGoal = folder.stats() assert statsWithGoal != "" text1.setData(text1.enum.setGoal, 4) assert folder.data(folder.enum.goal) == 4 folder.setData(folder.enum.setGoal, 3) assert folder.data(folder.enum.goal) == 3 assert folder.stats() != statsWithGoal # Split and merge text1.setData(text1.enum.text, "Sample\n---\ntext.") folder.split("invalid mark") assert folder.childCount() == 1 folder.split("\n---\n") assert folder.childCount() == 2 text1.mergeWith([folder.child(1)]) assert text1.text() == "Sample\n\ntext." text1.setData(text1.enum.text, "Sample\nNewTitle\ntext.") text1.splitAt(7, 8) assert folder.child(1).title() == "NewTitle" folder.child(1).splitAt(3) assert folder.child(2).title() == "NewTitle_2" folder.removeChild(2) folder.removeChild(1) folder.removeChild(0) assert folder.childCount() == 0 # Search folder.appendChild(text2) text2.setData(text2.enum.POV, 1) folder.setData(folder.enum.POV, 1) assert len(folder.findItemsByPOV(1)) == 2 folder.setData(folder.enum.label, 1) # Idea folder.setData(folder.enum.status, 4) # Final text2.setData(text2.enum.text, "Some final value.") from manuskript.functions import MW cols = [folder.enum.text, folder.enum.POV, folder.enum.label, folder.enum.status] assert folder.findItemsContaining("VALUE", cols, MW, True) == [] assert folder.findItemsContaining("VALUE", cols, MW, False) == [text2.ID()] # Model, count and copy k = folder._model folder.setModel(14) assert text2._model == 14 folder.setModel(k) assert folder.columnCount() == len(folder.enum) text1 = text2.copy() assert text1.ID() is None folder.appendChild(text1) assert text1.ID() is not None assert folder.childCountRecursive() == 2 assert text1.path() == "Folder > Text" assert len(text1.pathID()) == 2 # IDs folder2 = folder.copy() text3 = text1.copy() text3.setData(text3.enum.ID, "0") folder2.appendChild(text3) folder.appendChild(folder2) assert text3.ID() == "0" root.checkIDs() assert text3.ID() != "0" manuskript-0.10.0/manuskript/tests/models/test_references.py000066400000000000000000000102011354442177200243440ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- """Tests for references.py""" import pytest def test_references(MWSampleProject): """ Tests references using sample project. """ from manuskript.models import references as Ref MW = MWSampleProject # References ref1 = Ref.plotReference("42", searchable=True) ref2 = Ref.plotReference("42") assert ref1 in ref2 ref1 = Ref.characterReference("42", searchable=True) ref2 = Ref.characterReference("42") assert ref1 in ref2 ref1 = Ref.textReference("42", searchable=True) ref2 = Ref.textReference("42") assert ref1 in ref2 ref1 = Ref.worldReference("42", searchable=True) ref2 = Ref.worldReference("42") assert ref1 in ref2 # Plots mdlPlots = MW.mdlPlots plotsImp = mdlPlots.getPlotsByImportance() plots = [] [plots.extend(i) for i in plotsImp] assert len(plots) == 3 plotID = plots[0] assert "\n" in Ref.infos(Ref.plotReference(plotID)) assert "Not a ref" in Ref.infos("") assert "Unknown" in Ref.infos(Ref.plotReference("999")) assert Ref.shortInfos(Ref.plotReference(plotID)) is not None assert Ref.shortInfos(Ref.plotReference("999")) == None assert Ref.shortInfos("") == -1 # Character mdlChar = MW.mdlCharacter IDs = [mdlChar.ID(r) for r in range(mdlChar.rowCount())] assert len(IDs) == 6 # Peter, Paul, Philip, Stephen, Barnabas, Herod charID = IDs[0] assert "\n" in Ref.infos(Ref.characterReference(charID)) assert "Unknown" in Ref.infos(Ref.characterReference("999")) assert Ref.shortInfos(Ref.characterReference(charID)) is not None assert Ref.shortInfos(Ref.characterReference("999")) == None assert Ref.shortInfos("") == -1 # Texts mdlOutline = MW.mdlOutline assert mdlOutline.rowCount() == 3 # Jerusalem, Samaria, Extremities root = mdlOutline.rootItem textID = root.child(0).ID() assert "\n" in Ref.infos(Ref.textReference(textID)) assert "Unknown" in Ref.infos(Ref.textReference("999")) assert Ref.shortInfos(Ref.textReference(textID)) is not None assert Ref.shortInfos(Ref.textReference("999")) == None assert Ref.shortInfos("") == -1 # World mdlWorld = MW.mdlWorld assert mdlWorld.rowCount() == 3 # Places, Culture, Travel worldID = mdlWorld.itemID(mdlWorld.item(2).child(1)) assert "\n" in Ref.infos(Ref.worldReference(worldID)) assert "Unknown" in Ref.infos(Ref.worldReference("999")) assert Ref.shortInfos(Ref.worldReference(worldID)) is not None assert Ref.shortInfos(Ref.worldReference("999")) == None assert Ref.shortInfos("") == -1 refs = [Ref.plotReference(plotID), Ref.characterReference(charID), Ref.textReference(textID), Ref.worldReference(worldID),] # Titles for ref in refs: assert Ref.title(ref) is not None assert Ref.title("") is None assert Ref.title(Ref.plotReference("999")) is None # Other stuff assert Ref.type(Ref.plotReference(plotID)) == Ref.PlotLetter assert Ref.ID(Ref.textReference(textID)) == textID assert "Unknown" in Ref.tooltip(Ref.worldReference("999")) assert "Not a ref" in Ref.tooltip("") for ref in refs: assert Ref.tooltip(ref) is not None # Links assert Ref.refToLink("") is None assert Ref.refToLink(Ref.plotReference("999")) == Ref.plotReference("999") assert Ref.refToLink(Ref.characterReference("999")) == Ref.characterReference("999") assert Ref.refToLink(Ref.textReference("999")) == Ref.textReference("999") assert Ref.refToLink(Ref.worldReference("999")) == Ref.worldReference("999") for ref in refs: assert "") is None assert Ref.open(Ref.plotReference("999")) == False assert Ref.open(Ref.characterReference("999")) == False assert Ref.open(Ref.textReference("999")) == False assert Ref.open(Ref.worldReference("999")) == False for ref in refs: assert Ref.open(ref) == True assert Ref.open(Ref.EmptyRef.format("Z", 14, "")) == False manuskript-0.10.0/manuskript/tests/test_functions.py000066400000000000000000000046261354442177200227660ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- """Tests for functions""" from manuskript import functions as F def test_wordCount(): assert F.wordCount("In the beginning was the word.") == 6 assert F.wordCount("") == 0 def test_convert(): # toInt assert F.toInt("9") == 9 assert F.toInt("a") == 0 assert F.toInt("") == 0 # toFloat assert F.toFloat("9.4") == 9.4 assert F.toFloat("") == 0. # toString assert F.toString(None) == "" assert F.toString("None") == "" assert F.toString("Joy") == "Joy" def test_several(): from PyQt5.QtGui import QPainter, QPixmap, QIcon, QColor from PyQt5.QtCore import QRect # drawProgress px = QPixmap(10, 10) F.drawProgress(QPainter(px), QRect(0, 0, 100, 100), 0.5) # colorFromProgress a = F.colorFromProgress(0.1) b = F.colorFromProgress(0.5) c = F.colorFromProgress(1.0) d = F.colorFromProgress(1.5) assert a != b != c != d # iconColor & iconFromColor & iconFromColorString icon = F.iconFromColorString("#ff0000") assert F.iconColor(icon).name().lower() == "#ff0000" # themeIcon assert F.themeIcon("text") is not None assert F.themeIcon("nonexistingname") is not None # randomColor c1 = F.randomColor() c2 = F.randomColor(c1) assert c1.name() != c2.name() # mixColors c1 = QColor("#FFF") c2 = QColor("#000") assert F.mixColors(c1, c2).name() == "#7f7f7f" # colorifyPixmap assert F.colorifyPixmap(px, c1) != None def test_outlineItemColors(): from manuskript.models import outlineItem item = outlineItem(title="Test") r = F.outlineItemColors(item) for i in ["POV", "Label", "Progress", "Compile"]: assert i in r from PyQt5.QtGui import QColor assert r["Compile"].name(QColor.HexArgb) == "#00000000" def test_paths(): assert F.appPath() is not None assert F.writablePath is not None assert len(F.allPaths("suffix")) == 2 assert F.tempFile("yop") is not None f = F.findBackground("spacedreams.jpg") assert "resources/backgrounds/spacedreams.jpg" in f assert len(F.customIcons()) > 1 def test_mainWindow(): from PyQt5.QtWidgets import QWidget, QLCDNumber assert F.mainWindow() is not None assert F.MW is not None F.statusMessage("Test") F.printObjects() assert len(F.findWidgetsOfClass(QWidget)) > 0 assert len(F.findWidgetsOfClass(QLCDNumber)) == 0 manuskript-0.10.0/manuskript/tests/test_settingsWindow.py000066400000000000000000000136041354442177200240020ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- """Tests for settingsWindow""" from manuskript import functions as F def test_general(MWSampleProject): MW = MWSampleProject # Loading from mainWindow MW.actSettings.triggered.emit() assert MW.sw.isVisible() MW.sw.close() MW.actLabels.triggered.emit() assert MW.sw.isVisible() MW.sw.close() MW.actStatus.triggered.emit() assert MW.sw.isVisible() MW.sw.hide() MW.sw.setTab("General") SW = MW.sw # Imports from PyQt5.QtWidgets import qApp, QStyleFactory from PyQt5.QtCore import QSettings, Qt qS = QSettings(qApp.organizationName(), qApp.applicationName()) from manuskript import settings as S # Style assert SW.cmbStyle.count() == len(list(QStyleFactory.keys())) if qS.value("applicationStyle"): assert SW.cmbStyle.currentText() == qS.value("applicationStyle") ## Seg fault when trying to set the style in tests: # for s in styles: # SW.cmbStyle.setCurrentText(s) # assert S.value("applicationStyle") == s # Translations if qS.value("applicationTranslation"): assert (SW.cmbTranslation.currentData() == qS.value("applicationTranslation")) for name in SW.translations: SW.cmbTranslation.setCurrentText(name) if qS.value("applicationTranslation"): assert qS.value("applicationTranslation") == SW.translations[name] def switchCheckBoxAndAssert(chk, settings): """ Asserts that the check state is that of settings, change checkstate and asserts settings has been changed. Settings is a function that returns the value. """ state = settings() assert chk.isChecked() == state chk.setChecked(not state) assert chk.isChecked() is not state # Loading and Saving SW.txtAutoSave.setText("0") SW.txtAutoSaveNoChanges.setText("0") switchCheckBoxAndAssert(SW.chkAutoLoad, lambda: qS.value("autoLoad", type=bool)) switchCheckBoxAndAssert(SW.chkAutoSave, lambda: S.autoSave) switchCheckBoxAndAssert(SW.chkAutoSaveNoChanges, lambda: S.autoSaveNoChanges) switchCheckBoxAndAssert(SW.chkSaveOnQuit, lambda: S.saveOnQuit) switchCheckBoxAndAssert(SW.chkSaveToZip, lambda: S.saveToZip) # Revisions switchCheckBoxAndAssert(SW.chkRevisionsKeep, lambda: S.revisions["keep"]) switchCheckBoxAndAssert(SW.chkRevisionRemove, lambda: S.revisions["smartremove"]) # Views # Simple way here, we just call the functions. SW.cmbTreeIcon.currentIndexChanged.emit(0) SW.cmbOutlineIcon.currentIndexChanged.emit(0) SW.cmbCorkIcon.currentIndexChanged.emit(0) SW.chkOutlineTitle.setChecked(Qt.Checked) #outlineColumnsChanged SW.chkOutlineTitle.setChecked(Qt.Unchecked) SW.chkOutlineTitle.setChecked(Qt.Checked) # Can't test because of the dialog # assert SW.setCorkColor() is None SW.sldTreeIconSize.setValue(SW.sldTreeIconSize.value() + 1) SW.rdoCorkNewStyle.toggled.emit(True) SW.cmbCorkImage.currentIndexChanged.emit(0) SW.cmbCorkImage.currentIndexChanged.emit(1) # Test editor: same problem as above # choseEditorFontColor # choseEditorMisspelledColor # choseEditorBackgroundColor # Test editor switchCheckBoxAndAssert(SW.chkEditorBackgroundTransparent, lambda: S.textEditor["backgroundTransparent"]) assert SW.restoreEditorColors() is None switchCheckBoxAndAssert(SW.chkEditorNoBlinking, lambda: S.textEditor["cursorNotBlinking"]) # Twice on purpose: set and restore switchCheckBoxAndAssert(SW.chkEditorNoBlinking, lambda: S.textEditor["cursorNotBlinking"]) # Manually call updateAllWidgets, because other wise timer of 250ms SW.updateAllWidgets() # Labels assert SW.updateLabelColor(MW.mdlLabels.item(1).index()) is None rc = MW.mdlLabels.rowCount() SW.addLabel() SW.lstLabels.setCurrentIndex( MW.mdlLabels.item(MW.mdlLabels.rowCount() - 1).index()) SW.removeLabel() assert MW.mdlLabels.rowCount() == rc # setLabelColor # Same problem as above # Status rc = MW.mdlStatus.rowCount() SW.addStatus() SW.lstStatus.setCurrentIndex( MW.mdlStatus.item(MW.mdlStatus.rowCount() - 1).index()) SW.removeStatus() assert MW.mdlStatus.rowCount() == rc # Fullscreen # self.lstThemes.currentItemChanged.connect(self.themeSelected) item = SW.lstThemes.item(0) SW.lstThemes.currentItemChanged.emit(item, None) assert S.fullScreenTheme in item.data(Qt.UserRole) SW.lstThemes.currentItemChanged.emit(None, None) count = SW.lstThemes.count() SW.newTheme() assert SW.lstThemes.count() == count + 1 SW.newTheme() # theme with same name item = SW.lstThemes.item(SW.lstThemes.count() - 1) SW.lstThemes.setCurrentItem(item) SW.removeTheme() item = SW.lstThemes.item(count) SW.lstThemes.setCurrentItem(item) SW.editTheme() switchCheckBoxAndAssert(SW.chkThemeIndent, lambda: SW._themeData["Spacings/IndentFirstLine"]) SW.updateThemeFont(None) SW.updateThemeBackground(0) SW.updateThemeBackground(1) SW.spnThemeLineSpacing.setValue(123) for i in range(4): SW.updateLineSpacing(i) SW.updateUIFromTheme() # No time to wait on timer assert SW._editingTheme is not None SW.resize(SW.geometry().size()) # resizeEvent #TODO: other edit test (see SW.loadTheme SW.saveTheme() item = SW.lstThemes.item(count) SW.lstThemes.setCurrentItem(item) SW.editTheme() SW.cancelEdit() item = SW.lstThemes.item(count) SW.lstThemes.setCurrentItem(item) SW.removeTheme() assert SW.lstThemes.count() == count manuskript-0.10.0/manuskript/tests/ui/000077500000000000000000000000001354442177200177525ustar00rootroot00000000000000manuskript-0.10.0/manuskript/tests/ui/__init__.py000066400000000000000000000001171354442177200220620ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- """Tests for stuff in ui.""" manuskript-0.10.0/manuskript/tests/ui/exporters/000077500000000000000000000000001354442177200220055ustar00rootroot00000000000000manuskript-0.10.0/manuskript/tests/ui/exporters/__init__.py000066400000000000000000000001261354442177200241150ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- """Tests for exporters, ui part.""" manuskript-0.10.0/manuskript/tests/ui/exporters/test_exporters.py000066400000000000000000000007551354442177200254600ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- """Tests for settingsWindow""" def test_loadExportWiget(MWSampleProject): """ Simply tests that export widget loads properly. """ MW = MWSampleProject # Loading from mainWindow MW.doCompile() E = MW.dialog assert E.isVisible() E.hide() # Load exporter manager E.openManager() EM = E.dialog assert EM.isVisible() EM.hide() EM.close() E.close() #FIXME: test significant stuff manuskript-0.10.0/manuskript/tests/ui/importers/000077500000000000000000000000001354442177200217765ustar00rootroot00000000000000manuskript-0.10.0/manuskript/tests/ui/importers/__init__.py000066400000000000000000000001261354442177200241060ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- """Tests for importers, ui part.""" manuskript-0.10.0/manuskript/tests/ui/importers/test_importers.py000066400000000000000000000005611354442177200254350ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- """Tests for settingsWindow""" def test_loadImportWiget(MWSampleProject): """ Simply tests that import widget loads properly. """ MW = MWSampleProject # Loading from mainWindow MW.doImport() I = MW.dialog assert I.isVisible() I.hide() I.close() #FIXME: test significant stuff manuskript-0.10.0/manuskript/tests/ui/test_welcome.py000066400000000000000000000011641354442177200230200ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- """Tests for the welcome widget.""" def test_autoLoad(MWNoProject): """ Tests for the welcome widget using MainWindow with no open project. """ MW = MWNoProject from PyQt5.QtCore import QSettings # Testing when no autoLoad QSettings().remove("autoLoad") autoLoad, path = MW.welcome.getAutoLoadValues() assert type(autoLoad) == bool assert autoLoad == False for v in [True, False, 42, "42", None, True]: MW.welcome.setAutoLoad(v) autoLoad, path = MW.welcome.getAutoLoadValues() assert type(autoLoad) == bool manuskript-0.10.0/manuskript/ui/000077500000000000000000000000001354442177200166105ustar00rootroot00000000000000manuskript-0.10.0/manuskript/ui/__init__.py000066400000000000000000000000001354442177200207070ustar00rootroot00000000000000manuskript-0.10.0/manuskript/ui/about.py000066400000000000000000000037361354442177200203050ustar00rootroot00000000000000# --!-- coding: utf8 --!-- from PyQt5.Qt import PYQT_VERSION_STR from PyQt5.QtCore import QT_VERSION_STR from PyQt5.QtGui import QIcon, QPixmap from PyQt5.QtWidgets import QWidget from platform import python_version from manuskript.functions import appPath from manuskript.ui.about_ui import Ui_about from manuskript.version import getVersion class aboutDialog(QWidget, Ui_about): def __init__(self, parent=None, mw=None): QWidget.__init__(self, parent) self.setupUi(self) self.populateFields() self.buttonBox.accepted.connect(self.accept) def populateFields(self): # Fill in all the fields in the About dialog iconPic = appPath("icons/Manuskript/icon-64px.png") self.setWindowIcon(QIcon(iconPic)) logoPic = QPixmap(appPath("icons/Manuskript/logo-400x104.png")) self.labelLogo.setPixmap(logoPic) self.labelManuskriptVersion.setText( "" + self.tr("Version") + " " + getVersion() + "
    " + " "*5 + """
    http://www.theologeek.ch/manuskript/
    """ + " "*5 + "Copyright © 2015-2019 Olivier Keshavjee
    " + " "*5 + """ GNU General Public License Version 3
    """ ) self.labelManuskriptVersion.setOpenExternalLinks(True) self.labelSoftwareVersion.setText( "" + self.tr("Software Versions in Use:") + "
    " + " "*5 + "Python " + python_version() + "
    " + " "*5 + "PyQt " + PYQT_VERSION_STR + "
    " + " "*5 + "Qt " + QT_VERSION_STR ) #self.labelPythonVersion.setText() #self.labelPyQtVersion.setText() #self.labelQtVersion.setText() def accept(self): self.close() manuskript-0.10.0/manuskript/ui/about_ui.py000066400000000000000000000053521354442177200207760ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'manuskript/ui/about_ui.ui' # # Created: Wed Oct 11 08:28:24 2017 # by: PyQt5 UI code generator 5.2.1 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_about(object): def setupUi(self, about): about.setObjectName("about") about.setWindowModality(QtCore.Qt.ApplicationModal) about.resize(445, 370) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap("../../icons/Manuskript/icon-64px.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) about.setWindowIcon(icon) self.gridLayout = QtWidgets.QGridLayout(about) self.gridLayout.setObjectName("gridLayout") self.labelManuskriptVersion = QtWidgets.QLabel(about) self.labelManuskriptVersion.setText("Version") self.labelManuskriptVersion.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) self.labelManuskriptVersion.setObjectName("labelManuskriptVersion") self.gridLayout.addWidget(self.labelManuskriptVersion, 2, 0, 1, 2) spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.gridLayout.addItem(spacerItem, 5, 0, 1, 1) self.labelLogo = QtWidgets.QLabel(about) self.labelLogo.setText("") self.labelLogo.setPixmap(QtGui.QPixmap("../../icons/Manuskript/logo-400x104.png")) self.labelLogo.setObjectName("labelLogo") self.gridLayout.addWidget(self.labelLogo, 0, 0, 1, 2) self.labelSoftwareVersion = QtWidgets.QLabel(about) self.labelSoftwareVersion.setText("Software Versions in Use:") self.labelSoftwareVersion.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.labelSoftwareVersion.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) self.labelSoftwareVersion.setObjectName("labelSoftwareVersion") self.gridLayout.addWidget(self.labelSoftwareVersion, 4, 0, 1, 1) self.buttonBox = QtWidgets.QDialogButtonBox(about) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Ok) self.buttonBox.setObjectName("buttonBox") self.gridLayout.addWidget(self.buttonBox, 7, 0, 1, 1) self.retranslateUi(about) self.buttonBox.accepted.connect(about.accept) QtCore.QMetaObject.connectSlotsByName(about) def retranslateUi(self, about): _translate = QtCore.QCoreApplication.translate about.setWindowTitle(_translate("about", "About Manuskript")) self.labelLogo.setToolTip(_translate("about", "Manuskript")) manuskript-0.10.0/manuskript/ui/about_ui.ui000066400000000000000000000053661354442177200207700ustar00rootroot00000000000000 about Qt::ApplicationModal 0 0 445 370 About Manuskript ../../icons/Manuskript/icon-64px.png../../icons/Manuskript/icon-64px.png Version Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse Qt::Vertical 20 40 Manuskript ../../icons/Manuskript/logo-400x104.png Software Versions in Use: Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse Qt::Horizontal QDialogButtonBox::Ok buttonBox accepted() about accept() 248 254 157 274 manuskript-0.10.0/manuskript/ui/cheatSheet.py000066400000000000000000000154011354442177200212400ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import pyqtSignal, Qt, QTimer, QRect from PyQt5.QtGui import QBrush, QCursor, QPalette, QFontMetrics, QColor from PyQt5.QtWidgets import QWidget, QListWidgetItem, QToolTip, QStyledItemDelegate, QStyle from manuskript.enums import Character from manuskript.enums import Plot from manuskript.functions import mainWindow from manuskript.ui import style as S from manuskript.ui.cheatSheet_ui import Ui_cheatSheet from manuskript.models import references as Ref from manuskript.ui.editors.completer import completer class cheatSheet(QWidget, Ui_cheatSheet): activated = pyqtSignal(str) def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) self.txtFilter.setStyleSheet(S.lineEditSS()) self.splitter.setStretchFactor(0, 5) self.splitter.setStretchFactor(1, 70) self.txtFilter.textChanged.connect(self.textChanged) self.txtFilter.textChanged.connect(self.updateListFromData) self.txtFilter.returnPressed.connect(self.showInfos) self.listDelegate = listCompleterDelegate(self) self.list.setItemDelegate(self.listDelegate) self.list.itemActivated.connect(self.showInfos) self.list.itemClicked.connect(self.showInfos) self.hideList() self.list.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.view.linkActivated.connect(self.openLink) self.view.linkHovered.connect(self.linkHovered) self.btnShowList.toggled.connect(self.list.setVisible) self.line.hide() self.outlineModel = None self.characterModel = None self.plotModel = None self.worldModel = None self.populateTimer = QTimer(self) self.populateTimer.setSingleShot(True) self.populateTimer.setInterval(500) self.populateTimer.timeout.connect(self.populate) self.populateTimer.stop() self.data = {} self.populate() def setModels(self): mw = mainWindow() self.outlineModel = mw.mdlOutline self.characterModel = mw.mdlCharacter self.plotModel = mw.mdlPlots self.worldModel = mw.mdlWorld self.outlineModel.dataChanged.connect(self.populateTimer.start) self.characterModel.dataChanged.connect(self.populateTimer.start) self.characterModel.rowsInserted.connect(self.populateTimer.start) self.characterModel.rowsRemoved.connect(self.populateTimer.start) self.plotModel.dataChanged.connect(self.populateTimer.start) self.worldModel.dataChanged.connect(self.populateTimer.start) self.populate() def textChanged(self, text): if not text: self.hideList() self.list.clear() self.view.setText("") else: self.list.show() def hideList(self): if not self.btnShowList.isChecked(): self.list.hide() def populate(self): if self.characterModel: d = [] for c in self.characterModel.characters: imp = [self.tr("Minor"), self.tr("Secondary"), self.tr("Main")][int(c.importance())] d.append((c.name(), c.ID(), imp)) self.data[(self.tr("Characters"), Ref.CharacterLetter)] = d if self.outlineModel: d = [] def addChildren(item): for c in item.children(): d.append((c.title(), c.ID(), c.path())) addChildren(c) r = self.outlineModel.rootItem addChildren(r) self.data[(self.tr("Texts"), Ref.TextLetter)] = d if self.plotModel: d = [] for r in range(self.plotModel.rowCount()): name = self.plotModel.item(r, Plot.name).text() ID = self.plotModel.item(r, Plot.ID).text() imp = self.plotModel.item(r, Plot.importance).text() imp = [self.tr("Minor"), self.tr("Secondary"), self.tr("Main")][int(imp)] d.append((name, ID, imp)) self.data[(self.tr("Plots"), Ref.PlotLetter)] = d if self.worldModel: d = self.worldModel.listAll() self.data[(self.tr("World"), Ref.WorldLetter)] = d self.updateListFromData() def addCategory(self, title): item = QListWidgetItem(title) item.setBackground(QBrush(QColor(S.highlightLight))) item.setForeground(QBrush(QColor(S.highlightedTextDark))) item.setFlags(Qt.ItemIsEnabled) f = item.font() f.setBold(True) item.setFont(f) self.list.addItem(item) def updateListFromData(self): self.list.clear() for cat in self.data: filtered = [i for i in self.data[cat] if self.txtFilter.text().lower() in i[0].lower() or self.txtFilter.text().lower() in cat[0].lower()] if filtered: self.addCategory(cat[0]) for item in filtered: i = QListWidgetItem(item[0]) i.setData(Qt.UserRole, Ref.EmptyRef.format(cat[1], item[1], item[0])) i.setData(Qt.UserRole + 1, item[2]) self.list.addItem(i) self.list.setCurrentRow(1) def showInfos(self): self.hideList() if self.list and len(self.txtFilter.text()) != 0: i = self.list.currentItem() ref = i.data(Qt.UserRole) if ref: self.view.setText(Ref.infos(ref)) def openLink(self, link): Ref.open(link) def linkHovered(self, link): if link: QToolTip.showText(QCursor.pos(), Ref.tooltip(link)) def keyPressEvent(self, event): if event.key() in [Qt.Key_Up, Qt.Key_Down]: self.list.keyPressEvent(event) else: QWidget.keyPressEvent(self, event) class listCompleterDelegate(QStyledItemDelegate): def __init__(self, parent=None): QStyledItemDelegate.__init__(self, parent) def paint(self, painter, option, index): extra = index.data(Qt.UserRole + 1) if not extra: return QStyledItemDelegate.paint(self, painter, option, index) else: if option.state & QStyle.State_Selected: painter.fillRect(option.rect, option.palette.color(QPalette.Inactive, QPalette.Highlight)) title = index.data() extra = " - {}".format(extra) painter.drawText(option.rect, Qt.AlignLeft, title) fm = QFontMetrics(option.font) w = fm.width(title) r = QRect(option.rect) r.setLeft(r.left() + w) painter.save() painter.setPen(Qt.gray) painter.drawText(r, Qt.AlignLeft, extra) painter.restore() manuskript-0.10.0/manuskript/ui/cheatSheet_ui.py000066400000000000000000000107321354442177200217370ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'manuskript/ui/cheatSheet_ui.ui' # # Created: Fri Apr 8 14:27:04 2016 # by: PyQt5 UI code generator 5.2.1 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_cheatSheet(object): def setupUi(self, cheatSheet): cheatSheet.setObjectName("cheatSheet") cheatSheet.resize(400, 344) self.verticalLayout_2 = QtWidgets.QVBoxLayout(cheatSheet) self.verticalLayout_2.setSpacing(0) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setObjectName("verticalLayout_2") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setSpacing(0) self.horizontalLayout.setObjectName("horizontalLayout") self.txtFilter = QtWidgets.QLineEdit(cheatSheet) self.txtFilter.setStyleSheet("") self.txtFilter.setFrame(False) self.txtFilter.setClearButtonEnabled(True) self.txtFilter.setObjectName("txtFilter") self.horizontalLayout.addWidget(self.txtFilter) self.btnShowList = QtWidgets.QPushButton(cheatSheet) self.btnShowList.setText("") icon = QtGui.QIcon.fromTheme("go-bottom") self.btnShowList.setIcon(icon) self.btnShowList.setCheckable(True) self.btnShowList.setFlat(True) self.btnShowList.setObjectName("btnShowList") self.horizontalLayout.addWidget(self.btnShowList) self.verticalLayout_2.addLayout(self.horizontalLayout) self.line = QtWidgets.QFrame(cheatSheet) self.line.setFrameShadow(QtWidgets.QFrame.Plain) self.line.setLineWidth(0) self.line.setFrameShape(QtWidgets.QFrame.HLine) self.line.setFrameShadow(QtWidgets.QFrame.Sunken) self.line.setObjectName("line") self.verticalLayout_2.addWidget(self.line) self.splitter = QtWidgets.QSplitter(cheatSheet) self.splitter.setOrientation(QtCore.Qt.Vertical) self.splitter.setObjectName("splitter") self.list = QtWidgets.QListWidget(self.splitter) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.list.sizePolicy().hasHeightForWidth()) self.list.setSizePolicy(sizePolicy) self.list.setFrameShape(QtWidgets.QFrame.NoFrame) self.list.setObjectName("list") self.scrollArea = QtWidgets.QScrollArea(self.splitter) self.scrollArea.setFrameShape(QtWidgets.QFrame.NoFrame) self.scrollArea.setLineWidth(0) self.scrollArea.setWidgetResizable(True) self.scrollArea.setObjectName("scrollArea") self.scrollAreaWidgetContents = QtWidgets.QWidget() self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 400, 68)) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.verticalLayout = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents) self.verticalLayout.setSpacing(0) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setObjectName("verticalLayout") self.view = QtWidgets.QLabel(self.scrollAreaWidgetContents) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.view.sizePolicy().hasHeightForWidth()) self.view.setSizePolicy(sizePolicy) self.view.setLineWidth(0) self.view.setText("") self.view.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.view.setWordWrap(True) self.view.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) self.view.setObjectName("view") self.verticalLayout.addWidget(self.view) self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.verticalLayout_2.addWidget(self.splitter) self.retranslateUi(cheatSheet) QtCore.QMetaObject.connectSlotsByName(cheatSheet) def retranslateUi(self, cheatSheet): _translate = QtCore.QCoreApplication.translate cheatSheet.setWindowTitle(_translate("cheatSheet", "Form")) self.txtFilter.setPlaceholderText(_translate("cheatSheet", "Filter (type the name of anything in your project)")) manuskript-0.10.0/manuskript/ui/cheatSheet_ui.ui000066400000000000000000000110571354442177200217250ustar00rootroot00000000000000 cheatSheet 0 0 400 344 Form 0 0 0 0 0 0 false Filter (type the name of anything in your project) true true true QFrame::Plain 0 Qt::Horizontal Qt::Vertical 0 0 QFrame::NoFrame QFrame::NoFrame 0 true 0 0 400 68 0 0 0 0 0 0 0 0 Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse manuskript-0.10.0/manuskript/ui/collapsibleDockWidgets.py000066400000000000000000000130111354442177200235770ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QToolBar, QDockWidget, QAction, QToolButton, QSizePolicy, QStylePainter, \ QStyleOptionButton, QStyle from manuskript.ui import style class collapsibleDockWidgets(QToolBar): """ QMainWindow "mixin" which provides auto-hiding support for dock widgets (not toolbars). """ TRANSPOSED_AREA = { Qt.LeftDockWidgetArea: Qt.LeftToolBarArea, Qt.RightDockWidgetArea: Qt.RightToolBarArea, Qt.TopDockWidgetArea: Qt.TopToolBarArea, Qt.BottomDockWidgetArea: Qt.BottomToolBarArea, } def __init__(self, area, parent, name=""): QToolBar.__init__(self, parent) self._area = area if not name: name = self.tr("Dock Widgets Toolbar") self.setObjectName(name) self.setWindowTitle(name) self.setFloatable(False) self.setMovable(False) # self.setAllowedAreas(self.TRANSPOSED_AREA[self._area]) self.parent().addToolBar(self.TRANSPOSED_AREA[self._area], self) self._dockToButtonAction = {} # Dock widgets for d in self._dockWidgets(): b = verticalButton(self) b.setDefaultAction(d.toggleViewAction()) # d.setStyleSheet("QDockWidget::title{background-color: red;}") # d.setTitleBarWidget(QLabel(d.windowTitle())) d.setStyleSheet(style.dockSS()) a = self.addWidget(b) self._dockToButtonAction[d] = a self.addSeparator() # Other widgets self.otherWidgets = [] self.currentGroup = None self.setStyleSheet(style.toolBarSS()) self.layout().setContentsMargins(0,0,0,0) def _dockWidgets(self): mw = self.parent() for w in mw.findChildren(QDockWidget, None): yield w def addCustomWidget(self, text, widget, group=None, defaultVisibility=True): """ Adds a custom widget to the toolbar. `text` is the name that will displayed on the button to switch visibility. `widget` is the widget to control from the toolbar. `group` is an integer (or any hashable) if the current widget should not be displayed all the time. Call `collapsibleDockWidgets.setCurrentGroup` to switch to that group and hide other widgets. `defaultVisibility` is the default visibility of the item when it is added. This allows for the widget to be added to `collapsibleDockWidgets` after they've been created but before they are shown, and yet specify their desired visibility. Otherwise it creates troubles, see #167 on github: https://github.com/olivierkes/manuskript/issues/167. """ a = QAction(text, self) a.setCheckable(True) a.setChecked(defaultVisibility) a.toggled.connect(widget.setVisible) widget.setVisible(defaultVisibility) # widget.installEventFilter(self) b = verticalButton(self) b.setDefaultAction(a) #b.setChecked(widget.isVisible()) a2 = self.addWidget(b) self.otherWidgets.append((b, a2, widget, group)) # def eventFilter(self, widget, event): # if event.type() in [QEvent.Show, QEvent.Hide]: # for btn, action, w, grp in self.otherWidgets: # if w == widget: # btn.defaultAction().setChecked(event.type() == QEvent.Show) # return False def setCurrentGroup(self, group): self.currentGroup = group for btn, action, widget, grp in self.otherWidgets: if not grp == group or grp is None: action.setVisible(False) else: action.setVisible(True) def setDockVisibility(self, dock, val): dock.setVisible(val) self._dockToButtonAction[dock].setVisible(val) def saveState(self): """ Saves and returns the state of the custom widgets. The visibility of the docks is not saved since it is included in `QMainWindow.saveState`. """ state = [] for btn, act, w, grp in self.otherWidgets: state.append( (grp, btn.text(), btn.isChecked()) ) return state def restoreState(self, state): """Restores the state of the custom widgets.""" for group, title, status in state: for btn, act, widget, grp in self.otherWidgets: # Strip '&' from both title and btn.text() to improve matching because # title contains "&" shortcut character whereas btn.text() does not. if group == grp and title.replace('&', '') == btn.text().replace('&', ''): btn.setChecked(status) btn.defaultAction().setChecked(status) widget.setVisible(status) class verticalButton(QToolButton): def __init__(self, parent): QToolButton.__init__(self, parent) self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Minimum) self.setStyleSheet(style.verticalToolButtonSS()) def sizeHint(self): return QToolButton.sizeHint(self).transposed() def paintEvent(self, event): p = QStylePainter(self) p.rotate(90) p.translate(0, - self.width()) opt = QStyleOptionButton() opt.initFrom(self) opt.text = self.text() if self.isChecked(): opt.state |= QStyle.State_On s = opt.rect.size().transposed() opt.rect.setSize(s) p.drawControl(QStyle.CE_PushButton, opt) manuskript-0.10.0/manuskript/ui/collapsibleGroupBox.py000066400000000000000000000116011354442177200231400ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import Qt, QRect, QRectF from PyQt5.QtGui import QColor, QBrush, QRegion, QTextOption, QFont from PyQt5.QtWidgets import QSizePolicy, QGroupBox, QWidget, QStylePainter, QStyleOptionGroupBox, qApp, QVBoxLayout, \ QStyle, QStyleOptionFrame, QStyleOptionFocusRect from manuskript.ui import style as S class collapsibleGroupBox(QGroupBox): def __init__(self, parent=None): QGroupBox.__init__(self) self.toggled.connect(self.setExpanded) self.tempWidget = QWidget() self.customStyle = False def setExpanded(self, val): self.setCollapsed(not val) def setCollapsed(self, val): if val: # Save layout self.tempWidget.setLayout(self.layout()) # Set empty layout l = QVBoxLayout() # print(l.contentsMargins().left(), l.contentsMargins().bottom(), l.contentsMargins().top(), ) l.setContentsMargins(0, 0, 0, 0) self.setLayout(l) self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum) else: # Delete layout QWidget().setLayout(self.layout()) # Set saved layout self.setLayout(self.tempWidget.layout()) self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) def paintEvent(self, event): if not self.customStyle: return QGroupBox.paintEvent(self, event) p = QStylePainter(self) opt = QStyleOptionGroupBox() self.initStyleOption(opt) style = qApp.style() groupBox = opt # // Draw frame textRect = style.subControlRect(style.CC_GroupBox, opt, style.SC_GroupBoxLabel) checkBoxRect = style.subControlRect(style.CC_GroupBox, opt, style.SC_GroupBoxCheckBox) p.save() titleRect = style.subControlRect(style.CC_GroupBox, opt, style.SC_GroupBoxFrame) # r.setBottom(style.subControlRect(style.CC_GroupBox, opt, style.SC_GroupBoxContents).top()) titleRect.setHeight(textRect.height()) titleRect.moveTop(textRect.top()) p.setBrush(QBrush(QColor(S.highlightLight))) p.setPen(Qt.NoPen) p.drawRoundedRect(titleRect, 10, 10) p.restore() if groupBox.subControls & QStyle.SC_GroupBoxFrame: frame = QStyleOptionFrame() # frame.operator=(groupBox) frame.state = groupBox.state frame.features = groupBox.features frame.lineWidth = groupBox.lineWidth frame.midLineWidth = groupBox.midLineWidth frame.rect = style.subControlRect(style.CC_GroupBox, opt, style.SC_GroupBoxFrame) p.save() region = QRegion(groupBox.rect) if groupBox.text: ltr = groupBox.direction == Qt.LeftToRight finalRect = QRect() if groupBox.subControls & QStyle.SC_GroupBoxCheckBox: finalRect = checkBoxRect.united(textRect) finalRect.adjust(-4 if ltr else 0, 0, 0 if ltr else 4, 0) else: finalRect = textRect region -= QRegion(finalRect) p.setClipRegion(region) style.drawPrimitive(style.PE_FrameGroupBox, frame, p) p.restore() # // Draw title if groupBox.subControls & QStyle.SC_GroupBoxLabel and groupBox.text: # textColor = QColor(groupBox.textColor) # if textColor.isValid(): # p.setPen(textColor) # alignment = int(groupBox.textAlignment) # if not style.styleHint(QStyle.SH_UnderlineShortcut, opt): # alignment |= Qt.TextHideMnemonic # style.drawItemText(p, textRect, Qt.TextShowMnemonic | Qt.AlignHCenter | alignment, # groupBox.palette, groupBox.state & style.State_Enabled, groupBox.text, # QPalette.NoRole if textColor.isValid() else QPalette.WindowText) p.save() topt = QTextOption(Qt.AlignHCenter | Qt.AlignVCenter) f = QFont() f.setBold(True) p.setFont(f) p.setPen(QColor(S.highlightedTextDark)) p.drawText(QRectF(titleRect), groupBox.text.replace("&", ""), topt) p.restore() if groupBox.state & style.State_HasFocus: fropt = QStyleOptionFocusRect() # fropt.operator=(groupBox) fropt.state = groupBox.state fropt.rect = textRect style.drawPrimitive(style.PE_FrameFocusRect, fropt, p) # // Draw checkbox # if groupBox.subControls & style.SC_GroupBoxCheckBox: # box = QStyleOptionButton() # box.operator=(groupBox) # box.state = groupBox.state # box.rect = checkBoxRect # style.drawPrimitive(style.PE_IndicatorCheckBox, box, p) manuskript-0.10.0/manuskript/ui/collapsibleGroupBox2.py000066400000000000000000000037661354442177200232370ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QWidget, QFrame, QPushButton, QVBoxLayout, QSizePolicy, qApp from manuskript.ui import style class collapsibleGroupBox2(QWidget): def __init__(self, parent=None, title=None): QWidget.__init__(self, parent) self.frame = QFrame(self) self.button = QPushButton("Toggle", self) self.button.setCheckable(True) self.button.setChecked(True) self.switched = False self.vPolicy = None self.button.setStyleSheet(style.collapsibleGroupBoxButton()) if title: self.setTitle(title) def resizeEvent(self, event): if not self.switched: self.switchLayout() return QWidget.resizeEvent(self, event) def switchLayout(self): self.frame.setLayout(self.layout()) self.wLayout = QVBoxLayout(self) self.wLayout.setContentsMargins(0, 0, 0, 0) self.wLayout.setSpacing(0) self.wLayout.addWidget(self.button) self.wLayout.addWidget(self.frame) self.button.toggled.connect(self.setExpanded) self.frame.layout().setContentsMargins(0, 0, 0, 4) self.frame.layout().setSpacing(0) self.switched = True self.vPolicy = self.sizePolicy().verticalPolicy() self.parent().layout().setAlignment(Qt.AlignTop) self.setExpanded(self.button.isChecked()) def setFlat(self, val): if val: self.frame.setFrameShape(QFrame.NoFrame) def setCheckable(self, val): pass def setTitle(self, title): self.button.setText(title) def setExpanded(self, val): self.frame.setVisible(val) if val: self.setSizePolicy(QSizePolicy.Preferred, self.vPolicy) else: self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum) def saveState(self): return self.button.isChecked() def restoreState(self, val): self.button.setChecked(val) manuskript-0.10.0/manuskript/ui/editors/000077500000000000000000000000001354442177200202615ustar00rootroot00000000000000manuskript-0.10.0/manuskript/ui/editors/MDFunctions.py000066400000000000000000000006221354442177200230240ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- import re from PyQt5.QtCore import QRegExp from PyQt5.QtGui import QTextCursor def MDFormatSelection(editor, style): """ Formats the current selection of ``editor`` in the format given by ``style``, style being: 0: bold 1: italic 2: code """ print("Formatting:", style, " (Unimplemented yet !)") # FIXMEmanuskript-0.10.0/manuskript/ui/editors/__init__.py000066400000000000000000000000001354442177200223600ustar00rootroot00000000000000manuskript-0.10.0/manuskript/ui/editors/blockUserData.py000066400000000000000000000032741354442177200233640ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf8 -*- from PyQt5.QtGui import QTextBlockUserData class blockUserData(QTextBlockUserData): @staticmethod def getUserData(block): """Returns userData if it exists, or a blank one.""" data = block.userData() if data is None: data = blockUserData() return data @staticmethod def getUserState(block): """Returns the block state.""" state = block.userState() while state >= 100: state -= 100 # +100 means in a list return state def __init__(self): QTextBlockUserData.__init__(self) self._listLevel = 0 self._leadingSpaces = 0 self._emptyLinesBefore = 0 self._listSymbol = "" def isList(self): return self._listLevel > 0 def listLevel(self): return self._listLevel def setListLevel(self, level): self._listLevel = level def listSymbol(self): return self._listSymbol def setListSymbol(self, s): self._listSymbol = s def leadingSpaces(self): return self._leadingSpaces def setLeadingSpaces(self, n): self._leadingSpaces = n def emptyLinesBefore(self): return self._emptyLinesBefore def setEmptyLinesBefore(self, n): self._emptyLinesBefore = n def text(self): return str(self.listLevel()) + "|" + str(self.leadingSpaces()) + "|" + str(self.emptyLinesBefore()) def __eq__(self, b): return self._listLevel == b._listLevel and \ self._leadingSpaces == b._leadingSpaces and \ self._emptyLinesBefore == b._emptyLinesBefore def __ne__(self, b): return not self == b manuskript-0.10.0/manuskript/ui/editors/completer.py000066400000000000000000000066701354442177200226360ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import pyqtSignal, Qt, QRect from PyQt5.QtGui import QBrush, QFontMetrics, QPalette, QColor from PyQt5.QtWidgets import QWidget, QListWidgetItem, QStyledItemDelegate, QStyle from manuskript.functions import mainWindow from manuskript.ui.editors.completer_ui import Ui_completer from manuskript.models import references as Ref from manuskript.ui import style as S class completer(QWidget, Ui_completer): activated = pyqtSignal(str) def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) self.setWindowFlags(Qt.Popup) self.text.textChanged.connect(self.updateListFromData) self.text.returnPressed.connect(self.submit) self.listDelegate = listCompleterDelegate(self) self.list.setItemDelegate(self.listDelegate) self.list.itemClicked.connect(self.submit) self.list.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.hide() def popup(self, completion=""): self.updateListFromData() self.text.setText(completion) self.text.setFocus(Qt.PopupFocusReason) self.show() def addCategory(self, title): item = QListWidgetItem(title) item.setBackground(QBrush(QColor(S.highlightLight))) item.setForeground(QBrush(QColor(S.highlightedTextDark))) item.setFlags(Qt.ItemIsEnabled) self.list.addItem(item) def updateListFromData(self): data = mainWindow().cheatSheet.data self.list.clear() for cat in data: filtered = [i for i in data[cat] if self.text.text().lower() in i[0].lower()] if filtered: self.addCategory(cat[0]) for item in filtered: i = QListWidgetItem(item[0]) i.setData(Qt.UserRole, Ref.EmptyRef.format(cat[1], item[1], item[0])) i.setData(Qt.UserRole + 1, item[2]) self.list.addItem(i) self.list.setCurrentRow(1) self.text.setFocus(Qt.PopupFocusReason) def submit(self): i = self.list.currentItem() self.activated.emit(i.data(Qt.UserRole)) self.hide() def keyPressEvent(self, event): if event.key() in [Qt.Key_Up, Qt.Key_Down]: self.list.keyPressEvent(event) else: QWidget.keyPressEvent(self, event) class listCompleterDelegate(QStyledItemDelegate): def __init__(self, parent=None): QStyledItemDelegate.__init__(self, parent) def paint(self, painter, option, index): extra = index.data(Qt.UserRole + 1) if not extra: return QStyledItemDelegate.paint(self, painter, option, index) else: if option.state & QStyle.State_Selected: painter.fillRect(option.rect, option.palette.color(QPalette.Inactive, QPalette.Highlight)) title = index.data() extra = " - {}".format(extra) painter.drawText(option.rect, Qt.AlignLeft, title) fm = QFontMetrics(option.font) w = fm.width(title) r = QRect(option.rect) r.setLeft(r.left() + w) painter.save() if option.state & QStyle.State_Selected: painter.setPen(QColor(S.highlightedTextLight)) else: painter.setPen(QColor(S.textLight)) painter.drawText(r, Qt.AlignLeft, extra) painter.restore() manuskript-0.10.0/manuskript/ui/editors/completer_ui.py000066400000000000000000000022161354442177200233230ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'manuskript/ui/editors/completer_ui.ui' # # Created by: PyQt5 UI code generator 5.4.1 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtWidgets class Ui_completer(object): def setupUi(self, completer): completer.setObjectName("completer") completer.resize(163, 143) self.verticalLayout = QtWidgets.QVBoxLayout(completer) self.verticalLayout.setSpacing(0) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setObjectName("verticalLayout") self.text = QtWidgets.QLineEdit(completer) self.text.setObjectName("text") self.verticalLayout.addWidget(self.text) self.list = QtWidgets.QListWidget(completer) self.list.setObjectName("list") self.verticalLayout.addWidget(self.list) self.retranslateUi(completer) QtCore.QMetaObject.connectSlotsByName(completer) def retranslateUi(self, completer): _translate = QtCore.QCoreApplication.translate completer.setWindowTitle(_translate("completer", "Form")) manuskript-0.10.0/manuskript/ui/editors/completer_ui.ui000066400000000000000000000013111354442177200233030ustar00rootroot00000000000000 completer 0 0 163 143 Form 0 0 manuskript-0.10.0/manuskript/ui/editors/editorWidget.py000066400000000000000000000430751354442177200232760ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import pyqtSignal, QModelIndex from PyQt5.QtGui import QPalette from PyQt5.QtWidgets import QWidget, QFrame, QSpacerItem, QSizePolicy from PyQt5.QtWidgets import QVBoxLayout, qApp, QStyle from manuskript import settings from manuskript.functions import AUC, mainWindow from manuskript.ui.editors.editorWidget_ui import Ui_editorWidget_ui from manuskript.ui.views.MDEditView import MDEditView from manuskript.ui.tools.splitDialog import splitDialog class editorWidget(QWidget, Ui_editorWidget_ui): """ `editorWidget` is a class responsible for displaying and editing one `outlineItem`. This item can be a folder or a text. It has four views (see `self.setView`) - For folders: "text", "outline" or "cork" (set in `self.folderView`) Text: displays a list of `textEditView` in a scroll area Outline: displays an outline, using an `outlineView` Cork: displays flash cards, using a `corkView` - For text: item is simply displayed in a `textEditView` All those views are contained in `editorWidget` single widget: `self.stack`. `editorWidget` are managed in `tabSplitted` (that allow to open several `outlineItem`s, either in Tabs or in split views. `tabSplitted` are in turn managed by the `mainEditor`, which is unique and gives UI buttons to manage all those views. """ toggledSpellcheck = pyqtSignal(bool) dictChanged = pyqtSignal(str) _maxTabTitleLength = 24 def __init__(self, parent): QWidget.__init__(self, parent) self.setupUi(self) self.currentIndex = QModelIndex() self.currentID = None self.txtEdits = [] self.scroll.setBackgroundRole(QPalette.Base) self.toggledSpellcheck.connect(self.txtRedacText.toggleSpellcheck, AUC) self.dictChanged.connect(self.txtRedacText.setDict, AUC) self.txtRedacText.setHighlighting(True) self.currentDict = "" self.spellcheck = settings.spellcheck self.folderView = "cork" self.mw = mainWindow() self._tabWidget = None # set by mainEditor on creation self._model = None # Capture textEdit scrollbar, so that we can put it outside the margins. self.txtEditScrollBar = self.txtRedacText.verticalScrollBar() self.txtEditScrollBar.setParent(self) self.stack.currentChanged.connect(self.setScrollBarVisibility) # def setModel(self, model): # self._model = model # self.setView() def resizeEvent(self, event): """ textEdit's scrollBar has been reparented to self. So we need to update it's geometry when self is resized, and put it where we want it to be. """ # Update scrollbar geometry r = self.geometry() w = 10 # Cf. style.mainEditorTabSS r.setWidth(w) r.moveRight(self.geometry().width()) self.txtEditScrollBar.setGeometry(r) QWidget.resizeEvent(self, event) def setScrollBarVisibility(self): """ Since the texteEdit scrollBar has been reparented to self, it is not hidden when stack changes. We have to do it manually. """ self.txtEditScrollBar.setVisible(self.stack.currentIndex() == 0) def setFolderView(self, v): oldV = self.folderView if v == "cork": self.folderView = "cork" elif v == "outline": self.folderView = "outline" else: self.folderView = "text" # Saving value settings.folderView = self.folderView if oldV != self.folderView and self.currentIndex: self.setCurrentModelIndex(self.currentIndex) def setCorkSizeFactor(self, v): self.corkView.itemDelegate().setCorkSizeFactor(v) self.redrawCorkItems() def redrawCorkItems(self): r = self.corkView.rootIndex() if r.isValid(): count = r.internalPointer().childCount() elif self._model: count = self._model.rootItem.childCount() else: count = 0 for c in range(count): self.corkView.itemDelegate().sizeHintChanged.emit(r.child(c, 0)) def updateTabTitle(self): """ `editorWidget` belongs to a `QTabWidget` in a `tabSplitter`. We update the tab title to reflect that of current item. """ # `self._tabWidget` is set by mainEditor when creating tab and `editorWidget`. # if `editorWidget` is ever used out of `mainEditor`, this could throw # an error. if not self._tabWidget: return if self.currentIndex.isValid(): item = self.currentIndex.internalPointer() elif self._model: item = self._model.rootItem else: return i = self._tabWidget.indexOf(self) self._tabWidget.setTabText(i, self.ellidedTitle(item.title())) self._tabWidget.setTabToolTip(i, item.title()) def ellidedTitle(self, title): if len(title) > self._maxTabTitleLength: return "{}…".format(title[:self._maxTabTitleLength]) else: return title def setView(self): # index = mainWindow().treeRedacOutline.currentIndex() # Counting the number of other selected items # sel = [] # for i in mainWindow().treeRedacOutline.selectionModel().selection().indexes(): # if i.column() != 0: continue # if i not in sel: sel.append(i) # if len(sel) != 0: # item = index.internalPointer() # else: # index = QModelIndex() # item = self.mw.mdlOutline.rootItem # self.currentIndex = index if self.currentIndex.isValid(): item = self.currentIndex.internalPointer() else: item = self.mw.mdlOutline.rootItem self.updateTabTitle() def addTitle(itm): edt = MDEditView(self, html="{t}".format(l=min(itm.level() + 1, 5), t=itm.title()), autoResize=True) edt.setFrameShape(QFrame.NoFrame) self.txtEdits.append(edt) l.addWidget(edt) def addLine(): line = QFrame(self.text) line.setFrameShape(QFrame.HLine) line.setFrameShadow(QFrame.Sunken) l.addWidget(line) def addText(itm): edt = MDEditView(self, index=itm.index(), spellcheck=self.spellcheck, dict=settings.dict, highlighting=True, autoResize=True) edt.setFrameShape(QFrame.NoFrame) edt.setStatusTip("{}".format(itm.path())) self.toggledSpellcheck.connect(edt.toggleSpellcheck, AUC) self.dictChanged.connect(edt.setDict, AUC) # edt.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) self.txtEdits.append(edt) l.addWidget(edt) def addChildren(itm): for c in range(itm.childCount()): child = itm.child(c) if child.isFolder(): addTitle(child) addChildren(child) else: addText(child) addLine() def addSpacer(): l.addItem(QSpacerItem(10, 1000, QSizePolicy.Minimum, QSizePolicy.Expanding)) # Display multiple selected items # if len(sel) > 1 and False: # Buggy and not very useful, skip # self.stack.setCurrentIndex(1) # w = QWidget() # l = QVBoxLayout(w) # self.txtEdits = [] # for idx in sel: # sItem = idx.internalPointer() # addTitle(sItem) # if sItem.isFolder(): # addChildren(sItem) # else: # addText(sItem) # addLine() # addSpacer() # self.scroll.setWidget(w) if item and item.isFolder() and self.folderView == "text": self.stack.setCurrentIndex(1) w = QWidget() w.setObjectName("editorWidgetFolderText") l = QVBoxLayout(w) opt = settings.textEditor background = (opt["background"] if not opt["backgroundTransparent"] else "transparent") w.setStyleSheet("background: {};".format(background)) self.stack.widget(1).setStyleSheet("background: {}" .format(background)) # self.scroll.setWidgetResizable(False) self.txtEdits = [] if item != self._model.rootItem: addTitle(item) addChildren(item) addSpacer() self.scroll.setWidget(w) elif item and item.isFolder() and self.folderView == "cork": self.stack.setCurrentIndex(2) self.corkView.setModel(self._model) self.corkView.setRootIndex(self.currentIndex) try: self.corkView.selectionModel().selectionChanged.connect(mainWindow().redacMetadata.selectionChanged, AUC) self.corkView.clicked.connect(mainWindow().redacMetadata.selectionChanged, AUC) self.corkView.clicked.connect(mainWindow().mainEditor.updateTargets, AUC) except TypeError: pass elif item and item.isFolder() and self.folderView == "outline": self.stack.setCurrentIndex(3) self.outlineView.setModelCharacters(mainWindow().mdlCharacter) self.outlineView.setModelLabels(mainWindow().mdlLabels) self.outlineView.setModelStatus(mainWindow().mdlStatus) self.outlineView.setModel(self._model) self.outlineView.setRootIndex(self.currentIndex) try: self.outlineView.selectionModel().selectionChanged.connect(mainWindow().redacMetadata.selectionChanged, AUC) self.outlineView.clicked.connect(mainWindow().redacMetadata.selectionChanged, AUC) self.outlineView.clicked.connect(mainWindow().mainEditor.updateTargets, AUC) except TypeError: pass if item and item.isText(): self.txtRedacText.setCurrentModelIndex(self.currentIndex) self.stack.setCurrentIndex(0) # Single text item else: self.txtRedacText.setCurrentModelIndex(QModelIndex()) try: self._model.dataChanged.connect(self.modelDataChanged, AUC) self._model.rowsAboutToBeRemoved.connect(self.rowsAboutToBeRemoved, AUC) except TypeError: pass self.updateStatusBar() def setCurrentModelIndex(self, index=None): if index and index.isValid(): self.currentIndex = index self._model = index.model() self.currentID = self._model.ID(index) else: self.currentIndex = QModelIndex() self.currentID = None if self._model: self.setView() def updateIndexFromID(self, fallback=None, ignore=None): """ Index might have changed (through drag an drop), so we keep current item's ID and update index. Item might have been deleted too. It will ignore the passed model item to avoid ambiguity during times of inconsistent state. """ idx = self._model.getIndexByID(self.currentID, ignore=ignore) # If we have an ID but the ID does not exist, it has been deleted. if self.currentID and idx == QModelIndex(): # If we are given a fallback item to display, do so. if fallback: self.setCurrentModelIndex(fallback) else: # After tab closing is implemented, any calls to `updateIndexFromID` # should be re-evaluated to match the desired behaviour. raise NotImplementedError("implement tab closing") # FIXME: selection in self.mw.treeRedacOutline is not updated # but we cannot simply setCurrentIndex through treeRedacOutline # because this might be a tab in the background / out of focus # Also the UI of mainEditor is not updated (so the folder icons # are not display, button "up" doesn't work, etc.). # Item has been moved elif idx != self.currentIndex: # We update the index self.currentIndex = idx self.setView() def modelDataChanged(self, topLeft, bottomRight): if not self.currentIndex.isValid(): return # Just to be safe. # We are only concerned with minor changes to the current index, # so there is no need to call updateIndexFromID() nor setView(). if topLeft.row() <= self.currentIndex.row() <= bottomRight.row(): self.updateTabTitle() self.updateStatusBar() def rowsAboutToBeRemoved(self, parent, first, last): if not self.currentIndex.isValid(): return # Just to be safe. # Look for a common ancestor to verify whether the deleted rows include our index in their hierarchy. childItem = self.currentIndex ancestorCandidate = childItem.parent() # start at folder above current item while (ancestorCandidate != parent): childItem = ancestorCandidate ancestorCandidate = childItem.parent() if not ancestorCandidate.isValid(): return # we ran out of ancestors without finding the matching QModelIndex # My sanity advocates a healthy dose of paranoia. (Just to be safe.) if ancestorCandidate != parent: return # we did not find our shared ancestor # Verify our origins come from the relevant first..last range. if first <= childItem.row() <= last: # If the row in question was actually moved, there is a duplicate item # already inserted elsewhere in the tree. Try to update this tab view, # but make sure we exclude ourselves from the search for a replacement. self.updateIndexFromID(fallback=parent, ignore=self.currentIndex.internalPointer()) def updateStatusBar(self): # Update progress # if self.currentIndex and self.currentIndex.isValid(): # if self._model: mw = mainWindow() if not mw: return mw.mainEditor.tabChanged() def toggleSpellcheck(self, v): self.spellcheck = v self.toggledSpellcheck.emit(v) def setDict(self, dct): self.currentDict = dct self.dictChanged.emit(dct) ############################################################################### # FUNCTIONS FOR MENU ACCESS ############################################################################### def getCurrentItemView(self): """ Returns the current item view, between txtRedacText, outlineView and corkView. If folder/text view, returns None. (Because handled differently) """ if self.stack.currentIndex() == 0: return self.txtRedacText elif self.folderView == "outline": return self.outlineView elif self.folderView == "cork": return self.corkView else: return None def copy(self): if self.getCurrentItemView(): self.getCurrentItemView().copy() def cut(self): if self.getCurrentItemView(): self.getCurrentItemView().cut() def paste(self): if self.getCurrentItemView(): self.getCurrentItemView().paste() def rename(self): if self.getCurrentItemView(): self.getCurrentItemView().rename() def duplicate(self): if self.getCurrentItemView(): self.getCurrentItemView().duplicate() def delete(self): if self.getCurrentItemView(): self.getCurrentItemView().delete() def moveUp(self): if self.getCurrentItemView(): self.getCurrentItemView().moveUp() def moveDown(self): if self.getCurrentItemView(): self.getCurrentItemView().moveDown() def splitDialog(self): """ Opens a dialog to split selected items. """ if self.getCurrentItemView() == self.txtRedacText: # Text editor if not self.currentIndex.isValid(): return sel = self.txtRedacText.textCursor().selectedText() # selectedText uses \u2029 instead of \n, no idea why. sel = sel.replace("\u2029", "\n") splitDialog(self, [self.currentIndex], mark=sel) elif self.getCurrentItemView(): # One of the views self.getCurrentItemView().splitDialog() def splitCursor(self): """ Splits items at cursor position. If there is a selection, that selection becomes the new item's title. Call context: Only works when editing a file. """ if not self.currentIndex.isValid(): return if self.getCurrentItemView() == self.txtRedacText: c = self.txtRedacText.textCursor() title = c.selectedText() # selection can be backward pos = min(c.selectionStart(), c.selectionEnd()) item = self.currentIndex.internalPointer() item.splitAt(pos, len(title)) def merge(self): """ Merges selected items together. Call context: Multiple selection, same parent. """ if self.getCurrentItemView() == self.txtRedacText: # Text editor, nothing to merge pass elif self.getCurrentItemView(): # One of the views self.getCurrentItemView().merge() manuskript-0.10.0/manuskript/ui/editors/editorWidget_ui.py000066400000000000000000000074201354442177200237650ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'manuskript/ui/editors/editorWidget_ui.ui' # # Created by: PyQt5 UI code generator 5.5.1 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_editorWidget_ui(object): def setupUi(self, editorWidget_ui): editorWidget_ui.setObjectName("editorWidget_ui") editorWidget_ui.resize(400, 300) self.verticalLayout_2 = QtWidgets.QVBoxLayout(editorWidget_ui) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setObjectName("verticalLayout_2") self.stack = QtWidgets.QStackedWidget(editorWidget_ui) self.stack.setObjectName("stack") self.text = QtWidgets.QWidget() self.text.setObjectName("text") self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.text) self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.txtRedacText = MDEditView(self.text) self.txtRedacText.setFrameShape(QtWidgets.QFrame.NoFrame) self.txtRedacText.setObjectName("txtRedacText") self.horizontalLayout_2.addWidget(self.txtRedacText) self.stack.addWidget(self.text) self.folder = QtWidgets.QWidget() self.folder.setObjectName("folder") self.verticalLayout = QtWidgets.QVBoxLayout(self.folder) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setSpacing(0) self.verticalLayout.setObjectName("verticalLayout") self.scroll = QtWidgets.QScrollArea(self.folder) self.scroll.setAutoFillBackground(True) self.scroll.setFrameShape(QtWidgets.QFrame.NoFrame) self.scroll.setWidgetResizable(True) self.scroll.setObjectName("scroll") self.scrollAreaWidgetContents = QtWidgets.QWidget() self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 400, 300)) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.scroll.setWidget(self.scrollAreaWidgetContents) self.verticalLayout.addWidget(self.scroll) self.stack.addWidget(self.folder) self.cork = QtWidgets.QWidget() self.cork.setObjectName("cork") self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.cork) self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.corkView = corkView(self.cork) self.corkView.setFrameShape(QtWidgets.QFrame.NoFrame) self.corkView.setObjectName("corkView") self.horizontalLayout_3.addWidget(self.corkView) self.stack.addWidget(self.cork) self.outline = QtWidgets.QWidget() self.outline.setObjectName("outline") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.outline) self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) self.verticalLayout_3.setObjectName("verticalLayout_3") self.outlineView = outlineView(self.outline) self.outlineView.setFrameShape(QtWidgets.QFrame.NoFrame) self.outlineView.setObjectName("outlineView") self.verticalLayout_3.addWidget(self.outlineView) self.stack.addWidget(self.outline) self.verticalLayout_2.addWidget(self.stack) self.retranslateUi(editorWidget_ui) self.stack.setCurrentIndex(3) QtCore.QMetaObject.connectSlotsByName(editorWidget_ui) def retranslateUi(self, editorWidget_ui): _translate = QtCore.QCoreApplication.translate editorWidget_ui.setWindowTitle(_translate("editorWidget_ui", "Form")) from manuskript.ui.views.MDEditView import MDEditView from manuskript.ui.views.corkView import corkView from manuskript.ui.views.outlineView import outlineView manuskript-0.10.0/manuskript/ui/editors/editorWidget_ui.ui000066400000000000000000000107611354442177200237540ustar00rootroot00000000000000 editorWidget_ui 0 0 400 300 Form 0 0 0 0 3 0 0 0 0 QFrame::NoFrame 0 0 0 0 0 true QFrame::NoFrame true 0 0 400 300 0 0 0 0 QFrame::NoFrame 0 0 0 0 QFrame::NoFrame MDEditView QTextEdit
    manuskript.ui.views.MDEditView.h
    outlineView QTreeView
    manuskript.ui.views.outlineView.h
    corkView QListView
    manuskript.ui.views.corkView.h
    manuskript-0.10.0/manuskript/ui/editors/fullScreenEditor.py000066400000000000000000000623251354442177200241140ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import os from PyQt5.QtCore import Qt, QSize, QPoint, QRect, QEvent, QTime, QTimer from PyQt5.QtGui import QFontMetrics, QColor, QBrush, QPalette, QPainter, QPixmap, QCursor from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QFrame, QWidget, QPushButton, qApp, QStyle, QComboBox, QLabel, QScrollBar, \ QStyleOptionSlider, QHBoxLayout, QVBoxLayout, QMenu, QAction # Spell checker support from manuskript import settings from manuskript.enums import Outline from manuskript.models import outlineItem from manuskript.functions import allPaths, drawProgress from manuskript.ui.editors.locker import locker from manuskript.ui.editors.themes import findThemePath, generateTheme, setThemeEditorDatas from manuskript.ui.editors.themes import loadThemeDatas from manuskript.ui.views.MDEditView import MDEditView from manuskript.functions import Spellchecker class fullScreenEditor(QWidget): def __init__(self, index, parent=None): QWidget.__init__(self, parent) self.setAttribute(Qt.WA_DeleteOnClose, True) self._background = None self._index = index self._theme = findThemePath(settings.fullScreenTheme) self._themeDatas = loadThemeDatas(self._theme) self.setMouseTracking(True) self._geometries = {} # Text editor self.editor = MDEditView(self, index=index, spellcheck=settings.spellcheck, highlighting=True, dict=settings.dict) self.editor.setFrameStyle(QFrame.NoFrame) self.editor.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.editor.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.editor.installEventFilter(self) self.editor.setMouseTracking(True) self.editor.setVerticalScrollBar(myScrollBar()) self.scrollBar = self.editor.verticalScrollBar() self.scrollBar.setParent(self) # Top Panel self.topPanel = myPanel(parent=self) # self.topPanel.layout().addStretch(1) # Spell checking if Spellchecker.isInstalled(): self.btnSpellCheck = QPushButton(self) self.btnSpellCheck.setFlat(True) self.btnSpellCheck.setIcon(QIcon.fromTheme("tools-check-spelling")) self.btnSpellCheck.setCheckable(True) self.btnSpellCheck.setChecked(self.editor.spellcheck) self.btnSpellCheck.toggled.connect(self.editor.toggleSpellcheck) else: self.btnSpellCheck = None # Navigation Buttons self.btnPrevious = QPushButton(self) self.btnPrevious.setFlat(True) self.btnPrevious.setIcon(QIcon.fromTheme("arrow-left")) self.btnPrevious.clicked.connect(self.switchPreviousItem) self.btnNext = QPushButton(self) self.btnNext.setFlat(True) self.btnNext.setIcon(QIcon.fromTheme("arrow-right")) self.btnNext.clicked.connect(self.switchNextItem) self.btnNew = QPushButton(self) self.btnNew.setFlat(True) self.btnNew.setIcon(QIcon.fromTheme("document-new")) self.btnNew.clicked.connect(self.createNewText) # Path and New Text Buttons self.wPath = myPath(self) # Close self.btnClose = QPushButton(self) self.btnClose.setIcon(qApp.style().standardIcon(QStyle.SP_DialogCloseButton)) self.btnClose.clicked.connect(self.leaveFullscreen) self.btnClose.setFlat(True) # Top panel Layout if self.btnSpellCheck: self.topPanel.layout().addWidget(self.btnSpellCheck) self.topPanel.layout().addSpacing(15) self.topPanel.layout().addWidget(self.btnPrevious) self.topPanel.layout().addWidget(self.btnNext) self.topPanel.layout().addWidget(self.btnNew) self.topPanel.layout().addStretch(1) self.topPanel.layout().addWidget(self.wPath) self.topPanel.layout().addStretch(1) self.topPanel.layout().addWidget(self.btnClose) self.updateTopBar() # Left Panel self._locked = False self.leftPanel = myPanel(vertical=True, parent=self) self.locker = locker(self) self.locker.lockChanged.connect(self.setLocked) self.leftPanel.layout().addWidget(self.locker) # Bottom Panel self.bottomPanel = myPanel(parent=self) self.bottomPanel.layout().addSpacing(24) self.lstThemes = QComboBox(self) self.lstThemes.setAttribute(Qt.WA_TranslucentBackground) paths = allPaths("resources/themes") for p in paths: lst = [i for i in os.listdir(p) if os.path.splitext(i)[1] == ".theme"] for t in lst: themeIni = os.path.join(p, t) name = loadThemeDatas(themeIni)["Name"] # self.lstThemes.addItem(os.path.splitext(t)[0]) self.lstThemes.addItem(name) self.lstThemes.setItemData(self.lstThemes.count()-1, os.path.splitext(t)[0]) self.lstThemes.setCurrentIndex(self.lstThemes.findData(settings.fullScreenTheme)) # self.lstThemes.setCurrentText(settings.fullScreenTheme) self.lstThemes.currentTextChanged.connect(self.setTheme) self.lstThemes.setMaximumSize(QSize(300, QFontMetrics(qApp.font()).height())) themeLabel = QLabel(self.tr("Theme:"), self) self.bottomPanel.layout().addWidget(themeLabel) self.bottomPanel.layout().addWidget(self.lstThemes) self.bottomPanel.layout().addStretch(1) self.lblProgress = QLabel(self) self.lblProgress.setMaximumSize(QSize(200, 14)) self.lblProgress.setMinimumSize(QSize(100, 14)) self.lblWC = QLabel(self) self.lblClock = myClockLabel(self) self.bottomPanel.layout().addWidget(self.lblWC) self.bottomPanel.layout().addWidget(self.lblProgress) self.bottomPanel.layout().addSpacing(15) self.bottomPanel.layout().addWidget(self.lblClock) self.updateStatusBar() self.bottomPanel.layout().addSpacing(24) # Add Widget Settings if self.btnSpellCheck: self.topPanel.addWidgetSetting(self.tr("Spellcheck"), 'top-spellcheck', (self.btnSpellCheck, )) self.topPanel.addWidgetSetting(self.tr("Navigation"), 'top-navigation', (self.btnPrevious, self.btnNext)) self.topPanel.addWidgetSetting(self.tr("New Text"), 'top-new-doc', (self.btnNew, )) self.topPanel.addWidgetSetting(self.tr("Title"), 'top-title', (self.wPath, )) self.topPanel.addSetting(self.tr("Title: Show Full Path"), 'title-show-full-path', True) self.topPanel.setSettingCallback('title-show-full-path', lambda var, val: self.updateTopBar()) self.bottomPanel.addWidgetSetting(self.tr("Theme selector"), 'bottom-theme', (self.lstThemes, themeLabel)) self.bottomPanel.addWidgetSetting(self.tr("Word count"), 'bottom-wc', (self.lblWC, )) self.bottomPanel.addWidgetSetting(self.tr("Progress"), 'bottom-progress', (self.lblProgress, )) self.bottomPanel.addSetting(self.tr("Progress: Auto Show/Hide"), 'progress-auto-show', True) self.bottomPanel.addWidgetSetting(self.tr("Clock"), 'bottom-clock', (self.lblClock, )) self.bottomPanel.addSetting(self.tr("Clock: Show Seconds"), 'clock-show-seconds', True) self.bottomPanel.setAutoHideVariable('autohide-bottom') self.topPanel.setAutoHideVariable('autohide-top') self.leftPanel.setAutoHideVariable('autohide-left') # Connection self._index.model().dataChanged.connect(self.dataChanged) # self.updateTheme() self.showFullScreen() # self.showMaximized() # self.show() def __del__(self): # print("Leaving fullScreenEditor via Destructor event", flush=True) self.showNormal() self.close() def leaveFullscreen(self): self.showNormal() self.close() def setLocked(self, val): self._locked = val self.btnClose.setVisible(not val) def setTheme(self, themeName): themeName = self.lstThemes.currentData() settings.fullScreenTheme = themeName self._theme = findThemePath(themeName) self._themeDatas = loadThemeDatas(self._theme) self.updateTheme() def updateTheme(self): # Reinit stored geometries for hiding widgets self._geometries = {} rect = self.geometry() self._background = generateTheme(self._themeDatas, rect) setThemeEditorDatas(self.editor, self._themeDatas, self._background, rect) # Colors if self._themeDatas["Foreground/Color"] == self._themeDatas["Background/Color"] or \ self._themeDatas["Foreground/Opacity"] < 5: self._fgcolor = QColor(self._themeDatas["Text/Color"]) self._bgcolor = QColor(self._themeDatas["Background/Color"]) else: self._bgcolor = QColor(self._themeDatas["Foreground/Color"]) self._bgcolor.setAlpha(self._themeDatas["Foreground/Opacity"] * 255 / 100) self._fgcolor = QColor(self._themeDatas["Text/Color"]) if self._themeDatas["Text/Color"] == self._themeDatas["Foreground/Color"]: self._fgcolor = QColor(self._themeDatas["Background/Color"]) # ScrollBar r = self.editor.geometry() w = qApp.style().pixelMetric(QStyle.PM_ScrollBarExtent) r.setWidth(w) r.moveRight(rect.right() - rect.left()) self.scrollBar.setGeometry(r) # self.scrollBar.setVisible(False) self.hideWidget(self.scrollBar) p = self.scrollBar.palette() b = QBrush(self._background.copy(self.scrollBar.geometry())) p.setBrush(QPalette.Base, b) self.scrollBar.setPalette(p) self.scrollBar.setColor(self._bgcolor) # Left Panel r = self.locker.geometry() r.moveTopLeft(QPoint( 0, self.geometry().height() / 2 - r.height() / 2 )) self.leftPanel.setGeometry(r) self.hideWidget(self.leftPanel) self.leftPanel.setColor(self._bgcolor) # Top / Bottom Panels r = QRect(0, 0, 0, 24) r.setWidth(rect.width()) # r.moveLeft(rect.center().x() - r.width() / 2) self.topPanel.setGeometry(r) # self.topPanel.setVisible(False) self.hideWidget(self.topPanel) r.moveBottom(rect.bottom() - rect.top()) self.bottomPanel.setGeometry(r) # self.bottomPanel.setVisible(False) self.hideWidget(self.bottomPanel) self.topPanel.setColor(self._bgcolor) self.bottomPanel.setColor(self._bgcolor) # Lst theme # p = self.lstThemes.palette() p = self.palette() p.setBrush(QPalette.Button, self._bgcolor) p.setBrush(QPalette.ButtonText, self._fgcolor) p.setBrush(QPalette.WindowText, self._fgcolor) for panel in (self.bottomPanel, self.topPanel, self.leftPanel): for i in range(panel.layout().count()): item = panel.layout().itemAt(i) if item.widget(): item.widget().setPalette(p) # self.lstThemes.setPalette(p) # self.lblWC.setPalette(p) self.update() self.editor.centerCursor() def paintEvent(self, event): if self._background: painter = QPainter(self) painter.setClipRegion(event.region()) painter.drawPixmap(event.rect(), self._background, event.rect()) painter.end() def resizeEvent(self, event): self.updateTheme() def keyPressEvent(self, event): if event.key() in [Qt.Key_Escape, Qt.Key_F11] and \ not self._locked: # print("Leaving fullScreenEditor via keyPressEvent", flush=True) self.showNormal() self.close() elif (event.modifiers() & Qt.AltModifier) and \ event.key() in [Qt.Key_PageUp, Qt.Key_PageDown, Qt.Key_Left, Qt.Key_Right]: if event.key() in [Qt.Key_PageUp, Qt.Key_Left]: success = self.switchPreviousItem() if event.key() in [Qt.Key_PageDown, Qt.Key_Right]: success = self.switchNextItem() if not success: QWidget.keyPressEvent(self, event) else: QWidget.keyPressEvent(self, event) def mouseMoveEvent(self, event): r = self.geometry() for w in [self.scrollBar, self.topPanel, self.bottomPanel, self.leftPanel]: # w.setVisible(w.geometry().contains(event.pos())) if self._geometries[w].contains(event.pos()): self.showWidget(w) else: self.hideWidget(w) def hideWidget(self, widget): if widget not in self._geometries: self._geometries[widget] = widget.geometry() if hasattr(widget, "_autoHide") and not widget._autoHide: return # Hides widget in the bottom right corner widget.move(self.geometry().bottomRight() + QPoint(1, 1)) def showWidget(self, widget): if widget in self._geometries: widget.move(self._geometries[widget].topLeft()) def eventFilter(self, obj, event): if obj == self.editor and event.type() == QEvent.Enter: for w in [self.scrollBar, self.topPanel, self.bottomPanel, self.leftPanel]: # w.setVisible(False) self.hideWidget(w) return QWidget.eventFilter(self, obj, event) def dataChanged(self, topLeft, bottomRight): # This is called sometimes after self has been destroyed. Don't know why. if not self or not self._index: return if topLeft.row() <= self._index.row() <= bottomRight.row(): self.updateStatusBar() def updateTopBar(self): item = self._index.internalPointer() previousItem = self.previousTextItem(item) nextItem = self.nextTextItem(item) self.btnPrevious.setEnabled(previousItem is not None) self.btnNext.setEnabled(nextItem is not None) self.wPath.setItem(item) def updateStatusBar(self): if self._index: item = self._index.internalPointer() wc = item.data(Outline.wordCount) goal = item.data(Outline.goal) pg = item.data(Outline.goalPercentage) if goal: if settings.fullscreenSettings.get("progress-auto-show", True): self.lblProgress.show() self.lblWC.setText(self.tr("{} words / {}").format(wc, goal)) else: if settings.fullscreenSettings.get("progress-auto-show", True): self.lblProgress.hide() self.lblWC.setText(self.tr("{} words").format(wc)) pg = 0 rect = self.lblProgress.geometry() rect = QRect(QPoint(0, 0), rect.size()) self.px = QPixmap(rect.size()) self.px.fill(Qt.transparent) p = QPainter(self.px) drawProgress(p, rect, pg, 2) p.end() self.lblProgress.setPixmap(self.px) self.locker.setWordCount(wc) # If there's a goal, then we update the locker target's number of word accordingly # (also if there is a word count, we deduce it. if goal and not self.locker.isLocked(): if wc and goal - wc > 0: self.locker.spnWordTarget.setValue(goal - wc) elif not wc: self.locker.spnWordTarget.setValue(goal) def setCurrentModelIndex(self, index): self._index = index self.editor.setCurrentModelIndex(index) self.updateTopBar() self.updateStatusBar() def switchPreviousItem(self): item = self._index.internalPointer() previousItem = self.previousTextItem(item) if previousItem: self.setCurrentModelIndex(previousItem.index()) return True return False def switchNextItem(self): item = self._index.internalPointer() nextItem = self.nextTextItem(item) if nextItem: self.setCurrentModelIndex(nextItem.index()) return True return False def switchToItem(self, item): item = self.firstTextItem(item) if item: self.setCurrentModelIndex(item.index()) def createNewText(self): item = self._index.internalPointer() newItem = outlineItem(title=qApp.translate("outlineBasics", "New"), _type=settings.defaultTextType) self._index.model().insertItem(newItem, item.row() + 1, item.parent().index()) self.setCurrentModelIndex(newItem.index()) def previousModelItem(self, item): parent = item.parent() if not parent: # Root has no sibling return None row = parent.childItems.index(item) if row > 0: return parent.child(row - 1) return self.previousModelItem(parent) def nextModelItem(self, item): parent = item.parent() if not parent: # Root has no sibling return None row = parent.childItems.index(item) if row + 1 < parent.childCount(): return parent.child(row + 1) return self.nextModelItem(parent) def previousTextItem(self, item): previous = self.previousModelItem(item) while previous: last = self.lastTextItem(previous) if last: return last previous = self.previousModelItem(previous) return None def nextTextItem(self, item): if item.isFolder() and item.childCount() > 0: next = item.child(0) else: next = self.nextModelItem(item) while next: first = self.firstTextItem(next) if first: return first next = self.nextModelItem(next) return None def firstTextItem(self, item): if item.isText(): return item for child in item.children(): first = self.firstTextItem(child) if first: return first return None def lastTextItem(self, item): if item.isText(): return item for child in reversed(item.children()): last = self.lastTextItem(child) if last: return last return None class myScrollBar(QScrollBar): def __init__(self, color=Qt.white, parent=None): QScrollBar.__init__(self, parent) self._color = color # self.setAttribute(Qt.WA_TranslucentBackground) self.timer = QTimer() self.timer.setInterval(500) self.timer.setSingleShot(True) self.timer.timeout.connect(self.hide) self.valueChanged.connect(lambda v: self.timer.start()) self.valueChanged.connect(lambda: self.parent().showWidget(self)) self.rangeChanged.connect(self.rangeHasChanged) def hide(self): self.parent().hideWidget(self) def setColor(self, color): self._color = color def rangeHasChanged(self, min, max): """ Adds viewport height to scrollbar max so that we can center cursor on screen. """ if settings.textEditor["alwaysCenter"]: self.blockSignals(True) self.setMaximum(max + self.parent().height()) self.blockSignals(False) def paintEvent(self, event): opt = QStyleOptionSlider() self.initStyleOption(opt) style = qApp.style() painter = QPainter(self) # Background (Necessary with Qt 5.2 it seems, not with 5.4) # painter.save() # painter.setPen(Qt.NoPen) # painter.setBrush(self.palette().brush(QPalette.Base)) # painter.drawRect(event.rect()) # painter.restore() # slider r = style.subControlRect(style.CC_ScrollBar, opt, style.SC_ScrollBarSlider) painter.fillRect(r, self._color) painter.end() class myPanel(QWidget): def __init__(self, color=Qt.white, vertical=False, parent=None): QWidget.__init__(self, parent) self._color = color self.show() self.setAttribute(Qt.WA_TranslucentBackground) self._autoHide = True self._m = None self._autoHideVar = None self._settings = [] self._callbacks = {} if not vertical: self.setLayout(QHBoxLayout()) else: self.setLayout(QVBoxLayout()) self.layout().setContentsMargins(0, 0, 0, 0) def setColor(self, color): self._color = color def paintEvent(self, event): r = event.rect() painter = QPainter(self) painter.fillRect(r, self._color) def _setConfig(self, config_name, value): settings.fullscreenSettings[config_name] = value if config_name in self._callbacks: self._callbacks[config_name](config_name, value) def _setSettingValue(self, setting, value): if setting[2]: for w in setting[2]: w.show() if value else w.hide() self._setConfig(setting[1], value) def setAutoHide(self, value): self._autoHide = value if self._autoHideVar: self._setConfig(self._autoHideVar, value) def setAutoHideVariable(self, name): if name: self.setAutoHide(settings.fullscreenSettings[name]) self._autoHideVar = name def addWidgetSetting(self, label, config_name, widgets): setting = (label, config_name, widgets) self._settings.append(setting) if settings.fullscreenSettings.get(config_name, None) is not None: self._setSettingValue(setting, settings.fullscreenSettings[config_name]) def addSetting(self, label, config_name, default=True): if settings.fullscreenSettings.get(config_name, None) is None: self._setConfig(config_name, default) self.addWidgetSetting(label, config_name, None) def setSettingCallback(self, config_name, callback): self._callbacks[config_name] = callback def mouseReleaseEvent(self, event): if event.button() == Qt.RightButton: if self._m: self._m.deleteLater() m = QMenu() a = QAction(self.tr("Auto-hide"), m) a.setCheckable(True) a.setChecked(self._autoHide) a.toggled.connect(self.setAutoHide) m.addAction(a) for item in self._settings: a = QAction(item[0], m) a.setCheckable(True) if item[2]: a.setChecked(item[2][0].isVisible()) else: a.setChecked(settings.fullscreenSettings[item[1]]) def gen_cb(setting): return lambda v: self._setSettingValue(setting, v) a.toggled.connect(gen_cb(item)) m.addAction(a) m.popup(self.mapToGlobal(event.pos())) self._m = m class myPath(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self.editor = parent self.setAttribute(Qt.WA_TranslucentBackground) self.setLayout(QHBoxLayout()) self.layout().setContentsMargins(0, 0, 0, 0) def setItem(self, item): self._item = item path = self.getItemPath(item) layout = self.layout() while layout.count() > 0: li = layout.takeAt(0) w = li.widget() w.deleteLater() def gen_cb(i): return lambda: self.popupPath(i) # Skip Root for i in path[1:]: if not settings.fullscreenSettings.get("title-show-full-path", True) and \ i.isFolder(): continue btn = QPushButton(i.title(), self) btn.setFlat(True) btn.clicked.connect(gen_cb(i)) self.layout().addWidget(btn) if i.isFolder(): lblSeparator = QLabel(" > ", self) #lblSeparator = QLabel(self) #lblSeparator.setPixmap(QIcon.fromTheme("view-list-tree").pixmap(24,24)) self.layout().addWidget(lblSeparator) def popupPath(self, item): m = QMenu() def gen_cb(i): return lambda: self.editor.switchToItem(i) for i in item.siblings(): a = QAction(i.title(), m) if i == item: a.setIcon(QIcon.fromTheme("stock_yes")) a.setEnabled(False) elif self.editor.firstTextItem(i) is None: a.setEnabled(False) else: a.triggered.connect(gen_cb(i)) m.addAction(a) m.popup(QCursor.pos()) self._m = m def getItemPath(self, item): path = [item] parent = item.parent() while parent: path.insert(0, parent) parent = parent.parent() return path class myClockLabel(QLabel): def __init__(self, parent=None): QLabel.__init__(self, parent) self.updateClock() self.timer = QTimer() self.timer.setInterval(1000) self.timer.timeout.connect(self.updateClock) self.timer.start() def updateClock(self): time = QTime.currentTime() if settings.fullscreenSettings.get("clock-show-seconds", True): timeStr = time.toString("hh:mm:ss") else: timeStr = time.toString("hh:mm") self.setText(timeStr) manuskript-0.10.0/manuskript/ui/editors/locker.py000066400000000000000000000070021354442177200221110ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import pyqtSignal, QTimer from PyQt5.QtWidgets import QWidget, qApp from manuskript.ui.editors.locker_ui import Ui_locker class locker(QWidget, Ui_locker): locked = pyqtSignal() unlocked = pyqtSignal() lockChanged = pyqtSignal(bool) def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) self._btnText = None self._words = None self._target = None self._blackout = [] self.timer = QTimer(self) self.timer.setSingleShot(True) self.timer.timeout.connect(self.unlock) self.timer.stop() self.timerSec = QTimer(self) self.timerSec.setInterval(500) self.timerSec.timeout.connect(self.updateBtnText) self.timerSec.stop() self.rbtnWordTarget.toggled.connect(self.spnWordTarget.setVisible) self.rbtnTimeTarget.toggled.connect(self.spnTimeTarget.setVisible) self.rbtnWordTarget.setChecked(True) self.spnTimeTarget.setVisible(False) self.btnLock.clicked.connect(self.lock) def lock(self): # Block others screens desktop = qApp.desktop() self._blackout.clear() if desktop.screenCount() > 1: for d in range(desktop.screenCount()): if desktop.screenNumber(self) != d: w = QWidget() w.setStyleSheet("background: black;") w.move(desktop.screenGeometry(d).topLeft()) w.showFullScreen() self._blackout.append(w) if self.rbtnWordTarget.isChecked(): self._target = self._words + self.spnWordTarget.value() elif self.rbtnTimeTarget.isChecked(): self.timer.setInterval(self.spnTimeTarget.value() * 1000 * 60) self.timer.start() self.timerSec.start() self.updateBtnText() self.setEnabled(False) self.locked.emit() self.lockChanged.emit(True) def unlock(self): # Remove black screens self._blackout.clear() self.setEnabled(True) self.btnLock.setText(self._btnText) self.timer.stop() self.timerSec.stop() self._target = None self.unlocked.emit() self.lockChanged.emit(False) def isLocked(self): return not self.isEnabled() def setWordCount(self, wc): self._words = wc if self.isLocked(): self.updateBtnText() if self._target and self._words >= self._target: self.unlock() def updateBtnText(self): if not self._btnText: self._btnText = self.btnLock.text() # Time locked if self.timer.remainingTime() != -1: t = self.timer.remainingTime() t = int(t / 1000) if t > 60 * 60: text = self.tr("~{} h.").format(str(int(t / 60 / 60))) elif t > 60 * 5: text = self.tr("~{} mn.").format(str(int(t / 60))) elif t > 60: mn = int(t / 60) sec = t - 60 * mn text = self.tr("{}:{}").format(str(mn), str(sec)) else: text = self.tr("{} s.").format(str(t)) self.btnLock.setText(self.tr("{} remaining").format( text)) # Word locked elif self._target is not None: self.btnLock.setText(self.tr("{} words remaining").format( self._target - self._words)) manuskript-0.10.0/manuskript/ui/editors/locker_ui.py000066400000000000000000000050271354442177200226130ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'manuskript/ui/editors/locker_ui.ui' # # Created: Tue Jul 7 17:57:16 2015 # by: PyQt5 UI code generator 5.2.1 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_locker(object): def setupUi(self, locker): locker.setObjectName("locker") locker.resize(157, 155) self.verticalLayout = QtWidgets.QVBoxLayout(locker) self.verticalLayout.setObjectName("verticalLayout") self.label = QtWidgets.QLabel(locker) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.label.setFont(font) self.label.setObjectName("label") self.verticalLayout.addWidget(self.label) self.rbtnWordTarget = QtWidgets.QRadioButton(locker) self.rbtnWordTarget.setObjectName("rbtnWordTarget") self.verticalLayout.addWidget(self.rbtnWordTarget) self.rbtnTimeTarget = QtWidgets.QRadioButton(locker) self.rbtnTimeTarget.setObjectName("rbtnTimeTarget") self.verticalLayout.addWidget(self.rbtnTimeTarget) self.spnWordTarget = QtWidgets.QSpinBox(locker) self.spnWordTarget.setMinimum(1) self.spnWordTarget.setMaximum(99999) self.spnWordTarget.setProperty("value", 500) self.spnWordTarget.setObjectName("spnWordTarget") self.verticalLayout.addWidget(self.spnWordTarget) self.spnTimeTarget = QtWidgets.QSpinBox(locker) self.spnTimeTarget.setMinimum(1) self.spnTimeTarget.setMaximum(9999) self.spnTimeTarget.setProperty("value", 5) self.spnTimeTarget.setObjectName("spnTimeTarget") self.verticalLayout.addWidget(self.spnTimeTarget) self.btnLock = QtWidgets.QPushButton(locker) self.btnLock.setObjectName("btnLock") self.verticalLayout.addWidget(self.btnLock) self.retranslateUi(locker) QtCore.QMetaObject.connectSlotsByName(locker) def retranslateUi(self, locker): _translate = QtCore.QCoreApplication.translate locker.setWindowTitle(_translate("locker", "Form")) self.label.setText(_translate("locker", "Lock screen:")) self.rbtnWordTarget.setText(_translate("locker", "Word target")) self.rbtnTimeTarget.setText(_translate("locker", "Time target")) self.spnWordTarget.setSuffix(_translate("locker", " words")) self.spnTimeTarget.setSuffix(_translate("locker", " minutes")) self.btnLock.setText(_translate("locker", "Lock !")) manuskript-0.10.0/manuskript/ui/editors/locker_ui.ui000066400000000000000000000037121354442177200225770ustar00rootroot00000000000000 locker 0 0 157 155 Form 75 true Lock screen: Word target Time target words 1 99999 500 minutes 1 9999 5 Lock ! manuskript-0.10.0/manuskript/ui/editors/mainEditor.py000066400000000000000000000337111354442177200227330ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import locale from PyQt5.QtCore import QModelIndex, QRect, QPoint from PyQt5.QtCore import Qt from PyQt5.QtGui import QPixmap, QPainter, QIcon from PyQt5.QtWidgets import QWidget, qApp from manuskript import settings from manuskript.enums import Outline from manuskript.functions import AUC, mainWindow, drawProgress, appPath, uiParse from manuskript.ui import style from manuskript.ui.editors.editorWidget import editorWidget from manuskript.ui.editors.fullScreenEditor import fullScreenEditor from manuskript.ui.editors.mainEditor_ui import Ui_mainEditor try: locale.setlocale(locale.LC_ALL, '') except: pass class mainEditor(QWidget, Ui_mainEditor): """ `mainEditor` is responsible for opening `outlineItem`s and offering information and commands about those `outlineItem`s to the used. It contains two main elements: 1. A `tabSplitter`, which can open any number of `outlineItem`s either in tabs (in `QTabWidget`) and/or in split views (children `tabSplitter`s). 2. An horizontal layout contain a number of buttons and information: - Go up button - Select folder view: either "text", "cork" or "outline" (see `editorWidget`) - Zoom slider for "cork" view - Label showing stats about displayed `outlineItem` - Fullscreen button `mainEditor` is responsible for opening indexes, propagating event to relevant views, opening and closing tabs, etc. +---------------------------| mainEditor |--------------------------------+ | | | +--------| tabSplitter |----------------------------------------------+ | | | +----------| tabSplitter |---------+ | | | | | | | | | | +-----| editorWidget |----+ | +-------| editorWidget |-----+ | | | | | | | | | | | | | | | +-------------------------+ | +----------------------------+ | | | | | | | | | | | +-----| editorWidget |----+ | +-------| editorWidget |-----+ | | | | | | | | | | | | | | | +-------------------------+ | +----------------------------+ | | | | | +----------------------------------+ | | | +---------------------------------------------------------------------+ | | | +-------------------------------------------------------------------------+ | ## ## ## ## toolbar ## ## | +-------------------------------------------------------------------------+ """ def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) self._updating = False self.mw = mainWindow() # Connections -------------------------------------------------------- self.btnGoUp.clicked.connect(self.goToParentItem) self.sldCorkSizeFactor.valueChanged.connect( self.setCorkSizeFactor, AUC) self.btnRedacFolderCork.toggled.connect( self.sldCorkSizeFactor.setVisible, AUC ) self.btnRedacFolderText.clicked.connect( lambda v: self.setFolderView("text"), AUC) self.btnRedacFolderCork.clicked.connect( lambda v: self.setFolderView("cork"), AUC) self.btnRedacFolderOutline.clicked.connect( lambda v: self.setFolderView("outline"), AUC) self.btnRedacFullscreen.clicked.connect( self.showFullScreen, AUC) # self.tab.setDocumentMode(False) # Bug in Qt < 5.5: doesn't always load icons from custom theme. # Cf. https://github.com/qtproject/qtbase/commit/a8621a3f85e64f1252a80ae81a6e22554f7b3f44 # Since those are important, we provide fallback. self.btnRedacFolderCork.setIcon(QIcon.fromTheme("view-cards", QIcon(appPath("icons/NumixMsk/256x256/actions/view-cards.svg")))) self.btnRedacFolderOutline.setIcon(QIcon.fromTheme("view-outline", QIcon(appPath("icons/NumixMsk/256x256/actions/view-outline.svg")))) self.btnRedacFolderText.setIcon(QIcon.fromTheme("view-text", QIcon(appPath("icons/NumixMsk/256x256/actions/view-text.svg")))) for btn in [self.btnRedacFolderCork, self.btnRedacFolderText, self.btnRedacFolderOutline]: btn.setToolTip(btn.text()) btn.setText("") ############################################################################### # TABS ############################################################################### def currentTabWidget(self): """Returns the tabSplitter that has focus.""" ts = self.tabSplitter while ts: if ts.focusTab == 1: return ts.tab else: ts = ts.secondTab # No tabSplitter has focus, something is strange. # But probably not important. # Let's return self.tabSplitter.tab anyway. return self.tabSplitter.tab def currentEditor(self, tabWidget=None): if tabWidget is None: tabWidget = self.currentTabWidget() return tabWidget.currentWidget() # return self.tab.currentWidget() def tabChanged(self, index=QModelIndex()): if self.currentEditor(): index = self.currentEditor().currentIndex view = self.currentEditor().folderView self.updateFolderViewButtons(view) else: index = QModelIndex() self.updateMainTreeView(index) self.updateStats() self.updateThingsVisible(index) def updateMainTreeView(self, index): self._updating = True self.mw.treeRedacOutline.setCurrentIndex(index) self._updating = False def closeAllTabs(self): for ts in self.allTabSplitters(): while(ts.tab.count()): ts.closeTab(0) for ts in reversed(self.allTabSplitters()): ts.closeSplit() def allTabs(self, tabWidget=None): """Returns all the tabs from the given tabWidget. If tabWidget is None, from the current tabWidget.""" if tabWidget is None: tabWidget = self.currentTabWidget() return [tabWidget.widget(i) for i in range(tabWidget.count())] def allAllTabs(self): """Returns a list of all tabs, from all tabWidgets.""" r = [] for ts in self.allTabSplitters(): r.extend(self.allTabs(ts.tab)) return r def allTabSplitters(self): r = [] ts = self.tabSplitter while ts: r.append(ts) ts = ts.secondTab return r ############################################################################### # SELECTION AND UPDATES ############################################################################### def selectionChanged(self): if self._updating: return # This might be called during a drag n drop operation, or while deleting # items. If so, we don't want to do anything. if not self.mw.mdlOutline._removingRows: if len(self.mw.treeRedacOutline.selectionModel(). selection().indexes()) == 0: idx = QModelIndex() else: idx = self.mw.treeRedacOutline.currentIndex() self.setCurrentModelIndex(idx) self.updateThingsVisible(idx) def openIndexes(self, indexes, newTab=False): for i in indexes: self.setCurrentModelIndex(i, newTab) def goToParentItem(self): if self.currentEditor(): idx = self.currentEditor().currentIndex self.mw.treeRedacOutline.setCurrentIndex(idx.parent()) def setCurrentModelIndex(self, index, newTab=False, tabWidget=None): title = self.getIndexTitle(index) if tabWidget is None: tabWidget = self.currentTabWidget() # Checking if tab is already opened for w in self.allTabs(tabWidget): if w.currentIndex == index: tabWidget.setCurrentWidget(w) return if qApp.keyboardModifiers() & Qt.ControlModifier: newTab = True if newTab or not tabWidget.count(): editor = editorWidget(self) editor.setCurrentModelIndex(index) editor._tabWidget = tabWidget i = tabWidget.addTab(editor, editor.ellidedTitle(title)) tabWidget.setTabToolTip(i, title) tabWidget.setCurrentIndex(tabWidget.count() - 1) else: self.currentEditor(tabWidget).setCurrentModelIndex(index) #tabWidget.setTabText(tabWidget.currentIndex(), title) def updateTargets(self): """Updates all tabSplitter that are targets. This is called from editorWidget.""" index = self.sender().currentIndex() for ts in self.allTabSplitters(): if ts.isTarget: self.updateMainTreeView(index) self.setCurrentModelIndex(index, tabWidget=ts.tab) self.updateThingsVisible(index) def getIndexTitle(self, index): if not index.isValid(): title = self.tr("Root") else: title = index.internalPointer().title() return title ############################################################################### # FUNCTIONS FOR MENU ACCESS ############################################################################### def copy(self): self.currentEditor().copy() def cut(self): self.currentEditor().cut() def paste(self): self.currentEditor().paste() def rename(self): self.currentEditor().rename() def duplicate(self): self.currentEditor().duplicate() def delete(self): self.currentEditor().delete() def moveUp(self): self.currentEditor().moveUp() def moveDown(self): self.currentEditor().moveDown() def splitDialog(self): self.currentEditor().splitDialog() def splitCursor(self): self.currentEditor().splitCursor() def merge(self): self.currentEditor().merge() ############################################################################### # UI ############################################################################### def updateThingsVisible(self, index): if index.isValid(): visible = index.internalPointer().isFolder() else: visible = True self.btnRedacFolderText.setVisible(visible) self.btnRedacFolderCork.setVisible(visible) self.btnRedacFolderOutline.setVisible(visible) self.sldCorkSizeFactor.setVisible(visible and self.btnRedacFolderCork.isChecked()) self.btnRedacFullscreen.setVisible(not visible) def updateFolderViewButtons(self, view): if view == "text": self.btnRedacFolderText.setChecked(True) elif view == "cork": self.btnRedacFolderCork.setChecked(True) elif view == "outline": self.btnRedacFolderOutline.setChecked(True) def updateStats(self): if not self.currentEditor(): return index = self.currentEditor().currentIndex if index.isValid(): item = index.internalPointer() else: item = self.mw.mdlOutline.rootItem if not item: item = self.mw.mdlOutline.rootItem wc = item.data(Outline.wordCount) goal = item.data(Outline.goal) progress = item.data(Outline.goalPercentage) goal = uiParse(goal, None, int, lambda x: x>=0) progress = uiParse(progress, 0.0, float) if not wc: wc = 0 if goal: self.lblRedacProgress.show() rect = self.lblRedacProgress.geometry() rect = QRect(QPoint(0, 0), rect.size()) self.px = QPixmap(rect.size()) self.px.fill(Qt.transparent) p = QPainter(self.px) drawProgress(p, rect, progress, 2) del p self.lblRedacProgress.setPixmap(self.px) self.lblRedacWC.setText(self.tr("{} words / {} ").format( locale.format_string("%d", wc, grouping=True), locale.format_string("%d", goal, grouping=True))) else: self.lblRedacProgress.hide() self.lblRedacWC.setText(self.tr("{} words ").format( locale.format_string("%d", wc, grouping=True))) ############################################################################### # VIEWS ############################################################################### def setFolderView(self, view): if self.currentEditor(): self.currentEditor().setFolderView(view) def setCorkSizeFactor(self, val): for w in self.allAllTabs(): w.setCorkSizeFactor(val) settings.corkSizeFactor = val def updateCorkView(self): for w in self.allAllTabs(): w.corkView.viewport().update() def updateCorkBackground(self): for w in self.allAllTabs(): w.corkView.updateBackground() def updateTreeView(self): for w in self.allAllTabs(): w.outlineView.viewport().update() def showFullScreen(self): if self.currentEditor(): self._fullScreen = fullScreenEditor(self.currentEditor().currentIndex) ############################################################################### # DICT AND STUFF LIKE THAT ############################################################################### def setDict(self, dict): print(dict) for w in self.allAllTabs(): w.setDict(dict) def toggleSpellcheck(self, val): for w in self.allAllTabs(): w.toggleSpellcheck(val) manuskript-0.10.0/manuskript/ui/editors/mainEditor_ui.py000066400000000000000000000124751354442177200234340ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'manuskript/ui/editors/mainEditor_ui.ui' # # Created by: PyQt5 UI code generator 5.5.1 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_mainEditor(object): def setupUi(self, mainEditor): mainEditor.setObjectName("mainEditor") mainEditor.resize(791, 319) self.verticalLayout = QtWidgets.QVBoxLayout(mainEditor) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setSpacing(0) self.verticalLayout.setObjectName("verticalLayout") self.tabSplitter = tabSplitter(mainEditor) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.tabSplitter.sizePolicy().hasHeightForWidth()) self.tabSplitter.setSizePolicy(sizePolicy) self.tabSplitter.setObjectName("tabSplitter") self.verticalLayout.addWidget(self.tabSplitter) self.horizontalLayout_19 = QtWidgets.QHBoxLayout() self.horizontalLayout_19.setObjectName("horizontalLayout_19") self.btnGoUp = QtWidgets.QPushButton(mainEditor) self.btnGoUp.setText("") icon = QtGui.QIcon.fromTheme("go-up") self.btnGoUp.setIcon(icon) self.btnGoUp.setFlat(True) self.btnGoUp.setObjectName("btnGoUp") self.horizontalLayout_19.addWidget(self.btnGoUp) self.btnRedacFolderText = QtWidgets.QPushButton(mainEditor) self.btnRedacFolderText.setCheckable(True) self.btnRedacFolderText.setFlat(True) self.btnRedacFolderText.setObjectName("btnRedacFolderText") self.buttonGroup = QtWidgets.QButtonGroup(mainEditor) self.buttonGroup.setObjectName("buttonGroup") self.buttonGroup.addButton(self.btnRedacFolderText) self.horizontalLayout_19.addWidget(self.btnRedacFolderText) self.btnRedacFolderCork = QtWidgets.QPushButton(mainEditor) self.btnRedacFolderCork.setCheckable(True) self.btnRedacFolderCork.setChecked(True) self.btnRedacFolderCork.setFlat(True) self.btnRedacFolderCork.setObjectName("btnRedacFolderCork") self.buttonGroup.addButton(self.btnRedacFolderCork) self.horizontalLayout_19.addWidget(self.btnRedacFolderCork) self.btnRedacFolderOutline = QtWidgets.QPushButton(mainEditor) self.btnRedacFolderOutline.setCheckable(True) self.btnRedacFolderOutline.setFlat(True) self.btnRedacFolderOutline.setObjectName("btnRedacFolderOutline") self.buttonGroup.addButton(self.btnRedacFolderOutline) self.horizontalLayout_19.addWidget(self.btnRedacFolderOutline) self.sldCorkSizeFactor = QtWidgets.QSlider(mainEditor) self.sldCorkSizeFactor.setMinimumSize(QtCore.QSize(100, 0)) self.sldCorkSizeFactor.setMaximumSize(QtCore.QSize(200, 16777215)) self.sldCorkSizeFactor.setMinimum(50) self.sldCorkSizeFactor.setMaximum(200) self.sldCorkSizeFactor.setProperty("value", 100) self.sldCorkSizeFactor.setOrientation(QtCore.Qt.Horizontal) self.sldCorkSizeFactor.setObjectName("sldCorkSizeFactor") self.horizontalLayout_19.addWidget(self.sldCorkSizeFactor) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_19.addItem(spacerItem) self.lblRedacWC = QtWidgets.QLabel(mainEditor) self.lblRedacWC.setMinimumSize(QtCore.QSize(10, 0)) self.lblRedacWC.setText("") self.lblRedacWC.setObjectName("lblRedacWC") self.horizontalLayout_19.addWidget(self.lblRedacWC) self.lblRedacProgress = QtWidgets.QLabel(mainEditor) self.lblRedacProgress.setMinimumSize(QtCore.QSize(100, 6)) self.lblRedacProgress.setMaximumSize(QtCore.QSize(200, 14)) self.lblRedacProgress.setText("") self.lblRedacProgress.setObjectName("lblRedacProgress") self.horizontalLayout_19.addWidget(self.lblRedacProgress) self.btnRedacFullscreen = QtWidgets.QPushButton(mainEditor) self.btnRedacFullscreen.setText("") icon = QtGui.QIcon.fromTheme("view-fullscreen") self.btnRedacFullscreen.setIcon(icon) self.btnRedacFullscreen.setFlat(True) self.btnRedacFullscreen.setObjectName("btnRedacFullscreen") self.horizontalLayout_19.addWidget(self.btnRedacFullscreen) self.verticalLayout.addLayout(self.horizontalLayout_19) self.retranslateUi(mainEditor) QtCore.QMetaObject.connectSlotsByName(mainEditor) def retranslateUi(self, mainEditor): _translate = QtCore.QCoreApplication.translate mainEditor.setWindowTitle(_translate("mainEditor", "Form")) self.btnGoUp.setToolTip(_translate("mainEditor", "Go to parent item")) self.btnGoUp.setShortcut(_translate("mainEditor", "Alt+Up")) self.btnRedacFolderText.setText(_translate("mainEditor", "Text")) self.btnRedacFolderCork.setText(_translate("mainEditor", "Index cards")) self.btnRedacFolderOutline.setText(_translate("mainEditor", "Outline")) self.btnRedacFullscreen.setShortcut(_translate("mainEditor", "F11")) from manuskript.ui.editors.tabSplitter import tabSplitter manuskript-0.10.0/manuskript/ui/editors/mainEditor_ui.ui000066400000000000000000000132151354442177200234120ustar00rootroot00000000000000 mainEditor 0 0 791 319 Form 0 0 0 0 0 0 0 Go to parent item .. Alt+Up true Text true true buttonGroup Index cards true true true buttonGroup Outline true true buttonGroup 100 0 200 16777215 50 200 100 Qt::Horizontal Qt::Horizontal 40 20 10 0 100 6 200 14 ../../../../../../../../.designer/backup../../../../../../../../.designer/backup F11 true tabSplitter QWidget
    manuskript.ui.editors.tabSplitter.h
    1
    manuskript-0.10.0/manuskript/ui/editors/tabSplitter.py000066400000000000000000000220701354442177200231310ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import locale from PyQt5.QtCore import QModelIndex, QRect, QPoint, Qt, QObject, QSize from PyQt5.QtGui import QIcon, QPalette from PyQt5.QtWidgets import QWidget, QPushButton, qApp from manuskript.functions import mainWindow, appPath from manuskript.ui import style from manuskript.ui.editors.tabSplitter_ui import Ui_tabSplitter class tabSplitter(QWidget, Ui_tabSplitter): """ `tabSplitter` is used to have multiple `outlineItem`s open, either in tabs and/or in split views. Each tab contains an `editorWidget` which is responsible for showing one single `outlineItem` in several ways. `tabSplitter` is managed mainly through the `mainEditor` which is responsible for opening indexes and such. `tabSplitter` main widget is a `QSplitter` named `self.splitter`. It contains one `QTabWidget` called `self.tab`. A second `tabSplitter` can be loaded through `self.split` in `self.splitter`. That way, a single `tabSplitter` can split indefinitely. `tabSplitter` also has two buttons: 1. `self.btnSplit`: used to split and unsplit 2. `self.btnTarget`: toggles whether `self.tab` is a target to open any selected outlineItem in any other views. """ def __init__(self, parent=None, mainEditor=None): QWidget.__init__(self, parent) self.setupUi(self) # try: # self.tab.setTabBarAutoHide(True) # except AttributeError: # print("Info: install Qt 5.4 or higher to use tab bar auto-hide in editor.") # Button to split self.btnSplit = QPushButton(self) self.btnSplit.setGeometry(QRect(0, 0, 24, 24)) self.btnSplit.setMinimumSize(QSize(24, 24)) self.btnSplit.setMaximumSize(QSize(24, 24)) # self.btnSplit.setCheckable(True) self.btnSplit.setFlat(True) self.btnSplit.setObjectName("btnSplit") self.btnSplit.installEventFilter(self) self.btnSplit.clicked.connect(self.split) # Button to set target self.isTarget = False self.btnTarget = QPushButton(QIcon.fromTheme("set-target"), "", self) self.btnTarget.setGeometry(QRect(25, 0, 24, 24)) self.btnTarget.setMinimumSize(QSize(24, 24)) self.btnTarget.setMaximumSize(QSize(24, 24)) # self.btnTarget.setCheckable(True) self.btnTarget.setFlat(True) self.btnTarget.setObjectName("btnTarget") self.btnTarget.clicked.connect(self.setTarget) self.btnTarget.setToolTip(self.tr("Open selected items in that view.")) self.updateTargetIcon(self.isTarget) self.mainEditor = mainEditor or parent self.secondTab = None self.splitState = 0 self.focusTab = 1 self.closeSplit() self.updateStyleSheet() self.tab.tabCloseRequested.connect(self.closeTab) self.tab.currentChanged.connect(self.mainEditor.tabChanged) qApp.focusChanged.connect(self.focusChanged) def updateStyleSheet(self): self.setStyleSheet(style.mainEditorTabSS()) if self.secondTab: self.secondTab.updateStyleSheet() ############################################################################### # TABS ############################################################################### def closeTab(self, index): w = self.tab.widget(index) self.tab.removeTab(index) w.setCurrentModelIndex(QModelIndex()) w.deleteLater() def tabOpenIndexes(self): sel = [] for i in range(self.tab.count()): sel.append(mainWindow().mdlOutline.ID(self.tab.widget(i).currentIndex)) return sel def openIndexes(self): r = [ self.splitState, self.tabOpenIndexes(), self.secondTab.openIndexes() if self.secondTab else None, ] return r def restoreOpenIndexes(self, openIndexes): try: if openIndexes[1]: self.split(state=openIndexes[0]) for i in openIndexes[1]: idx = mainWindow().mdlOutline.getIndexByID(i) self.mainEditor.setCurrentModelIndex(idx, newTab=True) if openIndexes[2]: self.focusTab = 2 self.secondTab.restoreOpenIndexes(openIndexes[2]) except: # Cannot load open indexes. Let's simply open root. self.mainEditor.setCurrentModelIndex(QModelIndex(), newTab=True) ############################################################################### # TARGET ############################################################################### def setTarget(self): self.isTarget = not self.isTarget self.updateTargetIcon(self.isTarget) def updateTargetIcon(self, val): icon = QIcon.fromTheme("set-target", QIcon(appPath("icons/NumixMsk/256x256/actions/set-target.svg"))) if not val: icon = QIcon(icon.pixmap(128, 128, icon.Disabled)) self.btnTarget.setIcon(icon) ############################################################################### # SPLITTER ############################################################################### def split(self, toggled=None, state=None): if state is None and self.splitState == 0 or state == 1: if self.secondTab is None: self.addSecondTab() self.splitState = 1 self.splitter.setOrientation(Qt.Horizontal) # self.btnSplit.setChecked(True) self.btnSplit.setIcon(QIcon.fromTheme("split-vertical")) self.btnSplit.setToolTip(self.tr("Split horizontally")) elif state is None and self.splitState == 1 or state == 2: if self.secondTab is None: self.addSecondTab() self.splitter.setOrientation(Qt.Vertical) self.splitState = 2 # self.btnSplit.setChecked(True) self.btnSplit.setIcon(QIcon.fromTheme("split-horizontal")) self.btnSplit.setToolTip(self.tr("Close split")) else: self.closeSplit() def addSecondTab(self): self.secondTab = tabSplitter(mainEditor=self.mainEditor) self.secondTab.setObjectName(self.objectName() + "_") self.secondTab.splitter.setObjectName(self.splitter.objectName() + "_") self.splitter.addWidget(self.secondTab) self.splitter.setStretchFactor(0, 10) self.splitter.setStretchFactor(1, 10) if self.mainEditor.currentEditor(): idx = self.mainEditor.currentEditor().currentIndex self.focusTab = 2 self.mainEditor.setCurrentModelIndex(idx) def closeSplit(self): st = self.secondTab l = [] while st: l.append(st) st = st.secondTab for st in reversed(l): st.setParent(None) qApp.focusChanged.disconnect(st.focusChanged) st.deleteLater() self.focusTab = 1 self.secondTab = None # self.btnSplit.setChecked(False) self.splitState = 0 self.btnSplit.setIcon(QIcon.fromTheme("split-close")) self.btnSplit.setToolTip(self.tr("Split vertically")) if len(l): self.mainEditor.tabChanged() # def resizeEvent(self, event): # r = self.geometry() # r.moveLeft(0) # r.moveTop(0) # self.splitter.setGeometry(r) # self.btnSplit.setGeometry(QRect(0, 0, 24, 24)) def focusChanged(self, old, new): if self.secondTab is None or new is None: return oldFT = self.focusTab while new: if new == self.tab: self.focusTab = 1 new = None elif new == self.secondTab: self.focusTab = 2 new = None else: new = new.parent() if self.focusTab != oldFT: self.mainEditor.tabChanged() def eventFilter(self, object, event): if object == self.btnSplit and event.type() == event.HoverEnter: # self.setAutoFillBackground(True) # self.setBackgroundRole(QPalette.Highlight) # self.splitter.setAutoFillBackground(True) # self.splitter.setStyleSheet("""QSplitter#{}{{ # border:1px solid darkblue; # }}""".format(self.splitter.objectName())) self.setStyleSheet(style.mainEditorTabSS() + """ QSplitter#{name}, QSplitter#{name} > QWidget > QSplitter{{ border:3px solid {color}; }}""".format( name=self.splitter.objectName(), color=style.highlight)) elif object == self.btnSplit and event.type() == event.HoverLeave: # self.setAutoFillBackground(False) # self.setBackgroundRole(QPalette.Window) # self.splitter.setStyleSheet("""QSplitter#{}{{ # border: 1px solid transparent; # }}""".format(self.splitter.objectName())) self.setStyleSheet(style.mainEditorTabSS()) return QWidget.eventFilter(self, object, event) manuskript-0.10.0/manuskript/ui/editors/tabSplitter_ui.py000066400000000000000000000031171354442177200236270ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'manuskript/ui/editors/tabSplitter_ui.ui' # # Created by: PyQt5 UI code generator 5.9 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_tabSplitter(object): def setupUi(self, tabSplitter): tabSplitter.setObjectName("tabSplitter") tabSplitter.resize(400, 300) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(tabSplitter.sizePolicy().hasHeightForWidth()) tabSplitter.setSizePolicy(sizePolicy) tabSplitter.setWindowTitle("tabSPlitter") self.verticalLayout = QtWidgets.QVBoxLayout(tabSplitter) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setSpacing(0) self.verticalLayout.setObjectName("verticalLayout") self.splitter = QtWidgets.QSplitter(tabSplitter) self.splitter.setMinimumSize(QtCore.QSize(30, 30)) self.splitter.setOrientation(QtCore.Qt.Horizontal) self.splitter.setObjectName("splitter") self.tab = QtWidgets.QTabWidget(self.splitter) self.tab.setTabsClosable(True) self.tab.setMovable(True) self.tab.setObjectName("tab") self.verticalLayout.addWidget(self.splitter) self.retranslateUi(tabSplitter) QtCore.QMetaObject.connectSlotsByName(tabSplitter) def retranslateUi(self, tabSplitter): pass manuskript-0.10.0/manuskript/ui/editors/tabSplitter_ui.ui000066400000000000000000000027551354442177200236230ustar00rootroot00000000000000 tabSplitter 0 0 400 300 0 0 tabSPlitter 0 0 0 0 0 30 30 Qt::Horizontal true true manuskript-0.10.0/manuskript/ui/editors/textFormat.py000066400000000000000000000043301354442177200227700ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QWidget, QAction from manuskript.enums import Outline from manuskript.models import outlineModel from manuskript.ui.editors.textFormat_ui import Ui_textFormat class textFormat(QWidget, Ui_textFormat): def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) self._textEdit = None formats = { "Bold": [self.btnBold, "format-text-bold", self.tr("CTRL+B")], "Italic": [self.btnItalic, "format-text-italic", self.tr("CTRL+I")], "Underline": [self.btnUnderlined, "format-text-underline", self.tr("CTRL+U")], "Clear": [self.btnClear, "edit-clear", self.tr("CTRL+P")], "Left": [self.btnLeft, "format-justify-left", self.tr("CTRL+L")], "Center": [self.btnCenter, "format-justify-center", self.tr("CTRL+E")], "Right": [self.btnRight, "format-justify-right", self.tr("CTRL+R")], "Justify": [self.btnJustify, "format-justify-fill", self.tr("CTRL+J")], } for f in formats: val = formats[f] a = QAction(QIcon.fromTheme(val[1]), f, self) a.setShortcut(val[2]) a.setToolTip("Format {} ({})".format(f, val[2])) a.triggered.connect(self.setFormat) val[0].setDefaultAction(a) def setTextEdit(self, textEdit): self._textEdit = textEdit def updateFromIndex(self, index): if not index.isValid(): self.setVisible(False) return if type(index.model()) != outlineModel: self.setVisible(False) return if index.column() not in [Outline.text, Outline.notes]: self.setVisible(False) return self.setVisible(True) item = index.internalPointer() self.align.setVisible(True) self.format.setVisible(True) if item.isFolder(): self.setVisible(False) return elif item.isText(): self.align.setVisible(False) def setFormat(self): act = self.sender() if self._textEdit: self._textEdit.applyFormat(act.text()) manuskript-0.10.0/manuskript/ui/editors/textFormat_ui.py000066400000000000000000000104031354442177200234630ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'manuskript/ui/editors/textFormat_ui.ui' # # Created: Fri Apr 8 18:15:49 2016 # by: PyQt5 UI code generator 5.2.1 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_textFormat(object): def setupUi(self, textFormat): textFormat.setObjectName("textFormat") textFormat.resize(507, 34) self.horizontalLayout_3 = QtWidgets.QHBoxLayout(textFormat) self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.format = QtWidgets.QWidget(textFormat) self.format.setObjectName("format") self.horizontalLayout = QtWidgets.QHBoxLayout(self.format) self.horizontalLayout.setContentsMargins(0, 0, 0, 0) self.horizontalLayout.setObjectName("horizontalLayout") spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.btnBold = QtWidgets.QToolButton(self.format) self.btnBold.setText("") self.btnBold.setObjectName("btnBold") self.horizontalLayout.addWidget(self.btnBold) self.btnItalic = QtWidgets.QToolButton(self.format) self.btnItalic.setText("") icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnItalic.setIcon(icon) self.btnItalic.setObjectName("btnItalic") self.horizontalLayout.addWidget(self.btnItalic) self.btnUnderlined = QtWidgets.QToolButton(self.format) self.btnUnderlined.setText("") self.btnUnderlined.setIcon(icon) self.btnUnderlined.setObjectName("btnUnderlined") self.horizontalLayout.addWidget(self.btnUnderlined) self.btnClear = QtWidgets.QToolButton(self.format) self.btnClear.setText("") icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap("../"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.btnClear.setIcon(icon1) self.btnClear.setObjectName("btnClear") self.horizontalLayout.addWidget(self.btnClear) spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem1) self.horizontalLayout_3.addWidget(self.format) self.align = QtWidgets.QWidget(textFormat) self.align.setObjectName("align") self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.align) self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_2.setObjectName("horizontalLayout_2") spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem2) self.btnLeft = QtWidgets.QToolButton(self.align) self.btnLeft.setText("") self.btnLeft.setIcon(icon) self.btnLeft.setObjectName("btnLeft") self.horizontalLayout_2.addWidget(self.btnLeft) self.btnCenter = QtWidgets.QToolButton(self.align) self.btnCenter.setText("") self.btnCenter.setIcon(icon) self.btnCenter.setObjectName("btnCenter") self.horizontalLayout_2.addWidget(self.btnCenter) self.btnRight = QtWidgets.QToolButton(self.align) self.btnRight.setText("") self.btnRight.setIcon(icon) self.btnRight.setObjectName("btnRight") self.horizontalLayout_2.addWidget(self.btnRight) self.btnJustify = QtWidgets.QToolButton(self.align) self.btnJustify.setText("") self.btnJustify.setIcon(icon) self.btnJustify.setObjectName("btnJustify") self.horizontalLayout_2.addWidget(self.btnJustify) spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem3) self.horizontalLayout_3.addWidget(self.align) self.retranslateUi(textFormat) QtCore.QMetaObject.connectSlotsByName(textFormat) def retranslateUi(self, textFormat): _translate = QtCore.QCoreApplication.translate textFormat.setWindowTitle(_translate("textFormat", "Form")) manuskript-0.10.0/manuskript/ui/editors/textFormat_ui.ui000066400000000000000000000106031354442177200234520ustar00rootroot00000000000000 textFormat 0 0 507 34 Form 0 0 Qt::Horizontal 40 20 ../../ Qt::Horizontal 40 20 0 Qt::Horizontal 40 20 Qt::Horizontal 40 20 manuskript-0.10.0/manuskript/ui/editors/themes.py000066400000000000000000000254231354442177200221260ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- # Lots of stuff from here comes from the excellent focuswriter. import os import re from PyQt5.QtCore import QSettings, QRect, QSize, Qt, QPoint, QFile, QIODevice, QTextStream from PyQt5.QtGui import QPixmap, QPainter, QColor, QBrush, QImage, QTextBlockFormat, QTextCharFormat, QFont, qGray from PyQt5.QtWidgets import qApp, QFrame from manuskript.functions import allPaths, appPath, findBackground, findFirstFile from manuskript.ui.views.MDEditView import MDEditView _thumbCache = {} def loadThemeDatas(themeFile): settings = QSettings(themeFile, QSettings.IniFormat) _themeData = {} # Theme name _themeData["Name"] = getThemeName(themeFile) # Window Background loadThemeSetting(_themeData, settings, "Background/Color", "#000000") loadThemeSetting(_themeData, settings, "Background/ImageFile", "") loadThemeSetting(_themeData, settings, "Background/Type", 0) # Text Background loadThemeSetting(_themeData, settings, "Foreground/Color", "#ffffff") loadThemeSetting(_themeData, settings, "Foreground/Opacity", 50) loadThemeSetting(_themeData, settings, "Foreground/Margin", 40) loadThemeSetting(_themeData, settings, "Foreground/Padding", 10) loadThemeSetting(_themeData, settings, "Foreground/Position", 1) loadThemeSetting(_themeData, settings, "Foreground/Rounding", 5) loadThemeSetting(_themeData, settings, "Foreground/Width", 700) # Text Options loadThemeSetting(_themeData, settings, "Text/Color", "#ffffff") loadThemeSetting(_themeData, settings, "Text/Font", qApp.font().toString()) loadThemeSetting(_themeData, settings, "Text/Misspelled", "#ff0000") # Paragraph Options loadThemeSetting(_themeData, settings, "Spacings/Alignment", 0) loadThemeSetting(_themeData, settings, "Spacings/IndentFirstLine", False) loadThemeSetting(_themeData, settings, "Spacings/LineSpacing", 100) loadThemeSetting(_themeData, settings, "Spacings/ParagraphAbove", 0) loadThemeSetting(_themeData, settings, "Spacings/ParagraphBelow", 0) loadThemeSetting(_themeData, settings, "Spacings/TabWidth", 48) return _themeData def loadThemeSetting(datas, settings, key, default): """ Loads data from ini file, using default value if the key is absent, and casting to the proper type based on default. """ datas[key] = settings.value(key, default, type(default)) def getThemeName(theme): settings = QSettings(theme, QSettings.IniFormat) if settings.contains("Name"): return settings.value("Name") else: return os.path.splitext(os.path.split(theme)[1])[0] def themeTextRect(themeDatas, screenRect): margin = themeDatas["Foreground/Margin"] x = 0 y = margin width = min(themeDatas["Foreground/Width"], screenRect.width() - 2 * margin) height = screenRect.height() - 2 * margin if themeDatas["Foreground/Position"] == 0: # Left x = margin elif themeDatas["Foreground/Position"] == 1: # Center x = (screenRect.width() - width) / 2 elif themeDatas["Foreground/Position"] == 2: # Right x = screenRect.width() - margin - width elif themeDatas["Foreground/Position"] == 3: # Stretched x = margin width = screenRect.width() - 2 * margin return QRect(x, y, width, height) def createThemePreview(theme, screenRect, size=QSize(200, 120)): """ Generates a QPixmap preview for given theme. Theme can be either a string containing the filename of the ini file with the theme settings, or it can be a dict with the settings. If theme is a filename, the result is cached. """ # Checking whether theme is a string or dict if type(theme) == str and os.path.exists(theme): # Theme is the path to an ini file themeDatas = loadThemeDatas(theme) fromFile = True else: themeDatas = theme fromFile = False # Check if item is in cache if fromFile and theme in _thumbCache: if _thumbCache[theme][0] == themeDatas: return _thumbCache[theme][1] pixmap = generateTheme(themeDatas, screenRect) addThemePreviewText(pixmap, themeDatas, screenRect) px = QPixmap(pixmap).scaled(size, Qt.KeepAspectRatio) w = px.width() / 10 h = px.height() / 10 r = themeTextRect(themeDatas, screenRect) painter = QPainter(px) painter.drawPixmap(QRect(w, h, w * 4, h * 5), pixmap, QRect(r.topLeft() - QPoint(w / 3, h / 3), QSize(w * 4, h * 5))) painter.setPen(Qt.white) painter.drawRect(QRect(w, h, w * 4, h * 5)) painter.end() # If theme is a themefile, we keep it in cache if fromFile: _thumbCache[theme] = [themeDatas, px] return px def findThemePath(themeName): p = findFirstFile(re.escape("{}.theme".format(themeName)), "resources/themes") if not p: return findFirstFile(r".*\.theme", "resources/themes") else: return p def generateTheme(themeDatas, screenRect): # Window Background px = QPixmap(screenRect.size()) px.fill(QColor(themeDatas["Background/Color"])) painter = QPainter(px) if themeDatas["Background/ImageFile"]: path = findBackground(themeDatas["Background/ImageFile"]) _type = themeDatas["Background/Type"] if path and _type > 0: if _type == 1: # Tiled painter.fillRect(screenRect, QBrush(QImage(path))) else: img = QImage(path) scaled = img.size() if _type == 3: # Stretched scaled.scale(screenRect.size(), Qt.IgnoreAspectRatio) elif _type == 4: # Scaled scaled.scale(screenRect.size(), Qt.KeepAspectRatio) elif _type == 5: # Zoomed scaled.scale(screenRect.size(), Qt.KeepAspectRatioByExpanding) painter.drawImage((screenRect.width() - scaled.width()) / 2, (screenRect.height() - scaled.height()) / 2, img.scaled(scaled)) # Text Background textRect = themeTextRect(themeDatas, screenRect) painter.save() color = QColor(themeDatas["Foreground/Color"]) color.setAlpha(themeDatas["Foreground/Opacity"] * 255 / 100) painter.setBrush(color) painter.setPen(Qt.NoPen) r = themeDatas["Foreground/Rounding"] painter.drawRoundedRect(textRect, r, r) painter.restore() painter.end() return px def themeEditorGeometry(themeDatas, textRect): padding = themeDatas["Foreground/Padding"] x = textRect.x() + padding y = textRect.y() + padding + themeDatas["Spacings/ParagraphAbove"] width = textRect.width() - 2 * padding height = textRect.height() - 2 * padding - themeDatas["Spacings/ParagraphAbove"] return x, y, width, height def getThemeBlockFormat(themeDatas): bf = QTextBlockFormat() bf.setAlignment(Qt.AlignLeft if themeDatas["Spacings/Alignment"] == 0 else Qt.AlignCenter if themeDatas["Spacings/Alignment"] == 1 else Qt.AlignRight if themeDatas["Spacings/Alignment"] == 2 else Qt.AlignJustify) bf.setLineHeight(themeDatas["Spacings/LineSpacing"], QTextBlockFormat.ProportionalHeight) bf.setTextIndent(themeDatas["Spacings/TabWidth"] * 1 if themeDatas["Spacings/IndentFirstLine"] else 0) bf.setTopMargin(themeDatas["Spacings/ParagraphAbove"]) bf.setBottomMargin(themeDatas["Spacings/ParagraphBelow"]) return bf def setThemeEditorDatas(editor, themeDatas, pixmap, screenRect): textRect = themeTextRect(themeDatas, screenRect) x, y, width, height = themeEditorGeometry(themeDatas, textRect) editor.setGeometry(x, y, width, height) # p = editor.palette() ##p.setBrush(QPalette.Base, QBrush(pixmap.copy(x, y, width, height))) # p.setBrush(QPalette.Base, QColor(Qt.transparent)) # p.setColor(QPalette.Text, QColor(themeDatas["Text/Color"])) # p.setColor(QPalette.Highlight, QColor(themeDatas["Text/Color"])) # p.setColor(QPalette.HighlightedText, Qt.black if qGray(QColor(themeDatas["Text/Color"]).rgb()) > 127 else Qt.white) # editor.setPalette(p) editor.setAttribute(Qt.WA_NoSystemBackground, True) bf = getThemeBlockFormat(themeDatas) editor.setDefaultBlockFormat(bf) # b = editor.document().firstBlock() # cursor = editor.textCursor() # cursor.setBlockFormat(bf) # while b.isValid(): # bf2 = b.blockFormat() # bf2.merge(bf) # cursor.setPosition(b.position()) ##cursor.setPosition(b.position(), QTextCursor.KeepAnchor) # cursor.setBlockFormat(bf2) # b = b.next() editor.setTabStopWidth(themeDatas["Spacings/TabWidth"]) editor.document().setIndentWidth(themeDatas["Spacings/TabWidth"]) editor.highlighter.setMisspelledColor(QColor(themeDatas["Text/Misspelled"])) cf = QTextCharFormat() # f = QFont() # f.fromString(themeDatas["Text/Font"]) # cf.setFont(f) editor.highlighter.setDefaultCharFormat(cf) f = QFont() f.fromString(themeDatas["Text/Font"]) # editor.setFont(f) editor.setStyleSheet(""" QTextEdit {{ background: transparent; color: {foreground}; font-family: {ff}; font-size: {fs}; selection-color: {sc}; selection-background-color: {sbc}; }} """.format( foreground=themeDatas["Text/Color"], ff=f.family(), fs="{}pt".format(str(f.pointSize())), sc="black" if qGray(QColor(themeDatas["Text/Color"]).rgb()) > 127 else "white", sbc=themeDatas["Text/Color"], ) ) editor._fromTheme = True editor._themeData = themeDatas editor.highlighter.updateColorScheme() def addThemePreviewText(pixmap, themeDatas, screenRect): # Text previewText = MDEditView(highlighting=True) previewText.setFrameStyle(QFrame.NoFrame) previewText.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) previewText.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) f = QFile(appPath("resources/themes/preview.txt")) f.open(QIODevice.ReadOnly) previewText.setPlainText(QTextStream(f).readAll()) setThemeEditorDatas(previewText, themeDatas, pixmap, screenRect) previewText.render(pixmap, previewText.pos()) ## Text Background ##themeDatas["Foreground/Color"] ##themeDatas["Foreground/Opacity"] ##themeDatas["Foreground/Margin"] ##themeDatas["Foreground/Padding"] ##themeDatas["Foreground/Position"] ##themeDatas["Foreground/Rounding"] ##themeDatas["Foreground/Width"] ## Text Options ##themeDatas["Text/Color"] ##themeDatas["Text/Font"] # themeDatas["Text/Misspelled"] ## Paragraph Options ##themeDatas["Spacings/IndentFirstLine"] ##themeDatas["Spacings/LineSpacing"] ##themeDatas["Spacings/ParagraphAbove"] ##themeDatas["Spacings/ParagraphBelow"] ##themeDatas["Spacings/TabWidth"] manuskript-0.10.0/manuskript/ui/exporters/000077500000000000000000000000001354442177200206435ustar00rootroot00000000000000manuskript-0.10.0/manuskript/ui/exporters/__init__.py000066400000000000000000000000001354442177200227420ustar00rootroot00000000000000manuskript-0.10.0/manuskript/ui/exporters/exporter.py000066400000000000000000000120511354442177200230640ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import json import os from PyQt5.QtCore import Qt, QPoint from PyQt5.QtGui import QBrush, QColor, QIcon from PyQt5.QtWidgets import QWidget, QStyle from manuskript import exporter from manuskript.functions import writablePath, openURL from manuskript.ui.exporters.exporter_ui import Ui_exporter from manuskript.ui.exporters.exportersManager import exportersManager from manuskript.ui import style as S class exporterDialog(QWidget, Ui_exporter): def __init__(self, parent=None, mw=None): QWidget.__init__(self, parent) self.setupUi(self) # Var self.mw = mw self.currentExporter = None self.settingsWidget = None self.previewWidget = None self.populateExportList() self.btnManageExporters.clicked.connect(self.openManager) self.cmbExporters.currentIndexChanged.connect(self.updateUi) self.cmbExporters.setCurrentIndex(1) self.btnPreview.clicked.connect(self.preview) self.btnExport.clicked.connect(self.export) #FIXME: load last export format def populateExportList(self): # Populates list self.cmbExporters.clear() for E in exporter.exporters: if not E.isValid() and not E.absentTip: continue self.cmbExporters.addItem(QIcon(E.icon), E.name) self.cmbExporters.setItemData(self.cmbExporters.count() - 1, QBrush(QColor(S.highlightedTextDark)), Qt.ForegroundRole) self.cmbExporters.setItemData(self.cmbExporters.count() - 1, QBrush(QColor(S.highlightLight)), Qt.BackgroundRole) item = self.cmbExporters.model().item(self.cmbExporters.count() - 1) item.setFlags(Qt.ItemIsEnabled) if not E.isValid() and E.absentTip: self.cmbExporters.addItem(self.style().standardIcon(QStyle.SP_MessageBoxWarning), E.absentTip, "::URL::" + E.absentURL) continue for f in E.exportTo: if not f.isValid(): continue name = f.name if f.implemented else self.tr("{} (not implemented yet)").format(f.name) self.cmbExporters.addItem(QIcon.fromTheme(f.icon), name, E.name) def updateUi(self, index): # We check if we have an URL to open data = self.cmbExporters.currentData() if data and data[:7] == "::URL::" and data[7:]: openURL(data[7:]) E, F = self.getSelectedExporter() if not E or not F or not F.implemented: self.setWidgetsEnabled(False) return self.setWidgetsEnabled(True) self.grpSettings.setVisible(F.requires["Settings"]) self.grpPreview.setVisible(F.requires["Preview"]) self.btnPreview.setVisible(F.requires["Preview"]) if F.requires["Settings"]: self.settingsWidget = F.settingsWidget() self.setGroupWidget(self.grpSettings, self.settingsWidget) if F.requires["Preview"]: self.previewWidget = F.previewWidget() self.setGroupWidget(self.grpPreview, self.previewWidget) self.splitter.setStretchFactor(0, 3) self.splitter.setStretchFactor(1, 6) def preview(self): E, F = self.getSelectedExporter() if not E or not F or not F.implemented: return F.preview(self.settingsWidget, self.previewWidget) def export(self): E, F = self.getSelectedExporter() if not E or not F or not F.implemented: return F.export(self.settingsWidget) ################################################################################################################### # UI ################################################################################################################### def getSelectedExporter(self): name = self.cmbExporters.currentText() exporterName = self.cmbExporters.currentData() E = exporter.getExporterByName(exporterName) if not E: return None, None F = E.getFormatByName(name) if not F: return E, F return E, F def setWidgetsEnabled(self, value): """One function to control them all. Enables or disables all groups.""" self.grpSettings.setEnabled(value) self.grpPreview.setEnabled(value) def openManager(self): """Open exporters manager dialog""" self.dialog = exportersManager() self.dialog.show() r = self.dialog.geometry() r2 = self.geometry() self.dialog.move(r2.center() - QPoint(r.width()/2, r.height()/2)) self.dialog.exportersMightHaveChanged.connect(self.populateExportList) def setGroupWidget(self, group, widget): """Sets the given widget as main widget for QGroupBox group.""" # Removes every items from given layout. l = group.layout() while l.count(): item = l.itemAt(0) l.removeItem(item) item.widget().deleteLater() l.addWidget(widget) widget.setParent(group) manuskript-0.10.0/manuskript/ui/exporters/exporter_ui.py000066400000000000000000000070771354442177200235750ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'manuskript/ui/exporters/exporter_ui.ui' # # Created: Fri Apr 8 12:22:37 2016 # by: PyQt5 UI code generator 5.2.1 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_exporter(object): def setupUi(self, exporter): exporter.setObjectName("exporter") exporter.resize(933, 642) self.verticalLayout = QtWidgets.QVBoxLayout(exporter) self.verticalLayout.setObjectName("verticalLayout") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.label = QtWidgets.QLabel(exporter) self.label.setObjectName("label") self.horizontalLayout.addWidget(self.label) self.cmbExporters = QtWidgets.QComboBox(exporter) self.cmbExporters.setObjectName("cmbExporters") self.horizontalLayout.addWidget(self.cmbExporters) self.btnManageExporters = QtWidgets.QPushButton(exporter) icon = QtGui.QIcon.fromTheme("preferences-system") self.btnManageExporters.setIcon(icon) self.btnManageExporters.setObjectName("btnManageExporters") self.horizontalLayout.addWidget(self.btnManageExporters) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.btnPreview = QtWidgets.QPushButton(exporter) icon = QtGui.QIcon.fromTheme("document-print-preview") self.btnPreview.setIcon(icon) self.btnPreview.setObjectName("btnPreview") self.horizontalLayout.addWidget(self.btnPreview) self.btnExport = QtWidgets.QPushButton(exporter) icon = QtGui.QIcon.fromTheme("document-export") self.btnExport.setIcon(icon) self.btnExport.setObjectName("btnExport") self.horizontalLayout.addWidget(self.btnExport) self.verticalLayout.addLayout(self.horizontalLayout) self.splitter = QtWidgets.QSplitter(exporter) self.splitter.setOrientation(QtCore.Qt.Horizontal) self.splitter.setObjectName("splitter") self.grpSettings = QtWidgets.QGroupBox(self.splitter) self.grpSettings.setObjectName("grpSettings") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.grpSettings) self.verticalLayout_3.setSpacing(0) self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) self.verticalLayout_3.setObjectName("verticalLayout_3") self.grpPreview = QtWidgets.QGroupBox(self.splitter) self.grpPreview.setObjectName("grpPreview") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.grpPreview) self.verticalLayout_2.setSpacing(0) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setObjectName("verticalLayout_2") self.verticalLayout.addWidget(self.splitter) self.retranslateUi(exporter) QtCore.QMetaObject.connectSlotsByName(exporter) def retranslateUi(self, exporter): _translate = QtCore.QCoreApplication.translate exporter.setWindowTitle(_translate("exporter", "Export")) self.label.setText(_translate("exporter", "Export to:")) self.btnManageExporters.setText(_translate("exporter", "Manage exporters")) self.btnPreview.setText(_translate("exporter", "Preview")) self.btnExport.setText(_translate("exporter", "Export")) self.grpSettings.setTitle(_translate("exporter", "Settings")) self.grpPreview.setTitle(_translate("exporter", "Preview")) manuskript-0.10.0/manuskript/ui/exporters/exporter_ui.ui000066400000000000000000000064501354442177200235540ustar00rootroot00000000000000 exporter 0 0 933 642 Export Export to: Manage exporters Qt::Horizontal 40 20 Preview Export Qt::Horizontal Settings 0 0 0 0 0 Preview 0 0 0 0 0 manuskript-0.10.0/manuskript/ui/exporters/exportersManager.py000066400000000000000000000115701354442177200245470ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import os from collections import OrderedDict from PyQt5.QtCore import QSize from PyQt5.QtCore import Qt, pyqtSignal from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QWidget, QListWidgetItem, QFileDialog from manuskript import exporter from manuskript.ui.exporters.exportersManager_ui import Ui_ExportersManager from manuskript.ui import style as S class exportersManager(QWidget, Ui_ExportersManager): exportersMightHaveChanged = pyqtSignal() def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) self.lblExporterName.setStyleSheet(S.titleLabelSS()) # Var self.currentExporter = None # Populates lite self.lstExporters.clear() for E in exporter.exporters: item = QListWidgetItem(QIcon(E.icon), E.name) self.lstExporters.addItem(item) # UI for i in range(self.lstExporters.count()): item = self.lstExporters.item(i) item.setSizeHint(QSize(item.sizeHint().width(), 42)) item.setTextAlignment(Qt.AlignCenter) self.lstExporters.setMaximumWidth(150) self.lstExporters.setMinimumWidth(150) self.lstExporters.currentTextChanged.connect(self.updateUi) self.lstExportTo.currentTextChanged.connect(self.updateFormatDescription) self.lstExporters.setCurrentRow(0) self.btnSetPath.clicked.connect(self.setAppPath) self.txtPath.editingFinished.connect(self.updateAppPath) def updateUi(self, name): E = exporter.getExporterByName(name) self.currentExporter = E if not E: self.stack.setEnabled(False) return self.stack.setEnabled(True) # Updates name and description self.lblExporterName.setText(E.name) self.lblExporterDescription.setText(E.description) # Updates formats self.lstExportTo.clear() for f in E.exportTo: item = QListWidgetItem(QIcon.fromTheme(f.icon), f.name) self.lstExportTo.addItem(item) self.grpExportTo.layout().setStretch(0, 4) self.grpExportTo.layout().setStretch(1, 6) self.lstExportTo.setCurrentRow(0) # Updates path & version self.grpPath.setVisible(E.name != "Manuskript") # We hide if exporter is manuskript # Installed if E.isValid() == 2: self.lblStatus.setText(self.tr("Installed")) self.lblStatus.setStyleSheet("color: darkGreen;") self.lblHelpText.setVisible(False) self.lblVersion.setVisible(True) self.lblVersionName.setVisible(True) elif E.isValid() == 1: self.lblStatus.setText(self.tr("Custom")) self.lblStatus.setStyleSheet("color: darkOrange;") self.lblHelpText.setVisible(False) self.lblVersion.setVisible(True) self.lblVersionName.setVisible(True) else: self.lblStatus.setText(self.tr("Not found")) self.lblStatus.setStyleSheet("color: red;") self.lblHelpText.setVisible(True) self.lblHelpText.setText(self.tr("{} not found. Install it, or set path manually.").format(name)) self.lblVersion.setVisible(False) self.lblVersionName.setVisible(False) # Version self.lblVersion.setText(E.version()) # Path if E.path(): self.txtPath.setText(E.path()) else: self.txtPath.setText(E.customPath) def updateFormatDescription(self, name): if self.currentExporter: f = self.currentExporter.getFormatByName(name) if not f: self.lblExportToDescription.setText("") else: desc = "{}: {}".format( name, f.description) if not f.isValid(): desc += "

    " + \ self.tr("Status: uninstalled.") + \ "

    " + \ self.tr("Requires: ") + f.InvalidBecause self.lblExportToDescription.setText(desc) def setAppPath(self): if self.currentExporter: E = self.currentExporter fn = QFileDialog.getOpenFileName(self, caption=self.tr("Set {} executable path.").format(E.cmd), directory=E.customPath) if fn[0]: self.updateAppPath(fn[0]) def updateAppPath(self, path=""): if not path: path = self.txtPath.text() if self.currentExporter: E = self.currentExporter E.setCustomPath(path) self.txtPath.setText(E.customPath) self.updateUi(E.name) self.exportersMightHaveChanged.emit() manuskript-0.10.0/manuskript/ui/exporters/exportersManager_ui.py000066400000000000000000000222431354442177200252430ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'manuskript/ui/exporters/exportersManager_ui.ui' # # Created by: PyQt5 UI code generator 5.9 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_ExportersManager(object): def setupUi(self, ExportersManager): ExportersManager.setObjectName("ExportersManager") ExportersManager.resize(720, 548) self.horizontalLayout_8 = QtWidgets.QHBoxLayout(ExportersManager) self.horizontalLayout_8.setObjectName("horizontalLayout_8") self.lstExporters = QtWidgets.QListWidget(ExportersManager) self.lstExporters.setObjectName("lstExporters") item = QtWidgets.QListWidgetItem() self.lstExporters.addItem(item) self.horizontalLayout_8.addWidget(self.lstExporters) self.stack = QtWidgets.QWidget(ExportersManager) self.stack.setObjectName("stack") self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.stack) self.verticalLayout_7.setContentsMargins(0, 0, 0, 0) self.verticalLayout_7.setObjectName("verticalLayout_7") self.lblExporterName = QtWidgets.QLabel(self.stack) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.lblExporterName.sizePolicy().hasHeightForWidth()) self.lblExporterName.setSizePolicy(sizePolicy) self.lblExporterName.setText("{Exporter Name}") self.lblExporterName.setAlignment(QtCore.Qt.AlignCenter) self.lblExporterName.setObjectName("lblExporterName") self.verticalLayout_7.addWidget(self.lblExporterName) self.grpDescription = QtWidgets.QGroupBox(self.stack) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.grpDescription.setFont(font) self.grpDescription.setObjectName("grpDescription") self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.grpDescription) self.verticalLayout_5.setObjectName("verticalLayout_5") self.lblExporterDescription = QtWidgets.QLabel(self.grpDescription) font = QtGui.QFont() font.setBold(False) font.setWeight(50) self.lblExporterDescription.setFont(font) self.lblExporterDescription.setText("{ExporterDescription}") self.lblExporterDescription.setWordWrap(True) self.lblExporterDescription.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) self.lblExporterDescription.setObjectName("lblExporterDescription") self.verticalLayout_5.addWidget(self.lblExporterDescription) self.verticalLayout_7.addWidget(self.grpDescription) self.grpExportTo = QtWidgets.QGroupBox(self.stack) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.grpExportTo.setFont(font) self.grpExportTo.setObjectName("grpExportTo") self.horizontalLayout = QtWidgets.QHBoxLayout(self.grpExportTo) self.horizontalLayout.setObjectName("horizontalLayout") self.lstExportTo = QtWidgets.QListWidget(self.grpExportTo) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.lstExportTo.sizePolicy().hasHeightForWidth()) self.lstExportTo.setSizePolicy(sizePolicy) self.lstExportTo.setObjectName("lstExportTo") self.horizontalLayout.addWidget(self.lstExportTo) self.frame = QtWidgets.QFrame(self.grpExportTo) self.frame.setFrameShape(QtWidgets.QFrame.NoFrame) self.frame.setFrameShadow(QtWidgets.QFrame.Raised) self.frame.setObjectName("frame") self.verticalLayout = QtWidgets.QVBoxLayout(self.frame) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setSpacing(0) self.verticalLayout.setObjectName("verticalLayout") self.lblExportToDescription = QtWidgets.QLabel(self.frame) font = QtGui.QFont() font.setBold(False) font.setWeight(50) self.lblExportToDescription.setFont(font) self.lblExportToDescription.setText("{FormatDescription}") self.lblExportToDescription.setWordWrap(True) self.lblExportToDescription.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) self.lblExportToDescription.setObjectName("lblExportToDescription") self.verticalLayout.addWidget(self.lblExportToDescription) spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.horizontalLayout.addWidget(self.frame) self.verticalLayout_7.addWidget(self.grpExportTo) self.grpPath = QtWidgets.QGroupBox(self.stack) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.grpPath.setFont(font) self.grpPath.setObjectName("grpPath") self.formLayout = QtWidgets.QFormLayout(self.grpPath) self.formLayout.setObjectName("formLayout") self.label_2 = QtWidgets.QLabel(self.grpPath) self.label_2.setObjectName("label_2") self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_2) self.lblStatus = QtWidgets.QLabel(self.grpPath) font = QtGui.QFont() font.setBold(False) font.setWeight(50) self.lblStatus.setFont(font) self.lblStatus.setText("{ExporterStatus}") self.lblStatus.setObjectName("lblStatus") self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lblStatus) self.lblVersionName = QtWidgets.QLabel(self.grpPath) self.lblVersionName.setObjectName("lblVersionName") self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.lblVersionName) self.lblVersion = QtWidgets.QLabel(self.grpPath) font = QtGui.QFont() font.setBold(False) font.setWeight(50) self.lblVersion.setFont(font) self.lblVersion.setText("{ExporterVersion}") self.lblVersion.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) self.lblVersion.setObjectName("lblVersion") self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lblVersion) self.label = QtWidgets.QLabel(self.grpPath) self.label.setObjectName("label") self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.txtPath = QtWidgets.QLineEdit(self.grpPath) font = QtGui.QFont() font.setBold(False) font.setWeight(50) self.txtPath.setFont(font) self.txtPath.setObjectName("txtPath") self.horizontalLayout_2.addWidget(self.txtPath) self.btnSetPath = QtWidgets.QPushButton(self.grpPath) font = QtGui.QFont() font.setBold(False) font.setWeight(50) self.btnSetPath.setFont(font) self.btnSetPath.setObjectName("btnSetPath") self.horizontalLayout_2.addWidget(self.btnSetPath) self.formLayout.setLayout(3, QtWidgets.QFormLayout.FieldRole, self.horizontalLayout_2) self.lblHelpText = QtWidgets.QLabel(self.grpPath) font = QtGui.QFont() font.setBold(False) font.setWeight(50) self.lblHelpText.setFont(font) self.lblHelpText.setWordWrap(True) self.lblHelpText.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) self.lblHelpText.setObjectName("lblHelpText") self.formLayout.setWidget(4, QtWidgets.QFormLayout.SpanningRole, self.lblHelpText) self.verticalLayout_7.addWidget(self.grpPath) self.horizontalLayout_8.addWidget(self.stack) self.retranslateUi(ExportersManager) QtCore.QMetaObject.connectSlotsByName(ExportersManager) def retranslateUi(self, ExportersManager): _translate = QtCore.QCoreApplication.translate ExportersManager.setWindowTitle(_translate("ExportersManager", "Manage Exporters")) __sortingEnabled = self.lstExporters.isSortingEnabled() self.lstExporters.setSortingEnabled(False) item = self.lstExporters.item(0) item.setText(_translate("ExportersManager", "Manuskript")) self.lstExporters.setSortingEnabled(__sortingEnabled) self.grpDescription.setTitle(_translate("ExportersManager", "Description")) self.grpExportTo.setTitle(_translate("ExportersManager", "Offers export to")) self.grpPath.setTitle(_translate("ExportersManager", "Status")) self.label_2.setText(_translate("ExportersManager", "Status:")) self.lblVersionName.setText(_translate("ExportersManager", "Version:")) self.label.setText(_translate("ExportersManager", "Path:")) self.btnSetPath.setText(_translate("ExportersManager", "...")) self.lblHelpText.setText(_translate("ExportersManager", "{HelpText}")) manuskript-0.10.0/manuskript/ui/exporters/exportersManager_ui.ui000066400000000000000000000213021354442177200252230ustar00rootroot00000000000000 ExportersManager 0 0 720 548 Manage Exporters Manuskript 0 0 0 0 0 0 {Exporter Name} Qt::AlignCenter 75 true Description 50 false {ExporterDescription} true Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse 75 true Offers export to 0 0 QFrame::NoFrame QFrame::Raised 0 0 0 0 0 50 false {FormatDescription} true Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse Qt::Vertical 20 40 75 true Status Status: 50 false {ExporterStatus} Version: 50 false {ExporterVersion} Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse Path: 50 false 50 false ... 50 false {HelpText} true Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse manuskript-0.10.0/manuskript/ui/exporters/manuskript/000077500000000000000000000000001354442177200230405ustar00rootroot00000000000000manuskript-0.10.0/manuskript/ui/exporters/manuskript/__init__.py000066400000000000000000000000001354442177200251370ustar00rootroot00000000000000manuskript-0.10.0/manuskript/ui/exporters/manuskript/plainTextSettings.py000066400000000000000000000401121354442177200271010ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import json import os from PyQt5.QtCore import Qt, QSize from PyQt5.QtGui import QIcon, QFontMetrics, QFont from PyQt5.QtWidgets import QWidget, QTableWidgetItem, QListWidgetItem, QTreeView from manuskript.functions import mainWindow, writablePath from manuskript.ui.exporters.manuskript.plainTextSettings_ui import Ui_exporterSettings from manuskript.ui import style as S class exporterSettings(QWidget, Ui_exporterSettings): def __init__(self, _format, parent=None): QWidget.__init__(self, parent) self.setupUi(self) self.toolBox.setStyleSheet(S.toolBoxSS()) self.mw = mainWindow() self._format = _format self.settings = {} ################################################################# # Content self.grpContentFilters.button.setChecked(False) h = self.tblContent.horizontalHeader() h.setSectionResizeMode(h.ResizeToContents) h.setSectionResizeMode(0, h.Stretch) self.contentUpdateTable() self.chkContentMore.toggled.connect(self.contentTableToggle) self.contentTableToggle(False) # Labels self.lstContentLabels.clear() h = QFontMetrics(self.font()).height() for i in range(0, self.mw.mdlLabels.rowCount()): item = self.mw.mdlLabels.item(i, 0) if item: item = QListWidgetItem(item.icon(), item.text()) item.setFlags(item.flags() | Qt.ItemIsUserCheckable) item.setCheckState(Qt.Checked) item.setSizeHint(QSize(100, h)) self.lstContentLabels.addItem(item) self.chkContentLabels.toggled.connect(self.lstContentLabels.setVisible) self.chkContentLabels.toggled.connect(lambda: self.listWidgetAdjustToContent(self.lstContentLabels)) self.lstContentLabels.setVisible(False) # Status self.lstContentStatus.clear() h = QFontMetrics(self.font()).height() for i in range(0, self.mw.mdlStatus.rowCount()): item = self.mw.mdlStatus.item(i, 0) if item: item = QListWidgetItem(item.icon(), item.text()) item.setFlags(item.flags() | Qt.ItemIsUserCheckable) item.setCheckState(Qt.Checked) item.setSizeHint(QSize(100, h)) self.lstContentStatus.addItem(item) self.chkContentStatus.toggled.connect(self.lstContentStatus.setVisible) self.chkContentStatus.toggled.connect(lambda: self.listWidgetAdjustToContent(self.lstContentStatus)) self.lstContentStatus.setVisible(False) # Root item self.cmbContentParent.setModel(self.mw.mdlOutline) v = QTreeView() self.cmbContentParent.setView(v) v.setHeaderHidden(True) for i in range(1, self.mw.mdlOutline.columnCount()): v.hideColumn(i) self.chkContentParent.toggled.connect(self.cmbContentParent.setVisible) self.cmbContentParent.hide() ################################################################# # Separations for cmb in [self.cmbSepFF, self.cmbSepTT, self.cmbSepFT, self.cmbSepTF]: cmb.clear() cmb.addItem(self.tr("Empty line"), "empty") cmb.addItem(self.tr("Custom"), "custom") cmb.currentIndexChanged.connect(self.sepCmbChanged) ################################################################# # Transformations h = self.tblReplacements.horizontalHeader() h.setSectionResizeMode(h.ResizeToContents) h.setSectionResizeMode(1, h.Stretch) h.setSectionResizeMode(2, h.Stretch) # Cf. https://en.wikipedia.org/wiki/Quotation_mark self.cmbTransDoubleQuotes.clear() self.cmbTransDoubleQuotes.addItems(["”___“", "“___”", "«___»"]) self.cmbTransSingleQuote.clear() self.cmbTransSingleQuote.addItems(["‘___’", "‹___›"]) for cmb in [self.cmbTransDoubleQuotes, self.cmbTransSingleQuote]: cmb.addItem(self.tr("Custom"), "custom") cmb.currentIndexChanged.connect(self.transCmbChanged) cmb.currentIndexChanged.emit(0) self.btnTransAdd.clicked.connect(lambda: self.transAddTableRow(checked=True)) self.btnTransRemove.clicked.connect(self.transRemoveTableRow) self.tableWidgetAdjustToContent(self.tblReplacements) ################################################################# # Preview self.cmbPreviewFont.setCurrentFont(self.font()) self.spnPreviewSize.setValue(self.font().pointSize()) ################################################################# # Final stuff self.toolBox.setCurrentIndex(0) ################################################################################################################### # SETTINGS ################################################################################################################### def loadSettings(self): filename = self.getSettingsPath() if os.path.exists(filename): with open(filename, "r", encoding="utf-8") as f: self.settings = json.load(f) self.updateFromSettings() # Default values else: self.getSettings() def writeSettings(self): self.getSettings() with open(self.getSettingsPath(), 'w', encoding="utf-8") as f: # json.dumps(json.loads(json.dumps(allSettings)), indent=4, sort_keys=True) json.dump(self.settings, f, indent=4, sort_keys=True) def getSettingsPath(self): return os.path.join(writablePath(), "exporter.ini") def updateFromSettings(self): settings = self.settings # Content s = settings["Content"] self.chkContentMore.setChecked(s["More"]) if not s["More"]: self.tblContent.item(0, 1).setCheckState(Qt.Checked if s["FolderTitle"] else Qt.Unchecked) self.tblContent.item(1, 1).setCheckState(Qt.Checked if s["TextTitle"] else Qt.Unchecked) self.tblContent.item(1, 2).setCheckState(Qt.Checked if s["TextText"] else Qt.Unchecked) else: nLevel = len(s["FolderTitle"]) for i in range(nLevel): item = self.tblContent.item(i + 2, 1) if item: item.setCheckState(Qt.Checked if s["FolderTitle"][i] else Qt.Unchecked) item = self.tblContent.item(i + 2 + nLevel, 1) if item: item.setCheckState(Qt.Checked if s["TextTitle"][i] else Qt.Unchecked) item = self.tblContent.item(i + 2 + nLevel, 2) if item: item.setCheckState(Qt.Checked if s["TextText"][i] else Qt.Unchecked) self.chkContentIgnoreCompile.setChecked(s["IgnoreCompile"]) self.chkContentParent.setChecked(s["Parent"]) self.chkContentLabels.setChecked(s["Labels"]) self.chkContentStatus.setChecked(s["Status"]) # FIXME: parent, labels, status # Separations s = settings["Separator"] for val, cmb, txt in [ ("FF", self.cmbSepFF, self.txtSepFF), ("TT", self.cmbSepTT, self.txtSepTT), ("FT", self.cmbSepFT, self.txtSepFT), ("TF", self.cmbSepTF, self.txtSepTF), ]: if s[val] == "\n": cmb.setCurrentIndex(0) else: cmb.setCurrentIndex(1) txt.setText(self._format.escapes(s[val])) # Transformations s = settings["Transform"] self.chkTransEllipse.setChecked(s["Ellipse"]) self.chkTransDash.setChecked(s["Dash"]) for val, chk, cmb, txtA, txtB in [ ("DoubleQuotes", self.chkTransDoubleQuotes, self.cmbTransDoubleQuotes, self.txtTransDoubleQuotesA, self.txtTransDoubleQuotesB), ("SingleQuote", self.chkTransSingleQuote, self.cmbTransSingleQuote, self.txtTransSingleQuoteA, self.txtTransSingleQuoteB), ]: chk.setChecked(s[val] != False) if s[val]: if cmb.findText(s[val]) != -1: cmb.setCurrentText(s[val]) else: cmb.setCurrentIndex(cmb.count() - 1) txtA.setText(s[val].split("___")[0]) txtB.setText(s[val].split("___")[1]) self.chkTransSpaces.setChecked(s["Spaces"]) for i in s["Custom"]: self.transAddTableRow(i[0], i[1], i[2], i[3]) # Preview s = settings["Preview"] f = QFont() f.fromString(s["PreviewFont"]) self.cmbPreviewFont.setCurrentFont(f) self.spnPreviewSize.setValue(f.pointSize()) def getSettings(self): """Updates settings from ui, and return.""" # Content s = self.settings.get("Content", {}) s["More"] = self.chkContentMore.isChecked() if not s["More"]: s["FolderTitle"] = self.tblContent.item(0, 1).checkState() == Qt.Checked s["TextTitle"] = self.tblContent.item(1, 1).checkState() == Qt.Checked s["TextText"] = self.tblContent.item(1, 2).checkState() == Qt.Checked else: s["FolderTitle"] = [] s["TextTitle"] = [] s["TextText"] = [] nLevel = int((self.tblContent.rowCount() - 2) / 2) for row in range(nLevel): s["FolderTitle"].append(self.tblContent.item(2 + row, 1).checkState() == Qt.Checked) s["TextTitle"].append(self.tblContent.item(2 + row + nLevel, 1).checkState() == Qt.Checked) s["TextText"].append(self.tblContent.item(2 + row + nLevel, 2).checkState() == Qt.Checked) s["IgnoreCompile"] = self.chkContentIgnoreCompile.isChecked() s["Parent"] = self.chkContentParent.isChecked() s["Labels"] = self.chkContentLabels.isChecked() s["Status"] = self.chkContentStatus.isChecked() self.settings["Content"] = s # FIXME: parent, labels, status # Separations s = self.settings.get("Separator", {}) for val, cmb, txt in [ ("FF", self.cmbSepFF, self.txtSepFF), ("TT", self.cmbSepTT, self.txtSepTT), ("FT", self.cmbSepFT, self.txtSepFT), ("TF", self.cmbSepTF, self.txtSepTF), ]: if cmb.currentIndex() == 0: s[val] = "\n" else: s[val] = self._format.descapes(txt.text()) self.settings["Separator"] = s # Transformations s = self.settings.get("Transform", {}) s["Ellipse"] = self.chkTransEllipse.isChecked() s["Dash"] = self.chkTransDash.isChecked() for val, chk, cmb, txtA, txtB in [ ("DoubleQuotes", self.chkTransDoubleQuotes, self.cmbTransDoubleQuotes, self.txtTransDoubleQuotesA, self.txtTransDoubleQuotesB), ("SingleQuote", self.chkTransSingleQuote, self.cmbTransSingleQuote, self.txtTransSingleQuoteA, self.txtTransSingleQuoteB), ]: if not chk.isChecked(): s[val] = False else: if cmb.currentData() == "custom": s[val] = txtA.text() + "___" + txtB.text() else: s[val] = cmb.currentText() s["Spaces"] = self.chkTransSpaces.isChecked() s["Custom"] = [] for i in range(self.tblReplacements.rowCount()): s["Custom"].append(self.getTableRowValues(self.tblReplacements, i)) self.settings["Transform"] = s # Preview s = self.settings.get("Preview", {}) f = self.cmbPreviewFont.currentFont() f.setPointSize(self.spnPreviewSize.value()) s["PreviewFont"] = f.toString() self.settings["Preview"] = s return self.settings def sepCmbChanged(self, index): cmb = self.sender() map = { self.cmbSepFF: self.txtSepFF, self.cmbSepTT: self.txtSepTT, self.cmbSepFT: self.txtSepFT, self.cmbSepTF: self.txtSepTF } map[cmb].setEnabled(cmb.currentData() == "custom") def transCmbChanged(self, index): cmb = self.sender() map = { self.cmbTransDoubleQuotes: (self.txtTransDoubleQuotesA, self.lblTransDoubleQuotes, self.txtTransDoubleQuotesB), self.cmbTransSingleQuote: (self.txtTransSingleQuoteA, self.lblTransSingleQuote, self.txtTransSingleQuoteB), } for txt in map[cmb]: txt.setVisible(cmb.currentData() == "custom") def contentUpdateTable(self): def addFolderRow(text=self.tr("Folder")): self.tableWidgetAddRow(self.tblContent, [ self.tableWidgetMakeItem(text, "folder"), self.tableWidgetMakeItem("", "", True, True), ]) def addTextRow(text=self.tr("Text")): self.tableWidgetAddRow(self.tblContent, [ self.tableWidgetMakeItem(text, "text-x-generic"), self.tableWidgetMakeItem("", "", True, False), self.tableWidgetMakeItem("", "", True, True), ]) self.tblContent.setRowCount(0) # Basic addFolderRow() addTextRow() # Detailed level = self.mw.mdlOutline.maxLevel() for i in range(level): addFolderRow(self.tr("{}Level {} folder").format(" " * i, i + 1)) for i in range(level): addTextRow(self.tr("{}Level {} text").format(" " * i, i + 1)) self.tableWidgetAdjustToContent(self.tblContent) def contentTableToggle(self, detailed): for i in range(self.tblContent.rowCount()): self.tblContent.setRowHidden(i, i in [0, 1] and detailed or (not i in [0, 1] and not detailed)) self.tableWidgetAdjustToContent(self.tblContent) def getTableRowValues(self, table, row): r = [] for col in range(table.columnCount()): item = table.item(row, col) if not item: r.append(None) elif item.flags() & Qt.ItemIsUserCheckable == Qt.ItemIsUserCheckable: r.append(item.checkState() == Qt.Checked) else: r.append(item.text()) return r def transAddTableRow(self, checked=True, A="", B="", regexp=False): self.tableWidgetAddRow(self.tblReplacements, [ self.tableWidgetMakeItem("", "", True, checked), self.tableWidgetMakeItem(A, "", False, False), self.tableWidgetMakeItem(B, "", False, False), self.tableWidgetMakeItem("", "", True, regexp), ]) self.tableWidgetAdjustToContent(self.tblReplacements) def transRemoveTableRow(self): self.tblReplacements.removeRow(self.tblReplacements.currentRow()) self.tableWidgetAdjustToContent(self.tblReplacements) def tableWidgetMakeItem(self, text="", icon="", checkable=False, checked=False): """Creates a QTableWidgetItem with the given attributes.""" item = QTableWidgetItem(QIcon.fromTheme(icon), text) if checkable: item.setFlags(item.flags() | Qt.ItemIsUserCheckable) item.setCheckState(Qt.Checked if checked else Qt.Unchecked) else: item.setFlags(item.flags() & ~Qt.ItemIsUserCheckable) return item def tableWidgetAddRow(self, table, items): """Appends the given items (list of QTableWidgetItems) to table.""" table.setRowCount(table.rowCount() + 1) k = 0 for i in items: table.setItem(table.rowCount() - 1, k, i) k += 1 def tableWidgetAdjustToContent(self, table): """Set sizehint of QTableWidget table so that it matches content vertically.""" h = 0 h += table.horizontalHeader().height() for i in range(table.rowCount()): h += table.rowHeight(i) table.setMinimumSize(QSize(0, h + 2)) table.setMaximumSize(QSize(16777215, h + 2)) def listWidgetAdjustToContent(self, lst): """Adjust listWidget to content.""" h = 0 for i in range(lst.count()): h += lst.item(i).sizeHint().height() lst.setMinimumSize(QSize(0, h+2)) lst.setMaximumSize(QSize(16777215, h+2)) manuskript-0.10.0/manuskript/ui/exporters/manuskript/plainTextSettings_ui.py000066400000000000000000001037051354442177200276060ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'manuskript/ui/exporters/manuskript/plainTextSettings_ui.ui' # # Created by: PyQt5 UI code generator 5.9 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_exporterSettings(object): def setupUi(self, exporterSettings): exporterSettings.setObjectName("exporterSettings") exporterSettings.resize(511, 626) self.verticalLayout_2 = QtWidgets.QVBoxLayout(exporterSettings) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setSpacing(10) self.verticalLayout_2.setObjectName("verticalLayout_2") self.toolBox = QtWidgets.QToolBox(exporterSettings) self.toolBox.setObjectName("toolBox") self.content = QtWidgets.QWidget() self.content.setGeometry(QtCore.QRect(0, 0, 349, 842)) self.content.setObjectName("content") self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.content) self.verticalLayout_5.setContentsMargins(0, 0, 0, 0) self.verticalLayout_5.setObjectName("verticalLayout_5") self.label = QtWidgets.QLabel(self.content) self.label.setObjectName("label") self.verticalLayout_5.addWidget(self.label) self.tblContent = QtWidgets.QTableWidget(self.content) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.tblContent.sizePolicy().hasHeightForWidth()) self.tblContent.setSizePolicy(sizePolicy) self.tblContent.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) self.tblContent.setAlternatingRowColors(True) self.tblContent.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) self.tblContent.setObjectName("tblContent") self.tblContent.setColumnCount(3) self.tblContent.setRowCount(0) item = QtWidgets.QTableWidgetItem() self.tblContent.setHorizontalHeaderItem(0, item) item = QtWidgets.QTableWidgetItem() self.tblContent.setHorizontalHeaderItem(1, item) item = QtWidgets.QTableWidgetItem() self.tblContent.setHorizontalHeaderItem(2, item) self.tblContent.horizontalHeader().setMinimumSectionSize(75) self.tblContent.verticalHeader().setVisible(False) self.verticalLayout_5.addWidget(self.tblContent) self.horizontalLayout_8 = QtWidgets.QHBoxLayout() self.horizontalLayout_8.setObjectName("horizontalLayout_8") spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_8.addItem(spacerItem) self.chkContentMore = QtWidgets.QCheckBox(self.content) self.chkContentMore.setObjectName("chkContentMore") self.horizontalLayout_8.addWidget(self.chkContentMore) self.verticalLayout_5.addLayout(self.horizontalLayout_8) self.grpContentFilters = collapsibleGroupBox2(self.content) self.grpContentFilters.setCheckable(True) self.grpContentFilters.setObjectName("grpContentFilters") self.formLayout_2 = QtWidgets.QFormLayout(self.grpContentFilters) self.formLayout_2.setRowWrapPolicy(QtWidgets.QFormLayout.WrapLongRows) self.formLayout_2.setLabelAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) self.formLayout_2.setObjectName("formLayout_2") self.label_2 = QtWidgets.QLabel(self.grpContentFilters) self.label_2.setObjectName("label_2") self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.SpanningRole, self.label_2) self.chkContentIgnoreCompile = QtWidgets.QCheckBox(self.grpContentFilters) self.chkContentIgnoreCompile.setObjectName("chkContentIgnoreCompile") self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.SpanningRole, self.chkContentIgnoreCompile) self.chkContentParent = QtWidgets.QCheckBox(self.grpContentFilters) self.chkContentParent.setObjectName("chkContentParent") self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.chkContentParent) self.cmbContentParent = QtWidgets.QComboBox(self.grpContentFilters) self.cmbContentParent.setFrame(False) self.cmbContentParent.setObjectName("cmbContentParent") self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.cmbContentParent) self.chkContentLabels = QtWidgets.QCheckBox(self.grpContentFilters) self.chkContentLabels.setObjectName("chkContentLabels") self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.chkContentLabels) self.chkContentStatus = QtWidgets.QCheckBox(self.grpContentFilters) self.chkContentStatus.setObjectName("chkContentStatus") self.formLayout_2.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.chkContentStatus) self.lstContentLabels = QtWidgets.QListWidget(self.grpContentFilters) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.lstContentLabels.sizePolicy().hasHeightForWidth()) self.lstContentLabels.setSizePolicy(sizePolicy) self.lstContentLabels.setObjectName("lstContentLabels") self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.lstContentLabels) self.lstContentStatus = QtWidgets.QListWidget(self.grpContentFilters) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.lstContentStatus.sizePolicy().hasHeightForWidth()) self.lstContentStatus.setSizePolicy(sizePolicy) self.lstContentStatus.setObjectName("lstContentStatus") self.formLayout_2.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.lstContentStatus) self.verticalLayout_5.addWidget(self.grpContentFilters) spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_5.addItem(spacerItem1) self.toolBox.addItem(self.content, "") self.separations = QtWidgets.QWidget() self.separations.setGeometry(QtCore.QRect(0, 0, 173, 336)) self.separations.setObjectName("separations") self.verticalLayout_8 = QtWidgets.QVBoxLayout(self.separations) self.verticalLayout_8.setContentsMargins(0, 0, 0, 0) self.verticalLayout_8.setObjectName("verticalLayout_8") self.label_3 = QtWidgets.QLabel(self.separations) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.label_3.setFont(font) self.label_3.setObjectName("label_3") self.verticalLayout_8.addWidget(self.label_3) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") spacerItem2 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem2) self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName("verticalLayout") self.pushButton_4 = QtWidgets.QPushButton(self.separations) self.pushButton_4.setEnabled(True) self.pushButton_4.setMinimumSize(QtCore.QSize(16, 16)) self.pushButton_4.setMaximumSize(QtCore.QSize(16, 16)) self.pushButton_4.setText("") icon = QtGui.QIcon.fromTheme("folder") self.pushButton_4.setIcon(icon) self.pushButton_4.setFlat(True) self.pushButton_4.setObjectName("pushButton_4") self.verticalLayout.addWidget(self.pushButton_4) self.line = QtWidgets.QFrame(self.separations) self.line.setFrameShape(QtWidgets.QFrame.HLine) self.line.setFrameShadow(QtWidgets.QFrame.Sunken) self.line.setObjectName("line") self.verticalLayout.addWidget(self.line) self.pushButton = QtWidgets.QPushButton(self.separations) self.pushButton.setEnabled(True) self.pushButton.setMinimumSize(QtCore.QSize(16, 16)) self.pushButton.setMaximumSize(QtCore.QSize(16, 16)) self.pushButton.setText("") icon = QtGui.QIcon.fromTheme("folder") self.pushButton.setIcon(icon) self.pushButton.setFlat(True) self.pushButton.setObjectName("pushButton") self.verticalLayout.addWidget(self.pushButton) self.horizontalLayout.addLayout(self.verticalLayout) self.cmbSepFF = QtWidgets.QComboBox(self.separations) self.cmbSepFF.setObjectName("cmbSepFF") self.cmbSepFF.addItem("") self.cmbSepFF.addItem("") self.horizontalLayout.addWidget(self.cmbSepFF) self.txtSepFF = QtWidgets.QLineEdit(self.separations) self.txtSepFF.setEnabled(False) self.txtSepFF.setText("\\n") self.txtSepFF.setObjectName("txtSepFF") self.horizontalLayout.addWidget(self.txtSepFF) self.verticalLayout_8.addLayout(self.horizontalLayout) self.label_4 = QtWidgets.QLabel(self.separations) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.label_4.setFont(font) self.label_4.setObjectName("label_4") self.verticalLayout_8.addWidget(self.label_4) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") spacerItem3 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem3) self.verticalLayout_3 = QtWidgets.QVBoxLayout() self.verticalLayout_3.setObjectName("verticalLayout_3") self.pushButton_5 = QtWidgets.QPushButton(self.separations) self.pushButton_5.setEnabled(True) self.pushButton_5.setMinimumSize(QtCore.QSize(16, 16)) self.pushButton_5.setMaximumSize(QtCore.QSize(16, 16)) self.pushButton_5.setText("") icon = QtGui.QIcon.fromTheme("text-x-generic") self.pushButton_5.setIcon(icon) self.pushButton_5.setFlat(True) self.pushButton_5.setObjectName("pushButton_5") self.verticalLayout_3.addWidget(self.pushButton_5) self.line_2 = QtWidgets.QFrame(self.separations) self.line_2.setFrameShape(QtWidgets.QFrame.HLine) self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken) self.line_2.setObjectName("line_2") self.verticalLayout_3.addWidget(self.line_2) self.pushButton_6 = QtWidgets.QPushButton(self.separations) self.pushButton_6.setEnabled(True) self.pushButton_6.setMinimumSize(QtCore.QSize(16, 16)) self.pushButton_6.setMaximumSize(QtCore.QSize(16, 16)) self.pushButton_6.setText("") icon = QtGui.QIcon.fromTheme("text-x-generic") self.pushButton_6.setIcon(icon) self.pushButton_6.setFlat(True) self.pushButton_6.setObjectName("pushButton_6") self.verticalLayout_3.addWidget(self.pushButton_6) self.horizontalLayout_2.addLayout(self.verticalLayout_3) self.cmbSepTT = QtWidgets.QComboBox(self.separations) self.cmbSepTT.setObjectName("cmbSepTT") self.cmbSepTT.addItem("") self.cmbSepTT.addItem("") self.horizontalLayout_2.addWidget(self.cmbSepTT) self.txtSepTT = QtWidgets.QLineEdit(self.separations) self.txtSepTT.setEnabled(False) self.txtSepTT.setText("\\n") self.txtSepTT.setObjectName("txtSepTT") self.horizontalLayout_2.addWidget(self.txtSepTT) self.verticalLayout_8.addLayout(self.horizontalLayout_2) self.label_6 = QtWidgets.QLabel(self.separations) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.label_6.setFont(font) self.label_6.setObjectName("label_6") self.verticalLayout_8.addWidget(self.label_6) self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") spacerItem4 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_3.addItem(spacerItem4) self.verticalLayout_4 = QtWidgets.QVBoxLayout() self.verticalLayout_4.setObjectName("verticalLayout_4") self.pushButton_7 = QtWidgets.QPushButton(self.separations) self.pushButton_7.setEnabled(True) self.pushButton_7.setMinimumSize(QtCore.QSize(16, 16)) self.pushButton_7.setMaximumSize(QtCore.QSize(16, 16)) self.pushButton_7.setText("") icon = QtGui.QIcon.fromTheme("folder") self.pushButton_7.setIcon(icon) self.pushButton_7.setFlat(True) self.pushButton_7.setObjectName("pushButton_7") self.verticalLayout_4.addWidget(self.pushButton_7) self.line_3 = QtWidgets.QFrame(self.separations) self.line_3.setFrameShape(QtWidgets.QFrame.HLine) self.line_3.setFrameShadow(QtWidgets.QFrame.Sunken) self.line_3.setObjectName("line_3") self.verticalLayout_4.addWidget(self.line_3) self.pushButton_8 = QtWidgets.QPushButton(self.separations) self.pushButton_8.setEnabled(True) self.pushButton_8.setMinimumSize(QtCore.QSize(16, 16)) self.pushButton_8.setMaximumSize(QtCore.QSize(16, 16)) self.pushButton_8.setText("") icon = QtGui.QIcon.fromTheme("text-x-generic") self.pushButton_8.setIcon(icon) self.pushButton_8.setFlat(True) self.pushButton_8.setObjectName("pushButton_8") self.verticalLayout_4.addWidget(self.pushButton_8) self.horizontalLayout_3.addLayout(self.verticalLayout_4) self.cmbSepFT = QtWidgets.QComboBox(self.separations) self.cmbSepFT.setObjectName("cmbSepFT") self.cmbSepFT.addItem("") self.cmbSepFT.addItem("") self.horizontalLayout_3.addWidget(self.cmbSepFT) self.txtSepFT = QtWidgets.QLineEdit(self.separations) self.txtSepFT.setEnabled(False) self.txtSepFT.setText("\\n") self.txtSepFT.setObjectName("txtSepFT") self.horizontalLayout_3.addWidget(self.txtSepFT) self.verticalLayout_8.addLayout(self.horizontalLayout_3) self.label_5 = QtWidgets.QLabel(self.separations) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.label_5.setFont(font) self.label_5.setObjectName("label_5") self.verticalLayout_8.addWidget(self.label_5) self.horizontalLayout_4 = QtWidgets.QHBoxLayout() self.horizontalLayout_4.setObjectName("horizontalLayout_4") spacerItem5 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_4.addItem(spacerItem5) self.verticalLayout_7 = QtWidgets.QVBoxLayout() self.verticalLayout_7.setObjectName("verticalLayout_7") self.pushButton_9 = QtWidgets.QPushButton(self.separations) self.pushButton_9.setEnabled(True) self.pushButton_9.setMinimumSize(QtCore.QSize(16, 16)) self.pushButton_9.setMaximumSize(QtCore.QSize(16, 16)) self.pushButton_9.setText("") icon = QtGui.QIcon.fromTheme("text-x-generic") self.pushButton_9.setIcon(icon) self.pushButton_9.setFlat(True) self.pushButton_9.setObjectName("pushButton_9") self.verticalLayout_7.addWidget(self.pushButton_9) self.line_4 = QtWidgets.QFrame(self.separations) self.line_4.setFrameShape(QtWidgets.QFrame.HLine) self.line_4.setFrameShadow(QtWidgets.QFrame.Sunken) self.line_4.setObjectName("line_4") self.verticalLayout_7.addWidget(self.line_4) self.pushButton_10 = QtWidgets.QPushButton(self.separations) self.pushButton_10.setEnabled(True) self.pushButton_10.setMinimumSize(QtCore.QSize(16, 16)) self.pushButton_10.setMaximumSize(QtCore.QSize(16, 16)) self.pushButton_10.setText("") icon = QtGui.QIcon.fromTheme("folder") self.pushButton_10.setIcon(icon) self.pushButton_10.setFlat(True) self.pushButton_10.setObjectName("pushButton_10") self.verticalLayout_7.addWidget(self.pushButton_10) self.horizontalLayout_4.addLayout(self.verticalLayout_7) self.cmbSepTF = QtWidgets.QComboBox(self.separations) self.cmbSepTF.setObjectName("cmbSepTF") self.cmbSepTF.addItem("") self.cmbSepTF.addItem("") self.horizontalLayout_4.addWidget(self.cmbSepTF) self.txtSepTF = QtWidgets.QLineEdit(self.separations) self.txtSepTF.setEnabled(False) self.txtSepTF.setText("\\n") self.txtSepTF.setObjectName("txtSepTF") self.horizontalLayout_4.addWidget(self.txtSepTF) self.verticalLayout_8.addLayout(self.horizontalLayout_4) spacerItem6 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_8.addItem(spacerItem6) self.toolBox.addItem(self.separations, "") self.transformations = QtWidgets.QWidget() self.transformations.setGeometry(QtCore.QRect(0, 0, 511, 522)) self.transformations.setStyleSheet("QGroupBox{font-weight:bold;}") self.transformations.setObjectName("transformations") self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.transformations) self.verticalLayout_6.setContentsMargins(0, 0, 0, 0) self.verticalLayout_6.setObjectName("verticalLayout_6") self.grpTransTypo = collapsibleGroupBox2(self.transformations) self.grpTransTypo.setStyleSheet("") self.grpTransTypo.setObjectName("grpTransTypo") self.formLayout = QtWidgets.QFormLayout(self.grpTransTypo) self.formLayout.setFieldGrowthPolicy(QtWidgets.QFormLayout.FieldsStayAtSizeHint) self.formLayout.setRowWrapPolicy(QtWidgets.QFormLayout.WrapLongRows) self.formLayout.setLabelAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) self.formLayout.setObjectName("formLayout") self.chkTransEllipse = QtWidgets.QCheckBox(self.grpTransTypo) self.chkTransEllipse.setObjectName("chkTransEllipse") self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.chkTransEllipse) self.chkTransDash = QtWidgets.QCheckBox(self.grpTransTypo) self.chkTransDash.setObjectName("chkTransDash") self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.chkTransDash) self.chkTransDoubleQuotes = QtWidgets.QCheckBox(self.grpTransTypo) self.chkTransDoubleQuotes.setObjectName("chkTransDoubleQuotes") self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.chkTransDoubleQuotes) self.horizontalLayout_5 = QtWidgets.QHBoxLayout() self.horizontalLayout_5.setSpacing(12) self.horizontalLayout_5.setObjectName("horizontalLayout_5") self.cmbTransDoubleQuotes = QtWidgets.QComboBox(self.grpTransTypo) self.cmbTransDoubleQuotes.setFrame(False) self.cmbTransDoubleQuotes.setObjectName("cmbTransDoubleQuotes") self.horizontalLayout_5.addWidget(self.cmbTransDoubleQuotes) self.txtTransDoubleQuotesA = QtWidgets.QLineEdit(self.grpTransTypo) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.txtTransDoubleQuotesA.sizePolicy().hasHeightForWidth()) self.txtTransDoubleQuotesA.setSizePolicy(sizePolicy) self.txtTransDoubleQuotesA.setMinimumSize(QtCore.QSize(40, 0)) self.txtTransDoubleQuotesA.setMaximumSize(QtCore.QSize(40, 16777215)) self.txtTransDoubleQuotesA.setStyleSheet("border-radius: 6px;") self.txtTransDoubleQuotesA.setText("") self.txtTransDoubleQuotesA.setFrame(False) self.txtTransDoubleQuotesA.setAlignment(QtCore.Qt.AlignCenter) self.txtTransDoubleQuotesA.setObjectName("txtTransDoubleQuotesA") self.horizontalLayout_5.addWidget(self.txtTransDoubleQuotesA) self.lblTransDoubleQuotes = QtWidgets.QLabel(self.grpTransTypo) self.lblTransDoubleQuotes.setText("…") self.lblTransDoubleQuotes.setObjectName("lblTransDoubleQuotes") self.horizontalLayout_5.addWidget(self.lblTransDoubleQuotes) self.txtTransDoubleQuotesB = QtWidgets.QLineEdit(self.grpTransTypo) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.txtTransDoubleQuotesB.sizePolicy().hasHeightForWidth()) self.txtTransDoubleQuotesB.setSizePolicy(sizePolicy) self.txtTransDoubleQuotesB.setMinimumSize(QtCore.QSize(40, 0)) self.txtTransDoubleQuotesB.setMaximumSize(QtCore.QSize(40, 16777215)) self.txtTransDoubleQuotesB.setStyleSheet("border-radius: 6px;") self.txtTransDoubleQuotesB.setText("") self.txtTransDoubleQuotesB.setFrame(False) self.txtTransDoubleQuotesB.setAlignment(QtCore.Qt.AlignCenter) self.txtTransDoubleQuotesB.setObjectName("txtTransDoubleQuotesB") self.horizontalLayout_5.addWidget(self.txtTransDoubleQuotesB) spacerItem7 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_5.addItem(spacerItem7) self.formLayout.setLayout(2, QtWidgets.QFormLayout.FieldRole, self.horizontalLayout_5) self.chkTransSingleQuote = QtWidgets.QCheckBox(self.grpTransTypo) self.chkTransSingleQuote.setObjectName("chkTransSingleQuote") self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.chkTransSingleQuote) self.horizontalLayout_6 = QtWidgets.QHBoxLayout() self.horizontalLayout_6.setSpacing(12) self.horizontalLayout_6.setObjectName("horizontalLayout_6") self.cmbTransSingleQuote = QtWidgets.QComboBox(self.grpTransTypo) self.cmbTransSingleQuote.setFrame(False) self.cmbTransSingleQuote.setObjectName("cmbTransSingleQuote") self.horizontalLayout_6.addWidget(self.cmbTransSingleQuote) self.txtTransSingleQuoteA = QtWidgets.QLineEdit(self.grpTransTypo) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.txtTransSingleQuoteA.sizePolicy().hasHeightForWidth()) self.txtTransSingleQuoteA.setSizePolicy(sizePolicy) self.txtTransSingleQuoteA.setMinimumSize(QtCore.QSize(40, 0)) self.txtTransSingleQuoteA.setMaximumSize(QtCore.QSize(40, 16777215)) self.txtTransSingleQuoteA.setStyleSheet("border-radius: 6px;") self.txtTransSingleQuoteA.setText("") self.txtTransSingleQuoteA.setFrame(False) self.txtTransSingleQuoteA.setAlignment(QtCore.Qt.AlignCenter) self.txtTransSingleQuoteA.setObjectName("txtTransSingleQuoteA") self.horizontalLayout_6.addWidget(self.txtTransSingleQuoteA) self.lblTransSingleQuote = QtWidgets.QLabel(self.grpTransTypo) self.lblTransSingleQuote.setText("…") self.lblTransSingleQuote.setObjectName("lblTransSingleQuote") self.horizontalLayout_6.addWidget(self.lblTransSingleQuote) self.txtTransSingleQuoteB = QtWidgets.QLineEdit(self.grpTransTypo) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.txtTransSingleQuoteB.sizePolicy().hasHeightForWidth()) self.txtTransSingleQuoteB.setSizePolicy(sizePolicy) self.txtTransSingleQuoteB.setMinimumSize(QtCore.QSize(40, 0)) self.txtTransSingleQuoteB.setMaximumSize(QtCore.QSize(40, 16777215)) self.txtTransSingleQuoteB.setStyleSheet("border-radius: 6px;") self.txtTransSingleQuoteB.setText("") self.txtTransSingleQuoteB.setFrame(False) self.txtTransSingleQuoteB.setAlignment(QtCore.Qt.AlignCenter) self.txtTransSingleQuoteB.setObjectName("txtTransSingleQuoteB") self.horizontalLayout_6.addWidget(self.txtTransSingleQuoteB) spacerItem8 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_6.addItem(spacerItem8) self.formLayout.setLayout(3, QtWidgets.QFormLayout.FieldRole, self.horizontalLayout_6) self.chkTransSpaces = QtWidgets.QCheckBox(self.grpTransTypo) self.chkTransSpaces.setObjectName("chkTransSpaces") self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.chkTransSpaces) self.verticalLayout_6.addWidget(self.grpTransTypo) self.grpTransCustom = collapsibleGroupBox2(self.transformations) self.grpTransCustom.setObjectName("grpTransCustom") self.verticalLayout_9 = QtWidgets.QVBoxLayout(self.grpTransCustom) self.verticalLayout_9.setObjectName("verticalLayout_9") self.tblReplacements = QtWidgets.QTableWidget(self.grpTransCustom) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.tblReplacements.sizePolicy().hasHeightForWidth()) self.tblReplacements.setSizePolicy(sizePolicy) self.tblReplacements.setAlternatingRowColors(True) self.tblReplacements.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) self.tblReplacements.setObjectName("tblReplacements") self.tblReplacements.setColumnCount(4) self.tblReplacements.setRowCount(0) item = QtWidgets.QTableWidgetItem() self.tblReplacements.setHorizontalHeaderItem(0, item) item = QtWidgets.QTableWidgetItem() self.tblReplacements.setHorizontalHeaderItem(1, item) item = QtWidgets.QTableWidgetItem() self.tblReplacements.setHorizontalHeaderItem(2, item) item = QtWidgets.QTableWidgetItem() self.tblReplacements.setHorizontalHeaderItem(3, item) self.verticalLayout_9.addWidget(self.tblReplacements) self.horizontalLayout_7 = QtWidgets.QHBoxLayout() self.horizontalLayout_7.setSpacing(0) self.horizontalLayout_7.setObjectName("horizontalLayout_7") spacerItem9 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_7.addItem(spacerItem9) self.btnTransAdd = QtWidgets.QPushButton(self.grpTransCustom) self.btnTransAdd.setText("") icon = QtGui.QIcon.fromTheme("list-add") self.btnTransAdd.setIcon(icon) self.btnTransAdd.setFlat(True) self.btnTransAdd.setObjectName("btnTransAdd") self.horizontalLayout_7.addWidget(self.btnTransAdd) self.btnTransRemove = QtWidgets.QPushButton(self.grpTransCustom) self.btnTransRemove.setText("") icon = QtGui.QIcon.fromTheme("list-remove") self.btnTransRemove.setIcon(icon) self.btnTransRemove.setFlat(True) self.btnTransRemove.setObjectName("btnTransRemove") self.horizontalLayout_7.addWidget(self.btnTransRemove) self.verticalLayout_9.addLayout(self.horizontalLayout_7) self.verticalLayout_6.addWidget(self.grpTransCustom) spacerItem10 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_6.addItem(spacerItem10) self.toolBox.addItem(self.transformations, "") self.preview = QtWidgets.QWidget() self.preview.setGeometry(QtCore.QRect(0, 0, 369, 130)) self.preview.setStyleSheet("QGroupBox{font-weight:bold;}") self.preview.setObjectName("preview") self.verticalLayout_11 = QtWidgets.QVBoxLayout(self.preview) self.verticalLayout_11.setContentsMargins(0, 0, 0, 0) self.verticalLayout_11.setObjectName("verticalLayout_11") self.groupBox = QtWidgets.QGroupBox(self.preview) self.groupBox.setObjectName("groupBox") self.formLayout_3 = QtWidgets.QFormLayout(self.groupBox) self.formLayout_3.setObjectName("formLayout_3") self.label_7 = QtWidgets.QLabel(self.groupBox) self.label_7.setObjectName("label_7") self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_7) self.cmbPreviewFont = QtWidgets.QFontComboBox(self.groupBox) self.cmbPreviewFont.setObjectName("cmbPreviewFont") self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.cmbPreviewFont) self.label_8 = QtWidgets.QLabel(self.groupBox) self.label_8.setObjectName("label_8") self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_8) self.spnPreviewSize = QtWidgets.QSpinBox(self.groupBox) self.spnPreviewSize.setObjectName("spnPreviewSize") self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.spnPreviewSize) self.verticalLayout_11.addWidget(self.groupBox) spacerItem11 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_11.addItem(spacerItem11) self.toolBox.addItem(self.preview, "") self.verticalLayout_2.addWidget(self.toolBox) self.retranslateUi(exporterSettings) self.toolBox.setCurrentIndex(2) self.toolBox.layout().setSpacing(0) QtCore.QMetaObject.connectSlotsByName(exporterSettings) def retranslateUi(self, exporterSettings): _translate = QtCore.QCoreApplication.translate exporterSettings.setWindowTitle(_translate("exporterSettings", "Form")) self.label.setText(_translate("exporterSettings", "Decide here what will be included in the final export.")) item = self.tblContent.horizontalHeaderItem(0) item.setText(_translate("exporterSettings", "Type")) item = self.tblContent.horizontalHeaderItem(1) item.setText(_translate("exporterSettings", "Title")) item = self.tblContent.horizontalHeaderItem(2) item.setText(_translate("exporterSettings", "Text")) self.chkContentMore.setText(_translate("exporterSettings", "I need more granularity")) self.grpContentFilters.setTitle(_translate("exporterSettings", "Fi<ers")) self.label_2.setText(_translate("exporterSettings", "

    Filters what items will be included in the final export.
    (Not fully implemented yet.)

    ")) self.chkContentIgnoreCompile.setText(_translate("exporterSettings", "Ignore compile status (include all items)")) self.chkContentParent.setText(_translate("exporterSettings", "Subitems of:")) self.chkContentLabels.setText(_translate("exporterSettings", "Labels")) self.chkContentStatus.setText(_translate("exporterSettings", "Status")) self.toolBox.setItemText(self.toolBox.indexOf(self.content), _translate("exporterSettings", "Content")) self.label_3.setText(_translate("exporterSettings", "Between folders:")) self.cmbSepFF.setItemText(0, _translate("exporterSettings", "Empty line")) self.cmbSepFF.setItemText(1, _translate("exporterSettings", "Custom")) self.label_4.setText(_translate("exporterSettings", "Between texts:")) self.cmbSepTT.setItemText(0, _translate("exporterSettings", "Empty line")) self.cmbSepTT.setItemText(1, _translate("exporterSettings", "Custom")) self.label_6.setText(_translate("exporterSettings", "Between folder and text:")) self.cmbSepFT.setItemText(0, _translate("exporterSettings", "Empty line")) self.cmbSepFT.setItemText(1, _translate("exporterSettings", "Custom")) self.label_5.setText(_translate("exporterSettings", "Between text and folder:")) self.cmbSepTF.setItemText(0, _translate("exporterSettings", "Empty line")) self.cmbSepTF.setItemText(1, _translate("exporterSettings", "Custom")) self.toolBox.setItemText(self.toolBox.indexOf(self.separations), _translate("exporterSettings", "Separations")) self.grpTransTypo.setTitle(_translate("exporterSettings", "Typographic replacements:")) self.chkTransEllipse.setText(_translate("exporterSettings", "Replace ... with …")) self.chkTransDash.setText(_translate("exporterSettings", "Replace --- with —")) self.chkTransDoubleQuotes.setText(_translate("exporterSettings", "Replace double quotes (\") with:")) self.chkTransSingleQuote.setText(_translate("exporterSettings", "Replace single quotes (\') with:")) self.chkTransSpaces.setText(_translate("exporterSettings", "Remove multiple spaces")) self.grpTransCustom.setTitle(_translate("exporterSettings", "Custom replacements:")) item = self.tblReplacements.horizontalHeaderItem(0) item.setText(_translate("exporterSettings", "Enabled")) item = self.tblReplacements.horizontalHeaderItem(1) item.setText(_translate("exporterSettings", "Replace")) item = self.tblReplacements.horizontalHeaderItem(2) item.setText(_translate("exporterSettings", "With")) item = self.tblReplacements.horizontalHeaderItem(3) item.setText(_translate("exporterSettings", "RegExp")) item.setWhatsThis(_translate("exporterSettings", "If checked, uses regular expression for replacement. If unchecked, replaced as plain text.")) self.toolBox.setItemText(self.toolBox.indexOf(self.transformations), _translate("exporterSettings", "Transformations")) self.groupBox.setTitle(_translate("exporterSettings", "Font")) self.label_7.setText(_translate("exporterSettings", "Font:")) self.label_8.setText(_translate("exporterSettings", "Font size:")) self.toolBox.setItemText(self.toolBox.indexOf(self.preview), _translate("exporterSettings", "Preview")) from manuskript.ui.collapsibleGroupBox2 import collapsibleGroupBox2 manuskript-0.10.0/manuskript/ui/exporters/manuskript/plainTextSettings_ui.ui000066400000000000000000001120771354442177200275750ustar00rootroot00000000000000 exporterSettings 0 0 511 626 Form 10 0 0 0 0 2 0 0 0 349 842 Content Decide here what will be included in the final export. 0 0 QAbstractItemView::NoEditTriggers true QAbstractItemView::SelectRows 75 false Type Title Text Qt::Horizontal 40 20 I need more granularity Fi&lters true QFormLayout::WrapLongRows Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> Ignore compile status (include all items) Subitems of: false Labels Status 0 0 0 0 Qt::Vertical 20 40 0 0 173 336 Separations 75 true Between folders: Qt::Horizontal QSizePolicy::Preferred 20 20 true 16 16 16 16 .. true Qt::Horizontal true 16 16 16 16 .. true Empty line Custom false \n 75 true Between texts: Qt::Horizontal QSizePolicy::Preferred 20 20 true 16 16 16 16 .. true Qt::Horizontal true 16 16 16 16 .. true Empty line Custom false \n 75 true Between folder and text: Qt::Horizontal QSizePolicy::Preferred 20 20 true 16 16 16 16 .. true Qt::Horizontal true 16 16 16 16 .. true Empty line Custom false \n 75 true Between text and folder: Qt::Horizontal QSizePolicy::Preferred 20 20 true 16 16 16 16 .. true Qt::Horizontal true 16 16 16 16 .. true Empty line Custom false \n Qt::Vertical 20 40 0 0 511 522 QGroupBox{font-weight:bold;} Transformations Typographic replacements: QFormLayout::FieldsStayAtSizeHint QFormLayout::WrapLongRows Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter Replace ... with … Replace --- with — Replace double quotes (") with: 12 false 0 0 40 0 40 16777215 border-radius: 6px; false Qt::AlignCenter 0 0 40 0 40 16777215 border-radius: 6px; false Qt::AlignCenter Qt::Horizontal 40 20 Replace single quotes (') with: 12 false 0 0 40 0 40 16777215 border-radius: 6px; false Qt::AlignCenter 0 0 40 0 40 16777215 border-radius: 6px; false Qt::AlignCenter Qt::Horizontal 40 20 Remove multiple spaces Custom replacements: 0 0 true QAbstractItemView::SelectRows Enabled Replace With RegExp If checked, uses regular expression for replacement. If unchecked, replaced as plain text. 0 Qt::Horizontal 40 20 .. true .. true Qt::Vertical 20 40 0 0 369 130 QGroupBox{font-weight:bold;} Preview Font Font: Font size: Qt::Vertical 20 40 collapsibleGroupBox2 QGroupBox
    manuskript.ui.collapsibleGroupBox2.h
    1
    manuskript-0.10.0/manuskript/ui/helpLabel.py000066400000000000000000000012351354442177200210530ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtWidgets import QLabel, QSizePolicy class helpLabel(QLabel): def __init__(self, text=None, parent=None): QLabel.__init__(self, text, parent) self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum) self.setStatusTip(self.tr("If you don't wanna see me, you can hide me in Help menu.")) self.setStyleSheet(""" QLabel { background-color:lightYellow; border:1px solid lightGray; border-radius: 10px; margin: 3px; padding:10px; color:gray; }""") manuskript-0.10.0/manuskript/ui/highlighters/000077500000000000000000000000001354442177200212715ustar00rootroot00000000000000manuskript-0.10.0/manuskript/ui/highlighters/MMDHighlighter.py000066400000000000000000000111101354442177200244310ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf8 -*- import re from PyQt5.QtCore import Qt from PyQt5.QtGui import QTextCharFormat, QFont, QTextCursor, QFontMetrics from manuskript.ui.highlighters import BasicHighlighter class MMDHighlighter(BasicHighlighter): MARKDOWN_REGEX = { 'Bold': r'(\*\*)(.+?)(\*\*)', 'Bold2': '(__)(.+?)(__)', 'Italic': r'(\*)([^\*].+?[^\*])(\*)', 'Italic2': '(_)([^_].+?[^_])(_)', 'Title': r'^(#+)(\s*)(.*)(#*)', 'HTML': '<.+?>', 'Blockquotes': '^(> )+.*$', 'OrderedList': r'^\d+\.\s+', 'UnorderedList': r'^[\*\+-]\s+', 'Code': r'^\s{4,}.*$', 'Links-inline': r'(\[)(.*?)(\])(\()(.*?)(\))', 'Links-ref': r'(\[)(.*?)(\])\s?(\[)(.*?)(\])', 'Links-ref2': r'^\s{,3}(\[)(.*?)(\]:)\s+([^\s]*)\s*(.*?)*$', } def __init__(self, editor, style="Default"): BasicHighlighter.__init__(self, editor) self.editor = editor self.rules = {} for key in self.MARKDOWN_REGEX: self.rules[key] = re.compile(self.MARKDOWN_REGEX[key]) def doHighlightBlock(self, text): """ A quick-n-dirty very basic highlighter, that fails in most non-trivial cases. And is ugly. """ # Creates textCharFormat cfOperator = QTextCharFormat() cfOperator.setForeground(Qt.lightGray) cfBold = QTextCharFormat() cfBold.setFontWeight(QFont.Bold) cfItalic = QTextCharFormat() cfItalic.setFontItalic(True) # Titles (only atx-style, with #, not underlined) defaultSize = self._defaultCharFormat.font().pointSize() r = self.rules["Title"] for m in r.finditer(text): cfOperator.setFontPointSize(defaultSize + 12 - 2 * len(m.group(1))) cfBold.setFontPointSize(defaultSize + 12 - 2 * len(m.group(1))) self.setFormat(m.start(1), len(m.group(1)), cfOperator) self.setFormat(m.start(3), len(m.group(3)), cfBold) self.setFormat(m.start(4), len(m.group(4)), cfOperator) # Code blocks r = self.rules["Code"] format = QTextCharFormat() format.setForeground(Qt.darkGray) format.setFontFixedPitch(True) for m in r.finditer(text): self.setFormat(m.start(), m.end() - m.start(), format) # Basic stuff stuff = [ ("Blockquotes", Qt.blue), ("OrderedList", Qt.red), ("UnorderedList", Qt.darkRed), ("HTML", Qt.darkGreen), ] for name, color in stuff: r = self.rules[name] format = QTextCharFormat() format.setForeground(color) for m in r.finditer(text): self.setFormat(m.start(), m.end() - m.start(), format) # Bold and Italic for name, style in [ ("Italic", cfItalic), ("Italic2", cfItalic), ("Bold", cfBold), ("Bold2", cfBold), ]: r = self.rules[name] for m in r.finditer(text): self.setFormat(m.start(1), len(m.group(1)), cfOperator) self.setFormat(m.start(2), len(m.group(2)), style) self.setFormat(m.start(3), len(m.group(3)), cfOperator) # Links cfURL = QTextCharFormat() cfURL.setForeground(Qt.darkGreen) cfURL.setFontItalic(True) cfText = QTextCharFormat() cfText.setForeground(Qt.darkBlue) cfIdentifier = QTextCharFormat() cfIdentifier.setForeground(Qt.darkMagenta) for type in ['Links-inline', 'Links-ref']: r = self.rules[type] for m in r.finditer(text): self.setFormat(m.start(1), len(m.group(1)), cfOperator) self.setFormat(m.start(2), len(m.group(2)), cfText) self.setFormat(m.start(3), len(m.group(3)), cfOperator) self.setFormat(m.start(4), len(m.group(4)), cfOperator) self.setFormat(m.start(5), len(m.group(5)), cfURL if "inline" in type else cfIdentifier) self.setFormat(m.start(6), len(m.group(6)), cfOperator) r = self.rules["Links-ref2"] for m in r.finditer(text): self.setFormat(m.start(1), len(m.group(1)), cfOperator) self.setFormat(m.start(2), len(m.group(2)), cfIdentifier) self.setFormat(m.start(3), len(m.group(3)), cfOperator) self.setFormat(m.start(4), len(m.group(4)), cfURL) self.setFormat(m.start(5), len(m.group(5)), cfText) manuskript-0.10.0/manuskript/ui/highlighters/__init__.py000066400000000000000000000010711354442177200234010ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf8 -*- from manuskript.ui.highlighters.basicHighlighter import BasicHighlighter from manuskript.ui.highlighters.MMDHighlighter import MMDHighlighter # Markdown highlighter from manuskript.ui.highlighters.markdownEnums import MarkdownState from manuskript.ui.highlighters.markdownEnums import MarkdownTokenType from manuskript.ui.highlighters.markdownEnums import BlockquoteStyle from manuskript.ui.highlighters.markdownTokenizer import MarkdownTokenizer from manuskript.ui.highlighters.markdownHighlighter import MarkdownHighlighter manuskript-0.10.0/manuskript/ui/highlighters/basicHighlighter.py000066400000000000000000000147641354442177200251170ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- import re from PyQt5.QtCore import Qt from PyQt5.QtGui import QBrush, QTextCursor, QColor, QFont, QSyntaxHighlighter from PyQt5.QtGui import QTextBlockFormat, QTextCharFormat import manuskript.models.references as Ref import manuskript.ui.style as S from manuskript import settings from manuskript import functions as F class BasicHighlighter(QSyntaxHighlighter): def __init__(self, editor): QSyntaxHighlighter.__init__(self, editor.document()) self.editor = editor self._misspelledColor = Qt.red self._defaultBlockFormat = QTextBlockFormat() self._defaultCharFormat = QTextCharFormat() self.defaultTextColor = QColor(S.text) self.backgroundColor = QColor(S.base) self.markupColor = QColor(S.textLight) self.linkColor = QColor(S.link) self.spellingErrorColor = QColor(Qt.red) def setDefaultBlockFormat(self, bf): self._defaultBlockFormat = bf self.rehighlight() def setDefaultCharFormat(self, cf): self._defaultCharFormat = cf self.rehighlight() def setMisspelledColor(self, color): self._misspelledColor = color def updateColorScheme(self, rehighlight=True): """ Generates a base set of colors that will take account of user preferences, and use system style. """ # Reading user settings opt = settings.textEditor if not self.editor._fromTheme or not self.editor._themeData: self.defaultTextColor = QColor(opt["fontColor"]) self.backgroundColor = (QColor(opt["background"]) if not opt["backgroundTransparent"] else QColor(S.window)) self.markupColor = F.mixColors(self.defaultTextColor, self.backgroundColor, .3) self.linkColor = QColor(S.link) self.spellingErrorColor = QColor(opt["misspelled"]) self._defaultCharFormat.setForeground(QBrush(self.defaultTextColor)) # FullscreenEditor probably else: opt = self.editor._themeData self.defaultTextColor = QColor(opt["Text/Color"]) self.backgroundColor = F.mixColors( QColor(opt["Foreground/Color"]), QColor(opt["Background/Color"]), int(opt["Foreground/Opacity"])/100.) self.markupColor = F.mixColors(self.defaultTextColor, self.backgroundColor, .3) self.linkColor = QColor(S.link) self.spellingErrorColor = QColor(opt["Text/Misspelled"]) if rehighlight: self.rehighlight() def highlightBlock(self, text): """Apply syntax highlighting to the given block of text. """ self.highlightBlockBefore(text) self.doHighlightBlock(text) self.highlightBlockAfter(text) def doHighlightBlock(self, text): """ Virtual function to subclass. """ pass def highlightBlockBefore(self, text): """Highlighting to do before anything else. When subclassing BasicHighlighter, you must call highlightBlockBefore before you do any custom highlighting. Or implement doHighlightBlock. """ #print(">", self.currentBlock().document().availableUndoSteps()) c = QTextCursor(self.currentBlock()) #c.joinPreviousEditBlock() bf = QTextBlockFormat(self._defaultBlockFormat) if bf != c.blockFormat(): c.setBlockFormat(bf) #c.endEditBlock() #print(" ", self.currentBlock().document().availableUndoSteps()) # self.setFormat(0, len(text), self._defaultCharFormat) def highlightBlockAfter(self, text): """Highlighting to do after everything else. When subclassing BasicHighlighter, you must call highlightBlockAfter after your custom highlighting. Or implement doHighlightBlock. """ # References for txt in re.finditer(Ref.RegEx, text): fmt = self.format(txt.start()) fmt.setFontFixedPitch(True) fmt.setFontWeight(QFont.DemiBold) if txt.group(1) == Ref.TextLetter: fmt.setBackground(QBrush(Ref.TextHighlightColor)) elif txt.group(1) == Ref.CharacterLetter: fmt.setBackground(QBrush(Ref.CharacterHighlightColor)) elif txt.group(1) == Ref.PlotLetter: fmt.setBackground(QBrush(Ref.PlotHighlightColor)) elif txt.group(1) == Ref.WorldLetter: fmt.setBackground(QBrush(Ref.WorldHighlightColor)) self.setFormat(txt.start(), txt.end() - txt.start(), fmt) # Spell checking # Following algorithm would not check words at the end of line. # This hacks adds a space to every line where the text cursor is not # So that it doesn't spellcheck while typing, but still spellchecks at # end of lines. See github's issue #166. textedText = text if self.currentBlock().position() + len(text) != \ self.editor.textCursor().position(): textedText = text + " " # Based on http://john.nachtimwald.com/2009/08/22/qplaintextedit-with-in-line-spell-check/ WORDS = r'(?iu)((?:[^_\W]|\')+)[^A-Za-z0-9\']' # (?iu) means case insensitive and Unicode # ((?:[^_\W]|\')+) means words exclude underscores but include apostrophes # [^A-Za-z0-9\'] used with above hack to prevent spellcheck while typing word # # See also https://stackoverflow.com/questions/2062169/regex-w-in-utf-8 if hasattr(self.editor, "spellcheck") and self.editor.spellcheck: for word_object in re.finditer(WORDS, textedText): if (self.editor._dict and self.editor._dict.isMisspelled(word_object.group(1))): format = self.format(word_object.start(1)) format.setUnderlineColor(self._misspelledColor) # SpellCheckUnderline fails with some fonts format.setUnderlineStyle(QTextCharFormat.WaveUnderline) self.setFormat(word_object.start(1), word_object.end(1) - word_object.start(1), format) manuskript-0.10.0/manuskript/ui/highlighters/markdownEnums.py000066400000000000000000000057101354442177200245000ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- #============================================================================== # MARKDOWN STATES #============================================================================== class MarkdownState: MarkdownStateUnknown = -1 MarkdownStateParagraphBreak = 0 MarkdownStateListLineBreak = 1 MarkdownStateParagraph = 2 MarkdownStateAtxHeading1 = 3 MarkdownStateAtxHeading2 = 4 MarkdownStateAtxHeading3 = 5 MarkdownStateAtxHeading4 = 6 MarkdownStateAtxHeading5 = 7 MarkdownStateAtxHeading6 = 8 MarkdownStateBlockquote = 9 MarkdownStateCodeBlock = 10 MarkdownStateInGithubCodeFence = 11 MarkdownStateInPandocCodeFence = 12 MarkdownStateCodeFenceEnd = 13 MarkdownStateComment = 14 MarkdownStateHorizontalRule = 15 MarkdownStateNumberedList = 16 MarkdownStateBulletPointList = 17 MarkdownStateSetextHeading1Line1 = 18 MarkdownStateSetextHeading1Line2 = 19 MarkdownStateSetextHeading2Line1 = 20 MarkdownStateSetextHeading2Line2 = 21 MarkdownStatePipeTableHeader = 22 MarkdownStatePipeTableDivider = 23 MarkdownStatePipeTableRow = 24 #============================================================================== # MARKDOWN TOKEN TYPE #============================================================================== class MarkdownTokenType: TokenUnknown = -1 # Titles TokenAtxHeading1 = 0 TokenAtxHeading2 = 1 TokenAtxHeading3 = 2 TokenAtxHeading4 = 3 TokenAtxHeading5 = 4 TokenAtxHeading6 = 5 TokenSetextHeading1Line1 = 6 TokenSetextHeading1Line2 = 7 TokenSetextHeading2Line1 = 8 TokenSetextHeading2Line2 = 9 TokenEmphasis = 10 TokenStrong = 11 TokenStrikethrough = 12 TokenVerbatim = 13 TokenHtmlTag = 14 TokenHtmlEntity = 15 TokenAutomaticLink = 16 TokenInlineLink = 17 TokenReferenceLink = 18 TokenReferenceDefinition = 19 TokenImage = 20 TokenHtmlComment = 21 TokenNumberedList = 22 TokenBulletPointList = 23 TokenHorizontalRule = 24 TokenLineBreak = 25 TokenBlockquote = 26 TokenCodeBlock = 27 TokenGithubCodeFence = 28 TokenPandocCodeFence = 29 TokenCodeFenceEnd = 30 TokenMention = 31 TokenTableHeader = 32 TokenTableDivider = 33 TokenTablePipe = 34 TokenSuperScript = 35 TokenSubScript = 36 # CriticMarkup TokenCMAddition = 37 # {++ ++} TokenCMDeletion = 38 # {-- --} TokenCMSubstitution = 39 #{~~ ~> ~~} TokenCMComment = 40 # {>> <<} TokenCMHighlight = 41 # {== ==}{>> <<} TokenLast = 42 TITLES = [TokenAtxHeading1, TokenAtxHeading2, TokenAtxHeading3, TokenAtxHeading4, TokenAtxHeading5, TokenAtxHeading6, TokenSetextHeading1Line1, TokenSetextHeading1Line2, TokenSetextHeading2Line1, TokenSetextHeading2Line2] class BlockquoteStyle: BlockquoteStylePlain = 0 BlockquoteStyleItalic = 1 BlockquoteStyleFancy = 2 manuskript-0.10.0/manuskript/ui/highlighters/markdownHighlighter.py000066400000000000000000000700401354442177200256450ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- """ A QSyntaxHighlighter for markdown, using tokenizer. More accurate than simple regexp, but not yet perfect. """ import re from PyQt5.QtCore import Qt, pyqtSignal, qWarning, QRegExp from PyQt5.QtGui import (QSyntaxHighlighter, QTextBlock, QColor, QFont, QTextCharFormat, QBrush, QPalette) from PyQt5.QtWidgets import qApp, QStyle from manuskript.ui.highlighters import BasicHighlighter from manuskript.ui.highlighters import MarkdownTokenizer from manuskript.ui.highlighters import MarkdownState as MS from manuskript.ui.highlighters import MarkdownTokenType as MTT from manuskript.ui.highlighters import BlockquoteStyle as BS from manuskript.ui import style as S from manuskript import settings from manuskript import functions as F # Un longue ligne. Un longue ligne. Un longue ligne. Un longue ligne.asdasdasda GW_FADE_ALPHA = 140 # Highlighter based on GhostWriter (http://wereturtle.github.io/ghostwriter/). # GPLV3+. #FIXME: Setext heading don't work anymore class MarkdownHighlighter(BasicHighlighter): highlightBlockAtPosition = pyqtSignal(int) headingFound = pyqtSignal(int, str, QTextBlock) headingRemoved = pyqtSignal(int) def __init__(self, editor): BasicHighlighter.__init__(self, editor) #default values self.editor = editor self.tokenizer = MarkdownTokenizer() self.spellCheckEnabled = False #self.typingPaused = True self.inBlockquote = False self.blockquoteStyle = BS.BlockquoteStyleFancy # Settings self.useUndlerlineForEmphasis = False self.highlightLineBreaks = True self.highlightBlockAtPosition.connect(self.onHighlightBlockAtPosition, Qt.QueuedConnection) self.theme = self.defaultTheme() self.setupHeadingFontSize(True) self.highlightedWords = [] self.highlightedTags = [] self.searchExpression = "" self.searchExpressionRegExp = False self.searchExpressionCase = False #f = self.document().defaultFont() #f.setFamily("monospace") #self.document().setDefaultFont(f) def transparentFormat(self, fmt, alpha=75): """ Takes a QTextCharFormat and modify it with colors made transparent using alpha channel. For focus mode """ c = fmt.foreground().color() c.setAlpha(alpha) fmt.setForeground(QBrush(c)) b = fmt.background() if b.style() != Qt.NoBrush: c = b.color() c.setAlpha(alpha) fmt.setBackground(QBrush(b)) def unfocusConditions(self): """ Returns: - True if the text is supposed to be unfocused - (start, end) if block is supposed to be unfocused except for that part. """ if self.editor._noFocusMode or not settings.textEditor["focusMode"]: return False if settings.textEditor["focusMode"] == "paragraph": return not self.currentBlock().contains( self.editor.textCursor().position()) elif settings.textEditor["focusMode"] == "line": if self.currentBlock().contains( self.editor.textCursor().position()): block = self.currentBlock() # Position of cursor in block pos = self.editor.textCursor().position() - block.position() for i in range(block.layout().lineCount()): line = block.layout().lineAt(i) start = line.textStart() end = line.textStart() + line.textLength() if start <= pos <= end: return (start, end) else: return True elif settings.textEditor["focusMode"] == "sentence": if self.currentBlock().contains( self.editor.textCursor().position()): block = self.currentBlock() # Position of cursor in block pos = self.editor.textCursor().position() - block.position() ENDChars = "!.?" txt = block.text() start = -1 for i in range(len(txt)): if start == -1: start = i if txt[i] in ENDChars: s = txt[start:i+1] if start <= pos <= start + len(s): return start, i+1 start = -1 return (start, len(txt)) else: return True return False def doHighlightBlock(self, text): """ Note: Never set the QTextBlockFormat for a QTextBlock from within the highlighter. Depending on how the block format is modified, a recursive call to the highlighter may be triggered, which will cause the application to crash. Likewise, don't try to set the QTextBlockFormat outside the highlighter (i.e., from within the text editor). While the application will not crash, the format change will be added to the undo stack. Attempting to undo from that point on will cause the undo stack to be virtually frozen, since undoing the format operation causes the text to be considered changed, thus triggering the slot that changes the text formatting to be triggered yet again. """ lastState = self.currentBlockState() # self.setFormat(0, len(text), self._defaultCharFormat) # Focus mode unfocus = self.unfocusConditions() if unfocus: fmt = self.format(0) fmt.setForeground(QBrush(self.defaultTextColor)) self.transparentFormat(fmt) if type(unfocus) != bool: start, end = unfocus self.setFormat(0, start, fmt) self.setFormat(end, len(text), fmt) else: self.setFormat(0, len(text), fmt) if self.tokenizer != None: self.tokenizer.clear() block = self.currentBlock() nextState = MS.MarkdownStateUnknown previousState = self.previousBlockState() if block.next().isValid(): nextState = block.next().userState() self.tokenizer.tokenize(text, lastState, previousState, nextState) self.setCurrentBlockState(self.tokenizer.getState()) self.inBlockquote = self.tokenizer.getState() == MS.MarkdownStateBlockquote # STATE FORMATTING # FIXME: generic if self.currentBlockState() in [ MS.MarkdownStatePipeTableHeader, MS.MarkdownStatePipeTableDivider, MS.MarkdownStatePipeTableRow]: fmt = QTextCharFormat() f = fmt.font() f.setFamily("Monospace") fmt.setFont(f) self.setFormat(0, len(text), fmt) # Monospace the blank chars i = 0 while i <= len(text)-1 and text[i] in [" ", "\t"]: fmt = self.format(i) fmt.setFontFamily("Monospace") self.setFormat(i, 1, fmt) i += 1 #if self.currentBlockState() == MS.MarkdownStateBlockquote: #fmt = QTextCharFormat(self._defaultCharFormat) #fmt.setForeground(Qt.lightGray) #self.setFormat(0, len(text), fmt) tokens = self.tokenizer.getTokens() for token in tokens: if token.type == MTT.TokenUnknown: qWarning("Highlighter found unknown token type in text block.") continue if token.type in [ MTT.TokenAtxHeading1, MTT.TokenAtxHeading2, MTT.TokenAtxHeading3, MTT.TokenAtxHeading4, MTT.TokenAtxHeading5, MTT.TokenAtxHeading6, MTT.TokenSetextHeading1Line1, MTT.TokenSetextHeading2Line1, ]: self.storeHeadingData(token, text) self.applyFormattingForToken(token, text) if self.tokenizer.backtrackRequested(): previous = self.currentBlock().previous() self.highlightBlockAtPosition.emit(previous.position()) if self.spellCheckEnabled: self.spellCheck(text) # If the block has transitioned from previously being a heading to now # being a non-heading, signal that the position in the document no # longer contains a heading. if self.isHeadingBlockState(lastState) and \ not self.isHeadingBlockState(self.currentBlockState()): self.headingRemoved.emit(self.currentBlock().position()) ########################################################################### # COLORS & FORMATTING ########################################################################### def updateColorScheme(self, rehighlight=True): BasicHighlighter.updateColorScheme(self, rehighlight) self.theme = self.defaultTheme() self.setEnableLargeHeadingSizes(True) def defaultTheme(self): # Base Colors background = self.backgroundColor text = self.defaultTextColor highlightedText = QColor(S.highlightedText) highlightedTextDark = QColor(S.highlightedTextDark) highlightedTextLight = QColor(S.highlightedTextLight) highlight = QColor(S.highlight) link = self.linkColor linkVisited = QColor(S.linkVisited) # titleColor = highlight titleColor = QColor(S.highlightedTextDark) # FullscreenEditor probably if self.editor._fromTheme and self.editor._themeData: text = QColor(self.editor._themeData["Text/Color"]) background = QColor(self.editor._themeData["Background/Color"]) titleColor = text # Compositions light = F.mixColors(text, background, .75) markup = F.mixColors(text, background, .5) veryLight = F.mixColors(text, background, .25) listToken = F.mixColors(highlight, background, .4) titleMarkupColor = F.mixColors(titleColor, background, .3) theme = { "markup": markup} #Example: #"color": Qt.red, #"deltaSize": 10, #"background": Qt.yellow, #"monospace": True, #"bold": True, #"italic": True, #"underline": True, #"overline": True, #"strike": True, #"formatMarkup": True, #"markupBold": True, #"markupColor": Qt.blue, #"markupBackground": Qt.green, #"markupMonospace": True, #"super":True, #"sub":True for i in MTT.TITLES: theme[i] = { "formatMarkup":True, "bold": True, # "monospace": True, "markupColor": titleMarkupColor } theme[MTT.TokenAtxHeading1]["color"] = titleColor theme[MTT.TokenAtxHeading2]["color"] = F.mixColors(titleColor, background, .9) theme[MTT.TokenAtxHeading3]["color"] = F.mixColors(titleColor, background, .8) theme[MTT.TokenAtxHeading4]["color"] = F.mixColors(titleColor, background, .7) theme[MTT.TokenAtxHeading5]["color"] = F.mixColors(titleColor, background, .6) theme[MTT.TokenAtxHeading6]["color"] = F.mixColors(titleColor, background, .5) theme[MTT.TokenSetextHeading1Line1]["color"] = titleColor theme[MTT.TokenSetextHeading2Line1]["color"] = F.mixColors(titleColor, background, .9) for i in [MTT.TokenSetextHeading1Line1, MTT.TokenSetextHeading2Line1]: theme[i]["monospace"] = True for i in [MTT.TokenSetextHeading1Line2, MTT.TokenSetextHeading2Line2]: theme[i] = { "color": titleMarkupColor, "monospace":True} # Beautifiers theme[MTT.TokenEmphasis] = { "italic":True} theme[MTT.TokenStrong] = { "bold":True} theme[MTT.TokenStrikethrough] = { "strike":True} theme[MTT.TokenVerbatim] = { "monospace":True, "background": veryLight, "formatMarkup": True, "markupColor": markup, "deltaSize": -1} theme[MTT.TokenSuperScript] = { "super":True, "formatMarkup":True} theme[MTT.TokenSubScript] = { "sub":True, "formatMarkup":True} theme[MTT.TokenHtmlTag] = { "color": linkVisited} theme[MTT.TokenHtmlEntity] = { #   "color": linkVisited} theme[MTT.TokenAutomaticLink] = { "color": link} theme[MTT.TokenInlineLink] = { "color": link} theme[MTT.TokenReferenceLink] = { "color": link} theme[MTT.TokenReferenceDefinition] = { "color": link} theme[MTT.TokenImage] = { "color": highlightedTextDark} theme[MTT.TokenHtmlComment] = { "color": markup} theme[MTT.TokenNumberedList] = { "markupColor": listToken, "markupBold": True, "markupMonospace": True,} theme[MTT.TokenBulletPointList] = { "markupColor": listToken, "markupBold": True, "markupMonospace": True,} theme[MTT.TokenHorizontalRule] = { "overline": True, "underline": True, "monospace": True, "color": markup} theme[MTT.TokenLineBreak] = { "background": markup} theme[MTT.TokenBlockquote] = { "color": light, "markupColor": veryLight, "markupBackground": veryLight} theme[MTT.TokenCodeBlock] = { "color": light, "markupBackground": veryLight, "formatMarkup": True, "monospace":True, "deltaSize":-1} theme[MTT.TokenGithubCodeFence] = { "color": markup} theme[MTT.TokenPandocCodeFence] = { "color": markup} theme[MTT.TokenCodeFenceEnd] = { "color": markup} theme[MTT.TokenMention] = {} # FIXME theme[MTT.TokenTableHeader] = { "color": light, "monospace":True} theme[MTT.TokenTableDivider] = { "color": markup, "monospace":True} theme[MTT.TokenTablePipe] = { "color": markup, "monospace":True} # CriticMarkup theme[MTT.TokenCMAddition] = { "color": QColor("#00bb00"), "markupColor": QColor(F.mixColors("#00bb00", background, .4)), "markupMonospace": True,} theme[MTT.TokenCMDeletion] = { "color": QColor("#dd0000"), "markupColor": QColor(F.mixColors("#dd0000", background, .4)), "markupMonospace": True, "strike": True} theme[MTT.TokenCMSubstitution] = { "color": QColor("#ff8600"), "markupColor": QColor(F.mixColors("#ff8600", background, .4)), "markupMonospace": True,} theme[MTT.TokenCMComment] = { "color": QColor("#0000bb"), "markupColor": QColor(F.mixColors("#0000bb", background, .4)), "markupMonospace": True,} theme[MTT.TokenCMHighlight] = { "color": QColor("#aa53a9"), "background": QColor(F.mixColors("#aa53a9", background, .1)), "markupBackground": QColor(F.mixColors("#aa53a9", background, .1)), "markupColor": QColor(F.mixColors("#aa53a9", background, .5)), "markupMonospace": True,} return theme ########################################################################### # ACTUAL FORMATTING ########################################################################### def applyFormattingForToken(self, token, text): if token.type != MTT.TokenUnknown: fmt = self.format(token.position + token.openingMarkupLength) markupFormat = self.format(token.position) if self.theme.get("markup"): markupFormat.setForeground(self.theme["markup"]) ## Debug def debug(): print("{}\n{}{}{}{} (state:{})".format( text, " "*token.position, "^"*token.openingMarkupLength, str(token.type).center(token.length - token.openingMarkupLength - token.closingMarkupLength, "-"), "^" * token.closingMarkupLength, self.currentBlockState(),) ) # if token.type in range(6, 10): # debug() theme = self.theme.get(token.type) if theme: fmt, markupFormat = self.formatsFromTheme(theme, fmt, markupFormat) # Focus mode unfocus = self.unfocusConditions() if unfocus: if (type(unfocus) == bool or token.position < unfocus[0] or unfocus[1] < token.position): self.transparentFormat(fmt) self.transparentFormat(markupFormat) # Format opening Markup self.setFormat(token.position, token.openingMarkupLength, markupFormat) # Format Text self.setFormat( token.position + token.openingMarkupLength, token.length - token.openingMarkupLength - token.closingMarkupLength, fmt) # Format closing Markup if token.closingMarkupLength > 0: self.setFormat( token.position + token.length - token.closingMarkupLength, token.closingMarkupLength, markupFormat) else: qWarning("MarkdownHighlighter.applyFormattingForToken() was passed" " in a token of unknown type.") def formatsFromTheme(self, theme, format=None, markupFormat=QTextCharFormat()): # Token if theme.get("color"): format.setForeground(theme["color"]) if theme.get("deltaSize"): size = self.editor._defaultFontSize + theme["deltaSize"] if size >= 0: f = format.font() f.setPointSize(size) format.setFont(f) if theme.get("background"): format.setBackground(theme["background"]) if theme.get("monospace"): format.setFontFamily("Monospace") if theme.get("bold"): format.setFontWeight(QFont.Bold) if theme.get("italic"): format.setFontItalic(theme["italic"]) if theme.get("underline"): format.setFontUnderline(theme["underline"]) if theme.get("overline"): format.setFontOverline(theme["overline"]) if theme.get("strike"): format.setFontStrikeOut(theme["strike"]) if theme.get("super"): format.setVerticalAlignment(QTextCharFormat.AlignSuperScript) if theme.get("sub"): format.setVerticalAlignment(QTextCharFormat.AlignSubScript) # Markup if theme.get("formatMarkup"): c = markupFormat.foreground() markupFormat = QTextCharFormat(format) markupFormat.setForeground(c) if theme.get("markupBold"): markupFormat.setFontWeight(QFont.Bold) if theme.get("markupColor"): markupFormat.setForeground(theme["markupColor"]) if theme.get("markupBackground"): markupFormat.setBackground(theme["markupBackground"]) if theme.get("markupMonospace"): markupFormat.setFontFamily("Monospace") return format, markupFormat ########################################################################### # SETTINGS ########################################################################### def setHighlighted(self, words, tags): rehighlight = (self.highlightedWords != words or self.highlightedTags != tags) self.highlightedWords = words self.highlightedTags = tags if rehighlight: self.rehighlight() def setSearched(self, expression, regExp=False, caseSensitivity=False): """ Define an expression currently searched, to be highlighted. Can be regExp. """ rehighlight = self.searchExpression != expression or \ self.searchExpressionRegExp != regExp or \ self.searchExpressionCase != caseSensitivity self.searchExpression = expression self.searchExpressionRegExp = regExp self.searchExpressionCase = caseSensitivity if rehighlight: self.rehighlight() def setDictionary(self, dictionary): self.dictionary = dictionary if self.spellCheckEnabled: self.rehighlight() def increaseFontSize(self): self._defaultCharFormat.setFontPointSize( self._defaultCharFormat.font().pointSize() + 1.0) self.rehighlight() def decreaseFontSize(self): self._defaultCharFormat.setFontPointSize( self._defaultCharFormat.font().pointSize() - 1.0) self.rehighlight() def setEnableLargeHeadingSizes(self, enable): self.setupHeadingFontSize(enable) self.rehighlight() def setupHeadingFontSize(self, useLargeHeadings): if useLargeHeadings: self.theme[MTT.TokenSetextHeading1Line1]["deltaSize"] = 7 self.theme[MTT.TokenSetextHeading2Line1]["deltaSize"] = 5 self.theme[MTT.TokenSetextHeading1Line2]["deltaSize"] = 7 self.theme[MTT.TokenSetextHeading2Line2]["deltaSize"] = 5 self.theme[MTT.TokenAtxHeading1]["deltaSize"] = 7 self.theme[MTT.TokenAtxHeading2]["deltaSize"] = 5 self.theme[MTT.TokenAtxHeading3]["deltaSize"] = 3 self.theme[MTT.TokenAtxHeading4]["deltaSize"] = 2 self.theme[MTT.TokenAtxHeading5]["deltaSize"] = 1 self.theme[MTT.TokenAtxHeading6]["deltaSize"] = 0 else: for i in MTT.TITLES: self.theme[i]["deltaSize"] = 0 def setUseUnderlineForEmphasis(self, enable): self.useUndlerlineForEmphasis = enable self.rehighlight() def setFont(self, fontFamily, fontSize): font = QFont(family=fontFamily, pointSize=fontSize, weight=QFont.Normal, italic=False) self._defaultCharFormat.setFont(font) self.rehighlight() def setSpellCheckEnabled(self, enabled): self.spellCheckEnabled = enabled self.rehighlight() def setBlockquoteStyle(self, style): self.blockquoteStyle = style if style == BS.BlockquoteStyleItalic: self.emphasizeToken[MTT.TokenBlockquote] = True else: self.emphasizeToken[MTT.TokenBlockquote] = False self.rehighlight() def setHighlightLineBreaks(self, enable): self.highlightLineBreaks = enable self.rehighlight() ########################################################################### # GHOSTWRITER SPECIFIC? ########################################################################### def onTypingResumed(self): self.typingPaused = False def onTypingPaused(self): self.typingPaused = True block = self.document().findBlock(self.editor.textCursor().position()) self.rehighlightBlock(block) def onHighlightBlockAtPosition(self, position): block = self.document().findBlock(position) self.rehighlightBlock(block) def onTextBlockRemoved(self, block): if self.isHeadingBlockState(block.userState): self.headingRemoved.emit(block.position()) ########################################################################### # SPELLCHECK ########################################################################### def spellCheck(self, text): cursorPosition = self.editor.textCursor().position() cursorPosBlock = self.document().findBlock(cursorPosition) cursorPosInBlock = -1 if self.currentBlock() == cursorPosBlock: cursorPosInBlock = cursorPosition - cursorPosBlock.position() misspelledWord = self.dictionary.check(text, 0) while not misspelledWord.isNull(): startIndex = misspelledWord.position() length = misspelledWord.length() if self.typingPaused or cursorPosInBlock != startIndex + length: spellingErrorFormat = self.format(startIndex) spellingErrorFormat.setUnderlineColor(self.spellingErrorColor) spellingErrorFormat.setUnderlineStyle( qApp.style().styleHint(QStyle.SH_SpellCheckUnderlineStyle)) self.setFormat(startIndex, length, spellingErrorFormat) startIndex += length misspelledWord = self.dictionary.check(text, startIndex) def storeHeadingData(self, token, text): if token.type in [ MTT.TokenAtxHeading1, MTT.TokenAtxHeading2, MTT.TokenAtxHeading3, MTT.TokenAtxHeading4, MTT.TokenAtxHeading5, MTT.TokenAtxHeading6]: level = token.type - MTT.TokenAtxHeading1 + 1 s = token.position + token.openingMarkupLength l = (token.length - token.openingMarkupLength - token.closingMarkupLength) headingText = text[s:s+l].strip() elif token.type == MTT.TokenSetextHeading1Line1: level = 1 headingText = text elif token.type == MTT.TokenSetextHeading2Line1: level = 2 headingText = text else: qWarning("MarkdownHighlighter.storeHeadingData() encountered" + " unexpected token: {}".format(token.getType())) return # FIXME: TypeError: could not convert 'TextBlockData' to 'QTextBlockUserData' # blockData = self.currentBlockUserData() # if blockData is None: # blockData = TextBlockData(self.document(), self.currentBlock()) # # self.setCurrentBlockUserData(blockData) self.headingFound.emit(level, headingText, self.currentBlock()) def isHeadingBlockState(self, state): return state in [ MS.MarkdownStateAtxHeading1, MS.MarkdownStateAtxHeading2, MS.MarkdownStateAtxHeading3, MS.MarkdownStateAtxHeading4, MS.MarkdownStateAtxHeading5, MS.MarkdownStateAtxHeading6, MS.MarkdownStateSetextHeading1Line1, MS.MarkdownStateSetextHeading2Line1,] def getLuminance(color): return (0.30 * color.redF()) + \ (0.59 * color.greenF()) + \ (0.11 * color.blueF()) def applyAlphaToChannel(foreground, background, alpha): return (foreground * alpha) + (background * (1.0 - alpha)) def applyAlpha(foreground, background, alpha): blendedColor = QColor(0, 0, 0) normalizedAlpha = alpha / 255.0 blendedColor.setRed(applyAlphaToChannel( foreground.red(), background.red(), normalizedAlpha)) blendedColor.setGreen(applyAlphaToChannel( foreground.green(), background.green(), normalizedAlpha)) blendedColor.setBlue(applyAlphaToChannel( foreground.blue(), background.blue(), normalizedAlpha)) return blendedColor manuskript-0.10.0/manuskript/ui/highlighters/markdownTokenizer.py000066400000000000000000001050511354442177200253620ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- import re from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * from manuskript.ui.highlighters import MarkdownState as MS from manuskript.ui.highlighters import MarkdownTokenType as MTT # This file is simply a python translation of GhostWriter's Tokenizer. # http://wereturtle.github.io/ghostwriter/ # GPLV3+. # ============================================================================== # TOKEN # ============================================================================== class Token: def __init__(self): self.type = -1 self.position = 0 self.length = 0 self.openingMarkupLength = 0 self.closingMarkupLength = 0 # ============================================================================== # HIGHLIGHT TOKENIZER # ============================================================================== class HighlightTokenizer: def __init__(self): self.tokens = [] def tokenize(text, currentState, previousState, nextState): # Subclass me return 0 def getTokens(self): self.tokens = sorted(self.tokens, key=lambda t: t.position) return self.tokens def getState(self): return self.state def backtrackRequested(self): return self.backtrack def clear(self): self.tokens = [] self.backtrack = False self.state = -1 def addToken(self, token): self.tokens.append(token) if token.type == -1: print("Error here", token.position, token.length) def setState(self, state): self.state = state def requestBacktrack(self): self.backtrack = True def tokenLessThan(self, t1, t2): return t1.getPosition() < t2.getPosition() class MarkdownTokenizer(HighlightTokenizer): DUMMY_CHAR = "$" MAX_MARKDOWN_HEADING_LEVEL = 6 paragraphBreakRegex = QRegExp("^\\s*$") heading1SetextRegex = QRegExp("^===+\\s*$") heading2SetextRegex = QRegExp("^---+\\s*$") blockquoteRegex = QRegExp("^ {0,3}>.*$") githubCodeFenceStartRegex = QRegExp("^```+.*$") githubCodeFenceEndRegex = QRegExp("^```+\\s*$") pandocCodeFenceStartRegex = QRegExp("^~~~+.*$") pandocCodeFenceEndRegex = QRegExp("^~~~+\\s*$") numberedListRegex = QRegExp("^ {0,3}[0-9a-z]+[.)]\\s+.*$") numberedNestedListRegex = QRegExp("^\\s*[0-9a-z]+[.)]\\s+.*$") hruleRegex = QRegExp("\\s*(\\*\\s*){3,}|(\\s*(_\\s*){3,})|((\\s*(-\\s*){3,}))") lineBreakRegex = QRegExp(".*\\s{2,}$") emphasisRegex = QRegExp("(\\*(?![\\s*]).*[^\\s*]\\*)|_(?![\\s_]).*[^\\s_]_") emphasisRegex.setMinimal(True) strongRegex = QRegExp("\\*\\*(?=\\S).*\\S\\*\\*(?!\\*)|__(?=\\S).*\\S__(?!_)") strongRegex.setMinimal(True) strikethroughRegex = QRegExp("~~[^\\s]+.*[^\\s]+~~") strikethroughRegex.setMinimal(True) superScriptRegex = QRegExp(r"\^([^\s]|(\\\\\s))+\^") # Spaces must be escaped "\ " superScriptRegex.setMinimal(True) subScriptRegex = QRegExp("~([^\\s]|(\\\\\\s))+~") # Spaces must be escaped "\ " subScriptRegex.setMinimal(True) verbatimRegex = QRegExp("`+") htmlTagRegex = QRegExp("<[^<>]+>") htmlTagRegex.setMinimal(True) htmlEntityRegex = QRegExp("&[a-zA-Z]+;|&#x?[0-9]+;") automaticLinkRegex = QRegExp("(<([a-zA-Z]+\\:.+)>)|(<(.+@.+)>)") automaticLinkRegex.setMinimal(True) inlineLinkRegex = QRegExp("\\[(.+)\\]\\((.+)\\)") inlineLinkRegex.setMinimal(True) referenceLinkRegex = QRegExp("\\[(.+)\\]") referenceLinkRegex.setMinimal(True) referenceDefinitionRegex = QRegExp("^\\s*\\[.+\\]:") imageRegex = QRegExp("!\\[(.*)\\]\\((.+)\\)") imageRegex.setMinimal(True) htmlInlineCommentRegex = QRegExp("") htmlInlineCommentRegex.setMinimal(True) mentionRegex = QRegExp("\\B@\\w+(\\-\\w+)*(/\\w+(\\-\\w+)*)?") pipeTableDividerRegex = QRegExp("^ {0,3}(\\|[ :]?)?-{3,}([ :]?\\|[ :]?-{3,}([ :]?\\|)?)+\\s*$") CMAdditionRegex = QRegExp("(\\{\\+\\+.*\\+\\+\\})") CMAdditionRegex.setMinimal(True) CMDeletionRegex = QRegExp("(\\{--.*--\\})") CMDeletionRegex.setMinimal(True) CMSubstitutionRegex = QRegExp("(\\{~~.*~>.*~~\\})") CMSubstitutionRegex.setMinimal(True) CMCommentRegex = QRegExp("(\\{>>.*<<\\})") CMCommentRegex.setMinimal(True) CMHighlightRegex = QRegExp("(\\{==.*==\\})") CMHighlightRegex.setMinimal(True) def __init__(self): HighlightTokenizer.__init__(self) def tokenize(self, text, currentState, previousState, nextState): self.currentState = currentState self.previousState = previousState self.nextState = nextState if (self.previousState == MS.MarkdownStateInGithubCodeFence or \ self.previousState == MS.MarkdownStateInPandocCodeFence) and \ self.tokenizeCodeBlock(text): # No further tokenizing required pass elif self.previousState != MS.MarkdownStateComment \ and self.paragraphBreakRegex.exactMatch(text): if previousState in [MS.MarkdownStateListLineBreak, MS.MarkdownStateNumberedList, MS.MarkdownStateBulletPointList]: self.setState(MS.MarkdownStateListLineBreak) elif previousState != MS.MarkdownStateCodeBlock or \ (text[:1] != "\t" and text[-4:] != " "): self.setState(MS.MarkdownStateParagraphBreak) elif self.tokenizeSetextHeadingLine2(text) or \ self.tokenizeCodeBlock(text) or \ self.tokenizeMultilineComment(text) or \ self.tokenizeHorizontalRule(text) or \ self.tokenizeTableDivider(text): # No further tokenizing required pass elif self.tokenizeSetextHeadingLine1(text) or \ self.tokenizeAtxHeading(text) or \ self.tokenizeBlockquote(text) or \ self.tokenizeNumberedList(text) or \ self.tokenizeBulletPointList(text): self.tokenizeLineBreak(text) self.tokenizeInline(text) else: if previousState in [MS.MarkdownStateListLineBreak, MS.MarkdownStateNumberedList, MS.MarkdownStateNumberedList]: if not self.tokenizeNumberedList(text) and \ not self.tokenizeBulletPointList(text) and \ (text[:1] == "\t" or text[:4] == " "): self.setState(previousState) else: self.setState(MS.MarkdownStateParagraph) else: self.setState(MS.MarkdownStateParagraph) self.tokenizeLineBreak(text) self.tokenizeInline(text) # Make sure that if the second line of a setext heading is removed the # first line is reprocessed. Otherwise, it will still show up in the # document as a heading. if (previousState == MS.MarkdownStateSetextHeading1Line1 and \ self.getState() != MS.MarkdownStateSetextHeading1Line2) or \ (previousState == MS.MarkdownStateSetextHeading2Line1 and \ self.getState() != MS.MarkdownStateSetextHeading2Line2): self.requestBacktrack() def tokenizeSetextHeadingLine1(self, text): #Check the next line's state to see if this is a setext-style heading. level = 0 token = Token() nextState = self.nextState if MS.MarkdownStateSetextHeading1Line2 == nextState: level = 1 self.setState(MS.MarkdownStateSetextHeading1Line1) token.type = MTT.TokenSetextHeading1Line1 elif MS.MarkdownStateSetextHeading2Line2 == nextState: level = 2 self.setState(MS.MarkdownStateSetextHeading2Line1) token.type = MTT.TokenSetextHeading2Line1 if level > 0: token.length = len(text) token.position = 0 self.addToken(token) return True return False def tokenizeSetextHeadingLine2(self, text): level = 0 setextMatch = False token = Token() previousState = self.previousState if previousState == MS.MarkdownStateSetextHeading1Line1: level = 1 setextMatch = self.heading1SetextRegex.exactMatch(text) self.setState(MS.MarkdownStateSetextHeading1Line2) token.type = MTT.TokenSetextHeading1Line2 elif previousState == MS.MarkdownStateSetextHeading2Line1: level = 2 setextMatch = self.heading2SetextRegex.exactMatch(text) self.setState(MS.MarkdownStateSetextHeading2Line2) token.type = MTT.TokenSetextHeading2Line2 elif previousState == MS.MarkdownStateParagraph: h1Line2 = self.heading1SetextRegex.exactMatch(text) h2Line2 = self.heading2SetextRegex.exactMatch(text) if h1Line2 or h2Line2: # Restart tokenizing on the previous line. self.requestBacktrack() token.length = len(text) token.position = 0 if h1Line2: self.setState(MS.MarkdownStateSetextHeading1Line2) token.type = MTT.TokenSetextHeading1Line2 else: self.setState(MS.MarkdownStateSetextHeading2Line2) token.type = MTT.TokenSetextHeading2Line2 self.addToken(token) return True if level > 0: if setextMatch: token.length = len(text) token.position = 0 self.addToken(token) return True else: # Restart tokenizing on the previous line. self.requestBacktrack() return False return False def tokenizeAtxHeading(self, text): escapedText = self.dummyOutEscapeCharacters(text) trailingPoundCount = 0 level = 0 #Count the number of pound signs at the front of the string, #up to the maximum allowed, to determine the heading level. while escapedText[level] == "#": level += 1 if level >= len(escapedText) or level >= self.MAX_MARKDOWN_HEADING_LEVEL: break if level > 0 and level < len(text): # Count how many pound signs are at the end of the text. # Ignore starting pound signs when calculating trailing signs while level + trailingPoundCount < len(text) and \ escapedText[-trailingPoundCount -1] == "#": trailingPoundCount += 1 token = Token() token.position = 0 token.length = len(text) token.type = MTT.TokenAtxHeading1 + level -1 token.openingMarkupLength = level token.closingMarkupLength = trailingPoundCount self.addToken(token) self.setState(MS.MarkdownStateAtxHeading1 + level -1) return True return False def tokenizeNumberedList(self, text): previousState = self.previousState if (previousState in [MS.MarkdownStateParagraphBreak, MS.MarkdownStateUnknown, MS.MarkdownStateCodeBlock, MS.MarkdownStateCodeFenceEnd,] and \ self.numberedListRegex.exactMatch(text)) or \ (previousState in [MS.MarkdownStateListLineBreak, MS.MarkdownStateNumberedList, MS.MarkdownStateBulletPointList,] and \ self.numberedNestedListRegex.exactMatch(text)): periodIndex = text.find(".") parenthIndex = text.find(")") if periodIndex < 0: index = parenthIndex elif parenthIndex < 0: index = periodIndex elif parenthIndex > periodIndex: index = periodIndex else: index = parenthIndex if index > 0: token = Token() token.type = MTT.TokenNumberedList token.position = 0 token.length = len(text) token.openingMarkupLength = index + 2 self.addToken(token) self.setState(MS.MarkdownStateNumberedList) return True return False return False def tokenizeBulletPointList(self, text): foundBulletChar = False bulletCharIndex = -1 spaceCount = 0 whitespaceFoundAfterBulletChar = False previousState = self.previousState if previousState not in [MS.MarkdownStateUnknown, MS.MarkdownStateParagraphBreak, MS.MarkdownStateListLineBreak, MS.MarkdownStateNumberedList, MS.MarkdownStateBulletPointList, MS.MarkdownStateCodeBlock, MS.MarkdownStateCodeFenceEnd]: return False # Search for the bullet point character, which can # be either a '+', '-', or '*'. for i in range(len(text)): if text[i] == " ": if foundBulletChar: # We've confirmed it's a bullet point by the whitespace that # follows the bullet point character, and can now exit the # loop. whitespaceFoundAfterBulletChar = True break else: spaceCount += 1 # If this list item is the first in the list, ensure the # number of spaces preceding the bullet point does not # exceed three, as that would indicate a code block rather # than a bullet point list. if spaceCount > 3 and previousState not in [ MS.MarkdownStateNumberedList, MS.MarkdownStateBulletPointList, MS.MarkdownStateListLineBreak,] and \ previousState in [ MS.MarkdownStateParagraphBreak, MS.MarkdownStateUnknown, MS.MarkdownStateCodeBlock, MS.MarkdownStateCodeFenceEnd,]: return False elif text[i] == "\t": if foundBulletChar: # We've confirmed it's a bullet point by the whitespace that # follows the bullet point character, and can now exit the # loop. whitespaceFoundAfterBulletChar = True break elif previousState in [ MS.MarkdownStateParagraphBreak, MS.MarkdownStateUnknown]: # If this list item is the first in the list, ensure that # no tab character preceedes the bullet point, as that would # indicate a code block rather than a bullet point list. return False elif text[i] in ["+", "-", "*"]: foundBulletChar = True bulletCharIndex = i else: return False if bulletCharIndex >= 0 and whitespaceFoundAfterBulletChar: token = Token() token.type = MTT.TokenBulletPointList token.position = 0 token.length = len(text) token.openingMarkupLength = bulletCharIndex + 2 self.addToken(token) self.setState(MS.MarkdownStateBulletPointList) return True return False def tokenizeHorizontalRule (self, text): if self.hruleRegex.exactMatch(text): token = Token() token.type = MTT.TokenHorizontalRule token.position = 0 token.length = len(text) self.addToken(token) self.setState(MS.MarkdownStateHorizontalRule) return True return False def tokenizeLineBreak(self, text): currentState = self.currentState previousState = self.previousState nextState = self.nextState if currentState in [ MS.MarkdownStateParagraph, MS.MarkdownStateBlockquote, MS.MarkdownStateNumberedList, MS.MarkdownStateBulletPointList,]: if previousState in [ MS.MarkdownStateParagraph, MS.MarkdownStateBlockquote, MS.MarkdownStateNumberedList, MS.MarkdownStateBulletPointList,]: self.requestBacktrack() if nextState in [ MS.MarkdownStateParagraph, MS.MarkdownStateBlockquote, MS.MarkdownStateNumberedList, MS.MarkdownStateBulletPointList,]: if self.lineBreakRegex.exactMatch(text): token = Token() token.type = MTT.TokenLineBreak token.position = len(text) - 1 token.length = 1 self.addToken(token) return True return False def tokenizeBlockquote(self, text): previousState = self.previousState if previousState == MS.MarkdownStateBlockquote or \ self.blockquoteRegex.exactMatch(text): # Find any '>' characters at the front of the line. markupLength = 0 for i in range(len(text)): if text[i] == ">": markupLength = i + 1 elif text[i] != " ": # There are no more '>' characters at the front of the line, # so stop processing. break token = Token() token.type = MTT.TokenBlockquote token.position = 0 token.length = len(text) if markupLength > 0: token.openingMarkupLength = markupLength self.addToken(token) self.setState(MS.MarkdownStateBlockquote) return True return False def tokenizeCodeBlock(self, text): previousState = self.previousState if previousState in [ MS.MarkdownStateInGithubCodeFence, MS.MarkdownStateInPandocCodeFence]: self.setState(previousState) if (previousState == MS.MarkdownStateInGithubCodeFence and \ self.githubCodeFenceEndRegex.exactMatch(text)) or \ (previousState == MS.MarkdownStateInPandocCodeFence and \ self.pandocCodeFenceEndRegex.exactMatch(text)): token = Token() token.type = MTT.TokenCodeFenceEnd token.position = 0 token.length = len(text) self.addToken(token) self.setState(MS.MarkdownStateCodeFenceEnd) else: token = Token() token.type = MTT.TokenCodeBlock token.position = 0 token.length = len(text) self.addToken(token) return True elif previousState in [ MS.MarkdownStateCodeBlock, MS.MarkdownStateParagraphBreak, MS.MarkdownStateUnknown,] and \ (text[:1] == "\t" or text[:4] == " "): token = Token() token.type = MTT.TokenCodeBlock token.position = 0 token.length = len(text) token.openingMarkupLength = len(text) - len(text.lstrip()) self.addToken(token) self.setState(MS.MarkdownStateCodeBlock) return True elif previousState in [ MS.MarkdownStateParagraphBreak, MS.MarkdownStateParagraph, MS.MarkdownStateUnknown, MS.MarkdownStateListLineBreak,]: foundCodeFenceStart = False token = Token() if self.githubCodeFenceStartRegex.exactMatch(text): foundCodeFenceStart = True token.type = MTT.TokenGithubCodeFence self.setState(MS.MarkdownStateInGithubCodeFence) elif self.pandocCodeFenceStartRegex.exactMatch(text): foundCodeFenceStart = True token.type = MTT.TokenPandocCodeFence self.setState(MS.MarkdownStateInPandocCodeFence) if foundCodeFenceStart: token.position = 0 token.length = len(text) self.addToken(token) return True return False def tokenizeMultilineComment(self, text): previousState = self.previousState if previousState == MS.MarkdownStateComment: # Find the end of the comment, if any. index = text.find("-->") token = Token() token.type = MTT.TokenHtmlComment token.position = 0 if index >= 0: token.length = index + 3 self.addToken(token) # Return false so that the rest of the line that isn't within # the commented segment can be highlighted as normal paragraph # text. else: token.length = len(text) self.addToken(token) self.setState(MS.MarkdownStateComment) return True return False def tokenizeInline(self, text): escapedText = self.dummyOutEscapeCharacters(text) # Check if the line is a reference definition. if self.referenceDefinitionRegex.exactMatch(text): colonIndex = escapedText.find(":") token = Token() token.type = MTT.TokenReferenceDefinition token.position = 0 token.length = colonIndex + 1 self.addToken(token) # Replace the first bracket so that the '[...]:' reference definition # start doesn't get highlighted as a reference link. firstBracketIndex = escapedText.find("[") if firstBracketIndex >= 0: i = firstBracketIndex escapedText = escapedText[:i] + self.DUMMY_CHAR + escapedText[i+1:] escapedText = self.tokenizeVerbatim(escapedText) escapedText = self.tokenizeHtmlComments(escapedText) escapedText = self.tokenizeTableHeaderRow(escapedText) escapedText = self.tokenizeTableRow(escapedText) escapedText = self.tokenizeMatches(MTT.TokenImage, escapedText, self.imageRegex, 0, 0, False, True) escapedText = self.tokenizeMatches(MTT.TokenInlineLink, escapedText, self.inlineLinkRegex, 0, 0, False, True) escapedText = self.tokenizeMatches(MTT.TokenReferenceLink, escapedText, self.referenceLinkRegex, 0, 0, False, True) escapedText = self.tokenizeMatches(MTT.TokenHtmlEntity, escapedText, self.htmlEntityRegex) escapedText = self.tokenizeMatches(MTT.TokenAutomaticLink, escapedText, self.automaticLinkRegex, 0, 0, False, True) escapedText = self.tokenizeMatches(MTT.TokenStrong, escapedText, self.strongRegex, 2, 2, True) escapedText = self.tokenizeMatches(MTT.TokenEmphasis, escapedText, self.emphasisRegex, 1, 1, True) escapedText = self.tokenizeMatches(MTT.TokenMention, escapedText, self.mentionRegex, 0, 0, False, True) escapedText = self.tokenizeMatches(MTT.TokenCMAddition, escapedText, self.CMAdditionRegex, 3, 3, True) escapedText = self.tokenizeMatches(MTT.TokenCMDeletion, escapedText, self.CMDeletionRegex, 3, 3, True) escapedText = self.tokenizeMatches(MTT.TokenCMSubstitution, escapedText, self.CMSubstitutionRegex, 3, 3, True) escapedText = self.tokenizeMatches(MTT.TokenCMComment, escapedText, self.CMCommentRegex, 3, 3, True) escapedText = self.tokenizeMatches(MTT.TokenCMHighlight, escapedText, self.CMHighlightRegex, 3, 3, True) escapedText = self.tokenizeMatches(MTT.TokenStrikethrough, escapedText, self.strikethroughRegex, 2, 2, True) escapedText = self.tokenizeMatches(MTT.TokenHtmlTag, escapedText, self.htmlTagRegex) escapedText = self.tokenizeMatches(MTT.TokenSubScript, escapedText, self.subScriptRegex, 1, 1, True) escapedText = self.tokenizeMatches(MTT.TokenSuperScript, escapedText, self.superScriptRegex, 1, 1, True) return True def tokenizeVerbatim(self, text): index = self.verbatimRegex.indexIn(text) while index >= 0: end = "" count = self.verbatimRegex.matchedLength() # Search for the matching end, which should have the same number # of back ticks as the start. for i in range(count): end += '`' endIndex = text.find(end, index + count) # If the end was found, add the verbatim token. if endIndex >= 0: token = Token() token.type = MTT.TokenVerbatim token.position = index token.length = endIndex + count - index token.openingMarkupLength = count token.closingMarkupLength = count self.addToken(token) # Fill out the token match in the string with the dummy # character so that searches for other Markdown elements # don't find anything within this token's range in the string. for i in range(index, index + token.length): text = text[:i] + self.DUMMY_CHAR + text[i+1:] index += token.length # Else start searching again at the very next character. else: index += 1 index = self.verbatimRegex.indexIn(text, index) return text def tokenizeHtmlComments(self, text): previousState = self.previousState # Check for the end of a multiline comment so that it doesn't get further # tokenized. Don't bother formatting the comment itself, however, because # it should have already been tokenized in tokenizeMultilineComment(). if previousState == MS.MarkdownStateComment: commentEnd = text.find("-->") for i in range(commentEnd + 3): text = text[:i] + self.DUMMY_CHAR + text[i+1:] # Now check for inline comments (non-multiline). commentStart = self.htmlInlineCommentRegex.indexIn(text) while commentStart >= 0: commentLength = self.htmlInlineCommentRegex.matchedLength() token = Token() token.type = MTT.TokenHtmlComment token.position = commentStart token.length = commentLength self.addToken(token) # Replace comment segment with dummy characters so that it doesn't # get tokenized again. for i in range(commentStart, commentStart + commentLength): text = text[:i] + self.DUMMY_CHAR + text[i+1:] commentStart = self.htmlInlineCommentRegex.indexIn(text, commentStart + commentLength) # Find multiline comment start, if any. commentStart = text.find("") else: cursor.insertText("") cursor.movePosition(QTextCursor.PreviousCharacter, QTextCursor.MoveAnchor, 4) self.setTextCursor(cursor) def commentLine(self): cursor = self.textCursor() start = cursor.selectionStart() end = cursor.selectionEnd() block = self.document().findBlock(start) block2 = self.document().findBlock(end) if True: # Method 1 cursor.beginEditBlock() while block.isValid(): self.commentBlock(block) if block == block2: break block = block.next() cursor.endEditBlock() else: # Method 2 cursor.beginEditBlock() cursor.setPosition(block.position()) cursor.insertText("") cursor.endEditBlock() def commentBlock(self, block): cursor = QTextCursor(block) text = block.text() if text[:5] == "": text2 = text[5:-4] else: text2 = "" self.selectBlock(cursor) cursor.insertText(text2) def lineFormattingMarkup(self, markup): """ Adds `markup` at the beginning of block. """ cursor = self.textCursor() cursor.movePosition(cursor.StartOfBlock) cursor.insertText(markup) def insertFormattingMarkup(self, markup): cursor = self.textCursor() # Select beginning and end of words self.selectWord(cursor) if cursor.hasSelection(): start = cursor.selectionStart() end = cursor.selectionEnd() + len(markup) cursor.beginEditBlock() cursor.setPosition(start) cursor.insertText(markup) cursor.setPosition(end) cursor.insertText(markup) cursor.endEditBlock() cursor.movePosition(QTextCursor.PreviousCharacter, QTextCursor.KeepAnchor, len(markup)) #self.setTextCursor(cursor) else: # Insert markup twice (for opening and closing around the cursor), # and then move the cursor to be between the pair. cursor.beginEditBlock() cursor.insertText(markup) cursor.insertText(markup) cursor.movePosition(QTextCursor.PreviousCharacter, QTextCursor.MoveAnchor, len(markup)) cursor.endEditBlock() self.setTextCursor(cursor) def clearFormat(self): cursor = self.textCursor() text = cursor.selectedText() if not text: self.selectBlock(cursor) text = cursor.selectedText() text = self.clearedFormat(text) cursor.insertText(text) def clearedFormat(self, text): # FIXME: clear also block formats for reg, rep, flags in [ (r"\*\*(.*?)\*\*", "\\1", None), # bold ("__(.*?)__", "\\1", None), # bold (r"\*(.*?)\*", "\\1", None), # emphasis ("_(.*?)_", "\\1", None), # emphasis ("`(.*?)`", "\\1", None), # verbatim ("~~(.*?)~~", "\\1", None), # strike (r"\^(.*?)\^", "\\1", None), # superscript ("~(.*?)~", "\\1", None), # subscript (r"", "\\1", re.S), # comments # LINES OR BLOCKS (r"^#*\s*(.+?)\s*", "\\1", re.M), # ATX (r"^[=-]*$", "", re.M), # Setext (r"^`*$", "", re.M), # Code block fenced (r"^\s*[-+*]\s*(.*?)\s*$", "\\1", re.M), # Bullet List (r"^\s*[0-9a-z](\.|\))\s*(.*?)\s*$", "\\2", re.M), # Bullet List (r"\s*[>\s]*(.*?)\s*$", "\\1", re.M), # Code block and blockquote ]: text = re.sub(reg, rep, text, flags if flags else 0) return text def clearedFormatForStats(self, text): # Remove stuff that musn't be counted # FIXME: clear also block formats for reg, rep, flags in [ ("", "", re.S), # comments ]: text = re.sub(reg, rep, text, flags if flags else 0) return text def titleSetext(self, level): cursor = self.textCursor() cursor.beginEditBlock() # Is it already a Setext header? if cursor.block().userState() in [ MS.MarkdownStateSetextHeading1Line2, MS.MarkdownStateSetextHeading2Line2]: cursor.movePosition(QTextCursor.PreviousBlock) text = cursor.block().text() if cursor.block().userState() in [ MS.MarkdownStateSetextHeading1Line1, MS.MarkdownStateSetextHeading2Line1]: # Need to remove line below c = QTextCursor(cursor.block().next()) self.selectBlock(c) c.insertText("") char = "=" if level == 1 else "-" text = re.sub(r"^#*\s*(.*)\s*#*", "\\1", text) # Removes # sub = char * len(text) text = text + "\n" + sub self.selectBlock(cursor) cursor.insertText(text) cursor.endEditBlock() def titleATX(self, level): cursor = self.textCursor() text = cursor.block().text() # Are we in a Setext Header? if cursor.block().userState() in [ MS.MarkdownStateSetextHeading1Line1, MS.MarkdownStateSetextHeading2Line1]: # Need to remove line below cursor.beginEditBlock() c = QTextCursor(cursor.block().next()) self.selectBlock(c) c.insertText("") self.selectBlock(cursor) cursor.insertText(text) cursor.endEditBlock() return elif cursor.block().userState() in [ MS.MarkdownStateSetextHeading1Line2, MS.MarkdownStateSetextHeading2Line2]: cursor.movePosition(QTextCursor.PreviousBlock) self.setTextCursor(cursor) self.titleATX(level) return m = re.match(r"^(#+)(\s*)(.+)", text) if m: pre = m.group(1) space = m.group(2) txt = m.group(3) if len(pre) == level: # Remove title text = txt else: text = "#" * level + space + txt else: text = "#" * level + " " + text self.selectBlock(cursor) cursor.insertText(text) ########################################################################### # CLICKABLE THINKS ########################################################################### def resizeEvent(self, event): textEditView.resizeEvent(self, event) self.getClickRects() def scrollContentsBy(self, dx, dy): textEditView.scrollContentsBy(self, dx, dy) self.getClickRects() def getClickRects(self): """ Parses the whole texte to catch clickable things: links and images. Stores the result so that it can be used elsewhere. """ cursor = self.textCursor() refs = [] text = self.toPlainText() for rx in [ self.imageRegex, self.automaticLinkRegex, self.inlineLinkRegex, ]: pos = 0 while rx.indexIn(text, pos) != -1: cursor.setPosition(rx.pos()) r1 = self.cursorRect(cursor) pos = rx.pos() + rx.matchedLength() cursor.setPosition(pos) r2 = self.cursorRect(cursor) if r1.top() == r2.top(): ct = ClickThing( QRect(r1.topLeft(), r2.bottomRight()), rx, rx.capturedTexts()) refs.append(ct) else: r1.setRight(self.viewport().geometry().right()) refs.append(ClickThing(r1, rx, rx.capturedTexts())) r2.setLeft(self.viewport().geometry().left()) refs.append(ClickThing(r2, rx, rx.capturedTexts())) # We check for middle lines cursor.setPosition(rx.pos()) cursor.movePosition(cursor.Down) while self.cursorRect(cursor).top() != r2.top(): r3 = self.cursorRect(cursor) r3.setLeft(self.viewport().geometry().left()) r3.setRight(self.viewport().geometry().right()) refs.append(ClickThing(r3, rx, rx.capturedTexts())) cursor.movePosition(cursor.Down) self.clickRects = refs def mouseMoveEvent(self, event): """ When mouse moves, we show tooltip when appropriate. """ textEditView.mouseMoveEvent(self, event) onRect = [r for r in self.clickRects if r.rect.contains(event.pos())] if not onRect: qApp.restoreOverrideCursor() QToolTip.hideText() return ct = onRect[0] if not qApp.overrideCursor(): qApp.setOverrideCursor(Qt.PointingHandCursor) if ct.regex == self.automaticLinkRegex: tooltip = ct.texts[2] or ct.texts[4] elif ct.regex == self.imageRegex: tt = ("

    " + ct.texts[1] + "

    " +"

    ") tooltip = None pos = event.pos() + QPoint(0, ct.rect.height()) ImageTooltip.fromUrl(ct.texts[2], pos, self) elif ct.regex == self.inlineLinkRegex: tooltip = ct.texts[1] or ct.texts[2] if tooltip: tooltip = self.tr("{} (CTRL+Click to open)").format(tooltip) QToolTip.showText(self.mapToGlobal(event.pos()), tooltip) def mouseReleaseEvent(self, event): textEditView.mouseReleaseEvent(self, event) onRect = [r for r in self.clickRects if r.rect.contains(event.pos())] if onRect and event.modifiers() & Qt.ControlModifier: ct = onRect[0] if ct.regex == self.automaticLinkRegex: url = ct.texts[2] or ct.texts[4] elif ct.regex == self.imageRegex: url = ct.texts[2] elif ct.regex == self.inlineLinkRegex: url = ct.texts[2] F.openURL(url) qApp.restoreOverrideCursor() # def paintEvent(self, event): # """ # Only useful for debugging: shows which rects are detected for # clickable things. # """ # textEditView.paintEvent(self, event) # # # Debug: paint rects # from PyQt5.QtGui import QPainter # painter = QPainter(self.viewport()) # painter.setPen(Qt.gray) # for r in self.clickRects: # painter.drawRect(r.rect) def doTooltip(self, pos, message): QToolTip.showText(self.mapToGlobal(pos), message) class ClickThing: """ A simple class to remember QRect associated with clickable stuff. """ def __init__(self, rect, regex, texts): self.rect = rect self.regex = regex self.texts = texts from PyQt5.QtNetwork import QNetworkRequest, QNetworkAccessManager, QNetworkReply from PyQt5.QtCore import QIODevice, QUrl, QBuffer from PyQt5.QtGui import QPixmap class ImageTooltip: """ This class handles the retrieving and caching of images in order to display these in tooltips. """ cache = {} manager = QNetworkAccessManager() processing = {} supportedSchemes = ("", "file", "http", "https") def fromUrl(url, pos, editor): """ Shows the image tooltip for the given url if available, or requests it for future use. """ ImageTooltip.editor = editor if ImageTooltip.showTooltip(url, pos): return # the url already exists in the cache try: ImageTooltip.manager.finished.connect(ImageTooltip.finished, F.AUC) except: pass # already connected qurl = QUrl.fromUserInput(url) if (qurl == QUrl()): ImageTooltip.cache[url] = (False, ImageTooltip.manager.tr("The image path or URL is incomplete or malformed.")) ImageTooltip.showTooltip(url, pos) return # empty QUrl means it failed completely elif (qurl.scheme() not in ImageTooltip.supportedSchemes): # QUrl.fromUserInput() can occasionally deduce an incorrect scheme, # which produces an error message regarding an unknown scheme. (Yay!) # But it also breaks all possible methods to try and associate the # reply with the original request in finished(), since reply.request() # is completely and utterly butchered for all tracking needs. :'( # (The QNetworkRequest, .url() and .originatingObject() can all change.) # Test case (Linux): ![image](C:\test_root.jpg) ImageTooltip.cache[url] = (False, ImageTooltip.manager.tr("The protocol \"{}\" is not supported.").format(qurl.scheme())) ImageTooltip.showTooltip(url, pos) return # no more request/reply chaos, please! elif (qurl in ImageTooltip.processing): return # one download is more than enough # Request the image for later processing. request = QNetworkRequest(qurl) ImageTooltip.processing[qurl] = (pos, url) reply = ImageTooltip.manager.get(request) # On Linux the finished() signal is not triggered when the url resembles # 'file://X:/...'. But because it completes instantly, we can manually # trigger the code to keep our processing dictionary neat & clean. if reply.error() == 302: # QNetworkReply.ProtocolInvalidOperationError ImageTooltip.finished(reply) def finished(reply): """ After retrieving an image, we add it to the cache. """ cache = ImageTooltip.cache url_key = reply.request().url() pos, url = None, None if url_key in ImageTooltip.processing: # Obtain the information associated with this request. pos, url = ImageTooltip.processing[url_key] del ImageTooltip.processing[url_key] elif len(ImageTooltip.processing) == 0: # We are not processing anything. Maybe it is a spurious signal, # or maybe the 'reply.error() == 302' workaround in fromUrl() has # been fixed in Qt. Whatever the reason, we can assume this request # has already been handled, and needs no more work from us. return else: # Somehow we lost track. Log what we can to hopefully figure it out. print("Warning: unable to match fetched data for tooltip to original request.") print("- Completed request:", url_key) print("- Status upon finishing:", reply.error(), reply.errorString()) print("- Currently processing:", ImageTooltip.processing) return # Update cache with retrieved data. if reply.error() != QNetworkReply.NoError: cache[url] = (False, reply.errorString()) else: px = QPixmap() px.loadFromData(reply.readAll()) px = px.scaled(800, 600, Qt.KeepAspectRatio) cache[url] = (True, px) ImageTooltip.showTooltip(url, pos) def showTooltip(url, pos): """ Show a tooltip for the given url based on cached information. """ cache = ImageTooltip.cache if url in cache: if not cache[url][0]: # error, image was not found ImageTooltip.tooltipError(cache[url][1], pos) else: ImageTooltip.tooltip(cache[url][1], pos) return True return False def tooltipError(message, pos): """ Display a tooltip with an error message at the given position. """ ImageTooltip.editor.doTooltip(pos, message) def tooltip(image, pos): """ Display a tooltip with an image at the given position. """ px = image buffer = QBuffer() buffer.open(QIODevice.WriteOnly) px.save(buffer, "PNG", quality=100) image = bytes(buffer.data().toBase64()).decode() tt = "

    ".format(image) ImageTooltip.editor.doTooltip(pos, tt) manuskript-0.10.0/manuskript/ui/views/PDFViewer.py000066400000000000000000000033631354442177200221170ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import QUrl from PyQt5.QtWidgets import QLabel from manuskript.ui.views.webView import webView, webEngine from manuskript.functions import appPath if webEngine == "QtWebKit": from PyQt5.QtWebKit import QWebSettings from PyQt5.QtWebKitWidgets import QWebView class PDFViewer(QWebView): pdf_viewer_page = "file://"+appPath('libs/pdf.js/web/viewer.html') def __init__(self, parent=None): QWebView.__init__(self, parent) self.settings = QWebSettings.globalSettings() self.settings.setAttribute(QWebSettings.LocalContentCanAccessFileUrls, True) def loadPDF(self, pdf): url = QUrl(self.pdf_viewer_page+"?file="+pdf) self.settings.clearMemoryCaches() self.load(url) elif webEngine == "QtWebEngine": from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage, QWebEngineSettings class PDFViewer(QWebEngineView): pdf_viewer_page = "file://"+appPath('libs/pdf.js/web/viewer.html') def __init__(self, parent=None): QWebEngineView.__init__(self, parent) self.settings = QWebEngineSettings.globalSettings() self.settings.setAttribute(QWebEngineSettings.LocalContentCanAccessFileUrls, True) def loadPDF(self, pdf): url = QUrl(self.pdf_viewer_page+"?file="+pdf) self.load(url) else: class PDFViewer(QLabel): def __init__(self, parent=None): QLabel.__init__(self, parent) self.setText("No Web Engine installed capable of displaying PDF.\n\n" "Consider installing QtWebKit or QtWebEngine.") def loadPDF(self, pdf): pass manuskript-0.10.0/manuskript/ui/views/__init__.py000066400000000000000000000000001354442177200220440ustar00rootroot00000000000000manuskript-0.10.0/manuskript/ui/views/basicItemView.py000066400000000000000000000042541354442177200230570ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtWidgets import QWidget, QAbstractItemView from manuskript.enums import Outline from manuskript.ui.views.basicItemView_ui import Ui_basicItemView class basicItemView(QWidget, Ui_basicItemView): def __init__(self, parent=None): QWidget.__init__(self) self.setupUi(self) self.txtSummarySentence.setColumn(Outline.summarySentence) self.txtSummaryFull.setColumn(Outline.summaryFull) self.txtGoal.setColumn(Outline.setGoal) def setModels(self, mdlOutline, mdlCharacter, mdlLabels, mdlStatus): self.cmbPOV.setModels(mdlCharacter, mdlOutline) self.txtSummarySentence.setModel(mdlOutline) self.txtSummaryFull.setModel(mdlOutline) self.txtGoal.setModel(mdlOutline) def getIndexes(self, sourceView): """Returns a list of indexes from list of QItemSelectionRange""" indexes = [] for i in sourceView.selection().indexes(): if i.column() != 0: continue if i not in indexes: indexes.append(i) return indexes def selectionChanged(self): if isinstance(self.sender(), QAbstractItemView): selectionModel = self.sender().selectionModel() else: selectionModel = self.sender() indexes = self.getIndexes(selectionModel) if len(indexes) == 0: self.setEnabled(False) elif len(indexes) == 1: self.setEnabled(True) idx = indexes[0] self.txtSummarySentence.setCurrentModelIndex(idx) self.txtSummaryFull.setCurrentModelIndex(idx) self.cmbPOV.setCurrentModelIndex(idx) self.txtGoal.setCurrentModelIndex(idx) else: self.setEnabled(True) self.txtSummarySentence.setCurrentModelIndexes(indexes) self.txtSummaryFull.setCurrentModelIndexes(indexes) self.cmbPOV.setCurrentModelIndexes(indexes) self.txtGoal.setCurrentModelIndexes(indexes) def setDict(self, d): self.txtSummaryFull.setDict(d) def toggleSpellcheck(self, v): self.txtSummaryFull.toggleSpellcheck(v) manuskript-0.10.0/manuskript/ui/views/basicItemView_ui.py000066400000000000000000000073121354442177200235520ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'manuskript/ui/views/basicItemView_ui.ui' # # Created by: PyQt5 UI code generator 5.5.1 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_basicItemView(object): def setupUi(self, basicItemView): basicItemView.setObjectName("basicItemView") basicItemView.resize(400, 425) self.verticalLayout = QtWidgets.QVBoxLayout(basicItemView) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setObjectName("verticalLayout") self.horizontalLayout_11 = QtWidgets.QHBoxLayout() self.horizontalLayout_11.setObjectName("horizontalLayout_11") spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_11.addItem(spacerItem) self.lblPlanPOV = QtWidgets.QLabel(basicItemView) self.lblPlanPOV.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.lblPlanPOV.setObjectName("lblPlanPOV") self.horizontalLayout_11.addWidget(self.lblPlanPOV) self.cmbPOV = cmbOutlineCharacterChoser(basicItemView) self.cmbPOV.setFrame(False) self.cmbPOV.setObjectName("cmbPOV") self.horizontalLayout_11.addWidget(self.cmbPOV) self.lblGoal = QtWidgets.QLabel(basicItemView) self.lblGoal.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.lblGoal.setObjectName("lblGoal") self.horizontalLayout_11.addWidget(self.lblGoal) self.txtGoal = lineEditView(basicItemView) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.txtGoal.sizePolicy().hasHeightForWidth()) self.txtGoal.setSizePolicy(sizePolicy) self.txtGoal.setAutoFillBackground(False) self.txtGoal.setStyleSheet("border-radius: 6px;") self.txtGoal.setFrame(False) self.txtGoal.setObjectName("txtGoal") self.horizontalLayout_11.addWidget(self.txtGoal) self.verticalLayout.addLayout(self.horizontalLayout_11) self.txtSummarySentence = lineEditView(basicItemView) self.txtSummarySentence.setText("") self.txtSummarySentence.setObjectName("txtSummarySentence") self.verticalLayout.addWidget(self.txtSummarySentence) self.label_9 = QtWidgets.QLabel(basicItemView) self.label_9.setObjectName("label_9") self.verticalLayout.addWidget(self.label_9) self.txtSummaryFull = MDEditCompleter(basicItemView) self.txtSummaryFull.setObjectName("txtSummaryFull") self.verticalLayout.addWidget(self.txtSummaryFull) self.retranslateUi(basicItemView) QtCore.QMetaObject.connectSlotsByName(basicItemView) def retranslateUi(self, basicItemView): _translate = QtCore.QCoreApplication.translate basicItemView.setWindowTitle(_translate("basicItemView", "Form")) self.lblPlanPOV.setText(_translate("basicItemView", "POV:")) self.lblGoal.setText(_translate("basicItemView", "Goal:")) self.txtGoal.setPlaceholderText(_translate("basicItemView", "Word count")) self.txtSummarySentence.setPlaceholderText(_translate("basicItemView", "One line summary")) self.label_9.setText(_translate("basicItemView", "Few sentences summary:")) from manuskript.ui.views.MDEditCompleter import MDEditCompleter from manuskript.ui.views.cmbOutlineCharacterChoser import cmbOutlineCharacterChoser from manuskript.ui.views.lineEditView import lineEditView manuskript-0.10.0/manuskript/ui/views/basicItemView_ui.ui000066400000000000000000000065141354442177200235420ustar00rootroot00000000000000 basicItemView 0 0 400 425 Form 0 Qt::Horizontal 40 20 POV: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Goal: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 false border-radius: 6px; false Word count One line summary Few sentences summary: MDEditCompleter QTextEdit
    manuskript.ui.views.MDEditCompleter.h
    cmbOutlineCharacterChoser QComboBox
    manuskript.ui.views.cmbOutlineCharacterChoser.h
    lineEditView QLineEdit
    manuskript.ui.views.lineEditView.h
    manuskript-0.10.0/manuskript/ui/views/characterTreeView.py000066400000000000000000000132701354442177200237310ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import QSize, QModelIndex, Qt from PyQt5.QtGui import QPixmap, QColor, QIcon, QBrush from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem, QColorDialog from manuskript.enums import Character from manuskript.functions import iconColor, mainWindow from manuskript.ui import style as S class characterTreeView(QTreeWidget): """ A QTreeWidget that displays characters from a characterModel in respect of their importance. """ def __init__(self, parent=None): QTreeWidget.__init__(self, parent) self._model = None self._catRow = [-1, -1, -1] self._filter = "" self._lastID = -1 self._updating = False self.setRootIsDecorated(False) self.setIndentation(10) self.setHeaderHidden(True) self.setIconSize(QSize(24, 24)) self.setColumnCount(1) self._rootItem = QTreeWidgetItem() self.insertTopLevelItem(0, self._rootItem) def setCharactersModel(self, model): self._model = model self._model.dataChanged.connect(self.updateMaybe) self._model.rowsInserted.connect(self.updateMaybe2) self._model.rowsRemoved.connect(self.updateMaybe2) self.updateItems() def setFilter(self, text): self._filter = text self.updateItems() def updateMaybe(self, topLeft, bottomRight): if topLeft.parent() != QModelIndex(): return if topLeft.column() <= Character.name <= bottomRight.column(): # Update name self.updateNames() elif topLeft.column() <= Character.importance <= bottomRight.column(): # Importance changed self.updateItems() def updateMaybe2(self, parent, first, last): # Rows inserted or removed, we update only if they are topLevel rows. if parent == QModelIndex(): self.updateItems() def updateNames(self): for i in range(self.topLevelItemCount()): item = self.topLevelItem(i) for child in range(item.childCount()): sub = item.child(child) ID = sub.data(0, Qt.UserRole) if ID is not None: # Update name c = self._model.getCharacterByID(ID) name = c.name() sub.setText(0, name) # Update icon px = QPixmap(32, 32) color = c.color() px.fill(color) sub.setIcon(0, QIcon(px)) def updateItems(self): if not self._model: return if self.currentItem(): self._lastID = self.currentItem().data(0, Qt.UserRole) self._updating = True self.clear() characters = self._model.getCharactersByImportance() h = [self.tr("Main"), self.tr("Secondary"), self.tr("Minor")] for i in range(3): # Create category item cat = QTreeWidgetItem(self, [h[i]]) cat.setBackground(0, QBrush(QColor(S.highlightLight))) cat.setForeground(0, QBrush(QColor(S.highlightedTextDark))) cat.setTextAlignment(0, Qt.AlignCenter) f = cat.font(0) f.setBold(True) cat.setFont(0, f) self.addTopLevelItem(cat) # cat.setChildIndicatorPolicy(cat.DontShowIndicator) for c in characters[i]: name = c.name() # Check if name passes filter if not self._filter.lower() in name.lower(): continue item = QTreeWidgetItem(cat, [name]) item.setData(0, Qt.UserRole, c.ID()) px = QPixmap(32, 32) color = QColor(c.color()) px.fill(color) item.setIcon(0, QIcon(px)) if c.ID() == self._lastID: self.setCurrentItem(item) self.expandAll() self._updating = False def removeCharacter(self): """ Removes selected character. """ ID = self.currentCharacterID() if ID: self._model.removeCharacter(ID) def choseCharacterColor(self): ID = self.currentCharacterID() c = self._model.getCharacterByID(ID) if c: color = iconColor(c.icon) else: color = Qt.white self.colorDialog = QColorDialog(color, mainWindow()) color = self.colorDialog.getColor(color) if color.isValid(): c.setColor(color) mainWindow().updateCharacterColor(ID) def addCharacterInfo(self): self._model.addCharacterInfo(self.currentCharacterID()) def removeCharacterInfo(self): self._model.removeCharacterInfo(self.currentCharacterID(), ) def currentCharacterID(self): ID = None if self.currentItem(): ID = self.currentItem().data(0, Qt.UserRole) return ID def currentCharacter(self): """ Returns the selected character @return: Character """ ID = self.currentCharacterID() return self._model.getCharacterByID(ID) def getItemByID(self, ID): for t in range(self.topLevelItemCount()): for i in range(self.topLevelItem(t).childCount()): item = self.topLevelItem(t).child(i) if item.data(0, Qt.UserRole) == ID: return item def mouseDoubleClickEvent(self, event): item = self.currentItem() # Catching double clicks to forbid collapsing of toplevel items if item.parent(): QTreeWidget.mouseDoubleClickEvent(self, event) manuskript-0.10.0/manuskript/ui/views/chkOutlineCompile.py000066400000000000000000000061141354442177200237370ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- # Because I have trouble with QDataWidgetMapper and the checkbox, I don't know why. from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QCheckBox from manuskript.enums import Outline class chkOutlineCompile(QCheckBox): def __init__(self, parent=None): QCheckBox.__init__(self, parent) self.stateChanged.connect(self.submit) self._column = Outline.compile self._index = None self._indexes = None self._model = None self._updating = False def setModel(self, model): self._model = model self._model.dataChanged.connect(self.update) def setCurrentModelIndex(self, index): self._indexes = None if index.column() != self._column: index = index.sibling(index.row(), self._column) self._index = index self.setTristate(False) self.updateCheckState() def setCurrentModelIndexes(self, indexes): self._index = None self._indexes = [] for i in indexes: if i.column() != self._column: i = i.sibling(i.row(), self._column) self._indexes.append(i) self.updateCheckState() def getCheckedValue(self, index): item = index.internalPointer() return Qt.Checked if item.compile() else Qt.Unchecked def update(self, topLeft, bottomRight): if self._updating: # We are currently putting data in the model, so no updates return if self._index: if topLeft.row() <= self._index.row() <= bottomRight.row(): self.updateCheckState() elif self._indexes: update = False for i in self._indexes: if topLeft.row() <= i.row() <= bottomRight.row(): update = True if update: self.updateCheckState() def updateCheckState(self): if self._index: self.setEnabled(True) c = self.getCheckedValue(self._index) self.setCheckState(c) elif self._indexes: self.setEnabled(True) values = [] for i in self._indexes: values.append(self.getCheckedValue(i)) same = True for v in values[1:]: if v != values[0]: same = False break if same: self.setCheckState(values[0]) else: self._updating = True self.setCheckState(Qt.PartiallyChecked) self._updating = False else: self.setChecked(False) self.setEnabled(False) def submit(self, state): if self._updating: return if self._index: if self._model.data(self._index) != state: self._model.setData(self._index, state) elif self._indexes: for i in self._indexes: if self._model.data(i) != state: self._model.setData(i, state) self.setTristate(False) manuskript-0.10.0/manuskript/ui/views/cmbOutlineCharacterChoser.py000066400000000000000000000116311354442177200254030ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon, QBrush, QColor from PyQt5.QtWidgets import QComboBox from manuskript.enums import Outline from manuskript.functions import toInt from manuskript.ui import style as S class cmbOutlineCharacterChoser(QComboBox): def __init__(self, parent=None): QComboBox.__init__(self, parent) self.activated[int].connect(self.submit) self._column = Outline.POV self._index = None self._indexes = None self._updating = False self._various = False def setModels(self, mdlCharacter, mdlOutline): self.mdlCharacters = mdlCharacter self.mdlCharacters.dataChanged.connect(self.updateItems) self.mdlCharacters.rowsInserted.connect(self.updateItems) self.mdlCharacters.rowsRemoved.connect(self.updateItems) self.mdlOutline = mdlOutline self.mdlOutline.dataChanged.connect(self.update) self.updateItems() def updateItems(self): self.clear() self.addItem(QIcon.fromTheme("dialog-no"), self.tr("None")) l = [self.tr("Main"), self.tr("Secondary"), self.tr("Minor")] for importance in range(3): self.addItem(l[importance]) self.setItemData(self.count() - 1, QBrush(QColor(S.highlightedTextDark)), Qt.ForegroundRole) self.setItemData(self.count() - 1, QBrush(QColor(S.highlightLight)), Qt.BackgroundRole) item = self.model().item(self.count() - 1) item.setFlags(Qt.ItemIsEnabled) for i in range(self.mdlCharacters.rowCount()): imp = toInt(self.mdlCharacters.importance(i)) if not 2 - imp == importance: continue self.addItem(self.mdlCharacters.icon(i), self.mdlCharacters.name(i), self.mdlCharacters.ID(i)) self.setItemData(self.count() - 1, self.mdlCharacters.name(i), Qt.ToolTipRole) self._various = False if self._index or self._indexes: self.updateSelectedItem() def setCurrentModelIndex(self, index): self._indexes = None if index.column() != self._column: index = index.sibling(index.row(), self._column) self._index = index self.updateItems() def setCurrentModelIndexes(self, indexes): self._index = None idxes = [] for i in indexes: if i.isValid(): if i.column() != self._column: i = i.sibling(i.row(), self._column) idxes.append(i) if idxes != self._indexes: self._indexes = idxes self.updateItems() def update(self, topLeft, bottomRight): if self._updating: # We are currently putting data in the model, so no updates return if self._index: if topLeft.row() <= self._index.row() <= bottomRight.row(): self.updateSelectedItem() elif self._indexes: update = False for i in self._indexes: if topLeft.row() <= i.row() <= bottomRight.row(): update = True if update: self.updateSelectedItem() def getPOV(self, index): item = index.internalPointer() POV = item.data(self._column) return POV def selectPOV(self, POV): idx = self.findData(POV) if idx != -1: self.setCurrentIndex(idx) else: self.setCurrentIndex(0) def updateSelectedItem(self, idx1=None, idx2=None): if self._updating: return if self._index: POV = self.getPOV(self._index) self.selectPOV(POV) elif self._indexes: POVs = [] same = True for i in self._indexes: POVs.append(self.getPOV(i)) for POV in POVs[1:]: if POV != POVs[0]: same = False break if same: self._various = False self.selectPOV(POVs[0]) else: if not self._various: self.insertItem(0, self.tr("Various")) f = self.font() f.setItalic(True) self.setItemData(0, f, Qt.FontRole) self.setItemData(0, QBrush(Qt.darkGray), Qt.ForegroundRole) self._various = True self.setCurrentIndex(0) else: self.setCurrentIndex(0) def submit(self, idx): if self._index: self.mdlOutline.setData(self._index, self.currentData()) elif self._indexes: if self._various and self.currentIndex() == 0: return self._updating = True for i in self._indexes: self.mdlOutline.setData(i, self.currentData()) self._updating = False manuskript-0.10.0/manuskript/ui/views/cmbOutlineLabelChoser.py000066400000000000000000000076621354442177200245370ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import Qt from PyQt5.QtGui import QBrush from PyQt5.QtWidgets import QComboBox from manuskript.enums import Outline class cmbOutlineLabelChoser(QComboBox): def __init__(self, parent=None): QComboBox.__init__(self, parent) self.activated[int].connect(self.submit) self._column = Outline.label self._index = None self._indexes = None self._updating = False self._various = False def setModels(self, mdlLabels, mdlOutline): self.mdlLabels = mdlLabels self.mdlLabels.dataChanged.connect(self.updateItems) self.mdlOutline = mdlOutline self.mdlOutline.dataChanged.connect(self.update) self.updateItems() def updateItems(self): self.clear() for i in range(self.mdlLabels.rowCount()): item = self.mdlLabels.item(i, 0) if item: self.addItem(item.icon(), item.text()) self._various = False if self._index or self._indexes: self.updateSelectedItem() def setCurrentModelIndex(self, index): self._indexes = None if index.column() != self._column: index = index.sibling(index.row(), self._column) self._index = index self.updateItems() self.updateSelectedItem() def setCurrentModelIndexes(self, indexes): self._indexes = [] self._index = None for i in indexes: if i.isValid(): if i.column() != self._column: i = i.sibling(i.row(), self._column) self._indexes.append(i) self.updateItems() self.updateSelectedItem() def update(self, topLeft, bottomRight): if self._updating: # We are currently putting data in the model, so no updates return if self._index: if topLeft.row() <= self._index.row() <= bottomRight.row(): self.updateSelectedItem() elif self._indexes: update = False for i in self._indexes: if topLeft.row() <= i.row() <= bottomRight.row(): update = True if update: self.updateSelectedItem() def getLabel(self, index): item = index.internalPointer() label = item.data(self._column) if not label: label = 0 return int(label) def updateSelectedItem(self): if self._updating: return if self._index: label = self.getLabel(self._index) self.setCurrentIndex(label) elif self._indexes: labels = [] same = True for i in self._indexes: labels.append(self.getLabel(i)) for lbl in labels[1:]: if lbl != labels[0]: same = False break if same: self._various = False self.setCurrentIndex(labels[0]) else: if not self._various: self.insertItem(0, self.tr("Various")) f = self.font() f.setItalic(True) self.setItemData(0, f, Qt.FontRole) self.setItemData(0, QBrush(Qt.darkGray), Qt.ForegroundRole) self._various = True self.setCurrentIndex(0) else: self.setCurrentIndex(0) def submit(self, idx): if self._index: self.mdlOutline.setData(self._index, self.currentIndex()) elif self._indexes: value = self.currentIndex() if self._various: if value == 0: return value -= 1 self._updating = True for i in self._indexes: self.mdlOutline.setData(i, value) self._updating = False manuskript-0.10.0/manuskript/ui/views/cmbOutlineStatusChoser.py000066400000000000000000000076311354442177200247770ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import Qt from PyQt5.QtGui import QBrush from PyQt5.QtWidgets import QComboBox from manuskript.enums import Outline class cmbOutlineStatusChoser(QComboBox): def __init__(self, parent=None): QComboBox.__init__(self, parent) self.activated[int].connect(self.submit) self._column = Outline.status self._index = None self._indexes = None self._updating = False self._various = False def setModels(self, mdlStatus, mdlOutline): self.mdlStatus = mdlStatus self.mdlStatus.dataChanged.connect(self.updateItems) self.mdlOutline = mdlOutline self.mdlOutline.dataChanged.connect(self.update) self.updateItems() def updateItems(self): self.clear() for i in range(self.mdlStatus.rowCount()): item = self.mdlStatus.item(i, 0) if item: self.addItem(item.text()) self._various = False if self._index or self._indexes: self.updateSelectedItem() def setCurrentModelIndex(self, index): self._indexes = None if index.column() != self._column: index = index.sibling(index.row(), self._column) self._index = index self.updateItems() self.updateSelectedItem() def setCurrentModelIndexes(self, indexes): self._indexes = [] self._index = None for i in indexes: if i.isValid(): if i.column() != self._column: i = i.sibling(i.row(), self._column) self._indexes.append(i) self.updateItems() self.updateSelectedItem() def update(self, topLeft, bottomRight): if self._updating: # We are currently putting data in the model, so no updates return if self._index: if topLeft.row() <= self._index.row() <= bottomRight.row(): self.updateSelectedItem() elif self._indexes: update = False for i in self._indexes: if topLeft.row() <= i.row() <= bottomRight.row(): update = True if update: self.updateSelectedItem() def getStatus(self, index): item = index.internalPointer() status = item.data(self._column) if not status: status = 0 return int(status) def updateSelectedItem(self): if self._updating: return if self._index: status = self.getStatus(self._index) self.setCurrentIndex(status) elif self._indexes: statuses = [] same = True for i in self._indexes: statuses.append(self.getStatus(i)) for s in statuses[1:]: if s != statuses[0]: same = False break if same: self._various = False self.setCurrentIndex(statuses[0]) else: if not self._various: self.insertItem(0, self.tr("Various")) f = self.font() f.setItalic(True) self.setItemData(0, f, Qt.FontRole) self.setItemData(0, QBrush(Qt.darkGray), Qt.ForegroundRole) self._various = True self.setCurrentIndex(0) else: self.setCurrentIndex(0) def submit(self, idx): if self._index: self.mdlOutline.setData(self._index, self.currentIndex()) elif self._indexes: value = self.currentIndex() if self._various: if value == 0: return value -= 1 self._updating = True for i in self._indexes: self.mdlOutline.setData(i, value) self._updating = False manuskript-0.10.0/manuskript/ui/views/corkDelegate.py000066400000000000000000000537471354442177200227300ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import QSize, Qt, QRect, QPoint, QPointF from PyQt5.QtGui import QMouseEvent, QFont, QPalette, QRegion, QFontMetrics, QColor, QIcon, QPolygonF from PyQt5.QtWidgets import QStyledItemDelegate, QLineEdit, QPlainTextEdit, QFrame, qApp, QStyle from manuskript import settings from manuskript.enums import Outline from manuskript.functions import colorifyPixmap from manuskript.functions import mainWindow from manuskript.functions import mixColors from manuskript.functions import outlineItemColors from manuskript.ui import style as S class corkDelegate(QStyledItemDelegate): def __init__(self, parent=None): QStyledItemDelegate.__init__(self, parent) self.factor = settings.corkSizeFactor / 100. self.lastPos = None self.editing = None self.margin = 5 self.bgColors = {} def newStyle(self): return settings.corkStyle == "new" def setCorkSizeFactor(self, v): self.factor = v / 100. def sizeHint(self, option, index): if self.newStyle(): defaultSize = QSize(300, 210) else: defaultSize = QSize(300, 200) return defaultSize * self.factor def editorEvent(self, event, model, option, index): # We catch the mouse position in the widget to know which part to edit if type(event) == QMouseEvent: self.lastPos = event.pos() # - option.rect.topLeft() return QStyledItemDelegate.editorEvent(self, event, model, option, index) def createEditor(self, parent, option, index): self.updateRects(option, index) bgColor = self.bgColors.get(index, "white") if self.mainLineRect.contains(self.lastPos): # One line summary self.editing = Outline.summarySentence edt = QLineEdit(parent) edt.setFocusPolicy(Qt.StrongFocus) edt.setFrame(False) f = QFont(option.font) if self.newStyle(): f.setBold(True) else: f.setItalic(True) edt.setAlignment(Qt.AlignCenter) edt.setPlaceholderText(self.tr("One line summary")) edt.setFont(f) edt.setStyleSheet("background: {}; color: black;".format(bgColor)) return edt elif self.titleRect.contains(self.lastPos): # Title self.editing = Outline.title edt = QLineEdit(parent) edt.setFocusPolicy(Qt.StrongFocus) edt.setFrame(False) f = QFont(option.font) if self.newStyle(): f.setPointSize(f.pointSize() + 4) else: edt.setAlignment(Qt.AlignCenter) f.setBold(True) edt.setFont(f) edt.setStyleSheet("background: {}; color: black;".format(bgColor)) # edt.setGeometry(self.titleRect) return edt else: # self.mainTextRect.contains(self.lastPos): # Summary self.editing = Outline.summaryFull edt = QPlainTextEdit(parent) edt.setFocusPolicy(Qt.StrongFocus) edt.setFrameShape(QFrame.NoFrame) try: # QPlainTextEdit.setPlaceholderText was introduced in Qt 5.3 edt.setPlaceholderText(self.tr("Full summary")) except AttributeError: pass edt.setStyleSheet("background: {}; color: black;".format(bgColor)) return edt def updateEditorGeometry(self, editor, option, index): if self.editing == Outline.summarySentence: # One line summary editor.setGeometry(self.mainLineRect) elif self.editing == Outline.title: # Title editor.setGeometry(self.titleRect) elif self.editing == Outline.summaryFull: # Summary editor.setGeometry(self.mainTextRect) def setEditorData(self, editor, index): item = index.internalPointer() if self.editing == Outline.summarySentence: # One line summary editor.setText(item.data(Outline.summarySentence)) elif self.editing == Outline.title: # Title editor.setText(index.data()) elif self.editing == Outline.summaryFull: # Summary editor.setPlainText(item.data(Outline.summaryFull)) def setModelData(self, editor, model, index): if self.editing == Outline.summarySentence: # One line summary model.setData(index.sibling(index.row(), Outline.summarySentence), editor.text()) elif self.editing == Outline.title: # Title model.setData(index, editor.text(), Outline.title) elif self.editing == Outline.summaryFull: # Summary model.setData(index.sibling(index.row(), Outline.summaryFull), editor.toPlainText()) def updateRects(self, option, index): if self.newStyle(): self.updateRects_v2(option, index) else: self.updateRects_v1(option, index) def updateRects_v2(self, option, index): margin = self.margin * 2 iconSize = max(24 * self.factor, 18) item = index.internalPointer() fm = QFontMetrics(option.font) h = fm.lineSpacing() self.itemRect = option.rect.adjusted(margin, margin, -margin, -margin) top = 15 * self.factor self.topRect = QRect(self.itemRect) self.topRect.setHeight(top) self.cardRect = QRect(self.itemRect.topLeft() + QPoint(0, top), self.itemRect.bottomRight()) self.iconRect = QRect(self.cardRect.topLeft() + QPoint(margin, margin), QSize(iconSize, iconSize)) self.labelRect = QRect(self.cardRect.topRight() - QPoint(margin + self.factor * 18, 1), self.cardRect.topRight() + QPoint(- margin - self.factor * 4, self.factor * 24)) self.titleRect = QRect(self.iconRect.topRight() + QPoint(margin, 0), self.labelRect.bottomLeft() - QPoint(margin, margin)) self.titleRect.setBottom(self.iconRect.bottom()) self.mainRect = QRect(self.iconRect.bottomLeft() + QPoint(0, margin), self.cardRect.bottomRight() - QPoint(margin, 2*margin)) self.mainRect.setLeft(self.titleRect.left()) self.mainLineRect = QRect(self.mainRect.topLeft(), self.mainRect.topRight() + QPoint(0, h)) self.mainTextRect = QRect(self.mainLineRect.bottomLeft() + QPoint(0, margin), self.mainRect.bottomRight()) if not item.data(Outline.summarySentence): self.mainTextRect.setTopLeft(self.mainLineRect.topLeft()) def updateRects_v1(self, option, index): margin = self.margin iconSize = max(16 * self.factor, 12) item = index.internalPointer() self.itemRect = option.rect.adjusted(margin, margin, -margin, -margin) self.iconRect = QRect(self.itemRect.topLeft() + QPoint(margin, margin), QSize(iconSize, iconSize)) self.labelRect = QRect(self.itemRect.topRight() - QPoint(iconSize + margin, 0), self.itemRect.topRight() + QPoint(0, iconSize + 2 * margin)) self.titleRect = QRect(self.iconRect.topRight() + QPoint(margin, 0), self.labelRect.bottomLeft() - QPoint(margin, margin)) self.bottomRect = QRect(QPoint(self.itemRect.x(), self.iconRect.bottom() + margin), QPoint(self.itemRect.right(), self.itemRect.bottom())) self.topRect = QRect(self.itemRect.topLeft(), self.bottomRect.topRight()) self.mainRect = self.bottomRect.adjusted(margin, margin, -margin, -margin) self.mainLineRect = QRect(self.mainRect.topLeft(), self.mainRect.topRight() + QPoint(0, iconSize)) self.mainTextRect = QRect(self.mainLineRect.bottomLeft() + QPoint(0, margin), self.mainRect.bottomRight()) if not item.data(Outline.summarySentence): self.mainTextRect.setTopLeft(self.mainLineRect.topLeft()) if item.data(Outline.label) in ["", "0", 0]: self.titleRect.setBottomRight(self.labelRect.bottomRight() - QPoint(self.margin, self.margin)) def paint(self, p, option, index): if self.newStyle(): self.paint_v2(p, option, index) else: self.paint_v1(p, option, index) def paint_v2(self, p, option, index): # QStyledItemDelegate.paint(self, p, option, index) if not index.isValid(): return item = index.internalPointer() self.updateRects(option, index) colors = outlineItemColors(item) style = qApp.style() def _rotate(angle, rect=self.mainRect): p.translate(rect.center()) p.rotate(angle) p.translate(-rect.center()) def drawRect(r): p.save() p.setBrush(Qt.gray) p.drawRect(r) p.restore() # Draw background cg = QPalette.ColorGroup(QPalette.Normal if option.state & QStyle.State_Enabled else QPalette.Disabled) if cg == QPalette.Normal and not option.state & QStyle.State_Active: cg = QPalette.Inactive # Selection if option.state & QStyle.State_Selected: p.save() p.setBrush(option.palette.brush(cg, QPalette.Highlight)) p.setPen(Qt.NoPen) #p.drawRoundedRect(option.rect, 12, 12) p.drawRect(option.rect) p.restore() # Background p.save() if settings.viewSettings["Cork"]["Background"] != "Nothing": c = colors[settings.viewSettings["Cork"]["Background"]] if c == QColor(Qt.transparent): c = QColor(Qt.white) col = mixColors(c, QColor(Qt.white), .2) backgroundColor = col p.setBrush(col) else: p.setBrush(Qt.white) backgroundColor = QColor(Qt.white) # Cache background color self.bgColors[index] = backgroundColor.name() p.setPen(Qt.NoPen) p.drawRect(self.cardRect) if item.isFolder(): itemPoly = QPolygonF([ self.topRect.topLeft(), self.topRect.topLeft() + QPoint(self.topRect.width() * .35, 0), self.cardRect.topLeft() + QPoint(self.topRect.width() * .45, 0), self.cardRect.topRight(), self.cardRect.bottomRight(), self.cardRect.bottomLeft() ]) p.drawPolygon(itemPoly) p.restore() # Label color if settings.viewSettings["Cork"]["Corner"] != "Nothing": p.save() color = colors[settings.viewSettings["Cork"]["Corner"]] p.setPen(Qt.NoPen) p.setBrush(color) p.drawRect(self.labelRect) w = self.labelRect.width() poly = QPolygonF([ self.labelRect.bottomLeft() + QPointF(0, 1), self.labelRect.bottomLeft() + QPointF(0, w / 2), self.labelRect.bottomLeft() + QPointF(w / 2, 1), self.labelRect.bottomRight() + QPointF(1, w / 2), self.labelRect.bottomRight() + QPointF(1, 1), ]) p.drawPolygon(poly) p.restore() if settings.viewSettings["Cork"]["Corner"] == "Nothing" or \ color == Qt.transparent: # No corner, so title can be full width self.titleRect.setRight(self.mainRect.right()) # Draw the icon iconRect = self.iconRect mode = QIcon.Normal if not option.state & style.State_Enabled: mode = QIcon.Disabled elif option.state & style.State_Selected: mode = QIcon.Selected # index.data(Qt.DecorationRole).paint(p, iconRect, option.decorationAlignment, mode) icon = index.data(Qt.DecorationRole).pixmap(iconRect.size()) if settings.viewSettings["Cork"]["Icon"] != "Nothing": color = colors[settings.viewSettings["Cork"]["Icon"]] colorifyPixmap(icon, color) QIcon(icon).paint(p, iconRect, option.decorationAlignment, mode) # Draw title p.save() text = index.data() if text: p.setPen(Qt.black) textColor = QColor(Qt.black) if settings.viewSettings["Cork"]["Text"] != "Nothing": col = colors[settings.viewSettings["Cork"]["Text"]] if col == Qt.transparent: col = Qt.black # If title setting is compile, we have to hack the color # Or we won't see anything in some themes if settings.viewSettings["Cork"]["Text"] == "Compile": if item.compile() in [0, "0"]: col = mixColors(QColor(Qt.black), backgroundColor) else: col = Qt.black textColor = col p.setPen(col) f = QFont(option.font) f.setPointSize(f.pointSize() + 4) f.setBold(True) p.setFont(f) fm = QFontMetrics(f) elidedText = fm.elidedText(text, Qt.ElideRight, self.titleRect.width()) p.drawText(self.titleRect, Qt.AlignLeft | Qt.AlignVCenter, elidedText) p.restore() # One line summary background lineSummary = item.data(Outline.summarySentence) fullSummary = item.data(Outline.summaryFull) # Border if settings.viewSettings["Cork"]["Border"] != "Nothing": p.save() p.setBrush(Qt.NoBrush) pen = p.pen() pen.setWidth(2) col = colors[settings.viewSettings["Cork"]["Border"]] pen.setColor(col) p.setPen(pen) if item.isFolder(): p.drawPolygon(itemPoly) else: p.drawRect(self.cardRect) p.restore() # Draw status status = item.data(Outline.status) if status: it = mainWindow().mdlStatus.item(int(status), 0) if it != None: p.save() p.setClipRegion(QRegion(self.cardRect)) f = p.font() f.setPointSize(f.pointSize() + 12) f.setBold(True) p.setFont(f) p.setPen(QColor(Qt.red).lighter(170)) _rotate(-35, rect=self.cardRect) p.drawText(self.cardRect, Qt.AlignCenter, it.text()) p.restore() # Draw Summary # One line if lineSummary: p.save() f = QFont(option.font) f.setBold(True) p.setFont(f) p.setPen(textColor) fm = QFontMetrics(f) elidedText = fm.elidedText(lineSummary, Qt.ElideRight, self.mainLineRect.width()) p.drawText(self.mainLineRect, Qt.AlignLeft | Qt.AlignVCenter, elidedText) p.restore() # Full summary if fullSummary: p.save() p.setFont(option.font) p.setPen(textColor) p.drawText(self.mainTextRect, Qt.TextWordWrap, fullSummary) p.restore() def paint_v1(self, p, option, index): # QStyledItemDelegate.paint(self, p, option, index) if not index.isValid(): return item = index.internalPointer() self.updateRects(option, index) colors = outlineItemColors(item) style = qApp.style() def _rotate(angle): p.translate(self.mainRect.center()) p.rotate(angle) p.translate(-self.mainRect.center()) # Draw background cg = QPalette.ColorGroup(QPalette.Normal if option.state & QStyle.State_Enabled else QPalette.Disabled) if cg == QPalette.Normal and not option.state & QStyle.State_Active: cg = QPalette.Inactive # Selection if option.state & QStyle.State_Selected: p.save() p.setBrush(option.palette.brush(cg, QPalette.Highlight)) p.setPen(Qt.NoPen) p.drawRoundedRect(option.rect, 12, 12) p.restore() # Stack if item.isFolder() and item.childCount() > 0: p.save() p.setBrush(Qt.white) for i in reversed(range(3)): p.drawRoundedRect(self.itemRect.adjusted(2 * i, 2 * i, -2 * i, 2 * i), 10, 10) p.restore() # Background itemRect = self.itemRect p.save() if settings.viewSettings["Cork"]["Background"] != "Nothing": c = colors[settings.viewSettings["Cork"]["Background"]] col = mixColors(c, QColor(Qt.white), .2) p.setBrush(col) else: p.setBrush(Qt.white) pen = p.pen() pen.setWidth(2) p.setPen(pen) p.drawRoundedRect(itemRect, 10, 10) p.restore() # Title bar topRect = self.topRect p.save() if item.isFolder(): color = QColor(Qt.darkGreen) else: color = QColor(Qt.blue).lighter(175) p.setPen(Qt.NoPen) p.setBrush(color) p.setClipRegion(QRegion(topRect)) p.drawRoundedRect(itemRect, 10, 10) # p.drawRect(topRect) p.restore() # Label color if settings.viewSettings["Cork"]["Corner"] != "Nothing": p.save() color = colors[settings.viewSettings["Cork"]["Corner"]] p.setPen(Qt.NoPen) p.setBrush(color) p.setClipRegion(QRegion(self.labelRect)) p.drawRoundedRect(itemRect, 10, 10) # p.drawRect(topRect) p.restore() if color != Qt.transparent: p.drawLine(self.labelRect.topLeft(), self.labelRect.bottomLeft()) # One line summary background lineSummary = item.data(Outline.summarySentence) fullSummary = item.data(Outline.summaryFull) if lineSummary or not fullSummary: m = self.margin r = self.mainLineRect.adjusted(-m, -m, m, m / 2) p.save() p.setPen(Qt.NoPen) p.setBrush(QColor("#EEE")) p.drawRect(r) p.restore() # Border p.save() p.setBrush(Qt.NoBrush) pen = p.pen() pen.setWidth(2) if settings.viewSettings["Cork"]["Border"] != "Nothing": col = colors[settings.viewSettings["Cork"]["Border"]] if col == Qt.transparent: col = Qt.black pen.setColor(col) p.setPen(pen) p.drawRoundedRect(itemRect, 10, 10) p.restore() # Draw the icon iconRect = self.iconRect mode = QIcon.Normal if not option.state & style.State_Enabled: mode = QIcon.Disabled elif option.state & style.State_Selected: mode = QIcon.Selected # index.data(Qt.DecorationRole).paint(p, iconRect, option.decorationAlignment, mode) icon = index.data(Qt.DecorationRole).pixmap(iconRect.size()) if settings.viewSettings["Cork"]["Icon"] != "Nothing": color = colors[settings.viewSettings["Cork"]["Icon"]] colorifyPixmap(icon, color) QIcon(icon).paint(p, iconRect, option.decorationAlignment, mode) # Draw title p.save() text = index.data() titleRect = self.titleRect if text: if settings.viewSettings["Cork"]["Text"] != "Nothing": col = colors[settings.viewSettings["Cork"]["Text"]] if col == Qt.transparent: col = Qt.black p.setPen(col) f = QFont(option.font) # f.setPointSize(f.pointSize() + 1) f.setBold(True) p.setFont(f) fm = QFontMetrics(f) elidedText = fm.elidedText(text, Qt.ElideRight, titleRect.width()) p.drawText(titleRect, Qt.AlignCenter, elidedText) p.restore() # Draw the line bottomRect = self.bottomRect p.save() # p.drawLine(itemRect.x(), iconRect.bottom() + margin, # itemRect.right(), iconRect.bottom() + margin) p.drawLine(bottomRect.topLeft(), bottomRect.topRight()) p.restore() # Lines if True: p.save() p.setPen(QColor("#EEE")) fm = QFontMetrics(option.font) h = fm.lineSpacing() l = self.mainTextRect.topLeft() + QPoint(0, h) while self.mainTextRect.contains(l): p.drawLine(l, QPoint(self.mainTextRect.right(), l.y())) l.setY(l.y() + h) p.restore() # Draw status mainRect = self.mainRect status = item.data(Outline.status) if status: it = mainWindow().mdlStatus.item(int(status), 0) if it != None: p.save() p.setClipRegion(QRegion(mainRect)) f = p.font() f.setPointSize(f.pointSize() + 12) f.setBold(True) p.setFont(f) p.setPen(QColor(Qt.red).lighter(175)) _rotate(-35) p.drawText(mainRect, Qt.AlignCenter, it.text()) p.restore() # Draw Summary # One line if lineSummary: p.save() f = QFont(option.font) f.setItalic(True) p.setFont(f) fm = QFontMetrics(f) elidedText = fm.elidedText(lineSummary, Qt.ElideRight, self.mainLineRect.width()) p.drawText(self.mainLineRect, Qt.AlignCenter, elidedText) p.restore() # Full summary if fullSummary: p.setFont(option.font) p.drawText(self.mainTextRect, Qt.TextWordWrap, fullSummary) # Debug # for r in [self.itemRect, self.iconRect, self.titleRect, self.bottomRect, self.mainLineRect, self.mainTextRect]: # p.drawRect(r) manuskript-0.10.0/manuskript/ui/views/corkView.py000066400000000000000000000037561354442177200221230ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtWidgets import QListView from manuskript import settings from manuskript.functions import findBackground from manuskript.ui.views.corkDelegate import corkDelegate from manuskript.ui.views.dndView import dndView from manuskript.ui.views.outlineBasics import outlineBasics class corkView(QListView, dndView, outlineBasics): def __init__(self, parent=None): QListView.__init__(self, parent) dndView.__init__(self, parent) outlineBasics.__init__(self, parent) self.setResizeMode(QListView.Adjust) self.setWrapping(True) self.setItemDelegate(corkDelegate()) self.setSpacing(5) self.setVerticalScrollMode(self.ScrollPerPixel) self.setFlow(self.LeftToRight) self.setSelectionBehavior(self.SelectRows) self.updateBackground() def updateBackground(self): if settings.corkBackground["image"] != "": img = findBackground(settings.corkBackground["image"]) else: # No background image img = "" self.setStyleSheet("""QListView {{ background:{color}; background-image: url({url}); background-attachment: fixed; }}""".format( color=settings.corkBackground["color"], url=img.replace("\\", "/") )) def dragMoveEvent(self, event): dndView.dragMoveEvent(self, event) QListView.dragMoveEvent(self, event) def mouseReleaseEvent(self, event): QListView.mouseReleaseEvent(self, event) outlineBasics.mouseReleaseEvent(self, event) def mouseDoubleClickEvent(self, event): if self.selectedIndexes() == []: idx = self.rootIndex() parent = idx.parent() from manuskript.functions import MW MW.openIndex(parent) #self.setRootIndex(parent) else: r = QListView.mouseDoubleClickEvent(self, event) manuskript-0.10.0/manuskript/ui/views/dndView.py000066400000000000000000000012471354442177200217230ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QAbstractItemView class dndView(QAbstractItemView): def __init__(self, parent=None): # QAbstractItemView.__init__(self, parent) self.setDragDropMode(self.DragDrop) self.setDefaultDropAction(Qt.MoveAction) self.setSelectionMode(self.ExtendedSelection) def dragMoveEvent(self, event): # return QAbstractItemView.dragMoveEvent(self, event) # print(a) if event.keyboardModifiers() & Qt.ControlModifier: event.setDropAction(Qt.CopyAction) else: event.setDropAction(Qt.MoveAction) manuskript-0.10.0/manuskript/ui/views/lineEditView.py000066400000000000000000000067021354442177200227140ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtWidgets import QLineEdit from manuskript.enums import Outline from manuskript.functions import toString class lineEditView(QLineEdit): def __init__(self, parent=None): QLineEdit.__init__(self, parent) self._column = Outline.title self._indexes = None self._index = None self._placeholderText = None self._updating = False def setModel(self, model): self._model = model self._model.dataChanged.connect(self.update) def setColumn(self, col): self._column = col def setCurrentModelIndex(self, index): self._indexes = None if index.isValid(): if index.column() != self._column: index = index.sibling(index.row(), self._column) self._index = index self._model = index.model() # self.item = index.internalPointer() if self._placeholderText is not None: self.setPlaceholderText(self._placeholderText) self.textEdited.connect(self.submit) self.updateText() def setCurrentModelIndexes(self, indexes): self._indexes = [] self._index = None for i in indexes: if i.isValid(): if i.column() != self._column: i = i.sibling(i.row(), self._column) self._indexes.append(i) self.textEdited.connect(self.submit) self.updateText() def submit(self): if self._index: # item = self._index.internalPointer() if self.text() != self._model.data(self._index): self._model.setData(self._index, self.text()) elif self._indexes: self._updating = True for i in self._indexes: # item = i.internalPointer() if self.text() != self._model.data(i): self._model.setData(i, self.text()) self._updating = False def update(self, topLeft, bottomRight): if self._updating: # We are currently putting data in the model, so no updates return if self._index: if topLeft.row() <= self._index.row() <= bottomRight.row(): self.updateText() elif self._indexes: update = False for i in self._indexes: if topLeft.row() <= i.row() <= bottomRight.row(): update = True if update: self.updateText() def updateText(self): if self._index: # item = self._index.internalPointer() # txt = toString(item.data(self._column)) txt = toString(self._model.data(self._index)) if self.text() != txt: self.setText(txt) elif self._indexes: t = [] same = True for i in self._indexes: # item = i.internalPointer() # t.append(toString(item.data(self._column))) t.append(toString(self._model.data(i))) for t2 in t[1:]: if t2 != t[0]: same = False break if same: self.setText(t[0]) else: self.setText("") if not self._placeholderText: self._placeholderText = self.placeholderText() self.setPlaceholderText(self.tr("Various")) manuskript-0.10.0/manuskript/ui/views/metadataView.py000066400000000000000000000111701354442177200227320ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtWidgets import QWidget, QAbstractItemView from PyQt5.QtCore import QModelIndex from manuskript.enums import Outline from manuskript.ui.views.metadataView_ui import Ui_metadataView from manuskript.ui import style class metadataView(QWidget, Ui_metadataView): def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) self._lastIndexes = None self.txtSummarySentence.setColumn(Outline.summarySentence) self.txtSummaryFull.setColumn(Outline.summaryFull) self.txtNotes.setColumn(Outline.notes) self.revisions.setEnabled(False) self.txtSummarySentence.setStyleSheet(style.lineEditSS()) self.txtSummaryFull.setStyleSheet(style.transparentSS() + style.simpleScrollBarV()) self.txtNotes.setStyleSheet(style.transparentSS() + style.simpleScrollBarV()) self.revisions.setStyleSheet(style.simpleScrollBarV()) def setModels(self, mdlOutline, mdlCharacter, mdlLabels, mdlStatus): self.properties.setModels(mdlOutline, mdlCharacter, mdlLabels, mdlStatus) self.txtSummarySentence.setModel(mdlOutline) self.txtSummaryFull.setModel(mdlOutline) self.txtNotes.setModel(mdlOutline) self.revisions.setModel(mdlOutline) def getIndexes(self, sourceView): """Returns a list of indexes from list of QItemSelectionRange""" indexes = [] for i in sourceView.selection().indexes(): if i.column() != 0: continue if i not in indexes: indexes.append(i) return indexes def selectionChanged(self): if isinstance(self.sender(), QAbstractItemView): selectionModel = self.sender().selectionModel() else: selectionModel = self.sender() indexes = self.getIndexes(selectionModel) if self._lastIndexes == indexes: return # No item selected if len(indexes) == 0: self.setEnabled(False) self.revisions.setEnabled(False) self.txtSummarySentence.setCurrentModelIndex(QModelIndex()) self.txtSummaryFull.setCurrentModelIndex(QModelIndex()) self.txtNotes.setCurrentModelIndex(QModelIndex()) # One item selected elif len(indexes) == 1: self.setEnabled(True) idx = indexes[0] self.txtSummarySentence.setEnabled(True) self.txtSummaryFull.setEnabled(True) self.txtNotes.setEnabled(True) self.txtSummarySentence.setCurrentModelIndex(idx) self.txtSummaryFull.setCurrentModelIndex(idx) self.txtNotes.setCurrentModelIndex(idx) self.revisions.setEnabled(True) self.revisions.setCurrentModelIndex(idx) # Multiple items selected else: self.setEnabled(True) # Behavior 1: # We disable the text areas when multiple indexes are selected self.txtSummarySentence.setEnabled(False) self.txtSummaryFull.setEnabled(False) self.txtNotes.setEnabled(False) self.txtSummarySentence.setCurrentModelIndex(QModelIndex()) self.txtSummaryFull.setCurrentModelIndex(QModelIndex()) self.txtNotes.setCurrentModelIndex(QModelIndex()) # Behavior 2: # Allow edition of multiple indexes. # Bug: Multiple selections of items sometimes gets Notes/references # field to be erased. See #10 on github. #self.txtSummarySentence.setCurrentModelIndexes(indexes) #self.txtSummaryFull.setCurrentModelIndexes(indexes) #self.txtNotes.setCurrentModelIndexes(indexes) self.revisions.setEnabled(False) self.properties.selectionChanged(selectionModel) self._lastIndexes = indexes def setDict(self, d): self.txtNotes.setDict(d) self.txtSummaryFull.setDict(d) def toggleSpellcheck(self, v): self.txtNotes.toggleSpellcheck(v) self.txtSummaryFull.toggleSpellcheck(v) def saveState(self): return [ self.grpProperties.saveState(), self.grpSummary.saveState(), self.grpNotes.saveState(), self.grpRevisions.saveState(), self.revisions.saveState() ] def restoreState(self, state): self.grpProperties.restoreState(state[0]) self.grpSummary.restoreState(state[1]) self.grpNotes.restoreState(state[2]) self.grpRevisions.restoreState(state[3]) manuskript-0.10.0/manuskript/ui/views/metadataView_ui.py000066400000000000000000000131001354442177200234220ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'manuskript/ui/views/metadataView_ui.ui' # # Created by: PyQt5 UI code generator 5.5.1 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_metadataView(object): def setupUi(self, metadataView): metadataView.setObjectName("metadataView") metadataView.resize(400, 537) self.verticalLayout = QtWidgets.QVBoxLayout(metadataView) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setSpacing(0) self.verticalLayout.setObjectName("verticalLayout") self.grpProperties = collapsibleGroupBox2(metadataView) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.grpProperties.sizePolicy().hasHeightForWidth()) self.grpProperties.setSizePolicy(sizePolicy) self.grpProperties.setFlat(True) self.grpProperties.setCheckable(True) self.grpProperties.setObjectName("grpProperties") self.verticalLayout_28 = QtWidgets.QVBoxLayout(self.grpProperties) self.verticalLayout_28.setContentsMargins(0, 0, 0, 0) self.verticalLayout_28.setSpacing(0) self.verticalLayout_28.setObjectName("verticalLayout_28") self.properties = propertiesView(self.grpProperties) self.properties.setMinimumSize(QtCore.QSize(0, 50)) self.properties.setObjectName("properties") self.verticalLayout_28.addWidget(self.properties) self.verticalLayout.addWidget(self.grpProperties) self.grpSummary = collapsibleGroupBox2(metadataView) self.grpSummary.setFlat(True) self.grpSummary.setCheckable(True) self.grpSummary.setObjectName("grpSummary") self.verticalLayout_22 = QtWidgets.QVBoxLayout(self.grpSummary) self.verticalLayout_22.setContentsMargins(0, 0, 0, 0) self.verticalLayout_22.setSpacing(0) self.verticalLayout_22.setObjectName("verticalLayout_22") self.txtSummarySentence = lineEditView(self.grpSummary) self.txtSummarySentence.setInputMask("") self.txtSummarySentence.setFrame(False) self.txtSummarySentence.setObjectName("txtSummarySentence") self.verticalLayout_22.addWidget(self.txtSummarySentence) self.line = QtWidgets.QFrame(self.grpSummary) self.line.setFrameShadow(QtWidgets.QFrame.Plain) self.line.setLineWidth(0) self.line.setMidLineWidth(0) self.line.setFrameShape(QtWidgets.QFrame.HLine) self.line.setObjectName("line") self.verticalLayout_22.addWidget(self.line) self.txtSummaryFull = MDEditCompleter(self.grpSummary) self.txtSummaryFull.setFrameShape(QtWidgets.QFrame.NoFrame) self.txtSummaryFull.setObjectName("txtSummaryFull") self.verticalLayout_22.addWidget(self.txtSummaryFull) self.verticalLayout.addWidget(self.grpSummary) self.grpNotes = collapsibleGroupBox2(metadataView) self.grpNotes.setFlat(True) self.grpNotes.setCheckable(True) self.grpNotes.setObjectName("grpNotes") self.horizontalLayout_29 = QtWidgets.QHBoxLayout(self.grpNotes) self.horizontalLayout_29.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_29.setSpacing(0) self.horizontalLayout_29.setObjectName("horizontalLayout_29") self.txtNotes = MDEditCompleter(self.grpNotes) self.txtNotes.setFrameShape(QtWidgets.QFrame.NoFrame) self.txtNotes.setObjectName("txtNotes") self.horizontalLayout_29.addWidget(self.txtNotes) self.verticalLayout.addWidget(self.grpNotes) self.grpRevisions = collapsibleGroupBox2(metadataView) self.grpRevisions.setFlat(True) self.grpRevisions.setCheckable(True) self.grpRevisions.setObjectName("grpRevisions") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.grpRevisions) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setSpacing(0) self.verticalLayout_2.setObjectName("verticalLayout_2") self.revisions = revisions(self.grpRevisions) self.revisions.setMinimumSize(QtCore.QSize(0, 50)) self.revisions.setObjectName("revisions") self.verticalLayout_2.addWidget(self.revisions) self.verticalLayout.addWidget(self.grpRevisions) self.retranslateUi(metadataView) QtCore.QMetaObject.connectSlotsByName(metadataView) def retranslateUi(self, metadataView): _translate = QtCore.QCoreApplication.translate metadataView.setWindowTitle(_translate("metadataView", "Form")) self.grpProperties.setTitle(_translate("metadataView", "Properties")) self.grpSummary.setTitle(_translate("metadataView", "Summary")) self.txtSummarySentence.setPlaceholderText(_translate("metadataView", "One line summary")) self.txtSummaryFull.setPlaceholderText(_translate("metadataView", "Full summary")) self.grpNotes.setTitle(_translate("metadataView", "Notes / References")) self.txtNotes.setPlaceholderText(_translate("metadataView", "Notes / References")) self.grpRevisions.setTitle(_translate("metadataView", "Revisions")) from manuskript.ui.collapsibleGroupBox2 import collapsibleGroupBox2 from manuskript.ui.revisions import revisions from manuskript.ui.views.MDEditCompleter import MDEditCompleter from manuskript.ui.views.lineEditView import lineEditView from manuskript.ui.views.propertiesView import propertiesView manuskript-0.10.0/manuskript/ui/views/metadataView_ui.ui000066400000000000000000000155011354442177200234160ustar00rootroot00000000000000 metadataView 0 0 400 537 Form 0 0 0 0 0 0 0 Properties true true 0 0 0 0 0 0 50 Summary true true 0 0 0 0 0 false One line summary QFrame::Plain 0 0 Qt::Horizontal QFrame::NoFrame Full summary Notes / References true true 0 0 0 0 0 QFrame::NoFrame Notes / References Revisions true true 0 0 0 0 0 0 50 MDEditCompleter QTextEdit
    manuskript.ui.views.MDEditCompleter.h
    lineEditView QLineEdit
    manuskript.ui.views.lineEditView.h
    collapsibleGroupBox2 QGroupBox
    manuskript.ui.collapsibleGroupBox2.h
    1
    propertiesView QWidget
    manuskript.ui.views.propertiesView.h
    1
    revisions QWidget
    manuskript.ui.revisions.h
    1
    manuskript-0.10.0/manuskript/ui/views/outlineBasics.py000066400000000000000000000404711354442177200231310ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import Qt, QSignalMapper, QSize from PyQt5.QtGui import QIcon, QCursor from PyQt5.QtWidgets import QAbstractItemView, qApp, QMenu, QAction, \ QListWidget, QWidgetAction, QListWidgetItem, \ QLineEdit, QInputDialog, QMessageBox, QCheckBox from manuskript import settings from manuskript.enums import Outline from manuskript.functions import mainWindow, statusMessage from manuskript.functions import toInt, customIcons from manuskript.models import outlineItem from manuskript.ui.tools.splitDialog import splitDialog class outlineBasics(QAbstractItemView): def __init__(self, parent=None): self._indexesToOpen = None self.menuCustomIcons = None def getSelection(self): sel = [] for i in self.selectedIndexes(): if i.column() != 0: continue if not i in sel: sel.append(i) return sel def mouseReleaseEvent(self, event): if event.button() == Qt.RightButton: self.menu = self.makePopupMenu() self.menu.popup(event.globalPos()) # We don't call QAbstractItemView.mouseReleaseEvent because # outlineBasics is never subclassed alone. So the others views # (outlineView, corkView, treeView) that subclass outlineBasics # call their respective mother class. def makePopupMenu(self): index = self.currentIndex() sel = self.getSelection() clipboard = qApp.clipboard() menu = QMenu(self) # Get index under cursor pos = self.viewport().mapFromGlobal(QCursor.pos()) mouseIndex = self.indexAt(pos) # Get index's title if mouseIndex.isValid(): title = mouseIndex.internalPointer().title() elif self.rootIndex().parent().isValid(): # mouseIndex is the background of an item, so we check the parent mouseIndex = self.rootIndex().parent() title = mouseIndex.internalPointer().title() else: title = qApp.translate("outlineBasics", "Root") if len(title) > 25: title = title[:25] + "…" # Open Item action self.actOpen = QAction(QIcon.fromTheme("go-right"), qApp.translate("outlineBasics", "Open {}".format(title)), menu) self.actOpen.triggered.connect(self.openItem) menu.addAction(self.actOpen) # Open item(s) in new tab if mouseIndex in sel and len(sel) > 1: actionTitle = qApp.translate("outlineBasics", "Open {} items in new tabs").format(len(sel)) self._indexesToOpen = sel else: actionTitle = qApp.translate("outlineBasics", "Open {} in a new tab").format(title) self._indexesToOpen = [mouseIndex] self.actNewTab = QAction(QIcon.fromTheme("go-right"), actionTitle, menu) self.actNewTab.triggered.connect(self.openItemsInNewTabs) menu.addAction(self.actNewTab) menu.addSeparator() # Add text / folder self.actAddFolder = QAction(QIcon.fromTheme("folder-new"), qApp.translate("outlineBasics", "New &Folder"), menu) self.actAddFolder.triggered.connect(self.addFolder) menu.addAction(self.actAddFolder) self.actAddText = QAction(QIcon.fromTheme("document-new"), qApp.translate("outlineBasics", "New &Text"), menu) self.actAddText.triggered.connect(self.addText) menu.addAction(self.actAddText) menu.addSeparator() # Copy, cut, paste, duplicate self.actCut = QAction(QIcon.fromTheme("edit-cut"), qApp.translate("outlineBasics", "C&ut"), menu) self.actCut.triggered.connect(self.cut) menu.addAction(self.actCut) self.actCopy = QAction(QIcon.fromTheme("edit-copy"), qApp.translate("outlineBasics", "&Copy"), menu) self.actCopy.triggered.connect(self.copy) menu.addAction(self.actCopy) self.actPaste = QAction(QIcon.fromTheme("edit-paste"), qApp.translate("outlineBasics", "&Paste"), menu) self.actPaste.triggered.connect(self.paste) menu.addAction(self.actPaste) # Rename / duplicate / remove items self.actDelete = QAction(QIcon.fromTheme("edit-delete"), qApp.translate("outlineBasics", "&Delete"), menu) self.actDelete.triggered.connect(self.delete) menu.addAction(self.actDelete) self.actRename = QAction(QIcon.fromTheme("edit-rename"), qApp.translate("outlineBasics", "&Rename"), menu) self.actRename.triggered.connect(self.rename) menu.addAction(self.actRename) menu.addSeparator() # POV self.menuPOV = QMenu(qApp.translate("outlineBasics", "Set POV"), menu) mw = mainWindow() a = QAction(QIcon.fromTheme("dialog-no"), qApp.translate("outlineBasics", "None"), self.menuPOV) a.triggered.connect(lambda: self.setPOV("")) self.menuPOV.addAction(a) self.menuPOV.addSeparator() menus = [] for i in [qApp.translate("outlineBasics", "Main"), qApp.translate("outlineBasics", "Secondary"), qApp.translate("outlineBasics", "Minor")]: m = QMenu(i, self.menuPOV) menus.append(m) self.menuPOV.addMenu(m) mpr = QSignalMapper(self.menuPOV) for i in range(mw.mdlCharacter.rowCount()): a = QAction(mw.mdlCharacter.icon(i), mw.mdlCharacter.name(i), self.menuPOV) a.triggered.connect(mpr.map) mpr.setMapping(a, int(mw.mdlCharacter.ID(i))) imp = toInt(mw.mdlCharacter.importance(i)) menus[2 - imp].addAction(a) mpr.mapped.connect(self.setPOV) menu.addMenu(self.menuPOV) # Status self.menuStatus = QMenu(qApp.translate("outlineBasics", "Set Status"), menu) # a = QAction(QIcon.fromTheme("dialog-no"), qApp.translate("outlineBasics", "None"), self.menuStatus) # a.triggered.connect(lambda: self.setStatus("")) # self.menuStatus.addAction(a) # self.menuStatus.addSeparator() mpr = QSignalMapper(self.menuStatus) for i in range(mw.mdlStatus.rowCount()): a = QAction(mw.mdlStatus.item(i, 0).text(), self.menuStatus) a.triggered.connect(mpr.map) mpr.setMapping(a, i) self.menuStatus.addAction(a) mpr.mapped.connect(self.setStatus) menu.addMenu(self.menuStatus) # Labels self.menuLabel = QMenu(qApp.translate("outlineBasics", "Set Label"), menu) mpr = QSignalMapper(self.menuLabel) for i in range(mw.mdlLabels.rowCount()): a = QAction(mw.mdlLabels.item(i, 0).icon(), mw.mdlLabels.item(i, 0).text(), self.menuLabel) a.triggered.connect(mpr.map) mpr.setMapping(a, i) self.menuLabel.addAction(a) mpr.mapped.connect(self.setLabel) menu.addMenu(self.menuLabel) menu.addSeparator() # Custom icons if self.menuCustomIcons: menu.addMenu(self.menuCustomIcons) else: self.menuCustomIcons = QMenu(qApp.translate("outlineBasics", "Set Custom Icon"), menu) a = QAction(qApp.translate("outlineBasics", "Restore to default"), self.menuCustomIcons) a.triggered.connect(lambda: self.setCustomIcon("")) self.menuCustomIcons.addAction(a) self.menuCustomIcons.addSeparator() txt = QLineEdit() txt.textChanged.connect(self.filterLstIcons) txt.setPlaceholderText("Filter icons") txt.setStyleSheet("QLineEdit { background: transparent; border: none; }") act = QWidgetAction(self.menuCustomIcons) act.setDefaultWidget(txt) self.menuCustomIcons.addAction(act) self.lstIcons = QListWidget() for i in customIcons(): item = QListWidgetItem() item.setIcon(QIcon.fromTheme(i)) item.setData(Qt.UserRole, i) item.setToolTip(i) self.lstIcons.addItem(item) self.lstIcons.itemClicked.connect(self.setCustomIconFromItem) self.lstIcons.setViewMode(self.lstIcons.IconMode) self.lstIcons.setUniformItemSizes(True) self.lstIcons.setResizeMode(self.lstIcons.Adjust) self.lstIcons.setMovement(self.lstIcons.Static) self.lstIcons.setStyleSheet("background: transparent; background: none;") self.filterLstIcons("") act = QWidgetAction(self.menuCustomIcons) act.setDefaultWidget(self.lstIcons) self.menuCustomIcons.addAction(act) menu.addMenu(self.menuCustomIcons) # Disabling stuff if not clipboard.mimeData().hasFormat("application/xml"): self.actPaste.setEnabled(False) if len(sel) == 0: self.actCopy.setEnabled(False) self.actCut.setEnabled(False) self.actRename.setEnabled(False) self.actDelete.setEnabled(False) self.menuPOV.setEnabled(False) self.menuStatus.setEnabled(False) self.menuLabel.setEnabled(False) self.menuCustomIcons.setEnabled(False) if len(sel) > 1: self.actRename.setEnabled(False) return menu def openItem(self): #idx = self.currentIndex() idx = self._indexesToOpen[0] from manuskript.functions import MW MW.openIndex(idx) def openItemsInNewTabs(self): from manuskript.functions import MW MW.openIndexes(self._indexesToOpen) def rename(self): if len(self.getSelection()) == 1: index = self.currentIndex() self.edit(index) elif len(self.getSelection()) > 1: # FIXME: add smart rename pass def addFolder(self): self.addItem("folder") def addText(self): self.addItem("text") def addItem(self, _type="folder"): if len(self.selectedIndexes()) == 0: parent = self.rootIndex() else: parent = self.currentIndex() if _type == "text": _type = settings.defaultTextType item = outlineItem(title=qApp.translate("outlineBasics", "New"), _type=_type) self.model().appendItem(item, parent) def copy(self): mimeData = self.model().mimeData(self.selectionModel().selectedIndexes()) qApp.clipboard().setMimeData(mimeData) def paste(self, mimeData=None): """ Paste item from mimeData to selected item. If mimeData is not given, it is taken from clipboard. If not item selected, paste into root. """ index = self.currentIndex() if len(self.getSelection()) == 0: index = self.rootIndex() if not mimeData: mimeData = qApp.clipboard().mimeData() self.model().dropMimeData(mimeData, Qt.CopyAction, -1, 0, index) def cut(self): self.copy() self.delete() def delete(self): """ Shows a warning, and then deletes currently selected indexes. """ if not settings.dontShowDeleteWarning: msg = QMessageBox(QMessageBox.Warning, qApp.translate("outlineBasics", "About to remove"), qApp.translate("outlineBasics", "

    You're about to delete {} item(s).

    Are you sure?

    " ).format(len(self.getSelection())), QMessageBox.Yes | QMessageBox.Cancel) chk = QCheckBox("&Don't show this warning in the future.") msg.setCheckBox(chk) ret = msg.exec() if ret == QMessageBox.Cancel: return if chk.isChecked(): settings.dontShowDeleteWarning = True self.model().removeIndexes(self.getSelection()) def duplicate(self): """ Duplicates item(s), while preserving clipboard content. """ mimeData = self.model().mimeData(self.selectionModel().selectedIndexes()) self.paste(mimeData) def move(self, delta=1): """ Move selected items up or down. """ # we store selected indexes currentID = self.model().ID(self.currentIndex()) selIDs = [self.model().ID(i) for i in self.selectedIndexes()] # Block signals self.blockSignals(True) self.selectionModel().blockSignals(True) # Move each index individually for idx in self.selectedIndexes(): self.moveIndex(idx, delta) # Done the hardcore way, so inform views self.model().layoutChanged.emit() # restore selection selIdx = [self.model().getIndexByID(ID) for ID in selIDs] sm = self.selectionModel() sm.clear() [sm.select(idx, sm.Select) for idx in selIdx] sm.setCurrentIndex(self.model().getIndexByID(currentID), sm.Select) #self.setSmsgBoxelectionModel(sm) # Unblock signals self.blockSignals(False) self.selectionModel().blockSignals(False) def moveIndex(self, index, delta=1): """ Move the item represented by index. +1 means down, -1 means up. """ if not index.isValid(): return if index.parent().isValid(): parentItem = index.parent().internalPointer() else: parentItem = index.model().rootItem parentItem.childItems.insert(index.row() + delta, parentItem.childItems.pop(index.row())) parentItem.updateWordCount() def moveUp(self): self.move(-1) def moveDown(self): self.move(+1) def splitDialog(self): """ Opens a dialog to split selected items. Call context: if at least one index is selected. Folder or text. """ indexes = self.getSelection() if len(indexes) == 0: # No selection, we use parent indexes = [self.rootIndex()] splitDialog(self, indexes) def merge(self): """ Merges selected items together. Call context: Multiple selection, same parent. """ # Get selection indexes = self.getSelection() # Get items items = [i.internalPointer() for i in indexes if i.isValid()] # Remove folders items = [i for i in items if not i.isFolder()] # Check that we have at least 2 items if len(items) < 2: statusMessage(qApp.translate("outlineBasics", "Select at least two items. Folders are ignored."), importance=2) return # Check that all share the same parent p = items[0].parent() for i in items: if i.parent() != p: statusMessage(qApp.translate("outlineBasics", "All items must be on the same level (share the same parent)."), importance=2) return # Sort items by row items = sorted(items, key=lambda i: i.row()) items[0].mergeWith(items[1:]) def setPOV(self, POV): for i in self.getSelection(): self.model().setData(i.sibling(i.row(), Outline.POV), str(POV)) def setStatus(self, status): for i in self.getSelection(): self.model().setData(i.sibling(i.row(), Outline.status), str(status)) def setLabel(self, label): for i in self.getSelection(): self.model().setData(i.sibling(i.row(), Outline.label), str(label)) def setCustomIcon(self, customIcon): for i in self.getSelection(): item = i.internalPointer() item.setCustomIcon(customIcon) def setCustomIconFromItem(self, item): icon = item.data(Qt.UserRole) self.setCustomIcon(icon) self.menu.close() def filterLstIcons(self, text): for l in self.lstIcons.findItems("", Qt.MatchContains): l.setHidden(not text in l.data(Qt.UserRole)) manuskript-0.10.0/manuskript/ui/views/outlineDelegates.py000066400000000000000000000317231354442177200236220ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import Qt, QSize, QModelIndex from PyQt5.QtGui import QColor, QPalette, QIcon, QFont, QFontMetrics, QBrush from PyQt5.QtWidgets import QStyledItemDelegate, QStyleOptionViewItem, QStyle, QComboBox, QStyleOptionComboBox from PyQt5.QtWidgets import qApp from manuskript import settings from manuskript.enums import Character, Outline from manuskript.functions import outlineItemColors, mixColors, colorifyPixmap, toInt, toFloat, drawProgress from manuskript.ui import style as S class outlineTitleDelegate(QStyledItemDelegate): def __init__(self, parent=None): QStyledItemDelegate.__init__(self, parent) self._view = None def setView(self, view): self._view = view def paint(self, painter, option, index): item = index.internalPointer() colors = outlineItemColors(item) style = qApp.style() opt = QStyleOptionViewItem(option) self.initStyleOption(opt, index) iconRect = style.subElementRect(style.SE_ItemViewItemDecoration, opt) textRect = style.subElementRect(style.SE_ItemViewItemText, opt) # Background style.drawPrimitive(style.PE_PanelItemViewItem, opt, painter) if settings.viewSettings["Outline"]["Background"] != "Nothing" and not opt.state & QStyle.State_Selected: col = colors[settings.viewSettings["Outline"]["Background"]] if col != QColor(Qt.transparent): col2 = QColor(S.base) if opt.state & QStyle.State_Selected: col2 = opt.palette.brush(QPalette.Normal, QPalette.Highlight).color() col = mixColors(col, col2, .2) painter.save() painter.setBrush(col) painter.setPen(Qt.NoPen) rect = opt.rect if self._view: r2 = self._view.visualRect(index) rect = self._view.viewport().rect() rect.setLeft(r2.left()) rect.setTop(r2.top()) rect.setBottom(r2.bottom()) painter.drawRoundedRect(rect, 5, 5) painter.restore() # Icon mode = QIcon.Normal if not opt.state & QStyle.State_Enabled: mode = QIcon.Disabled elif opt.state & QStyle.State_Selected: mode = QIcon.Selected state = QIcon.On if opt.state & QStyle.State_Open else QIcon.Off icon = opt.icon.pixmap(iconRect.size(), mode=mode, state=state) if opt.icon and settings.viewSettings["Outline"]["Icon"] != "Nothing": color = colors[settings.viewSettings["Outline"]["Icon"]] colorifyPixmap(icon, color) opt.icon = QIcon(icon) opt.icon.paint(painter, iconRect, opt.decorationAlignment, mode, state) # Text if opt.text: painter.save() textColor = QColor(S.text) if option.state & QStyle.State_Selected: col = QColor(S.highlightedText) textColor = col painter.setPen(col) if settings.viewSettings["Outline"]["Text"] != "Nothing": col = colors[settings.viewSettings["Outline"]["Text"]] if col == Qt.transparent: col = textColor # If text color is Compile and item is selected, we have # to change the color if settings.viewSettings["Outline"]["Text"] == "Compile" and \ item.compile() in [0, "0"]: col = mixColors(textColor, QColor(S.window)) painter.setPen(col) f = QFont(opt.font) painter.setFont(f) fm = QFontMetrics(f) elidedText = fm.elidedText(opt.text, Qt.ElideRight, textRect.width()) painter.drawText(textRect, Qt.AlignLeft, elidedText) painter.restore() # QStyledItemDelegate.paint(self, painter, option, index) class outlineCharacterDelegate(QStyledItemDelegate): def __init__(self, mdlCharacter, parent=None): QStyledItemDelegate.__init__(self, parent) self.mdlCharacter = mdlCharacter def sizeHint(self, option, index): # s = QStyledItemDelegate.sizeHint(self, option, index) item = QModelIndex() character = self.mdlCharacter.getCharacterByID(index.data()) if character: item = character.index(Character.name) opt = QStyleOptionViewItem(option) self.initStyleOption(opt, item) s = QStyledItemDelegate.sizeHint(self, opt, item) if s.width() > 200: s.setWidth(200) elif s.width() < 100: s.setWidth(100) return s + QSize(18, 0) def createEditor(self, parent, option, index): item = index.internalPointer() # if item.isFolder(): # No POV for folders # return editor = QComboBox(parent) editor.setAutoFillBackground(True) editor.setFrame(False) return editor def setEditorData(self, editor, index): # editor.addItem("") editor.addItem(QIcon.fromTheme("dialog-no"), self.tr("None")) l = [self.tr("Main"), self.tr("Secondary"), self.tr("Minor")] for importance in range(3): editor.addItem(l[importance]) editor.setItemData(editor.count() - 1, QBrush(QColor(S.highlightedTextDark)), Qt.ForegroundRole) editor.setItemData(editor.count() - 1, QBrush(QColor(S.highlightLight)), Qt.BackgroundRole) item = editor.model().item(editor.count() - 1) item.setFlags(Qt.ItemIsEnabled) for i in range(self.mdlCharacter.rowCount()): imp = toInt(self.mdlCharacter.importance(i)) if not 2 - imp == importance: continue # try: editor.addItem(self.mdlCharacter.icon(i), self.mdlCharacter.name(i), self.mdlCharacter.ID(i)) editor.setItemData(editor.count() - 1, self.mdlCharacter.name(i), Qt.ToolTipRole) # except: # pass editor.setCurrentIndex(editor.findData(index.data())) editor.showPopup() def setModelData(self, editor, model, index): val = editor.currentData() model.setData(index, val) def paint(self, painter, option, index): ##option.rect.setWidth(option.rect.width() - 18) # QStyledItemDelegate.paint(self, painter, option, index) ##option.rect.setWidth(option.rect.width() + 18) itemIndex = QModelIndex() character = self.mdlCharacter.getCharacterByID(index.data()) if character: itemIndex = character.index(Character.name) opt = QStyleOptionViewItem(option) self.initStyleOption(opt, itemIndex) qApp.style().drawControl(QStyle.CE_ItemViewItem, opt, painter) # if index.isValid() and index.internalPointer().data(Outline.POV) not in ["", None]: if itemIndex.isValid() and self.mdlCharacter.data(itemIndex) not in ["", None]: opt = QStyleOptionComboBox() opt.rect = option.rect r = qApp.style().subControlRect(QStyle.CC_ComboBox, opt, QStyle.SC_ComboBoxArrow) option.rect = r qApp.style().drawPrimitive(QStyle.PE_IndicatorArrowDown, option, painter) class outlineCompileDelegate(QStyledItemDelegate): def __init__(self, parent=None): QStyledItemDelegate.__init__(self, parent) def displayText(self, value, locale): return "" #def createEditor(self, parent, option, index): #return None class outlineGoalPercentageDelegate(QStyledItemDelegate): def __init__(self, rootIndex=None, parent=None): QStyledItemDelegate.__init__(self, parent) self.rootIndex = rootIndex def sizeHint(self, option, index): sh = QStyledItemDelegate.sizeHint(self, option, index) # if sh.width() > 50: sh.setWidth(100) return sh def paint(self, painter, option, index): if not index.isValid(): return QStyledItemDelegate.paint(self, painter, option, index) QStyledItemDelegate.paint(self, painter, option, index) item = index.internalPointer() if not item.data(Outline.goal): return p = toFloat(item.data(Outline.goalPercentage)) typ = item.data(Outline.type) level = item.level() if self.rootIndex and self.rootIndex.isValid(): level -= self.rootIndex.internalPointer().level() + 1 margin = 5 height = max(min(option.rect.height() - 2 * margin, 12) - 2 * level, 6) painter.save() rect = option.rect.adjusted(margin, margin, -margin, -margin) # Move rect.translate(level * rect.width() / 10, 0) rect.setWidth(rect.width() - level * rect.width() / 10) rect.setHeight(height) rect.setTop(option.rect.top() + (option.rect.height() - height) / 2) drawProgress(painter, rect, p) # from functions painter.restore() def displayText(self, value, locale): return "" class outlineStatusDelegate(QStyledItemDelegate): def __init__(self, mdlStatus, parent=None): QStyledItemDelegate.__init__(self, parent) self.mdlStatus = mdlStatus def sizeHint(self, option, index): s = QStyledItemDelegate.sizeHint(self, option, index) if s.width() > 150: s.setWidth(150) elif s.width() < 50: s.setWidth(50) return s + QSize(18, 0) def createEditor(self, parent, option, index): editor = QComboBox(parent) editor.setAutoFillBackground(True) editor.setFrame(False) return editor def setEditorData(self, editor, index): for i in range(self.mdlStatus.rowCount()): editor.addItem(self.mdlStatus.item(i, 0).text()) val = index.internalPointer().data(Outline.status) if not val: val = 0 editor.setCurrentIndex(int(val)) editor.showPopup() def setModelData(self, editor, model, index): val = editor.currentIndex() model.setData(index, val) def displayText(self, value, locale): try: return self.mdlStatus.item(int(value), 0).text() except: return "" def paint(self, painter, option, index): QStyledItemDelegate.paint(self, painter, option, index) if index.isValid() and index.internalPointer().data(Outline.status) not in ["", None, "0", 0]: opt = QStyleOptionComboBox() opt.rect = option.rect r = qApp.style().subControlRect(QStyle.CC_ComboBox, opt, QStyle.SC_ComboBoxArrow) option.rect = r qApp.style().drawPrimitive(QStyle.PE_IndicatorArrowDown, option, painter) class outlineLabelDelegate(QStyledItemDelegate): def __init__(self, mdlLabels, parent=None): QStyledItemDelegate.__init__(self, parent) self.mdlLabels = mdlLabels def sizeHint(self, option, index): d = index.internalPointer().data(index.column(), Qt.DisplayRole) if not d: d = 0 item = self.mdlLabels.item(int(d), 0) idx = self.mdlLabels.indexFromItem(item) opt = QStyleOptionViewItem(option) self.initStyleOption(opt, idx) s = qApp.style().sizeFromContents(QStyle.CT_ItemViewItem, opt, QSize()) if s.width() > 150: s.setWidth(150) elif s.width() < 50: s.setWidth(50) return s + QSize(18, 0) def createEditor(self, parent, option, index): item = index.internalPointer() editor = QComboBox(parent) # editor.setAutoFillBackground(True) editor.setFrame(False) return editor def setEditorData(self, editor, index): for i in range(self.mdlLabels.rowCount()): editor.addItem(self.mdlLabels.item(i, 0).icon(), self.mdlLabels.item(i, 0).text()) val = index.internalPointer().data(Outline.label) if not val: val = 0 editor.setCurrentIndex(int(val)) editor.showPopup() def setModelData(self, editor, model, index): val = editor.currentIndex() model.setData(index, val) def paint(self, painter, option, index): if not index.isValid(): return QStyledItemDelegate.paint(self, painter, option, index) else: item = index.internalPointer() d = item.data(index.column(), Qt.DisplayRole) if not d: d = 0 lbl = self.mdlLabels.item(int(d), 0) opt = QStyleOptionViewItem(option) self.initStyleOption(opt, self.mdlLabels.indexFromItem(lbl)) qApp.style().drawControl(QStyle.CE_ItemViewItem, opt, painter) # Drop down indicator if index.isValid() and index.internalPointer().data(Outline.label) not in ["", None, "0", 0]: opt = QStyleOptionComboBox() opt.rect = option.rect r = qApp.style().subControlRect(QStyle.CC_ComboBox, opt, QStyle.SC_ComboBoxArrow) option.rect = r qApp.style().drawPrimitive(QStyle.PE_IndicatorArrowDown, option, painter) manuskript-0.10.0/manuskript/ui/views/outlineView.py000066400000000000000000000077611354442177200226440ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtWidgets import QTreeView, QHeaderView from manuskript import settings from manuskript.enums import Outline from manuskript.ui.views.dndView import dndView from manuskript.ui.views.outlineBasics import outlineBasics from manuskript.ui.views.outlineDelegates import outlineTitleDelegate, outlineCharacterDelegate, outlineCompileDelegate, \ outlineStatusDelegate, outlineGoalPercentageDelegate, outlineLabelDelegate class outlineView(QTreeView, dndView, outlineBasics): def __init__(self, parent=None, modelCharacters=None, modelLabels=None, modelStatus=None): QTreeView.__init__(self, parent) dndView.__init__(self) outlineBasics.__init__(self, parent) self.modelCharacters = modelCharacters self.modelLabels = modelLabels self.modelStatus = modelStatus self.header().setStretchLastSection(False) def setModelCharacters(self, model): # This is used by outlineCharacterDelegate to select character self.modelCharacters = model def setModelLabels(self, model): # This is used by outlineLabelDelegate to display labels self.modelLabels = model def setModelStatus(self, model): # This is used by outlineStatusDelegate to display statuses self.modelStatus = model def setModel(self, model): QTreeView.setModel(self, model) # Setting delegates self.outlineTitleDelegate = outlineTitleDelegate(self) # self.outlineTitleDelegate.setView(self) self.setItemDelegateForColumn(Outline.title, self.outlineTitleDelegate) self.outlineCharacterDelegate = outlineCharacterDelegate(self.modelCharacters) self.setItemDelegateForColumn(Outline.POV, self.outlineCharacterDelegate) self.outlineCompileDelegate = outlineCompileDelegate() self.setItemDelegateForColumn(Outline.compile, self.outlineCompileDelegate) self.outlineStatusDelegate = outlineStatusDelegate(self.modelStatus) self.setItemDelegateForColumn(Outline.status, self.outlineStatusDelegate) self.outlineGoalPercentageDelegate = outlineGoalPercentageDelegate() self.setItemDelegateForColumn(Outline.goalPercentage, self.outlineGoalPercentageDelegate) self.outlineLabelDelegate = outlineLabelDelegate(self.modelLabels) self.setItemDelegateForColumn(Outline.label, self.outlineLabelDelegate) # Hiding columns self.hideColumns() self.header().setSectionResizeMode(Outline.title, QHeaderView.Stretch) self.header().setSectionResizeMode(Outline.POV, QHeaderView.ResizeToContents) self.header().setSectionResizeMode(Outline.status, QHeaderView.ResizeToContents) self.header().setSectionResizeMode(Outline.label, QHeaderView.ResizeToContents) self.header().setSectionResizeMode(Outline.compile, QHeaderView.ResizeToContents) self.header().setSectionResizeMode(Outline.wordCount, QHeaderView.ResizeToContents) self.header().setSectionResizeMode(Outline.goal, QHeaderView.ResizeToContents) self.header().setSectionResizeMode(Outline.goalPercentage, QHeaderView.ResizeToContents) def hideColumns(self): if not self.model(): # outlineView is probably not initialized, because editorWidgets shows index cards or text. return for c in range(self.model().columnCount()): self.hideColumn(c) for c in settings.outlineViewColumns: self.showColumn(c) def setRootIndex(self, index): QTreeView.setRootIndex(self, index) self.outlineGoalPercentageDelegate = outlineGoalPercentageDelegate(index) self.setItemDelegateForColumn(Outline.goalPercentage, self.outlineGoalPercentageDelegate) def dragMoveEvent(self, event): dndView.dragMoveEvent(self, event) QTreeView.dragMoveEvent(self, event) def mouseReleaseEvent(self, event): QTreeView.mouseReleaseEvent(self, event) outlineBasics.mouseReleaseEvent(self, event) manuskript-0.10.0/manuskript/ui/views/plotDelegate.py000066400000000000000000000064271354442177200227410ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import collections from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QStyledItemDelegate, QLineEdit, QMenu, QAction class plotDelegate(QStyledItemDelegate): def __init__(self, parent=None): QStyledItemDelegate.__init__(self, parent) def sizeHint(self, option, index): s = QStyledItemDelegate.sizeHint(self, option, index) if s.width() < 200: s.setWidth(200) return s def createEditor(self, parent, option, index): editor = QLineEdit(parent) editor.setFrame(False) editor.setAlignment(Qt.AlignRight | Qt.AlignVCenter) return editor def setEditorData(self, editor, index): editor.setText(index.model().data(index)) self.txt = editor self.menu = QMenu(editor) plotsTypes = collections.OrderedDict({ self.tr("General"): [ self.tr("Promise"), self.tr("Problem"), self.tr("Progress"), self.tr("Resolution") ], self.tr("Try / Fail"): [ self.tr("No and"), self.tr("Yes but"), ], self.tr("Freytag's pyramid"): [ self.tr("Exposition"), self.tr("Rising action"), self.tr("Climax"), self.tr("Falling action"), self.tr("Resolution"), ], self.tr("Three acts"): [ self.tr("1. Setup"), self.tr("1. Inciting event"), self.tr("1. Turning point"), "---", self.tr("2. Choice"), self.tr("2. Reversal"), self.tr("2. Disaster"), "---", self.tr("3. Stand up"), self.tr("3. Climax"), self.tr("3. Ending"), ], self.tr("Hero's journey"): [ self.tr("Ordinary world"), self.tr("Call to adventure"), self.tr("Refusal of the call"), self.tr("Meeting with mentor"), self.tr("Crossing the Threshold"), self.tr("Tests"), self.tr("Approach"), self.tr("Abyss"), self.tr("Reward / Revelation"), self.tr("Transformation"), self.tr("Atonement"), self.tr("Return"), ], }) for name in plotsTypes: m = QMenu(name, self.menu) for sub in plotsTypes[name]: if sub == "---": m.addSeparator() else: a = QAction(sub, m) a.triggered.connect(self.submit) m.addAction(a) self.menu.addMenu(m) editor.addAction(QIcon.fromTheme("list-add"), QLineEdit.LeadingPosition).triggered.connect(self.popupMenu) def setModelData(self, editor, model, index): val = editor.text() model.setData(index, val) def popupMenu(self): act = self.sender() self.menu.popup(self.txt.parent().mapToGlobal(self.txt.geometry().bottomLeft())) def submit(self): act = self.sender() self.txt.setText(act.text()) manuskript-0.10.0/manuskript/ui/views/plotTreeView.py000066400000000000000000000157361354442177200227640ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import Qt, QModelIndex, QMimeData from PyQt5.QtGui import QBrush, QColor from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem from lxml import etree as ET from manuskript import settings from manuskript.enums import Plot, Outline, PlotStep from manuskript.models import references as Ref from manuskript.ui import style as S class plotTreeView(QTreeWidget): def __init__(self, parent=None): QTreeWidget.__init__(self, parent) self._model = None self._catRow = [-1, -1, -1] self._filter = "" self._lastID = -1 self._updating = False self._showSubPlot = False self.setRootIsDecorated(False) self.setIndentation(10) self.setColumnCount(1) self._rootItem = QTreeWidgetItem() self.insertTopLevelItem(0, self._rootItem) # self.currentItemChanged.connect(self._currentItemChanged) ############################################################################### # SETTERS ############################################################################### def setShowSubPlot(self, v): self._showSubPlot = v self.updateItems() def setPlotModel(self, model): self._model = model self._model.dataChanged.connect(self.updateMaybe) self._model.rowsInserted.connect(self.updateMaybe2) self._model.rowsRemoved.connect(self.updateMaybe2) self.updateItems() def setFilter(self, text): self._filter = text self.updateItems() ############################################################################### # GETTERS ############################################################################### def getItemByID(self, ID): "Recursively search items to find one whose data is ``ID``." def find(item, ID): if item.data(0, Qt.UserRole) == ID: return item for i in range(item.childCount()): r = find(item.child(i), ID) if r: return r return find(self.invisibleRootItem(), ID) def currentPlotIndex(self): "Returns index of the current item in plot model." ID = None if self.currentItem(): ID = self.currentItem().data(0, Qt.UserRole) return self._model.getIndexFromID(ID) ############################################################################### # UPDATES ############################################################################### def updateMaybe(self, topLeft, bottomRight): if topLeft.parent() != QModelIndex() and \ topLeft.column() <= PlotStep.name <= bottomRight.column() and \ self._showSubPlot: # Name's of Step has been updated, we update Items if showing # subplots. self.updateItems() elif topLeft.parent() != QModelIndex(): return if topLeft.column() <= Plot.name <= bottomRight.column(): # Update name self.updateNames() elif topLeft.column() <= Plot.importance <= bottomRight.column(): # Importance changed self.updateItems() def updateMaybe2(self, parent, first, last): "Rows inserted or removed" if parent == QModelIndex(): self.updateItems() elif self._showSubPlot: self.updateItems() def updateNames(self): for i in range(self.topLevelItemCount()): item = self.topLevelItem(i) for c in range(item.childCount()): sub = item.child(c) ID = sub.data(0, Qt.UserRole) if ID: name = self._model.getPlotNameByID(ID) sub.setText(0, name) def updateItems(self): if not self._model: return if self.currentItem(): self._lastID = self.currentItem().data(0, Qt.UserRole) self._updating = True self.clear() plots = self._model.getPlotsByImportance() h = [self.tr("Main"), self.tr("Secondary"), self.tr("Minor")] for i in range(3): cat = QTreeWidgetItem(self, [h[i]]) cat.setBackground(0, QBrush(QColor(S.highlightLight))) cat.setForeground(0, QBrush(QColor(S.highlightedTextDark))) cat.setTextAlignment(0, Qt.AlignCenter) f = cat.font(0) f.setBold(True) cat.setFont(0, f) cat.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) self.addTopLevelItem(cat) # cat.setChildIndicatorPolicy(cat.DontShowIndicator) for ID in plots[i]: name = self._model.getPlotNameByID(ID) if not self._filter.lower() in name.lower(): continue item = QTreeWidgetItem(cat, [name]) item.setData(0, Qt.UserRole, ID) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) if self._showSubPlot: f = item.font(0) f.setBold(True) item.setFont(0, f) for subID, name, summary in self._model.getSubPlotsByID(ID): sub = QTreeWidgetItem(item, [name]) # sub.setData(0, Qt.UserRole, "{}:{}".format(ID, subID)) sub.setData(0, Qt.UserRole, ID) if ID == self._lastID: self.setCurrentItem(item) self.expandAll() self._updating = False ############################################################################### # DRAG N DROP ############################################################################### def mimeTypes(self): return ["application/xml"] def mimeData(self, items): mimeData = QMimeData() encodedData = "" root = ET.Element("outlineItems") for item in items: plotID = item.data(0, Qt.UserRole) subplotRaw = item.parent().indexOfChild(item) _id, name, summary = self._model.getSubPlotsByID(plotID)[subplotRaw] sub = ET.Element("outlineItem") sub.set(Outline.title.name, name) sub.set(Outline.type.name, settings.defaultTextType) sub.set(Outline.summaryFull.name, summary) sub.set(Outline.notes.name, self.tr("**Plot:** {}").format( Ref.plotReference(plotID))) root.append(sub) encodedData = ET.tostring(root) mimeData.setData("application/xml", encodedData) return mimeData ############################################################################### # EVENTS ############################################################################### def mouseDoubleClickEvent(self, event): item = self.currentItem() # Catching double clicks to forbid collapsing of toplevel items if item.parent(): QTreeWidget.mouseDoubleClickEvent(self, event) manuskript-0.10.0/manuskript/ui/views/propertiesView.py000066400000000000000000000047621354442177200233570ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtWidgets import QWidget from PyQt5.QtGui import QIntValidator from manuskript.enums import Outline from manuskript.ui.views.propertiesView_ui import Ui_propertiesView class propertiesView(QWidget, Ui_propertiesView): def __init__(self, parent=None): QWidget.__init__(self) self.setupUi(self) self.txtGoal.setColumn(Outline.setGoal) def setModels(self, mdlOutline, mdlCharacter, mdlLabels, mdlStatus): self.cmbPOV.setModels(mdlCharacter, mdlOutline) self.cmbLabel.setModels(mdlLabels, mdlOutline) self.cmbStatus.setModels(mdlStatus, mdlOutline) self.chkCompile.setModel(mdlOutline) self.txtTitle.setModel(mdlOutline) self.txtGoal.setModel(mdlOutline) self.txtGoal.setValidator(QIntValidator(0, 9999999)) def getIndexes(self, sourceView): """Returns a list of indexes from list of QItemSelectionRange""" indexes = [] for i in sourceView.selection().indexes(): if i.column() != 0: continue if i not in indexes: indexes.append(i) return indexes def selectionChanged(self, sourceView): indexes = self.getIndexes(sourceView) # print(indexes) if len(indexes) == 0: self.setEnabled(False) elif len(indexes) == 1: self.setEnabled(True) self.setLabelsItalic(False) idx = indexes[0] self.cmbPOV.setCurrentModelIndex(idx) self.cmbLabel.setCurrentModelIndex(idx) self.cmbStatus.setCurrentModelIndex(idx) self.chkCompile.setCurrentModelIndex(idx) self.txtTitle.setCurrentModelIndex(idx) self.txtGoal.setCurrentModelIndex(idx) else: self.setEnabled(True) self.setLabelsItalic(True) self.txtTitle.setCurrentModelIndexes(indexes) self.txtGoal.setCurrentModelIndexes(indexes) self.chkCompile.setCurrentModelIndexes(indexes) self.cmbPOV.setCurrentModelIndexes(indexes) self.cmbLabel.setCurrentModelIndexes(indexes) self.cmbStatus.setCurrentModelIndexes(indexes) def setLabelsItalic(self, value): f = self.lblPOV.font() f.setItalic(value) for lbl in [ self.lblPOV, self.lblStatus, self.lblLabel, self.lblCompile, self.lblGoal ]: lbl.setFont(f) manuskript-0.10.0/manuskript/ui/views/propertiesView_ui.py000066400000000000000000000250711354442177200240500ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'manuskript/ui/views/propertiesView_ui.ui' # # Created by: PyQt5 UI code generator 5.9 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_propertiesView(object): def setupUi(self, propertiesView): propertiesView.setObjectName("propertiesView") propertiesView.resize(192, 186) self.verticalLayout = QtWidgets.QVBoxLayout(propertiesView) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setObjectName("verticalLayout") self.txtTitle = lineEditView(propertiesView) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.txtTitle.setFont(font) self.txtTitle.setStyleSheet("QLineEdit { background:transparent; }") self.txtTitle.setFrame(False) self.txtTitle.setObjectName("txtTitle") self.verticalLayout.addWidget(self.txtTitle) self.stack = QtWidgets.QStackedWidget(propertiesView) self.stack.setObjectName("stack") self.page = QtWidgets.QWidget() self.page.setObjectName("page") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.page) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setObjectName("verticalLayout_2") self.formLayout = QtWidgets.QFormLayout() self.formLayout.setObjectName("formLayout") self.lblPOV = QtWidgets.QLabel(self.page) self.lblPOV.setObjectName("lblPOV") self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.lblPOV) self.cmbPOV = cmbOutlineCharacterChoser(self.page) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.cmbPOV.sizePolicy().hasHeightForWidth()) self.cmbPOV.setSizePolicy(sizePolicy) self.cmbPOV.setFrame(False) self.cmbPOV.setObjectName("cmbPOV") self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.cmbPOV) self.lblStatus = QtWidgets.QLabel(self.page) self.lblStatus.setObjectName("lblStatus") self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.lblStatus) self.cmbStatus = cmbOutlineStatusChoser(self.page) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.cmbStatus.sizePolicy().hasHeightForWidth()) self.cmbStatus.setSizePolicy(sizePolicy) self.cmbStatus.setFrame(False) self.cmbStatus.setObjectName("cmbStatus") self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.cmbStatus) self.lblLabel = QtWidgets.QLabel(self.page) self.lblLabel.setObjectName("lblLabel") self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.lblLabel) self.cmbLabel = cmbOutlineLabelChoser(self.page) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.cmbLabel.sizePolicy().hasHeightForWidth()) self.cmbLabel.setSizePolicy(sizePolicy) self.cmbLabel.setFrame(False) self.cmbLabel.setObjectName("cmbLabel") self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.cmbLabel) self.lblCompile = QtWidgets.QLabel(self.page) self.lblCompile.setObjectName("lblCompile") self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.lblCompile) self.chkCompile = chkOutlineCompile(self.page) self.chkCompile.setText("") self.chkCompile.setObjectName("chkCompile") self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.chkCompile) self.lblGoal = QtWidgets.QLabel(self.page) self.lblGoal.setObjectName("lblGoal") self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.lblGoal) self.txtGoal = lineEditView(self.page) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.txtGoal.sizePolicy().hasHeightForWidth()) self.txtGoal.setSizePolicy(sizePolicy) self.txtGoal.setAutoFillBackground(False) self.txtGoal.setStyleSheet("border-radius: 6px;") self.txtGoal.setFrame(False) self.txtGoal.setObjectName("txtGoal") self.formLayout.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.txtGoal) self.verticalLayout_2.addLayout(self.formLayout) self.stack.addWidget(self.page) self.page_2 = QtWidgets.QWidget() self.page_2.setObjectName("page_2") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.page_2) self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) self.verticalLayout_3.setSpacing(0) self.verticalLayout_3.setObjectName("verticalLayout_3") self.formLayout_2 = QtWidgets.QFormLayout() self.formLayout_2.setObjectName("formLayout_2") self.lblPOV_2 = QtWidgets.QLabel(self.page_2) self.lblPOV_2.setObjectName("lblPOV_2") self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.lblPOV_2) self.cmbPOVMulti = cmbOutlineCharacterChoser(self.page_2) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.cmbPOVMulti.sizePolicy().hasHeightForWidth()) self.cmbPOVMulti.setSizePolicy(sizePolicy) self.cmbPOVMulti.setFrame(False) self.cmbPOVMulti.setObjectName("cmbPOVMulti") self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.cmbPOVMulti) self.label_31 = QtWidgets.QLabel(self.page_2) self.label_31.setObjectName("label_31") self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_31) self.cmbStatusMulti = cmbOutlineStatusChoser(self.page_2) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.cmbStatusMulti.sizePolicy().hasHeightForWidth()) self.cmbStatusMulti.setSizePolicy(sizePolicy) self.cmbStatusMulti.setFrame(False) self.cmbStatusMulti.setObjectName("cmbStatusMulti") self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.cmbStatusMulti) self.label_34 = QtWidgets.QLabel(self.page_2) self.label_34.setObjectName("label_34") self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_34) self.cmbLabelMulti = cmbOutlineLabelChoser(self.page_2) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.cmbLabelMulti.sizePolicy().hasHeightForWidth()) self.cmbLabelMulti.setSizePolicy(sizePolicy) self.cmbLabelMulti.setFrame(False) self.cmbLabelMulti.setObjectName("cmbLabelMulti") self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.cmbLabelMulti) self.label_35 = QtWidgets.QLabel(self.page_2) self.label_35.setObjectName("label_35") self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_35) self.chkCompileMulti = chkOutlineCompile(self.page_2) self.chkCompileMulti.setText("") self.chkCompileMulti.setObjectName("chkCompileMulti") self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.chkCompileMulti) self.label_36 = QtWidgets.QLabel(self.page_2) self.label_36.setObjectName("label_36") self.formLayout_2.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_36) self.txtGoalMulti = lineEditView(self.page_2) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.txtGoalMulti.sizePolicy().hasHeightForWidth()) self.txtGoalMulti.setSizePolicy(sizePolicy) self.txtGoalMulti.setAutoFillBackground(False) self.txtGoalMulti.setStyleSheet("border-radius: 6px;") self.txtGoalMulti.setFrame(False) self.txtGoalMulti.setObjectName("txtGoalMulti") self.formLayout_2.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.txtGoalMulti) self.verticalLayout_3.addLayout(self.formLayout_2) self.stack.addWidget(self.page_2) self.verticalLayout.addWidget(self.stack) self.retranslateUi(propertiesView) self.stack.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(propertiesView) def retranslateUi(self, propertiesView): _translate = QtCore.QCoreApplication.translate propertiesView.setWindowTitle(_translate("propertiesView", "Form")) self.lblPOV.setText(_translate("propertiesView", "POV")) self.lblStatus.setText(_translate("propertiesView", "Status")) self.lblLabel.setText(_translate("propertiesView", "Label")) self.lblCompile.setText(_translate("propertiesView", "Compile")) self.lblGoal.setText(_translate("propertiesView", "Goal")) self.txtGoal.setPlaceholderText(_translate("propertiesView", "Word count")) self.lblPOV_2.setText(_translate("propertiesView", "POV")) self.label_31.setText(_translate("propertiesView", "Status")) self.label_34.setText(_translate("propertiesView", "Label")) self.label_35.setText(_translate("propertiesView", "Compile")) self.label_36.setText(_translate("propertiesView", "Goal")) self.txtGoalMulti.setPlaceholderText(_translate("propertiesView", "Word count")) from manuskript.ui.views.chkOutlineCompile import chkOutlineCompile from manuskript.ui.views.cmbOutlineCharacterChoser import cmbOutlineCharacterChoser from manuskript.ui.views.cmbOutlineLabelChoser import cmbOutlineLabelChoser from manuskript.ui.views.cmbOutlineStatusChoser import cmbOutlineStatusChoser from manuskript.ui.views.lineEditView import lineEditView manuskript-0.10.0/manuskript/ui/views/propertiesView_ui.ui000066400000000000000000000241101354442177200240260ustar00rootroot00000000000000 propertiesView 0 0 192 186 Form 0 0 0 0 75 true QLineEdit { background:transparent; } false 0 0 0 0 0 POV 0 0 false Status 0 0 false Label 0 0 false Compile Goal 0 0 false border-radius: 6px; false Word count 0 0 0 0 0 POV 0 0 false Status 0 0 false Label 0 0 false Compile Goal 0 0 false border-radius: 6px; false Word count lineEditView QLineEdit
    manuskript.ui.views.lineEditView.h
    cmbOutlineCharacterChoser QComboBox
    manuskript.ui.views.cmbOutlineCharacterChoser.h
    cmbOutlineStatusChoser QComboBox
    manuskript.ui.views.cmbOutlineStatusChoser.h
    chkOutlineCompile QCheckBox
    manuskript.ui.views.chkOutlineCompile.h
    cmbOutlineLabelChoser QComboBox
    manuskript.ui.views.cmbOutlineLabelChoser.h
    manuskript-0.10.0/manuskript/ui/views/sldImportance.py000066400000000000000000000045411354442177200231270ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import pyqtSignal, pyqtProperty from PyQt5.QtWidgets import QWidget from manuskript.ui.views.sldImportance_ui import Ui_sldImportance from manuskript.functions import toInt class sldImportance(QWidget, Ui_sldImportance): importanceChanged = pyqtSignal(str) def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) self._column = 0 self._updating = False self._index = None self.lastValue = -1 self.sld.valueChanged.connect(self.changed) self.setValue(0) def getImportance(self): return str(self.sld.value()) def changed(self, v): val = [ self.tr("Minor"), self.tr("Secondary"), self.tr("Main"), ] self.lbl.setText(val[v]) self.importanceChanged.emit(str(v)) if self._index and not self._updating: if str(v) != self._model.data(self._index): self._updating = True self._model.setData(self._index, str(v)) self._updating = False def setValue(self, v): if v != self.lastValue: self.sld.setValue(int(v) if v else 0) self.changed(int(v) if v else 0) self.lastValue = v def setProperty(): pass # MODEL / VIEW def setColumn(self, column): self._column = column def setModel(self, model): self._model = model self._model.dataChanged.connect(self.update) def update(self, topLeft, bottomRight): if self._updating: return if self._index: if topLeft.row() <= self._index.row() <= bottomRight.row(): self.updateValue() def setCurrentModelIndex(self, index): if index.isValid(): if index.column() != self._column: index = index.sibling(index.row(), self._column) self._index = index self.updateValue() def updateValue(self): if self._index: val = toInt(self._model.data(self._index)) if self.sld.value() != val: self._updating = True self.setValue(val) self._updating = False importance = pyqtProperty(str, fget=getImportance, fset=setValue, notify=importanceChanged) manuskript-0.10.0/manuskript/ui/views/sldImportance_ui.py000066400000000000000000000026021354442177200236200ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'manuskript/ui/views/sldImportance_ui.ui' # # Created: Thu Mar 3 18:52:22 2016 # by: PyQt5 UI code generator 5.2.1 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_sldImportance(object): def setupUi(self, sldImportance): sldImportance.setObjectName("sldImportance") sldImportance.resize(452, 354) self.horizontalLayout = QtWidgets.QHBoxLayout(sldImportance) self.horizontalLayout.setObjectName("horizontalLayout") self.sld = QtWidgets.QSlider(sldImportance) self.sld.setMinimum(0) self.sld.setMaximum(2) self.sld.setPageStep(1) self.sld.setProperty("value", 0) self.sld.setOrientation(QtCore.Qt.Horizontal) self.sld.setObjectName("sld") self.horizontalLayout.addWidget(self.sld) self.lbl = QtWidgets.QLabel(sldImportance) self.lbl.setObjectName("lbl") self.horizontalLayout.addWidget(self.lbl) self.retranslateUi(sldImportance) QtCore.QMetaObject.connectSlotsByName(sldImportance) def retranslateUi(self, sldImportance): _translate = QtCore.QCoreApplication.translate sldImportance.setWindowTitle(_translate("sldImportance", "Form")) self.lbl.setText(_translate("sldImportance", "TextLabel")) manuskript-0.10.0/manuskript/ui/views/sldImportance_ui.ui000066400000000000000000000020461354442177200236070ustar00rootroot00000000000000 sldImportance 0 0 452 354 Form 0 2 1 0 Qt::Horizontal TextLabel manuskript-0.10.0/manuskript/ui/views/storylineView.py000066400000000000000000000270071354442177200232100ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import Qt, QTimer, QRectF from PyQt5.QtGui import QBrush, QPen, QFontMetrics, QFontMetricsF, QColor from PyQt5.QtWidgets import QWidget, QGraphicsScene, QGraphicsSimpleTextItem, QMenu, QAction, QGraphicsRectItem, \ QGraphicsLineItem, QGraphicsEllipseItem from manuskript.enums import Outline from manuskript.models import references import manuskript.functions as F from manuskript.ui.views.storylineView_ui import Ui_storylineView class storylineView(QWidget, Ui_storylineView): def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) self._mdlPlots = None self.scene = QGraphicsScene() self.view.setScene(self.scene) self.reloadTimer = QTimer() self.reloadTimer.timeout.connect(self.refresh) self.reloadTimer.setSingleShot(True) self.reloadTimer.setInterval(500) self.btnRefresh.clicked.connect(self.refresh) self.sldTxtSize.sliderMoved.connect(self.reloadTimer.start) self.generateMenu() def generateMenu(self): m = QMenu() self.actPlots = QAction(self.tr("Show Plots"), m) self.actPlots.setCheckable(True) self.actPlots.setChecked(True) self.actPlots.setIcon(F.themeIcon("plots")) self.actPlots.toggled.connect(self.reloadTimer.start) m.addAction(self.actPlots) self.actCharacters = QAction(self.tr("Show Characters"), m) self.actCharacters.setCheckable(True) self.actCharacters.setChecked(False) self.actCharacters.setIcon(F.themeIcon("characters")) self.actCharacters.toggled.connect(self.reloadTimer.start) m.addAction(self.actCharacters) self.btnSettings.setMenu(m) def setModels(self, mdlOutline, mdlCharacter, mdlPlots): self._mdlPlots = mdlPlots # self._mdlPlots.dataChanged.connect(self.refresh) # self._mdlPlots.rowsInserted.connect(self.refresh) self._mdlOutline = mdlOutline self._mdlOutline.dataChanged.connect(self.updateMaybe) self._mdlCharacter = mdlCharacter self._mdlCharacter.dataChanged.connect(self.reloadTimer.start) def updateMaybe(self, topLeft, bottomRight): if topLeft.column() <= Outline.notes <= bottomRight.column(): self.reloadTimer.start def plotReferences(self): "Returns a list of plot references" if not self._mdlPlots: pass plotsID = self._mdlPlots.getPlotsByImportance() r = [] for importance in plotsID: for ID in importance: ref = references.plotReference(ID) r.append(ref) return r def charactersReferences(self): "Returns a list of character references" if not self._mdlCharacter: pass chars = self._mdlCharacter.getCharactersByImportance() r = [] for importance in chars: for c in importance: ref = references.characterReference(c.ID()) r.append(ref) return r def refresh(self): if not self._mdlPlots or not self._mdlOutline or not self._mdlCharacter: return if not self.isVisible(): return LINE_HEIGHT = 18 SPACING = 3 TEXT_WIDTH = self.sldTxtSize.value() CIRCLE_WIDTH = 10 LEVEL_HEIGHT = 12 s = self.scene s.clear() # Get Max Level (max depth) root = self._mdlOutline.rootItem def maxLevel(item, level=0, max=0): if level > max: max = level for c in item.children(): m = maxLevel(c, level + 1) if m > max: max = m return max MAX_LEVEL = maxLevel(root) # Get the list of tracked items (array of references) trackedItems = [] if self.actPlots.isChecked(): trackedItems += self.plotReferences() if self.actCharacters.isChecked(): trackedItems += self.charactersReferences() ROWS_HEIGHT = len(trackedItems) * (LINE_HEIGHT + SPACING ) fm = QFontMetrics(s.font()) max_name = 0 for ref in trackedItems: name = references.title(ref) max_name = max(fm.width(name), max_name) TITLE_WIDTH = max_name + 2 * SPACING # Add Folders and Texts outline = OutlineRect(0, 0, 0, ROWS_HEIGHT + SPACING + MAX_LEVEL * LEVEL_HEIGHT) s.addItem(outline) outline.setPos(TITLE_WIDTH + SPACING, 0) refCircles = [] # a list of all references, to be added later on the lines # A Function to add a rect with centered elided text def addRectText(x, w, parent, text="", level=0, tooltip=""): deltaH = LEVEL_HEIGHT if level else 0 r = OutlineRect(0, 0, w, parent.rect().height()-deltaH, parent, title=text) r.setPos(x, deltaH) txt = QGraphicsSimpleTextItem(text, r) f = txt.font() f.setPointSize(8) fm = QFontMetricsF(f) elidedText = fm.elidedText(text, Qt.ElideMiddle, w) txt.setFont(f) txt.setText(elidedText) txt.setPos(r.boundingRect().center() - txt.boundingRect().center()) txt.setY(0) return r # A function to returns an item's width, by counting its children def itemWidth(item): if item.isFolder(): r = 0 for c in item.children(): r += itemWidth(c) return r or TEXT_WIDTH else: return TEXT_WIDTH def listItems(item, rect, level=0): delta = 0 for child in item.children(): w = itemWidth(child) if child.isFolder(): parent = addRectText(delta, w, rect, child.title(), level, tooltip=child.title()) parent.setToolTip(references.tooltip(references.textReference(child.ID()))) listItems(child, parent, level + 1) else: rectChild = addRectText(delta, TEXT_WIDTH, rect, "", level, tooltip=child.title()) rectChild.setToolTip(references.tooltip(references.textReference(child.ID()))) # Find tracked references in that scene (or parent folders) for ref in trackedItems: result = [] # Tests if POV scenePOV = False # Will hold true of character is POV of the current text, not containing folder if references.type(ref) == references.CharacterLetter: ID = references.ID(ref) c = child while c: if c.POV() == ID: result.append(c.ID()) if c == child: scenePOV = True c = c.parent() # Search in notes/references c = child while c: result += references.findReferencesTo(ref, c, recursive=False) c = c.parent() if result: ref2 = result[0] # Create a RefCircle with the reference c = RefCircle(TEXT_WIDTH / 2, - CIRCLE_WIDTH / 2, CIRCLE_WIDTH, ID=ref2, important=scenePOV) # Store it, with the position of that item, to display it on the line later on refCircles.append((ref, c, rect.mapToItem(outline, rectChild.pos()))) delta += w listItems(root, outline) OUTLINE_WIDTH = itemWidth(root) # Add Tracked items i = 0 itemsRect = s.addRect(0, 0, 0, 0) itemsRect.setPos(0, MAX_LEVEL * LEVEL_HEIGHT + SPACING) # Set of colors for plots (as long as they don't have their own colors) colors = [ "#D97777", "#AE5F8C", "#D9A377", "#FFC2C2", "#FFDEC2", "#D2A0BC", "#7B0F0F", "#7B400F", "#620C3D", "#AA3939", "#AA6C39", "#882D61", "#4C0000", "#4C2200", "#3D0022", ] for ref in trackedItems: if references.type(ref) == references.CharacterLetter: color = self._mdlCharacter.getCharacterByID(references.ID(ref)).color() else: color = QColor(colors[i % len(colors)]) # Rect r = QGraphicsRectItem(0, 0, TITLE_WIDTH, LINE_HEIGHT, itemsRect) r.setPen(QPen(Qt.NoPen)) r.setBrush(QBrush(color)) r.setPos(0, i * LINE_HEIGHT + i * SPACING) r.setToolTip(references.tooltip(ref)) i += 1 # Text name = references.title(ref) txt = QGraphicsSimpleTextItem(name, r) txt.setPos(r.boundingRect().center() - txt.boundingRect().center()) # Line line = PlotLine(0, 0, OUTLINE_WIDTH + SPACING, 0) line.setPos(TITLE_WIDTH, r.mapToScene(r.rect().center()).y()) s.addItem(line) line.setPen(QPen(color, 5)) line.setToolTip(references.tooltip(ref)) # We add the circles / references to text, on the line for ref2, circle, pos in refCircles: if ref2 == ref: circle.setParentItem(line) circle.setPos(pos.x(), 0) # self.view.fitInView(0, 0, TOTAL_WIDTH, i * LINE_HEIGHT, Qt.KeepAspectRatioByExpanding) # KeepAspectRatio self.view.setSceneRect(0, 0, 0, 0) class OutlineRect(QGraphicsRectItem): def __init__(self, x, y, w, h, parent=None, title=None): QGraphicsRectItem.__init__(self, x, y, w, h, parent) self.setBrush(Qt.white) self.setAcceptHoverEvents(True) self._title = title def hoverEnterEvent(self, event): self.setBrush(Qt.lightGray) def hoverLeaveEvent(self, event): self.setBrush(Qt.white) class RefCircle(QGraphicsEllipseItem): def __init__(self, x, y, diameter, parent=None, ID=None, important=False): QGraphicsEllipseItem.__init__(self, x, y, diameter, diameter, parent) self.setBrush(Qt.white) self._ref = references.textReference(ID) self.setToolTip(references.tooltip(self._ref)) self.setPen(QPen(Qt.black, 2)) self.setAcceptHoverEvents(True) if important: self.setBrush(Qt.black) def multiplyDiameter(self, factor): r1 = self.rect() r2 = QRectF(0, 0, r1.width() * factor, r1.height() * factor) self.setRect(r2) self.setPos(self.pos() + r1.center() - r2.center()) def mouseDoubleClickEvent(self, event): references.open(self._ref) def hoverEnterEvent(self, event): self.multiplyDiameter(2) def hoverLeaveEvent(self, event): self.multiplyDiameter(.5) class PlotLine(QGraphicsLineItem): def __init__(self, x1, y1, x2, y2, parent=None): QGraphicsLineItem.__init__(self, x1, y1, x2, y2, parent) self.setAcceptHoverEvents(True) def hoverEnterEvent(self, QGraphicsSceneHoverEvent): p = self.pen() p.setWidth(10) self.setPen(p) def hoverLeaveEvent(self, QGraphicsSceneHoverEvent): p = self.pen() p.setWidth(5) self.setPen(p) manuskript-0.10.0/manuskript/ui/views/storylineView_ui.py000066400000000000000000000047121354442177200237030ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'manuskript/ui/views/storylineView_ui.ui' # # Created: Mon Oct 16 10:05:35 2017 # by: PyQt5 UI code generator 5.2.1 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_storylineView(object): def setupUi(self, storylineView): storylineView.setObjectName("storylineView") storylineView.resize(1040, 130) self.horizontalLayout = QtWidgets.QHBoxLayout(storylineView) self.horizontalLayout.setSpacing(0) self.horizontalLayout.setContentsMargins(0, 0, 0, 0) self.horizontalLayout.setObjectName("horizontalLayout") self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setSpacing(0) self.verticalLayout.setObjectName("verticalLayout") self.btnRefresh = QtWidgets.QPushButton(storylineView) self.btnRefresh.setMaximumSize(QtCore.QSize(32, 32)) self.btnRefresh.setText("") icon = QtGui.QIcon.fromTheme("view-refresh") self.btnRefresh.setIcon(icon) self.btnRefresh.setFlat(True) self.btnRefresh.setObjectName("btnRefresh") self.verticalLayout.addWidget(self.btnRefresh) self.sldTxtSize = QtWidgets.QSlider(storylineView) self.sldTxtSize.setMinimum(1) self.sldTxtSize.setMaximum(100) self.sldTxtSize.setProperty("value", 20) self.sldTxtSize.setOrientation(QtCore.Qt.Vertical) self.sldTxtSize.setObjectName("sldTxtSize") self.verticalLayout.addWidget(self.sldTxtSize) self.btnSettings = QtWidgets.QPushButton(storylineView) self.btnSettings.setMaximumSize(QtCore.QSize(32, 32)) self.btnSettings.setText("") icon = QtGui.QIcon.fromTheme("preferences-system") self.btnSettings.setIcon(icon) self.btnSettings.setFlat(True) self.btnSettings.setObjectName("btnSettings") self.verticalLayout.addWidget(self.btnSettings) self.horizontalLayout.addLayout(self.verticalLayout) self.view = QtWidgets.QGraphicsView(storylineView) self.view.setObjectName("view") self.horizontalLayout.addWidget(self.view) self.retranslateUi(storylineView) QtCore.QMetaObject.connectSlotsByName(storylineView) def retranslateUi(self, storylineView): _translate = QtCore.QCoreApplication.translate storylineView.setWindowTitle(_translate("storylineView", "Form")) manuskript-0.10.0/manuskript/ui/views/storylineView_ui.ui000066400000000000000000000046611354442177200236730ustar00rootroot00000000000000 storylineView 0 0 1040 130 Form 0 0 0 0 0 0 32 32 true 1 100 20 Qt::Vertical 32 32 true manuskript-0.10.0/manuskript/ui/views/textEditView.py000066400000000000000000000472101354442177200227500ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import re from PyQt5.Qt import QApplication from PyQt5.QtCore import QTimer, QModelIndex, Qt, QEvent, pyqtSignal, QRegExp, QLocale, QPersistentModelIndex from PyQt5.QtGui import QTextBlockFormat, QTextCharFormat, QFont, QColor, QIcon, QMouseEvent, QTextCursor from PyQt5.QtWidgets import QWidget, QTextEdit, qApp, QAction, QMenu from manuskript import settings from manuskript.enums import Outline, World, Character, Plot from manuskript import functions as F from manuskript.models import outlineModel, outlineItem from manuskript.ui.highlighters import BasicHighlighter from manuskript.ui import style as S from manuskript.functions import Spellchecker class textEditView(QTextEdit): def __init__(self, parent=None, index=None, html=None, spellcheck=None, highlighting=False, dict="", autoResize=False): QTextEdit.__init__(self, parent) self._column = Outline.text self._index = None self._indexes = None self._model = None self._placeholderText = self.placeholderText() self._updating = False self._item = None self._highlighting = highlighting self._textFormat = "text" self.setAcceptRichText(False) # When setting up a theme, this becomes true. self._fromTheme = False self._themeData = None self._highlighterClass = BasicHighlighter if spellcheck is None: spellcheck = settings.spellcheck self.spellcheck = spellcheck self.currentDict = dict if dict else settings.dict self._defaultFontSize = qApp.font().pointSize() self.highlighter = None self.setAutoResize(autoResize) self._defaultBlockFormat = QTextBlockFormat() self._defaultCharFormat = QTextCharFormat() self.highlightWord = "" self.highligtCS = False self._dict = None # self.document().contentsChanged.connect(self.submit, F.AUC) # Submit text changed only after 500ms without modifications self.updateTimer = QTimer() self.updateTimer.setInterval(500) self.updateTimer.setSingleShot(True) self.updateTimer.timeout.connect(self.submit) # self.updateTimer.timeout.connect(lambda: print("Timeout")) self.updateTimer.stop() self.document().contentsChanged.connect(self.updateTimer.start, F.AUC) # self.document().contentsChanged.connect(lambda: print("Document changed")) # self.document().contentsChanged.connect(lambda: print(self.objectName(), "Contents changed")) self.setEnabled(False) if index: self.setCurrentModelIndex(index) elif html: self.document().setHtml(html) self.setReadOnly(True) # Spellchecking if self.spellcheck: self._dict = Spellchecker.getDictionary(self.currentDict) if not self._dict: self.spellcheck = False if self._highlighting and not self.highlighter: self.highlighter = self._highlighterClass(self) self.highlighter.setDefaultBlockFormat(self._defaultBlockFormat) def setModel(self, model): self._model = model try: self._model.dataChanged.connect(self.update, F.AUC) except TypeError: pass def setColumn(self, col): self._column = col def setHighlighting(self, val): self._highlighting = val def setDefaultBlockFormat(self, bf): self._defaultBlockFormat = bf if self.highlighter: self.highlighter.setDefaultBlockFormat(bf) def setCurrentModelIndex(self, index): self._indexes = None if index.isValid(): self.setEnabled(True) if index.column() != self._column: index = index.sibling(index.row(), self._column) self._index = QPersistentModelIndex(index) self.setPlaceholderText(self._placeholderText) if not self._model: self.setModel(index.model()) self.setupEditorForIndex(self._index) self.loadFontSettings() self.updateText() else: self._index = QModelIndex() self.setPlainText("") self.setEnabled(False) def currentIndex(self): """ Getter function used to normalized views access with QAbstractItemViews. """ if self._index: return self._index else: return QModelIndex() def getSelection(self): """ Getter function used to normalized views access with QAbstractItemViews. """ return [self.currentIndex()] def setCurrentModelIndexes(self, indexes): self._index = None self._indexes = [] for i in indexes: if i.isValid(): self.setEnabled(True) if i.column() != self._column: i = i.sibling(i.row(), self._column) self._indexes.append(QModelIndex(i)) if not self._model: self.setModel(i.model()) self.updateText() def setupEditorForIndex(self, index): # Setting highlighter if self._highlighting: self.highlighter = self._highlighterClass(self) self.highlighter.setDefaultBlockFormat(self._defaultBlockFormat) self.highlighter.updateColorScheme() def loadFontSettings(self): if self._fromTheme or \ not self._index or \ type(self._index.model()) != outlineModel or \ self._column != Outline.text: return opt = settings.textEditor f = QFont() f.fromString(opt["font"]) background = (opt["background"] if not opt["backgroundTransparent"] else "transparent") foreground = opt["fontColor"] # if not opt["backgroundTransparent"] # else S.text # self.setFont(f) self.setStyleSheet("""QTextEdit{{ background: {bg}; color: {foreground}; font-family: {ff}; font-size: {fs}; margin: {mTB}px {mLR}px; {maxWidth} }} """.format( bg=background, foreground=foreground, ff=f.family(), fs="{}pt".format(str(f.pointSize())), mTB = opt["marginsTB"], mLR = opt["marginsLR"], maxWidth = "max-width: {}px;".format(opt["maxWidth"]) if opt["maxWidth"] else "", ) ) self._defaultFontSize = f.pointSize() # We set the parent background to the editor's background in case # there are margins. We check that the parent class is a QWidget because # if textEditView is used in fullScreenEditor, then we don't want to # set the background. if self.parent().__class__ == QWidget: self.parent().setStyleSheet(""" QWidget#{name}{{ background: {bg}; }}""".format( # We style by name, otherwise all inheriting widgets get the same # colored background, for example context menu. name=self.parent().objectName(), bg=background, )) cf = QTextCharFormat() # cf.setFont(f) # cf.setForeground(QColor(opt["fontColor"])) self.setCursorWidth(opt["cursorWidth"]) bf = QTextBlockFormat() bf.setLineHeight(opt["lineSpacing"], bf.ProportionalHeight) bf.setTextIndent(opt["tabWidth"] * 1 if opt["indent"] else 0) bf.setTopMargin(opt["spacingAbove"]) bf.setBottomMargin(opt["spacingBelow"]) bf.setAlignment(Qt.AlignLeft if opt["textAlignment"] == 0 else Qt.AlignCenter if opt["textAlignment"] == 1 else Qt.AlignRight if opt["textAlignment"] == 2 else Qt.AlignJustify) self._defaultCharFormat = cf self._defaultBlockFormat = bf if self.highlighter: self.highlighter.updateColorScheme() self.highlighter.setMisspelledColor(QColor(opt["misspelled"])) self.highlighter.setDefaultCharFormat(self._defaultCharFormat) self.highlighter.setDefaultBlockFormat(self._defaultBlockFormat) def update(self, topLeft, bottomRight): if self._updating: return if self._index and self._index.isValid(): if topLeft.parent() != self._index.parent(): return # print("Model changed: ({}:{}), ({}:{}/{}), ({}:{}) for {} of {}".format( # topLeft.row(), topLeft.column(), # self._index.row(), self._index.row(), self._column, # bottomRight.row(), bottomRight.column(), # self.objectName(), self.parent().objectName())) if topLeft.row() <= self._index.row() <= bottomRight.row(): if topLeft.column() <= self._column <= bottomRight.column(): self.updateText() elif self._indexes: update = False for i in self._indexes: if topLeft.row() <= i.row() <= bottomRight.row(): update = True if update: self.updateText() def disconnectDocument(self): try: self.document().contentsChanged.disconnect(self.updateTimer.start) except: pass def reconnectDocument(self): self.document().contentsChanged.connect(self.updateTimer.start, F.AUC) def updateText(self): if self._updating: return # print("Updating", self.objectName()) self._updating = True if self._index: self.disconnectDocument() if self.toPlainText() != F.toString(self._index.data()): # print(" Updating plaintext") self.document().setPlainText(F.toString(self._index.data())) self.reconnectDocument() elif self._indexes: self.disconnectDocument() t = [] same = True for i in self._indexes: item = i.internalPointer() t.append(F.toString(item.data(self._column))) for t2 in t[1:]: if t2 != t[0]: same = False break if same: self.document().setPlainText(t[0]) else: self.document().setPlainText("") if not self._placeholderText: self._placeholderText = self.placeholderText() self.setPlaceholderText(self.tr("Various")) self.reconnectDocument() self._updating = False def submit(self): self.updateTimer.stop() if self._updating: return # print("Submitting", self.objectName()) if self._index and self._index.isValid(): # item = self._index.internalPointer() if self.toPlainText() != self._index.data(): # print(" Submitting plain text") self._updating = True self._model.setData(QModelIndex(self._index), self.toPlainText()) self._updating = False elif self._indexes: self._updating = True for i in self._indexes: item = i.internalPointer() if self.toPlainText() != F.toString(item.data(self._column)): print("Submitting many indexes") self._model.setData(i, self.toPlainText()) self._updating = False def keyPressEvent(self, event): if event.key() == Qt.Key_V and event.modifiers() & Qt.ControlModifier: text = QApplication.clipboard().text() self.insertPlainText(text) else: QTextEdit.keyPressEvent(self, event) if event.key() == Qt.Key_Space: self.submit() # ----------------------------------------------------------------------------------------------------- # Resize stuff def resizeEvent(self, e): QTextEdit.resizeEvent(self, e) if self._autoResize: self.sizeChange() def sizeChange(self): opt = settings.textEditor docHeight = self.document().size().height() + 2 * opt["marginsTB"] if self.heightMin <= docHeight <= self.heightMax: self.setMinimumHeight(docHeight) def setAutoResize(self, val): self._autoResize = val if self._autoResize: self.document().contentsChanged.connect(self.sizeChange) self.heightMin = 0 self.heightMax = 65000 self.sizeChange() ############################################################################### # SPELLCHECKING ############################################################################### # Based on http://john.nachtimwald.com/2009/08/22/qplaintextedit-with-in-line-spell-check/ def setDict(self, d): self.currentDict = d if d: self._dict = Spellchecker.getDictionary(d) if self.highlighter: self.highlighter.rehighlight() def toggleSpellcheck(self, v): self.spellcheck = v if self.spellcheck and not self._dict: self._dict = Spellchecker.getDictionary(self.currentDict) if not self._dict: self.spellcheck = False if self.highlighter: self.highlighter.rehighlight() else: self.spellcheck = False def mousePressEvent(self, event): if event.button() == Qt.RightButton: # Rewrite the mouse event to a left button event so the cursor is # moved to the location of the pointer. event = QMouseEvent(QEvent.MouseButtonPress, event.pos(), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier) QTextEdit.mousePressEvent(self, event) def wheelEvent(self, event): """ We catch wheelEvent if key modifier is CTRL to change font size. Note: this should be in a class specific for main textEditView (#TODO). """ if event.modifiers() & Qt.ControlModifier: # Get the wheel angle. d = event.angleDelta().y() / 120 # Update settings f = QFont() f.fromString(settings.textEditor["font"]) f.setPointSizeF(f.pointSizeF() + d) settings.textEditor["font"] = f.toString() # Update font to all textEditView. Drastically. for w in F.mainWindow().findChildren(textEditView, QRegExp(".*")): w.loadFontSettings() # We tell the world that we accepted this event event.accept() return QTextEdit.wheelEvent(self, event) class SpellAction(QAction): """A special QAction that returns the text in a signal. Used for spellcheck.""" correct = pyqtSignal(str) def __init__(self, *args): QAction.__init__(self, *args) self.triggered.connect(lambda x: self.correct.emit( str(self.text()))) def contextMenuEvent(self, event): # Based on http://john.nachtimwald.com/2009/08/22/qplaintextedit-with-in-line-spell-check/ popup_menu = self.createStandardContextMenu() popup_menu.exec_(event.globalPos()) def createStandardContextMenu(self): popup_menu = QTextEdit.createStandardContextMenu(self) if not self.spellcheck: return popup_menu # Select the word under the cursor. # But only if there is no selection (otherwise it's impossible to select more text to copy/cut) cursor = self.textCursor() if not cursor.hasSelection(): cursor.select(QTextCursor.WordUnderCursor) self.setTextCursor(cursor) # Check if the selected word is misspelled and offer spelling # suggestions if it is. if self._dict and cursor.hasSelection(): text = str(cursor.selectedText()) valid = not self._dict.isMisspelled(text) selectedWord = cursor.selectedText() if not valid: spell_menu = QMenu(self.tr('Spelling Suggestions'), self) spell_menu.setIcon(F.themeIcon("spelling")) for word in self._dict.getSuggestions(text): action = self.SpellAction(word, spell_menu) action.correct.connect(self.correctWord) spell_menu.addAction(action) popup_menu.insertSeparator(popup_menu.actions()[0]) # Adds: add to dictionary addAction = QAction(self.tr("&Add to dictionary"), popup_menu) addAction.setIcon(QIcon.fromTheme("list-add")) addAction.triggered.connect(self.addWordToDict) addAction.setData(selectedWord) popup_menu.insertAction(popup_menu.actions()[0], addAction) # Only add the spelling suggests to the menu if there are # suggestions. if len(spell_menu.actions()) != 0: # Adds: suggestions popup_menu.insertMenu(popup_menu.actions()[0], spell_menu) # popup_menu.insertSeparator(popup_menu.actions()[0]) # If word was added to custom dict, give the possibility to remove it elif valid and self._dict.isCustomWord(selectedWord): popup_menu.insertSeparator(popup_menu.actions()[0]) # Adds: remove from dictionary rmAction = QAction(self.tr("&Remove from custom dictionary"), popup_menu) rmAction.setIcon(QIcon.fromTheme("list-remove")) rmAction.triggered.connect(self.rmWordFromDict) rmAction.setData(selectedWord) popup_menu.insertAction(popup_menu.actions()[0], rmAction) return popup_menu def correctWord(self, word): """ Replaces the selected text with word. """ cursor = self.textCursor() cursor.beginEditBlock() cursor.removeSelectedText() cursor.insertText(word) cursor.endEditBlock() def addWordToDict(self): word = self.sender().data() self._dict.addWord(word) self.highlighter.rehighlight() def rmWordFromDict(self): word = self.sender().data() self._dict.removeWord(word) self.highlighter.rehighlight() ############################################################################### # FORMATTING ############################################################################### def focusOutEvent(self, event): """Submit changes just before focusing out.""" QTextEdit.focusOutEvent(self, event) self.submit() ############################################################################### # KEYBOARD SHORTCUTS ############################################################################### def callMainTreeView(self, functionName): """ The tree view in main window must have same index as the text edit that has focus. So we can pass it the call for documents edits like: duplicate, move up, etc. """ if self._index and self._column == Outline.text: function = getattr(F.mainWindow().treeRedacOutline, functionName) function() def rename(self): self.callMainTreeView("rename") def duplicate(self): self.callMainTreeView("duplicate") def moveUp(self): self.callMainTreeView("moveUp") def moveDown(self): self.callMainTreeView("moveDown") manuskript-0.10.0/manuskript/ui/views/treeDelegates.py000066400000000000000000000144601354442177200231010ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import Qt, QRect from PyQt5.QtGui import QColor, QPalette, QIcon, QFont, QFontMetrics from PyQt5.QtWidgets import QStyledItemDelegate, qApp, QStyleOptionViewItem, QStyle from manuskript import settings from manuskript.enums import Outline from manuskript.functions import mixColors, colorifyPixmap from manuskript.functions import outlineItemColors from manuskript.functions import toFloat from manuskript.ui import style as S class treeTitleDelegate(QStyledItemDelegate): """The main purpose of ``treeTitleDelegate`` is to paint outline items in the treeview with proper colors according to settings. """ def __init__(self, parent=None): QStyledItemDelegate.__init__(self, parent) self._view = None def setView(self, view): self._view = view def paint(self, painter, option, index): item = index.internalPointer() colors = outlineItemColors(item) style = qApp.style() opt = QStyleOptionViewItem(option) self.initStyleOption(opt, index) iconRect = style.subElementRect(style.SE_ItemViewItemDecoration, opt) textRect = style.subElementRect(style.SE_ItemViewItemText, opt) # Background style.drawPrimitive(style.PE_PanelItemViewItem, opt, painter) if settings.viewSettings["Tree"]["Background"] != "Nothing" and not opt.state & QStyle.State_Selected: col = colors[settings.viewSettings["Tree"]["Background"]] if col != QColor(Qt.transparent): col2 = QColor(S.window) if opt.state & QStyle.State_Selected: col2 = opt.palette.brush(QPalette.Normal, QPalette.Highlight).color() col = mixColors(col, col2, .2) painter.save() painter.setBrush(col) painter.setPen(Qt.NoPen) rect = opt.rect if self._view: r2 = self._view.visualRect(index) rect = self._view.viewport().rect() rect.setLeft(r2.left()) rect.setTop(r2.top()) rect.setBottom(r2.bottom()) painter.drawRoundedRect(rect, 5, 5) painter.restore() # Icon mode = QIcon.Normal if not opt.state & QStyle.State_Enabled: mode = QIcon.Disabled elif opt.state & QStyle.State_Selected: mode = QIcon.Selected state = QIcon.On if opt.state & QStyle.State_Open else QIcon.Off icon = opt.icon.pixmap(iconRect.size(), mode=mode, state=state) if opt.icon and settings.viewSettings["Tree"]["Icon"] != "Nothing": color = colors[settings.viewSettings["Tree"]["Icon"]] colorifyPixmap(icon, color) opt.icon = QIcon(icon) opt.icon.paint(painter, iconRect, opt.decorationAlignment, mode, state) # Text if opt.text: painter.save() textColor = QColor(S.text) if option.state & QStyle.State_Selected: col = QColor(S.highlightedText) textColor = col painter.setPen(col) if settings.viewSettings["Tree"]["Text"] != "Nothing": col = colors[settings.viewSettings["Tree"]["Text"]] if col == Qt.transparent: col = textColor # If text color is Compile and item is selected, we have # to change the color if settings.viewSettings["Outline"]["Text"] == "Compile" and \ not item.compile(): col = mixColors(textColor, QColor(S.window)) painter.setPen(col) f = QFont(opt.font) painter.setFont(f) fm = QFontMetrics(f) elidedText = fm.elidedText(opt.text, Qt.ElideRight, textRect.width()) painter.drawText(textRect, Qt.AlignLeft | Qt.AlignVCenter, elidedText) extraText = "" if item.isFolder() and settings.viewSettings["Tree"]["InfoFolder"] != "Nothing": if settings.viewSettings["Tree"]["InfoFolder"] == "Count": extraText = item.childCount() extraText = " [{}]".format(extraText) elif settings.viewSettings["Tree"]["InfoFolder"] == "WC": extraText = item.wordCount() extraText = " ({})".format(extraText) elif settings.viewSettings["Tree"]["InfoFolder"] == "Progress": extraText = int(toFloat(item.data(Outline.goalPercentage)) * 100) if extraText: extraText = " ({}%)".format(extraText) elif settings.viewSettings["Tree"]["InfoFolder"] == "Summary": extraText = item.data(Outline.summarySentence) if extraText: extraText = " - {}".format(extraText) if item.isText() and settings.viewSettings["Tree"]["InfoText"] != "Nothing": if settings.viewSettings["Tree"]["InfoText"] == "WC": extraText = item.wordCount() extraText = " ({})".format(extraText) elif settings.viewSettings["Tree"]["InfoText"] == "Progress": extraText = int(toFloat(item.data(Outline.goalPercentage)) * 100) if extraText: extraText = " ({}%)".format(extraText) elif settings.viewSettings["Tree"]["InfoText"] == "Summary": extraText = item.data(Outline.summarySentence) if extraText: extraText = " - {}".format(extraText) if extraText: r = QRect(textRect) r.setLeft(r.left() + fm.width(opt.text + " ")) painter.save() f = painter.font() f.setWeight(QFont.Normal) painter.setFont(f) if option.state & QStyle.State_Selected: col = QColor(S.highlightedTextLight) else: col = QColor(S.textLight) painter.setPen(col) painter.drawText(r, Qt.AlignLeft | Qt.AlignVCenter, extraText) painter.restore() painter.restore() # QStyledItemDelegate.paint(self, painter, option, index) manuskript-0.10.0/manuskript/ui/views/treeView.py000066400000000000000000000065211354442177200221150ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- from PyQt5.QtCore import Qt from PyQt5.QtGui import QCursor from PyQt5.QtWidgets import QTreeView, QAction from manuskript.enums import Outline from manuskript.functions import mainWindow from manuskript.ui.views.dndView import dndView from manuskript.ui.views.outlineBasics import outlineBasics from manuskript.ui.views.treeDelegates import treeTitleDelegate class treeView(QTreeView, dndView, outlineBasics): def __init__(self, parent=None): QTreeView.__init__(self, parent) dndView.__init__(self, parent) outlineBasics.__init__(self, parent) self._indexesToOpen = None def setModel(self, model): QTreeView.setModel(self, model) # Hiding columns for c in range(self.model().columnCount()): self.hideColumn(c) self.showColumn(Outline.title) # Setting delegate self.titleDelegate = treeTitleDelegate() self.setItemDelegateForColumn(Outline.title, self.titleDelegate) def makePopupMenu(self): menu = outlineBasics.makePopupMenu(self) first = menu.actions()[3] # Open item in new tab #sel = self.selectedIndexes() pos = self.viewport().mapFromGlobal(QCursor.pos()) mouseIndex = self.indexAt(pos) # Expand /collapse item if mouseIndex.isValid(): # index = self.currentIndex() item = mouseIndex.internalPointer() if item.isFolder(): self.actExpand = QAction(self.tr("Expand {}").format(item.title()), menu) self.actExpand.triggered.connect(self.expandCurrentIndex) menu.insertAction(first, self.actExpand) self.actCollapse = QAction(self.tr("Collapse {}").format(item.title()), menu) self.actCollapse.triggered.connect(self.collapseCurrentIndex) menu.insertAction(first, self.actCollapse) menu.insertSeparator(first) # Expand /collapse all self.actExpandAll = QAction(self.tr("Expand All"), menu) self.actExpandAll.triggered.connect(self.expandAll) menu.insertAction(first, self.actExpandAll) self.actCollapseAll = QAction(self.tr("Collapse All"), menu) self.actCollapseAll.triggered.connect(self.collapseAll) menu.insertAction(first, self.actCollapseAll) menu.insertSeparator(first) return menu def expandCurrentIndex(self, index=None): if index is None or type(index) == bool: index = self._indexesToOpen[0] # self.currentIndex() self.expand(index) for i in range(self.model().rowCount(index)): idx = self.model().index(i, 0, index) self.expandCurrentIndex(index=idx) def collapseCurrentIndex(self, index=None): if index is None or type(index) == bool: index = self._indexesToOpen[0] # self.currentIndex() self.collapse(index) for i in range(self.model().rowCount(index)): idx = self.model().index(i, 0, index) self.collapseCurrentIndex(index=idx) def dragMoveEvent(self, event): dndView.dragMoveEvent(self, event) QTreeView.dragMoveEvent(self, event) def mouseReleaseEvent(self, event): QTreeView.mouseReleaseEvent(self, event) outlineBasics.mouseReleaseEvent(self, event) manuskript-0.10.0/manuskript/ui/views/webView.py000066400000000000000000000017751354442177200217410ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import PyQt5 import os features = {'qtwebkit': False, 'qtwebengine': False} if 'QT_WEB' in os.environ: features[os.environ['QT_WEB']] = True else: try: import PyQt5.QtWebKitWidgets features['qtwebkit'] = True except: features['qtwebkit'] = False try: import PyQt5.QtWebEngineWidgets features['qtwebengine'] = True except: features['qtwebengine'] = False if features['qtwebkit']: from PyQt5.QtWebKitWidgets import QWebView print("Debug: Web rendering engine used: QWebView") webEngine = "QtWebKit" webView = QWebView elif features['qtwebengine']: from PyQt5 import QtWebEngineWidgets print("Debug: Web rendering engine used: QWebEngineView") webEngine = "QtWebEngine" webView = QtWebEngineWidgets.QWebEngineView else: from PyQt5.QtWidgets import QTextEdit print("Debug: Web rendering engine used: QTextEdit") webEngine = "QTextEdit" webView = QTextEdit manuskript-0.10.0/manuskript/ui/welcome.py000066400000000000000000000451151354442177200206230ustar00rootroot00000000000000#!/usr/bin/env python # --!-- coding: utf8 --!-- import locale import imp import os from PyQt5.QtCore import QSettings, QRegExp, Qt, QDir from PyQt5.QtGui import QIcon, QBrush, QColor, QStandardItemModel, QStandardItem from PyQt5.QtWidgets import QWidget, QAction, QFileDialog, QSpinBox, QLineEdit, QLabel, QPushButton, QTreeWidgetItem, \ qApp, QMessageBox from manuskript import loadSave from manuskript import settings from manuskript.enums import Outline from manuskript.functions import mainWindow, iconFromColor, appPath from manuskript.models.characterModel import characterModel from manuskript.models import outlineItem, outlineModel from manuskript.models.plotModel import plotModel from manuskript.models.worldModel import worldModel from manuskript.ui.welcome_ui import Ui_welcome from manuskript.ui import style as S try: locale.setlocale(locale.LC_ALL, '') except: pass class welcome(QWidget, Ui_welcome): def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) self.template = [] self.mw = mainWindow() self.btnOpen.clicked.connect(self.openFile) self.btnCreate.clicked.connect(self.createFile) self.chkLoadLastProject.toggled.connect(self.setAutoLoad) self.tree.itemClicked.connect(self.changeTemplate) self.btnAddLevel.clicked.connect(self.templateAddLevel) self.btnAddWC.clicked.connect(self.templateAddWordCount) self.btnCreateText = self.btnCreate.text() self.populateTemplates() self._templates = self.templates() def updateValues(self): # Auto load autoLoad, last = self.getAutoLoadValues() self.chkLoadLastProject.setChecked(autoLoad) # Recent Files self.loadRecents() def getLastAccessedDirectory(self): sttgs = QSettings() lastDirectory = sttgs.value("lastAccessedDirectory", defaultValue=".", type=str) if lastDirectory != '.': print(qApp.translate("lastAccessedDirectoryInfo", "Last accessed directory \"{}\" loaded.").format( lastDirectory)) return lastDirectory def setLastAccessedDirectory(self, dir): sttgs = QSettings() sttgs.setValue("lastAccessedDirectory", dir) ############################################################################### # AUTOLOAD ############################################################################### def showEvent(self, event): """Waiting for things to be fully loaded to start opening projects.""" QWidget.showEvent(self, event) # Auto load last project autoLoad, last = self.getAutoLoadValues() if self.mw._autoLoadProject: project = self.mw._autoLoadProject self.mw._autoLoadProject = None self.appendToRecentFiles(project) self.mw.loadProject(project) elif autoLoad and last: self.mw.loadProject(last) def getAutoLoadValues(self): """ Reads manuskript system's settings and returns a tuple: - `bool`: whether manuskript should automatically load the last opened project or display the welcome widget. - `str`: the absolute path to the last opened project. """ sttgns = QSettings() autoLoad = sttgns.value("autoLoad", defaultValue=False, type=bool) if autoLoad and sttgns.contains("lastProject"): last = sttgns.value("lastProject") else: last = "" return autoLoad, last def setAutoLoad(self, v): if type(v) == bool: QSettings().setValue("autoLoad", v) ############################################################################### # RECENTS ############################################################################### def loadRecents(self): sttgns = QSettings() self.mw.menuRecents.setIcon(QIcon.fromTheme("folder-recent")) if sttgns.contains("recentFiles"): lst = sttgns.value("recentFiles") self.mw.menuRecents.clear() for f in [f for f in lst if os.path.exists(f)]: name = os.path.split(f)[1] a = QAction(name, self) a.setData(f) a.setStatusTip(f) a.triggered.connect(self.loadRecentFile) self.mw.menuRecents.addAction(a) self.btnRecent.setMenu(self.mw.menuRecents) def appendToRecentFiles(self, project): sttgns = QSettings() if sttgns.contains("recentFiles"): recentFiles = sttgns.value("recentFiles") else: recentFiles = [] while project in recentFiles: recentFiles.remove(project) recentFiles.insert(0, project) recentFiles = recentFiles[:10] sttgns.setValue("recentFiles", recentFiles) def loadRecentFile(self): act = self.sender() self.appendToRecentFiles(act.data()) self.mw.closeProject() self.mw.loadProject(act.data()) ############################################################################### # DIALOGS ############################################################################### def openFile(self): lastDirectory = self.getLastAccessedDirectory() """File dialog that request an existing file. For opening project.""" filename = QFileDialog.getOpenFileName(self, self.tr("Open project"), lastDirectory, self.tr("Manuskript project (*.msk);;All files (*)"))[0] if filename: self.setLastAccessedDirectory(os.path.dirname(filename)) self.appendToRecentFiles(filename) self.mw.loadProject(filename) def saveAsFile(self): lastDirectory = self.getLastAccessedDirectory() """File dialog that request a file, existing or not. Save data to that file, which then becomes the current project.""" filename = QFileDialog.getSaveFileName(self, self.tr("Save project as..."), lastDirectory, self.tr("Manuskript project (*.msk)"))[0] if filename: self.setLastAccessedDirectory(os.path.dirname(filename)) if filename[-4:] != ".msk": filename += ".msk" self.appendToRecentFiles(filename) loadSave.clearSaveCache() # Ensure all file(s) are saved under new filename self.mw.saveDatas(filename) # Update Window's project name with new filename pName = os.path.split(filename)[1] if pName.endswith('.msk'): pName=pName[:-4] self.mw.setWindowTitle(pName + " - " + self.tr("Manuskript")) def createFile(self, filename=None, overwrite=False): lastDirectory = self.getLastAccessedDirectory() """When starting a new project, ask for a place to save it. Datas are not loaded from file, so they must be populated another way.""" if not filename: filename = QFileDialog.getSaveFileName( self, self.tr("Create New Project"), lastDirectory, self.tr("Manuskript project (*.msk)"))[0] if filename: self.setLastAccessedDirectory(os.path.dirname(filename)) if filename[-4:] != ".msk": filename += ".msk" if os.path.exists(filename) and not overwrite: # Check if okay to overwrite existing project result = QMessageBox.warning(self, self.tr("Warning"), self.tr("Overwrite existing project {} ?").format(filename), QMessageBox.Ok|QMessageBox.Cancel, QMessageBox.Cancel) if result == QMessageBox.Cancel: return # Create new project self.appendToRecentFiles(filename) self.loadDefaultDatas() self.mw.loadProject(filename, loadFromFile=False) ############################################################################### # TEMPLATES ############################################################################### def templates(self): return [ (self.tr("Empty fiction"), [], "Fiction"), (self.tr("Novel"), [ (20, self.tr("Chapter")), (5, self.tr("Scene")), (500, None) # A line with None is word count ], "Fiction"), (self.tr("Novella"), [ (10, self.tr("Chapter")), (5, self.tr("Scene")), (500, None) ], "Fiction"), (self.tr("Short Story"), [ (10, self.tr("Scene")), (1000, None) ], "Fiction"), (self.tr("Trilogy"), [ (3, self.tr("Book")), (3, self.tr("Section")), (10, self.tr("Chapter")), (5, self.tr("Scene")), (500, None) ], "Fiction"), (self.tr("Empty non-fiction"), [], "Non-fiction"), (self.tr("Research paper"), [ (3, self.tr("Section")), (1000, None) ], "Non-fiction") ] def changeTemplate(self, item, column): template = [i for i in self._templates if i[0] == item.text(0)] self.btnCreate.setText(self.btnCreateText) # Selected item is a template if len(template): self.template = template[0] self.updateTemplate() # Selected item is a sample project elif item.data(0, Qt.UserRole): name = item.data(0, Qt.UserRole) # Clear templates self.template = self._templates[0] self.updateTemplate() # Change button text self.btnCreate.setText("Open {}".format(name)) # Load project self.mw.loadProject(appPath("sample-projects/{}".format(name))) def updateTemplate(self): # Clear layout def clearLayout(l): while l.count() != 0: i = l.takeAt(0) if i.widget(): i.widget().deleteLater() if i.layout(): clearLayout(i.layout()) clearLayout(self.lytTemplate) # self.templateLayout.addStretch() # l = QGridLayout() # self.templateLayout.addLayout(l) k = 0 hasWC = False for templateIndex, d in enumerate(self.template[1]): spin = QSpinBox(self) spin.setRange(0, 999999) spin.setValue(d[0]) # Storing the level of the template in that spinbox, so we can use # it to update the template when valueChanged on that spinbox # (we do that in self.updateWordCount for convenience). spin.setProperty("templateIndex", templateIndex) spin.valueChanged.connect(self.updateWordCount) if d[1] != None: txt = QLineEdit(self) txt.setProperty("templateIndex", templateIndex) txt.textEdited.connect(self.updateWordCount) txt.setText(d[1]) else: hasWC = True txt = QLabel(self.tr("words each."), self) if k != 0: of = QLabel(self.tr("of"), self) self.lytTemplate.addWidget(of, k, 0) btn = QPushButton("", self) btn.setIcon(QIcon.fromTheme("edit-delete")) btn.setProperty("deleteRow", k) btn.setFlat(True) btn.clicked.connect(self.deleteTemplateRow) self.lytTemplate.addWidget(btn, k, 3) self.lytTemplate.addWidget(spin, k, 1) self.lytTemplate.addWidget(txt, k, 2) k += 1 self.btnAddWC.setEnabled(not hasWC and len(self.template[1]) > 0) self.btnAddLevel.setEnabled(True) self.lblTotal.setVisible(hasWC) self.updateWordCount() def templateAddLevel(self): if len(self.template[1]) > 0 and \ self.template[1][len(self.template[1]) - 1][1] == None: # has word count, so insert before self.template[1].insert(len(self.template[1]) - 1, (10, self.tr("Text"))) else: # No word count, so insert at end self.template[1].append((10, self.tr("Something"))) self.updateTemplate() def templateAddWordCount(self): self.template[1].append((500, None)) self.updateTemplate() def deleteTemplateRow(self): btn = self.sender() row = btn.property("deleteRow") self.template[1].pop(row) self.updateTemplate() def updateWordCount(self): """ Updates the word count of the template, and displays it in a label. Also, updates self.template, which is used to create the items when calling self.createFile. """ total = 1 # Searching for every spinboxes on the widget, and multiplying # their values to get the number of words. for s in self.findChildren(QSpinBox, QRegExp(".*"), Qt.FindChildrenRecursively): total = total * s.value() # Update self.template to reflect the changed count values templateIndex = s.property("templateIndex") self.template[1][templateIndex] = ( s.value(), self.template[1][templateIndex][1]) for t in self.findChildren(QLineEdit, QRegExp(".*"), Qt.FindChildrenRecursively): # Update self.template to reflect the changed name values templateIndex = t.property("templateIndex") if templateIndex is not None : self.template[1][templateIndex] = ( self.template[1][templateIndex][0], t.text()) if total == 1: total = 0 self.lblTotal.setText(self.tr("Total: {} words (~ {} pages)").format( locale.format_string("%d", total, grouping=True), locale.format_string("%d", total / 250, grouping=True) )) def addTopLevelItem(self, name): item = QTreeWidgetItem(self.tree, [name]) item.setBackground(0, QBrush(QColor(S.highlightLight))) item.setForeground(0, QBrush(QColor(S.highlightedTextDark))) item.setTextAlignment(0, Qt.AlignCenter) item.setFlags(Qt.ItemIsEnabled) f = item.font(0) f.setBold(True) item.setFont(0, f) return item def populateTemplates(self): self.tree.clear() self.tree.setIndentation(0) # Add templates item = self.addTopLevelItem(self.tr("Fiction")) templates = [i for i in self.templates() if i[2] == "Fiction"] for t in templates: sub = QTreeWidgetItem(item, [t[0]]) # Add templates: non-fiction item = self.addTopLevelItem(self.tr("Non-fiction")) templates = [i for i in self.templates() if i[2] == "Non-fiction"] for t in templates: sub = QTreeWidgetItem(item, [t[0]]) # Add Demo project item = self.addTopLevelItem(self.tr("Demo projects")) dir = QDir(appPath("sample-projects")) for f in dir.entryList(["*.msk"], filters=QDir.Files): sub = QTreeWidgetItem(item, [f[:-4]]) sub.setData(0, Qt.UserRole, f) self.tree.expandAll() def loadDefaultDatas(self): # Empty settings imp.reload(settings) settings.initDefaultValues() if self.template: t = [i for i in self._templates if i[0] == self.template[0]] if t and t[0][2] == "Non-fiction": settings.viewMode = "simple" # Tasks self.mw.mdlFlatData = QStandardItemModel(2, 8, self.mw) # Persos # self.mw.mdlPersos = QStandardItemModel(0, 0, self.mw) self.mw.mdlCharacter = characterModel(self.mw) # self.mdlPersosProxy = None # persosProxyModel() # None # self.mw.mdlPersosProxy = persosProxyModel(self.mw) # self.mw.mdlPersosInfos = QStandardItemModel(1, 0, self.mw) # self.mw.mdlPersosInfos.insertColumn(0, [QStandardItem("ID")]) # self.mw.mdlPersosInfos.setHorizontalHeaderLabels(["Description"]) # Labels self.mw.mdlLabels = QStandardItemModel(self.mw) for color, text in [ (Qt.transparent, ""), (Qt.yellow, self.tr("Idea")), (Qt.green, self.tr("Note")), (Qt.blue, self.tr("Chapter")), (Qt.red, self.tr("Scene")), (Qt.cyan, self.tr("Research")) ]: self.mw.mdlLabels.appendRow(QStandardItem(iconFromColor(color), text)) # Status self.mw.mdlStatus = QStandardItemModel(self.mw) for text in [ "", self.tr("TODO"), self.tr("First draft"), self.tr("Second draft"), self.tr("Final") ]: self.mw.mdlStatus.appendRow(QStandardItem(text)) # Plot self.mw.mdlPlots = plotModel(self.mw) # Outline self.mw.mdlOutline = outlineModel(self.mw) # World self.mw.mdlWorld = worldModel(self.mw) root = self.mw.mdlOutline.rootItem _type = "md" def addElement(parent, datas): if len(datas) == 2 and datas[1][1] == None or \ len(datas) == 1: # Next item is word count n = 0 for i in range(datas[0][0]): n += 1 item = outlineItem(title="{} {}".format( datas[0][1], str(n)), _type=_type, parent=parent) if len(datas) == 2: item.setData(Outline.setGoal, datas[1][0]) # parent.appendChild(item) else: n = 0 for i in range(datas[0][0]): n += 1 item = outlineItem(title="{} {}".format( datas[0][1], str(n)), _type="folder", parent=parent) # parent.appendChild(item) addElement(item, datas[1:]) if self.template and self.template[1]: addElement(root, self.template[1]) manuskript-0.10.0/manuskript/ui/welcome_ui.py000066400000000000000000000162551354442177200213230ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'manuskript/ui/welcome_ui.ui' # # Created: Mon Oct 16 10:45:41 2017 # by: PyQt5 UI code generator 5.2.1 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_welcome(object): def setupUi(self, welcome): welcome.setObjectName("welcome") welcome.resize(728, 459) self.horizontalLayout = QtWidgets.QHBoxLayout(welcome) self.horizontalLayout.setObjectName("horizontalLayout") self.frame_2 = QtWidgets.QFrame(welcome) self.frame_2.setMinimumSize(QtCore.QSize(500, 0)) self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_2.setObjectName("frame_2") self.verticalLayout_32 = QtWidgets.QVBoxLayout(self.frame_2) self.verticalLayout_32.setObjectName("verticalLayout_32") self.horizontalLayout_23 = QtWidgets.QHBoxLayout() self.horizontalLayout_23.setObjectName("horizontalLayout_23") self.tree = QtWidgets.QTreeWidget(self.frame_2) self.tree.setMaximumSize(QtCore.QSize(150, 16777215)) self.tree.setRootIsDecorated(False) self.tree.setObjectName("tree") item_0 = QtWidgets.QTreeWidgetItem(self.tree) font = QtGui.QFont() font.setBold(True) font.setWeight(75) item_0.setFont(0, font) brush = QtGui.QBrush(QtGui.QColor(230, 230, 255)) brush.setStyle(QtCore.Qt.SolidPattern) item_0.setBackground(0, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 128)) brush.setStyle(QtCore.Qt.NoBrush) item_0.setForeground(0, brush) item_1 = QtWidgets.QTreeWidgetItem(item_0) item_1 = QtWidgets.QTreeWidgetItem(item_0) item_1 = QtWidgets.QTreeWidgetItem(item_0) item_1 = QtWidgets.QTreeWidgetItem(item_0) item_1 = QtWidgets.QTreeWidgetItem(item_0) item_0 = QtWidgets.QTreeWidgetItem(self.tree) font = QtGui.QFont() font.setBold(True) font.setWeight(75) item_0.setFont(0, font) brush = QtGui.QBrush(QtGui.QColor(230, 230, 255)) brush.setStyle(QtCore.Qt.SolidPattern) item_0.setBackground(0, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 128)) brush.setStyle(QtCore.Qt.NoBrush) item_0.setForeground(0, brush) self.tree.header().setVisible(False) self.horizontalLayout_23.addWidget(self.tree) self.templateLayout = QtWidgets.QVBoxLayout() self.templateLayout.setObjectName("templateLayout") self.lytTemplate = QtWidgets.QGridLayout() self.lytTemplate.setObjectName("lytTemplate") self.templateLayout.addLayout(self.lytTemplate) spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.templateLayout.addItem(spacerItem) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.lblTotal = QtWidgets.QLabel(self.frame_2) self.lblTotal.setText("") self.lblTotal.setObjectName("lblTotal") self.horizontalLayout_2.addWidget(self.lblTotal) self.btnAddLevel = QtWidgets.QPushButton(self.frame_2) self.btnAddLevel.setEnabled(False) icon = QtGui.QIcon.fromTheme("list-add") self.btnAddLevel.setIcon(icon) self.btnAddLevel.setObjectName("btnAddLevel") self.horizontalLayout_2.addWidget(self.btnAddLevel) self.btnAddWC = QtWidgets.QPushButton(self.frame_2) self.btnAddWC.setEnabled(False) icon = QtGui.QIcon.fromTheme("applications-debugging") self.btnAddWC.setIcon(icon) self.btnAddWC.setObjectName("btnAddWC") self.horizontalLayout_2.addWidget(self.btnAddWC) self.templateLayout.addLayout(self.horizontalLayout_2) self.horizontalLayout_23.addLayout(self.templateLayout) self.verticalLayout_32.addLayout(self.horizontalLayout_23) self.line_4 = QtWidgets.QFrame(self.frame_2) self.line_4.setFrameShape(QtWidgets.QFrame.HLine) self.line_4.setFrameShadow(QtWidgets.QFrame.Sunken) self.line_4.setObjectName("line_4") self.verticalLayout_32.addWidget(self.line_4) self.chkLoadLastProject = QtWidgets.QCheckBox(self.frame_2) self.chkLoadLastProject.setChecked(True) self.chkLoadLastProject.setObjectName("chkLoadLastProject") self.verticalLayout_32.addWidget(self.chkLoadLastProject) self.horizontalLayout_20 = QtWidgets.QHBoxLayout() self.horizontalLayout_20.setObjectName("horizontalLayout_20") spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_20.addItem(spacerItem1) self.btnOpen = QtWidgets.QPushButton(self.frame_2) icon = QtGui.QIcon.fromTheme("document-open") self.btnOpen.setIcon(icon) self.btnOpen.setObjectName("btnOpen") self.horizontalLayout_20.addWidget(self.btnOpen) self.btnRecent = QtWidgets.QPushButton(self.frame_2) icon = QtGui.QIcon.fromTheme("folder-recent") self.btnRecent.setIcon(icon) self.btnRecent.setObjectName("btnRecent") self.horizontalLayout_20.addWidget(self.btnRecent) self.btnCreate = QtWidgets.QPushButton(self.frame_2) icon = QtGui.QIcon.fromTheme("dialog-ok") self.btnCreate.setIcon(icon) self.btnCreate.setObjectName("btnCreate") self.horizontalLayout_20.addWidget(self.btnCreate) self.verticalLayout_32.addLayout(self.horizontalLayout_20) self.horizontalLayout.addWidget(self.frame_2) self.retranslateUi(welcome) QtCore.QMetaObject.connectSlotsByName(welcome) def retranslateUi(self, welcome): _translate = QtCore.QCoreApplication.translate welcome.setWindowTitle(_translate("welcome", "Form")) self.tree.headerItem().setText(0, _translate("welcome", "1")) __sortingEnabled = self.tree.isSortingEnabled() self.tree.setSortingEnabled(False) self.tree.topLevelItem(0).setText(0, _translate("welcome", "Templates")) self.tree.topLevelItem(0).child(0).setText(0, _translate("welcome", "Empty")) self.tree.topLevelItem(0).child(1).setText(0, _translate("welcome", "Novel")) self.tree.topLevelItem(0).child(2).setText(0, _translate("welcome", "Novella")) self.tree.topLevelItem(0).child(3).setText(0, _translate("welcome", "Short Story")) self.tree.topLevelItem(0).child(4).setText(0, _translate("welcome", "Research paper")) self.tree.topLevelItem(1).setText(0, _translate("welcome", "Demo projects")) self.tree.setSortingEnabled(__sortingEnabled) self.btnAddLevel.setText(_translate("welcome", "Add level")) self.btnAddWC.setText(_translate("welcome", "Add word count")) self.chkLoadLastProject.setText(_translate("welcome", "Next time, automatically open last project")) self.btnOpen.setText(_translate("welcome", "Open...")) self.btnRecent.setText(_translate("welcome", "Recent")) self.btnCreate.setText(_translate("welcome", "Create")) manuskript-0.10.0/manuskript/ui/welcome_ui.ui000066400000000000000000000172461354442177200213110ustar00rootroot00000000000000 welcome 0 0 728 459 Form 500 0 QFrame::StyledPanel QFrame::Raised 150 16777215 false false 1 Templates 75 true AlignHCenter|AlignVCenter|AlignCenter 230 230 255 0 0 128 Empty Novel Novella Short Story Research paper Demo projects 75 true AlignHCenter|AlignVCenter|AlignCenter 230 230 255 0 0 128 Qt::Vertical 20 40 false Add level false Add word count Qt::Horizontal Next time, automatically open last project true Qt::Horizontal 40 20 Open... Recent Create manuskript-0.10.0/manuskript/version.py000066400000000000000000000003111354442177200202250ustar00rootroot00000000000000# --!-- coding: utf8 --!-- # Single source the package version # https://packaging.python.org/guides/single-sourcing-package-version/ __version__ = "0.10.0" def getVersion(): return __version__ manuskript-0.10.0/package/000077500000000000000000000000001354442177200153715ustar00rootroot00000000000000manuskript-0.10.0/package/build_osx.sh000077500000000000000000000004141354442177200177170ustar00rootroot00000000000000#!/bin/bash set -ev if [ z"$FILENAME" = "z" ]; then echo "Error: Environment variable FILENAME is not set" exit 1 fi pyinstaller manuskript.spec --clean cd dist && zip $FILENAME -r manuskript && cd .. ls dist cp dist/$FILENAME dist/manuskript-osx-develop.zip manuskript-0.10.0/package/create_deb.sh000077500000000000000000000035171354442177200200130ustar00rootroot00000000000000#!/bin/bash # Can take two parameters: AppVersion PkgNumber # If not provided, AppVersion is found in manuskript/version.py # PkgNumber is 1. # Program vars ScriptPath="$( cd "$(dirname "$0")" ; pwd -P )" Root="$ScriptPath/../" # Manuskript Vars AppName=manuskript Version=$(grep -E "__version__.*\".*\"" "$Root/manuskript/version.py" \ | cut -d\" -f2) # Look for version in manuskript/version AppVersion=${1:-$Version} PkgNumber=${2:-1} PkgVersion=$AppVersion-$PkgNumber Dest="$Root/dist/$AppName-$PkgVersion" echo "Package directory: $Dest" echo -n "Creating folder structure" mkdir -p "$Dest/DEBIAN" mkdir -p "$Dest/usr/bin" mkdir -p "$Dest/usr/share/applications" echo " [✓]" # Getting manuskript files, by downloading # pushd $Dest/usr/share # wget https://github.com/olivierkes/manuskript/archive/$AppVersion.tar.gz # tar -xvf $AppVersion.tar.gz # rm $AppVersion.tar.gz # mv manuskript-0.5.0 manuskript # popd # Using the current direction as source echo -n "Copying manuskript content" rsync -a --exclude=.git --include="*.msk" --exclude-from="$Root/.gitignore" \ "$ScriptPath/../" "$Dest/usr/share/manuskript" cp "$ScriptPath/create_deb/manuskript" "$Dest/usr/bin/manuskript" cp "$ScriptPath/create_deb/manuskript.desktop" \ "$Dest/usr/share/applications/manuskript.desktop" cp "$ScriptPath/create_deb/control" "$Dest/DEBIAN/control" sed -i "s/{PkgVersion}/$PkgVersion/" "$Dest/DEBIAN/control" PkgSizeInKb=$(du -sk "$Dest" | cut -f 1) sed -i "s/{PkgSizeInKb}/$PkgSizeInKb/" "$Dest/DEBIAN/control" echo " [✓]" echo -n "Setting permissions" chmod 0755 "$Dest/usr/bin/manuskript" echo " [✓]" echo "Your root password might now be asked to finish setting permissions:" sudo chown root:root -R "$Dest" echo "Creating the package…" dpkg -b "$Dest" echo -n "Removing build folder" sudo rm -r "$Dest" echo " [✓]" echo Done ! manuskript-0.10.0/package/create_deb/000077500000000000000000000000001354442177200174465ustar00rootroot00000000000000manuskript-0.10.0/package/create_deb/control000066400000000000000000000013771354442177200210610ustar00rootroot00000000000000Package: manuskript Version: {PkgVersion} Maintainer: Curtis Gedak Description: Manuskript open source tool for writers. Manuskript is an open source tool for writers. It provides a rich environment to help writers create their first draft and then further refine and edit their masterpiece. Section: office, text Priority: optional Installed-Size: {PkgSizeInKb} Architecture: all Origin: Ubuntu 14.04 Bugs: https://github.com/olivierkes/manuskript/issues Homepage: http://www.theologeek.ch/manuskript/ Source: https://github.com/olivierkes/manuskript/archive/0.5.0.tar.gz Depends: python3, python3-pyqt5, python3-pyqt5.qtwebkit, libqt5svg5, python3-lxml, zlib1g, python3-enchant, python3-markdown, pandoc Suggests: texlive-latex-recommended manuskript-0.10.0/package/create_deb/manuskript000066400000000000000000000016121354442177200215660ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # manuskript - invocation python script # # Copyright (C) 2017 Olivier Keshavjee # # This file is part of Manuskript. # # Manuskript is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Manuskript is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Manuskript. If not, see . import os import sys sys.path.insert(1, '/usr/share/manuskript/') from manuskript import main main.run() manuskript-0.10.0/package/create_deb/manuskript.desktop000066400000000000000000000004221354442177200232340ustar00rootroot00000000000000[Desktop Entry] Name=Manuskript Comment=An open source tool for writers Keywords=manuskript;office;write;edit;novel;text;msk Exec=/usr/bin/manuskript Terminal=false Type=Application Icon=/usr/share/manuskript/icons/Manuskript/icon-512px.png Categories=Office;WordProcessor; manuskript-0.10.0/package/create_rpm.sh000077500000000000000000000055421354442177200200570ustar00rootroot00000000000000#!/bin/bash # # Name: create_rpm.sh # # Description: Create Fedora style RPM package for Manuskript # # Usage: create_rpm.sh [AppVersion PkgNumber] # # Parameters: Appversion - defaults to manuskript/version.py value. # PkgNumber - default to 1. # Function to echo command and then run command # Usage: echo_do eval "command-to-run" function echo_do() { echo "\$ $@" | sed 's/eval //' "$@" } # Program vars ScriptPath="$( cd "$(dirname "$0")" ; pwd -P )" Root="$ScriptPath/../" # Manuskript Vars AppName=manuskript Version=$(grep -E "__version__.*\".*\"" "$Root/manuskript/version.py" \ | cut -d\" -f2) # Look for version in manuskript/version AppVersion=${1:-$Version} PkgNumber=${2:-1} PkgVersion=$AppVersion-$PkgNumber Dest="$Root/rpmbuild" echo "### Using package directory: $Dest" echo "### Creating folder structure" echo_do eval "mkdir -p $Dest/{BUILD,RPMS,SOURCES,SPECS,tmp}" echo_do eval "mkdir -p $Dest/RPMS/noarch" echo "### Defining rpm macros" cat <~/.rpmmacros %_topdir %(echo $Dest) %_tmppath %{_topdir}/tmp EOF # Getting manuskript files, by downloading # pushd $Dest/ # wget https://github.com/olivierkes/manuskript/archive/$AppVersion.tar.gz # tar -xvf $AppVersion.tar.gz # rm $AppVersion.tar.gz # popd # Using the current direction as source echo "### Creating tarball folder structure" echo_do eval "mkdir -p $Dest/$AppName-$AppVersion/{usr/share/applications,usr/bin/}" echo "### Copying manuskript content" echo_do eval "rsync -a --exclude=.git --include='*.msk' \ --exclude-from='$Root/.gitignore' \ --exclude=rpmbuild \ --exclude={.codeclimate.yml,.gitignore,.travis.yml} \ $ScriptPath/../ $Dest/$AppName-$AppVersion/usr/share/manuskript" # Note: Files manuskript and manuskript.desktop are same as in Debian echo_do eval "cp $ScriptPath/create_deb/manuskript $Dest/$AppName-$AppVersion/usr/bin/manuskript" echo_do eval "chmod 0755 $Dest/$AppName-$AppVersion/usr/bin/manuskript" echo_do eval "cp $ScriptPath/create_deb/manuskript.desktop \ $Dest/$AppName-$AppVersion/usr/share/applications/manuskript.desktop" echo "### Creating SPECS/manuskript.spec file" echo_do eval "cp $ScriptPath/create_rpm/manuskript.spec \ $Dest/SPECS/manuskript.spec" echo_do eval "sed -i \"s/{AppVersion}/$AppVersion/\" \ $Dest/SPECS/manuskript.spec" echo_do eval "sed -i \"s/{PkgNumber}/$PkgNumber/\" \ $Dest/SPECS/manuskript.spec" echo "### Creating tarball" echo_do eval "tar -C $Dest -cf $Dest/SOURCES/$AppName-$AppVersion.tar.gz \ $AppName-$AppVersion" echo "### Removing temporary tarball directory" echo_do eval "rm -rf $Dest/$AppName-$AppVersion" echo "### Building the RPM package…" echo_do eval "pushd $Dest" echo_do eval "rpmbuild --target=noarch -bb SPECS/manuskript.spec" echo_do eval "popd" echo "### Done" echo "### RPM File: $Dest/RPMS/noarch/$AppName-$PkgVersion.noarch.rpm" manuskript-0.10.0/package/create_rpm/000077500000000000000000000000001354442177200175125ustar00rootroot00000000000000manuskript-0.10.0/package/create_rpm/manuskript.spec000066400000000000000000000030011354442177200225550ustar00rootroot00000000000000# Don't try fancy stuff like debuginfo, which is useless on binary-only # packages. Don't strip binary too # Be sure buildpolicy set to do nothing %define name manuskript %define version {AppVersion} %define release {PkgNumber} %define __spec_install_post %{nil} %define debug_package %{nil} %define __os_install_post %{_dbpath}/brp-compress Summary: Manuskript open source tool for writers Name: %{name} Version: %{version} Release: %{release} License: GPL3+ Group: Applications/Editors BuildArch: noarch BuildRoot: %{_builddir}/%{name}-%{version}-%{release}-root URL: http://www.theologeek.ch/manuskript/ SOURCE0 : %{name}-%{version}.tar.gz Packager: Curtis Gedak Provides: Manuskript Requires: python3, python3-qt5, python3-lxml, zlib, python3-markdown, pandoc %if 0%{?suse_version} # Assume openSUSE # Note - have to build rpm on openSUSE for this to work. Requires: libQt5Svg5, python3-pyenchant %else # Assume Fedora and others Requires: python3-qt5-webkit, qt5-qtsvg, python3-enchant %endif %description Manuskript is an open source tool for writers. It provides a rich environment to help writers create their first draft and then further refine and edit their masterpiece. %prep %setup -q %build # Empty section. %install rm -rf %{buildroot} mkdir -p %{buildroot} # in builddir cp -a * %{buildroot} %clean rm -rf %{buildroot} %files %defattr(-,root,root,-) /usr/bin/manuskript /usr/share/applications/manuskript.desktop /usr/share/manuskript/* %changelog # Empty section. manuskript-0.10.0/package/prepare_linux.sh000077500000000000000000000005501354442177200206050ustar00rootroot00000000000000#!/bin/bash set -ev # display each line executed along with output sudo apt-get -qq update sudo apt-get -qq install python3-pip python3-dev \ build-essential qt5-default libxml2-dev libxslt1-dev \ mesa-utils libgl1-mesa-glx libgl1-mesa-dev pyenv local 3.6.7 python --version easy_install pip pip install pyqt5==5.9 lxml pytest pytest-faulthandler manuskript-0.10.0/package/prepare_osx.sh000077500000000000000000000015361354442177200202640ustar00rootroot00000000000000#!/bin/bash set -ev # display each line executed along with output brew update # Upgrade to python 3.x brew upgrade python brew install enchant brew postinstall python # this installs pip sudo -H pip3 install --upgrade pip setuptools wheel pip3 install pyinstaller PyQt5 lxml pyenchant pytest pytest-faulthandler brew install hunspell # Fooling PyEnchant as described in the wiki. # https://github.com/olivierkes/manuskript/wiki/Package-manuskript-for-OS-X sudo touch /usr/local/share/aspell # # Note that if qt install is terminated by Travis CI then it is likely # building from source instead of pouring from a homebrew bottle. # Fix by choosing lowest osx_image value [1] for xcode that has a # homebrew qt bottle [2]. # [1] https://docs.travis-ci.com/user/reference/osx#os-x-version # [2] https://formulae.brew.sh/formula/qt brew install qt manuskript-0.10.0/resources/000077500000000000000000000000001354442177200160105ustar00rootroot00000000000000manuskript-0.10.0/resources/backgrounds/000077500000000000000000000000001354442177200203125ustar00rootroot00000000000000manuskript-0.10.0/resources/backgrounds/spacedreams.jpg000066400000000000000000021362431354442177200233160ustar00rootroot00000000000000JFIF,,C     C  8  ,` ')^ii iZPSmZTitz]1lO[N@k^(GH>Ftع[= sѓ88`t)+q]=x񆹒i6w7jm2wmѳ쳛mcB]tD 6Jm0V9z:js䯆%齃P2XŎ>Yd^|kPM\ոT;~MI8uT/&AxJ:h|3չs>:<(SQH(jF9jh.Kb O3HڽXK*S q!Ji[F'IJi3S,'I6j&@Wā$<'eX#W"rC42cb+bm rpI:|КI V AYמ VMu}RjKp y.y{cdo>9Ʋ::9vDFu'cqyW-U{R{Y=x[PnU/F'}'tuheJv9'5g6)[y"g.t'neevMw15h6nt^S}3LW9s3-cK贎EB3q4Vx/E\2L`N s;9ЉX&qF\c'C|YJ"*6׃jxa$N,f' TАBPSt5D<-3KqZ>*[`0 %DS !\ ɐ=UXj':V9k\Սn^E&5kVГz{}?s.atqog}Sꞯ'&zJƢ܊'yYLhS~hGiv-:fiohێAi.z|YWKt_i˻4ۡOcnVWpXen uCƮHo7Ԧj 0U;\k,Q˭1v>WcLO|>ct:6,sWNh҉3sͫCv6ŢU:kkI\Ӡ9h Z y=ZQgJk%II4fW:╷ )y,$ *ZGʄlR l-| ߣσ`<Q #B + (LUS!9>UsHj5NkZi1}|9\h2hЫmگ4zkK9/O%~]Nzή9 9=: qǩNg5g-ˣ+ҕgG{` uSVV;[|G+%:K^އK뗣Ҍ׀>}cu,xsĮ):|fzmf:Oe j=+#rcn]g1Yi_Ȝ{:(SSL.[S͋Lbj,TγB5IIib1A*zDckڣ^'O*m׉S}-jo4NZ8V~|JH(f$RsZR!W@N| S~(` zF00X1j xizDP`56_BgZ]] P~?H=+MP91U_==y<}cLVE:ftUtrۙ|ΉlJz8ܺ=s ZUe)kXVӮƜ яH Nn:ȇt]=H^_Vhs*!sn~yϛ9+ey|}<,5~;X>G2::l6YM*B6PVi-R4ڀ Ҙ9qsun1ӑ˞M@# o\tڝye b*B_M$-ȐD`R@L^ny)h^' 1ߖ'x1fDbdSAA]-StML L Gw8JStɠBφգ'Z$>~CJFkˬhڡͱxGK+ =B lր?*\Zp. YRVsz?FwČז%m6ps9gw ۗu[g鶼%cpK}YRdL4kD|Y;z 9x "Yhr5E~,/Uԫ\Yt3|9njsr~#טfУhpsΪpZ1]OralsFcˋ-3,B'8)NQ cLt‚좺^U=fp4R\Ï$m|YI{f[q:{x}gDv]p1Z'y)t 878)4b&$a6k4 x{Ik5,C~ hl! S[F=6 5Or<tGT*=`c/K"(/2tU S<͹WjA[CJ7Ӟl8R :O2UѦՙ8|]yS$o3MG]5)n}D?_Gjk Z*'dm$kFT.^;Zzso=sk>?ޙ9-c/lrjҫq%ȰRƣӟHe^|㍍Ϸ+ .L۪ JDZ%(kS}=J3&dǢ?>gѱKbuaUꜤmTO8nT\O7=cFh ‡3S*pΥ\&rƘ薹Ӌ(ZFbAT%`9"kljXlQoV" x<G`b1X2F`-C"NF2%bd\E:PqnT̩j{cDeTΔtc Z0d3ב91\ZfU:]GI8·:5utb(K@6}-zNrps}=, o\//O?q`GZN.jW@& 矒]|dRV:y9=O\,mgy_7y0asTKqyĦY/1ZhxN>K7,72?-՗M@KɴXU5ni#5^uB"ƠwZ˫Vd'9 k^ !n] `Cj^2})zǓ1iSoN2 [4F/Qњz`2]#e^ZbD=H ,fDDR,7O/ ]u F-nފ}QB\MpNdVXķ2YɤK_BoC5詡I'ͳ Kvu:-Ы2hGXs-sձ|'<e~\2 *kwi=gU*MO|m0ƥ f+P/]6Η؇rrYԙ n>8i22$OIbXƷ;QQEźsK[,`tJFS]ⶪ7mN:SY֤Ӗn|\ڞdfܫ"_Zs6-DrHSi=d  h`:PbZPp1CrA= LŠ"|#Ődxt%@]t*NB\GגFSMS-jJ*$ڀG>mZWEiuu7,mkc;WLxo+i9 u,OQS=O3cYs55"blnkFEW&'^Kz&YNvuleKmFV~J轞K]]3c[yȼ4i(ˠqlmA8Ϣc)'^|yYa[lEEswN})2Zĝsԛ蚵Cz^aRRưZ`I S4FDQ:4^0ѣ !1"Hh֌Q֯ƌFf4hi˭% lK |ݹwTwahϣU1} J'Yfg~pSkyRJ'trW;~Y.VIuӃcfeAMttoD4 ;΋/K9:)}T}=OJ^3|)TkҋS&u]%7ŚNi'ێuFBg6ٔ痦 NJ}銶oyh>T&h S ć7Ԛؒ u+2mK'K7ȪeѦbL!KGƩQue#.'zbsV*iY%#כc)ǖƭt:i}G*unAgJ|zW_g^Ӯ>-baˬ,:H־:ds!q4BiZgӝDR\(\\6jeo4vz碗>6lo685[uv$܄.!'$NH-U\k)OԪ[D{q5bh&-d7xՋ_151SjJ.d*3j dz+`9M2:KhMJS=,P:I&1IXN'.4͆+FI*Wx!Rh8!-1TsG: =Őu35=KR9l`nE]}Z-%vgo5Vv+_uLDdB/F]>~]us{mN="MtzHoNVjZ%6en׉>;b`ߚ8f% &ϣn#JJyh8ܾMrZ4F|k\^V+ffQ\?htӷvΜlz?WGAL|Qf{\:<,tSFPz.QJY<>QDMn|U\o1cT =sg*q %2Oj%A4t/*Z<^zVKixЮȠDKHyB*Yѝ9׀=e:s5 XǪ|ϸ*o:ڙy-;KK"S*ayhy~MBJ3]gAy? cG$"@4hȯ@iHe.dfv=9ÅLKj " Ck&?@zs甾:Fu~= ҃EG#E\_Ie[f:fy-~-94U}v]MS(Մ9p,Ә.m8g~tδ9,o:O*mOV6|Ϗ)Wq;I1k^OF"Qf;UACY:驛KyCfU;# L=q6uz@JTt5K=gtU3^Ƙ{Uo|#ӎtѫ9\]ӵsǼ*%;XY]iOy̓N5iʦ:NܗʪVqqiզ^NDb`0d!mĴ8I~Gml1xá'n Lxd #ԨA 544[2&)GZ28傾 7Ћn)r #zTֈ֒i(Х sGuy:gODz y>ЃHn~WO!}OƜ}rM_xC鯭wRla@Nu-v\rY1Nfrr\u,skZ(+O pH 1qV/KLy,ocRcȸ5N=>yzĶ*SFmYh(l II C.#aff{03^ZiߗWTҌjgbzyu%okQT^k~Oʮ+^Ȭ^o\i=g yN URեΙ搛Z"Mf׈c̒ˤpaN)ƣ G!y<+1Q$dG#X$~>{ts#^m}/z9Xsכ3ߙ5om}9Ѿ]cjQ.:n(7ga)Á+6Sk^u:yq:qRNgiJTѫ]5O=ef:7np&j:Nc[3-ô;򉱴JtD~ !LHe3V.ֱD.Z6\)œe<9Sǧ+_?/i'*$\=i變t\jEov$[p+\#Py45%:e 3&pʀThys,rz"@#Lԍ=:xk^'e QF~#y4)M/}trk̷.x|י Q}'Gsm-WspRE(0}aЩ7]NCMy{-^nu\7g߯8y̝U)ϯsz?St+j+]9qzyA_C~o_^YTSr-Zs+9.RmL9oFHϴIRqV9Ie&9I2$Jzz`S?X.gi$8| lXevv%5E,47N_uyevSɼxIR|o1'U-"q3ˑWLJp9e-e@ q4~{NCHz$:Ԛ~oS`;ULT̓sxJr7:S negsJsrF \nT}'L7?1qNxIC_vMKMuWFf'_K9>+:y=t-9ZgH_AJΆwޯ:)g ؾl 󿙎k2YuUi(ZmK9XtKyA5QbdyOX*8AYb*NT+I4ю'6K}C~nv2-sKnnNt3˒y&uMF߿WSsjVn98C<{;X=1پ2 bEC4vNN0z?aӒʛN7/LgCr*k,w ։CHOSJ7Z"`D1 440n ɵMjUV[>yEꩅ T9$Vm6Nn5v#ES8x;GDC;cUT9vRn*Hoܯ 3.oFN=[Mv|eےʖ6ZMQs+S'sN>Ѿ_~w+-t4|w Rouqh񸭔jւMCS"ҡN|bTn#T ̩"eU8å&±~ݾ5e?1К6jVyMh13ܑtPظ3i5S}̺{Yu.-JkÑ4hs~<}]/^WξdV~ODv-+vd"6ʧ7ӟ==ןz=-%YkO-ab7e#xi6tANU\%8$l[󪳪slzſc놇;.ç:|F%قljwP>wN 3\l (+@mZJs9uU z]7.>.C:6eܝϣĬLѤSy[͜ pʏ[GeԎHUFy6<Ӥsh0=署gĵ͵TD"Ҕ.R==Hrnyy6BǗx2b20s;yT^ƴFr-m7>ytFC̙_2;RR3-rqE}}t.Fybuj֩tei}1 ⚝+1t̋LzH rlkVF6l趕Yx]fR!.G&2abMTP4<6:l_{Y(se 1!$ ۑnOb\3}]NJl'xԜ˩zhGjrlgrފݣΞs6mEk[G3.WxMYѳud9tf]Fuvf]|F%W߷بr%|glиe*HA󃇞NˤV}G DDUJ:_|octiJr})k>v;͙KZ'ij#2낔찚fo73ΆiM]Ciw}?;я9f+qc|}_KyWeѽf}4,R<<"cM[e}z=T_'&Lo.}tN-Zhr -:ystcS]3nd6j rh h6hp].8ѭ/Rl*!1ьrHb [&-?eV51}6|n+k1Vا#%4.9lڔUŬ3H(ơ_;ҟ'*] zۢq%&to:V nZ9]7Zs֎^7o'sΎ6.yn9_)x4trW9?zf.8U[3+yubϣ8.ϵ#-9Y违˷fau3Ǐ^!fj)[̤Z^f Vɠb\6n͠T}#LԘjm} gK-Jdr֙[{.N#gK:<_,Hi:uiZ( ;R+L|+Wc=Xz lWǼ~sn hiru]'+{һBsˮ:v@d֏5dZskd%m4+]ђx Pvߎ{hEcͩYT;$(Ɖcyrͨƾj>khU+ d9-zcЍ:L^Z9S8ێ~.n~kZ=,vҨ%Nx)/q>5ϽsLw\y<4߉up,w}_9p~yfDsw˹/y_>RugMCbOC|t5.Ӣ=iWg39%x@f嬥`@Q9uh3T[i],RL5YXnte 7;Ft6%G qS^Nh5<{w9ѦW~]M|7#;RдEqC7z=y8)gyrG2ߞ6jӋXpo[^ sV [Q8ErԃKy=kV{iG:fk^BFt_KFM<2#eRM҉27eMIKUL;:S.LϙU^s=aCqirzyt9Yr> 1qwAKFC:m.;t*]5Pfvr-?>F)ײVcS%gʑT}7otG#G鑧c./͎6;\H]06|+gK] VT&k鞧^";|\͑3%Ĺ缑9(!5^S *uri%Q%u5oCQ6#5N5u1g=6tbNtrw4˫C|ܧ|0!z_g.{>ul}v'bk|*OeύxO?jfbMR~eۑMxv_=1EnH[Qk+"C_Z!#Û24 F71(E2VJ0LSӤfsueAi}QWgK/̞lmӝ:FW?Wygڷ㍦<?NSWk\?+Ym8Uf"gMNj%i)xnG8cV8kn)&Q.(HON7l PI6M69܋ D^z]b4MtK(Sq҈tkh-8XWK1rJ u/yyŷlS:j׏xq:oMPZR]tSwrtz6)ܲ*ϯ= ӏ9yW~.ͼVZvs}f*yJ\t^KLjr*kcxVN *I EZOS,d3 9׏2&=#ѷ^GTcKL&r Gΐʩ惛iҚ+jz+lnwgƹ5IK贤4VuڥYq9ہs3~1jM>::z>w|=(ߡd?qt]V-|iȼxWӟxsuʟS9'FK5^sVKQXͿ.3r VyYH=-B?c ҨW ^Au.gdfBbd,[œJU;ln1Mec?ɽ49zhv#3C#GЬ %Ӛ3Քu̔dWN4ɥ緲=QK\✷?o?3g?gs31}CGz9]ϦgՠwWZzWM|{LyqN&+/!P5)/ Y;r϶k/,qc:=IPCbdU)crjwiwI`T閤J&YmbH}N=~^\ߘ]|o%jy\~N:Eƚ_WDt; Gu̕ɕ":km]U6U-'={'tǮ]U{Y#x{!_Ae[qIl)˹ۜ#&Ӟk?ONGw;uV|.rɪof;9в>"scYA:q|DgtWdu;NK잕A:~ /z+Nk~"+U5&oY9be\ZJo=qig=sxVּ}ZoԍESW98fޕDIS)L <)åM hܵOѠc(;HG|$2 ^ZюJ:vnO7W-ߣZ]8̫[\)/|##*\2Jcmuf/N\Z7WϬ?gG7;~.SO]}2Us_U|fG jͳ9,^uyBtEy>}\574ϜW[UӚ\uC+8^ 3\+s̈́jm*YslJiϏP7%姟HL.( :_7BGюΔ;r{jVPRp.Itõ;Z@drvm|}UMX;yy|^TT}/z_Bj,W^Nw*k?׋2" 0ayz%Jw<c}›:Np=axͷ5JrŅVZz29: 5L$ë~&H[40M1X+|\ʭR3lq\*tMߏEa>ց`6n벝5ZD&S1xߦϷǩubקwAf.oGr>:'Tu\ˣ8^~w5umsHV]}9sa]o|?DVOܣxnF]^{睋T8eCzwMlyNt67/^rU=3rҽpy{ʸ^6>Vub.G:?> ,EԁϬX;]}5a:j5WOI'h Lbxփf2OU:[`\l^4MGj%9egVF:E?mlJj1ls;K|::&9cߝZK^ߠkPjweѻOOWLӯK>dwN;q8cs)xq%j)s.TNjUDuVIW&gobuڴE%^y$͆|Nm@S>>uTfD éyM3KNA,R54X0^zmO iڲ <]ʦ*ˊʜ/4IJ-rv0t#UBFҹӊ K-iS MJ}sK}7G!0Dk|%D4-9"'UY@i%$'tVBӠ.|^a/ kLt4"TS $ܨf=CI`MFd''Q4T&gܻO-}6kqh.'sW&t4n z[l]T gߚõt^h v˽ݯ3װk'8͙O-?}]+֜Y||z,3r}3mGcKDrE[kܩךm7n+bt,_::kNrM3R4!%s NofJ8\ %51i6]r晱]aQszkA?&ҌjBVtf*k&gC[u'uľyu&ö 3nxC:J#N7}_1{O-5"לrES^2r^kȊm0E*yO 4ta&IVZFј Ah9KjW-xl4rU#=Q Չڥaߵ5rVաS&zK]-(6MV^5k;]詫|>^֕( T[Hr_CsۭbH[UfSԜD]cYL.Xw9\ ˽3|]|Hߦ0~|.d,^uѹu2)x.y@B}8q=c目r+L}1mp%JFĖ\rJ 3F[MyWKUp]sJ&DˡSLץi5*NCחNf֞mй#yv1h`sSrFWr{Q_ڝ^Yy9j$Ӟ-y"Ӟ]9xOxKR4F*ULҫ! d[V[|-$7Eb-*J|MP* Z`mڦ iT ]z֗Q] EUsƝ䪑;Ϊ]3f[)E:=c6u6:'˚LmvԥNZb9lYGIRÛ4928_Ye]y?QaWJy3>ХʝoIEi. zz.Oa>ӗCL7~+4罾P&Iq.]C)VνsO 1>>ViQbu̮EKR5(N7Q >E̞*YDu1+vNhouךm93Lү0!.fVtGf /~|j̵W'VhޛҘBvJs *ɉ=.P4zҮ[Kҽ&9C6I<*N-;uYmԢs}s>k|ʟ:5Ri1\e6hKC=V {SU7_C=iR[Vc ԽiW].7׌zs`\xyG/5LfݗV<]-1j#gL30|jVO?GGtc/"B 3oKosoL_5\|gFSs84izM,rŧ??^X枳5u fpL>4B8֌ (J',M`57mJ}Y"$X&ʎf}ŵRn<15M@i2mZWN"xhF4|KRin2 E.t*n~:l깆Fl٤:Wqä"gK9a9sr摝$ׯ$*nSմ|J/bugBJ6Qe[6C^%w<,JLtg$!vǘRN*^sEC)W! *yWW~i\t7>{TzS9+QQBu9N{ήFQv}_?luusP뗘E:x/GB5J$cz]X8mĬYEyKb/v^y^Xvo&inA\cK]>םNWYxixp ~ @EIP b4ܛZUӣ^ 6 "/; hZE ڇ#Zb) [H9{^Ay5Z;-oȩ^%TQҖ-עWf6[ =s?#vxn]nޭ֥]ѭraYw;]|F|V&5חC'ʮDkNlΟI|Myu*ҏ.Ũ16pi" s~1g/ZNje.v˝45x2as )m.e, D6jYMU>Nz}'nK0D]m{`ut#~}?)מŽug+>pj3;|2]~EGxߟ_O0:g5SZ玳COk$zϦ<ۖSxn8|^(3j 1f`* >~=(x3cU"2MЕK'Mט+7#Y,:CUn˒{]:*X mN5~{1tuR `ܦQs-unAۘ'kIr]i'TK"25K賩b#כJ.e}Xnz;Y{,ϧs 9Jӯxi4I %*tedzrM?/xg%:ϕջ'!-s:#}9,ۉk̻ 4y iMٟtg49KAFov̶>􏱊Zy[6-Yz$%~IiXc)+Yk[iΜ0S*\<9̓eb=qwu]kOxCyQTyyߒm9sA$sLۊ+SqMRizfLn]8.W+lpp>=֊Q5&'dRjyjTu %[(LB_YXUb~z-ZZ9CΕJo>RUH-x+ԼvIY^ճOa6-nUY*弬tۓZs6ϩcoAcgfכ4O<6k; $NO?GFr+Jo'g'a9;0D&jU>6f!ٜj$Z⴯yx{cysͼ3:NZڝ]91^#Vԩ.'O2'͔QY-ANittt'tr4༎5:uk*wdv:xcӖ>/J0^Zt>OS1: &Vln hZqů4s\eߓ%itɊDiH/5$82_F^nU}uqN||~v{ß_M~ΜD֙-P/clI癓2K.~VWuc:X}Ϳem+)Uwg~cS'WIgOq:9u|e}n= n'mrWpדyTyΆs2y=oʾnn4g )G*΄kM#|2穕LZ7-i: U9d4*07b['g-gYLb*u3y1%aɬξ~4nO= ;~z;[cJ֋W} U.Pgdʪ6+>59_G.޻icżL0X\VRo(Ǔ{s+^`ۚ>hH8USJ6իz OIt\l/4u#Ԋaܵ6/62X*XĕnZH9xMSSj;OsțږQM{e_Dum,'iC^Z̽ZcthkׇI<_=c-WNRΌ:}8MNEbϴV|ߝ*\w{>3'T=m|?]:W8qRy/ہOϢZ79R^*Q9eF2DLל)k|PD2ZkS/9 k0KBS&ZA/4yƸ'yy-NU\m^'3WtnƊj OW'+=y\|hGRճszuξS#칽/ҭ>R}yz&Lխç*]9U;s}|9^ WgK]6OCΗ-1;Ի__sl/ǥ`~ jUMV&T`H`#ٶM̀RޮR4U8JDꙥ'>@5LMBMHW=]3I:7jh7uT=tsA:t|iѴoFOw5{(gӞO\)M:Wf| 2Ӄ]Ҽi.t:AÎ>7+;ࠎ_4Yy?.C/mBk?`3R,Ѧ0BM.v7MG_cL.{e 2sj柮j zMbgyRj}@Ŕg{,e̤\d=<9XtRF/RiNˊdP6R=QSOAt~Vb\:qǟ=ƜyQ5O|ܼnN.ghCqT ɩ%Lz=F oP+$ h*MLI< $'&@łM=?әMNG6(Y)05%gKW3tҚZV}yנNc*Cx5ҘPn;wy{ͯ9ԭ$[1qdN諀Lg_ʨlak/g_arGz>C}yՓosXm\&ͼe:6١d{s0^(UՠF{:z5t̘CYJz9ЃHBDN9)mMkJZ&vיYTdžR9zK>N.7wϷJ8no] ,UÞgBSGr4ށMYxKYxJ\Z"!E)5IEHc4 bW孱=c&OrE([5ӛ=nzvwV*)jR4|wHei#l5:ֵmԎוXO:0>ONJ&kǹ_]WmμxI#eӖ=2:NeVձE(SU>t;W6_;P[τј5*Ih 1m@4gV7tpRByT|\6\xEJvGG- 6*ӱ^څmw7=5ֵ\<}~}Wã!Ykr'2z)vZQofrSrN3pspL\>{3Wӭ~YJyx>apӧȻl>_ S 9'9^xFmՇ.#ItLgqsSOqH3&ntphY^2Fli" Ӗ٪flIU!Fc=ӖĞ+:PRyRcnrlBg^}VO7NhԳc҄+OxߡϱfHyRV|rxNWߊ=0 m+OzQ dwGqkV>f%0ʓpbnA RIH.m9왶TU@ukk7Ba<#t:F(*)X_Iׯv-_hBP;#"62_8VNmlꭰo2eL辮Ҩ*sNzDBovv먋FgV99Kvqj:O~De\'oY}f@^|L4αiNYW?=d\"3}fn5J*ƃ:6zN6(sXU*K2-*lFunkarbZ1:Ts7?:5Z^镗/'JuQL!JTҼUL^e59s^V 3nW.̝QݬDVSCzۇo S>u14fbuڒBJ4)uC 5LHSj!i7&=11z ^'5/F+b:3i曘4]fMgڜc24iu}Oy;p/LNf ӑ~g ]ç*lX478OOFWuLR)Wy<ч5,Ri26*$xzMf&'5U%꩝t6 @aL45nZuOedܞOwўս~ttF]=Ssz˵ ߗƭQҲr!thZ=>N+0&8uܷgFg_7}&+bʸϜ{4uke+ڼp֊p9yU,k+qgtJ&3T f㬹)+HgJ9X ΕJꁕ#\"BʕeF"PRٹRM(SYSC>zf9ic8=ˤDaIQ:g.ί}oiqk̼׊ _~g2"yND c~k!*:^5=.!3^."I 0փК fѡIk 44F;Rt sp 7s*KR85S֖M mȫ^wNI֔ꛪ\ovݲY#de?'o'ivUc©$xHn{aDsճo #diLWϦ7OiC˰~U>mH9eg\umַ^Jr:\Q[wz;5Z]99[QoW>iU巭Zk.g;u TD1֑He4a4f"[dՓMT'TTwV}+307PÞ牷,Ww3h3--nҺX N{Iz >+&h+2hU#Z\и\wtltNitK&מdJӨK՗cbq|jLKY}ts|կg=lӟ7N;sQZ|o>s\Œޓ$d0,qn}#q05<9_fi%Wb Bg-J'G[r *p4x!05xS2ZMh=;l);=MnW@:)XX܀獯,󾕥'J 5V׺itk+rg?t~'6%pmOy%aGtzr5o hf.BxM99Ձ•~ySFzys%(ѱC7|bbH 6RMYrr)^M,E9fmMDM162eto?1Vs<Y]y: :raTF^)2$KxK\@uϝޚNT7Ǿi/k>ܪL4ט8D ݋J]-ߍZ5|9&дkQO>3steA[.ٺI=o: TYEg"(iǎ*G<:ѷrztInȮ("\Qe\ML*ebIq=H&Ύ]y-}5\ԀZ6g_JQkɴ'v٦Ns0Z[Yش^8^nvtνN/~}Gc]uG^.n\x9rA,S#OK2tnnzl( - gzCɐy= Tj=gWD*ɏ)SU2ttM0*d o' VGE4eNZTst;)3x3Ҫ͚`XU=啋z8u4̚&(J5QDjޓg=nWVJ*k*R[P,i0->s~^9Y9g6JZ2-nhGQ[2ҤdZvoN}Nuv05f Ȃ"ZN9 N`#BZ|hs( 2?0ɐj~^#5ꙪL4$4 j` SȍapsצSؠ@ QGF7MlɳOI)<]<"ێ'ӗEy_S1t x"^Nfi&txS <&J.*uu]2LVTO $ 4<x)M)-(qy=o2s΀hMO1iOG]TUKׯ,&t-:C[?1N?W+T;IUkrw[G-t.HҙKDTQWOKV#|"+!oEmd4<RtVry}=3RJHesB(!՞Ʒr !{A3V "|mIdh٤,ȩeK&5ΥƖEh1uMSnf%cR9J^Hc'"-t6H9 jBV3jCVld]ZJ23t63~c-H/?nos7_; >ӛvi͸ӗ=X^\'BEjBH[XǂͳKb!X?# $7 \UDXCS`43K;XV2rz<}p}.vrւh=qʛ4΁fIۦ\l;OVExҫT5kq5?&:`*DYSit;kJTڍ38:ztZ{P҉V}#%sr7XmmOq9x񜕎<&ɧEeuT6jj-%cбٙhbs!º:hϣI–߅x\ZШIH\FUE -)5hEJtוPn kb&F#OCgwߌny|^.xx=w8Qeoϋ Zeӓ7'\p6c%50R+2TSI^kwNGw>"1k@AhjNx3IA +bѵwx.q4ǪEWs FY_-[QqҾ?_T/Lǘק.2&>V@gܚFק>M㱪¨k-gnX םQm6rZF.3甆PL:5^ZMsdQszul譹ysRIC+PJC\YSĤ6M. c:lҒYY|;U- Y)yBaAΧM˟\+ff 隦ĕS@ΞLlAs^mg;ns]54v2=:G,^rۛdl1F^;yl~S5ɛsKˡ\VVk a6if%%G`"7LkfdVRVjκ_\^z 9ku]~rC>c| ū=&Dgu:+\3\;-r 祓H:,h@f3=ڙLF1PN3FI,b+YN] n]Q{DĒR@S\ 5i+Lc٩n_~Ηcc\_C>ON׋SqiRe-)P HaIy,`D%Ƨ=Z[5uTX")nLǁ0T 6 To+YTMUb-\[PՋk˰;csoו`=5w>PsVq,vi+1'דjy6M8@ȫ@1h쎍V -Ⲩɾi ,Ix\)b:1v< t6XGr2oϯJ_~sSM[{\=_ҙӞgy49;dLu.Upx^* @BB啞 j khєוHV^5T1יGuUySTdRmbaZ80%x\J Vtas1eM&W;˖n-!Y5QZ} Ur4 R%r L(MX<aR]=j;:Xyo6iFevҖdPMP1tmCTJNLN^B MIPyBd,W5cf5JFxX`{WGRQi2iLDBI4פdټE:ʱ y}od}|z+^4FZMxcHzstW@B-ǝ=_?a8@W|0b昨\X-RV-OʘY8tSV}ãg+VUսlnYt nϓ2D7>Ƒq B0mMѺl&h[2Q9;LZ+n66ST\&h_FcRjR)LVBE ד}so5cr(O/8h:ZԲ,^eBsf5oΙ(bU'LZK](gQTs^IF˭UgkR*4<JĪ&FnmM%C: O VɌcFv=-T3pg/IԽ@g\.^LF9o(TƵF4r_(0YvjGw?矒Ť@Izt?G [<אc#F!L5TR69rmHTTq[[uu=Vi6Y:c cjm S Ͽxߤ@燖] {!>;k8jJY0m湱Pif96T+^rTIc^c5UN3D&'](Ʊ^z:c$Q`E5$?&Azn!͝O4SyܶB J W҆RĪJ1ڪɭ5r b$7P+أJ)ySPj:pM4j̪mHQ[5#^iN Y-Uڳ~b&3 ͪp9_ ōuYq-Ŧ+D&v7KIتaW4e3ѓv:pRZV5(ٍI0IO9y UCP//&h\骰1JzEѪmk+Q:~`R[Mkbz yj%:/&h? Gd h& rؚ,cҼ6gCz.Ϳi|/Cz)«mDyOܟW:p-{?@"6hꦵϐSm8!sV3rƁ/;=+(k,;Ƅ=q*%udǙr4B/=^5noS /$Cӟ.h0QE(2"oHLOIkG i鱲9V\j9Tą|D#rnt2i.kӜSB yoɱQD%buX$&ElI%M5<:N9qN%Pt2au6~ iNf+%VFNӕO9y"9 2<(<j~ G!0zɁ. %'*5=]MQ3]!ΧYWJs(u'LZ:М73l{H-sUsW|Ӓlm#5A o3G:n=jrYqԹkXjFl'> k!MRmff}+.iaևK=\5g|z$ʊ.¼ΖmӣOE6tqLäk8v|ѹVZ k\^aYCv3OOe1"iNy[C-JgqІ C45]g8FFѮ5i'tnY5( zElVl܈بZi-J꧷j{.KL%I=UH]4ƾf^^*E2'hR`FM)܎|wCB-THUjvmȝ#K$^NVٮ],> )8J3NDVis=g?3\I[^*$|QVOF45?+ $F|ZP<*PxHy-)S5.CLh]Yק֨џP+Һt缤8Q{\ov>w?m7 qK\t]>դd}pMvnM0zd~y$=Y~%m!^mykiSthAnrюϼdY摔֌Zˮhg8$n9qXK=fΘnj*z=ofPw!檚5mCyT\u-MQmLh-m:և:1Ƹ@*N%BcGΎTSsPh y s2u#2ZeŧF7i|yrG`MUDtP٫n$W<WXkIy҆Myhekg&DM3>_@Uᐴ$@ jtS41Rg@.5 FmsK[TӢJ]ZN+; NeӷSV*犼~s ޢ=衹^[n7Jf7s˝4L|#K1'DЅ9Y2HrT-cFV|z&yLE)epT&QEzE):桩SSEɖ磜צ,֨HfJ%诗я^HrfS1Wc- ~16P.!7О:QoKV 9xN]$Z|ib(s~TȥƧ3N6ӯH3"k-ඖGRZls'ENή+4U4<\. Pς*'Zkɮ-z2U!&&h5B|&BHZjD8):~wsUM#:T˛^aS1?/_5zr.5dԼSOhʲp.vZdr5+}9,}rꗫtޤ3dV^9Ň-]p䊜Ut`ڏM|5-|Y2j+Vz.uVz +T9RfZ?Mě-3[ZO4ͩ*TF.R7G4un]:8ɬش`0z"% $Ap ƭ _N7C$=4tIFOϽUitK:Ъ"дc@=tyi-%5-YWk,^xf!$hiXqJSOW4$RK\9 `2C+0et;aUٸQco5hA./|~\zZ/2vf4pS"nGHkuFHemyI&c(o0ӑѫL+L]fz3qG"ASK`jp6i%5:Sm[LH҅XɎ.Iv; Q0NM-a̝IZ-W σk-Aώo-:utS[;ӟmzG|'ӎ*+9>3O A⬸lSr 4*$qpIjZs* ŗ^@NɻX i? "m>tY\s3Tk3CiWh*;稇x?=2@LPLn.dM50 4韕{=:kdHT!ôī%*Tn:=fN@4g}r%6O:* דty|̍DFq8oM5jajxZ2gg‘|rN:KxBO0i=3Y&&h!F&0&5`3y0 gx1$:A"+%pE1y[;.z掹[9:zRImGm)]sjDU#ʖEFKn …Z`5j0(VN $NyI@z Iח M>iPE4ʊhίNYts|FZP⺙ e:tc`ە7hb`&o:5D tQD:ӮzoKPߞsH)V@M8kSu7Vk[iO yVΝT[Kpqԋ5x+7ƏE`D4b k-ZEM*5VғExX)lWj}_ӗ>KBwZ++\YX B zfp啐H6xLP5@֧B]iӇ%ׇԃrz` b,M"oP5 +2yTI=-k\|74>zOrpNEEz(idOgiy*}N#33|e 5%IL(JtTơ95^,Zi[Uَj;u\I8ʗo.I_/;QL\uɦiϸ ک7NX$FB+zR+n{4L$hO9\) j!zz*@Bk`s`%Z$N^EWDTj-8zʋjx*wn}Zn?Kbϳq z|y'e5 jT7BZ>6 `6t^ɖ%< ^zүF#}VLhk!Mn0(@ȳNTM%ތ.ӛЅFjviŞLyT9n |wPԗ45 y.{0/1e]Έx?yYRuƌ՞:iRg0~9DS'MoIjMFi /6տ$_?ũ-M6 |Z:]O'7NIx檝k0'a⧙-W0e"%4X</WD@@B02H44MZT[LBXč,2 晻A5Ѳz-:} -O3f{W_G sN:~bR6bԕPM96 j/mWV^p]jr=QHIIrT5:72_>RXT-šӜcJmMeS63kCs&[ÞTL [DF4a be+ѢLiDiURMClW 1WDQLfsx4OCт+ӯ|tS:LRU5MPfXETѬ6tr'։lvPo:Us 4 ,Nz"+^"zصVX%Fkk'BhfK CFH4^ 6!hE9CLcuЎOAV>Kl9tlkCT<}۟Gb{>=Jʹiގ|?yZFKBLp8H` 7Yyˊ)ʴ< sATξۍ:y*Ǩ[ԩzs`- *Rd~&-Bkj'\w^v:F'= Mj0CH@m7μj8Ճ\o?TJ)=:D`ܮޕhq'XB!x ?ּVw|ӊL4DcMTjf7ОJz$ftwo+bҢ:bbo-9\~B(0;>w ^?'7 )#$ RnTZ{ j VtIBT:Өcc5ϢWS=:~37_G>#zkoy==]cma8$ԜVNrN|V+qG4B&x3ϐssihP慬,OHU\Qx.܉@C$"X@.j,9f1f-Hĸf7 JiYl"~"}. #=)ǥs<| ѽE.me P M+yVٳAUYAXgZsʏ=gUdJSSʬ#i`~t_"+5Un)L욚xZf%-NHZ&T!fpbj XDA%62's[aѹ7D%.ܵ;]EEth̺-KyzY1u}"륯_o9n4moU@@&cQ JEԯX(*LN A "'hUʖ*Ue#.YkT6ŬIMo \#u徹cΦ0MQgpU Lӣ h% م֭%jZfzOP1b{R%=;M,| `ܗz#iҘ=-l%_V_' k$Uz:D<^NGyRs`ড়>"@$T3b.AnKހUhjWk" # h4<-IX!r %Zfz]/ӵ귷%_CBo-{t_:?BՋ* M%؝ss@o4M'V(\]xR*;4D]=8ch\V9!hh?xXGRK BJa"&^WP.Qk^}3=CևFMy,>?GgۯeCqM^^WACsq~-YoǪ-VsfjSꀚf:+ r VZPkB\QNSSNĔUQּۣZzxc!Ǡ8ܸ8)ZgO uBThWö-yE e yRcS#X2lRMjU=]o/œP$jQYy)c5zRCӢ^nr05DU5W2ᤐ´Pj[* <[MYy=Z=e-tOQΞ)dxd#kDthhaOBPK]3 [tNr̛]7>o!4=5kUʖ9evSrCt(gWgG'7Mi1824|kD"$=,B]v{t>oϫ]=;Д|/OjsO2rsnIljh0y h9: BP#XH"PFjcsBW?W:j5$k/M3AZhy?ik.Y OšN88vgKT H8R;>I-\#?ˠ#n}= .z}+/ lisSFԒ m@^ 1PXfմf+ɬZ'bp*0~MIkT:s15j~gɷ*xI%s*MsgqȜ6h!OHX)P4Qe$ ~cYQC%DHYiZ֖&twR2Kts0:6gb΄Ph $SZNOW׫SZ!V^pe ,ϺzMW5NϣcWN gKY.93DitӟOO.ѝI>orɂdUbc%fVPĜsbFŏ5B"hY%gRǜ+L2gV(Mӡ+]!pɕB2a([~WMܱXiVOX^";3]L11t(jnթs4PlV::1݉Ix'F(ȶN)H!枡81),2т+gThiEfYtW:e\/Mz&JU(<:ܽ9gj:UZ OqS0~TUPM%Sbr**g sMyDt Zj *!]Ozˆ-y hX'-$ţADF$T,d9&=T6 \)^dFQKo!E`FD CUҳgKa1dVW5/:徙uUη s3[BW$ix svhqI5<]JpF͝ &z[-H~#FI'T:a`UՈ b!fEj~ CxHS)ҚK,hUNLs-+(ˣ;oj~'=hZu'N?B1j _6Q!>mq*kiZHh=L9e%[GP59Y:-œ`j±%5__fq \GwtkisU ^r Ơѐ2"a*u:Z}*)qZ X)tAל55G%c $S@TI-99[O-f6m3jIN Z]e<#z*M+wAᚫ5<[YWة!_5&n|!6vO1ִ2|j?b"ٍr(Ke ``hIRNCP+UZoQ3k&@:>16[ 3&bH~4~u@'FhdjdX[q=4 y1*MAy97I^;F@ qƪEs63^$h4D pRMRb4iT HZ󇦊eWdH)&e7LδY 4$Ş mTVri*O<.wE֋ұIhr|x `#Sf ㇤؅SX6Xg0T  R< TbބO!u" %U KƥNIMGaj-dz+g#Mi+Gk>'F{fg%s|޾~vS_6~~s^*JfTb0o^~ 'Hi +& 4ɕYN&`,* '[J1UF+/\q}Vy*)LUi'ĭDžp%/1G=-@y^,UT݋1|&*4PRT⯒0hhhR[+g$`x4מuħ'J*CcqzЪ@8AYVWkTٯ9=J-V:4͒}sLtQ^)qY4':臙8ֵΞ,Z,rɿ"ZfFo38ӆx1 sOr<4CI"q*?&$Ź4[!fikͺ1S)LfMH)F&Ыezt%€q$)Q xjBן]9BYyZJqi r~AاUj5=*$Vz %P_w;EI,$٤ MQ\GiZrqPUiUJnF)-kJh,=/|k9WUg~DU)_-л\n4EQY c5eJXF'cuhܜA4:a&9~78՞'*Z^05MUF?Xf֠&%ГDyH =q8C!kd% @Zڜ(mtMuZH%:IPOF\k Ǩy$N&| + =*#u[ChZh"f)hA @ֆV>e^mL"HIqMUkkx#$ i: ̇JRFDy蚔8&9Z6ajb:Ec6:n/n#r3A}&Ϣz˦ׅ|޸N^}#'eEe^QT還j~X'4:j'Kɨ `x@6@0ނ@bli5@ UEd9YMa=5|ާyY6kԄYR.Aȹ€5=L~iO<Q %`^ 9=5P®r5gI9 c@Ί4ؿNhqEP nSRUyh"jh.ew"\fƛ7SX PIc&bjwMfcLHܟu⥇IXI&#1515SJn:5B:IiZsRV[xЩ ̪2vun]2j˹|":-TNY]au`jB4>n]h(Tà(kU.tcVL Jq[S `F4NKU`T1k=rdJVzf5B$ӟ9Wl$WE*&N6U-yP hh+/y;GlǦuVn|*PV1W65 @2ȣyLe[5U !+Q4+&iA.yLac'-4Kd&6@,4S xZ6nu4\OyDICX+3[ORuaNL{iTd1}.oqC;h","P5ijdH*tжO0h,0iஉkD=lU>@$Jњ<׋5M10I3v*&Zؑщc059ƦڦI՚SDC֖ ZX5pb`[p$ҺO;|w+:WnX33obӷ/BNNGW/E4' [XS+rim T\p}-m3oime账jVYuOyFf=tP 5Þ~rּ0T@/8RU6>$Y W=,'U.UfcȜTʅ^yKԲ.jW5t0+g|lznU_7E5VCD-uf KNU:kV,:KDLθe(n[=| Mc=bt^(A|ж:t2*\OjUtsy=&k揯`4P@mbļTf\kU"oB cR44V3ҕr;dw\GG2:jq2cRVK7d}dӟ8qp=4FZ<1wIO4Rxs  yVU^ ӕ"C@"U#MQ3Uڍ$I 0 rIrNYr)myDZK5p>sg_?z1surӛ:C'od՜&XBg ^Mi*Xgَ)^/Z֦X2' y+P<%-m8H,FitqT Sʅ5^0~FyɓKIS}yHtk}v;:^~O5Ǜ3tzNZ"{OGɦQ"cE6"@*4;K#^s7=%.^,P=Q6B㞩*b/Mَ| IlR")gY%Q1F5ƸpVɰ) *Rzг`4i64teo<>yz)W'?ٜ},ʣ}6{nL -_hC ,*X\taD536@!rxKh\k%.O|u:׊{yГ'I1f~'MS5i|sO3EХC`1imY$9X5=s;KPZy Xb^vVv8+!%V|7?K<B:,ϯڌr {EONSCI\m8sk-2MR8&((&sP@r2'&10^*&hd'.mcƖUPY N!TBh$x-%Rj+F&b¼ h c)eś*+ŞG;/\wtWB L2tR,MY(^6"$ )MT2P&>_;o6kI[v#xidM1g5JtIx*ޞ2|)")r!Vb ,wS7Sŕ΅[`#ɒ]E:|ms1ֳ])+Z-g2V=\bWc:^M nzUdS!x+2 U:VWc4@@+i,e9*T4|94bk58&<H)MPAJ59Y$uC܄U cX<_r=HVh]YWv;ȹ̴ɴܳaK38VK1[K爦 W_Y eфDR֊`80r/V .D*t/  UV4\l S uֆY^oueM1QtǞ1U*0P\$+8LH%CQCG8VJ؞Z@ hZ̄" @Bм7ΌW l49Xek$_0/QB#CZMQJMA"N~~jHjk)5YיhSH2aK]dKjd:J'p:3P5PMȴ 5Di)ȹbkZE5JT rsd/0 mA*m=\11>~=F-*tI3D5fffFŚǞblCCՉ%T:3^LwU44,XC&΀" $1UJok>Jdd9U (t %#Ys6\j MjjRb{㤤GBW4KV8ti\n:%V8UZv]2;@]YvleYfmUB~'ю`BXd5XHy!iƼ"ǭyt+UP-<4cTEMmDSDcR.W<.J5Hh0@CXb^4bmFze8uqz`*gd峳$-PZA(i=$~2gZ tP%hN`ҫ$Sqp@?3|P)u^8׋%G/NDsOx7%BM4V PԞ)0٢.f[4^T)k3kT)sC.RJJ 6tjQ:_:ק,L`Fް(Ss5QL uR@,(9Go/!ⲲXWK<^{Y )e6-h_E6`vv 4,TdiTB*TA$4kǭ5D̴JpD hZ&jzfٍ^ gDBfrFΆ\& 4)PxzǑ9qsԈĥ՟!r M`RX2%kk13ђ~L P:N&}9*jm%ORԘ&!hEe~F q?By5c+EHq} t ݂=#|r!E,'\ӘLy7>F:iU3JqDlZ%4Wlu+%8N\ܒjVܯ ֨ZX.RY;'& p*bBaqbҊAgcFbڀsK*jk`/!h@'!Sa ׿O< su鑼(R6لN IC -쌱<lC+k&n-dCj5`FLF^GX4dhh)yy No=^$H[[- ,\`S/Hpe= xi*jV.KlQM`r^ԀR42Hj8rN &:PNt(銡Dѧ.ѮVr \;v"S=s)΁:Ш f}NTKFF/W%g1;+`5=T@)6CShNRb rNL [LKBG%8Hvť([0Y`S5J"@2e/7cZc)s=2$iV%eMSZĺ2tlAdg4/g2q VbR#]Zn3Z:yI7P7шک$ͬKZ`@4?+LlVf/1|eKG)@)lMcj'gLx~M0z,AKeJ5e,b)j }DveKqgu[~J^돧c޾AZ ;z5G)]rj˺DZ7+mtqx˲fO8[{XvJIa4Q?\1,E;P&JCѵP9=@-ǣƃ5jUЯjz ƨa *n&)c<(PڀFVޘUX :`;YZB7p4}^4׹c7V>rq3;L[~3spk&54 &ݛ.59 fʰ>zMS1X.FbX('-^d=?+2(S$ܗ?-&9N %mM6R[i FVJSbQ-7sRzm>n9OB qfihfi7YVע&fdT} p`˽j)BJŖrW^S"Uf5[5)# f5\=k7&1@j]i.yZ V:Ak9:7e,/kE^Z0R*r%QO$^exք!'1:^*<*$.G5KV".xw]l")8U5P,떣#69'\]! !ڕ1DgVprGFUUX j S=B!SBqaX80u`3:pÿm5>{q)& bA>nI u7Zr'Vc]]jm9 ]0i~6ıf/z5+GER1bԻjuS[~ՈYC7鹋G3NF*yԤlCY}V\j%x+b77$=eKe$E&U#@q;6 Ʈ)g7dZp#N>i֫+QamR/gb ,VcVkضE ~\FMCW%+Hf& v3ã RerL0_XNjWֻcU\իFhDj)45C?D EO~HIK&E8~븭j)D_1\6~2B+7"*26 v&VҌq NU)^b#\gkG(b\%acx1З) ' S,5sh` /(+Aeܮ'V/ȧ(aL 'jk3֡GSSZ 1}ϩ߷\5pu #s~}O@d,ZqEӟf9jWqS^{+?qxzO^Y^Tv]7fyYkcT6{rYWhU/u'S4qe·ʯ2əVKOa.'=O'30%(P;jׄICkXB9q1kio2p2X4l㦼μAk4+T$2y 8&ҩU ̪~Q/ bxDT=Ofn=Oe}sRR4/@UEQ;6g1P";h&V8``f9u 9B6; Ɗxʈ`R0&}kP&nr 3VqS0 õ S50BFh֓;Bf4Qߍ&"CNSz2xXD"cSQĉHUV:1,"%7Y3,%Fy5( NMA_-Qc, hnWH^: ZЛM97Ն}ϩQd(?pI"d)U"i1>7cO7(a OSqHNr8VFB`R"TLzpDTԩ8ϸw`'a8s6A_~C[ǩsm.qòЧWHZivCF=QQ~^u5?u'njjjqBXai1+k @*"P`ܩ JpDqT:"6gYp>w>)1/.k.df!jQE_TZ(r0&)3]H2ߌ2vEɹa5*{ YχP4-NV +-0l dXk oNԭ~&>a*y=7Ҩ3K'Վ5=j͋j"}6/Դٕ.|RW&&;!p-N@X.)[_n&;9j-z6X8oz<-lT*$]J3C&=@=;#j[`-4 [PY s6e+oK jkA6;pPtM|Qe*JJ/+/k4vr㳐KTW,›@ JDMWGWKZ 9CesqPEgײju7?{Np{ {}NCO-Qk &iY W+\= uz̋tlژ^y'=B"l&'ܘq>n~6m7dAUZ WDŪjTJ;wEuUbro` S/I#vLUmYYk2S@no-5)v_aFQ~sc >U;(O6CW=_,r/u~"**cݗsbPĹ 6# fu 덑l,'όRמ=KPv]N!!bWv+jG!h#ʫ/\m̚クMj7J9ʪP.>;e;ؙ yU>k+3D`EM g{縪LsK6#v5ڕ<+?+|GreK҇%Lx̗4Qkq9uXgs,R,Y`ص;p@<۠y)qF_3!xKL,~3<=XD"fS{bqp SSS/sjjjq؜"+Euhf2<(v9"y 0 1.KW0zU_?y]Qɰplؐ_r&cRh"QMTHT1Q.ǩ^gex*ԫ6hu9/K;=E/)US1ZYJ׸&8%j/ua.?;l>$=<[ g$mJe_TR<)iĨь=<ʒ{k'k63kzfU  Gv`dǖqtvdX9m+2m܏k~U)uuuO@T  4U1LB0iMՆ)nAR} O8WEuɜV[sSgp2lQ)7X3{Y<CvqC#17^Bn1X[c4͟c2e ҄7+h׹h3F`R"nRD!YK2Q#"EMGC9B`f؏g7P!R` Ǥ]{ 776c"*jje3ѽ]i͡:/(1Pş*vm5a38ıT [~ ĵ:4UF]'kk)ϸoֲԥ@T|enp1)h0~j ɋLZ (N 9x&U!Qǯ;7=oT_ME\cQC!꫅88Uq%1)ZnM^dټ*8J|w(V-Ǯ2(3cI6K+eiŭvPDѮ%vMEc7ŔԋJ>2 sߑ5*!YC@NSRtr>n󐕈ARka$=C3l^Ƶ.@?ax+-_# G`LMjU5J+,N*[q OEA*LiRkl4a=@=OCk{jw"n-bq""Hl-r#+57]\|*)5y8&1+-DZ(' VuåIK5z}k*֛ocEas "V %q{MҴ2cWRuA#>:w y9܀XkkAU= u;6<]x~Q Ys uҾ*+ ɭR Yn톣;>;{kpAw; " @yDs8"Yi1t"XZ pb}<,]Q{5*6cCFBjmm̻䦚jLO>YԆG3}TW Pf7/\jeTMrkp^~8AvMkn2*YHU!>G]pJ 0C>59}-B¨ -JhL,lX,BKX'"# gBb[jj*vxЈG^-F]G4Y֠n:B;ct=Ey{3~,:/()& ͓6t\r`DqkPv2V, XTTr@\⳨6`C*~RiZZ9{+QrE+ZD{+α]U/{U_$GkbmFzYPG=GV6=4Jiϱv4ydԽg&RLj-> @zc%asXK`\Z+^+f3RUĺ/[\%C&Nw\l|f|dCe49CG- rM1ƿ.x'Ah <~ dxv'ɲv4`X;s$OiV3NpiAjz `)_ *nr$m-$2EVG6ao\]W Ok@)g>cW ]u @)=K{>(Fŧ F3[822>"u]_CW뷗'Co{}zOjj,M ΢1:: `Ƴ5IZ,cǰpTrl'EUieXUgcdׂ=K֮Se;1z5Qfkݓ陕yGrӆֶۑ?[XT(@ Rk_N]Ժ|ˇUmFu=uy<^7tWH6Kۍυf4uUUO)+[s4rc5&5TeXˑXvJ굒6 {l˘NQZðIsǭH)èc>LebQ찐.,{ hnu(nZx+W laiV kK,F2b{YB?0PG f˴U.z-%$_gQ@xy%Gȡj_~&f@aܾA4׷׳md &>NSCgpUgFjjmr)r&h)vѨ"x (GR p"VEkQ** qٴöəj{C_zGQ:380=?*ƷYR Opq|L=>+@^琜cm9 }G;րfzִeQg[zGWFExސmR.{^ (Rn^%TZ #㍷_!ʜ?*M$ĔKĪj*/4Qlj±ԲߛeYȕL[^bi ++Uap 1R赦 qAKח>Fu va]OO|Ѕ"qUCm!U[/]ϹmVC䗲]=B 6pqOH Uv$Җ<"]JJJ(p%,/Mg2VÌ ϸ(ܭ;K]הMֿE,κn zwe>?b?}ӗ?Pg\~^DTnv#Sꧬo2\cNêWٟgEnU[5m>|߉g{*]x-!¶~ 2UOVo*]wc"O# QOc+/֌< s}FZjz<&2"cU.iv*R*~|nSXˬj5B2UlbcRy!od?J#q901J.23I1Ì6Yr5[ݧU^!5cԁge@LqޠK7\CkfE-vWM%:FRK3Fg3(LsyM]jsV?0+O'e~QJ;,>]1J;M;P-CLg-ř*3pʄZљV[ї^HYbŻQcc;lz4WGO^\Yꉏi}.*q:h(5JS[36(\G[^棹a;m=<0p} >nw\AS~Y\$=EV3g]]  ~хQa1DTb.֦Q_*ET[js}+6ޛZƳ')eefY-ʣP99/caV&z6za]9 5k EqTJ16K8Սr H `'Zeu\jWV~Pp^WG.ɺ|i>Kr>kMW*[mfn2KN*.`fdZq}MrllL 1j嵬"X]eanǸZm\*oPVXVCs3|6e*lz(;_]Oo ºx8]>#g%l؊,N]d"i[XcūQP"/u"KW++*,x6p VF24*7e7r,鲿+I L_SzW9T~5̞̏W 0eGvYN2fKYspǭꕫSf=E%UG~|30Yht겠2x5nqW8`YBGb vMZV=E'(gs9CBKkћ-)iU(=~-xqmWx֊9Qzo Q19 ̈́-zrP J/wcJ]ݑ-nzse&~7պw9秔i]d=v(VY mt\}4QCcWA vm[W9{7dNK>BuS MEoej ƸjhN=O'~V2}31?O?=+=+ ˩ROc#%`+ b\F =?^#o\-ް|X֚A[9O׹EMV&VBe[EufC7'U9.BS]Ekš EnQLB5ȉVKf6f'~Gѽis_'+%9|[tE dY|&sQȫ/a㞓nJY,;vW["gedk$DKb`E̟ղQ ]F9 ze^Z/%;tqz_E'2uk@,k+due|7Whׁ3ʲkjZsh !Ǚ_ҹ6=vٯܱNZ\,N6u kq/&E±m&Wn,]h"*sv-vKWDmu~U#1O S5S=&^+9~^+uKS+"F,5aw̿!9JD]\L|`M^F:ksl!`A{zLD D&PTD^(dvo=lxMf 2c$Ӂ a(bAFt U]զ`eTRV 1dLR13|]g"͟TMEIM/,3Ĺ/<*nqBcB6NR߷}3"q^sCrYw䞭9޵Pd?r|UHj36_泜[ :gi ^tbYFQcU~r_Ev5{ͪ;~5(Hآicf̦eK]JZ`ΖXGFKYy.3y xEuOuo, 2`4 u+4B2hpGeGܪō? nKSe⦩[ĂS ̰]3Eؕ+u\ ]L UWu]hn!e/jS*އLM(؞PK*<utZjJcF+R Wxs/ڷ?zܭŎEܥ\paS58)]MMMMG&bUS LZ5.,-$(a= :k,mɽB%e:|L#SV%"pSNB .YY q {eus )ƟC8NlsfKP""b^22eJ֫ޘ׊o-_ *{/;)LVam("ܧ-.@V kw) /-d]}x'VWĮLYrZ\M_wځq. zpoKfEV9SPQWSoвÑVo[MZ]kmA%.Y/ "[˽s /)<3p^@YrCc~yZۆV?cldcY%ҋ)`,E-rTr)< i(-Ķ$Z-RP*S kb&5Yk5U jY`L|vxu  U gݭ-uS,\K`V!8J6XQ`BU^)aqVRS=HZa>PT}N;\Mqӽ#S#?Sŏqc:>{z2 ˱ua5͘7ŽK,{1M72Ge k] SZU&6Uys}Cș~4/}vNG^1e+/0ڳkJa˴BV 9 hV6hIeaqZu9Y5*8QUBKxQk5AFZ%Y̱6#4UJ-X%xF~3 ޝXo{ :PǼ85rSYv g8? }?vd 3cnCE=hZؘi~VUcn09eUkE~rjs(ی' Kvшs )lNV(3Kp@밺j(Ec¨y+*m=;N(@XUqYV/qf*,M2s4c܍}};\r=F'?*h;1N-sR]#=KЀdQdYJbN-n=z^w3yyܭtzi F}Om ϤUn\X"zDĢĴ{u Va.[fxH@"(ڻuDȶ5̒Rm6z}E .Mv2r+̐&{35x*X*Ӳj3r3 o۶S8"KnhW- 4 [l-<[9ǡ¨ ;_F>|Jsmp=R 56fv1.S^feU ՇY51 "a[睔^C1zjj11=*U3FvFIϐ]K`zZa]kʱr }nq}MZUo(csVˮ18 knϔ,$8um)"lڵ,[,E9Uw䙘yަ{01ٮiQ!:Cܠm?ط6yn֟cغ,lYՌqkEP֥r(n~#˸$b%ZS})ue4#q %㤪aUu ]/-9~2ZBL\ EgX'~=zzSŖ z|^R"wF[pOjC멸͸}W9{U:ek,CE,rZ0'.3_+r 2XgPvu+z(UURu/%6X nu_*͓ 4!^3 \ cd\oH|*)lŲ袺lf eTKAGY?Kf|bNaY4Z"p/bW}׎e8+e_YSc<ፅ\bZzezSӚvW ѱqSSP\%7/%8f]¼ZO&02@GL9ltoR8c@0SCϓF ?֍8Շɼ"JqUǯ,>'<{+R(֥hYlf4Z[v7?W"l#%*z]r.l78`2SʞC[z2f?QEeSQV+&_-Sz]VV%6_;o@G|W#X"1g55OYJӑ}W=^#2l-01i .9Z@~0lgr"-[[xpYb"M,53[bl=K+wYdZlFKUgznew_|#Rr`,3|lI/CXe0?E-O& J?a of^!ߌ+Mঝy,T_}6墋YwFE9Źl[|o2"W cƱ.tlSSO_ȚaGXQ1P{U8xN:0;Em氝ďzp, }*3N+2%Y~> 8ޣCuzBA*reYǻkڒ6].VUbJ3 7ZUq{N>3)W铀ʰx+ӀNM,KdTZ- &6'(T(jbSMfTl(5b]yvzB, Ad>J#c;Ffܼrg sӪYHyZحI} 1T|n0'zY0nҹ09*6ߥSm#]6/#])Mg' J }R+0|zZ婙k'ʩݞ]y.);(SsWNGXԓ,+ߔ?D:ʈbz1QB4ʤx6aY = aBU%J\pUֽ8T#ְc6ڛ)mɵjg$XeoeX}F[!=sר55\1O/KZ=4x?uj 6؛[yoʮ pn^5ՌcgB[N⎽3M6k~+QXn!apO-giL<@&UW9+@O*˗^D<~[XG7) ULJeu(l`.4c`H;#؎'Qi 8kkHxVp1VdY{XV dT<51UF*JldT> 9US#'5JhyKqRrFK]K#ce SLzRjo* y<ȌoۮUͷEҜS=+#/0r:X*okelp,z֛IJq7"\lr%_8[yTGy>y>G|/5c^2N4Q+]tzdJzVA:.~6MUYNVG7%iy/C2 ,A:&dsj'zRc/]#C5qK!Լl0u5Yb>`ýՅZ?.RVYq#;eꣲj9>7'(_vYNQbUZ"Q ff C6Jl lk9l.p~^p\,TRLEelSDļzkb0P0;sfsopF0u56t",0&NBs&nnh78Q`]5~~G-7)АTAT+pQN1]B&7)V/}6|Lʴ5 iYQm5S1c]pA+: tk,,@ddI+^Saª'b,uZluƩQn 1T! 2J@tR)>afeġ ~V5!kJo6ŏWnJ==+SW,Q.ͯ^+)W20_%klv5d-+[@[_O:lSz'+L+ipKHҘdGpMxkm;.egW"㰿/ƆYUǺg)] yn S=TcB"ڐZV !ةSc+AqR64mJj޷_VbYRO%[Xx׫u]_f+/,,ѥ0r'ٺ(504.g9e,`jq8HŮ-[ B ^E[V HSqq]4~c(}U4j2J $ LgeVĭ&rTWQ.%ibeQScn1jN|`" X^b:M Y`,}Ro]6=׎EyO08.7dl9yזoaQ뺡kZȻKvRɶԪKQn-rmZ#EczǷkZxuz=Y5izV*devYI';CUk_E+ej!&Q`cej&.G]@+%8#zwBnQĬMuX 8XwQ^ЬX{{ :c%)YRrZɢ+^1 D*˫*;%2yvj5er%8=;?2?9vr 1}aq 8U@00Dk y"z׌)5*s, Pj`e4ZRu)&j'&Ҕ;ҾyɜTYd{4(ek٢QY5`qO&յCcUa%RːU2$q|ʼn>T\iᥘ+K)r.~5z]յv\ZdZsLQ"+=>$ dȾfU_>#e5 S[i>]jرťLS ȽceP7Q;%,'Y@gһ98Tݕu೽ivE G&"/k"L9xOA*5Q ^X}L(0ęPv'zf=ukQt[M͞21iUκoӥjةUZk.ĸwk.S&+5V*\u7eDe*cѠiDod3[&`E;}7WP zr'(1V(٫B4OR`\R/r\~ύLJ,(&WJ,U(/ݹ`#䄅K*/;WLlVK2XۙvwZ+'2*[dRwA j+;|?J_̛(>C 2f-ExDw_)VآQ_&FEcד*pO8/n(?ݸ6ZxC?7M'^VSjU'(/1})gȠʮMv(DWk`\[:qeߎ||Pҁp$)q2ɷ#:{]lh{U=69ymV*M԰)VTUجhebc1ccGxZnṉP#{j,CFĭ=/q(@ X)؁5f;ai +X@%>qn*vԑ1 RtrsCad{C 7oQ@=sxc[/{˒qK|n⁈ЌoMW>5[LZn==3mPrFzaGK#Mnc{)߷1 }M^JqR PDQKEBNS!KKX* |ըkY*;EM΂֌" Y6, (6GeYfBEa5e5&FfGȸĵ'4Rvtxt3^0$ ZttR 79ψƲf28*<aRazzKsȪev ƹ#Y6?F96Y6ݓ[ u,p貧3.oeh8Y )_[C-6Vh33Јɫ # 0QbR>BK[S>[l2-j)]ʪ>{vO~{etD؊+@w"IPdjoYkGXxiRŊa@ԬW1)--v ecRȰ*wW",Xjr6\{*TۊELnNqa\tt hnt"٨rjLfyK^s۬X ?gɉb0Fmi6Jᡅ#&A }oeWzu'bK2.N_.T=ilnG*; N08RR 7~if v8syǼ75.2c]b&&8=7֧TzWOhHAKC]%{ ,&0]3G N1I-^?NP$JG4j,b]z N1׸"ĀA7J(bf1V_>ʈVVb&x.tD(6r*_!3FDl0P~ ;1@Y̴b)&޳ڡvO[Ŝ=b&6ݔ7FBpkzyǒذ2z..>r1q@lQ?g"ͻ#χ}ˍiBU>Z t&ehڧСjTylǓ3X\jlɤʑzW_b 򍅨p"دZWY5*DzweUZ_ E Z@;mf !nyC'2f+p.pv u&Q^E7q }ܱGZu+.hPʩR)O*VH)3jy]ɹEvC_XhYƷqijW5͵qfq_^ٽ!ؖWMln.8n}Kzj.3Z'˯eHsn,Mj)#11~: Ri[qo]g(_q>Ű _ش9˭ Zq+wDXL q6v)<`AVe5당Jݨ(\k<tb.;=a8ŽT`cW>V? cy6@s_XkƱ}gO#X-.m ُ*3O(d=KԱ?!L;nɢ{_o/\>rƾ%Yb,q'kļ Ӈ>X|AU0"uT`kLvnENxp$im:^ȟsJî='L<(J޵ڽo~ Dz*V]rIqk?gZxW$ȹgfn@dqƕ&݂fbЖ0FA~#C  sfXMS}Ns,Fsԓ+MD'(uE&V]V SgD;f/-+B!R!XVu@qy ʆޟ;e0X{Ft)o"ö%Y~Rr(&52zG9ީ_]e| SI$h~>oҽ2|}'V*wܕ[R5DŪwcơfRpÔ|uOZǒoV.2I999>vȕ){9]vTڡnk E9[m ~̮9X@Q%驍Bߔ22 so #NMl+a -<G`X7.C+W 1C&h5EMCB'ܢ&>F/OCmub! ZbX YU2vlS R[==VFI+u7<^E\PëV0iG>C^>&qjZ<{E_qM 06c|OC3ۜI8YYZj5#Z1r%/u"esaӈ28@šhiX8į8:bfh*;Z/ 儞AJ/|l]m5z_瞲3PcS-c /?>2}w=REo-xƵɢZxRu(K\[e"9#ǥzXFB޵4d2<>zzEOK65YSmv'yu!r˫mQR^6jܨ9b@$#o }WnSgzblJfӦhwE]658p3@OX?'b-< ̓ ܗ6M|qy-V!*Hl&Wsת_VVJYM;3.%P1|8|W%{/(}Z.[|zGv-#m`- c `0ىXbjD 4fADnn,}b@ ~⎥,kP: >3k,5c9O'|Ɓ@5w\5b1!Ж|kѰӪ񮕕V.R7A,O[?6Oz_ehIp%,\[E37PI\V7/V*ןNWn6V3)\,T^7-%a֬bJR2Aj^ߖvF>6?v;z.59;g*#OMݚ1,rἣ 3>]OM,=j@?*眈la{6.1H٬T<{}"oOrU5ݰnwt&-@UR7_`,uDM02)-`bfYpI3" _,0["cMN956?pUE_o&2(|A1+} ߶DJKBB:yP"f]0`_mϲEMBr sh} @9M]4 [Qarf}kwt3T<-1%UqϩVoRNR]*|Ab4FSB9:*ԅm=#Վodo-lBW`0+>g"Q8eACsQW1PfaYnFzTK zqm)?<czUv ZCVZ6-jl@S)&o5vz '6rr<"ӒUYM-zQ856_cb꓎Te];?#rާ3Ǩ#Vzn>?p#fmiНq9MƉ`Q1[P`Gr gS]+'vMz74c ^&R~$Rhw5BZ9n+c@Ϫ4S$ٟ%*^GXlмFKӏ2m̿JäفݎصSVfN:7WU Lk'[iϽ#yn7-1߳f78h쉨`]Jq5rdŃp.⠌OЃێ`'ns<\D]E%2ᴀn1UVhϓ@eKd,fN4 l,bL""vnZ.ĬD}oQ=G4yֹFNI(!yeV6vqZ^;q LuqcVkq,2: d h4!CD(lEQ]lG=yygvY򹉟Ck{թ]H¬o]wХoW1}^o#4NqabX,tlUm .Zs-8gA{tC>n.}7G`7`ceYO6}I&ԩFAJӔ :R<5ۛ,@`a.6]\g BVu~3Z :Zl#r꺈{Vc>DFxJi`=+?-wQc h8򃒚[3lTvJsibX'7m+ZMGֺ>Ue~x 2>c3fe7Vf%Vdc֫tĦ-V97QwgU=2Oq_$15v=C&y>Jj;b%cٹ)[g{GM 2DKS7 v++l,A[v\ѐDU.(lˡo0>좍R&-;* Sn8̀TV 8oP)`NmJ{qV*7htg-Stw+q'eenn KJ,#QȜ4;c]pEQ¿\eW hc -ʫujId:^=hNu>3cYnq4lSvO1!ҼfX՞S0Qr VlSmkX1\ӆ64?S'WE[2sL}J|g""LJf]]Z%{&"΄|±u9,@YJl< clnL*TDŬ-DXXc|% !QP+-;[!lj,^+MOW}E|elO2.-Jm'9 uWn誕%i[x\sKQc7W\Y\(#3#,7P!1a=BћcK:8Tvb_rPwp.QwH+!{f4Z1z(ie@G˱}ChPֶ_e %zI0["ث7#V([?V z/H!x=~ɈtBc7l$Mn8EqMIfp!}L3gQe=;v\4Ҳr0l:yѸ9 agJ&@0u1QʈH1;*2 P~z3a4SQlk{V%p<_K]QU`q@BrlV2ZeYrjKSML*=uW(qKWW-6l¬/\>Qo\D0ݵKO",ȵV`J±.TOԻ'~v Wr'3mHP\p~S x}0Bepg1«,M̵ܸ5;< Zϭ%VXA3{7)RĬA-L n{?z\{y ),Plva3[6W%}4A6'(l:shlB*?{j*@3pRss<-80$^5TU#OpO #=L BTB^'uVI>`M+,soQ =ϩ`DY˝ȱ>/mPT&Ei[ل%);UÚ@/`LSQR{8WnYS.Kf䫾1O}bʼW*,Vrb"`d_CW ~ocUUl)3pk6WlOad80{eı-һx/[į F2ƮLMl4+Dn1ԯ:LQaK4cu<;׳c y7}FLF^YF)5שǔ1,,< '/}5q D6VGde x .=NP8ctz0 ?<+O3qf؁erm׾MO ׊U%iyBk#13ZbK-Fxw&c;υ+mhʜͤAv>H u-1w?دe{| R,zmxolJʼnB rJ-5p?ؘ>0NsQ*ʨ^eڔa_ON=UU64l- _p\1yFkޘ01R̗d[-[aBIVxa}2ڌA|BƨGMKiiamƜa:u9O0Xk4 3muhL YW 2UwЉo-tO3ĘSzF zhE3AofBQ? -5U]X\VKW^(iR㎈n͙͝f3F"nxNSgɌO}ŋ|T>P}׷~"qЧZiD.6yꑹ+Yf"- a\INf, nFap%5&,CT(_eIķbky6~0 ->5Yo g~^'8vY[A:*5ԜVMrp yyK oryŷvg\_۟&9&ScfѐDف@{h ][>M !j{._2 lm%Cy09Ǎd9n幨xn:h7q:9 ]vynA (A ]촴"D&OѲenswt*B,BqN:M kWfs3g]>YkWnnR2YYܲԲ5à!V}9Z?}؂jj/`Ch7S"("v XU.cgH.a%̻B_Ԙ~+o3p fe0M 'SЅ8@!>uoS"ʘ lDgfP.RYbω;܀/5SYy@ 9E)WP$KHE!`szv6>n]Fo6!3XRàK՗V췇sš}( @mN%b+2.*?+)k(d>m*e/gF!0,+S:nݏ%ԳCĩB=:m~vXFUk*oQ¸q ZBS8cmV {% /J3S FP N:bxf܁i;`SZ~ u<] ^ȿKP鋀  z^ ٚ&JMݹ9$j QjYZlE[m&ѽ&EU?vS]JV 6}u{lDE g A׶8Xv˸8g4'Ss9NPAQLd^!Upbz>~ŏ3|ۇTQ5\k;1w-8$ҁC\X3D*\gp6#{?sR8_PSċ`aZ1PlV PeLUZUU9"޺\C)k§7 0pjM 5E}NS)^aX]TVZ0%x֛,tj=K1[RSt:L[;ʢʙ<]nbԐqۨv4f" B s`00. @5!iNҶDӐ#4'{,\a 'sS)دk++ --$p)9-28^#G`,&&1gbB%FEr>ۛ3jjhM^ٕۜw50&*Ӹ f_DZ?&;!]Hʇ6ek5֌Һ\`%U9-d ND9MЅ<|@Gڷ,W9)^ÞDR -1X!yDŽq`^|D9qL\e7V>xGv"WXnH]nsW]y %y-W}-)doAuaig8 *+ ;rqeIbUр0 Q (R4:uӳ,Pt頫6c7 ?XQ:P0;EF%&ω%an?9j[Z3>YK fY u scS>٢<8 *Yș M~ n;< bJCQ-*Q*r%e%PP#mse X\E)^R:HlkER j0 ? }[FBN]}nò R ~$a,`Q͓ ԭ{r;f~5FrVmE8x(!uMō\y":m ۮvA? 89r1vܹݦZe0NSL(,@eq8D:b 6'19Mn!=C򊻈 8=Nت`zEtR)(7.ܶQ-aaY]Z+\ƵnO(Z/tU9F+u ^hg%]j;h3Sv瑫@rAշrcܥHfBЀh:KqBWֆc(r:N+I7&;C0d {+%۔޺Ul[)n!?wDw 0Orh0 6=z,5F#FVwc  3r]ǰdb/ +Ŝ=V5nQPx#~|i幠`;Ox=AKIa6qVb_ ?lf-16\аeZFjѪ0h#N^USQGcһDLNⳣ?\Np'S\'ߓcMXlQQTq =jzq^S)?p5Z_KUMv"YٟJ5l,t5~UV2K\yOyHVZﻁʽ=ZН If?QںkXYT!O)"5^ց8ـfݳ,c @dfƫb!y7ƅ;q۟PL-<>enxdqXaP,Uװ/Gߥr_OIYXT=V[pDSgl\Zb̖}F]A7 7 0 =Sɱќ}5H!Q7؁ A ,t> [n\e3ԙR/slG`04MtG`{QT@9NU={]ys)9S[~gfh Yamg~5J׻$nW}1A#ƀn^ 6^HX^"+n3hgS*ɖYe>qo/meܹxMq=:ӍYT\\'˱-j3>A tG4wQ }BНEyw>)]anS`u5 0~]d: N3EA8, ڏ;TTX DiY6`E֍yJ {' J삨 O$^DA24 M&@UUpL9闯`K N-rt6iƊ`E0eSBҞ<ۉ<_Sk|E;憏cz܀Q5oP)cў9WRē"c7 u.w,7og(ܥuT[N.Nxsi.RL^9u4( Z?GUJzz+e 2}G6ګ́BJ,F̏Llbj&Wړu05<95탙^=$ ؠA [[P01YPvg>;tb}Mh1TMp R f(6|CXKU[]>H(8LZ-] aAO&^;A! E2w4t lPuw5\L㹶iM`v\u/5VMPK>&?Cg6w-1Oblԇko֮JRqM RO]vW]z8|||5$־O2/7 8ZVb>?W(E`?jb$QbS819lӯe3Z㕝2 <q]foϨ\oŭ8R=jSSIu}DTo2*49o3] y8 ejB!GDц)5f7u MpýnnïeؘYUf*7!VnN\ FlU%UWPf8~F&FfRԗWԾkjޘ?3ȨbdsԻ/dG&RLЂ~SbT1zmEr`)(E53@kJl,=BNe!c8" հ9`WԬL{15˫|k% aەeqeD{/}ϐ<ߨr,W6Vyy'thnpa4溵w8Pmc wu}`Nt{&FTL!L%[uQvYQ>۲˥ pn楚֖Q*٬n\N͑M~Ĺ;a "n7qf>5ommSǛ5Bspajoٌ>ښ"W*./ȯB̅de;F EQZơ1ӺkXaU( Jl4D'Q EVIi鞭鬶Ya-zx\hl@ g^H9 1>oa{J)13=XٕX*E6_":du,mO9fFvIή28X>a*`Y-bը[U[j% 3iW٧͔݄aR0S&ʝOⷷssszLwE"r("y8ӗo߶,+tnJG R N78CoAS1c(Wnf$qg

    igk8h#J& [(3#VК:ny sO6 ЯjJ*w,D+P iSvOkn *Aof-?m[B/dX`W<߃#kbU6vUxXp 2HjTCmVnb6=ze#.b 0}ih-Z y8ĭrVёcnBlAknq"pGvݟmF1l@A7""X ɽ&}ƟЏfcѰŷ}K=%ow o++}* ` F۸ЙQ~fq'RXe6;")cw(n20K#4XCZ~");*9O\Q>*;WV?e,oũ!XMYK?)Uэ:Xu9{h;U^KqBKnN5Ѹ15OgT$Eq9møF ڞJz0{>ON;uLL_~FqOVxEϷu!+5`'Qvw#D_}(B^=;02 r_(3~5XIJ ^>mmYefn5ߒNBXW!Cf}`,eLѾcaɵqs>db\P[ml(ܠ"}mef!+ ?",,Avp eq@:c91w)a\vIj"jSj/arN5 ax8k|b[]ZQcĴggD<\VDTⰬd GMNqnu̮جgf`:bc,7ta:3scDn4,!߶[F7Kbń xZk-Bh B!N0B7w``ߺĉ{.tMM32vg+MNTqY-(Eلj!1)78v_[LVc|1cC+hhMZq-;cah07 SwC \U[lT#āPѺI\IB#QD~_a }jR r[k5,k_"7|?ݎͧ/R&JyGaܭ,:}ڃR qjdQ{񰝁P'`OꣵUYD`XZڞC ),< 8:52*+"X'(tl'bh5c8 9="2>SW@N,?J}͘r蕅5<» 'ZF(*& -?`bOP4+mdK3[MDn1,DrqLeӗz% »T)jhjVA8'0`=ߵ4@1S4IX&ÑUzxP?[remF,|)[k+5YYM| 6z]kb #$ * b-{Qt0tԨVRbx_!\+eA~3ᖻ ==Q?{%h8J7A)D<FcbWUUZxD)VڪqH c*cڞ|Asɫ`!qȥF6|O "r4C7(˭q@a WQaV*T0]НFc5 foȒDá8'5>>eՄ{" Oї}6#~uP_ݟc=P#Q g|@7b+h \Q\+u3b0x"Z;֡"U;R~Q!(A',w:^Mc7xsQ"7xJV5_ڎ7-{< 2XGSB D;ڹqXa+!exdj4TA̮yDj]?$cQQ\;5=DcfoT|SH51 |K#Y˺޹fJ6b]-4Xereʏ4f8ߒ+#>8m$,JڻLn#ƭO\^,No NC8|W@vgޡw+eD\mA[C!XZ,u5#3DơZX".Ca0XqfUUU6mャ$8X8*,U5Z `PԠ3d@gEkR+ T %Vp['׵Z'H~Gِ C @ƩչrvGXW}jkSەڠC :+)6<"_!1 縟9jq4 - ܂7KYa >\({0X6=AkX͝cA4E59veIshD)Ae h%N[O乗Ә8-\5!&SkDZKH_~Tz"n1-7 1-!$4LchIt@DuԦc;laTl7cƀYaYXa,qEUJܞzUB-O>s|c*߉'QXڕhprjN1Ek-LVV%jL+<| :et|͉ee_DC6v aMA&jܲ ߰( jR AF@xTťQa\w,E DQvlP%cz8vڞHL~󸍢46P6{77857i_a?@}}B}@y}oQg{n^D<~ 9 KwyKo5vi8V![{ SvʾEtf'6"/'vrV0>Н}+hvaMmo_"ZHłx/_IXӟ>jHn-zihjT7>ֆ ߐzz#ܢZU׾+[lXAԮ\gԵX?qSg3+c'hRlC61"rl&jcc~,57T!P1yޗfϩA[<Zj7E8$4Ma +6mB;?C4Qb"YnV X{8 To(،h*n\P4C`UmfZ$< VJlz㾹螡_K6˨ hPshrţ*ފ noS{q+ʐ wߔWV&eVѪ]@YKQ"6jv Џ:0?cƽ/mmhuT<5f+a</ǻ k[=> g=vZҦO:Cm)m]2lDn|mOONU~Kd5}LQX-N) ݝ7.?:bG!Q}=Z:bfYE>Eוq3Rs~B04X4I3PGE*qq"J ά >A3V#*4ʤvvSzLk774>e$xV5Lu>.w]w~޹NtEcdg+tV(w+;ua}L=NWX, rMMA>!1k±w {+@6 `ݼXms&'~za\8ނ!}GVA%O4QOl!7 -p$P?=oM~ۆ}MQguc;|[ꁠ~)˺J#t"5?_]iz;(^S oW0^ L[Ȟe 7kKtqc#Ϻ3!zw9ON$A+pnQ{vN[]MwY<+2Mh- ߪVc09~RXG/Q+f8 )amo4֥UWql}ho]6䟰g,T'Ds!ӌb&İַ/j5`nnqT--o!78h ޠq+Cy"DKA`qt`A.Ys@ {onAbY~Y>Jb0l {amn> Ќwѕ8s[f}JQI1;!Fw}Իjmj}E3pnR:mU=>G}N\ ܕ5R=}?ecC{-/ҝ7 Xn9mYDN?Z3EdX@:6An=Akebg.cSk|`w*5@y9j\|Чcąj9:>?\赌+;N\jD1Ι|R˓F/pSYHR͎`gq}ػ v83Du- .Vf!'p@u&*d` ׋l84d\moײ;9 s)A,bcq^q5ݍ17N?!~ۚ趧m;O8r3'Z9uH') A'+r,#AٯR*ZQ뾓`׌C'L@e{lIHǦ=1߹bW稚C7e}}OoMXΟpN|g0#flM&` u o;$FJ+oz $6ZR*6G+ ތDr N,~RͣJ4ГFc9D6#Ɨa_[~+LfhHg"~0/X:D@4Tځ6cF:ܵBT=g~T5 q&P=7B.PΔces}w+:AUmC4cH*y9._3=K_X#ƫG^`㸽{#EuOH&žIaC[\i:rS79Jǖ;< F켄O"u!Y T3~h^+e;; O*w n(z DS1h}V#N=cb1na9~]@Vt޴3/.Sl˽I6ses9ڋim81WQfE7FfJcd>"sg-Elp3F=)-aES/x-" 9 >39&a\DX OSSGq"Q~ *>=ti &o-Qf;Ryxg8l3{^K-{}u Oz{3@bL*(7f83E}*p2ɟ^/Os_#Pp\gQYvplŚn,(Dc"ă;r:PB89e6lPv!0Mn;ћb2Sƍ F7НmEkR !]Pt~k]aoQ>h-3;>\ElF}F0N;Da7B/q0#6'!Yόk9P?gS EBcb Xq !Tn/PWQ"82I@,AGXJ#QXi3W>! {7yq$엌l"8jkmFU o#\a`:ԡ heVڛSos:B&RtJ70n~QHu@=N%6 3a tӖ; bU/N:jۇ`&控ȍ7;^yn3q$AR9)3m_agSjTy(;>N-d*!^7 aSZ,=S{)"$FeI) YXN kSb1hs3}Y^>}B%YZ?2 8DWQ<.v\nANG~np:nZhEF⢠qX}'؆1.Zpk66 pY$\#krJWZX戂 $^eLy\N[]qSpV-]Bi6>={*Dq:*& wlOLrg)G!&g[`cl9,M Ƣ<[8TE1p}b{3u}YDzfa+sز ;V{F[򃢺XMOg+2'ߜ;j2At,qC{>~G528sqƽ;:a6 p#pu8MB"mw<'vJ&21=]EAH drlY~uP22dV+.1'ʫOJ> y- Пqk4<܏=N[dz-ooG3_fcc~-RFwǽ{q$|-IS>0tGFbAF_ H#p9ho~rGYgn&hB"š !S8$^M7ۄ͙\s6'?)@m&8xPf5fhug-MTFú+Io{f35zdeKq -$qc W7C\'@6O۴2(,fڳbol gY+p^zHj5V`gֈ dhaiWX6&Ar"?^s7`w_mAk N5>j:];siBf0]C߷6A`cZІF'`;"V0{Sbu? pnr nхW_ɣY? n0K;cf3jy'yq.a<+Ra#YҾmfS17YaCY#QO$%`cv<?Q6OVy7n(DiT Ǧ0J˩[&3szt!559Dg1zNRg-][&ܣ6cu;c?:k bc.^0^`@ NbrS?Dљ8WL+A#PZq5k ۆk^porQX[0ƌH8V"r*Ww_gf6&;w>͊7EXw0|]׾@'}.cE nj؉Z>>DZ$/co!&S,_"WNt?Vqr@4p˯:}nW1܃oep>(f+AOc77;}{QS>7P?ķ"!mC]tg2 9s4ͱ͐>=$#v׹f>0an@p|!ND;naW985&-Ρ3 h {hNI[fWSnr/oMN}0:sV!Q9n1O-g]_]IZw7 m~u 帧x5>Q S~P0ʾA؈Ktq =^K.^ŀ lc-_q mmfFp.>D@65Ǯ]  F3p7[f1oMvLqA'*l?f?w}CatG&:R jL;$0ܯϰC*SCM p8YE ob7XQSj?en0aMh}fu,-0Dh8+{0j,oA%_hzSXn8dqhn"gWŵL Z@SOX*$C!#V3{-(L|c7|c=񞟇[C!?  %= F0> ,SCJ`=yjܨmlw8& Mnn]nY] ;Gs!ʥnSH ba0o\Q\f14`X CrgЌa=ƣ1J"yP)F.FT8ic@`'P aD~ `#zlV} |P N}M{S챚`Y Ý_4h:6hOjzQV%7$W{()YOaʯ/E3c EF(7 nK}ϩgću [Pw #:Fv:0qaa1S'>u;3p4O/nզ^ψ$x0kL3FasC%8&abjq?g6`b~"g)Q? 0Z:.Vd^d^Ԫ*9SՈ|LwM1,+15Pm E5 '34*~b?O}vT0wwwŜ }O"*،ӌQS6,! S1Tpaqr1CvgGGQ ƏLNK3rQݽ|jA^v ],ncci9ϤkNLc'(먇WQ'bWaǖ`'|[ :^N Yۇ0bx?~#ߙMȽg?(bNJv <| }@MreO&09%%߶qm įa>cf>w;E{.qu I.P{1{oc!F3Φ?PkeHvB S2ԫW@٨Hw8]MǩZ5SME>?(5옋vt;cv~u>}Dbg6Qͳ˹Y3}eeЅ A#>p ߱1Nx/,O ?Bj V~{پjlMp7CL4TYhDޏ#ٰwFOUhN쫸>i0E)/&4zX*6%$쵷 W2Έ9u(u/ |5-EbV57rhu,n"ұȞuD;-n 'O_PCOEB}w9@{ L@:5}M5 ?Pmڙ=/&r)79NQFrf=Z-7|hƀ3|/A wI!":4Dug0YНF!xeINP7;n`mN{&=B`mG;MBViqFOFDϩ \OM잧( E^e+2u@G(}Bz36OVu>d~nb2|֑k恴Aq)]2yH*5*̾ywgpU Mxz?WmDAO\_F0B`37! A>mF<@&L&r1ԭfޒBb 0>'~nrPS]cZpBԎ0? g&|EcB! acGdM^עS;Pl0`Ma0~ lb L#qd:=]1F6(*5g9r"3c-n3@ F";;eNpqI0;' j}%b/cq> cnfd#d ?,G"5BXhT52Pv&bqnX 6ykg'Ѝ|H.jm\;u;&<؜ 6AmC5;J٣tg.rԱ2nrcXX,&z"3mah,:{SSp 1beʆ l?i_LhSɰڂ(hODE/Q&2V\<r)2ψ[MI2zn;WV{ߍ=Ң6L_!-nz!"-  ⮪_ٍG% 5.̆aN M@Ӕw^/C}F}soE#_П)=x;@PVLާ-~;K77 ܢHN njqN>ǯe~-i~0""C> [` Ю9jrLdoǮ0,"⩜b|}~NW׾39MLSX+Uq+E☧qq 0=b(}mpwQ۔U]Fњ*5?"b,Tܡz`+vP-kfToC9 5)n&0 H<kʮ2ۇ$ D-W[ZAc%t?1[b9M1PA߷LU{&?9NPL3spEPLXz?A[SSzz?뵇K H\Oo߰3G)?Pvu7  ]>-By'᜙5)ڪ ]1f,q,, ,`-M{+F/q*"=bv'߶81P'),}F3jrӞΦٍ梎 W߆o; ;=SSu sv[{ /{hT|e]]6nMn>:?s3}WV61&m5#R4)^cqd͹ZnNFpMw ]#/~_ȱYm}r?s~ ,aa߶rA X#7^opBw k@b?Mjb77@4L7uLm?06>ڋ)ae@5*I^2U#H1?a=wE6g׏([COvw3D,s a>XhbnSoALLРA<50)ћ78rYc+n2?֧ 5@%adHXn$/<52#<=\gLQҒ%?v"5Zi`#JXyA6'z*`1f`{QaD'^ԽG=+n-m1쎗!EX1ߐZB7))K-ɣfV}JA:MPC,E U&xHS"t"Fw@>Q,/nFځ}~Վ΄>UUS>ho9G%dzv~ 00w,"IkvX&5kLoTϯ$=q0n6ij;ϨL~?qyOܮ3A`QmZ1{0n&v.={w;Cfq}L>Wvf7>h c(zXS{u ˰؉MsjV"eAgЂq3+h*"1lkc<#ڱ<|LDXz N(.*azImav' NS@2B 'ݽsa2r45779@9>}{r3 іnrQc+}Qցcw{:c-9@{k"JSDjj 1*rFxX7'LTlN3]#~/@MUl+;+)ivⁱQ}QXF`!; ,r33DS&]Ba0:?#.k&z%g?DΡA fLޡ0MMMwA uEz>NQXyO~q<CY ɩ{aەwO*8Uo}ߑ9+$-7(ٽ !!}Nq*,^>>PPAb ssqfo xcb?'Jw ߳=`Q ?_ir}ʦyeR ckBʿ(m_e yZ|Iu&7*k^6c*;$|ʤMv[OOδZ<Ms1[Pw?CD@7 bLRWh}䍈@}>%f-Kt&1Aߌh *M׳Tqhr jZܦ >p"Ssf+,6t%H9͑QAvw1rnĻs-ɹp7DyO^sro4->LJ DX5\6V Y42jV*%@IWB4-Vd=kn=MYx,]u~FoTz(WH_sdcade'zװ/0qZ3Mj 7sǖ(9@tm:w:ȉ~M߶-1u9tI EA?$F:qHwj 5av";:u ]@}7j 'sk9g۳mɜ?f}@~0,tX^sN"y4Yfk[t񡜧0!Ѝ5 ާ3^血C6u{k۩Ј=}HxzSS`t3vmċJC"_HڣLh(EєdVQ@gulUw9)^v%W`1Io~s!hbM;mXsc v';ț{6u$Vu43ddj6fE {a0umXp!n!g}a磾w=GSa;ؖ񌐎($ s Fq>)Sb @`F0jm{}BL$7?৥>ȁ~nrgE3zY$_AYK%`N*EK(5ԩu1̂ySٰD'q,}l5q'Csq')h= ;znG_>0F8nkQ q e{ Ad ۍZ?gdz${EMc7;@b@@>>7+Sv;^1OZoSP7lÕ=4n~PB!fXDapjx^zW7}OӉ>ahgq7X׷39Mf) `0mP4R"@lNPLfmwq&a'ʼnH2\g⟍g/bhrJ G7 t^! 8NfX%<ʝEhOIv}zv% G EN[΁蘣s ߳+z$'lp虨%=T3sgcPe_cMd l{,/Xg\a&r]J?w778/Su6 3p!uf "c؁l3Bk(׶|&7NPD߷N0 (t!7~%pF=@{}S F#ۙh6}oEbł)sceLV&bh RR#r"xOۭ˲a*^ƃ DI؀fOpiϸGŰ[F ~n'b>n7PD]=Yk${4 BzIQpp!=r>ۋ|/9{nopşp@`m;7>V=Mڜ979@flD]m;?ٖ`NbrYFa3>ۆđ74 ;os ĴPMBgr(\舆v[k,c~& rm@ϸ"ł,}؋g)v+p[j53q6~d)`N}P5cs}nhǪ?O>nװsZpZ3b⁾o$ o%d*%S,8{s"79@[SsЯ`F0{*5cAts^9C fݕn-NGn5S7(9yGNɁ Bw7qDEPH |6 ՓQa,R'0E0Q yEP~&o~}D?{s75SS c _jW p`}Q_SS9.,`jd2;>è 2,g8=u??){$}i:v&ch7S9BoكϨ^åC7 Y`'$=I6Y[ao>uq?;B079C1Snov;6=V޺X0w7p{u;>_wZ pcϸ'~~L=0`=Bnq5PP}ܝ{ EjԬTG1RXAy%!q1Y5*h6b}MA w+Ia J'@ Nt#Włw-<< XN߰R#7fHMfA@}>6a5:ֽ[.ze/p,4+>Sb{ֻnh+a0B`0}MzesLL*ON 0 nr#P7jţCu:ΏgjS7 C{o8!1A "Q02aq#B3@Cb?e~6_2(G#Qvh__ Fď >:ՊMж*tlxNT&Es;&7,)L0>ۗ$mVHmE96E2D"Q&"y#У-D˛ô!}ƞϒG<+d"M!_{:F>ԣ a:Ȼn6cLDƨv}dby?SC'VȸpqZfF"GI$Wc2 .u""(;Qm|6Lqq*&άrvE^RFIb;4FG[㲐ci  )|u:(hVYe"tF$tR)XEm]+%bbE2&:fc3E'8F x{”L؎ʄEGe!cfs{7DYqJ2-M 2t/(h>oGN[4[lv%Dzz˭ l^=;hqdgrF,6Ŏ(cI7{&hŎ\ݒ¾TBIh+e/_hپ#"6lؕS)Y\iG#>#ܤcj2sR>$ue[UŹ:]㢯H 6F+ƅ_$N}J$^mяlJdz)cV;eM"#t6-OfN[&vE=HFAĜw -:fB -)26MvdbuKFIE$7Hm42rcRdm6^PEh_-(KDE ;#hLOb\/I*,|RGSՑDlSQ̒P݋bgGb Yc%HFtZ"؆&n(Z(Gcʶx_ ;ĈehK3&(f죢7$OܩПV-⏶tcǢ2q77#("./Ŗ&_edaNF]lMJډLnP LY-ɒQz"lHH{F);$Iu\GGa#bɲ49MΝV;"L0KBzfȻ/Q"v(:YF%tنs#mf$)$],fTO펢l~DI6(hU#Xō="m 4(hT%CVEz3EqWPH\ hBě,C"R:H^ёlU <RLEq'BiUc%fLm=DxC7.hF\hKbE~?Q\W5g]r5V|ID=8eDߏCkЊ#tG“zdzFEvvFَXXglY_*T# dhKd#m>Իu辊Y'%E-bNnzfO!%&Fd)5EzN6"8^ΣZ?Ԕ?Dи (T׎ҋ[؞eIbg^2Iдv#5D$"UK1hݒd۱3DQ%#{#7;3vGdMq7FE=(h" qᢑQ_q_Gl|P>UJ +~ cu:PE1~ƍ lUIy)MK>xH"/C'p25/I%|bxW"r 9l{vYz($F:.ŲHqRLXj>9N>Jr+F)cș؞J|$65HhKCu=v|vfh[ҙOMV"sT1h7f\.;[ݗć-bbht7cb:&db}&9Q&|65!X79ejhX]Ice .=͉zG_Ƹ+(1r,c+/Kepฮk+4ڄ<4vCk) QPl]:_cqDbgAc\RTQĨ~fؑdQDU8-gբXo>ϮJ~ɟn0VI+/$hXSNb܉ňKӢ(LwSд\Kmz;+GQKDbS5dLP;:"6&[x&>$ƕb%ь9hd}<Ev{cv8?,iH#$8ٓDhx%Z#d"#\PN'eB./vQ\:/_eEhꄏS)IH,G\.&_Z.37)ҸPOG䔷c5\ӾQ2ЕE "zuكfI~ĬN0R3Ly!&dȎOBBI%DG#_&Lpxκ:XP_'i &O;ڐ RM RhrqcĉcQA$IvQt- GTlK؝]GRɤ-d?Y&OdR|]!#2dWە ~x3Y<-3,R%Ɗ~Lgx e~~qE+eg )}ȖYeer1͝#_][6cVtL)I!Ȏ_]Rt}ї:%Dɭo-dUCh \B"QڅF,]VM2ZvǖEb)7Vo6v>Y*&\eV9Gܕ3#N[#!8*ƑCqGv$Z2lN#"KCtbv?OFKp#BhfK"leUF8EB2?hڙeIHqbD dhi3"дX\|>_dFffh$('D+f|R'xF2Bi xE>d6x Wb&9,K=xNsc5CB1lKQPC:Y(I"Gd~8+KT(kFnƅu#XtA&*#7dM~&ݗdSlwd.ΔhtvgIɟm"J6djJLYn1;$"Z%_G(oGu͈BV|> /y##"Z!ĿX~}OpY4)QCG[>(~SE6Ghh2pE+ Pc#[H|QeU pG zп ,_Q#5ELP*+"鐚hO['8Y,>F]B!1#chElDFBģجI4Ȧ䨄o,I?6[Ywq'^*d/I,S.d)9!J BؿCIV +E(BƏ(!.<-"i=VO\1ؼCTFg=hS~s&F%c!8# %cǫ1ܽ#F얽:vu*t)%be4S'őtCRJKjQ9z2OˊdrIq"nB?(V}?hx⎖(hm955FM%4EZ՘/uGп{l//{<"=%eP] NF2;ddHLFI+#2h,tIG<<;L+B:q)c\yFi EljЄHNUƸVQ$&Xv?EU-q%7%G^ٳCGZ,2"%9Q#;p:#D"ϧ_r>qa(tJ#Kûɂ";%.s7c։4ӏdI/)1Jɺz!d&G"#ڣԔ۩/FD]ُit4)) 9ؗBck7*b:j:hHj:1<$AP%FH|ɱ5&(I1>%tlv,Ȳf7uLinN6D-{>H:G>r9B +%'IТS+C1d[3cq'Ȓdb6bLG[:Q4MY Ȟ.Ȗ:bDvMsBB,cx|ꆫ,c+7f~z7eW$%БL+Ι|| 񴄊:br;m #%/Qc}c#S#e.92#L"m$6T2:MR0uP9]$c~chOH)<~&JQRClKFLrH5wݝՎ})h6Bzȗ "Y)R!}]($ZHSLOMJL""-hM "/[.-I  1ᔱ8vYtY'ŤUHIVƏQjDbxÑ3Fy:7Q "-m-YgUGމŸ𾶊kBFHА"&)Du'CI%$3*.|+\41EDI ↸|ochfeq\Q\vGd]_|(Qx脤**8 chrR.F_Ԓc#lɫPa"T(Z%b}GDlnXuZdʓZ:B7g͟o9ʌSf,üY} HKeBKl6G)e1f1rKlD\ e&TMlcT}=xY>F4!xGcK;I x-^1qJ.>!D$1#N*G#9]š$'D+!9ޅ9?N 4P,&<>3,n&X%3vS !#zl>ȨhhHeQGcD l+5>+q|I8B\"(QTFzEXxb%'!bHM)&, #E/Y/FFw钔яT;oF$KR(Q\?\>??yEh<ҍEqY' Ix/|Y|$WlF҈݋1ވ:>C_d)tKɟf_#Ņmo>%IlTǝ&wcɳ.yIvO/YR0F,;Y5H}>i~}h9'Mj:x9Dݭd£ F8[1b 9S>f7)_M #j&F?7=v)S;ɶFmǑ|rCIF$%ii LGBl'ʹvgaMn,t2R;YWQ= E$+l6&HHpgy%22f6JHm9DfUFQRVz=j36c}I2y3Qy8QKq>8%*6Kr~ ,*#[K$TLrR쌑hxWXc\xKF?rϟ+eMvlO4^ê |1~ Q0EQ%4K4dą8ڈe|"Rd n/dBS'KdG6]XqVu1㟦E{ B['28wdUօө` P! P+1xr;}Ӧ! mX!+}Jˌ Dobr0-l529f9̙e)>4?ױ<#,[r,}Y2 ϵ;:((qFcV}"tE$|;DZCIWf%&{cE#22=e%[(JHQ(dƜtN2؅IBd%Zf(Yēde/f8/j!n'Y15ym_/lQdtB6u:E?_Q~Yp~zӪa%T6ˎ+h,8c|V>IĢߋ/Ɗ*Io:4uEpB+BW ۣ^ˑt}O$ lqE%PXR. {d\Wc ͏}L'Y=#h+1gY"82t0,[WihJ1wl~Ĕln՟uB:;K*PP4v⤶,=ءvfwtvL}G;5DU#K:(ueq2=,t8 >xQԜZlEp(+БFƄ:j:c/d1/HdHJR:I $I' h"q8=RNYlod"b(6kꅇh=ī"VFɭZFR WkMc苤>n?lEӲ=Ȳo11>3o}FkZun&>-БGvFv~)XIErGi2ڎa?䳱vYv]C LDr2Gc-hoK%"Y6vb_53.O%4%7e,&ChOӪ\F'Ӹl}: }RD%N"8I6EBTU)!RI V>*]L$;>uőN%L 'Š(|2O_0"L>h[C VDOT>E9c_OӮ6[dOHg_o9/;d0ݍ9-TGB6D#-9#wg'ղwEu!!$cHȣ8њ4W.D2vђl˿َ/t}k6FlgbtSS<}Ƥ=+LQ!Hm|*E4;%>G# #6-b"K|.88FZ'Qbٲtvlh|X1+$!3.%5cE1i EJv+LF-ͤ)s)5!Gj= Qv ;;5Ԯۣ/ EC'd-fbSCP%زhRUղLqeg9nGB#Y6o BR%$R*,oجgr9gGxT.>ϳ.8ң4khSкlu"VBVF**TGhLR=+ehN#WQDz%JZ,w؞%pIeЙbBBQ_~+\W?? s(_K 5ell;I-RL48$?ԋ C欑ۣM썢"ٶh:ۯ~"zH2ΡG3f,#'ܲXKf8I+F)6I9JNY 2ͯ dAI =m1%me2!~ݱ6hs+cm:,OD]+#6,#x7dth&ͿGp86(އu:˓&YvVS\hvS)|I/Ф7!'U Btcȣ;nѾ+ VGS<HIuUՓcdr#,h9Y Y?FK1ZdJ+v:d~/"$zЖn=IR/Cj%ؚz#jrmPȲR;2"Ze\_oHĸLv_ YJض| ubDj>=bq($r $891c9QI }õlITi22R|tfí"AKcr#h,lJ0v>I=RƖ r *9SNឈɿ+>XeVR"1%iL[>+h4vG-*Dއ1* |f}ܔD"eMyvBIFGR(he&d9Z>"މB{'K'cӳv%LhV,S6D1£M,#1*"Hoџ,STO{\I eE>G?KFDdXVu!$)( ) ;2ΉIDz 3[#9ܑ,j^RB׃-ìSVCG+cftNqG CM I v5nGEB$Tn hߦ^ݓD?r*1+1Nsi.flS;R$BG*Z>2Ip]IZ#%KLbG$ziOeߣlՍ\69Q>;JC*47eeP xplZWz!ESB>:"‘[;F-ɍaz2aǒ;DNHvIyճ#̑dRET3!d_ʱhГ%qhݓHobz%n iZ(dcbevAfOCʧn"+Z;#m\Yg[QGKE Db#Χ:R FPAp)bI>GeoF/g”nNKDbn02czdK#&6'8_RD1c56d%~vLgi%3OF %mm1=蔣7fGѱBIsDoFGl4jȴTץ?Ʌ~^ Z=͝JER$%3t=)Δx$z30Yf7ey!=q'LIخؑMQ9!#[ĎrhR;d9zlٛhÕF%$(t“%8Qmad,X2lαgGVJѓh,hё&X2LdO&)Q9*bR\:c> (\UE~8EPe)B愈'x&&Xa[2]bFtw-9!4NM:Nv-q?v%~ f.ޙ!_ڌ_P'TPF\$&2PTϸvKNJ Q<52gy22t dRdο&>I}2LhwCk%8LSùؕ"LBe6VPdOf2^t';w}Ї*gjdݟX)PS#4aӱof'{zƑ/~Q!F+IR2&M*1NK8ț}LR֙*$bBCc{HM:'D;[&OLcȅ:1QGiMEïƿ X7| F8GZ#ŖM!?N͖^NǑy$ Hrwb Jm)e̩^Ix%\M5 H cОX!pF5,.4}%1f쌾茺ȖZ1FiUO2ˤelYd<d5%eKGL>Tn~͉F0%$cɚI%lNIH$uzh>nvmUeqQ) \z4[; m4="ȶV=b##PDeןY'C{?-2ى>#LBl]*fęUV,ʄ>һBJ>F_&lhBԎД|"J;zSM?69WDq(j&OLHl")R'&FVŴfH|+/ey3\'tgJ%Hrv;rEYIsc{$ܤ5Q;я,ƣSH{*6)?N6 _ 1.#7bY܎t:2(Rl6>k$eˢ2NFb꬈7Hó>)=)9,ԤB).0 )⊡-^ !#B[#vzU܇"xzuGvգ>;ngHy,sɘ.ȧvhS=DL MlԌ†1D?ɑ(I2#$hnO%E$ɏ~V_c'̥&(h߇TT-P.dHƊ߄cBxabPH՗B >dIu%#2N-r Y7JI{O~i^hs4%q3cSZD#eN/!1::lEj՝QlRdӓ"fQbn/Glh[E\`|POQ5.>8$t{-[{%&$b#&vS% q/d'4Шt[4G'$(256̱i/f .F ώ++ঋ$I%Q"QZ$q+%=.eKltx/>,\9lЛdQGV})!آ6b{?aO*%#B["K'_;$}.8pHM9lkNadtUTD x:Uh1!l&^9Q(LȥLIiq՛D[#H~[Z%MD"fgbH|Iֈv[gSCo؍"N#ْ䑅v>N6%RIcY.E~uĿ9&YW$,cSCqz"&HPE ĄR}itxdf>Ȩt3}ժ:FVB4EjƘMi$!PIuD*h{<2gɚW"Udr R"0G%7HaǑnŦ}.8Kޫ9)ɫ KGmsEYg|XQ$J#/숭 _+Dc#d;VӣL^O"TcJ5D$4LhHq&Y!ch=*F[ЧI|;Vɪ,YVx֘Eqcv7l'}bb;!͖6>E3)!!\P{VY1$+eXEIyuG]NlUF#-F.ģE/}2$鉮×_kES<(J2');"Q\l}PK|5bz;օ/Z3UŎ-[#WD#R*ęօzT!+кdC-i3ǛH}.EcZ6IR4:DDPٻЛ=gȋCp2 f $5 l[f $>\/B]I8C^gV%-x9E6B)l2ZC.œ#+׈hLX%~oQ: YUJgaz/IH]|?Lv8%dTBIxy$ݱ GxCHTǍ/VBuDCtrHTS:)ҐQR&6I4x69h_ e-lqOJYv}D0Ic\xϑ:ۢ<$$!.Z8hq0֖|JWʅ;1̊2hG+%˵O NDIʐě0E*LN/^+$^82~#m%&MLrd(%bcEKVu%8MۣZ g5)U\NlI#;c{.ʳD;2*DQN?DRD mzF6ď={%\b}> ؘފ%B*2v=fGc<$ђ!D#2j?~!5b!KKN-E&-&6'BcQ41Gn$YFjďHY| :"uB\|&P6C}[fG2PjYuݘLr1chϑuuBg+#OIFd0ԃ;GEY!JQ dHtd$dcσ{l&h̞ D./=;d#ÐvhGr2_1"1Hun,)z>EZ$EZr"UZBe"_RY4NNqQBAFOL69$gcXF)-lE4έ꾚I>=(""_ LqiyѢELB6E["cK(v>ȱ˩R;;#- {"%/'K>m48GfXJ2H^2P)EX# ڣ>눲YS%_-6I?! {qXݱX54E|v; TDO$; dW K#0,*>+#Ɨ L ;R(] yS#JD%gT̔F 3YQk?C&5KLIC+f#'Ĝ 1~OӋGjϴ >μ(IEHmfe4ui.؇Elt"l4 $P4Y|+EX"4QI!2)"4lHM&DO&)hldd+CH4MHQ%? I~GfFt&J= cTl]㣮XDGI "E/R7GQĮlxrc"ˡI'|66;b&^Ƭ}6%! Q:d:z 6IcFH'Hw|,HH[ϬD˚o#>2OZGw%Vތ"r9E1J%eg!:r̛IQZ:bmp3b6X+X!cFvm!V-%4Y)9l(ʾ`DEGDA)CRp)cTIdH=̄o/ܙ%DH#Nrm4V1=Q$2̗dIٖU*QB+lHݑі=ٓ_/ |z|s|crLl\v!HllƉ%2< y2rD2|smIQ z:hƢ3$) LMVEEzjg6NV},l8v{> q2âd}> +fGZ%8lHJ ًOy*,eH_G_'6$lPLzi1r2- I-3!)H%/|٥"Cu#DPb="T+&6&8F|"2fVMIFr|W ,=7CIDܮ%"E \bof|Y?ƙCz;5#[3ϩ?qc8q!$[GHlhOaF("~UY)YiQٴdZ>obNL}_rv,v&J1 "N>K&h"jZH;hidxce! #\"*>#%BЇ:%,rMF;#-t}8DS VpH[C$>8::љ.]QHL7B)UQ!x_H2*CtՒH$kD,ClED) 9)DKY E%|\vh w$Iu> x7t&&]1q 1J4aF2-Qىf^Ë<У)ñbі*&81%L[ ߴcˋ]XՎW3Vhڛ1:X(*|>"ϒџb!mpЗ ƶRlreEZ~+1J<, $^įd S"Q[*"%f<[#$fFE#'&Y4TdlR$ԢI>oD&]IZ&ۑ5d4?J(pEcl_Q&圊Q#YzoGbB('jVXYֹI\Uпc!!kBtE}rC^d8Dr'b"]ݑ颮̴v}S쇦|FO ).pĹbMVU$9R;EctVFBGbx"9>/Z%'+{-&e"*15QzE 5D[[Bzs"NɫR0b%rwGf$(vz6cod$ %l2zHQ%+!|B|5cDђ1|#iȭMqpn m*%E_&Gu9;fm&Mfu 5CWC^>8TF/EyG>DQy1Y>ܪBG%ɢ{'Q4J%\=pȻ},]%ceQ4Љ8b"*$5䊡.jĭN 6('R"HdS",VA4F{ D-y~1H¥؊쬡fdRk6|Wx!$G\#FVv;Y/FF8)p(|k. "4u4$2ht7ǢL7+FF2BuJv)v[<""1ʥF94EQ=hd#"&]%F vjݗE %?\U;1M양>#CpQDU 6,=b LJWve%HˉQ z-HIDk%†=UFקd|b %-PѢEcB".(6DžVPδuU[F͍&uFDz%biE"GóGܒ>dDHk$}_ n}_HDeWKCZ%qtd[&&jY1_vCv&^DlN3)[$~AEDxCcd^2IGz?ai"+UdV!ԌI&B#д_:D.ѕ^xd1JwB#vm Ӵ4v%'gJ#Od5EөUd1l6(˵J+bI&*YWDsb˧.8"ME:ƉEK#&áM!6RpI|YfQ b=*l2W{#ʳ.Qlَ. g'R$u(:x,~2hNUճ$ĩb{;{>RQb&4tKFj0)|+-Y-kt)#پ<\#b hoҹrb2f,M dݑN.߭ X6[lؕ2M$9Y4#IeD[&Лg] Q՞ْRJLz4I>"cid|%v,Ȳg^>ؠS1pLɎh$h!))]e:^ꐊll颶V"? ,E[#dEDpoh d֟D^fˑ%/pP$ɱHBHdlyzR"T1 wf(JNy[_FO dKhI4J4d1|P!bT]fX+;)hO$+B)/)1Ϯ{*ċ-Fb+𢎢I 'Hd稢C=bbbf)Rl#)tQV8ova!]F5M#Lɲ;f?4L,o.&GCF4JTƨsM$lhQTQ=*G3Iz<(D&[1Ovy BN="hhhbrG^ȨBYGhS: h P5Bp޸DxmCֈ.(Bd*ڑ?"QCE/GzC0DSY1IleSZM R2z$_*PЮ*\*DN?;%ERCz,xHQG|Z( %(J2dmx)u(N}%l%(lJ LʕYM1~lE[_A_Ndi/%[4D1I6DiQCSBgv(7X>QJ^ [FY?)&.юnZ?:I-&"ODlzc;rQ܍T(JXc>D4QWc)|uL$!hE"<ℹE2dEX)8}w;>(PPF(q*?RTb}4/Y>nYK_KFWbn&%ډG;kGj;7dVzQCt'Di1lj([V3 ;Qz$ƨKcVQ%l*%2Y IQ' o#="{xbۆإ0ŭl'Gvc!v6 Yt7CLVF4,X+%7Dc% mz?>HԉIlF6U ]hODNTgMHdFLǑC3D]Ԩs t&J0IR'/Q_ AN,HտH]bz(QWΆ!ǫnFEY\b'apHbLK6!y9^rqv XEY'EA&)t6d=l8q_'5YR2HSٖNLofF#$Qj$hdZ-M:j(rR&/-^\l 苦[kC=hQ*HN+"Q:tIHL4utcgF, "NJ4(m<"\]/O&h{ȶmRCXڢ"1ͷQ8 Ix9:;lrtWaQ#خhmg;d)3*c)1Eip!&IYeeX2`χ/Vb>Z;;91e'k:P|:)UА#LZ#c'*DeP:6ILM v^]## WI<'<IbNG~FY“rв3MhdvT6V] *$TPIrfgŒ._5ƑBC RrmٗShkgQ.W ѓ WbH&1E,O;1b`l#MчrOf]i Q'EK,L:"LI9 E)!FuVt}W_lSv5)iR"*SnLc)lVŴ;Dwˑas9vd(K>M d$uQ$&6[F vve˓+J:z2S>;:E#'WtE}_u(:fIK,<4Y/S)pVbο_~Hң$Wb\!l\$(z2g͞%t^KD2X rs9KӼ-j?How j*̐D4d:dQbe|oc:Cvϸd[)q.lop"PѢ2w2}GA2 6MeY#I~K:P֌j )MkĥlݔMLoC}Q|E6tq1$=]w"+dHDzTQ1J;I/rcɭcv3Ig7)Ydri2Q;LLنIHswet,g)TgWiY.DCwG:$4$u4ė\]rκn~DW5Aǟ/P>>(KmFH|,ʔYga9JPZ2x7'dFMّђVK,U4PBl6dfIš&4K17؄QԡT%E35\W>-)gR0#QȣHr(Q:vgbN$#4*6Τσ%W.xZ.C'm$[IZ>䣦)(ԘnpDHr'Lj"2"ђ)}}(+1}EvHC}Y۱fIv}/"#$,lXl(X"'(bW c:%hbbEJ5{|r3u%&؛Bew2gV.#V&| HdQfiilժC}3dmnI- 'VI$c2 މ+'SKCdlQ*2="> p/tl 2NeF(>eP&DQ) B#es}&Q}$X2o%7$q"PvL!#IؿȚ![[$k2~#hh^7$E-%C=|^KD23!)1-+F&v"2d %FoD#/ h⬪ᤋhc=(|bxWG$ʱ(䱶E 4Σ,!HOmG,Eףe(ncaGcmE%ضF* Vk,[2M.$ӑH [!&v~NbV_QVIRLTZ"蓴9X׿.߯T4F-2,RK2ً! ֈJYd28D*[dȝsga;lKGRJжu@!r lL,ㆬzDűnʈ,RN1Nr-iF,R͕EK[\1FBuFOI$dc|_S&mv$^1eu(*l>Iz|ZR3ü 4~%/;<:G5S'>ϋ$?fgj |pַ hKIFe/v|v4-z'C *{4=Q+H-*U 3(vnbgmKLc,et)YbFGzgjd2/v/zdrH{2ĆDz5D2 .hlEYVYgbW  J $IMGQ oOY}EDvБ9ёjƇ EtW/5b"cVJ=Y+ծF-\.\U/Iʢ$d-9Zcf=tDz $NJr)ؓ+BɟKq#TP#m4=FZe؏_ow*od۱ILD\}D1ۈD$TKfim2M9^yÑlcөBᒉgE(KGJPEU%CgGK_G*3?MՒ sR=%*D$={:%\3hR;_ |@$DdV̋DD|,eDF<';N!&AhD*(o ǫ1O\SCad+E#s$$բ[bFY4ZP\EB?/K;R;6'd'qhr-m$Ҳ2clz#J5ĵCht#2JN- ӣ}crFu<$LC#E.I!EX(z-ɭ dfc-z77D18# .($Ko8ᡥC['!Vp~vRcB!7>(ՑХDSzDV?OWqmBi0QLxr8]Ѕ8dq02Y4vKrՎN;;gVr^ hr&~ZYLGf9vb OC%}fQCG8{ӕ!,F)(H/B2eD'*Sb )Хtt\]Ьχ. V'Y(A4[:M>坐;234Lb|3(u:YMql};Q3Cu-??O>_M?2_3!Od}#dI(#)lwg1'XHBBZ#)J>=^οPW诇Ñ{3zR[cƄi 9[C}#'dgGҧ'$~+Hgi;|uYEGq5cQtEE#щh^G[$Խ,Q$݉r)<}CF`1cSWtv"Wp$̱6XHd昚,H"QE菑O $ngyZlc\l\$4G,|S%.vQES\&*l)>>L&6L1eJQSrŞ;R+>dfϻLR!/FHc,r,,D$B#!Y\_8WW$hozCÖHv9$I:l+[Da{U bhKTB&]dd*G:iaiTQ𭈊!,pȑgb롪GSyę9%&ċrE#"Iq{*t6Fc%Rcq  [NO~\;\FH4x]qdۑ5BTZB/NDobXޏŖ2:=6!;gbb#Ƙ /YnϒL:##''UBtl+dL1I,ɲQ$2QEqi~$BJ'Lȿ"llb'Bmr";/و$Lt"}"œ*StgqDuQpYbmk)M&ΣIMnFX؟1P*SV/Ddi!;JC ]%4htKLxkEIuKle&bcMK/e;B=-V/Fmvv#E jQeq!mBepLϗr[,إGsv=_#Y32OHR1gbSIfY:hbݴ35-"FĒ'!KpCȥH4HބDZA_PĿJToh~c-ؒ#HtuF1fB:Q+7D.Ɲ Of؂sƸً+;c[$)+juچdnreRخ2~4KvC"<"W|6%m d'7G%J LrCh[dvq.ϒsy&^JȻ|RKGwB&dE1!2۱z.($!,qbIx␥ʢQ?baj jZ$'l޸زB 1[?E&X|1؇T]B[-Ų*O,'n2-^ρ,+<$zb| q]J"C|8Y4IY]Y4mwk6I3%+~p 7|Y|GĬ$;%IvE #2foԸdҞ% %S.RLqfWŲR)vpݟ> zEP;L&=#ظef}n+;h%&gˉD9Yڅ$X*|z&ۏU}GOQZ).IheWLVg?GGCLMhS>~բJ?J:hxzIPDj~lR;b!Hhu$$DKjgO)>OҨdܖ 0bˊnsm_ MHY4?"9I'Xe,9\':׆х15F%2Hq44v;H$⌉Qh.RJd+\.+ulw÷3ؓ(gQ.6bl - Bj+!]#ȯS^Cc؋,eёNȻdէz#;+E;hn '|Ƚqۇ#e'\oLt؊5=DZcoQmE"_(j)1g$QCt˲ 3, *K!Xf83m|{#>i[2}OӿPQr#*BzN>%8"Hkeo:- B< Ң)bGӰGõCV*C% hhb=lpпxؕ#>69BL,""1cFJ[އF r9;['2JΧSHT= E^*cKT4%o9o͋ƹZ;qhÓ9!h" 3,/s>(]xkLDETvrމQdP^J̚BMz ѓLxl3uGZ&vc١'rT(أLN(; hr%%~?;>eRQoTю]hCϨJ}|IF7eE S(kI +"*hhFB;᱔IGbxdȚ#)ؕh'S&lYGQ--scd/C7ctd{#}CcFh$-ǖ;CEIʤQh_{.k&"LE%Mt&)[;Q rQ2Gl9ff}4b$CjDq7ZM4?l)IZ1؛mH}J(ɒs*ʡNGY{#J;_T7S$_bxPqm Phx'Ƀ'v&]ɲȺz5\XdY|Hԣõ]|LY>N<=xF mic#q:31Ǝ"_έą²QqbEНw}Oпߧ2[23 TdfaʚK$:&%b12hH)Jh^vQ\~o\zycbȗD bOh%aGd,Td{=fXi>۞bZ 9FH;Q-c͕|vCrR+4<-Ȍ,1B><1F8䛔UrdпJbS!1pHvhiSސŽq}Lp,x?FCE3UpH":,mW ""qE c'CᑮV>c&9 D7ؕ$,Eq%Ga\D[(\`Y_7|!X ^>m(bd| YtBtcy6}5}'g%2MjA2NͲDKLG'ha]}&vv6EțieLf*kݔݍٶ8(H!HG}t[Ҕ$Y"E-)Jŏ*yc^#pT#ݝYHҗ֐pFGdS$u*H>ll:?Ć%cScDZ)2>.p~E,gۋ'"D{h4}wȝ؉Z%NP"ȻV$Q! |}t>.W_ Ȯ,lB*7bLȪ6G*gϦ>5NV9qu72|EP)J#(D좋=gN>5hhLNz DQ6cH:Vf-hl}/ #c6zʮ"c vV?LJj#eL^;162 %11v7¶tH<+9ȟ1̉Av ;v| ^ؤv,LR%Cz,n-|='l;R=Ik+E8Dc44VZCQ(ʡ7[!"+RIyݍcphJ?i޿J&"xYd)?M1%/Ֆ-U~hbQzFQcC-hIdvŶQZ>G:!1%!W\QDRDXIY \Ygj1;fI+d퓋cM )DJ]zBTE$FzJ-pKTKhR##ݒ+2}T Pɓ'i _Px-jT7J Н *cȤZ3C\ oGgp}Y.&p?-1KLV9Xˢ-ƒ;+gbo,`֙/elc1s]#*rg5G^+648c8=ظTE։J0?O]|󲇡.*+5]ysc%tS*biCdNB#d=6&'er!4RGcb:%sFofe6x6i,Xh3(4J% ^#ㆋ&&atNW"IĤ`Y/o62G'Ց<[" htQcB(DU'$I _/{ebdxoO /^OdűAdg.s[1JV}<'D1}$rJFёy'}LٓGklvJTNew][ox7K$drhCC/ LWDCQD%V| P$+D.tY ~?NP_SDPCLo&uhCY'7ϕ~:eَ*E42*Χ6lN-Lc0lΌ)1DHQ8Oc.IeCKQ'G}v[̗eTZ;¨S$2 $K<DcmpE Q';hkCBBDLJV?OBT?{~4W bhsc_Hƭ=&IJL1,F14W$gh̐] m[EYM&?x$#EloeHpdœ SbLIG\Nm 6EZgma9MFlhSb~" 鞖9&j%CԖN)kଫ$Ց~RGVO&l͑:IQTChQEƬ- EZ%+/GٖDWLb: $)>yKd̎B3M ŭ~8hB3Iݏ&D$K$>cehcT6J(5̶nH4ɫ2yHyq(ϟ%2Oecr$bِGoD]JdQO}Y6=ىo$|lc+EOJ,LlDizb>J$S# O|Y%ON+;DHN6입Z" R?)GkHz#VJDafoً(O'Ycnb)4Wfˢv'Fdd| K 2!$$7DX2* „Dp2Tэ"8Y,w~ʉAt}ЦFDvMQ4IP;S:;)"vl]mcL´JGd\"K(Hƙ$4͛h  /HK.=ō|K*C%E$E$Y/E;%&}/}3>uc}I3hϩW32zUq&F?%QnG1!3#]%z"bdu)Ԥ5G{*z2fI$lv&ߜxlSbDYѓDR{'Qk"#kBh2(mQ$/N}mL"o- C$.#ݖ5cm3!'öy#/7|h(HLM/OԈv{g5eOCw"MثI3ㄊ%g(+G[$! pj(czx ձ |5c]dcoE{T$Q+euqQ8- "HRkbC¼cHAMgS(PF":YNl~(\%2;_Z$f/lكLG3++F{l LGo #K38utΧ]9ބQS5S:dXgߤIߥS+bJ%gCJԢ>8{[m<O6IZDblZgSG^St_ AJ^GDŽa+:;_*QKGQwحzh6'bH&vҢ8,(xi#Eve؝ BJIBc.ϸ2OE*i"(YqO MoH#_cOV=C{aL^]#>%gD3\ƹYiy𽝴JIHg3(G$a"HbH$Ǣ?f]l伐OdW'z˱)8w\1=4zuٲ/DeEx[1/|` i 6/:p!LC9 z.Hh.Fi1eN(+;TtAh)q&hl= =\=HLR;hBפhdٍr|Y\u+b'5넊"Db/G]0H5BmMVC'2W> ŊY6,g^-;‡GCBQ%$]߿?|DtLOr/ix*(ŧEhϹen"eYx?c(;C;l~ WG,6(3#ø트Jμ&)uh:hbbbOhGF-Σ<} 9QcD#'ӜmO?wmqqQGB| Vxzz8HZ-Z<*ظM[P&Wu'O)]Q?*[%^4N;f̆Ј\ukep q(x>+BUGSEV2jNTϨƟeŎDE،;(ICDMIX'-I)"䇴QVc,k'5 +3e q{#tEFKq>uH]hdtE/|6&W-7ou(}:e)~7b[NC5A5ĴU?[WCVδu<v3n/HB,rBUɵ\1Z䨌άKb %C:fOœLC= ş"|#KwˍIQ?$hJ{I!d5E_Hc!:{2+FL%h ffe1c{!=!TIsUܱH,=: -~ig yO/+蝋*CV= эhz(K*>Τq>>}4GTP: x4cOHŊv"5E)QgRq|.LRJ! >Qe&Yd^sO[dRȬE"D^G PR f]xeڌsd/c} c!ؓ!k.V%7#}R"[W(\|&*!(t?܃12?R*բKgB z;sB.h.5\̒hO9#gG۸2()>󈭐S'Nby)K[bge+8Qh#H{I6ˊEgq;cB|& 2h*ϟٱ SͳB|Ye T}W} Kpj>'w$eٝKJ- f83zqB)lfٝKMhIJ1Lx,li삋"ltGe{3mF.|<5*㖫_?យ5ȸcI tcd2TF]``5qL\!q&Y]!&J?}\a R͟"G7Q}|%] щq&Q=/\o-{B.%4l\=SG$Hw&?NǾnBIz3_d3҄ë3IB*n#,؛;2ٱ|".Ϥ _EX9hd<ٗ#hpgGA$SCEVBVvƣ!Qz%;CC{.ٝ'b!>rL슓!<'yt$eK,%?1 LE Bf /dd_'f*b}3UίGBUPٱe)\I^ E\3|"˳RVEx^phHpv3k(h/T4= 4FBЕl(lM|x!1Y%8~&$vЯ,asbgbS:1A :O-p |)Z/\&Х؜Uh5chWDD;Ac<6Iׂ4צ)Ju-U*Z4HcMu:T9_^ cTIl>?.?kbiǣ$BMOc$~O6WQGcCFb eP#-&d :G㢵b|DikCeDt%gA'SE3%GQ6E F e(c,,LLLv,Sgdĝ cedlvJ)q[0%z̸ю8vJ*F5dn%!ǯL[ZcgmzcO|b1gڑ54$z!R13Iv7_ୟl|*SVf|"o\>Wj|\>Qx-q&cjZ"A&}_\Ⱥ3"!ŝٞ/s{̏RǬ\H{=sُ1"HNDXl;dlAScpؕE7Dކ苅;6zy g -$#[|:DF8:ጒ ?QŢ((KInȓ |=/IYz,:,Ϲq,l>ݍuO EQgcNDFϒ>DYBDd7WDU.$hr,cฬkgVDVgK K(jQ˃JXzE q⸶zQD.+dhbhO ^$x,c綆q+,,Sؤfv'-2r]F%Ig4 ܓdeMz^d<>f$lMCe4.e7]b2.dkYb)sgz(ĞM_K_|b[VW Ǣ"!iYYZZ($m EfO!JJ̹a,,}TlqB)#cM"{*ȕ>#|ϒaV*\`ɆK~u^ |1lt$ (K"?F=cǃb=B;I!=&mW6-ee5gS)LƄL=r3I1aɣTJllS[f"tdd,nx *"cT*g]h#6_%II1GoHMlP,OC/D_"=Q2_ 38ݷ~cF377l[t+Ccc$HȢ6$Ţ D8M IEHj :%(d~o؊1rF_"nֈ.,7*1iσ+3A1h-e._%|a9+_vdQE4x1L4sbrލٲ*,mq{%pV]z%!;(>xZ|Dn؝1JwDqƏCTvRZ\I&GGq3N +%Lv;Z[դ8%gHؑԕ+ mh(DZ‰=+U2$ȍXY|#zI{(Ia]!~H+q-ѕ.1oOF74୔x(J|!q 3ʛ lr#+,YO6uE! .=*uB[YIwV)rZeLr;9qnd/d(J ࣡MbDJHRᢉ:͑EK"Sm^ 3Ķ1'W9 z_a ,S/1+qgZhj?$N8&%7ػg=> *qEqc$>j<%'?EGW|($1Qv#I!X̢fRJlE-"BZoWH/!d3j/L2-p lnb|&Φv|g(Ehi \CɂY_Ϟ[;Y&Uk+#Ǣ: Y-gT`,PяD$:Q$k2VJ/'FjqReA/lvŨ*#I=Bά m39x5 ~+o"16obeC|]Lj')S*[.CiY1eCHM_,P؄#E~e K{' lCgWεCE :ϭeXY9,M1xGFGT= x$̄r"轟j:2T}b] m"nĉ) 4p9 DЗ-"EnČO~ wؙb[N渤Xy CBiXŢGAdvA"|Id*dK$Hщ~7hgTGFG~%Z'2~ Q؛p丐/\b\>z8J| htSh6&!/DkҤXGw{6&Jgș<'SNUYڭݡ:(K' qCC%/v5e@Hc|TGQPvF-FMPQ)4&YbuRh$;lbB"1D=%爝iENvvM 6e=rDB&R~"EM^W b9x/Kf"Kl~ +xR(uA" Ⱥ> E2VəǾ!Ȼ+GvEQ7gz1L_c&FiAF8OxZ)\1,n1s8N2_<.RIB8i؟,\|\8>x_њji*ᒊԶbݖRHbm1MbbȓM®F6)IZ Lr,'v#Υ1~v4E"n0jBM3h2DBcGk{Dc/e$K>?12ucmmHZ,}4_QETʌ$=$,[ dWGdHɓt?P7FC|'q|Du9E|4? hƈMpGgfY?\W6Xîh=+ǁ䋓.1zct|1M C흅+IlLVؕQG'Ga ddvODVԈ˪>DE!I?KGfzP1zu)-pЉ!/Em; Cv() :.FB}F O]Z?7e?&% S>տp>LkKt%lR#4%$GBY|.\e.2x6H!l }tGtcX㏵v5Z/^>,bqOuWXD.Z<$~Ģ2#e)8~VGˊRC<\XJ[%L${v,Gz4.-zFT9YPs{#"$KEHc48x9H~qCE W lУ/Ixz'(ў?CEEcc"'\M"ρU Yz'X=4BtI%ڣ ŝY[3eng<%tV5'F]g_-BQRE dv$h\Y.ˊxrlb/8b$J'͖)!ee!X; gd}9QS}Ie.Hc<|v !\? 5gqT]["2ouhϒG XJ7xͣiMM#KDY:#૽(Rp6fъNJd㴬I(PDG,{dQ\\{,~zV_pD"Go_U~~,b,Qu!_YtYt6XšYcmq)LWElLG-2 gc3hrv;oBlQki-Rw? "+*JNID`%F΄P֌J7؝cT?:1lYexEt] Ue_xdr$URRVFIčI؟Vbz*5tKd:#%4ςH$w:KPbLOT$:W)~H9h=eY;o9Ih>G4N>2O,ܤCe')aҋdtID2XbbI\!R:B TUlEhweIyॽ?)?QDq.5DHcD)-te| K ENh-2͞h;PŮ,^Q TE'hx՘HP}@rC1.;|! K'>'17$[VrvB5ę7Gud\xRTyq6x$ qc6f'cp\?|/O?J1i&Y,}> x&_#͑_%5%ߋevHrFlgSiN/脅clH[憝lhJQ\P?L_FmYuj!# DIZ'b)7P[%Eb= H(K#OCR!;rf2&al8mъ}Jݘճb:~Z %&Ly{xeT8ls1~ YZ> ,pLcuY{;,Ȯ/{,~{Cfp&Km\!cc(ȸSm3>")jĊ,h4mDžC$9kdUpϑeۑ۩lюIKfV!6Pcwb"J%q 4Lj%/H_GքQ;-2^E~ğlDE b(ѓ$}>Ndzb3+14͊1hpej衩V-Z"BV*Ddn7KD]!dڙlHОዝ G]_Ij1Zl{M _=#?_O,~ ^.\x{ǃdE+d,"dr- &E21fDWn~萏D?4Yd(模Yc::zgtw;l4DocFlhe/*HoBDGHoDh)"$1}n(7-#$MJ>8e4W D*GmjR0dc95-脨|3ʛ;؊IPC9(މrB%ٍ~;BC8}?/oa\_o"ρ./w/c!$b "&/K;-|'14]9 ;C:%G (+CwGm1MѲb4bFu8+ѴFOh*d ʢ|Pd|*>>,=!֒__?DkCؿ3Bq_>Jy4RB՘\O.-F[KLZ,i=b?XzsG1"!s*+?Kb<^+f8c(ѣH#be>1}6Lܗ/Џz,O ,|X̑2d1|?I-Bl(BbP֍p:zQ%.#MHGd=V(> vWbTBɅF$⒱'V/N+Ke# #*J'JE~/I򉈡ݑ<6|V>?HZJE.)h U珂^%9䓔xZ!)㋧2{5&讨mb$Hgc_D$/O#$9S>\ j#?MUN [<(!WOqU Cw/ `ْLd28YM!!"(\&vgdvRv6$EvОQI-B-4R>ݢ\1p_evnD;4\4%p.(zFObG,j9hׂ#gMQDQ"Lf#0ĉhjrB$ Vl.%:bLrLQ~"bGIlk45C4"*&D0{=*CgQ66-kH+fGů=t.ʲ⸾ptEŨV2D!Gr>bHˑ9B)'u1!D|"!WhH愿CuI<>O?|>/0O s/?$pz̸rIPBi2ӵ5cUh=+M#cKϷ푎!@P1cCƬc( jr쌓_E:l&ѓ&\7lVu8RBvRQ(z,舳W_/Rn=6I.W 1|n5CQ*BDFN%A"&v#')x6*Rcj$ϵ1%_(^q )x|O$o >_bC>}^N-,T4&YgaɤzJJI#&NBDPA '5=(c1AN(gC(DQv&O#"2-h|N eX%$J(bE~:/C3B#-jȔ.%&ά$VhjՋduؐW2GP HXBdP4EG1}F\7,ld/C,l.CYdܫ<,ɖYR\6>Yb"1xRpHOesgN$U6(4Pw(MR,\;J(JQEC\Ҿ=↹cPS#e+(B|5Ebb|stX| lC~G|6Ƹ|_8rV/H:ƤBs% JDNZ:01*:,[hQАKCƚ,W6-1>,n,Oc?R⥺Rs C\!lI oO(C[1썐VUstGfYcl_U[WE6'wbOH>gOIl—eLq1CdNQ(B,P#QHn%P,ؕm}̑k>,ʓ3Ǒ;ƹ\Y|z$ƑQ'$ޕpx7!xнv";/DF2%bEQPb%*1Oo)!:.|,L͛7&IWH|x.}*z1%pӱі|{,Тf%?ԱccbN)Z%ehjU){&_7,v7|̇폆;f|>]g?>;7/ɱYeceR|^/1lkEV4)l"<.ȳLe,R,v4qY|?H\XQ\c8Ko&&x=q!$4֟ TIr_,CctBbѱroг F28-HQԚD]uwD4J/8HL(eh |"Z,n>eĴ6bhoIY_ԑc{"?jEE6$1q(I2)qgĹБ _7C6Ycٵǂ|%|xŚ$.4?C{c{.u^pΨr(wt6%se/rR"cD|"/茴'&8eLnYv1V"BC ,~H^; {4h\>|,|2,M} 'B.2RU 62Y|Xll;*N)[hX 5:p͊eI /E CWD7BB[~qc^a&vlZEW d ~aE8ȻӴlQ^ !12,2sgdZ=7ХEnκXtnV/ƸY|>lOj.*LsBc1 \)>X{#pM'c-5*vKfWbBt)gS(V.c8xfĿ8!1 A0"@Q2BPa#qRCb?\ VVm(ԋdQP~EtVؾIhf$$!1F#(CRiBTbN[x"z:+d"'ChpE8U[tyD$Ċ&X]ѦY.+cvٵ/(FTW ,X!bb%ߒ,Ӳ<򱴡IFARrQO;+i$EI:7prٵ&քXD5y}/rtXsbE~'E4!#s!٦Qt)=t>q;_$(.'xHp">eS-A؄$MXcŖ'co5b׃YY%b6_/ſ+o׿ѡibCRbq{"fwVH,ӕ4j]CC%G p9C| DR.eG%QȢQD,lv;#maP'hLoUBچVCؕE6z"eR%"LMR"|1$6^_#P?+x^ll)~ߍ憹\\cB6'싳jb$(JMjJU莚=7&}şL4aOEtP%w:&b-#tX,7( ".qEʸc.͑KN;(ډ5"Ra>nFH88?m.y %#c/,^Wy٦e /++/5LE;HI=ѲoGۉ-F4j]٧=T%cGf҉!Ͷ( VlpI[!TFQ"+W#1aϬLSb\b*"KQ$up5l6I \aOY|,uyBŚsMW9gE/'f+hqWDP6$,Ql*r.5!d'lCXPQBE] 1Dȸ4>J"2#ifPӡ2ŋD)Yg8雭>W!Mrsc}#dc">Eh8ee1(^ x^e!2VUb̩'ȸ?P4%1ŵ+q&أSM4B;P#Lo$nK-!#i$CLJ.F'hK(KI>D7Z%Nٸu5E(n$!GN1C6HNXBhwF#D9Y;bI h݇6%VTD7dʹ%Qw/XBbyeᬢ>!HQ_^5l?Y CVieE]} XBIuC$)S%&;gB4 ea.Ee%":r#l.ࣂbzJJς%b^{G8XN,z ggEb/䔑݌FC7$5DV' D53cC| xbN(,Lo4!bOᯚrŗt_N,=)jF=>/Xcdnbf"T/Ȅ!ȸbF;N|-6_] eDcD6 "Ge9~"9Y.lP]S)lv_6ldGN/el)$;9%Ȧ9Z.pĒ615)ar,95VXx- eceb%$d1d7R~Ux99,o7#r7Ї! ;%b,llr2$PHgGb$1jݐ_ȢJ%;M>0+93B*F} KF:;$]QlE7x\ԅ"l>BXĬiQV4Q,4qYEBxlc7H>iC,-bb؟,O4WܿtY =M_CX*(vX%E("Cx\ xh|$z$FH9'(EJb4;-ËP)bhdxv;DS%qJ$LHjkՎ8y~ :"CG1 7CdYYH32edHSodXEaa?~kSE3qh6r]Sit\ݔlB S76؄\LSѵ3쾑 i+R66YD8"Eї%lQ&NVƖMYrlqKPM(TH[V&m8ev$">p\\dfHefF$44s6c׃!6o4HG2R,ĢWŊDfocR7rئ)V&DR7e7C=xH6X=Q6M LO "ءnѱ}"7)Eٸ#Btn%vmb69r"rsTo䜓R/*$4ƬJR(T]rI6CD&6cHvȊCCFQ6FgHDtO;#i+79 +%!I!٦D9"ZHE)$7pJ~جԋ^S)ςm"$*7LQ6qm4ԑ(fHhqq\ɵ3c6n*ͦĔQQC9yH(hQ&2!6MBI"\H(E/-bxLr,Ye_ue66^^lXq7&nŎۺD!Ъ('k6fuJD6[Lhi)"w%REJc)F?%茧bnCN} аg͈M6H\CE Wg.4m1lr!.JJ&҅r>1b(/<",/!xύXV:UDTHt*^f2f,s7쌒7oI%ئ7Ycv);d{:J$R$E1e*,+C~#r6EI!lxX> XKjEH(PQXh*fћbS*Y~pO |,O/Z666n8oCe^,VX܄ݖygޔ#uLro3'>MJKh,>G FŝH76Юenl}a7^9Xl9B:;Ѹ]OAJL'dDŽɵ[rJC6-PhP;$,^(hkTPREE[, 9Cp"ke_+ ^)t< 7mM7n7#zlnf"У^ĶρjtlhlxEʏq\#9=$;eѿ{.*γYRhNՐiob&_"jC6SCŦ4toEPN[*ƆH41iaBE4QM7ijy"/ 'Ǝpb$/&/ۯ+ŗǛx#p?9~Cvf~ͩj*-FM:R͎R%'F戺7j%/G6)Ф6ܘ'G R!"ΉIʝ mZ[cR?.3c%8> ȔhllBB/YDS4]Schbԡ5$4X7c' ~.w;JbXCV(!h,B|x^YBe DrtY~K6^V+,pe͎C6;C%4Ni#r j&F#6-䆌W.읱G=BRcNkkӊDk8WzBj&$$Z5%J#o.;hOQGhhe$R+(Y-=own1dnHFӡYȱ\ p[hN6I#!˂?Cӡ[c YnEJ% Ye 7hx Dj$&p[hq6& Y(-7-_b~TD^klc˒N,Yelۑ dfB\5-v96EG٧ =4}||Pؑ:Ckgnctl}>%CF)Dt[5{u;44e->E$2O;bIi:j['"%.Eg4[ØG;gxLKV(Q#($iȆ7P䘘nENM BcCDV5e8K>|S$(hef#LIᡡH/",sUx XDX"_Q/Ǖ~ c#dKR;IRoQ{c(bCMKk&$CGRlrj~OJdclJX7Q#r2DtH-ohjV}44>ѦGNP%CE#LCll||Ec\Ԍ;EOe /.#"6PНSbT6"c|appYe-D_tvUP&%(i qUGK\DdW#$슲d6Kr7;?d z𳱋KKSVIG[47bE>E*7 Xb/hq64S(cl7':%2MR53'# .dG}#z"(lbLZv-)LVKr#)EQE#%4Z#EBiWmtNvmrfnm$mc\h+av!$Gv&%l\ hT),p.Ά Kś(h\4GWjB^XÓaiHJQ6!#haB"M9Q(Qc7!HֆI'qL6&؋/hc||b/7P1a _-'*5⾟?rU)WQ:u1,Kɍe K7IͲvm6}+BcQqMJrBm\=Шz)6(ЮGlIiؠj섢n8 ;%v-RrEnW \ȮHDnCH9,0C]cR>靲4qFӣ#+;“Ft.\Ǣ-H}ɵb֜941bCHqbl|] V/w(HhD#lmw%ly:tEf=⅄-4.bP'YbhFzK_'}'{A w/NqH\ᴹ,,?F|rD`(@ړ"OlKOhd4vF~(,%l(m -6JHcNŠKFNĘ_H&Qd4!bEG]HǎG|ᡞȲ*5ɷk&" X|yc#frFVw _W)Bq86M;+d#C97rIDixHHCI18o86(v6>쓷bxbeظPD*o7/ee&&nD5v3KS%&=n4MGycx Q9Nͳ#8Kv=TVt% $pG= )S(lpWtoQIpOLvJ#DbH]"HTd(wTOcCd"[HPQ!+ QE- Vm]QVm)ɺō$*Xݢ؛nKZ'1ʣX66JTƓcLj(:%C14zTm TNTTDE#i lhm&RmXPK?S6+NS+'bxk)ELQDѶF)':viݍ6nwNUmDFi+jؔn x|7Y6GC,,#гB62:_I:nqe2ȲO-B l2'2I&&ѹ$Ŧʌ-v"6ĤF KrЄX(hQTq}—$ٵ"I=ƽ]"*7gʾ E xm9՝Đ,V,#rTBeiBHj(rMN' rh1j^>H:4g 87D}KM7lhtpRDcilRiId;7qCHVՒcυCXLL%p1 Zcb@XIj}G*jgji}D:hE,<,3^Hr M"W1FǼJ9BӝgXlѷiM2Ŷi"f0bC\J?(q(ŦFTU XHJǦF4(&}Y=:8>J%YɡijmqҎՊ6Q=5tVĴM["41rt*\+}575i )YnȲ r8;$&DZw 7pcV8\YC$ˢiSqVcw>I4ȕdNGyk$iEݝ&&&^vvP(Jw? Sy6Q%O$Yeb8^TƄV(K-48&+ɚyQX /7U!$<5C吆= EGDGP""Wdt!F1#jEaDib444U(G`DIF#e?":\f1;4VEɲ;a5u!> B7sCQD)p2JE0i {Wf 8dc:,kgH$6!Hޅlyi6XN}DS 㣅*h.hMƛ苴J'M7|T;&K_/FBؘB%%՛Gp(p3qI=6K1>H rjiG,ZDXMҊ$Aa ~ ,^tx.<(zj6[ش/Cґ )lvtDG'bDb.DfҨHKDHI #$rYϳD#pOC"(ѩ(%%CtrʣjCe+4z zRFilY8LqE;EHIV9-ѽEb(QEH܎b쭬h|CbJMvP4\VO(|"\DO#16"|".Gx2lN+DxX';P$V[ 1bBqq~xMŋa4eQy'"i!G,#n@D0*?f؈͵9>ɾhBBo$[DW& . &JHrmrmtT}Dؓ\ZRkn2Kѳ4=av9Pym?_K(R%Cˋ/"݇pvrKRo;eTtv&J<Ȼヲ fxKR7 fn%%g>DR#CL|c#!2ɥoϼtJ12! &FE<^VNr$$RC6(1iq#䳲E)e!t"1HGx([Qlee8\)RSIjZ\$FF$s;8+ ,R"FMe9"Քnk'T]"2v#$좛;) M%1-_t&%gG$|Ǣ<1rR+ c UB7B2c|GHt*%(آWBQcL>G(hVZ _YB/L,RGb+ŏ:EeV(D(I?vĨP"n7 "jFUG$Se;#n%"GFճdƘƊD4YBYEhՎ8"Or(M|X-?OG"\\q#TmrdZu آ(J}g(bG>XrhvѯkhD]DO+$7Id]*:sghe j;>tXV",LXa abWXj⯒f]¬(m"1dc!~B\!IȪ"(|]1ѯ6"Q%XH.v_Ȉ$qE cj+lBXI+d'<#S%"WdIЦ]ʼnd#XT(jFWw(F{aL',)͐䛧ҪcQ0ѵtK1^9%6Y p4*b-PĶɔ Y8 uxEb"! (K6)xEb"c*~5"iDxB #11a#lQtNV]] +< $b% CI 2Q.ESeQE QVpѴ8 ,DgɺΞS|=R1d"͖M7ȩYK[T`-rC7b6$pAͯh{c7]4^9Xع(j#%(Q)eݜCiݡzRn4EM_ k #B6_D<&w?Yb+ƛ($V"DD>HCeV;F$Dt6mB55"tDD se;! $rI88c8216}W"C±.+o&P*.К#2{PY Q)ƅ"lx(B:6J"O=a>F&C/ظ.ٺ1Y!R=ぱC,Q?4lW wBJKظE>4r.ci5Fc ˈO4""ft&ew◊o+,tp%Bg)YqF"B9"Ecb Є$M$݋hJÒ5RdD=2P6%MP"Xr7ȇ&Z"J& P2) w +L4I*ԍF!w2nS'bV:lLɜj}o5C݋]bg6D"ep2Lm ;D% *""-EeaUb)y;r/VJ%!1 xSea"<,#,Lܑ9$/hEH_EFw%J{9CJerढ}>-%]:fӂE4H= TGC>]6ngb)*٧ܜEѵUz-!؟6FNJ?H}|Tz9"5)-BJ,'=gGWO$FIFqyJC8&po_imɸHkZeYq8$Gs49YV) kbEn%ue{4 6ũX|2jŏ>b&RC|xȽ]͔JF☙|1EbJX9W Q^(CDHDD"8D ,?7XEx4J6F5@G ^"YKTYc9E#OJϰv4؟;(SFޙ_cAFKVq6}}DsfhhldZv/ClCCETMtj7![)"ۗ"$jbBk x$dg"54YT$Cj#g↸"8VpjS4ݍ#MXqWxXBc,>Y5*n)J6e::xo L fTy69p9rU⑶zEllVx.9ne$E m=$H$bW̅7c򼟍y?+P..D.죬JI11ġRE GHОL]M[}>dأ"*LrRXroi{8!FO0r8^9P41vQTQES %H\}HOLZ؝!ɑ45Tt6f]"*Dj4>OMuFoZdn # hkVVb$605lQrlCOkD# W?6V-4ĬIZbxHXDDA8!r,oEe璊cXiFIݥo~ksY~1| +x="\gcm EآhԨ$EeX hcz+V]ADIXڊ6clY-5ش$(\ '(刱#e$,{YI.IrBNCDI4I EakٸLep&(:>p. 4(q&!yƇǥ($ʮE'BiP QO)R\[p6/B~QO(Xc\E,7cc7sQj\ĝ44v#lڒƤ(PEdzDD]W2xQ%k7(K2z,LV>D^:5FHM1*G lȱHrt:O=R#qdHCmA %eI1X.zb{,r%jGB.O %dȣɶϳltmKUX(cjlQFj'&vIOo&I"Dh.1$XRK7E9FIŏ(P# 8"uG%EJD)\4ؘKM6_"#&7 ^7 =qb[7I_F!w9;7p2HZvljH؉p7"QId82(E\F+6eCI6%xPDl.."^R;)Քx,< ,I"cbƼ[::"PDB xH^΅_ }fKH /$E}eS)F }VW$q|> aF,v3ݒ{Ƹđ QvKE+6r(I@铊b!Q2Pwb"Gr"JTE}[7%d)n&Dr7$NeCbtDc9Bb \gk+ƅ 6$2/2S'$AKMʧmQ#DHHB/W^/p_󼿅x6Y~v^"ߏEYHX%|>ȑ}G FP̂rp&qc;8JHI~R* Yp8-WWc.$JMҍ LGipi;cW|v.EVm,| ǢR7!LdxPĘ7l(HLB9͏hjlF6DP!! (B~^^K岛#sDUDp"l.zcܑipsŧ6k7.w}GOm'XRtI(Cc\ УfSrG#o$"ѹbBiT.Q-$lFGwF 6^GB"zV3<;&=eIUtX~/ j\XldabyrN^ϬI&dxXBVVt_$s_*X-e~ȐNGf'"8"4MlP*JHXB4bm)MHj\t!i%!WzK'#kg #leBl:;"dݍ6'Ln1ˁ~Q΋"Є$$F(^(b(kƞ(qOo3l#bDB^6XrCNͧ_;g{+BXH|a^$UD.-Tj9&nlnexS*w(eeEw& pRQDNdd얝pj#iVPC(rk]jZS(#lIk7m,^7pX99ŝ xxK4Pm(bō6X1jB] b~({5t>%GEYB,Q숼robC$4MQ J: 8HB윹N5&glY&i.pz!. uK7!sȿ2b%Cm!~*Y{vR=>Vl86QR= 2KwFQUXu#%L#)n#mR'LqRŒbXV#VHceJ=a"((c\׺ dQP YHmGՆߡS 4Ȉn!e 2Ś!/ c Ֆ}yE|F%bOƈ,\or/,Y!vt9$&] I?M!t2GgJ7rNMIF/CB(k PNqq$ıJ& Ybd(/|2M'3qrr1[-xJŦ<2ChONׇ((С \16(cD$$Q,P91ᡍ,>34'uy{mb2AZIrĊ# "![NTjkjkKtݼ_ijbbew+׊x(qG{/(0:.Dc|cНb9U ǡVEbP^/h)R7b%cCC KrB| I苴jcn6_C1ᡢl^qka)9?D Bg6r><4Hl=cx\v3,2죂Ɗ$jB$}: ;Q$32wG(ʏ앛|6mP) M45pU1ĥER䢱^K141hj=9nF8\RV}De8ШIj$Q)Th|Hv=Dp_+db"Yw*"4>GCrjJ߂O!Ȍ-HuCJJŖ1pB<6.B> 38vMQi&ц{M]GPc$И/TY뒬,>gߚ+ʊDYQD"\%fu"slxn-DBfx"ȒcqxLxr=x1xW#hVZ*Ջq)*,%t}-3_ҧ42GV.$o4).tr93 FwCXE JxjJy+2Bjͥ3o"Uy1#Y}:Q}O5$ԗ行ON b~Ϗ,Mf$WV(+)ceQxX+>H}KN2(?X#Ѵ\ EyYx^O&1# 6U"HukJXl5w_etcR}bYzňB7,l}cXXx^7 IF䙥-9Z4s䄒tO4cGE!5C9E⧿ aCࡣ ҰѴǎxh%l DEGYB,bƆ aD "m6 #}B{G^bҮy4u>,B#eY,:/Gb CBTXW^+/-p^h\ =o!&YV^cBd_9Lyy˾<^S쬼5DrEb͸~,G鵾֜lK ²]/+Ą$Q&čEfŇgԾ񫡧DR,_DXYcgDzqlB$XŔ!aV"Y|,rs#J96mњduyd N#ChIDg& w\CBYYAQY^Xc+jjל!xDYYB~i3?#n;?ָzI_Py$,>D!='BDCxO>:7 %x%xtnr,{=GwaNt>pMYN+Mp&ƇbMSr_+3iFӂ𡦋7bDžQm6QEg>sQӨi=g(GdI2TxBEXD_Y  kE(XD }o,֏鸲Cc5_y\ I"؋"b|\t8Ii_8]1 V%QcFq^m 2+PXIQ͜>K."Ņe;8Ebe4W2b,š)$El9)*1| yB<%ಈr_c!U#QFxX˲%ɩ^1dJ&^,uȗc,Nm?ТYEb"hņ>1V))"W7E%;#v&6Ubxw%DyV[,QKŌz0ԒDž Wfy!#iED%W}*o7E7P6Xذ$.c cT,q2e&&)ad{r؝ oxFz{Eqd:&17-V#($Xt6&zELrlm2| pϬ>Mx$'#݉^+~UDH+_WB?PMwm|+,6XvmZ%#wvVnKeE(Cgb}#txxXHt%I5$X8|nB.̡6Eś;(Ɗ9%bqn4 ho7XxeW~ޯ޻+b$^)?ܺBXe|uUd6(119Xinwȝ l'rm n;)DY$JF \U1bXD"\o,nI xnZͱ +cܽnn?Jxq~54V,2E/!cYYle/2o$Kkk+ t<'Hdؿ5/ w|L#K C]",  X*$X$gE>M]?粨*-e E!F),R/p.KJ(;Ñv! 6"^k7aБBo+ŗ"]%baP2D/ ,c;yl$$%VpRaatpPn2eZ]aG %Bx3fEQu,qg#9)k6Ĥfu#b#e"Ew|8׿/t.p |%dV(YchMxz=aDl|#%CM-2ې&>E{b#'',_bcFQY69_X"<<#o'8ubCy/bm~ƅ5 ΄XfXblL-\c.1cE|DžH{69TȬkǒ,mٶh-&o;[BG/mBFشGJ0DY5^xYeYc~vXb(x_''mEaxג$,͓|p fvբ:jI:h܅$7+RX~l߇7%K2'6s|^KV$M)NGzq:Vbߓ,{8bvtLÿX]$5CvY Y4e>(4(Vp\bYDBh"7EVX+ +/_Wxe V'v>Ƈ$z"4ذ5$ia~*{N׋//%dzuK!QIQWyQEE,Z2ԍ2;*3Xc5֭\H-CiCƮZ+ KD9(hk5^?g,_x'ē"d|Z(BHC+??eU(~EUN/_σŸ(H4wɧlZI4b&71h54Rș+cMx5E&sw_p )Fƨi$N4IWV"!Cb~tK_]y?x'+wEy?B"(#fwpiisV}`.O-m=JMLzki5L=H2j>Ǘ_y…ˢ:\}3^ rE|/PEp:cVnF>G,.MyF"o;Cİ"jв!Zih4?~SGjURGսrhDn7 MWhO-e;gb+쏜sK{(rdž+(!!{:âE~_~+1a"@ҤϧqF֏_S}7D"q>qQ9Ff+ y (m+ +fP;j)~u<>CRbr΋̤Y/[~MMhi'\B"D4f* %6hR윆64_e?+5+~Q_xXna4Q8X- w,e7> B2^5!B"ӑ*4uYⅭ+'&՛M$6|V/V𢲾IkM~]xc䱌,D ю^竤f4No;XB,42Ff m]Ւ&Ɗ+ c+^v_!.Hsu70t&Xoļ/wM$#rwUF2x' L#"2sGZfet5M9iJhBrQGRkjmW?6!/] <׌"o x~OZzKr䚓ؼc%%ܘm^(NXx_P TBVFt}'M"\e,==IiMJ=SRZߒr%r!,5xdx:,p؜z(Q4ᤪ+…D.DQE|UD7V> 2Vgex_A|̣ľ{=BĆ,qce?^k|^^/Ņ$EG鴴5eٸ,lcy~~O 2؋:,e,lOR+ԼxebӋ7Y^ƿIxi&wyW!"2Ye1bk-L8-IJ0m+#r(YȺWmYbyNJ^7~KUbᏼ_9ca8+E|ؿ5beYkƾZ&?k? 8xXC~/ xo؊;J󣟞^+ueEbVQRUPQ_;%t((,Mdo/1sf߅F:qy_ܮϿfw^ EaI/ŬPU_ʳ/;(_l|Ѣv^_A!1 "A02Qaq#@B3RbP$rCS&?#uGt7SlnO~|ydBX}Skmslon#[.|zb΃kfCE^5]ҹ#Mnj[~KI#eoeD\4EA i=L,Kz"W>%裡TUJع$Ss!K!skВ Xjoqd7C$%qA])bUKVB86I cDKRPc$IũAJɊB6(\!M$yW]j`RIB`QIl)αҦ.]*pfsv$=jɵZt#uZmj+)A5\%ժ& .ڦ~Ǧc6&ŌV#ͧWLR +5>K9Pq67JC!Dɹ$nt  :DLV ĐB%J,XBow\-:ʛ4qEnJ\ɊʭI mIK[Qcl\.,M=˝ h]8M]=SR'ڪg9QEOck]*/ N3#SI3 o"x75n%~ԞMJ ,\Z-[c>SJ$aSzRI#H߬sߪ"{,.!Ȼi'$)%!䫈b=[ 3OR+^Ȥr4%Ա咐YeYb| ֽ\'%NkB!v.^N[C/-as?sIZԜ%E+W9xa=ͷDޢj7Ip1SQljqj$ UVΒ\ןb,%"|5sM0]sTBHuĝ1!8JUBquME5; +Bw߹U~KRudڜ +X8±RaMJܕ,jAz\\,VKש ZX,`K!LZNYJO&iҦ><#jnSpm[U/BMGCGm^~T$uhiV %ZYRi S'ZЗE-u!TU6!'J""$>TA.pq5SDj]D8sw*A;eOQD.4NT _"KccW+e'&֛ڗm%i$i~y1KEkRy/K>LWy'0vL,;4خd)b nnɽluAc.X$nzCi0#`oqT$"-l\֔q_(zv['ϹI='%Ե! Ssh$d7) lr0n0A;BtKR鹴&It%k=M7T\bd.j1>' QSK=e=".+p*:ZB4gBY" `\:%ܱS K젰0@,]:pdGܲ. XNk+[zѯsQ[D>> JzS!RE9ڰ~Ģw8mT"wtoɻڢI*Ad%L05U DP$|DTDT^c%=g?6Uu6 gM0]f{?x%ҟVOrU8lBș&'KlC7"L!s\?I=)e.3HEU؂ ڎ6ЂKO=TԘDz*X,'&&KˋqoS$P6)>+ririeP K#$YB n]I礽& SsI$ ںȏTպbCZq2"D|66*}It4t\CQj1ZT:YvV6>mi^Oi4˓n> V 7'_NNUt&6{AWl|!m:QT_.IR\N+۵l.HtVJ!W')2tVܤ*aNUie"I,E#k*U%vӦU,J!bI%N5?日R䗸ۤAL#i/S[R'feMe(z !2dIRڈ\4.u/ TwM.ntK>oNf)`V`nV(Uwu%KAָCNĺ`s K-z"{tDUr7R]V6cIEܫy$Y?-t.%ssdD׶A"d!0$StJr8 cq ,I%izd&dSi] )*^&K|I"2X\Z\!ҥX"F)%w'kB\rXd&IR8t,tLrd-8ډ"%ZU?[jr6lFz˔#id!K.:.`j U]T&"R,W9?QLHn.Z"AdlCz7*|Ժ)ąHrܸC|Yp5bniixtnZؘL &C,یr,9VYSsr.~j: &Ʈmcf=(*+we"5I0LDN 6ʓH?1HAXƒ:ӽ!&O_b)e2J Xӫ"]t/HňZZ.ArP RKV=! U2Yi$VֲIzI*#oA_|I:Z_X7"ٵ9T?ڇAcUܝuU=Q,b$k#0qt5RWOv+od~Hi ӆZK&㤃"Te"1;j'd'7OAQ_EMMu^vAW2ka$Dc#PEʨRhr4twCz^tBM!]?&2XKK)50J.]+\AtR JR=e%HBR؁jz[|d$dX,65 iJd"="Hrke;N7fReG=PHCr0`VVKqVQ-RճNA HZzoqamErc"Ťn?CKŷSI9΄6CrzQ:B$hxg,gWe=1vcG9ݍ0zn,½.vOoIԉ>ԗ8:/ܔCp[KX eB$0`G%J!b)nWXzJ(r9zQHa*ob )wrd!KRP +>,u.O[mCN/ےԹ4W+R5').,K%!$R".^fBT=Sj,DW#OKrQ ؽ0ArLOsd]u(nBR L JKo]-DIKI_u7=oؓeTF1Skq+udwCECkUZ;6Wrp R}tBEfK $Y fSIjmI-C,6%$ȂZ^]u8& THD'qu E_"l6rK XSuRIi$&rKX6yf"/+LrdɃZu!*GnIdv8lGo7j,% a%Δ$SLXdF ;n;#S4{رE ,[vȺDn[a8DGk!/k;oFd]GDu747d'Q,mQXko][{[B{U:tS%ȓB$ڿL ]KFܘYOHSQ!k XB?rH%I! ZB\(l7"Ct!XY2?}Un+/b ԖEBԿEYؕ! g&\O |.8zm.B"XZвisJdDֲ&).؇,q*[Cn~*AJ) Bq1-lMkIMn\ D7ɺe&DZoV T0lg G-mS?tL˗ ]tBՕCXnHE%ZY)4"nT!CTJXF֥b\q./X҅RI jAo&ڈ|/?Ms%ynBh($m\S T,ݸ!2loq?b^_4>z/$U݉!46fU~58w[zGR7*'Oq!&]? q$\eU:#ut(mmܝKbIzoOʼn6Z,0}PWzKeױʂ)T#j\\lغϺW+VMuoudRCl;r]} !rrd7&#"*;_BI>IU,ddyir`Ƭ|r\,I$ɸv+ō0ZK!u&%$ Y_d3HB0t^r)t7 1KTGrIUO~Ucɕ-\y1N.%K!eH%u*`Dݵ ԵR; Y³Yr|tll'օJDQڻ0=l&mdO-\,zR55&0w!l`m/Ktc5iyNS?$ME]싩sbȧ[v>6Ow>Wr}]K'rtmF}TUԒdv}r>" e8+g)IT*ߡ/['sk]62; OcJ6 ]d,qm,Q?SwGb'غE\ 탩ЕP+52`]KeijA4-] HCe6U:Ԅ!={fT!3ޙ6 ~Y%ڵ0`DbDm&H-s_ȞLy0bB3K")b it$4\Nܝ8GXqӭS0x~ّYCfSEHNjj|N>YW &>6(G*DŚ\TGX&o'itrndv$O*W/rE{e&{ʟݤ6Ȇ縆dGu6 M}:uTu'zXyiarϴ v${],IStSΖNzr.6uUj" G):YRu:Κc2\*RܓIN` {A×kKYCaK.KRR0 :=&֛JB$ S1"-Lit.&)5MLM:9m -c !E&KM,r_)ScE^!:ZH:7|!lDCU~Jڤ1r͐ߘn1>IJAmS*t1)mDnsl$6$!Ue NqۉJi.jN.Ɏ'jYjSwzm~iX-ruqVPߣx)ĊHohQ5+zaPw7UТܳ,9ʎѺ{bBip T6w6+ܦw|:F~*j%]6K;|.Gbd]Bm%id!۲؇H!K0=FN3\rZRw5IB$)b)0`K_I&`%._BQa(8:v'Gt0Jn$N2uuXr9Վ[~"Iva vD.hk>66Y!ڇb\8ڈ߱MLt U~ܵB6ok>JSNSBs sIk''ܙ$ۣeWr3A=2nM)]8!slT73'Wq4ZȏUE7K-G]9^`F"7rq4یs]{(d"/qSLu D"#^">DY :srK ]]U^AZq ~HKOC\!ggԖˡ(Dr\`KKX2fi$)h)(^S6Υ$!ܨv="nrI.{[vr V+3i~~#NoS]S2/ ^MAnYÑ:S*s)r[UIKRnxvWSɚIzBChCMusQO8SvŏȞnU`F1M*˿~ z5cn&L{ nԷzs%$ScK:lG}C.ГkhgDwoT^{ nzQ'_UW&D{pp*vF/$j"n5=C9n_' uw-?G+i*K(4JFߣʨ#7Jk;qC՟4zQUcEMTL\DU&8ipzӦ& :Ὢ􉛡;PR%]ɵvu0ꖓ4,"M6LB!N S8.E ȇ| It8M)Q>ȧ(3=U:Dj"C}Gn[BE]>b)4Gw=AiQ-td,`5MY&Jicdg<ؤi(տ%.[kT׫cbDBv'W:R5~+Ν(OODoM)*X:Z`ܤXw \ZX4sܥͽj," &Hʩ*Aݧ鸋aښo_wv:doHTD뉂Zȃ?V~[8Bn{,L{ɱ)"iJnZc]/C!؆/?JMB >mD%VDX GXԄ?E6iv "$c'r E:'it,DR`" B&LA?0J!*A.+Y$D%K46N_v:Hn͓"f';Ei1qOStREꏠ5Fڷ?ںܯumJ_9mjm*nb WBmq薉8hC|,ޡ4ttlm]_OX%b}XUs"K[>Fno$ٶ¬ز&!ϱŮ-ˡbĪBXUrs== :sg~i6mX;gJu7.7xɫ!-NZrGxĜ*b=~m j*nFRf24٦>Ԗ*m_ оGqq4RmWPF* ɵ&lo|s|:!v-nIkH6c6е.=z^d%{dV#ɞIb\`V$669"miCІH>%7?j'tQ dfo sr8 7Q;(NBܖ.DGh\AsJIo6?[xnw*jK5u+qtgqG?S,O'k'wIGOVcؖA?rPݷ#CK佚F:~ b "8K R\IT,BO MMUGi. λ 7j#k0:w~f~҇!vB:ndzfɓ&+e'&$Ht%,RV䡸&HC]HjIݏjewl&8mSۑ=RdG;Ug"o7b{ K>W%#*'b+ /HB6Tt`8,EcɷP-0zAWp5I4OGc155&kJ~%t!cf۱t0bD.A7Y{Q}#|3DtM=O8zI ԿF*G,b5|a;Vmة(qHO>iz`.SX/[.X2Fl}_t1]㜟 s7|}!N"k"踮FވUQoskr؆:׵>厔L]OQ2YiP")ibՂPff"iIka.IzX܁,"8ݦ$7/sj4%Nj)ϱ`G;M;1"5MgFh7nۑRĹ9%˂UQb*Uzj iDvSQەW%Mt'mL&}2Q C$+m#RDr dHCY 𢣜O,܍-KjN"M7 nzKi2|iR.{t=Iqcz#UEkn¡26u-ui-r$8Y4XsJkWWj>Mkuu2CsyXrYS܅Zl/ԗW; 4ѷL5=(w'c0qWqooaƪGLm_e6v-t. M1cK)_)rXzqX=̞\O\@X& %K% ,YKQ#Z_'JΚ-J\:Vqoqډvl!VD޽(;St1kUd.ImHJ) %disiBH-Yc ,!Ԧ%!%[Hi\Q6w:mwsS%c6WMmSrʿCS ٤n麧aU5JO%BlwRunssđu,0^t4ܫsRkd%K! 8z/LS*눯Cj6ԄCD*pl#{6\4d:n##UDU*&Z,ȕ..Qt]vqt'~ kr7+)Ud:>jo$ XLƥ͋bq6i6UMtc6)mDX$Itudn'sdږBQK!҄9ici% @Utv,JHi&LjnF౓!",e=Ɋ$} q$>QbH {"^{ۣD{D52&ZA0lsrOamnQ/IXR+5Pd|Z~/˓TR\KHTmؒTj\*:6u4នݪmsZ߹ cۍ!?OMf|.{4˽+} Oꃤ^t!Bچ)7"Mɂ]q0"+l]Q)ԥ!sN^E?jN?/nz*t 7o蝄l==4ōLf~z#WKO uK.7GCRQ}zSV%ý ܸ'm|Gfv,įsN*+FS:!mVڍtd}ĝIs,]i1i.َnB߱b;w:kn,R7nMbITH"IJcb=΅\tu'ܖcHb2o}#IJ"=vN0ȎZnrTc]5[`,!wi)x9";sN.= e?-iju07n`ljj:]ÍۅxoϹD)"w{>N#uvᱍ4:\CUK]mUVZПsj)*J̛fLib >(~cIj[´"*lIj ڹp;VzQWUWLc=ۨEn> YT{ {TjYݪOOa=,hi']4gFnC5"WEu""!;MVMʰq6 Ou&PX_K{D:H?f .& [Rl1܍[7}I`/Tܳ A(mJ%R*,KK& X|J=.XKlعSD؝FMxܱRQ;fg6śdW#S2n^5~pLH۲ _mI \J&:k+tB+~r OqDfBw8{"j.X ]oFx;{O\mKljȎu+fMqW=7NQ7{1m}nHTk#8: ]FQ b.JIԟAYؙ!bL0zIi\Ae$o/sjrܒAq8db/jĈ؃1Z%ԲSs\Y7"KqM6U0Oh6rq6۰}M*j"",B%WE!MO«=&{:ECsTߚT[)[#CK)Kjn:d[! URlU6*%5,TĄq"!*BTDFSn}%T!Bi0] I l^sr(M7BrWnHiz+Zq!UNw2SrXRe]o^&6H(]4tSۭ)t]RfۧwzGx\w'Qng(՟u8F| Nx_IrOP]OdYV fВCVUN4QV.ZpLQY?.C+:v.=0on`6ʼnW:T$BġĸQ-" deETEwН9IE%6Y6JYKbP> =FKzvc ̑va=(+SVH79n¢{,j5ԇR}HT{QиQUDI jIZMr%ccȊO7xmTt^;bMܲ&M$ܚ(En[˘!nΣQbԝJf55.Srn6ߩ HB ՘1[cHT.VZQf&2+ږ!Xu6!-m[|ܕTlR7O/+~D܆ilgqMwG1~Cu;\ Zhj%DMM[ccun"I>l?>*QW"mt'r4F5Qt_z&iYbETEDvUW7.BSĩ:" B%:J6#ii fԅ A(sڲwK'QA /"IdSRK!S ڗqY7EWt=1{) u\ڔ4.]p;ts؂J!y3Tsקf$+n[ wBv6j`& ZB) E%U?9>Ǥ-$ژ%K!*B}j'K&C {J"\ܭK*\Jnm? uX$k:*]~[%~ #Dfj}ܿa^xǸ#[K'{v6"8*)L)vn٢}VčMm]=G:љ6m<-Jc6_w6/m8ʚVϤۨK.mD[k|mtGx'6j}O&M./^"ĸfR,NH&L64YZ?%`:R䙤v:I=Te:SM%oU잲&PݥBf5).uWk9gisl;ASB-RL'>nGnkSC$%zUSKd0w+jM,E%Bt_%DHKnql%u4I %LXM\䲉rAr`^丗YSi!B\jb[u6kRE}]+2zuj;7xS҈L[SR.J/;Mw;n[ўtŗmMka&Tr3O q.UOM£Q]'ZXYpou2t{IhrBAe pt)CtZu)谊EnB%09<&T[IIRnj1H4$u"I/?ccZm+^ED[.tԛL]9GiMKYɁuOUW)=R D3"ڛS[IXIRŹ%H:4S=b hTa[HRQ4nd=u7"J~Pˎ#p\Oc[@Yuc1K(rM(7пkX1[/IS!~LBN=$A|Rb{ XCmJ-rpYH=Fi'~ģ̺8si;vکaNo/t>t/W˒4#ǤEs!;6#]%quu!EA.:s*L U-ܢ賵Vm:\lXœ7i;R 7o6ݩ]dݶdڧnF6j72aKfEQGM\""d]'63%2qȔm7#Uau|BB'?V1Ik64% Z/%ɤ"IȮVы.Q %Ad.%>*g܉O46OSҼeWikoغxycߢ eR^`$PUA"=$ "x1]tu^,"}=QfҒJ,CQoE/XpڨcpLQY668R {B%ª%.EE_acqd:!ij4H%W,&y0b֒AJuVB/ :ձ*BަޞB8n&I!Isjb-%pd8YHc|ֈpGqt޸736Yףxm=l7kiqzD]e'.ӂ/+@h!V^&I!]sd)>}Y 'DPE_bIB53xȻ8%Hi*f^,BI&LYKMA:ڒb.{)r,w6'Yؽ] ocrIԜ-qӵ.NK)r̠7kG7M햬O|wɧ ͹"--c[Ksye%mj%k\T:V SjR䐊Jt4~*.AcT6`3IBKe*;æu76Iq-:rIDOn\ou]ll.YʿI7UEs' 8H'qikVs%hK wI wYvh%U_Qbb,%\zT?',irRT-M6zAY !uPu&Ԉ)bib۽ tWRJ-DINsOTk0lNv>n}b"+g2]Cj%C[DsZ& 8֊HJ{+$8,)q\տMgֺIUSSKKcL>ŐASiZF:㶤>csL!VT05$O%H!cj.iV~կe&VEBdcA 7*[-EGwf$87!d܏7'H4W;[/kI?I,O4.bd!Y/YU$R<$ e2AAWi6c""wBQI!UUe!n݁5'ɿa#EɩT|£>Nn+grKL OW>N vi#JUu_~'nbMНGD wqcPe qq%b$*&tu|0+\)OOt:V쟙%6 Ei"9$)bȝ)$ʥ} IU&LD8t"+B%Ihkɛ j_ؿe+DDt$vLxy#Q?(e}uiȎK{<9eUݎ|KW*&jnH*Ivf&GhMۑV$K!r_$2B!0BSo &vtcnG[2nm7+In.:rY+bWR,)3H6Rh*! }HCqis;.E,9KBN)msH/VwR%Q#1y#͏K%UyrE,`3VH.MRI"VLQL#;Q-c.TDt(^7%*>ʞ?Be~ _qcre҂.wdUQ\OG#wqr K܇M7ݳwJg"[^ /H,]6borBFj/@vcگ6OitDZB吲MBQnFiޒ&K;4S'R4~Qgmؔ:Z_ y4A-E*@wLO nW f٦ڎ=ՎI_ĠHU ]54HOnk^RT!)*^sBZS%bi&L$ *FguL%Uv; W!dGpΰǵ=-5vo. 屳7,GxAn+ю saؖt~%ouI5C]rE6-K{&}+֪ ߉)j.NaFjlnGp:]k {~T%(XW/*7:Q~*n`ڹ8-O$IPꢴzdadwRRɺJgfdMV|\s<.IRܰ,mRiY "Q5c5v; \{ {f$64X yhr"ݾMQV͜rf%%Vf&ZG%#`,DV7* Un,v]qܘ2Ir`MM?G{Y)W:~H"CPbr@ r or7t/M}/V=oPKӨ[_leIYuDK_"7(14ON ڍA[‰YS؅nʆ- |)ҥt"&~c?]K-8mI4њ.Mm^w!)q^K|M6^&ڮnU.E7R)r)9;rd-͓NF5[ou6Dp&u%Y q jcDx}iqBgϿ9`-Kr[%k$YSjrޖ,$'Q3.BJ{_Q'd#k;X+KXOROolW$ܟ~曼{5tQ=I{ی!rZ͐UwFCDTe.HC~TSn2BA(mT. >'Z(ON 'we'RֽhI0&^NE_䲦F&Ų_oEw'ywz+nļBLBdsGf=q7x? mDʵ%Ks㛩DLZMaI[j9Ukn\SlT`.%DxCea']*v==ܑ7,ܢX)Е%.߲.l$N/ׇGokףr_t!%ɤRڤy䕤:"婒%.L=U) "q#Fȍfsaf.ge25lD%zM+?9(+Ȗ_ճFi2;,Nd9"QׁwWIvFWVTc*G%!cU>>JWSԲYx{ %&D%Uޓ<9.DRMqvEQ:iq.tn+ܕ9,C!͖/YqQu&KyPɟ6SYN/]L%˩IoTZnNh$Sc:.K!X.t;\&Mcv&qeh8-^vwĻպB*w ͕Uz$.G7f5F,U ."0Ѹ}I{H]46IrQHr]rLM/ra;zb%HHz%Rk1YQK.e'R~ݶOO}XzJܾTL{ kReb,ߒRMn`7K,IO 4.Jzܵ1jڷStI3[UDRՉR4펤6M,a=Wt܍nT[Yu/ C Quv>FlӁ cnL{:#"!; e?=]TrEG]{p6"?" bVmQSs۬-%]NmrR)&Lkr9t4լЊ4SD+a9))_~:VSMWObQ;ie;4 SCNkT$ N!{<%3~X&KrO(b%4vP"a R (% z7V?r/#(qN6'0ܐO+~S:TsɎlQjmZ_:3K3KGO-В)\4Ri B)0G'NI3r y Co^*62mm.RVM1t"j߸Yr/eB.קRĢY&A^k~>nU\}%͊G68-I%:@&;ra; V)wRVk,)VRQVB;B Gv6=2JI+K$b&A3袷MYUl,JO2iI&jJyO%>oKԱ*m[S䰍ڙV|.;v&hrM(JT,r R`t71/Y\MD?Bf r|[78B6kB/s{tA~| oԳp2q4ޛumCzW^w']!%d/HR.FLl jArm֒H.Ic#z.ek ܶC{QLypbF2įJE1[㤹~K!.-5z^>IZnhaUU> n?R`*KyRCM\rV3toI!*IB)2bAc[p9z]K7jWl% t?&W;[^#GM,'brXヨ{L7C6`iJ׬CW`޶Jȵ:H_ozA>\,Mrf$Zswse2zf$Cix&.5/.4*3"_nO"L_ψ'+ [gqӢ"gZ.w^IuMt2d3LM.%,fe+F*u6K(zQ+0Ke\%SxNTniSQuVMrB3[`OgwȔޖ:S+j+䲍9 4r;Ol4Q߂j뫥ߔosI8Ww#̎KmɤJ j-ܝ[g3ȲRĶܰry6y$.Y+$+A%Υ>ظLw续:&h0"1ŅbE A*rD%5eDrobB(KXN#d꓍n.0FaabF AgK)c3NaL濗( ɧGJ J!$Ǜ$^̗_ސDөHIܙR& Iribi2Y 򚨐Rܖ!) bAYSrt6͎IoL7&tDi G}k& K\ďr4^A\CBu)Ѕ3CjbDLM9ÎmtlCT2\>kdK)(!*I2h諺w$ Ƚ.[UHiJ%ISKBS9.Y %"7Osxojj?QU,KyXܴVImB IRNm7:B! 6'Hq;N#K%z稃$8)&^rY F:XXbyojgR|6MYO&knhKs_ V xJ&ͅ1U9+rL, Eᕚ!5W]t5!1؂$r$ RVLrJq ˆ&'{ ygijK%IKԊT+ܱk/V !E%ؓmOd"M¶Hɓb}N*nd)҈uJ\/Y+?b~HZߖMܖ75IN5Wu*%E^MrC鵒 I scSQ蛕DS% E~t)"-aZ.fHSjsou7jA?ɶ<!2nRP)CLTk! 0wby%I?,߬4ݸ:pG^D!6SdlHqCR6۹ӏam$|,YH&N:t]Bu%nK>LRK-m[S>zS+ O$3ɚ#4߉?AتIDEa-ےn;Q]̋7ɚY/鐏:y.lJ6'u)es9eif$,O&)dM-H.XMm'\(\M"5<">zvN/W7)Њ%nT2YǨ'IE XE—RZ26-DfD?1PCI%H=FVܗm -L<&.O4[LV'3Od+EW",KV/2 nͨJdϑ?\?N:mB&)2g.nZn%T.)RkEt]K]N.ET,."3R[\'ܽ'ɵ /fP%)"Or6.!NB[)1`nRԟzu%.#ї&]ü6lop=fmoEfcԔQ"ӦHSƷ,k$ 3n#a~`c%rG<ܰcUJE3ɚJLK._a2dg9qenB{c.5<қ5M *s,ڨjYs4ij9i b56ܐk=]-[Z-2^濑X!i gڂ$UMe#}5^ߣ%ԚJmH,63D*M/XJ. EdAM=ֵ5IZmaCchmc0$ڗ,EwV\qYss;IQ ?kq; nۛdڤX唉[OR]E/[yV s57M,[)p,)r[ɽfIzX]KVT,Z"V =x:nwVڃFIdxVxi;i5:;vՉ"IIUlY+AJ|w0ҥɓX8L MEEYu$HN ER0Krzkg$-,Ȭ[* 8&iri)YLvy,BH^XZAbepM/z>x ,FS:i45ޅE'˷Nr5 l*esf4y6nM!9oM|v+]s$%!]d][VԂտzzgOXE)(%.z 3lBƪOzXS$3n'tzZMj?Wb7RH4BRP1X/ G7h]6!mERy,ZFh#N>Rܖ/TlD$ GctUH-XU".M.fȓjLdK2'JZzQV`S)])KI$1K[Rt&[Lkr VB.XaLR'ygoQK&BH\9wR=eI'uf/kի\B XAH,\n$d#~¹Es{dA%/D!) M= ’Rb&H62B% i$9b% lI|Kv6pLǑ>USk'I>L[6,cjNI$rmịպG'W2y&-)4"M-[gM.bZbN[IE' [ͽ0d6&)j^&"y&KXڽȦȸgi1ޗFi~ԛ1䚿.|u])IsmbTP[49uKVԺH ڼmOctw)%ɬi0O%JNjM붖NK{RZ$`d9N&K7IK!u3H7i &~#⟪-1KrڛV.G-MTW53I"6$ܟ1_r)%+c$&iTG%2Z M5Zګ/4S '}7RRDcο<~+dM.NעXEAr"K$rK(^ .AsI$ :}&HI#,m,`HB)clUHnbE-Y7D.d&KHڇRi׷Ss<ᘉG/JO/I{Wb䴹 H7"zst5}Mg+-U$Sb-]8K`y"nYc7i[]1rf[ʟ2?s1] w7Y&H x>Et*jM$ڹrX0.6gܨxZM$Fe+ɂԽ.ld,B-.ӡ&(ݫ40nTȈM޹ nՆcDdZoUDj =1K,b.Y)AGn_L_M:I?olrI5|{ڈd6=tH\?Ir弌34,-%T{yrXI:r$5s^SI kjNic%%(Ni'({N.BްBKV ,dTVMrĩcs;$VDj''ܭ )LQ fvS%Ж)8iP[R^K26Vۮ\qn~*bCrc˂]Y܅zSڐB͂Hm$1LIufo[7MO !7xK-w煤'Cu7Vԃi7Vܷ'9e;Z5ɽDlbQ=$,5|wiOtH#:P UhNȧM%I2Z"BKb\ZB:[s[.tlL4,s.t4,d>i c+rIs%BC+dt%-I.`V.1! y#9eObCEE_%IJEܰa<|M5u? 4/jI*Zkҋ?%rQ Pbf%R% MK"5nY9-oxD.kkY髷j˫jd(XKy籚q,;4 Ko?_V5oB~k~KV )$4c.=?bT,M#4VE-KALrQis#v O2hȒ.SE_k|"K)ԔV=ͮlANUcrjdbKN5j{-ΒM`,\\qX1H.qt1BnZt70\gjۚIܵgTIb68it%E$W&BT1/oI:׷Y:=u^NCytku5v$llkgZBi'J0mZLX%0B)g.mdDt̖%.J/<-,O$lnrϓj+> ]=,DB5nfv$6WmWG>dbF?÷UnMܙ-Y!nD: uVܱ[)~&|҄Dy.i6)IaBrM:KC$S{-K_E9܈Or ctZK%~+3ږ,A(BJstRC& Hwl5Q[&,]I1L""烦1LrXIj$$tyHD.ϑ%ŭ W1}7EPOrM!LByEG_G--d;vɴ+$JI*XAzXRd%&L"L\sI,J]哚Lߖ9KWSRBV.\1jS BV.^ArܽX͒9渥bdR'MLHUObR\3Xԓe)%Y/[! MK$3Kt.&)jO$*x<~?J.tVfZ4#"3< :ArĐ :rB\=TX$j~gkVRi7%aKU T_aSM?c{j(vK\AHV bպ$%6Mn9#O9DbX))Z$Ė.tB% ^=) kYk%I<1~KY9}T&BUHH入l^ER/z ےU.R_˵ tIe-YA%k12B\G'ΎHih.[QKks4cjxś=Z{WRJҤ:O>y j̙ O{noYWEr\3K.Ad&9b<)i5Ζ⻑ Ĥ./1$,O=s.Mv+=ME`$%fZX& k8I.4SrnD!:pXǗ [c'-z_ϓ2fJGBRܷNJ,r ^YG,Wqri i>/'ibI G!5Um.%inh:#W<$nCIkW4Ǔ4 #$JD& !~{o Is_oM=}%|YL] R+DRbK[W9.\xAbMq)M [RԔ淔TGR"俕{1NzybUq˸[v9oX/wbWxMDM[Kޭ"$w:yHG5~ұtR++MœE|'v66UMS~ܐG>9/bksMlEcʎi%Bi(ܚnng^-o"S,d%T.ژ忓KRؤũ*n.ϵ=DV9$2cIʡ"Q݈D|sV ϹrҒG7WRa6jʾiGRZSl~`V9ڈb.XMpؕEl$F!4ܑ]J?-f6vQ _S3C{K%&yoJabJ䅤sY %eL-TYt?6 [~IOz\-ߓy-dܓ>}Y"DyG2* E5>/KDBi4r0bKNn;UQj}v.O4/ϞTcjlguc)bJy3z$!\O?ZJ&QHV}KY5Թ)`Jzry/[oJG6{/IrM%h!t,M %̙-"ط.Rʗy ~0j~]>+fgO? Ʒln"9Uj`xN{yүr|%N~L jSseߚt%]92ho櫟;>D*N#k\|߉ijj:v`Trg`R哖erZ"$4]i+H,WRB,\Wi49.B.et*-mb"́ijk^ܐ&7*JWrjJʗNk!9ZM,Jį=/$K)$&kr>tgI,RR)rR}S_MobHxO"՞k<lE>Dm& Ѕ*'U Xv9R]ڻ|^[Ix̗${/o&jj{VIZn&yd CD";$E}ZIbܗJ[ɚ\d1t? :!rEr[9#͒U"i|0J{$\YMmjdG.=69ڤ6]m5WQ:b#x#ɞYJWGU+4oHϙҔvQyOW"],!Kʄ-%+N'n!IܲDux$`ȊB䨮w~(#We-^IXyv%1N6oj'̍s仩5%WInSnC.KIRf\&)\r[+ڗ&oKr>UnK'O[|2xtfwB ,\Hni§co"E.JrA$79!sjVCM;[vkbcA\D:9:bYC5v{׹ E,H.n{[7DSq~kS$%-1_y'E/[URV:J+2H^UVc6 ^!+T61KQ-w!m n)H'$KVb=QWϑ5nG-Y! _!WR%J,)X"nk.&SSuW<ϓ!|s5yQ0`/;W:W/C7$,.k 6$ d,CJd >615FO&޶ߔ'Ț2M$o>|/5Wн$*b3L3b h=Z:Zx<{FXG;رs$M7&PxGs+YNY&QMc˿4PM$% hn5Jt%ԔR]&ƛc}tssmʉ+nxBRRݵ\M!{3")rܐgaf*X$]9bKRԺ3\:wn+] %y̷-v;ڄ%DEDH<"L[ȟ6P=?n4KLϑzYi*V)rԏ_G0\d2\]A & -/ȫK9&)w vkm_ sG$Ry$YV4$RKԷ-2\D4lmoO,)rܐZ-LLsJW~/rh_%)ex~%"OkTKEd.f%E.f,%Krܒi%.ZEf/%"z!4";Qoɱ V9Z˹yeTRi _$O:9zoL#1r'cȷ駖|ɤ/ R.Xb2J>T+$$4j>~i&HNIos3ɟ*>\EQIu:VKTVRggokGhBSߚǛޓOvB/[ H/jZ5ۖLr_)>m&.n]w"Drap"62YiDQ>m[$۟Ⲵ / ^E`u!i 5ȚB^E3K-5S3MXj:z{ۤڊNZyÞ`mq^PI6514,ܴA \JO4YܖINLė/t,y%4m]/ 54ۮ͚c{}ri|O'!1AQaq ?!O#}>Gq6<l|PG(Hmsجn< d#LWz-ЭT-"1LW &()*UN\J1~vt堖A:D,ɺ,3bpU[ IE0f{Sup*_%pN^Z텍cl3g~F]i}b)v6jȣF::eTW6-#fZs%Z svQ1eۏKc,٬tVh)*F& 5(#V 내=8ǧxu1B!p&YHаɘ9Eބ.G=]BةWDcuo&qD%_ a3 FV~ lZӧ)R^F\mnR({d$0M\'$bBɑПWPiҹGHMTa`MqvkoFeBׁ6k RaǾXw`qt;D9κўyc'談J:t',K.R|.bhd8ft2JqFKIi SQmR憹(gF]im(!! f yc[W4KBY .D=ГH1%x "ȿТɔ*F[!L~Aa1-фgx~B= %Xg 8r?|0zd"`=t BFh&,] Ƈ.2}\ e37c Ym٥"2 zẗPop 5pg)A+k>tBhlH݆N#Gj*79*[tC1 oىcǑY j&(\&\3#oN j˒!&fiU.JR.-erɔ.fcrQM>EkJW5} 7 S$Qݐz_PE˄maG_ `i*# :9k; WfYk"95NY!j[&/T:w,Eؑjl?'mdjC#-1 OBb L= hGmQ$"aR}lfִ(NAЈG % ֊ _;h6BgF6ț-r% H$! wJ%d_ B# gxGVr Oَ& e}JC2e k 4 ! rjc#⼋xe8h|"w&~DbnFȖA9oF/=/PL3QsHi$s?=YIȈqt7SbJZ#2aiȩ8Z_*0zr{}˿~F`|22u*u7FO)XwN:XN!o9jOgB~ٴZM␼Im  -\rr5[;rj#FDumҦΊMCQQ %} Sme*hCcf$ԹE.O(<wW ^œC &Lua6;қ5B"M8c͒ڇS|ylV SDՑ94q| Nv1% y<.z9k#| 0A- +\Zr~Z*Ǿ`¤0PXʌ$P4X$P\z ˺"F* u+H&"*;v]u" !d2=f'l6⏡/"W 1ig#/&U֚3 f[lUmsL:7pi*C:*dFBg % \2 hJ4$$4ֹY_tb|47lhr lJ<< 8J-ْ'BEW9D*"ƘC$+<~}HE;зCk @^K%7C1Ob#w[Nؙz; " SH{HJcwZΖi|L ^ag*Xi <(|p]/1LL{!$u1\/ˡkRպ&v HL"< +æu^~AyYb6"=+iyyM G=^%_wDa^jMQW(0vȑ -Xy- 'Z+эvI?PBWBJOBXI/f#B~Y!9%A&L#J -hh\ Q4_sQ{"|BVP!$4(n`$LrAk%Jͣ6~D!Ev7mbȰ:1-Ǻ&OsY9b?%:0kTy8`|1)S5˸e MѼREdۍ$ˆjm#c#gPָ dFS-m2 2 , LSxgP^E&lK)_Z1.ƾ^CR+j1؛kd-[\{gb@cpdGH" L-OjD9%Lԇhcȼi*SM qI`VEf6@hbf ;Byo,m3IC[x5F kj5*b&Yԝ YVJ0e1[E>΁ P4h:<ÑFI4J߀B eEqY*ڤ(FI&FBF LB_dƲ55)dx], Bkf?S9h扌BKfk ZB&cS*6,0[F򝃠^P0lvHTFPh"6O'ف45#CH-#MW74|1raТ} r&5Azͦ%֎N%>9' fibXC4ף;rt,ސWYRjAS?M.lEΙ^ 8-;c;8E\F" ki `Wh\'M/CnpgSK1ƽr$LT&Z)X/AX߁EhM#%"<Р$11 F WI9]hQͽV-b9cs}7ݼ6،mQc6ML Thü`VfCb?\Ѕ*dlUTbQ}QFjSLhӁK>ezh B"dVCJ_E3xB3f?%7OɃGJ1kɠ> 9*#TRTfX߳, KO5țlh10Dї ؙq2dLX1+&aߊ&|!f_"b p6 o(W!PGv&%xEYY0Ky[ 41tQAY(e :/"5L D6ֲE݋&̆wJYQ~M顳1Lls[>O0MtǨFj!3wjߡz`h\Z?c`ڃe=+W/)9ZJ'SJYD>7*IJऴFņBA%9X T)~ " ej6"x1c2M[!g-h4! N3!Cڍ8f_A^EDN jKrg J}yO&& 19V!p 'W` ȋ<>{*ں)8%Aȝ=>ɖ g *gxSɼK%'&&X#E#a A%mTlUds9ɡ&+D:V=茠e"V) r`-Ggi?!XЖ3DPY{ ؒC"RM xFLN a؀,#ʉXhg5 -iv*@ԺLDс}Jflwe^Kv\_W- Z |O$9piz,Vs(U] 4+kYBZO۰3cDZʐ&WeeK} 9{,*cC拟|1rh1y9lZC`P[5 !00+%4nəP[ϒEK [-zI Atv#Rj2obQʉ aicn ]>`:BbDG#sY6|-폩]R(du0 $ 8f( Æ^ٓU웣6SqdF;0h1 F"ryȻv fO `R7)DB+F߲qxɦVL3*.CZ ΑJjQئrFܘ_$ g eQj[H4fnez ,% vI݈CB"'M@ y g mIcy&#]1zxm%, Hފ*2<qn,B&M$5l"#eWn$b{|bډA@c 7 jS&|\B%lגCDd\Mf!Ya{F*NEJf `v Lf.@'k8;(hrq~9B:FgI 5#DbЮv ".v!|MLr4Oҿ ,vVDY"5̧LfJ "tcsLG4Gҭ *l>u=&e[ip&ЋL-H6\*"YɩQi"'O%pr9Cd)p#``۞D=nRA,?Elo:ǩĮQTwb2o쟢}Oߤ&e $huk'4no2-l6 BeB9=F$F45]$z<_t5)$;!Z%$ h&aߜ\I pA 1IFE=t:b4d 9Fq|ZgcX -f ~CS(b&;%<2H,T{F,$!B+ڌD*ao044F"&O,HБlnbQNa!2"M0I I,F=):,`:]Q_ b8E 4)4y2ja7Zg11e8Vb*yf=b]{cF:IK2|Rc#CLҾBbNȶ9* A8VZpƕ /`SͶ_b^$>I WH X6E roQE`:yBљǡ[ Y^bLV C\R>a UDN005x?92p t>v fB:Fe=Q8a<,[E}\CыCGxaCo39ŁդѰ? 3 7*{ 3?"Ї"zgjxt)(ōڅ_akq!ezRoo -cq4g#_ UPL;0{hg&E.F!rfd#3dvB"O [A5gc:?K_Xp]1B]%]+@2PIu00׭Q$j_<oz# RL?6ylTiٗАʹBZLF,lc;)LX!Â1kS-ʟ| ̖0З 2G>rv@S cf+*v6fcvqBИ1Y6.Qw/ : WmOܞ˂7Z]&+ 5S`ycf`c!!5Q;ШJmU )02XC`.ɚ% "hqz68q5p3DH,Y0м->r2+f[<_ 2/BL68 9X0|LT!ܱc g\1G̟gXD#4j "*3'G6MK|Sv Kf>7ȏ},FM_)Q9,TP{;>CmMIP^ÿQQGRگ"3;?{",n _FcoPG=!KjD aqyCtoU d=8Ղbf).5 mQ֢U̍+{ʁ>Zw'ee@^& McA\ќ0I[^7~x=m#BIljG ħbi]dǂoі-eiNk( !VPȤ ыyf ȕzjЧk^L7CğRadХcʀ^W)nEl~G@ s6vm,NH5vDpeLXA#EªmBiFg.\4ђJ~"r`a/'ЄʽeHUcOXr亡<|2]&m 3"Hk2h5%'0G`%Fs%p2[[ 9i9s$64DfD2py˂07 L_ BK6_%cВ7c 5{*W[=X#8[F3<]:/%՗hxT2GelfбK1fFm%D2C<;P*6}νUfE5lP"[6{h&A-v yE. 3HB8v0U+#h.'( wPG%V+/=H}4>I]BE>4w>H)ubбUk T_K2-1FӅ\ m5fF3/>-\k.zcCO%5WHdut2+y@[ ,Wͬ~ö6(Ȓl"AP@,6_ jG]{Z{OAИII5F+F}574N:`7 o0+*i]>\ OQIJk%=+cSY( @ڙa85QᎬe v`bV  'B4'Xx5xm˘B79o)eGyM kǒɆ*sFJw\v34h·T 3Oe 6<3>L.0bWcU<-yeSE8K⢼cB|藈75RC5. sȶ>\\g(ի$dC&j $h矀Tx] -4EZёQfH3R"(|u0&MLC`ُ /_Fu:hLNl)Rtl*X1BKC0HPEީ \AIq6(GFn!c`imU!!k0KdO7-+w4SR1#;q yE^yc4ކ hдo?S05{Ki=:{2%C2z6 HoP<[Qy1JJ`s&Pؼ4m5$1ߠG9ٜF,| S/qlɲU}#^OFpN iE(v`D + .FsHv~DRBTE2XˢjX,2Jl HWE .ѯIqEVa J  B<)D7좕cӑs%`Rț<)YcPX?؉LYd\ri`D/$JsG $< 3kYI :ʹDŨl002*p>l&4[2tcႡ *BeȬ/ >k^l $%ޢiL=30D~\2`>6=eqRNfj:2a9`5R>C2= khV 'Fy$f b(8R+7Zl8dZ5%xDܚ2 )mq"s/\g܉8>Uh61bM̵f7&h5xi| ˳otMTVИ0;?U- .of"U}%dw&]RgNQC!c摤zؤk e Ptz y㓰p얔CfmJnhâkNAQ95t4~`%bp(p4ƸDN5\ &fJ/Zoo<9_"YLbu9_x&.wΣeF- j}8vZ_ v- 'Idv9EXJU#ڥl(q_ \C)M/ Z `He6p!x;V4vLmIG4ҿ1OM)ArR,P5WF#n̈\B!⾅;)2$4赑-FH-Sv&Ӣl Ż+HcM*xv>F"u؃V5 .$JMEQt3***4lp$l`U+iA ϦE n;rF6[%5&n2UN bkqqXڻMkaѴ쟨Y mZe9:MLM06U7Č@+%b6BOUߞ(РvՍT2Pԗ=䔼IS{Y9]az  t^J1yO'&d1o7gH,ly9tK.N.&~*l W"d*%w^rTU\ 2[n0&uũRS=Ph) :/~L"J`7i=rYK2o;:B3=Fܷ!œ1 BW~gL"I>0#jdDC}A6tp5S%4VSF6 uQ!LJ$3NaM|dݥK0^M+< 6C_hIdXn;!i<3M dlkـs]{w ĦDI8ecr-LMe chbeLLV-!Ѝg[qEM.ƹzFFeF8lXE, W]a_/$K$MO*'і ACpvs?ыb +L2C.Jv8͡1Gă^BmQjj%ACT!6ct=MS%lx~De9m̧6&{|1{a?Ѣr`71 5ZJ㢸<1H`bc4&4 *kG Ǫ!pVYAw %RͺB\8[ͯcMmY͓UKЕ^Uyop&!F!y AhUtd[T uYhD~3]!مO < %E (*J]]t×qt6::0Ҙ}!G9ڸbհbJ>ӱCJq+Яgظ ؜+b'F (S^ѠӗgdLRY醺lm$I) ^1 DL1=іmLum}R{EXB"dL.8VRGJ70Cy il]A$QI7౿L\:YNw$l>ĈI|0P l54q4jAOC"HED)Gr>":F h M%rrPS"ĥ7`0d+9a[M9jQ]44='M Ζ̊ٗC z:>.pLхۿojJ<8lgEd/a mlCOXC.&%_A4GQV{SU Њ;9OhH ژpQ_9P &守DbE0=̲(V5%4籓\-4q=a m)xSp*k7.Crᆁ/-\f\@)\gG|҃Z&g3tG{CViqpTCQ#op~pYC3 M| CE#oJ]QJRøD4v`bRVLCBBcv4b߆i8}AMz56BuN]#1WES%є~^3y /SA9UW?υH4G=S6Ր< I"eA+ ~rcCc rKg/9Ôh8 labp!Lodۖh J 4<=KӁ8t:DÌ߲6cU8/m"2&NiQ7.(La",D|ZPbBr1]Te[ʚ!8XO#"/~i''Alk EY2y#VWdFm*6=γ'aܙѓ0$ d`Vi--[?E?$o1I&&&"TlC#)*I\w3R|`igASN!NM"B-8>9Lh٪s[Z(N87̅B}<5 e[t.obp6%Q~Kj"8\ 1gܗnр?>(rU1zbVSXE؆Tű.i;$8)0> qK(]Ѣa鮈gD4΄JQU`5&֋ºfWz<\X|UDRUdDJY64#jV_`iG$ _OaD{W 3 frs 잋ۅEN*԰,4U[o5vm-KٟDvEOc/9.wDTkH%Y%+gwRÜ TLļD!"@Z>r!UES]ÔG 7J&2k1)A^;E} S+NYRkx&g⏵Ɔ0ƹ$IpJxV.=>LGhؠ`ck9;K06 Gp+bH[E 8َD \ Z-&HNv|T-HUb]hD92Hˀ ћjKV#!R1? yV:1KHl롈Ȫ1ZC{)P b} M4ܜڒ▍6-$ޓl/=$ٜLl%Khhɐg,rU?Vcѓ HX5S#55(o"#Q{ 9'р[3ц/$zrMt_*ƔbfKUw^ S3ޑp* -5ALEy؄)bZy1J1ZG^^Mx::s`حԎ2ђrH#T6kU +'3%h6c()BGf7b2>F,J‡5+F;m  W)ɈfM$;ѮHHR~O,P4MS61HѸ0<:eO iT5P$\l`v?~4-8+ӑ'xg:r%!XbESx Ffı1x.Ж.Uߢ/FRJlF(&cӳ8Us|Ӡ+7 u1ԁz1F'x42Z| VU'[+ ^M(3l?ʇhJ)LA$s!YCqg)/fXAe,P)ޕ*>}q8\iؽH;Ծl5 v?H!)6Bb ђ>l,‹5Xx8 TTo;=a#geBfCaB&QqD <is: o匜"`H5)eB.vOY0W)q Ly WO4e!:eqy %tp)η|{M䈁SV*hd+U<gݎ=Mvdݝ28Ob _*lͷbLW^!d9=@/m׍My0EO:c+&UQ+J8JۃrePNyCp8LF+ VO+|r5IDRtu 0N۔;!Dֺ <.=Ƌ'[Rv/drڲZ4iW^@/-߁#T\WcR<擼tA32Ml?4hZ+w/f.ing9GX34ؚ W"uCaDE& |O^F#ogK>%gZuy9e"D%,'Q(`3 $9QVh\g & Rx$"M`g;r1 *g{??$ s6=v&~nJLઌD{2[b:0l$xkl 94(Gɒٟk+!>^-ey,I4`q-R'Py!-},-Cf֜'\"NS#6s؋9B=:\Sá- |hEmj$acO$HQфaȾL[墬cuFLK^^ג˲e&'q|GMnBR7B:TC-goǍRl6Ulp )6uH< ^:w6§s ?Z$: A &Am睎poLPѦ ;.l.lP*2.3Ƌ8{0*k5)|<#}W;J59-`_x!l~D-}AGr0UUH>Jf-F0IKa!Y s\EU{"}dq:D9W` ;f(40Qf`p{mh9c WS7"BymM8Ĝo-2Cm\Y] *joAla?^ ĩ6;) sWE"L^ åesߑ2ևFu{#7B5oip 3%A/]W9'.>L :ƒLNӛ)c)DxMƒ Y+*|d*X/egSS $vMw lJBtC,JC5PCO*AL ܂7eGd,$[%Sɮ^hЕ:sBh3uz=k򪕅)a10 tXL`UoɊ FcXk-/}13RM0Frp">yq0#ɕܠwQ:'E3<er{c"ޢo XO'dIU+=T|Z^N}Ed!+L 9*h~^v3~ 'q03:"ddKn~ɣ?%4_?MbycB!G By]Y#.e}1bnM]$i˿پR TI ^FVMD  \h!hS=&k)(&r\li䐚 2\5X ~SYKfA/lqB曆NkY͠l#,e *Kvͨ[D-["Se}((zB:.dZ(uZOj5-3vG.n ,fb553\"vĄQ'Ir9Xb3UEvZ'PҶ Ql'JZ̟h.GXWұ2z?z?"%E Z0" hbrTsߢer>fBê,rY-i#HL[[!laf?v؅ϊ4:Pϖ pA[c2%?g/Ofӈ練`262 QTZdJoK`$؉HvUZŒ~B[b9ݍ `QRPk3cqF$є,O2}aEZcm$4:m-,_B&]pOш'= L`CL}qQ(2 ˷cXcWIM靊iI+<vC6b :2_6>E ηgsDS"Wg8(I<&0ƥ! ;26HBo-b?,+Diƥc?,Ō%ƶU2SU `X-#4k׼ +IЉXX>'x!k!Dx{%\Ex3D\#0R Kr Ĩy!İ_%޹ 飌&_b7bCjꖱ)eIe"*FL0d3,p tJ")Y92!J(beQ=ENI'?c;6gK mg"$6a-syN,ڒdLd.^tǙnѭɹ$ʩ1 B%ϡe29G90M:fe1^p-!3%Qj$"[`tȄ2 O־ 2зT6Qp d-Ÿg`VIĶd(1F9p%!Z :Xr$,WMlFDhzf )7ȱ.0"-Q"*ǝ;ΘL*?*~r\wꜺ.EᅢpS8cw6<0Edc/8k)4_. =<0L]<~MMԩ;I?JEmȶb-p)'Nf|nP20&V֓l/*]E5E SC/Wx0.24%?qZ%5#YpvfA&[: &kE+ l?GeG֊<%;yͮޤ]C->GDEddb8+*Gp|,lOFj[h x iah5,IuYhȐt'bczd$؉]h6X'Dz5#ΐ2_SNoz M>̥TrIk(udRVڸ7OX1p5e-M$xxV*c՛E . RB Iݚft)m |Y[,޶!^`G:6 M (>'-I,c0bmiM"N>HN_.\b`m4,DC.ڦm YrX> {.1:+H~ r2)$+iI b6Zf;%BdT!+)EQC.XɼR/u 3XUCg8t|, j8xbUh7D)՞Be)ie$߃Ef}cmE[?+01ͅDN݉1'КfD4QhGJtyCC-`ȡKiPǍ_Bᅄ*9_#g2kЇ Ti l/$6~9SYHC^)n'{?"$v!1&]aH1f} v*"nk4䇝j_zE|P)ԅЗ<2cVǖHK;džʾKKQ#}A׭.QpRfv'cЍOA<45f:oH2Nk=)e"Nu ("Fr`lY6 @n!b 4SgO"N)輛W4of%Bؖh٦x#bWd.Į/Ȝ/p'95|"$JtVt'Hr'O#xO9ɗv$LW.Ș̹%%_G_ ic~"H$ --4Lvgc{EPAtoFN,/H[Ł*s0tMHObN $O0*L. KL;dM1}P7cѧ8ű]8![A.Vu>K:QJqi,F]R99j{6F'E!Z ^A 2gȓY64 $?q˃FlBEfTi`uϕ/8[ )Q܉ļ1`h DA.~N1 e S j+!Lx7lboتxldMQo"{0Yr+A9..*QahI&`0~JOccaWܾB83Α,Tph } .h֭;)clw):Fe="l! ycF1iT,Zb 8>@'wEHXꄽYH8-_vWzji{-6bmLM7 "$ vzHJefMpi>F:\p^}1&\z1wb ;Glm^i}x4"_O6Vд,;k~dQșL0#Y ((i=D4' yBp{W= GJ&t6nq/eKbj-[ *_Q2o#.MRN050)x/+̬ Cʲ-)٘$.a؝=8ؔM[ԒٳX1:xf F& =⥦o 32[ ,l:FJӞDZY49h}Q7c cX44W"ʌ0L|JrQ.JQfw Ca h6Щ9f~ 0QXD>Rd+204o)3" PӤ$hJ01TdydAe^") $"l?ЫU1NEHlPeD[t΄`v5\9+%2E$OyiKw{nREqՅlcWx;ERSr5LgXȸ'b}C8Oh\} YYQ]!|{9=-<,cN}яK;27-5,gY6Er ?H"L%j{l?r3k`q*Odbr2 9F7$6g4^>h<6UECVE,g=냈a54ˁ)ʡOIf3?Te?,%5_`F?eVAMcZz&"`s3 <0hueΜU\ (W"^F4A2y5\H*a$W'1=QRNz2Y8sw9u>ѧI|CGb14|nZ,kB'b16ke`޵cM䘲EUl+M R"̑±Wf.l OC_;$"\" cQ_%ЇQW̌^xdm] '҉6B{-Ry)[iЄáO.YD6 Eiq+gHw[P4ع fd?>`cTmB H.E1;.<f$br&g63z!Hߑ 0ɒkgʈI2cqɉ!~Wayf%m$@r Ҏ&⸸DkzZ.V5tl<ڴğifMfN740vАiXѝXev}#3]E\2đ1-`Ōb$0fKycpu!7E4Ȇa/iR٫:Kw8upA_#$"v5H 2I%[&04"g!μ7]-_nt5a_E7Ύd1Մ1R54van_c1Cjߓ*+tUo /&'e\hc-2mv8h F/$b;sѓ7 Ntƶ¾%#ڵ&S軲j2l\ E!v;' zo' <UVG;u9 liJ⎩29#{0{ }D`h+yb- 刈Ɉb^xN#1qD?P42]fJS}LF8 RVз/0(SR5$/rlxbDe./;]=/mɈ+E2oG(6[㝎٢H- E%Ǒm}7'AV8; A)QfMqs14].>ʵ%[C:Z#[T[ltPīSH18؜ʔDN#d;ǓΏ7fDwx4mƺѓX6<{PE'%Nꮲy)#eG> ; N"  Dp).v0Q=`oG0*a- QA3Lm{x}eъ>r˘M;d/C z>Ʋ`B8Mm<2{he<ͪ.LŵmNnckq]U0"7{-x.-#o aΊ&7 ~tt@k|t"SQseDgtv!$Awd~IbZdrq͈B3 - -5ugB3% e x 1xGCrtCItOAԾ2[,6- %5"#E.>7E +Cp Vc{рbfb[F.Mh;2͙Fck4@b(ai,m0GpXZoYc5rЍR4d˄#=H ־ r{<Q*>LRQ'u߽BdI!$X*Q_2"DqfTWzpajQBm&HUL3Q6}u}GA$W_dM|v[k$=REAh<7d=ARl3- n^ 2jЊ/@:.'.:?tǖ5GX}H3'9K&mu]QȔ_R/%V.v l22-Z(O\4-3hi_l9\cy،c PPKClLLU;C'\H] om&qhL@E;Q&xr.PȰ< # q3zG y 2ox%|'ltbQ[-ԡ1QJdYV1 e'oJ2RB6J 2{ {Bmؤ콶2IMAJYD<ƕjQ "-Y6p/e(&};!&BMf+#v1!$r#nՙm&PC@gz9}LJh6yb+DV'J˦{)X#k:-c?@C*ϨOY-+5e'i(0-/bj-*qmY?dtWv(F<&쉏9>ARbϺEl.[E{i*e:WM:eU/-FyVp9WfnFPfZb#fAUk͐W$'3p.l%ӆsQ_>!s@]Fș *E=eɁ ؔ+VyWLlOBf&yyv)6m\5M~p|#Ijז'vtb *>&4g(i = ~ٴfkVh"cAYE:1NNu~C "11F<QXv%6S)B4zFYY.>bлQ*<8%B3}ތ1k(ZfyBc}C7;XC>Ob\070s%E GhY PlXlUDmZ eypPuH銕uC x"XDI*+ف, i"?PP:V %d{1KhI6Hǂ-[{mיl(`Քs"t]ڷ"K`JlȘ*U(r""S[R\r)|a ̔5F؟ uʹL)-ʳK_-R#F0X* ނ 9 )Z?z$8ld$#z)sBZN30`pRHO't#N-ɵ5!##7FJoĖB `Cc88#2i$Jia3ydZS3oEB~j'F i1$Bj|j3xFsz_OfMfdNN [2~цV8s C r(j:VӀ 1sgxF+Q匃uj'?tChnEB=7Zp\oh"VXg٘ pxv t "}S/C>teRkgbIQ GafНJVNbel,.( 8{[ m6JB"8H~,6&KƭZE7M"{בD2G[Ʉ9pC핦rƤR,.f1Єae虭Mx%ItR(EXɬk/^ U± ^t6-7#x08p20ѣgxIE4Dira3'4pnajuwىFq͌X<z2T"[IMyZZg ;Evgk/u$A&sQ^8l㐭gR.(Abq dȹzlwli䐶t572k&ZSQHMNIㆊdɊ1 ~*ŧAR~KP}!ьQ}`k(f1u- w,4!X⍟[5ь!@N"2k<~D+=Laa:ЎþJ7VF{V̽';RAUm p'jcJm#E#ZȱYvbӱ;"X2!t ]A%3.FDF2lMX[2ÈK>9ff7FHC6KBTB1 V ,Z" D3лu4[w!6 L -,f"eS 3[ _G *[rY-6^T]sa2cd M<- w>xOkM1܁m&+h)hlL/ťAk.x,`LёIݚE}GJ%]0`XRЂheST)NbvJ3T"R{ OpdaH0? XY2جQQ 0ljbamM+F6+<%/IBL0jyF '@!&VPm pϡ4%k 5'B5҉ؙm[TT4N7Lb5%]hOX:fc681>։׾ bG=>TF99!My4/?B>E!3 0j *\4e+d0y2`J2a ,"V=έ/Hҍ; ZBȫ&!)8*תQhYN(ll|e,4/>͟PhC| ~&'m56ҺB%wx4o"ͤUdQa UJ݂W OŶr.Lp/&[HCE7$)J~>,y [:%cͶ0d|A0Uhs \0;x, &O# Sq<#Fc)ZȷNEnA<BRI QcDp<6U'`y!uյЦTD.!Wcί!cg56ɤy? 8ZZ"sbhsqtNK =f`2U1&,9( SÚЩU^SmgDmRh4ղFe;Yi ;1l?auބRtb6h)csf+9t;%>DQ62#87eZ|{U~mB#W؟#| j:'I`{5D5j&j F$,֞Jr&.vrBkp-!l\idVM1R'E80fKNub)۞8+cςSI(mWpqy3%ZZLZ3(1Wa^ * bxY# ٠jEli6_ ӓ`ط^ ڜ XG3,ۂ6e2DZ,V$.O7lo&e1  fs&-fvB,%M|Cl{#)V9D4Y*Xy?pHcW~oI5Ir߁Ed˒YC 1Q+UǎNBm&m1;G(-ZugcXmEPD寱oCz$ x27a4'$)Xexoۡ%G 3Qh}JmBv;زt4Ǻƞ2/l1B.F`SMP_WLL8|${, NYrFؚ3b)gg'LkH/m`Ό^ˋCSӪ|Usm(XxFYQФoo;)#Cĸ%=%nl !bwFlǁ<𬐡w mXg%M 04RAWCYS,#!*>gC(Cq p!<2NB:ցf=#Hм#)j Q\xCqIA嗦%p@ HG0k9wArCKbW陏;ۿ&nKHU}(qu@X/EO21ΐdhsU)XxBLmC3vTo&7e"+t69> 4.Ҟ4tReD~M!%Z1ѩfP4u鍃R-ݣUtH֊K%G_ۤ1g-i)WCp@r9JE-NLo 2r0Ι;,Cz nt!."f`hŃ4 lUrKTfC>P4_dږЙqILќ`m:[@i{>)aLu0P9=7ѤC  2 ǁy!)$ WqPUAemAm[\ g;=Yr4U[UфNp`kb<0&=Mi ] 7dht:B[^L& L!B(LB5T: vgLCG ݈Zv:1 t"k薶qQ+I:GBk%>4¬PѤOb#ӶDe%V6 rǤÞ d9nOl'3^$Ma)df SA\n;~R&/ 7-YWC2oJkA֔A| II1NgxlɬP׌B.J:1#)٨e`3J[#%Z;,/~Fφt #\M~VYK"I'duHmȅy:BVPkpODBL4W K; F_&E^^N{^ 3Fx;166ٲ< {DgcdpU4c|/Yiyd5'hZ1x&Ju]3^k1p x *Kb3i+EQb&Pvck M8ذgg. "їb\)襔K2vE?\ތ%Vt,&TTMsTd|&#C qs%(F̳:iRg=)'%oTC `?֠dAiU-d#R3+\d]ȃҊCp]udd\ !}/QrI)J}) ⛍pQmGR;w({[Sx _}IۤIi4?[wF˦SMs-~DL0d rk ^9&B\ui .5%[YFŕbȻ(\-w8,H&dU#8)N5A=-] "BM!% c#kțpAx$`)YCTߡ'{Q ~imm2;K~cobxr?BZ'2>OȔ4(WF (p)fE@|\F[ sz!0噍`N*cOo5RbZ=HYy>н4l)4G &<}+GjG"Mk$9cYFZhY<&,szpE,Ʌ 0ؚg %k`xOP5x1L4$d-?X|#y2 e,amN,!0>ض$n-keEx.c^72Ř!12%6zFl j㢱f`Lp౩Q3j1$qhi-,X0r)Qr HeDWtU!zҖA4KܖyՑ|D7ŞFI/дs ?uƆFd'"Й>F2G݉0mr4EDXlY~vDIޏ`B )f-M sjC8Q#C:4a-]qkpĮ\)ĠSZcIwcmiw:w Nv1KS& #?<3"+\-S.S$~Fc)[iV4FCN0ɔ靓bjNij? YRWc[&6)c+yetKL`4MR[3$9m3iJnbfp4jG'a"-6mtt:95pA:RyFאrzܤ7?PI*8]Xv3RDz6ۆxnhY7H'D,|:f2]1?g :ZbcHlZ!M8)8QpdZy^*S*<]f>θi1M*WɠD!xx-LSsdE }\WcArـ#Qj #ȥSMcE3HL+rc)zS"׉'FwWMZ;K$ΐ,ѤBx &cTe7*B-% Blb6D^D{ce%hO1@d -Iflv;5>y3rbWO˿*B 1TCj)`aގ7a:c$_;3+h5X77$"'6yk~A6_ҙb4?ҫjdɋV_!{-S L[eR^#6ӜQPWm> oZ1,j-<7ټdً ޔWEpoRo r3RSGj^lyK0{%5c]! rkR} H/&?\25姲9"j}7.QЍ ~yS}#$fNkk?Hjx0&ǁYd7_es6G5 _fF v*y_Id(pP^b:@2c}neMFj8]jk08JQAdj3]+*lemfR :8gbU=V.&I,Fc)Gp"8PD>4.M1pčNFndd EpFTQX*-#l<6L M 27_KB[H3/c[,Y LI) $Uz وݵ0A .Ӳ8! @BE0j%QDjxC3DR 1k3h4, 1ِ^Oxi5%%-fЫI˜fUlP*]L$\JFI9%3֌ kU$>}ZB,D}SM jb)Ҍ1Cʬ81Zҟ$faRBvԮp?5c+RPDxctХfg'^.C;dD3I- DBlHX DAuhP* bl3". mHȫ8JMpm6ѱg v91ld7G#4=5p }hD<fɒ3؊dW_yo- WȐ-C(zQf>KI3yfF_BI) N fFmbiE: Iz1PQ~z DD;CvMV W)ƊA-S9_exbl*"lh_f8"M呰d J48`MVEKlAhI,:tR7MsFz`cvan *l#bBޅ.eDcpkМ| 1a *n C&cl^cb Ǚvjׂq=U+bcjijB1>m64IC|6KX-CMW:T1.ŷ b 7KX5wዪ,ֺ Վ "%W.zyW{K] zϑlm(oMѓ섣p/RY:[eSk @mtъ$vYf&!1+A7CKB03Bv",l0A&C2e \v) 4cyҶG`zf*]lcTr\37S:l_ n҃T6B}jE 'g;+NCF^7Sί~^^weʿ$VMGɛefzG vr.Ը1S'ܘMnFc.ikw[f1 "HRǓ z0S'Lsl^3,Q1[-1҃;5 o"zh'mN~AcLv7 27NP:lp#ؗTɎoB Yg ,dR"̡HQj'""ŗZ',<cUظ9Qˋ!}lt9壆+o8B:pӃlC `- CvOxcشU5G XqlcG䓡x؄ٱVuX^5y'w},ٳ#Z017U`L&8.?r"z ! -At:6E[^מg2 f^kD5s(MA[fKb4ѭ@+>h&#X# N !S$UE#B^cNkY+ԋl $fdȌ89tSϲ3L؈5}QVAH-$gb68&HbzzZkek8}K943EEM-ב:S$hҳ;eJpw67I&J\UU0>(2#7`Q BB+_nZCd",J,3#eV9 L y L_Bؑ[ i  Ee98ĞC/l|)A*=ɶ* {b&_dNDZu"G37UAAkSaB# vjkv62sDV(M[8}WqyEٗ"\.GTYȔ.Ml^ Dn*=wEOc +ȌH=gTNj:O '5pB%09<62!sn['\Qb!:2A;Fɍpd: Ny_)oMgҫ?y0y%1d䆲NoE%?\|mf\VFik[c ƞ#2JmkгCFF. 6k6Bp,g8<ii$5`i #nAUtNc( cVB_&<:QxRCJ* {72<ny0 mv[Mx``SɅLp);dDоVc# W\ф$ĩAI1irV:X! 1fŢ[BixY d#nS QE=iD-ZCKn&BOG;'/* nK m գk%n_czZ[񍗶< ҊT ئ Ee`ѽYZ)ZrFؤ`I瀅#xm ț0Dbds6#Ibdctؑ9[tAs2&U<Rjnɖ>jiw`Йt/#$c9}H"Y~L+@^C"cM;v[$d,D3X>fN$ĕ'yɬR%tb<1ggHTm;B KX^aع-6[HFWK>EM.X ?%q) ҝiRƚx~^p'I}| jZ)hZb"ep!Ѹ۲Fh4c mT1RQ9 VE^ wG%sF-ȭ&0O/Ceѝ%e:]mNYma%1 Sވl6R$bLYK᤼ *:D͑FjqgNSyf:#̱8-nቌg 4l@=Wp$;zG&iU1E4xzcX sa#|k-6ffI~ I٭-Л2 ~!z mՋe-1ZeBrQڜi-#zsQyoBOyOrO%**j8YC(X]ov/B6aDXy[z`,Jc%$ؐ6a (/Ar>aVBM=hpC J55٤ƖD,wM6+.}2%[E& ./n?+xA"P N(E`nFq9 &Gr22=1;"I´R4FXbl%[# WB7,z 5%4>< #1%, )(WlQ &78(lA̮l,qeԲYf̫qVpc[َ4e̽һ9呒"ea*8'#&%93i A 0E3f1T+fg% ldKOTlc嘠\gYDɣ5$҇% FFdȄ/UOмbx^ac-O Ig|FM2xoIe1os/hHB7DUcjm4*A0GdM;m nGZ$WcV)^fU^L_j XdIR ln-C&RȺ;CX?r\b*(l˪!i $p"YJ!$3[ ѤK,kؓ&A ҂xVp2Ѥ:[Hc VhNYPIU"{;O%yx4 _NL}c,uAy2KMg7Ewg#CH6L1j2P˨#.2-`*hed-TbڨiĨFhƢ/#24jtįbl1i=`| bi/Fh/bB% ݌(τL %iP"L[XACb|&!;Tm\eg5YD<Ȉ^EQ&FLCY̙-\ĸ7tFFp ZRQlBz-I.&l=x mЄ>ɜ= 4U_'aLY8oy ELϑ*C1LC,"Ę%4*-%ѭ(I($Hoɿv3f2hbET]?Nث0r'Ju"Z}cFXg +f1M/J|C7,ȝ&(3 h̏eJ2hݝ>ؕ)M{ 1C4L:/S|QI pwDR* Z !ry64Vh W@ՏŠJCAP{&Z`B;ŀdIRR x# /9rb#Pv`Vd $d<9AgXs()S=B}eA}.:|kMLE F̯7,O8u"bb y\*Ū؇L|s]t=4$-ɜNǼ1 ?ᜍtc60bKbB6hЋ|Ȟ$x35#Q~! ey.x/V$כSRjc`)MfHz\ P7($Xb8m-r)Ɍ= CG84Jt8%re3@=1I"<ϑIJ%-d-*qygk>xSLV#<`oj5Id͘$te9a$HW"LPTYsEon97\cvUi (5=Ol^N mh6;-eF̻DƄZ=Wl LaȕP M|- KɄq >J{$r$dC3R"302_4lfD"d$lZ)VZf+jx#y_'bk 0$^lfk !H/虼턊g" :! n:F7*t/b:(AM2ULf$f}KI#ܩ{&ñOcw##y؜A C=qQ6 4v"<"v}*\sm_`0Ο,uy6x2f!es J#gCh[MB[uď8FQ=ϡ1%C $SCM3֣"^;*^M <ن̧zĦ;3Cٙ1eY\yeǰџ'75SLGghFȃ"̱@8q.v64%kuXL,i 'D3&ٲ&3vǔK6gVpX+WAv++AS5M/1Vi6=/ǀh- alq Z A+2_ؾLY4eX8LLg0ihe.cXBd6+4KL`B!/,M)C,Z3^V5M &)X4(<fD/ sqVhs\6\iߡdE 4K$&*_b PJ?Ԣl4hoɛ覼!SI"9*H8cIJ4)mlO î\r7(.HJ{C]=ܔW"WH݉%$!ߌQueĞi`لYHvaXAMpE1i7 Lq:BZg*D( ŞI&=ڊ& FهHhd.,\#c ?O 8r,fEhdab fzTMkylN2]Nvc.<-&Z>nt3aBYؗzs[K){^uВ ^rhga2K(,0dؤib@#}07x3cifl. Ml!:ث#0u>.uQ?r!:v 2֙J6o\ 24DX?+h= O `e#rR koJ͡ s&]?DpliRg]W}\s%Aϸa4M#ŻzubTCXb(%˒b2wmbFE{rgQ/= 50 }4*b$C4T^#2}y D{} 2H-O"t* ɐfehUE~+ѺTkԽArs-?fHQ )O" rC$(] "w0#_L !BfP$Wj& x Jcձ\ Bf\1Ѽfo -e-1UhZFկ|N2T]8,,Eرi @[ȔˡIܐdeژ6JfȊ_;إiBWFhN~>a x#$$oɏm- Jpޘ/Bi| ^ 4["2 K*Q!jDl` 9y3 &FE`m v\Tu)'YG*#`{pS % bgG{1քidkɑt6mCs70,(e')#'#NPfQF:Sc%mHTʟC!HU IV QЈܜ-/gBޟlI=pFIlbHPbਵDTE3EUA i*Vf隸e`jU-2?`RpsДeZ"3U|#$?:ƽ4: 6o4J;wlΔu\!P&ԅ*ݑha24h1ilAdw.l?MQkd?=fKt¼F2**-[m!3#HMBKl5 |l!cq/()/ɏ hPy3 ?mKEҰ*Ȭ Z-Ze&Xz32<4 T,FQ QO2,й J`EI 2$kBC]I\.IŒbm ƋM6)]_-`Rxb{H4 B`c,|Oő%($ȌSMq nF+Bɷ\Әdk͓~OY_cwxb*R] #1eyx]h%!" KJ(/>sOKba1L N0*lьGnHױ3JO_O9V&q&pރ'3x<'h?" M !8"zv>1ӶD)OxǿO-f4b6V}rD]%G,$m [?ghij:H)?P? x!eu!TE %0\OP[< t0#TZB y̰6[g)HٶXu>2%mМ;L2<XlEVӛХ-fƲ0SXCjof"Pڂ(8ϦEɐQ +FFq%U3]jf_ I/a9K~hS8F&p*yh[x2ɍ[{!>fǑjAOؔdsM86Zb(Zɲu # ܇t#~CFOQ\BdѢ$vJ3% ԞKɁcD(]F8M 23pV)J!Gl:"DђQlMTA}4Dz>(NHOheM>Lt+LI? ߊD8 ^k0 ܁%%_?؂<-8 { rsg"?_j 47xerrRBȭɓC+p'}o 硴BioEg @L0p720o}%z&Ɲ-Ǩv8$kw0l$m'aZϑX"oLzT FSIp 2`|-Lr5>t|6 .Ȣ"㑼X-4=b((ѬO"Hȷ#dMcLպ&pn PֿNѺf"g@EtǷS!,n%([ԢrZkC}d3Ooa ;Sؓl{LN[CBy'lljVšF3Ļ3 :)rc(S:&BzˈJf5<;9 3diUӘCdywl:0eNOqYzck`1Vyް/aF 0' n4ٚ 4?,ȴ6$a6ETYF'د Ы`hG 0ʤ]Bzj9졍eb5S,TzF1܊%z$x{&%W?պ'2np2[M,h.θ!! F_#n-fsI'^#w6um.3}{umEhw~ɗ)vfqѭ]=ğD~^1&[iT5ܹhYDFIjPLbޑT1x1@(j %Bk 66&@O]ÏvFY's PؖѴoxU6lC:3MzFjM)!eSʜukLx12k'G:_Y1•kejx"L}A) U z#IT] cF l\cgpZz#jR l Y.&|JYGICl/T,s(B{[Q&Fm?taHn!/뢘`RĄ`Gq![Cp "JE # ֍W<#ٶiB-| A`r5ɂM*i܎^p> CoA`#aNcC76/Ibk&Q ّ烘ERcؗT7ZFLk23dPrx1{ XQq>K! ;)椈L/a-QQ*y]c>& &F鶾x-&%!ؙ,vcLk,EJoȬdb͍2E$z- UեfYhPoxCn 4//ƞƁx9QdvE % MQ~;2 9DŽ? j"o05xmZ٦R g-ф勒>8ʢ4*[OA1E|8Cb]/T);FP-=г`22lkDD(W᠜F79a = _^ݽ!9)t(I%+"K;?7("5LdOiL^01Si|΂2+P `Kr&:í'6d?AvF-cW6Ȧ6˚p'K`[&V獎H߅AdjRmj/c!_c'ٌ,-mT";ٍ̜r;0dɛ06jzly⾄ū*Ī,<S\`D={FEI-c/>+c,NJfF0>!t|qɒ cdຫ>ErO<TpDdY oxgIg؞B(-c9Ztc"F tZ]`$J[B86ÚN$6pr65Xpd9f$h2ſaI j!V- tWٍOђ:F>e3,Ʋd?E`=i.r N?E %. 5es Jdb0n܄ؔZ|+={~$J"YVrLvh!kII,b_/9QZ6* 2m9`rcCl[]QenCpΒՏ14+.>M4`jd0$\pe%`lK`CS(}D Z9M(P8q鳐Кcr4Rϒ&1SjdEK_FɁ(vKjM?w}%]6LK30[ 5L:"M_ f!#BLOcz5yؔ.FlC"[:-/FWn$x+1D2' "ci܅:`ԣHy-ƪC!1K#0nW#JZx7pJy$8ް%^ %\$,= s20c<͙KYAFT_"VkluJ!"? WvI:ٓ.#]J9ҹGl`xpfL^$)]́(F/B'\K,hn)D5d)kcM:IS٘ . +z_Ǒ Mv*tų(UJ# ĩZ:N_c[6= 0x#%PB j lA&E6NS&!Nc2"ɸHH[гt%`bb$G <ܚ ,D_j&4(T_F~LFJj1hVm'Y-hNdjTH8&5o3XiZTse]>+3E?d6ˑs1;D߳)fLmDڄ ybRN5 •ubb@3Vڑ L<t Obud8Ptpo-1ey9XDdg$yC3o$$PFౌO" (4SQP#vlXB،YC lF_hkF4:66p?vD3u͋&8y\ ZBy'0t6rL}#-!,T,Y 5=A!mm>E8;k?cRJLDz69)>_LG>>Mڐ~tG(I8msJEmud]cd5dUz\q+4!, cبiCQ<AG9=?I#Er k e \_L?Aqܡ<B-p!,Phz+Up/,7ҡYFd(ZaEpLaGe~b0hOL }l=:HS&x GxW9 ITM23h1Fɟ6ZS8C ce\ &pY0K0UXy0G$2Xة> YՒ.]n CM5 <DG8j,02V2DD̝\돇! K:Y#4_YӯƆ=܌Ɉd9ZؘC}#-r%Dur[G!e0(ǧ < r%<5# 7#CsQD+FXCrikУ_l!zmqcCV/E s. [LxĴ@8&8C. hlI V1f p4?Cނ\&b(M~Lc!w" ?vvZ\oF9'δhѵ; ػjq& 9aL-@BVjS)ČZddTܦ,<4+tlPmd"4+VqU>51J+ 1IP6cG%3z@ОC&$=1 |ْgQrt(:Ȍs,J 9:eL~(<ݜ')[H{ǵhœȘ&4) B30Hjx6Y-J>P[&AllZs&AZH2J+yдV9q3,dE}3 N bB4?#4 -xVR`zkԺ7 #gRoH"0Wb&X: v,ǐ!+ʏi_l{oȼ6aZ$)ٙK+B$ho)Ҫ o#IkC\{e8 H: I< Hb2Mrs^J=b &-9w0X{.\خw _yUrY N&O"!<] } v>&51oS(豧j{%<0Z {A#>Pө7yx~701#P lUFkZi \I> $ f9LIC:EU/&9SSǑFƻ#VBSLXЗѪLG,X_$qD0cFrOZ#Q'@u{fʙN{fYb ޏ:(Bf~6ai#D>C6%pv\ŎAYe3} ѽ >z+vyG5b+fD,sB x2!< H{cڙ>DL1fP%ʸ%2i3+zEM045El%+R Q ;С] [M1)Vo\Dg1ّ.JLL26SH$gt&q$#12Eѩ(3qfFױd(Z|h<[mdTv>^ {7$:'h&#c32^ !k.fkMnD7,xFDB"+PB& $.`ʏAd& QAFARoֆF7PHs`Ck;d) EɏnLVckv>RPH,,ПB!&0)* bb[-(&aQMzB#DgUhkViaVO_@`M"0".LST7d~4FXz)`d|5$'%:/I J5xCSEeȋ:"8B FIO~}S$fM4R.D5ዦŴ#s=ٙ"\2\ p!P ħH:y%:x_cu;29/7Kr6x+̨4Bs8Ȋm>hun&L1.<Ǵ>< 4=at-7`]Jg!A密!zASPn#&D FeKe* ˃ؕIq|Ž^ 42k499. `elPYKu*CM%O# |&n$:ˢR1r,`JR02G!zdN`^x$F'-ϔ$)lZCL7#vNG} tdlYCRCEO!irǴ= 6Z4bTzfYGVFtD n<=4!:)r'!WMh ^6*g0zVFk]< ? F}f-=C=T57>"8kam]%Йj=>6źQҩuח k0S\rvfOEТ%hJ;OǺ Z M9 vTf>PA!,!X,c_dٛ&1TJ( Lh ŦRK찑A!LB%dTѤ l5[1FWS(C\&tp!C\L?ÈPבӷQO~EYɶ)< l+&&0LӐ21-ϮW"5]6- (hZz6cGȓÄdyH2y'"gb$aL {HfMaFUGyEEF4`O(hUة J#M ._JF+bʦ$Gy_x!eD8?#%%cF"= &:|wǰZ' vY4vA`9HG$TTdK&` } $j=B[TE727RG.:hlLCJg襁NZ|742#apldkPpɨO 4dgA%Ƹ2BLWOL]>)X,jls·c\o@df*>Jap`慪c$-hZ'}p6@QLa.h=镜퍭 mur`FgFt7Wff|/CgbG$d^SbJ# 63Ls隉)a`Zğ0"ضZ"اt*kpy<`ڛk5uV~Ƃ 32*qR: d:Ur FH#\K[DzCf;:3z=S'/t 6BSlvj'F CYWQܟoK6 j@vf<,3ʝR~[w$h)vO_޺cRrB\>*Z>ccqӶ*8u+y 輖`%6]3ecx=_r$O,k_-d]`gs20C l E mN捿-Y+b쇦q1K'.p&ٌɅHL?eɒm&RA4pnRMa'#cZ 9Pfo{#XDɰmedv'~Z,Ņp_$By <(930i{ a}C$iP9fJ2SPaP1l3#< t  YGYRBAˎ2M;[ЭuV#C'MākbRjlDp[[]J|cvA1rgo/\EY1'U|rec95蒃()Jpn',ZRȍa«}ұPNצIO9[&dg/%13/AobO)llO"X7C"J9{TJ'p49S0E!ǃ8rRɇy+AJC#;W<JL60訰RH Ap+6(Ծ|RXh/6l?g1ׁC B J!aTva m_sCzI_cqkF:1ru*(~4MlZ8,2WB%b& 0!*c6i!K,'%kl٠ʆb>|KZ+x[,R$olz̆f:hWO:6P+'k!Dq ?:͖{콙25[.D,-5\&i(e3] t"rEG4gf bŊb3>PڦXf7[W͟V3"tS9gR} .#hOvJ3Ad>aǽqx6cyFc Xc5{Cۍ*=L0B#oA%C9pC;bJaZ `qеCEdyBqS!Ne ^K1K2bSL_ Ь#.6:6YX1fGH 6YU ip!+)16:Z7gL&ٴ)K(rHb&!p_,=iQ_gv?'QL$=uf^Pl/r96dW+dWNZLT7^Y'c;tFغ[/fTlaFqP"2|K?go`#83n]. '1uL`veSBI:h\ ν5;teKvb;,B\aدn3&t* i.10Ƹ:E's$d:yE4$=;*8}]=^>ro|6&[-Ը.m5^_GMVQ35 s1x)( Z z5O2\6Uhj$Q*QُH /$ . at#ZbO&N> 2 X"3eȹ;DeGX(do@c|nQN3>hmz hb,L1Ț l&nCy)a7JVNa2\G6C2#)b;#AeR%l`K3jDK\O5S 1_yGQʽVL *k~U4cŁ\1ӞŤ2.2kX\ئX$c]({vr\]c(WmD +gS"cgٙ&bcMYeoBb^Gx%]s{-TMO63ǵX$⼘4#lWW)_ L1GkN1Y8҄_i:y@{S]I/&dQGR$j EƖ1Tr8ЊeItٓ[c4ui#2 3-ȝsвd'ō|A,kBbFͅj:S4+#,gBKL&^q⃖O=dLU@  BNB} L*d[Z0_GTQCGZRd.Hn6t7$/<0Nx%#IqN4*3`IGgbCVjp)J#0M:hq4z<)5LgK$nH Ϥ c #pf;|-ES=fdrܰ1o N.4Є1LXa @6ag9j$x&Ƌzhjtdͯ<h~;6`I-2Hy[P '<13&諔U*ԏ-;Cug#ez<||j`I/:H^呖yԞ[$h蔍r6̍pdyZT8BG=@Ƀ躕 s_hk\&L&<a+0&‚&10R؋N6CƷ$ta$|O jEE X%S^^s 8 KOe-gdFAtdGP 0*5s2<q&c[Cu S#h#(< pCL]`/?:i/4ĕ)Sev.B_Մq1S88u1 F:HL3X62F!PUvRn29d:,. oBROcI(]62e)&'2d0W=|cJȶWTlS!poiK!翂%3'Lez*vLJU_\3S}o iMaꌛJ"shʫбbKK9yFi05j1cG--+rśB !G1 b'&% jKNn L hl &SFnA2paVК/%BYI{9`PQqj6o;)'BH$p"2Uw1\ L2!ؤU+0>LQ-<cDX )GQCbb)QNW%P*A5-cxBH󮉞S CѻLC tPv*bHbDL:bedalcK#zcdHk|Gv3Sb[OBE6f#^"щ-CN m ȸ^ǜ} 鴹C~XpȂ_6G2KALRy3gwlua͆g 71p4!z4 aJXGzio~${屛؛NՇ ,Onc3 #Z3AD+mAqI' fSPlN&:*hÖa.U ZHO{\9yD"PR)(c ٞV&*ء%#7S.ۂ mFF>]{z( DTstS(P<݉2tTayQDz3b{"dm(͏^"ȶ)v 05,确PT ۓ^ʜC{]R<.[Mj&v] xLQt[I>Z[bidɣ_k G(ͱq13el WBX--!:6`IfY Mo)bo.##lNS)hU28[bE+F ՌTA sF6b'2*"F?H w(j bȶEm\({Lb7ߧf tݟ 01*QK R,t [+9.Ȇx*.GQȸlvyȮJ}#ɝE'Ȓ&E{DP$h$ೂM1NjfѨhɼMCk##ЫXbVI,-V NAaSZTD/Fd*˥=NXsmἡ\t+tȘbOaIN Lqqk@+,E!aEmr>de$utbcVЦlU S;,-FR,؈O@, %%q B|2&nWkb1 o5F]Z9$Cu;3aL`X` x1u:;SQ2<Ȕj | cɅȍ`״K)OU&yFĎ=fI20Mp>?hIKC FL#a ]!6Ĭ. 7yu+'N,u!(%,*ݍ_| cZq(9$;xp4&2) ȒWC99Sߓ"M +bb 4llRD.L !.(gDR#N= i k3Z= %#M06.>Q6&؋e=m/U czg xГ Fr {V.q4ڡ:";nl3т 6%WC82p>ɖ!mס62ڋD$`V B?'QkBĸHd4IxCK^|%C$ϑV122\lJ  2RX.F7#ADi݊FpM5 XFλ3WZ ~PU$ ɮgB:1d=5C7InYE'tMЇy<g8 , D\nw55 ;,`2/4 ГdYW"kaQ "7NCQ hsȰ-Ȧ6EKd8Q!irTGK3w1΋,ǩmcуB ͒?„]rE/eg$`Ϧ7Fc!".% 6͘@ lqȑR&eءg 1-3#i%tluwCهH\4ҘimfSDnE(ms KaC5G %bY?O%Ќ pe'.3YbKESa="D#:ڃ9Pz¸ )_랎f?uޙ!zx) gfΆ"4 ^RfA d$%IVF!BJ?膫GPșo-4 V :(ЊLX$,S09Z;l6fT6:P'BM u^Da" xkr!6.$a4s0 sR͐uFju CVX>y o_d%oFz]gD0 1aTzQv[5GQ冐'fkЬPZl%, EdUQğ4nHQ:1i4.0/,L`D $ X۰xg!RW,} c8<м?(NOKD؝9$:r^:1`)3#EoA'GZ-!nĊMeqHTxV΄\[\T]B)Dc*}!yP඙R #jěچ"=U4- Ba6 J=MnDZo2b#bF+H h.b%8W(ƅdݳ i\ 4"Zl )K*G Dge+(ݫ Ev$,dZw)*IEIƐs&CF1dB2Y_;d"`&,MAY;L!L0]IT#csd4`pɰr}ʍhW1&׾FsBPФ lsɂ$Yh`M-o ey*$䄉syi`[tWVκN(Z7ѓ ˃Lpmn '(EN 8 N#qg lDSgyU*  sh69֤&a-,kQY[#S6pہpv%) 1+Aֶ+U+{Mo]z462BnL*"uz,>2oG*U+y{bH* ؘ̓, =k/Bg$^0r95GI̴.!&4Tvc*"CT;blM`"#V܅- Ro]C <4| ԍ6"o ^#A  ,kk9c0_NjþX\LS3/1Pɍ \ cF)*opg.W]~M4"hj3vC(1)ecfؖ[DR[BOPJl =Qs7"b 7-*3e#b\x4 ʛKjA W%KC4Ѽॖ6by)i6<:b13&"eJd~x%^ЌK.> lPoBAM `4j|ܱt$1'E!Rl-v*U CnǏ,u' 8`k[Rh!3օ5zl3U3|;p@akSi|yt1.DToLrP0g U\k-&ls] $;lHs"g!ɨQ4/OFk*DIFmvA,= 17S(1=?Hppbh\J=ɉ6(~QtLCkF&%!0q!aq(+ %HYWc,]ڔelP3B^4҈+c؂\p1 9pp7c*<< 4`̵y(QO(6'cY (QyLaDׁ'ٓ"l|!Edy7 <x JE3<%CUൄv{e`CSj#W؍ɎRJ&_١v<ՊDfz|'V`,"dsm2O$r狊(w-bFT891muxzB1r} ܙ6]DjތTW%UnB,fBSK?B3$diK gv+| (#5 Y'( N$,b02dhf **'WUiQr!ؔFa\%y>mЍXyz懐+ jUeT7IJ %*_'.->DO) _!6G 쏸wQkt9kbtvc״w]!U$2QQM\tH&V ḠI3QƹRxa!!0 H2- 63H2ʙ% MF[:{m06ѓ,M41pgfҒ;ƜmrΡQ6ea.>codHpk /k*x|^"ArPب!*ɱ<6F6 &}}!˟HalD$T|2o\! 10 h.D0 p ࣾՎK%7̅bfoi$1_lrBFəs#O- F`fz$oh[.Â'Ă(fS% =IY\< چg醑4rghWw[ϳW#r`NL,Б`Ԗ!r;t&!`c.2i.GPCd}lɥauSR/DL"K2x(=ij2CCK5O!+mP#'ctNB Bz1 j-.tNJ( L%BdaAHH?nSHXK+ȅ>Z "1Z;'•W*ʹ2pȈocm$E1W6e+ClX'8!= i4%R)…N2BC1\=<I)8G_z0}c FQ\_o҉.`5O \" LB L>^#W2˃[o"= [Hiur=$)q-=57 j\R,1X]x# LZk79e(W%!me FdؚZRѥgXHPcrʙa!!Bb"9t3e2ϑ? a# c 1;їDL,0'2%["8Pfij0$kQG+˹F%XS]ȼl?$pccXc`LvN#](G#N&(+Õǔ;x ĢCɚC6B& VZI-Cj ! 1 19^D<|ʹ:b7xhU? 0;},,Dى9q"Վlb1 dN^Fz,u&Nĉo.Nt^9dFHj\ 20*ml[6&e"V5Ɔser-˒3x!Qדv3a? Cѡ 3$#쫁CAS=2l!)9醰ȹ0lHdxE߂%kg*m:Z!d(ֿM~ mL;.ҁmqp>f!ec(!E~"'txbt.FǢ=AKZ| 6jU $KBн`p!+< -gKe!X`q@ћj/N ld1Ҧ&9!idKf 4"4Ep6&"E1I-̱cnݼA2R#oBg`DZ=BNN; i j!l@&K 0n$~ˆbeM>Le ᜐҗ:Y^X$/8^"kC2DZ>!ө:Z"2 ytM$Patt%_& LRx5BGp<#δqpnܘ0aDvuяlJ†W,zw`wMr)=9%+xىli\%=C_@UsX$1KgTCVU'|%4BlBYE (BȨk"S-6Jgf^lXcZ%T}1ܱDdlg4j.GAIb2B6l,AWuhP U%`Zbҋs4+Rѵ^zACHIb D F?vm:}qhKQPvK' +Nؿ2ڴ^ML7F|$#$4Q{d1RK Hi7GD`MU"AZas#{b cM7`"Ox1 rUc" qó  )$BmD|ldJH| ZHEhLRE K${EmHVٓ:: "2Ǽ VWD 4CfJbNm251PNZ HjH7TJȚ C BL0 evZs`,gͪֈFs9-F\1"?eHQ3dLH6B?kxD,j4Ă6ߣ-!DV.r50itV͉S o E\ ӐٵD= ȉeAƾ|<=!$ <ї10|LDr M#hC<{FՍ-kEHГP4+6PZ e".Clؙ1y(`umQr73  5 5nُu V3̦f4<Em!Ul{TB+НB[8 Ldkg cHeKl3MAA@ d"b|o,?埐D01e сPOF T)ӝѨեКGGC#9~uBGfn|ى"~6BW,gte6\"0WF0!^n+ئ :m%=}GqbLLz (>ZV:Ș| '{|i  j-d16 nJD" :1;Dwks04OHA 2(6Fz ŀHͰЕ4okiq3N[6|xaUyUc$$"S 'k-jY9>FbM.Q&4"hgX'x쨄0͘WHK)nZϐnj)f4,f F\ 2̕oFEƅ\:وաƢ]/bc6"GFB^D#pA"07a B SPe/BJdbR*V1x*/b@&(7ClTUFT*e6jScq< *fM% 0Qc V4,ș;u5$HDסۃo5SēuMfXrL H{u"I v(ȼW WjED(<:R.`glX3 v 6^[J-A=nriĎ!+p)"~d"LdvP:c^ɶ٩4CacdLymܳʼn+hNJz4Ɩv3劲b'z`k~iYL6'AR%tT\B/c5[gak -FX٭<117I(%,Un7(0?`ƣ8в0V1A[pcLXVQ]?`,!8p*Y܂E Jˡ4l1/sp=_0x[{RDCBز"iAjm73@VOȄ]Bt"F'Y3c8 L]7cTM kbYIYHoD2LXY-1Ve;u-QT ߣ3AY,9X\']\/U[d 4@݁a<ÆZ.N i͹nhx"{ EJ R"DdPdaA4A [QCلV[bz7V< Vʢ&ŃJIoc[t2sX-XBP 0f,egr0y1ㅔ2 j:YvХpK %3I=l0-PB'CBk Zwe3t`v$QU4)0.C`)MTRr+ɢ|FXd C^nF#pLqs4922+CtG±t"iDO o(!Ħ3AQ@U'^܎w6O 9zbˑ!zVů k(ƺmZqm5k# jI=bS+J<=byt bfB')!\Xs% 20r hh$F.ALr{+/bnlOӳ4Lv$hf- Ptƨ e "Aig_1XHWx?6gL\^)=R:ۻXjc3?`(>5.\fr$QY3mdKáC Ԗ:PP:6ƙm"S(x 7lBeԥPJzjiσFгUp0q#0tUM\yNs{C` \aje,|wjQ Bܲ;:0!(ůC6 UFIb L"1a%>y23tuBک25vEQ!0|.wds ($ ۼ65+H&h Ak< LB[Eه prJcxMF`. 2P\W4&SBoQTuMu5V-&Wo J+hmsj_lrYCVlAR֧6'CUkNn1Q6=ўHħe!FY(q6/!4-п)7GNX͑t9 hoCꉜ> =HSb.ɢ̈YE[NB$WhrJN"5ksQP5ơ"QIYC!0?.ACX3/92cRSb0Oq\:Q3=":1^xbKq0 d~Ł]pEohd2/"&(,lAlGl?3\#*Dc쏓fHp16k Ps {6-Qω Z7NBSv,{c\ $D"l#xzS L3Cqek.*d4YYt1-BYR`- ˔AQRx4$ZHihXz=XM}gz` QG *h2msc Bv,!AT7BP&DIxR*z>yB\9 %31ņ|"|;7ei C, -u !^S!fٞqmkQc? D g CP<ٍ72Kl/,܉iAR`;~yB?") 2SQ<8G08t%K!*a>8F<#F #doaBáM7gIv_w#V$r'O4bM Btkc[|"e !X[؉fp11ș(ʸ`G ;bQ()Xb PU2/%TNqM1+lTGE+a mޘ(90cxօj,)^U< "rbО:z-yFL9`}@Hwbc@b7m턙Ezlڼ -l)$ΘIg3dINiyyatK%# )LOcuVabfڿ:%b hfBt66c]JC {Q:%:Jvg.((&ɋcJ(RT1Q,%2s#QqeScĸD<,7'-K'M* Ǒ3,[9Ec-`M$7G1 /vBT4bF}![?M䇁%= ܯeRDMʡKI2(vɪeqI+7[9ma;xfLRXBo;CZ= і[ SlJy-cL18kT97ZbPGfmn#I9(-C Fĺ$B h ^8*r0Y#b6k?,y2rXuʄ,x6]lwuȔcWdvSJDX) Gv ){٭)cek3;/7RZȂhKEY6+n7%+ _iS?S^(p={ѲR\zq$>e4i8P63T 3X P=bX,:sEYQhtڊ,b'!-D)Ȉ jr b"0stĞN-6ы%%Hç1cE=.0E K-瑪HhcURE c"%$"2O61+.8E6SNL?#JF>pH5]&vc24ђD?&6(Ɔɔ% :f5h) i ɁLPȋ`ͪ&}02)= A :V=IJсArR\##,lIjbQ :fJiwg 0, OH!K(p4|`L:!ɟȒ p4<I kQmF ^$%Sc3Ѳ]N<Wa hnmDC,j 8q튐;ޡTv81'~^FRBvSz*z[Nv7lcq`Uv#lwd}$-u^tr7b5eL2M!G_F'JT=OIZbcrg4 <3,)0MC')"Z! Tј5bvBytmD=00vPcDb"FxϱR8{!FMHV,LBN$J̳H[?o(<1jyF%&NCjI DtX- &cN%mp@E ECoXb͎3&-x+TOG> ȻEÈ2ňYC&Ef-#|ɕ1`LMWd$BqV"Qe3 ) o&!t 7ڿ Fni\Yvq77`^)z)LFsw9.E#0CV(KأYEG?2ԢH{hG,B; <ŞQfo/%m%WDLN8rʟ[Z e'= S/"c*W2ybD0AEcF 5\!茓+`_ ̌S0aɜb>}ɼ U^nl}BsH%d!r1W_[%ȢF4˜ ijPu<8p42nQ2)?'$'"4Y dTЍ,:;C!f2V54%F3SZF?'p+dG{L$oY /X#On: cnJt7= Xhpvki |rU١ L. 3'a3CF4B>jj*Bb%ʆiQYҊ-n @a0gf\ `>``Da^ɱ Kuden HBSPm2bXpSAv`>CFa+;kдNux&l"f8}Y/ߣnf1t!i^*B:;D,(Xr7Y4#7Л}"ي.O$ #PVcfA):w2 5QZYbr;c=%:} m.OqOB{RTR U2k>!: =|+\1B#8sQT"< Bk!*bBH44Yb6cD$i#2-*&&H:ߑRɨ9 [10p:A1A"'S&K1IQ$XNrkB{Q ¢V3Agؿh0aKCU kMϱmB( owW4E<EDm= ^AG<6ec+ ,E6f;& Z|2.Bx) g.&die6*4ع {5Γ*KP5 Vd-:z XLebC77<ȳG7y ɳBlAL%f2PHбSH&K1سy0Ci$b721璴)!L܎襂F XB:{G"h+^K4Ca' (#%0 yB{!$^)0Ynao,9dhrK}|>L[T5qזH2/k0후[P*2dxeǁ x9'fB0[A17v6-VQyA1<<2d`#Q⮅%H3Zb)fZ2(W#|L* `O-f M'26bȥY¡ R"y G 3 mfWeڦDf87Pm`{;s]*Z&t3i&;U*HlfM,+xȻ1[o5$ >l "i͍ezm1X+cQwI 7(ܓKchho&Cv(`5Knz̶XqFxr^QidYXo(IsY W#!ELhQᑷ(3h=<# 5Кa|??$<(1`.ҳPاfg[~ ؔ 42zF'2&a2 '[X7bXТFns_Ŏ66H2L_b'P6DS -@ôPѺu>Sta JF4r PKmheUHN+8&5Ʊ"ܩ(cDn7ޚMxp&jl)t;l x ؄lA((a<=YGCvA `\fEx=znsoUIa#ٔmB$B>% $"K>6l+ @W4'8p\'-CVSz=ڥL,Lςn%#QgP c-ѓ.D]9̈c , 6piFiԅٛQB\ J5L^h6Fwu^a&`9/$>EObv1n1ЏX3ƳH8z3Xd$tLGrd2 0Oƨ9SM_H$L5QfmOCw7'ID5WSȁκ=eq| Sf '`%q3bu UMEd2g?4xivd)nR}b4N:y8ٰhFhYN;cc4wN`?f3*Ըj#WoŶF=2`֌^Kiyg co EoHrG(7--&%MH;.y31#A8v4Ml2|" \%ˎYj(E>OJ3Ziu) 7ZLLܑH_BCmtW.90鄫!V ,)U9=Q % }65!6 ./g<|,>R51 :SWf/r@$Jw=gY^Bt=瘕ͨT:K_PzBճ1v)_>!'n)7s0U݃mbrOW- `òOfqߋ>w4HwOo!ZA[jjhVS%XQrsHa"๜LkQ{0U}0 {Wh?@3h)lLs@O Tj}}=ZhyTfsG{bM=?3%]Ƹ(9(*[H=7 qR\)XGQHF>$6Bvh鱴wj6q?V}otNYY0cY-ym6K{νrj(~۟yH>1ʽ+t,>@C?'$\.q )OQ]áNz=g䃃 /i0 ( NM/w"&a\x6 w GR|CKjD C$ ѕe`n6pd?Y/$)0ˠɯ ?Y"eۂkN&R܁qd-HPÜ[b᡹.oS vRcX8΁~fDB \%1܉mr&i.ھܞ}^D ̫vD'lVL-c{ p6])aY_32yJX8FYDZ~ĕ dbЊ ­!D^L kLU\H #NnAk\=M뱛ZMiCe2[+J5!KԶ tƙRSvް7.\` oHh!1,o-i c)^uZt?C<۲P%Rܕu2S y4726O({m; ixN7H= j_.π.2ƭ9ܶQGis¢[Oz'8~`yJ>2ehY9 ˁYR90_ʥݳvxh5*>槣Q}hڵRT0Q:HikPm*c4o- AD#W> }9V_*y.B§C($֜p)3f;^B)F,}}AcZҡz[b}[i[hs >dㆆܸԪؼ&Pl.!jncB36ŨAJ+%"ntˣB]<}]W\G>{{MsN95FG1V!QMv"̽nQ4D# Om)'Ad|a%_H"%I,\'oQ@MTxg“/>Q à^t3âYG9JY,PNsDHG}ӷ=vYX j0EG3lu8wtfv^ɐss7̉Nk)}cSJc~&dZ?Ϡ;G*É\LL(w+(K_DŽͦ v۹^k97栮C X}mocBq*GI9r9I%t8qxfje§tcT܊UU.>|\spq!Uu-ɍ DQ2bv.i[5tU(Ǝ{GfVʺȮH_'lGnPYw VǕh6vg/Ewy!4Mu[/|L^S&)oWx2qX)C紐rjs >1V/ wElD @ 4N&՚3jӯi fY𽾪Eif;|Dd*LZXJȍ!aooQ~I9kQˤ8X؟XmϬ{kh@<L7$ٍir2vPxEV`q9Y[A膜堀d̡ qk<t_;Y …b=4p9&bi]RB+h[Zݐyf9F*fzӈA4S>0(efݝ22%|FG(OW*%4bf!T]mCg!n 4Bq*8 4\yP 7ޥ/9 XɚW\ S-W(ܧ']lx-LQB#6+EդDRXq zB_ x\~ !I8[# ]N36U0ѱ-)&"S_+Yn&ZXzh0 4QFaD:g~v,`3e:6Rr֜alG=9&DH#v xLb{T⺵Uo`O- "'l=1Fal $ s%9, M5Ѭ u[\O~`{DT'UoمDy>8|֛?"I<ػ(Hzv;TLaaU+;\G(zsϛ N җHٵ}h_$#++D=nw*^UCQ5:d RWrk0,;(|1cgcFˈ W'vN[+ I=XW~6z?XQ~ L,)!0O"@3B??["(j)Mh`C¯j^Bӣt;JKCRGYUD\R}zR@d ԔXh>L<10Bʽ0# )Zrl'̤)#J5#m$#fMe-:,;PnȐjS$,ퟳS]LTxyl9}ZqJaĮG|1_)_h/03&<|7f('Z#[ֿ A эeIF%PbAq3w(=!Q+-wRE\O/u-7`"l?LU"2UТ-nlb$i`uJ>F[WHX xXC nxD:k@ATD[,e4u R DX,Gݳf#T%Ne(.` ]TN}B ^~әrlƝ i?%$ *E thEeC Pg-PX]dT|&e|#G(AC, I" ~lU.dBB$7 c`)؜Zk\5KR [{@1'ʁsk(|́@Gi<ةr8  K ~,lq]Ss Z;n5l@X"(\$"@#\uh OFeݎxlcDZaF>4[R*:ȰIр~HbvɃѤ76~ahr)vW]Dښ;L Z νH5*[ 4@{'C, t]\+KKv͈PXqF[Tw|S-:6'xLh5K'B{UR튆adE pP@sQA-d sJH-[R:$K/+hP{ Qr7Q>7w)m?,b8#F|PpN/'WM' 2gNې2Iɉ_w6獥`KwO}]'x#oO8hL_hl;+ʥ-/EQIDUp]U|7 ";Q#(*}LQ^ #vϾ|;"gA5 mb=岩zع͚# WKFԭ H=i;"} kA[诨_Y ˇaQTeS0b^>ſ&Y`A#ަ>;;ضO*Ƨ\?2QU^>T`d06x+Ԛ}RӺ5Ҡ¡?~_ j뻏AvRpL]BL]CvKS)M]\`U '%yǎlx`VܽEe' ΨBa"ܸ -tܞ\y׉xDm[a&"ff0SXK'+j>ZrsQp$ܹ CAƓE>uCT璸LӖ Q\"vQxRnCi)^{T[iy75)պZ8f 8!:JFqdsSdtP=$K3  Ҏ0VC?PBy|GbȨ zGKmlsh"5paa_g݄+ojT>ovvG(p7tGeflXzC&}7t7 Yӝ4R\8Ĩ=΅^:;qgmP'(Af^ć,ܲp;hQ9B-/8v.2>V:R?$)^>%؅ N2źf?#2<,ĒK[kDp>e\QPT} *#4zQϊ3&srkJ3|hCnAڠOz*afL#9RB 7ʃ@< or-#ڴ jr:Td̀qQnv%E . |Bi0(eƸ26J)v?d~z&}&a+KHV%bq:cu؁@ևG4@+>AU a tFun ]RZ̽ "%H2 Ms[!G{plhZ(=S9~/ʊH3&]Q r R ̈́ 0OM>8XA;{t# +bؔ=YYj>ea9 f~`vé2bgB_lR=}G%ӵ[_1JQ?ѩٯ#vuDe3}.W7IAiͣ Sb)BK3n-D(W>39OH 5"30SٰFTsZ3rJqK"&xf,!H}%$mܱd˪)#+~[$EX"yn֡RU&" VAA0Nmc4Y7u~A)+ jb3j7R9%(wzTDCYZ搣pـI.u\7W3gfKЫ;Y؀7l"F 11DQl/y{ذt'm`bj ;*CK潇 (5YꅕVJ&'d]HYJ~DhX7;VJ)gk1EF3P!i@[gf$wy*9ТZ$\P&Ka9B)Is@2)2S|ye*8eq+Y3 V]IS6:JNHt_ Nox4]F m y{`d"N/ـ4~?=N U;A<60jrQC,c079-Vx}7MgaJ:Z˚ooB.4PeCI :'gzfvh# z&]=8[ձ+9(wJB%asMT *r =U58q,/1T|pRy.KXDL~<+a>{Χ-+mNL8ɦ2%;"Yrrwcͩ~TNU&:CT :~@ 0k"ϻ!G޺28aH!) r46bSK^:H1VZϷea>l@rI?b[/HZuS E(o`_g˃Og !E 9u)$l/I@OuF굨k 0д2Yʀ35)X*EKc¾J8Xp]UsWfk$F,ٿ/Ѽݷ=I)-hx _0M*͓ >j)oX_\ifY<0ۮs)qbGvls=`9e9fOshL1\SN 6w̕iʂ'meju4!k# M|A5rW,=cĶA8S VaJZ:f<'Rfq?UA3k@@Et6]U>Ud]]X39VN'滑<\Š#Lh(JZI=U-/bG`嘸r~3[~зb*!ag$з2 .]x=H8d#4!q֧Igo͘o8韋3| 3)·Mog7k=uX]NREcVR:7$Sj|&WUs#Zw쯁4EJrv.} hA6R Vqdejbe9vw#%$Pl&ݿJy['gEeHWqpT Ly@).Vf d!4av-\>;n^A7-O=U-HN?~aM;l'`r V?PMVԩ^HHP9o죶Ns\d 9G_+;v&Nd`RUBa2./.?`gi4l}XMXϣZ7C>(䱴PwܒDyvVm߉맕ղiz: phx{Yo$C(QDHoʁsGz")I=<gQX=Bg_KM e3rhٛY\S䈺0Na4)n3L"!m}g f+G\>M2ֹ_0q!tt-}, L:A! ;&z/-VI%sp[uۊc})=sVoOT6*[$.HtNhМ"&޵" %#{SrnTbV{`HX*r&7ZLI5^kuvA0c"lK7Q+1:;@>~DjiQ߁դL|n5ԥv'3?A)yҊ<ɒogґ B2y]H.Hd-[73 s}s6fob)J~.8{eo]wsza^|iO luQ]P3O{.1+.G+fL)FTU7|yi1~9pICACFr'm:/D&]wOt]x┖r>s#8v1weΥ WTSBkKP;͇*"Q60)tLQg\G2MW(nDިc[~is vb[71@`il% xxm:/41?p];> Vu=U3Uʹp;w԰z ~R:9BM/eҌRBHE܈n`сӓ,4sU)7,ÈR>i+:!UiER ILo\#ݡevؒqt82&p V9:TIXμM-\䮓6Q$AЉOW`iCsIx6X.~*5 e(^}ߘ͖_PJ2My͓h TS??5)'uDs\Ka!A'(!V3N^HށkN෹cP 6(v!ahQ >..#zrtP"<?Fexu9?_- L6c h6-$!%ìyVg D>ڛ<n| =UM )=J<購5,59pX#"`v2To1ɻ9#@ "~.m u_c˶KVo`sdƟcdK]یlgvMVke [aqgJ}rfkd&+徧Z6oN<2 ׭nd{ Lr(g|J=1νǖMwI!`E?OBGA8RF64@@fNaa7nO'޼vsd`ȑvFukyl,6j-$-WWL{lmmq_ԟw@2lZH֜aKHbIgva(x&(cvMm3"{{fz~NdN.( OZir|q;:o pQJ@ԟ~Mw$B~.H(4L ]eȗ&^&yK) "t{ԟ D,<;mW#-N 6{?r0!"thv>KKؖ'tcFNCE!8F7KG'dF\^]F XmƤ俖S䯰g?V^n2]iv 왲C|$:{fOV$|d5~a0{!u=;?϶ Dd6,dc SNd!c/S!L#c̺CČDc &/hT% 'w2~l؞`.X3mrO 6hjv?&dO ?U!Gk.0w~İc9Fiڱ-x'-0EGEd=6 OcIR]'l o Wg0RD\L QWlli&gb}eЇóA}#nZpܳ5=5;aPnF&Ycۖp-_!77\s~o` =eŌ &8Ӷ| :ӲwCؽ^1?v#ܓp&]s#I"(>d_ a}80^8og@ܷbVxyk-JUu@#.ɂy!:q[%c/lUz7H !w+oW XA?Ty`~ ȋ^!gHSgaN؟>}b+Kar-glnZ-A\9)gf0.L!-vzi+W װ_n,~ۛv[@Z7g .l2wlw@@]HWg{~|7,uڧ` !r \G'#N}RB_ˆq*nHSs >y>b@h=az$v2d_>Ӱ$;fK-|6#n &l'Dfd_r#"d}D@! o!U~O `/t3,rv[coVDJonE< <]D/bsC!bL̾:`Ќ'W"=t^qHsFAr/3fn8][Tx>e.͑k vAx5ξDfaI|}|B wOgO;X#$ N`ϐ!gFܟr͍=FOfBۋYyi^ض7K60lvc:˩%]0%:䧲0ᬥ:ׄ=^ rtbIYMAn <&wˎ H7Lp;sqeegذ/r!q×Xnb;A4dr2b*񶝅`@h|ä$1Av 37#͘'& $"`)hf.gCa#ǰ2uK^29^'c :clfAx8!g l)f$xK0Xy; ݷ >ЃoD˴]C:Lr.l!K]cShg!vŌ\|{4 :z1:ɧ.*%&[ykbu,-ʵqK2 $ O."mJ9X±2,>} }NA Noeco-􃳯%}*`wr5l>roQ0 J(xݐ18_g9kfB[y`폗vVcqr w;qG0r7zFqYx-3&<9̓I:ׯ/m,ȱuѫOVwC dZ66{'`3_6܏ +q'9ݺăۉAa @l,-%2CR(x$P;#߶B5d摩V޹a2{am4Il~ \0o5{DL S:v#JHsy|/ .^_b ˴R"H?ݼ)9'+Euu0{bÏ$A?#U'^綛+7𜹱d Bdr`uڲ##v |NjC˿VH'rGnY67'ӯ~rDŽsٗ=&{yG~oz@>rWGw8?#CcCpLNea|2PߖYmfA% gԏXO?yvuK'^l3ݹ'!|1w쎑c >ZLL,obdRZx 4m>-Pզ2AN&B8]O =w{\2y37 {l8Yk1tDo% F N xSpA8C\9t'oBvumBAdfț GPm̐gggL\|nNI,Ӗ \ fPcaU˦\dftlaRd䃰n9B]upͰ L-Aza w`QV鳬>J2u_-In,M7tb0.{ha6r` hv˰8, ZoNJ%˩='>~z#frՖvƬ녮I962{cP'xͩ{f'~=Јx(3g^Cn1xbI[7gɐ~ 'o ߰+Yw,%Zn(YsӖ39fa `x]ȞEm,W#S.J#O~?t?]T%?ì<ÜWF3euv0ˆ(LADy %gXulY /oXGF:/8C& ́sc<=`EˈXfzq lt{{0F@j?ۀG[Aa̰yh\f`DxY,a `Y19qg=qLaQ;wtCnϗQ[䞡ma-M$>]W&H a-';1hZaJl38}?g6&d@Gh_wo$'-$vz;ebh;=aísXi!5xbF2nF >&?ȟNGߟ$d }a D|B>?_KGKq䵶.~ |`g1[$} $?ŀ-1$cy(jCX~.F[CeF# 9?o]x G6~#=9Fab 'm%e]9uvi~c1ca'a_[K%ʵ@ ;n6Da6vnǒ'`O~&2&LI.BΉEt:bi"nu9wqy公(} 4/mwIu4?PKhf+.atwal!OXG=ӐwYlvxQs,=N qG 6BC)>Y큖M7lLkh~"$]IA h{7/[FO԰ ڬ([]"CKjycią@B'3l^eXno/T-ϲEɏ`du!Ofq1F? r&x2-rX,Ch] kp}P- I 9$޿, CO&H;4SNyP:C:s2 i6ATpN(l&CɦBV|g yOv̸ `=[DxL Lrw #:c`:a'6C[@fMAk ľ?! m{fʛ wU2O#&GqBY=۱)+GVYH,[zO'e?eոXؖ BKwf]gG7{"MlZR'K(÷ yH)Hk;ݙ߲%ņA:AZ_ |9c6brEߪC6Kd"&@6KH.D5`NmvlG=.": 9%2 b͕20~&F$vbBe'9\&dg$Hv۩9!ZDl`x$13bcYo{HH 3 9:l̐yYpO/)]a`̾ìlzA[!r;Odd0Z6?x/wrD s7cAgf28̕} _a F62v }e $Xu!5쐆. XsML#J%]l #n@k/= 2Dr>=ɏzaאZR= !Wv[E[6kO^ڎADtLCן`ƟJ鷸/'fy/]u\]Z'e~ZKIZo:8uLH2ƤY8z,g>7#A c|ι2?_%sۭ5`K!y\P_N<>h_, H ˜ͷ/"BhD52@ccɳa/y vFa ?egC=Ya؄!#r&p~\;4tۘXY ײL@[h6ayaK_ ׹$lwiVGۧ!AYs?RlvH n! '!;&g y& &X̀mZ;CQdyJAlw|{oW7eh{XOe|,XE]= !6kzL^ڀMF"YK$r68V#Xe/R60v@n>KeOKc\f 2 Y ^BvVЂ7>;~G^͜W1ذ"؋Nc2FW wY\݇X~ţ(2Μ[Ti ]k 90'dyk{)Bm7œ]L%;x?:߰Ⱦ>x >FnhrLŤ}!$o2̬2w{;E1X1> ?s=Ō># 9dguDz$i?;%0;xoNC)xd ;ۆd ]nLtN;eXYeonz_x0 Fɴ>}#V˒d]3G4.|{s/_#W9G&P`Nww?Ddd,c0YE=Gk }r4Ƕa.J(.}K"&7@ v ?Ġu;i? `Ȍ`^1뛱/.D-<ܧHkd2:mȟDzmɾX#ly%\!!.1%QC Y[v#WN!7Tgq2vݣFX$"YK$E@mȓg @L&X0,y}'_݂v9ˤCZODv'653A ϓ y!WCzqnہ󒎌&A?H˻dHyxJ!Z7yjH+hI?q F#H$rZŇ%(ida!(BfD8;a^ْRO%d<#,>YɎ-L$I(ж6S^3'w𐹼R屷S~/B;oJlX>0?Yx5qJ {gHn.+Iud(-O;lwι{}B]͏-yiuy4q$߶#dH/g߰co#0cg(p.uR~߲y3^NlO@0w75Dn&6C`{dse2 ZHE M"=Ew0쇁`A63;CN.)Kv2qd#(5+ ɻNvF\`32bه \.3G1)ˉk߶7,ồo\ A&=`*1G4J0埲'`zZ#k٨죲&1u퐏gݓYC'Kx;9}9 [ZXaxxϬ7쟹䯖a^_#Y0V+yԃ_-XrXN85~o}˥9sߧR?éx#~\ޣ-;o̸~~Cvmfuܰ^o=_?UKDo>].r̃%װ!TF&a <aGق}@wzn~__]̓O-_{Z7lw!'ُ; =J[ucb]㿜Clm{7 bsWlz=3C, 0ާmglUbpښإx62z~nB_i̼O Rf:͝e'6BE%5ԩtۇ0dVY`q-I'FL N,˾Mv U5K+r}607vܔK&J-Xa|2zy'&>XfNp$cVDGRBjWeغ}Gա_-v_ O >q{ir ?A`5Н{;h&2G&1',wߞ,X>XIw9MܴEAP90^z,YHpE$3E6ɛ `1t r.;m=X=dKDla\gCɎE*!:wn۶cVI7i3z~C&h~'Iq[xFE 6Np$P{#W`On' mb~/0m,-c#=[ᷡ:I'Y_F;E2Hcz^>Ցѿ`DaFL/IWnvPrQߖ?ɚ?.[ Q<7oa\\#&6QW2kEgZ܇su ۋ e>/g7[haaN_z[Vl7_m[~y-ى;$F{k8 j\/ Mt [vz`y tY˃ԎD͝\6 r~ɲ`FrZܳ vkr9d?Rv uHWyei׷1埻Hl,XN~&:JO]GIzKg$ z0_$iqVeQGwa^10rЈؗo 6탞Xq /Le"t=V^`D}=0;Y倨?`Û/7=*<͵G/e|Sp붩.a pe~.C躙2яsp6ڹ$uc3.VGĂ$ g_f !Z?ϐ^y./f@Ct`cL͂6DgK˰ȉOV!'''v Ik=9lp;rogl߁Fptr蟤|lĭ7$1q(.#H?5 |9k2+gήJqxmdaCn(}=厐qJQ"mG O`sc>yeq}d쏱Yx"m-f79w>AAtr.uF!ۭ?d\>YM7g~ŸLXf:o,tlc1U'? osR'_iVϖ@;~A$^} d#CnJ d8%pţx}Xؘ' ~_Nq%<&'7,(_J3HzsߧHē pVOv'X cbhܓˁ3H4bFW$@Z9,cbD%~2|%#!Zq&iP=itZms!DIgn@ ;٭372e#acϗ6s/ OY 9!3hw>ʽQUid& 9fDzYc` s˻2k&ƺ5n@sN(]iXLVʃNG t>bA7 r,efj,rn ]P1-H[YufA+6Ñ%dgl͏vէ2DZLq͝[MPx-?#} 8[GWOAgu.Yv7ndb E϶l;?dY~b[:/rW"i0 Cm>!%2e] #{ 3qq v7.{Ih@2!! 1#Qlr]RXj5/we nDT_c9MDa_Yd r>2䶊~%ay r24l nA9 +\Xsuqfc3f>ۃ?ä gY`KA'O!$=,-,ܴ~{,[K k8iDzhGWf{,@}?fo7~C}̹`g-?mN } 0A̼n{2σ-Y݇8(aDl}iv syYw Jfdr#K cqe\ j 6]#ͫPhy2s^F3= /+2W2ne5k.NH2ͻ$ >[g DA fg"jJ} l#p.S@g:"BU_Zq2O! @ nLkX0gw@ek!+Y\X c):w?cԹ"ߖ `GԟbT% K->C0˙r5`AX\ge#{$lO;4$yp->:Raaxs BZƱRwVKy<ܓRy^Lpe a姤( -c  / 8mc̘kZK3= 9,9 Y-0Agݳ6 ǝvrݪA :vFNHm6.I ˋQ.xcM[ Cl4goܗ0;.?,/Or@M~\2.-2O,1=@L?wJ9?,}|j]l6g[Tg6j6*?q!C=x@`Zp侭9ݟ,\Z9)О(zϤGe`W4_A_NAo`^N{ FnM1ted"dgQNZL?sqdپ8'L')8/["2c#2EDx /_prՈ_W vtfE 8>|IO^$yF5N dI4{?GA|YVf{}ѦýM Ql<~"N{t>,|.NM34r;vK>@e bc 2c2Sb%$.b/.Z3Sye[sL7(ǐ?y&'9ۦICY=?-{hysdv:ˣ[ؚ جBެC>Z_߾g{dm7Q> 6cᑆ}B,c{cKD^N\/U0oاNtlrd<[ؘ7=]I7WیGD_xz]1/|p@7|i uV>GKcc}mQ{ߖ ޳ a,ќM0Y /.휝y} 8y[J0f.ѣb2ܳP pO)ϺyZ{o&M(֍-472tݕt;Cipl1̖r`\@zo䭗u`HbQ$77.'Sٿ7F}Yu6  K|Ifn'#=l'Z^ gydFNl ~2Z2f;/n!&urg~G~'oR؏Edbux ^Y#@'$$".`6 ۨ%\Fc$I=f]vY>?v2tl[~!\Ȁ `e_2LKƉc[_nd|\V&Gpmg'ƽ;7' l#Ce 9:CDΒ6 @dV˒P!7syh9'L28 M8i"W =}-.tio#Ĥ@2c柏}gbo*Yg˄ =FMA\<1Wg϶s 3=VdXƙL Kf>z>^g?uO"@&g`~#2~Ma0dy쮋aH'|AZC~Ks"z=Y/$۱kVZOF5 :B}r(yzCZYM6eݴa ,9E#:ghY$"bl< ߹!=-?ek4K',[?dLq^Aòޖ5ǒ:avnL}r_ Fr,g~ .fAI25Ѳ':wۯceew2ttg;bx=qh2dy`0XK]gO0^( -ylcOȝ&Xll R8:JN${j o s!0]ē$gc7 D{ 'KnrC&6Yqh ˱.a&,{$) &[WfYf|aO# o0ͳ/k,{Gc. /?dgY|'^Z6dUiuy`=l<.dnߦ~Je-:y xjdzc)8d[| M_h4i:Vpe|~FOfa_Eطޘ0/ Ww?-MJw  cF>~^BWYLc1ٟEӞphG3H}mZʰ=|\`-3!5X>?|Zo?l{>5,#.hHcp3s3w ^=-XBRY'^,9[S"X0hh 2{&a#Gs/d@ePɉ`8nаv(rydddٶٶ6gg3X;dBeǑ' o_c$R3}yE/LmF28 B'gb"v3lMB剰l冭o#'u䦖ÒXM}i 3{/GMXsp!~H ,H5tFX!+tۇe8$:K[͙r4P@OLjZ-{#7du7N5d1*N9:nxIa,vsEtoѹk!a~'-.z!$ i.l}0l Hq>{$[]C6sq2l}gAfb?]A>A;W9Ma\x.#N";1fܰX_뜅nAco-pvUv(=#3Lu$:ڶm9 .'Ռvit{}{'q_Sa9=|Cg$Gd4sh*]64x3ol?`#Wbd# ^XGz^kGtq2ՎiWkev1BI $6>e:% {2}"^@9n;q%nĎ -͛JU= u^-U^HaNH}9 p 2 v^  ͧXυߗ v9d`:yf'm؏,F?m܎ud"_g)ptNH4ۡ[7virOe4آe݁1>]i۟pdwCNL@#'Xbm:ky8` @as`ag- !6k±`KgVl7|7s=s4ظ{pbhFw Ě{w[̿\Vumaۏ7S ^]RG EtZ(`SOݗ Zw-'Yۗ[9Ck`6^Bʼn,6X|B@B/ 1AmoKݗ=9i`[7b!\v8FYM>wsX*:H{6G=Y7 D|$}zކY4l$Ok%S&(\;=K`7I/Q-4iи)]{{6_7Z WԘ,'x_ zĹ.8X`rj>!CH~F*1KIMG-.!/},OHXel&Lkbw|>w[GˈKCܳ'٧(idmBb?ɕSF?pܲzer>8K^_?8_s`GA2`ultjɄLI“Đ-Gu}r#fdH5Gd@`.؟VQdZ]شvKZe:${Hl÷^3h\-@7˾̂{rF]͓DcsoP !0sRD-$]A$w@s!dsL\d vgia%MeKL9 9W{&ϡ0c>=%ch#Z./|N3fd'?p޾G6 ؉4ȝ<137x}_ 2&C?9G~y-/:_۟ >CtfI4m+mq0v?O vB ,ld'ܘ'3ِr(7M5i˘?>MѸ.!Bt3mgGӆ fG$[heǭɮ *l-ï``K $3hضu %:{|ma-+c$3% /u]nf/cP_Cλt{@e’'F1LϣOmHY#4;r̘ >˃nv 2t4->쌵˳wlIJqr. =R}.K͍s~7l,=+O/ዦϒv?bŲ_3COX,}] md-e|(6Ύg"Cܑ\-S9s 凖͍d3#wh$m۲E xqR;אjBaz`0{8/X=6쩙'B=M Sg^Fl XlDw -.Aqjw#?J}lu5`L_Id_rWW?-$#˺Jo0ͱMP'J o32>B̄dCS} __͏B|? Jq.x^FpCww/VwaOWrHcBmS %( -9c` @kgnm V8ٗ' +fp.?^ް?p˅= &F̺Xm:YxjqXB2gFŜou Ad[m6vXGFG rgm݄oR d\ iǓ@3,c%8d ~9&Yb ~0涑×P6d Ȇw>I~w`Nnʮ({pLȞ#V i9rrwr=Le;qaO <v^߷O-!]cǓ|?6oK>~GQEIy)hb4 ! G.Αoz6d%-Dyx\2o%n~Ƕx00%8μi6FwۥAsٿLKaΈ91KHfA$$4߱Xv/Ë0,pMW`[ۓ{t$Xpe $ <[3 ;/r\׶AB3,dCy9ْ3u?%.HFXfFw/j zz8ß~Oi ~'agR$V½}a8d/y_B39 >y S7۰:?p9[M 9k`'WČs]}?p˯䃫.Cl7~܌K-|S2~ІC)>jiGaG&?w/ievPٰs,D̡*Yv}>r/VYz{wm/[ȴ#Iv''69mX䵱c(s!մ0LSK%o98{vBygOo~Cl, %Yߦߓ;ȾZA}}ևj4xOk5zG#ھKd{]/v兛/zRw Y@2%$vY 9d?Ĭ!X;8=a;{}|n@?_s;??V_2r,1Ȗa)rDZ=fBzUei2!ؐ-dXvY-dpݶ:yzDc1q r?:J]/،b װ6 gkỆmǐ".Ⱥ}%4d'KV߈9kgb~\C7>DzA\Q2G,6y{ț{ &ٞpK܀܃t> N9 v4:YO-k9o-gbt}0x͐aQ`W&\g+spZ % _di]9k'khidB9f `C;)0ś@d@|dA;(aH< hہ-\+qOmN4iyìpo${<3X09_ŴG؄O!uf+WsRD݂ضrScO'=$3O~g?z 6X*mێ`b{/relK~Gz(_<#K$w^9 쌖2ш#KY^72:2&XX0X͙b艣,NGCq#q?V^7 `W1iH ^E_KK䧕zץpe od\3k)pް2:ۆFv$ 56(2-.F' 1CGF:@>J#|l\n_ m?fYOsr$:+?R$O'L1J6u/bÎv`1@jNh}f$`J.p4^qs$tHg`gظsyOB޿3T lvכɄ%M` 5`q%/ .3b#,wC`sm>X&y-ثvDYYlݖ0ԉHxuNt[b]HȘQ])8ȍO>mۓ~1&Z(e;k$ȑ,{x.HwA`Jw{ke坐r^ےYg,z$kƗv,-윲Sn-.6 41duyeE$@O-ZNd _"VA$YfO\d5(`K$lQGXߟ,kt?n8kĘȋ]#y4j]YHli$1-u?g;{hq|{>x?y0`p/^Oںi&Հrv-2 ʟ020O c H\N'wٴ7y.yZ@L:MGߜ^3qj-ĕPEgVYurq#'bBmdF9e_9ːjޤ">X|X HPiGz{#{,Qe_?co dF8.B_OD\#ߚ˜h:ˁܠ0A?Yh#B{ϰ6|. MRN"/+wL}2B {xn9̲v3Дvd=mevS'.o~ ȄO/h~om0}_#A y,wl4]lt镛`4ɩ΅:?R3ysh4Y|δe{:3x}܇@/Sy1x%)ٗ

    ڿw _?<׳ʅAp0̔Ar8/vϓ@MK7d_y; {gښ!Y^Kd,#ۇ3iȺZY ufxd-<Q޲v Gf93sǏljY>B?fr۷l H"!q`Fl20 &@l!7It#޸~o?WHUơYK3Jl Ulɸ$e2ܓ "1gX 0COkWCL=&t;~Z5WHaoVn&>\!GdzKaG'{IO$6>cN݂bznl'.AP0M~+`J2\%df8eO!M& H<.J7܀@fe 喘I)aDI̍0!B@:#-Ki mwBމ? ?Ml3`nYdHeɁW~Ac,`X'vGGm>M[s$27@[p彵g cL>X_,e>p[߶Gז@?&fIKͩcölhg(4ygכo$ z9phV'x|²5oMٰ!o!<,p3~e<暛s_}`Nz(B+#&xG%^@s[PXf;.1A sɹ3$Vy( ")8,ג nG-}s9`ϸy xYy aXmyv7I>hNo3»h6L,{ >H.3u=Ez[G.:'O5c'c:=%~GY   %ia2g I{Y=YF{őglls>@!pdc%Z5fkITz圐B9Nnu~*4gN@d$Y<iW趜|v偼C_leXYn6ˤ8Uno'`,?XΒÞGS_>BqȤ_g^lM[-ߢSPYK2S_tV^>3ܥIXOU F8ˀ_pˆ{=_事哗O=VŖg:[<ca[ ډOpgi,s~yoG[ٝX>kk?-~tȼnYU,$dcȾdH1`1:n]_dqlY;xf-Niq4. o 7-,@ѝ3q*78vDw7 쟪|bb`)3k* @F¶cީ9:pڌc #L &xߒz!}6l#{gm]#ۉ;Ő<mO,]  1#OO| e\Z`@ Ldn Anj $\x7%/!{ ; +ͺacy6@ľ#D0y~2 Xq$U ΓÒIīճp+/ȵX턓 < |H!ٰ>0ARȈ -dA".C!WA2c9ܣ^ X8uGQ[&z2s/u[tiv]7_ c<$)َÃv6gkomY]FInpaOY61FfYhB- Ďp.d 5Բ|ؓw~瀸`k$;r &GC3 c+ ^n3m0jAh&p .d@3Z08ffB=@- n |]7n|s2\!=T-#w;gl̇g8`Iy~XLqX1Bt!9qm@NwȇUGb6 LO\n Cdf#t`a ZzHo$Kd_PvGy+ݻ&{)˙G,_H2wM? mwg.$9rcDq bxXaؗcNE@z!pnn]GHrxY*!Dr'$9wmΗOn,} ᱷ}|`&6 {-a$.[{no񶱼<HFX4qOsĿQr`E٩@}ׅq >XzV3FYYql3X!36u ;μcC,l=䓟oX;X>`r=gF6lc͑]Nl>ћ I5emX7ErJ^M6"RsWg?H9 OS'N$Cq匒X ?Ip[dL[䞈J7K;`/['#LB^xƯ邥"bza{u:<D4ރ {t ?_m.@r I匴rɯaL/1;w/-I/%tZ  ? _P+BQc=Z=yx~CHM~B!gmXl9اC;(V9pyf$EvI ѿs'-.%Mg{Kи۷H$roX>soДhBM'2s񝱏y=~co㧗b܇[zX#%Wt{@b-y0|mepؙ/OՆ{xl>l7G`9}E0쮙s 7d/px%2c2b"mcDnx"%w1{s-3[g$IgC7^pHc9Nv&  51d@7_Va9#x>bMo!ˢʰ 6sWb6-$HwC->iQu6r׶9C>Nz#ady9ѓ,V0l?k`9cc.|OzJ&q O*28,=v="gFyb%j67&pg  sAcH c9a$cn6~_\42mL H5CňNwc~ m=-nb @G^^P2oK=sx@3n rqnW-ϸZM~a#[{MYBӹm3Cq"j۷Gn9#9c 6G@g/dI֫B~H˭[2La7?,Pl:ȼ. VCzd @;mpFn4tEplhtg``g18߰X7H'}̋lp =i %? #?,KOh v7=߲NA;~_o=ybH:=6韥ۚ/Eg! l9ۉC .ٮÖA da~(/^XOd;f&qevq Gie 0z28{?I5o2;w1C5:fm`,; {>3G1$ $ p9"1}g[Nw I<#njlz!]o/S!;'tl26lacKG#0/W=_ǞH@ѓK:CD΍so؏'1.$t#x!]k0.#krr =aLf o!AV(H }94&FHmxN_.ѬNl取ׄt»!cmBՊ)G)cgst~Fr8{%?$;>_,RŠl[yl,8OHcvi"'?NB_^Xs4m"t_e0_ ,c\Gy|kpO=?F<o>?qceNMRh>O^ƈF`dV`ԚI|No`6HXѤ8[B:ݸ|{<y0'rR' wWMy@q"?o>s]G1g?dM1j׬Ub#-]hOC? =Fr-Llm!62דotCl:#0-r'ViOcc"Z܄;(f>wVG.B43#23og؀%rPzybȨ^2K[1gƥzPÅ>9!#'ӐArL`BCM6yu1Ŷ#[)" A vXq Y{nScavn D#/us?E>F,;l;~l% !̏v>񹘇JXqqgVC .[asOCɆm ?^;pgRG v ;˄7sٶA6Eؼ'̳'e%.:zlmdÑP[FյhP!f"^ !rHv@2DdveXa&vaK&+;=nv(;Xe$Y䯓˿GCu K6._#g9!v̀"[?ð w3t%K9ǖʉpu{ gp#IL0vuArԑ?۠OV8ĭa0b\ǐ84|I%~oմvZvc`a=Y,XɄ>]7%a7!pCe>g?QI. <!E.`F\[&-Y>Xf <pbBc % ,zZn,%f@Hߓo_a<$Ft\!`uK?o }ޭ%xrܴyZg1u0wf $) cyVB%HBrb/ؘL5eBaaP>I=](7ۡ|&&\;˅*6:%3f]d"E2ؖ[Y$sH]V@`ݒ?PltIEN%Z ݗ-j'{s: GOFz$."wąz>G+_7t1Cm.a?%-4)9gl-ۧ){nnI<]lHv o-͗t3`yAAPÐzλ 09"ӤN݃!m|tqP˅Z~q컲WcN\-9X/0-`C]!#Xñ9o.=o6O˗e,tKKpd#š :Ǥ\A /bcM^gcg鎂NJ;FFA=g<,O,/!`Ր}uk䜰8pc%,'g/#de]}b'˅rx$͏ #)tٌ9;18uRE-g;Ș^AԚ`Arr )D|,NʲNYɽ/fz7[`nGFv/X]$G$49?"/xKg>.5 j3g&@m:KK"QdapVy_F{)v'D ۼ)ݼcLp{~% <\{?)?gg {!,x''-y !h{`O`,F_'YmKτ8ؾ-O7Yyl\/Ylve0:g= (tmIOemܝ7(MqN1B,fC}k\7)rA㾢~JE!f ~?hv %y|dd!*Ԍ]=?!ֹ_CČəz^++6IQa:p̺6`y3̏ &DM9+$ Ӗd<&n:mA_GO!:Vm}56 z]!"[89mϷOMg=;(oy|f\4?/iRÈ2!,L5^C G0zvezIe͸nyrH? vJ6pC͜>@ڌ ο]`SNo\dOԁKtwD:$>@v"D9݁>d^C'by^~ȇ7NCķ*ɝv0#w c,WluaW!s1'06s?mZ2 d=d3m~ NHƥjIp$Bd(MS-u6\c' r߲Y"W-bF al #I3Aޢ c^NAzhܷ=m'7,il<m~@SrkD\E.0dGBޒ*\%`ی/~;zKL~˦ g6W[7 #4v$-~$}&dL'q ^y1~/8EI d߰-HTȾ ӥ/d6VvWP]vי?@J:߱ {̼W'1$L!e0rJ|薑 :Y[ Fq,c5bwO~AD=!s[ c)m4ٚ!y1^_d|coXdu 첉al)5 :r@&-mɳRy!99F6)ywvW/t$KeJ/{,\ _L۩!$=ezy/b7-3$m49{~4R 5@~34}ɚ2㱒m,e?r5A!tLg# ᗡT![t|6A,e;hri k "9*xo7]ٲldvǩyJ5's& lw:e9peSHؘ7&sM!K;#`a7O ǴFR9cxY'$lxλeǶ g K#R;9ty͋{zt?qOy<܏; $&!!lq& !0{ŧe q6.`%bLޫ;|?XO[BĠu؞ dŅ]7Sc5S>wwwf4I#(۝_cG쁛F aÓ_D̞G C;f@'~RRI8#o c8Ip u6J~|3<KpÒðUw.$rl/Lf?g3$3٧öOn(˅sK+9'$&| ٙ8LG[ tBd,uϖyoa܀$@M gL4ؿeܓ2QTswa8˯ni3V~gLao0<:l-6F!7$̶rJpˑ9'aCMn1e`[a9 v/{ 8ٹ}s>ݟ<D=1,:큄8a;g#ٽ 'DR^>~lK\99)K#X?7Nrˍ༶rYل!?7ԛS<15uXPuX,͕txpGV&7&氾/$:-/$AvQOfu9v@5_}<ųy$6 rL1xl<&T_!'_m`wa"E`{i'M!% WvE2؋l &2pj? a?q&޶=ԓD;fHݕZ7d6'PevLO5v4eeo p\ƾͣ_uū:`{|b5z2A٦ӎa?w'D`>'f, L{f`#93m͸-4n\˛ p('1a`̏\:6Q϶d:@N)G>]$d'K o dwcv9ml×! , 臙7Ջ9Cpv92E˦Pzt}܍}UU쵌F)?Iۅ[FHr0n GN$4x=LpƍK9- KNw! c N89wO rŜUI(r;uam ?a'9x!ǩ㶣B-h `MٗijN&C[2c`oN8\ّ v_iJ.&"0ۙ'&y>bz}c`{c"!e˖,5N6t/9rN;ޟo/ۥĩ}H߳Ĝn\,y3 x"mmÛ;c/eKYf ܼgVG eC7o n-V<Ϧ9=3^o.7l'De2MXqͧ?$R#?T0?lA%t "[o$9i|Ԏ]>8;/ /e$fƜKpI q*\2 .21 ]V ^r^`1n^ocŷKrIȾu~ [Ҽ输)lz^ Z0[ :XԼC2ޢRXG F$.mOOY3>ą>u_[u,vQr\TxMmϓ&n\-,z:_,27,9o4ޭFGs% $ϗX*}Cޛ 䗨Zbll*} ߩ 17Dy}HP ~i=vB~`7a"^Ű=J K%#v$B}o{|HKV8]1.Qd6 C|>Y? q7A spn  Zcӑ_r[^JCns̰X0fL.ۡ-[*$o˫Loؖ ˒ӒW YblnF[.eؑ213r1 s2[=@G]f:l ?_lӺ=? ym0DD F,a m!}v6z #DD6 # .4,IReL%rAff^AlG0B.G{nFIa28>o 4k"uܽ#[Cy+ñF%壥H6.I-lɜ,I _a,s_}bR'Y=yKoȓi ܅^ZXXg>_lܜ7eXU&7w[ˬuاo901 2'nY#fvXv1۟, uue*V6 "n6!<~Pb`l` v̀2v|ըa.\1F#cj yc 7-уtȚ7AY~]9mw%:$O6ViI1[8znY$,>+[OǶy?3:ZmudeRzHoSH$BAtì7 nLGI7=$$'RQayh;.|ߴYuġa; *"eUu_d$ )Y)>Oߟ& @"Q$L<#.lbݷ;1dV#a Fx~ Dc۶btdžAo9[FE\3c.w~s_fQ,􃻹}tF -˧)삶bLB꬛6y'2Q<[/[sE{n~e9qs1dː `;͠KooZ:.-!lXDWda {>:/"tX0MW πE!#s|OHvߌ>APr~&X@=Gˤ2ǡ-$JXr> [|7 F/ըFח) M5v60:o_ï{E3A~Z:Y!Yhm텟cg#2E${v&#2M$gr#ΑFf#PL? `#m ,;wZ0͘@\m9xl}Z v9)rWeY$ز{.OJCWmT@)^e~%,%6FCf |v>]"vlAtd>Hiy? O˧cRgdo$<25NY\ K˙㒞6uN6}Gh#Ʌ]cmW")sc3>f|@b",p2'!Nr; $,H7,Evf8Ak#rp "uoQ lyԙ4x;cbb{`vO1!$"| oV,nH&gd\\ tt n6NM t݌9 c*ZLۢ|[hپ0&1L3ޠGO׈.N@ll͖u96`Lh5_">ڵMudY `61rRfep-܃ v k巰 $o/։ng>M6Xl nqəi#Kv2'Hgr @t;ur0d,d2*Y񁅻CbGNpΚ{ !+ԂBQ{ $-g$,#فM $BPu2|M'CzLd|dolp1Ͱ0WX9Yœ  9ܗ%gݸnCN/bnłZ%4jv5a&{,z˄H $;X*qɓEzi˦޼m8Eѡ}7Q,mf OX8 {}rLc&2)D:!ݑͿ | @ɌAI$5,,VgA?# jwxN$A$))a1'ܑm%Y>{IOt^Gv#̇WY6F' @'ZY'lxXL9c,#c au,snq,^pY$PZ-gRO'gdɹ+r,[b_Hhv#8v"Ca}6'rZpv:F:&~K{<\؝؂vѸiݺrK7o9a弔u.mCVN-~4巓ٌpKNK#^7 ?a!9cXdqR6vs6O_x%nJ}0\0k5WmIzEy?,deDZg-vWla YzG'Hk;Zrs7fucc;i re10AБs?p^9)46.Ip>Z\58|AR%g@5d~#6ؗvy>J+m#uv g`G@Sbū vxOdV0:.Sf9t'#G˧%vS*]> nX~#%ǒ,'˴7ekD"l! 29hoCg*Fۗˏmnk쐸7wf|.   ؅#]n}`H`}rJ<"L!tøaŇwA '~Cnf[?Μ 7$q6(b0 ; f`l@k`bQ=vΖ4\8{Xhd!2a?w&de6Fd;8]vȄzl Nm޸^,N-Y} ǰxKm;<|9x'.W K,U}9{l9> &?rbzXPK&M6-Xɼv̘^el@oI,92GoFr吻< ]5%BɴX=a;0~g$:=?-$S(?gm z5X!,[1OT7<%if%1uc㹧JlǾڥ  cI%pY!Cs h8{*$˄^*znwHÙwl۽0 P]>ĺGGn1}a{x䟒Mvud\-Z %;-^D>D;!],%ugFLO Q-o!Iǰl;&̎NNmblGrL28cz8Co}C9* ]=}!n0 o3U4Xl[0` W`mZ\,v\?ojC>`%o-KVG{zQpɎI\7Aq!II6o;.+6S$ɫ?rl>\Zw~..ra9f/Kw'RTcv` ?IlnO[tn[ w+(l'XI7@d>^SO޿:%gwovYFxÃ$ӖCIGחd 1=y 3DH2aomg&~V]VN r$%{ S36H%H=?hńH[H(H/lܱr`:CQ'O'$AC/{EOwlls ,K^!#}.dU4(cm27 \ -#H-9 8J4&i(+ o>K C7>j_fH:ZOA0dy>D u͗` 6S?oa\' X;|K'' 3d.˟M/ٟ ]!H+C-#?<pB_gDŽL?}ۮ& X|HnJv._r϶ N3mWf݂nY20#Bv!=d]=LŖՓZ؛|L3Pl2Y|ZvM$wń pz2|AsW%%OnFϜ FA]䰰{9wFI6aMB='Gֱ'K F@$ɲn0E$»c,0Vl񲸄=Pz6 @Ebge2]-ft}eYK!~/%`5LL],gJ {}oI|6c n;a(d8vՃo*B0Hul&KI/(׌ ˥Ï`(]?Fe"?`~>Xw#H]boಷ"hJ忨sIYv;f dԃۄ[7$0B$9$iawQJ)쌖`btDqli㌰_a ¯= .aQdu_ˤ3y-u`ufbejƙ] bj >/;aĸZBF&%bѬR#>m}ꝱcVog%;/ar:Z_Ԝ=c5Sa879%f c=993d K H}~ SH]ٴۧվ~D$=@ZD3+[8PQ:Iew@"lj@o !`v#lS^-sg{7ng 62K>9wVk}ˮGoBnƴ[Tk*K# c],S+Scȏ|^Vd{]אxOљlm,Ք ,-?然Xu? YM鐙Mnդop.$v]g,3`gD; )1.q=v6@A^Cs>6U[-T]#<߻=5`m3^,}Zo D`!xɠ=d:9 Cl19 1=Bў{gtaigH[ ?9.vŰ`aRu r\γN.NB,B;B`b9(31e{h^c~ާa!yx;)A,zԞҸ}g>zPlNj>] .!#>NHq@~SI>Ff3N{{% a >7ձb |_!nYNXgvC9(a?ɍ[ӘfdCx6쏱,O_N0oYH7|X6v̎pl:p.5aR@OYz]]'yn94'z}mg'UmwL݄܍s-]Si\mOIdC7n=9,I\y=^/;ߒtl6߳&B,/}`p;dܳXeZmcrI78LyL^{:{ n%`rru/mwIZL!veI.V,ܥ`HI?z~ngɞrXH<_y~KCآ\vDz?xqwق@mOaH 6M`As^@ LkV.1#.NI劺yh Ǐ x fݑ;♒o8$3 &k`6僳}_0@nj9-Iս'aH声g,nF/&co#R%z@{r#^Mu?ӓ,Xg #9מsHv`zE{@r1b >] Z/eNX>H} At8:P_RA첋_ԟ԰YyjmA4dKH)t_zxG 9y0? g_G" ~~#9ۏndVodwߋXuZ` f#߶O-gehrVu"`;,8'X'/,-{pZ1^o2 Z6˰.M2 Dޅ0\?̿#$eE^8폿$_<3(#rN? `'= eLDag# M3b 'im3#^c6M8iٽصD ;0wZĹt %e4mrun}%ma;cKumo$Gj&~VF;f؄ݺyj㥜wlu9c8-OKStM*!|`;OC 즻?OnDBDNo'P3)2[wLP{ qy u?` NDau XM Lm켖څ"dfdy5Z|tDNc,@ɌAQEq;:H[]#%X~O[-o(ki,D$F(8^ru2KMLq.Y/ vNv`b~$ސ;' 巷,y'H[<~15,x,Hw`labFf|54ӆwZ[o?rpN|:'ӝj:F G`-gnlqy!xrP턀y;p%3cW!L) ps1ayă q$$b9lNZ{9' l OH/^tyyc/I zu BvA9aM5=WW(rł0G٠ gkhQw%, wK %ǣm$F66D?0#r"ӹvln}eY2԰S-y$!cb[z%JD$?-L}aY nH2 CFT =r|Rr[N#<˫r|~ˡOb/;r*; lnCo6ށ. $Y%\C&OG_Z-DɄ!], DW`8Yc 1Xq.G?W1?-3HaI n}62Ë`S/9l͕fX`|ea9 0A^\&#?{Tu8yrۚQ$DGV;k*Az Y:}ol pNٶ!B,BKM=bdX7|7q!Öl,䜴ylzI0] ֮)'s㤇[u rhhĶ2=`Pa^ ˭HYt/w~ͳ$fLo\Gayq2e?iR^6[x^M-@Ȓ>{q3m ۨ=d -``lH1 zc !儬 l2vP;$=#7Eok7n^~ O ,7/2mh$ąL.HmY^^d^뷎\y7Q D,<@1upݓ =Nػ t9eTdLcw;9۲#S/qqn,4'Ni ,Kڽ 2 \Nh<>ͺF/Br|q$O[G m;C>^g셡?A:/ݍ'OLgI/H$#ՍeK/.-]K^v$LY; LY,W;d'$w-ao۫mo 2rolD˜H>^b}$ vG<7]o02#!]e#D''FQhRl?l I-3,{I,rsC밷i! lvНv y t^1Ys~,-q'&S9o%G'O%"/Xy&rF2[!5r,M}I̝9X5<6 .]rfG .xv+'eð us.yr ?ϛP6,"K]%+`cme@Œg(G=gtz'鞖$8+ {f(-@|F ^{ppjOdῘ%\alՍ}??g}U2^DCo0d 1P]&d-^!1}{?D;i 9kC'?Oivabyq=\iwn~6y#9dai6&9pfIy?ĉ q:v/=:4v=cvvWrC^r0n6#:<ΏOwN[4X{ 2G3ܕl!,@E t͖#"\ 쟏ԉЏs? cK&JIH(SK>20ؼEwӶKpo_-&vret=k77`wv_!oˤmKu%rp2ՑaZ2?"gZv8nE N ?nZ܁Wdn܀c.BtC!̀>YXzc#-e䄜dr_,B,1FKЖyGRsy"2b ;f/ {-ﱁ LdxK{ eaǐ0b]<ճMc7D/Dl1V36eHl\ H6JXAs̘v-tE~ x[E؛|r -. (_'aԼuv 8C{o[GfR\pg [cU400߀/Wx;lLn+l8Q/9dpQ .L2ēYц̗ v-;2m@e~8*7!N'r9E#qòRrĘ2xly:kp`'%6T_@}Ng2Oպ6A (c8\V;4D[s2 <_N $Į]#eKbWÃ35,弹|^+.FXLHAŁsK[<|!l~8;1B!y-W3f;w5+zͽ0ȫI {ieWɌq'`SvP(0Y b a}s`3~$I%t{wv-uf,{9z)XvC-Nr2K !gQ2;.^BrƚY4Ȼ94[ķaN~|t?dO,7 Tv/OC\90q 0$KcS H /O%3G~ ıg%˨L !}%> y|$;'OOՃcŖI~ y'ylG/A9isu6?58v+塷T\Zį'X?Da?Ss2[^L՘S aKO-'.Xl-2ٴ{6q´&9Z-=ձ۫/܅oO'<#imoce'윅4g:On#'?Q-]v~vk#Xoy~ [0Bai_-pIg!.Sp.v d; r#dMK[Lsϩ.'O ˩ %62A, ljݎ-6#CcS^ rsmkaw& ,.[^/QevV tHWlpa_{& CA޴07~c,4<tCc,$Fѹ;ۧ$$ D8x~#dF=K/lI'أ;21 UPxgIj׻ivw9#ܟ#|-n3\ϰ32-v .CF[p,ۨ:-G>ޓ->[>@!iP|m} OCQȣh~~Nlj .OPE!I r%ZKmK˃`I_M OYb<0?Dwـnyd距Z 6$ w#cGWV^^p66E6Ǩ2~^ &07s#{$ZQŸjqaoR}#vIY7%_Jܠs?ۿMd(fwX*UPjZ6Zβpp-<$̱eo.nߨ߷$,۶TA>L 6r|dF6L<- ty(c@zH,hvRƞBXg-$?ٌk,9]Dd=[/H]Ք/mayk-mg~u/c--߆e!Rۡ /2rW%F߻{'!9i:]yayȹ`bv}48v#Zzr.d=729!cW$7vlً t.&]y+yzlSCJK;6ncH>^!=}9,a x| ^,3] L=.Mv׏75,ə [t\07x$mRNʜ:I |}X v${؜r^0ͰKۨXؓ>ѺΖ۾6y-nΟ % m~z?ѳ?=F%O[2fs$'dFBʂ:e}@tAqfY?Rkem[8_@^pqloFG`PI4M H2=HO&I@m1Aadq}R K0k-l`"6Mi0<;dĆN3W]d 8c-"yH%X[4 \z ! r!c/ ď$w{#`H-Y'$=sG:_ViN7c!\T!='HFK;yKq9g~ ]zߓv~:|{ Dߏ~9e \~53pA$llc 7s=翞o}K.Ö\g2yVOl˳6-̌'}}sۤP3K"jr@fq`hY dT9> Gv{:;!0.0%Y6Ż60+n+$:>l}7 ŕO3sxF"*@i0vxC|J^ՇL=7HLB\}N#vOWɮLq:IK Fɓ}lYl(~9ĺXE9w ǖZdw/ cE$ݽ~>;߃Lo9?ӿ 9km5A9u7餛-vJk|, ~W?[ e7g3oȃ P+&tXjߤܑ#l#&Q8A8˹>2w q*n%Yyl}SVQ5!dA!,/'d <6N:},qqd?,?RDTdf.?`Z%y-4ϗq흓rAgCJٹo~3am6vYYs9fPya_v#VbKٛv-Km&?IG,,일Ke;9؏/g'|[3v>>06 ly9G ~ zDC/ I4vvې ^k7oY Y>3N@GY}D?oXW& #: 80ȰŚ1cn3,cN>>̖Jq9,y.$5bѰ=G,Q;#$Sy/wLƹ ե܌[)t9yIĽ2aۦtGR߁-[V!Qϖ˱;xX6˒ itL|c}|e?;ٲ`;g㥶z;Ϟ|u{ge IVQX?pG;;2,BHgݧP@EߑO?D9eՅXHD {=DqɋiX;*L!aet#}q8,zBa63s;Q5]5o`o$26{>Ld}:Pl'QXB<# T̅e+' 25ry>ANVL6~C &Z'dn9lvㇱd? uj9k-œ2g#㲖ώ<ߝv;ii|d{$'.=ZHW-&F;W,KaX+}Ͽ2\*G=z`W7}>_vA? 3dnJ! [i`fJ2f~!+/OGDեX볢f2vl=2_22[/&Hil:K>iZDYC'VWldHi.|c&A.28vA ŹE.UKl6-;|5ф Yv$K26휋'r?ąm}kwr[mS$[нw B{T ~hՒِd]0!3 !-,݁ߥRQu6ۣ d/ ƐCݵ:uĎE=68DÂ0.L MٔsKNA~u{,!Ԇ VX _-*bCwAƃ\Cّn]C`E kZv[iwG '#8ԏN!c m6GzƊt7l0o2cݔ L iqᷭ۳~\{'\|$m;W9"^$yk-lOa&Ibng!?m[/.->x_nJp_Pc8VvYY.o <6{#5O-\2۽2Y]^ >[zIOϐ>A<+lFu% 2:}o7?/g995K SPZ DdNX6/`l W1eNM\2XvaӬ'Al ]U${p~a(' <;7eF}XB*5hbp[,{CC/,u\'u9u'ٿE!ɿ'3`/{dSlBwaxo*]űۭyA?џܶ\߅?ӹ-,2KGԃ9/'jy:^s9/m3sIB;cmB[.GOQxr1 Y'[[,#, KylOPuw~31̼)"ar퍎2i!Ǣq:N+<6'utX_.ljq2,meNDvQ ^O rDB$Ob&μ'%L.q/XIpG9tKK0\` [[bE,-$% 9m-i ?{eYf|dfܗᲬ$'įL߂d$ ~SM t?S$ E$L9Ȝ[ yu5'1G+۲/m^ӰF|0a+{*GY'0@{< ʷV؇.ql9㵢WYݔ;NF,jO䁋K?GD1 Ǧ0GvM@KbL-@Ger0QHC/'əwF?pPՅ܅e2'v_M2痋 lkaߋ5UX7}B4rQ"%lwal%Xdλ$ll1:Z=rqI,Zy!{omg~;uoYۇϜl|́ຳ'}IvB-?rC܄Y7s <}H }r|$́p6deo$ b5^CI,φL,5X"'"sBE1!,Fʯ LHz_^bKn} H{ O0k3@ɣB ۉяv:vvd1yX76'ACYf.gM8 Ii츒v^a m\ZӲ:cC0q(yCHc~~3^O~>/m7.3n|wfώGI,_wgY@ð'-4nZe9Gᇬ{sn 9#$y42[O'a g_Y=n$n|X-Xgjd$=l5,ެb:̏:}}KG}&s^erGmvS-n 夶6'-/m l6NN=奿SGݱmBo`X/"odE Xa tOnƖN1'܄̀y*{yVe/l]GF;-rUհ'DFD6>mvvdi횵N[:_\tۑS>ǟ)ϰAb$g2 }.xYvmۆ͇ċo3‘}Bbcb%otvy.ndԈpk qk{kf_Ԓ%B [ɂ;]ƺ[߇a6ύNd~YdǤ2ro~fN  6F͹~&m\%&jJGƹzft>ۦaFư #[k%2v{ug s~_4P "ܶRH :oaۓ m rF}ģ" `v{s߆3ᴶ˶ےm`̔~8rɡÿܻMn2K/c 5 {zfDii+.6쏸'cZFG^'аsmx; CY %{r^lt VHn.^u>+ P#;C-~y)NvBw6>[}̞lrg$߸Nmd5~ _{e=q& 37'dж=KJ+-i<[X2uYy: 9z9nk~mh] - Y8ݵ!}Oq۲d%qpHyͻ6o,K 6AeXM/#sۗ3#'¦WPH|;kv!.r&\۲m.؛.u}?¯r\O3PM ;5qCvh[Vv<$=nڶ9R~Nh\2$̀Ä72 27djayIIǬAyo-Yr#`lfKfo9/'2]yMOaOe!z gX~Bܺcl0c;ߢWoܸK ՉӲjLmӟD^^l odǖ)Wum@rN+iR%KD3|vm3߸2voʳX?ٶ˷$հrm 8 Y Υ K`ڣ `+I#A2l=4 HI$y.]Jprfx[1 ɞO?Ai2B`!_eJK4>WtأDI]d[; rtF'r{j{2AxPfρ"엑x2V6~r0Ĵ3-Hr$9tJ_- dN#jt6lZF}nSG]Xߢas:lomÄ'K \c H=h3a i|f$:2=,hqrrݾɲR>>7nl1Wn=/g~]ז9,˙od g:FJ{~?W5CrM4}PyM";ק2~^[/ ON66=A1V`Reˠϸ`-~. ` 8;#aqGeΙi̛ JqtiBq`?MK[3۷gN3\/êINö%e^y5p>ˌtK}%KAɶsu&O$8/=BCXz#R̝X^=7ɝ~>_I*!~H6 u%YnGv~H wa-Xf]mqȧd_>Kȋ&о,mߩfD`ː<<ŋ#!yu&F=@VyG<!`<Gߑ]9>;nKfy }$#o9 l~lƈ\9(Jn'N%0461`̽Dra RF/W_/f~Y0\6)t>G#w"ݓ! 5}'tp9#$,}ܖ^dY?r,i՛'sO2,9#%\ɾ6 ]g$Y9aDu9y01zd%ceXL]Ey \TS7DXl8D t@>2ƶg#XH޼>˞cl6XgXr[܈ás.y,Z|l-smPO`vQvSŻlN=cvw:]8Ki,nv_d6w#۫Cki} mߒLI&R!F,l3IUj />RNVr# -XH{,x}珌'#7X\I߻Ev?mGKY՟RRy(169>}O`6# Y^|oylnN||lU4~9(_dQ>`cV,m%([;7n߂9 mr}a7o"w9j1<)VylFxJ{xY Nq̆̑o@e5-.Se8ۈQǰ= vN̻:E:ĬslZF?V#:cw/Ֆv}bu`$dg`|f@{6C3mX daW'vabc=2pI.D,:^`^x[X{jHDq}D<ϰMvy=!Cd ]=ydK7̓.X߈q[w}0 6K?'_~wo×i\-uzL `]q~6 %Ke.e-˝ds {Ƞ<s o:/(m-vEW{!="q|.<H;L=7U+Ss_#k<>!CF#?U B%gdc hNA|Qy˔`NŚ\M,B:fޯt%3v y $u3rz.Mab}ovry 2u,FTCd<& ]Ƞf}}ƇcjoM=N2g| ˦/dlo~8 Zcf<,1&7RHKG o47_ټ%mאlw'6g!g w $ ا9v 0ynŕb鐷Lɞ{?.!;Ņ"yo`$""8-kcFLpHDFx}}Ӗ3ɏر`NfOLeX`-wGcQf f wd՗#'}]3$.XH=b+!oCҲ:tģ=Lm|1V)eٟ%CcHFpx9w |Kf2Kl0E)+Oc %q5Ya}JI'f2X]/K-#0YOgKO<0lė%6M;!geDv-6osS? .QP_3tOѴNL'Xɡ%tM5#j},ṅ">#gā/tH$|H!|~,_5o&р"{`AX5u/YQ=K}Ӱ̉+Z;'%T0%!tزgUXǗ2o&QlArixcx ;uc9 FǗ'\d4籸somCC3'rDl^-a0nyl7l--Y`/r+dsG%|ä-M߂& ipݒ &ehq>$ 2[;kf1,`'oals-}BHyioݤ;lƽ60=}X#NmCS's}_}7 KF@zEۮ$M O0V&{~e+疡#ñK<} ]ŏԍCvozLݒu6Rw i'/n)(vIş&^u*d0Գ[7Zڲi~ p}͙54I>68.f7qͫ&ycO#ftlOvL ,/LRnZ]p| nFZBt7-k$ͲJBG޶OvG 9c[^>PrN>Kb˶^$;cv|vk-N[ -9b`|,'BcB-]#2t)B_x"5,mB>K/sZ-{3aq&'$;ȓͦxo5t> DpioD`=A<9&Ä[6lbqHyGcy?~L | rXae$d'|\v2LlV7/2,G!4E=Cnxq4zFK$7y.D}moO ; Ax{e5Iۇ%}vU!ܽrܟ(g!Vz$5p&6 cuѤ6ZE u~^ )O"m)[#l2I.e#Ų,4{0X ܨ/݃Hປth)0 nd0B_SE]p,$s68w@*w<|Ir>y&Fp!ܱò%z}d $ `r\P~E;# o$˂ $#\ljrIYǒj@$ݙbJV# 'f}Z>\v^]@[c١;3K=;`kOs٠qHCkxqbR$p:ɵAq$˱l99χ[E=_u$=pzQX1 N[G {8Zaa$ Aݱ{>efv5D1؋/^;]@x5`}#s'pfD/,O8[WG?dz F5:"bKސ #;}^F9#{uNq66;'S;xŖ]'|2an-r[Di#&>Z vrӄ I;6Y>0 c9*1aCbZdP0Lypm e_9tŲ`<,/lB>52Zn MacQw7jb'㶚lD<#$Bβ߫ٽIB0q,c_g|1F40f>ZO:0C8%5du #,sv, _l9.H]Fh;97F$s_sIÒǖ)f.:1C'G.(=&X.vc> E0z-.Ăuv$}^$$lI--"̝['սXCKe&}rF[;&߄'f'@+LD̺Yʝ[h"L!$$a5[K!eL ']1۱8l?W]|s;`?l?Ičsr#}Nc}'DI,iv; dapmԁ'\wѓJ*?F,}x/>}zCj{! I[cgKP}gk L0>ո[:2Yd{ o#Y ^FdHsY 1r(aw6b٩SXQ$}&H2uP!VX @V؄QJJ􃛡Q) 1 lgۦYf^CZ2MOn٤6!;?#;疚`^r~]n7x9 aa%N jct|8sFFZ> 8X*5lobgۘXw^VHY-&f>F;cvSXdC_oԇ$n16A# <&c06 Uvݏ%7-aa^1!,<~<2qpg,vmԧv=.!7Md7a]q#~`xȳK~=0:/d/v0Hp`x0GcV8Ι7^},>lf y>{(@w>G-A\k;q,||㯐2Vmvq&,pJ;gBrPZ&Ʉ?6cAa[<7{g u䜆ۖ1ndi $ o!,p0#IP} '`.H@OlF Aa͒r8d@g'jS$XH7YE# XjH޻=Ā !.q'd >@rǗNYwv\ǟ< d!q"2ys˅e:)>?%A9ntmPoC,l!g$;mmnp= Q d= ,PzJp$yvD)c}J<?v ;߫S闍^N:6u48(͓~x'nY(K 2c0B^YH 3y^!9T9t_GP]/{j#3;0w';ވCvG{y?Qǐ-[?̭ClŹE /نoy3> mZ^{oƽgېZH61J}K+!-ě8CkR;vlMXMx슀-"OIöeH[:l>ŀ| 5!Ԝ xZbrpJs_l<,%JO`k司_-2#2`y;/)<uPvľ!~vI7C~/$8Svz H䇤VF+(8xczӒ~-[bŵDb/~ϹaComI,|wmd6y?y05&Em?gl|d/QBvGX_}PCI~egprccm[ FB B(Zʣ݄Y ir}lFQNܶ5k-<)ɼ%?L ѹp ǐL[}Hl m17> $n{& If&]>=Za}j8('u?C5߳>sh^@-3']gO}!_)كflt.^okhO\:OGc~]{!6!6Yh1{ ^N}M&mi.t}ϲ302}N@.ڤ糃6631ٺ&L͆Kˉζò>Yv p,Vn+Wv<@Ggn4;rg:eȉXh4v,;&JѱGvN GHo)WK~9xABw ˾F{QtAdYr҄\rx!*1̳&=p?Aa/g~ Ʊc쵅2ݿ-K $6$3N2~JHZۉl#fKCfb %/ 6?w-=_߰,n8|.޻gf AyK7!uwI)RX=mXBD6D煱6\_{:{m+ k`+$Eu/ #Nsqh,}c9 1w/lܵr>py!;WK=MH lÓq>4~%\Oj;}d6<A `Cb㨣l1ĹyۡL|$d6T13_F6C<ۃ6~4_badv<J;1:H5~8f% J L yU8ɞ@X|O L/r"Xq (D)!qm.}+ `daD y>Clxc/r$w7`2I!2HgL,2ٿhwOrrg0c.b\!ׄ&a ܇tOQPfǦӷc.`.?FӖc;N-<SR `j#>$"cz*77 Ò@rQ&oPޗ g-YK$2'hDZu*Yy`p}M պ'qpOl\Y#%> |[Zal' ϓc 9<89vMlfN%#8ێ3`61%87p984="G\]+L~3lj'6^1e8rIٗ W>LaocRw9, `1fl}[kƶ21~ .d{c Ӓ?R[cV&T؏fb1DUl4a;G԰WG;7' 6BDOw2ay6ڥ:9:{:JLKMlA>V3yBJ,,\:`t̃}8K#<[ g`YoX@3gVK9$zH^ ,KϨn:feH]BU] X%ᑠ u\ m/.-}Ÿ7᛿./Ym׳3rE`H >Di96>٫`%&N Gey9P9?̡17^˥B僌ozVpaw6_,r ȥ)a:vйqMM:ƙvJ9jc/.o ;#/,]^쎖H `Sb>6r4H-l/y2 !p;ۇ~J˯Dqj*cՄz>;u 䌏ߏ`f OY 66eZ,$`ז1[ye3?ˬ-3 F>ж _edQl%cn]&GI5u/r &lD$;GT,cJd{8G:] ?l/ ;;ð / طX}Ot|;mPjS4$˾fd!'7N2损E?=KD779 d?>$!ƙ}J9 V=dX 酳wϿygar=ۅK~1GgYb,+/Bn-C$F)3',0m 3>KQ79q #"ӒzCi0~ECl R4m}YێG6w~7~_/3[ɔYj0 G,lfF,U;Ӓy1F/vXej9,Ą 'Ԃ[d;˭[6.i12u$29p7-eCw.6n1X3m!=ocGE0VIZr nݛot6oS ^Jt!ŶH{rK¹;/BAQlቒQ'v̕mrRw .:IΝ;qև.]mFznX<% C+h-za]1jXp ~-1בZ۷d&Cٹm(WId$T "^!'*3y Gɼv!?d6Jy }g6d8w焆ܘ̅2϶pg:p y?3~#]! TMtW{||ᐓ`XBLςKj˓}v˙u2,ώ ie(}gWv A`vᲯ!?e vaeȫ(em}?$#)ϖ؃e9oJ< ׫HHf-&Z߈i 1dhnHǽa%>7%l\ [,0jn/Q-!B3 UpX_bH%.'X;aط9m^s(J;? V7Vw0) Ae {0g Hf {/Mۯ$îOz,&/%ukel9f?a~eI'mga3瑮/ DrH#Zdr_WL.^@Iw6l>>&^|04 9V6J~~ڛfK\.T sHGOi0c%}.y_N,$$l_l"-3KG_p'c-{c [x#|Z6v;`˖v=}b:z$9*2)݀Hz8L#\no2uDLwv#Zq22AE;o r0q0#6y2ݝ.Z}ܑlY9X6TfZp°^\̓8-~m=,"P̡'(.q?! /8֯V6;1~- r\R.;;山E;/&vYll3v m% |b#K~vߍ-osy~a䰄,& [vð1x6r0nwl3nc-}$~۠|!9YUe]|W, 'JG*Er/ag<}J!I: TrW,{cǩGbH8\\,mc,\(r8cs5l9sȜ0ot݅+B}>.MK&7ʲөU l8Hm6|~$]glbY2s$FrS-;t$Ki<.ywQ$o&N:io3IJt=$e“c 2޿=6 ݲ]f`τ[!VKgI'6 O., !cdYAnY)N| R|J tĴg SiZ0nN9k)9疆db̿GLG/{?kI>.H~H$v9Vg@!}%1x@8I$o쇤~[PX30Iv3vԗ'=9z'Dp@!m oE1ݻ+XwIk o i]HNy݄;8l/ [c9$7$܍0Ԙ~ƇaF=n{ lbg9N8 >]72 ՘坟~cdrűf|n >\~ YH6f@[26UlcH]i7=|h2lkCyD8nc`2~Ɍņh"t93z|vBY }Ixфnqbak$i2n-D` yr9kf s/\zO۹8P;e Cv.rr,?Kz9kq>?tmHrĚВ+HgdnS6=;`Osn ,z b [́6MKmێ";)Ž8;{ۆu1!'oR >_j\^^<ndP[iCbn|# dsqJ˰aqqԄu3y(l -~Vʰ2$r~1Їݞd.gNIջZ{`A/=6eˤ`,'@ݺ3/t&V JB- :Y9&c |Wv`9"-1 ?{' w.!m@ yxo~96aȹ5ȋX>Df_x>[/,u+/,1(R,@ >N g5?Vd~6#ϲ*rzyv|e$ 2lL> 3AqQ$~ޞLgd쬙lXey-{i=cx'IAg1)~6gߞofN352y!}J`[9glk#bm&5Xy'`#mkK:`X-, P8F|Έw?|G?9.2!j4lAv bp@6Dcvۡl=&$!Svw#RS Yu3>X2I/B._Xmr~`q { q!eUB+#$%s#2Y6L?"9"ؗIg[@PVca!u4ĵid_N?Qq#67cB-$6ǿ)m HA;!XYum'>;{'1G%GY@}^Ɍ6AvH +agH (2\!P0Fei^]ba`Ne"vF<~͎l\A;'uqb8B _kCgL ͞j\iϸA9ũb|<.(ۼO䧼GHkp 8H$8mʮ͓,D37%F(a=v &mvc!lvـura&K$|22-g:x0' N Fu[.LbtKGYƃor]^5}[Z%t `~:ʯc31 AX'{'Ǔye;fY΅_ "$ cm'_} !~dJc DAtg.a&ݻx A3vSQ!xI Xb Bx;穴3hȷ^.D {fpNO]bmaFӽ21宣&? %Cۖ%MFJ8ع&LܹrvD Fvqlk f`FO,py6:y)!mdg[l]8V> Ndg&ŧK\3 knbd.2}o,A[)!H-|Ŭ@3gq2kOiFp%&܃ lquc$$`|a>㌆yg![Q Y7^\nyG-\-s%6rd1W篌K,$pIFXYǒ?}rț/Ar{1> .ݓ;Csn'+^@yfX'uafOx`޲^Kw/s_ 5 k#u xyV_rY3ՙμH$cAGC2W`Bh=`38H;йRqh;古 a'ܼqGuՙS~ه2%r\Bl.6eu!^IIKG[ynXyxyB\}k#ZA^r՗+Ո1 x&.d: `dY}ð_f. I&Iٓg#C rJd>˖h$/>Y g+6IBKX̀/dr1~Kl6hc#6:6GC_vc1|P˯/vN-udGAH"ra,C^' <vа{r{w; f匙8;)+o/X?\~th_k rH.Kcon!`8B˞];0! y 8 F?V&$rCxgffoŅߎ3eɖ7^ݟOKD-`FEXȯ#{yV}1rsd2^-lm#K~O%l%Ojvu>wO6-;}A* 2xGpAZb-3x;|0$#p`b$!E Z]:03llxi/Rm,K757Kq.Kd.s-ǒ@$a}-`Y"<[KvNۤ$%9MIa2:ZA"Vv,>2|eɣuƒ,1 ;}wi!R/d@0>s|s>X2< p= @>$~I>WrF!e d7.O-g#ȇf0هߟyImz~ L%ţUv݉,@ۄ mvξ~[g]<în?MkX !H3;׌D/jzmmZ[6ü!L0$Zv#Y'rS[~o~ę %!Ʉl?H.\d.&%1m蔭x_Ò'yzfٟ'[L.sr&%#Doo.^pg'>yeߨ?g# uH/c y{&dA vepSl0rku8eH*M>WmM##\+s#M1ĐKf>aˬ t!i˘3vvO${:6Ur4vGZJI'c.GHvIAc[aѷYv$*1LG ӣ6WfF;huQ'aE$6k m.ܑm%mejF=3'&<*օH^LJ ` 䍜&D"-o!fN|mك~*dzy8J'>K'ρie\7K,,mH7xy?l6 &΍h\P[+$>ǐ@iفZX$q9A`e. Ky$c6QBskñ,`gc;mE %' /-qAV;dǂG$&Mܵ1v@͇$82B]3c|UEX6a`ax-$GF0l8& "d?$H-2}/7dsvX|,4ܘ0߂\Ns??v|u&Yd=dp,nA[>Cn!2ZCrZ? elsa.F, ,[?ʳ}NOA& jH<7 ۗ@j6ö˶~3.7-O!݇ݓlehkt60Za*^o`dK.wb#i|rXmI|cԒ;=yi#v.Xr3kX켓3vc"&NȀ#QprGݢrz.|a!V[ mύ>,ʃqAElMߖ gl&ķ~̗:GI߫/!,Xt퀴[x^;L0a/Hl.هYKde_Sby~?sFvz}-dmާ-%̀rGnO˅Ձ1VmwL r8@K~$<#mob{h+2%^$.[*u,Zt5}]qgd{lWh칓-/!IT {hBp~/SX}lF2 >ٹwk3WmZpx~IX ͫlH>sެ/՜Bl̻}zҼǟSjmg-:DOlEG'NO95]$]6\c_bsi&ld:zF>|Or6^n3vI-/!tGذ 6*Š HϽ"?`ĵGao/we#{j}Yjd?nu=" !ka`6Fw--۴i kvH`vAh)`Nxdvlj<]!>u }ܒw 2aS@m"M%6էaGcX^<?{[^hčٷaL1y},W^B08qv̞r d[v8Ԝ3$%&CcN2D#}H6a49gc̄nՀ bIMԼ,tD\z eK\b w=cId/m_c$%9o~6ٻM=<,{eF3yeiqĄ[+3 0$`~0;/'\L"KM{7cyaj@>'q,b0f\v#ۻy<~ogEϷC,˲6drca3$˩=3}Y)- o >K ;R 2ٞ6|$ }2䳄|ov׳?L':2 ~BͿφE-fXbdlfϫ%]mIOɞl^!1Y(/β|͑O`K=6]qw!r퍺;d-r53ovZ/H{zuοWydX]DDÒ<1(4@RGOc"Sϊ-/y"1/VK(`?ewuy&{|I6N]Βd ̿R\2g:—ol!tZAopllr[,<"N_SfF|~Yv/#a [S,]w#Ir8lW'FHv`6g>H 8ZԀR ?cp6L=v]tN{uf_Pח915l{d֣U2/SV\E.ٻi܂[lǾc Ct:vPT3Ӷ[g%2|߇j6}\&c/%,9gp$_#e9=% ^I-GwӦbq?xfy(ل.?=*LxC}HYq9#ZA![[uv9흜ܸ|re2% Kܔ`6Z7>< /5`M582̀?IY1Feݵ̓͞O<;}6W1 ܂f^r7ςOV 8Doc #Yǧ S,Xi Y]HGyn.1"(y].FSNjxMH73vЄjGIO 'dѲg*7.#{{st9tۇaJ}-9Ԙ2p$K"Ƕ6v]dD$i*rN /l@&f#,9 a")׮XN]߈C>&mm|C.;!}dM߹5q?~w/ u=@AB,s̯>3{ge(sg9U4Vn 5CS`V0ca-PIȈ CZR6bA%$cNG5G ΑwK.by! r۝KgpeIHhؠȂ$y[dK[޶ ofb˶Cpls]R,XyB_YHub8ħrGKI~,é"xH6U K"{c]茏 ^>۷#2<o@zſa q- UuKG0hZQ% XJgbyhoݚt5lYy*("_W_sFGǮJ=%谖p쏫VC9tH[+ YI2~X r8s0%3_m=>-" %vy 㛈9;-'!Adrόd&cR; Y_pb'벇QMXJ̎H;>)miiV/E[݋'l?!ywgKY1 RC\bcN,gv෻>G-F@$h%G fуܣBBb cD<^װ/?CVBԕ)-3e2쌕2g|>@ǻG0'O/e펧rldA>ٮV 2{E11bovFP# 'eIy߷/#[Q3! \rB=<{sĻu g,1Ð\ ~^s/P9B!,٥ɶs {>iu>r Aہ/!Jn9z ul^ým&#-7 [&@J4v2gBC/,"Qap6g~.mL;ˤu.fˠ~R٭=[].X Ӱ$嘷D)deFf!LÑ2uC9sC;8=Iq4Iv=6>z9my3%,MI{?gݿO3d.|T.ev/m͏,-l~sY]ϖo-wݳ]agcg[|KV]A{.4$ >|4Xg.-d˰/r\1pj<xrn>4_TZ64Ii O 6Ixa#r =kչ'ޛ,l yԦ-9.GL%(vQVϖ_Gϩ=vrߖK}35>}Pc ۶/Hۤ7`$`;i,<6?n-[3GaǤ7, V>n0Pc!da>=}:AO՘36}ƞξaZp z<L3hNynPkru䱗sm.k9pۇ&^5Qݕv'aL@1|mRHpNF.3|mms7~قQ][=e(Cm;tI5oo[PO[Oa-{c L̗w !m4F V@ın9h9.jeb)=%CItِG#O_`[w/ex{wy&Y\Y.HAl}_Pr_rA$rYY;;>M{oaai-vTǑYfK,Iղ2;oݱm6M<^npx[#,,--H{`t:#r76tN-=!1GP#~&g}k8e=od؞lI ݷ'F ~ >LCro$,-Y@?ĄNxۍdi !Lq33-"GxgMegcvX9lS'<^6-ϻH,Kf^6 d)w@QYtl 8$Y3?KŷTnvc,Y'>O!~n+z`Db>v{uO &a}5'6 OYYSHb!drݰ>ϳJT7Ym!>OdY&d"O ;)@ݱ#LF~ ܚa9rsRcˡa-y = 툳ա*'"{ݯLϮ}Rdr|pU _Yf{jbvᑃKx_Sa1)8vXk4e_ԝ`yy; 1{˯., 7K1D|ynfv=-#ٿr휛;9u&-y䤬EDC+OK+ ^̱w9iu!~.i,,^Z[$ŕ1hvY'//8sb@d,A$6[}G1gx%;.+e{!Di XONZ-)/R,Ȃ7;!i ia%dl[̷@G~>G =|$C9J ߎnۄ;)P&l }%6{)d#y$ڇ vPC||s.yddlYF$ݷH{..e˯lKr, 7Y z 2{bAo# d&?ńض4ad{9HZ}mrdz!Dr8O\r]_ r@w{L>Ӷ>mL䒶~)}A .2^2460^HBVoĝ!D{ω~ Al5 lgK-y)'.WQt~oo9s><&]̀>g-\߀W } n+eUK}JrDk_mXX9_-[ݼ@t2{j~lhYcvw;'߅ے_d9b6r#߀eׅ q"KPdrSeyf\[F|~c|n!~'NIQY$q'Ien%eհ hf;B K2v~yyllf[Le~;d c#g-`.!䖰[_{.D:×.,l ~.݇#9_ =e2d^>Z*3w_?ŒH8?,&X6z<{.ލ䰂X{D??werlgn ru:&rEMzܢƌk}&a]G[jt87}y 0$Hx 4G/YaL,K.mHH^-}KQrԋ-XB81ngbvޓUR@xJv[qc,6 ^N >[}Y[Oa >P3Qx]NKl/~]^Y v'v@mADŽ̐N1>ڲur:مp% bn, uۑ!.9. FZX6zJ;wgv?W([;YC Ԭ!b>U$Gu-d 9qvƌL!=R6Kدvm=K!2Zp:ylN۶Q-`og =28伈,gqٳ:acA 6| @62NIaqy={H_o_>6Y\&K;a}69'"pq7=a8IRմπnC' \nX@/C'!Ja~ 司3A 'р#Ҭp{' y|0߁lݑ,T#͟t\osYDevKn$zŃie;dbX8͉r8˖<pZf[ݲW frG՝ymK彽Iq!Ի>lG&>[ۆ8ϖ`!6KBSp=avr`d tPIu/9yl~^v_&Wf{t>ݣrF]nvs4ͫ4 !^K{.C!R!~Nl!aّ֒xhmǖ,'# #Fn ae7^|hP0ry6N%l`XQIܿ#2 ycrX09}LF.=#n[٘6gd41-9? X p}EͳL]!]]gr8W_=%3J,XVcL9w2#qz$C?dt/)n%C14 b&#;hZ>@vdH?<&×O`f.XQud`oor_A6nK.ynwj2۶ Gl ;!Kf|G]ojsn'Gã{>olv!+c1/%ɿAvhJ9z%7&Zm˔3܀6ll`/n '=}e 9̷.LccPma_NCSCg[&=!F7nO ʃlHyp4>esP1%%ѳ'_vܤ[ ~&<vv@m.'a.X7' 6y>F$,%,FvXl8G! rKV%+3mYc{.L47]iXld6K&Sam;B>].1&$'\aBOYϐ69lg-'f2G 2pɲY{ddH+cr˱X'>$Yo AnGK_ C6޼o ?vc&u0A y=Of ͹&;ܙ'v̶urF-L \G¶;fܻ$(Cw{pu<)#ϔ^C>]8bl(A-xHoI2_p[f:Ez%#8\I}_r6][}XOr\ -gǣ!gOVo0{v3dd {>믾 3ɗV'2Z 9)kaa}G. #ag$6\M!Hw- -agwKY3lF|S1%Xᅇ21gwd2 /,^nΒ_VdXmtl%fdYtn۷#휟~yo=^X>kvOC6^[9۔Dd[b!?\_ ^ ߀cffٷa1gpiĻ{8$rX۳Bu?e ;|" ;m?}5 ȃ8s'߫ur`[fE9mw}zˈ->ɖ[[5.?&΢eXdyXᶕBvlkzal26xmc}9 Вx2[d]zryar cw籷{헗>1I,_mLg wQhĉ,1HtYae߈'b[!/>3GHr^Nz{ޟH>YyL[mMNo>ɱ8rJv߀8m.}Z,,as ebKWlEL5v݌@Z`26bt3g`Z!+ uN-F|{sneϗυ~~3ϕre d g'G-mvy_Q=.eߋ{01d/9%L߸ƒrnrv@e {l>Nͱ"\-Fzvy\c$y g£]N6'wln^`v^'Ǩ[Ite?;p !ċ Kȟ+E bo)i 6}-,6d zcKę\"#>6;񼷹._{lBLm~K{o'Ͽr,RY/'0Ba{OO,=X.?Q gËX=^/ͳg;vY oyuc]fO6 M-]lL u,r<]˷i<>4'Xa/]qCnvYxOvs䜃lr8_wݷѲDd#dq6N[$d|r 'dmdwl̾ۋKfFi|SaFg!x AfD4d v5; -<2[K  /_g~2ܖC.9}g}A},'dX{m_2~,eoN8+=y坍a9v qrl`}ِ7ì,z"U`o8I̓K emaq,'A>dOr# $6x`N =8&vgÄ,J-,!cjrJςe 9y&Nc6ԏmܾXes.0v痐K.[a=/h 2xۥo.W\9% < ]!l۩@g/v\c4Y)Lvn[ա ;on;$8;z[dtGxۖ۰t9Z|=Vtdy"i=r ,sl7e.$,nX-ZmHi}io.o>\2I>Z0 wL6y{(n͐rIݺ_{ŋj;l6|3;nJ]eL>%sYb6t,P0@JbId &rͬ7;x7S3lm|m|2gf{8]%e彙OԢr"/Dq/݋]7݁Kj(K̽mvy7nX,2Mla] yǐ;zK[q$GOа} r'd̃~4埲[7|,I.Avgr0Hm,1v[yX~Lfܽu?_պ]M% -ۻ2c nGYpݷ"Qt;6̷co/Y=/7~x7`OX/lɄ豟 OJd doyarg{ȲxzG@/l,%?.PIus7ޑj,oonY9d`rb{i21\Kyk. eY2}s˒&? Y 491a< I9 Ñ&DŽqe,IrIRgۋ!dϓ) >v^ZO-_%,]m7=&xㅞFe7 HnkVZ-FV}gir.O >3;φk/NHYvhkI{} q,77e^gK6|wCVه^|:Uۍ-o ۦܗPHFxl ]Rc%ZN:<vN'Ob44f^3/aN%=i;䫺 ׽/'̙݋;ɓnd_q>ei[iol p9d$ЄǗ %Ìh#CN֮߯ ;z4,`l$bTufOcyb3] fKg;Ga{}@Zv8FO2rʯ> "ݴj7'vto#.OKKWV0.ɂM,VQ<vE&1F1c'CsEY͊.Cu^iW?ahG "rRK{} /r}d/%`,6=H! -w9auMHݐgdb9c#j B5k.}}މ& d%`a- F3C퓶϶}e;f0Ymߨݎƭc,#v0߁'l )V=X3>m=bqX.͛)pkXs9: `] K{0v[݅H!'9χZNK2r\zLq qws'sٯ "ĘG.,v Y孙9lʑݸ>'_ =ƷMK>sY[ IR?>Om[ -?7>7 f_T@۞%K|$=fH~L$19&ՙd2 Ⱦ~<6|fk Yac\%Y%ac{ enIl˙owc6Y{݀s>܂4πb^,fcP&agFf`=$9n67bLԍy߁սggvŜ>;a <$7m6:O%uYf^4͂YV d~~1,L6X;}^;s. vlsl;Oxs\߆ly}l$,w b4㭆iyy'.I$@Xedlgl[ Z6?>]#45$dv%`m>C r`3[yom&ܽ`>ZKϏ'.='H=3gi%V߅d8^,,mN;lAlO 3 c-vѸ;=>, kjƐ=I[;f-9%r-o綽Ad;#"8 Iiɞ-YG,l$lll̏C& vώ'P}ǐO/;:>&|#.6@s[9>rc匏gdύ-Q6|*U[ syݟP/o!\ 9-,446MHy9 daj[`RtrFp[`v ig{KS|G$|n{.A #6}cg$>/rܔwHy$ c~<2yؗϲYaeXqPl|%\bϐer'~Y:/?ĜCHa. H 7aqnˎ ]9S-gc|e|:[[߀md) G݆\6bl˄,mb - 閎O7؁di.ρmάH^K7<)7 ɵfWs-٦@|1ng;g 6ŏ%|g͒~tdC9}XO>[~5+ٜ@}~ [9B<61彵-[V$MH8ZN[yz[y6o&&6d'G"E[sNFg> D^1X M<og_V7&t㋇;0h݃>Snr~<˶tć;mx}39v!v;\H&8O/ݺbف:9 Ab]o4o1߅'̈́aaޜ(:7-t"s}XxOgV͇y6l[n߇>8HXK{i7gľcw,,c" cOFͲJ.v&![#8<*SnO~Rwl ? ZDXߖvN{laevar۰wt!π}N; Gh.&fMGV˃3pdĖo[ų<|&|āVdYgDzrXg?#ˏ','%1d.ץ`w%I&2^C,NӐmg/sN[̛/qώ|7?W=fk|H|lv3-OH6q'ݗ,g[lrs3+[@I'Nr]-^Lf|]:iOǶo>$Q܍yuxˍy&Z 坃7,Z2v^vwq{lio~6;bݾvߎ(0nٱq흛`ۿwn&X˓ i.$;brdmW;cEԺ| MU[^fo>([Fƽ$Yaa~g Glgd,?18ٖmN23l,q&YYus q4Aթj714fN806XZ-~/6'a~|Dyo?ݻxe2fc[fqld$Y$մi1g9c4.0"[md]Rτ{׶MY?s@c6_-4S#zC_rQC>m>y:ܩa.^ܨ!Ԏ~Mm͏c[W8M w#?.>"_7 cv ME[~n咳"rK_[7˖n;@xϐq;9X*LۜwmrCe~e岛Jː^zAC`ύXAn#NoƗ fHEM!ېdeZŲGHSіm$o%}Y _ %v@DPįBQJ{a;ȾQ߉e l}vN6춺-x73c4W.l dHoc-Y4>AfF ߆K #HnC>[]C&ldd/mlm[oIHsf巓rb#zȊ Scd.g>K{>e۲rkJ0~.OM0%;^6}YQ̀e.Ml\C ]CK0"0-殭??e!g?IN_wRISlk/[n]WW,v<{#3%AbAe #͗Y` dB;o흴-fIlCge>ro_XԌ:mGZ_`ݶ|C btm*܍_!ew$>8_Vvj"gdX%o,grkŸCK9?݁vN.'6y#7V+%d|}܍ ,ϓC I9j<NjzoDŽ:H/#Ȳf8nٖǶG?,۶Mm!]lR r>N2;u'$l~wǖvoNK2}/ϟ[܌~> >8vqAu{s/PF!}gDznsoόd #2"xNp4 Co>>$L2 b3w]s }.|L6m G! !lߌϝcύ=Gyl9,>Kl{F̝y/Ǘ۽n'B n6n <?l݈-āBCnÿ%;~C; 2X}g,r.ڲ"Ͱ9:Ǔ,b_ݒrs`neF__ b#[8K>lRBooV0kc6}ݖ]&Z.?OLl=~-{gXC:Af<'g9mL\n6>ōJ)Nܒ{Ԗi<"d?e_qey>~m_.!KHLfu+Y1l.golɶnlm Xf埱v!O$&2M݉Rkn\߹rgό͞v$gƟrA/͑7,C aܓ 3>Z}Ķۧ=yI3d2}F <>>2IQ^Giܟ!|m#" "`ėYo,1n%͉>l',șuY[C>7-rza>%%#$brL,` [a%ds]/%fbA,7y=f?k94vd#X},!v'᷒9Y4 ,`,.lA9gO َ͡؄łLv .rM%2.^ܻ&HB/gYyc! Ok9{3?AeXHV}PoȎ\9!v:> b/>bt# n]}XXyew C evQ"lfpr1$-}O`F7n_|ŽLy񝾲f1\|;a=Xn]'<1,q{'n퐓d!$f<=~^[1Yoa"[-;,g?~tu d&1]omԋ&2'l> ݖăc(NY- E$>"^Ġ kA9_&C5{DB%ֹ+ @MvAtC%y+Ғ+#5a6-MN&y a+Ns d+QPw 6/*2*UA*z\&~ hD])~$/'Ï hn\\z _q j- tWgND9㇞2^x>sSv#/3BZ G 1C[V4 ~7 r/JS T֏`p՝x:'" p1AJo;L4yaH_ox!#+/.QrBkL3P9hΤqB%eA-RZa)׹gxC*<@W nE{U*#ƤȠ&̎Qbdn%UTjh/y&YtQ  *b!싍[ԥ_HaP)cbpw B 'i4W.K|r-"*grו3YU\ !*0g-.SB'P@9GaHD@ 0tx@I׸*w9d~%DuZ "T^Hʂ7i1y>Ѿ`\*.R,aU*xؚb#8uezӇȣf*fvY~LJS);B:RX@vsGq}1gqq]$űoFڣh[s]iCJeoƤF$;h<*$ҎíaWGdZT-,Ygߕ>cSQ.AY.B5^7ĶIs>J}9W }~x1.x 'Z)+ T- (aJhr׹h }.^W$k : m)襓1ֱ !wR@b':Y˩y[+EEUPQyqEF08GkgW+ߛԥ }Âo06|w ]!媓c1dc.PpKcI_RԻ bqv 䊁 KL 6;QڍQ( _̀ " T4? @529U8.2zhϜ͟>T=WԕIR2+ ͩѕ;o! 6r($\BrAdZαi_l'[N[C9-Y.r5CԸZ%k&/ĩ`Yo,:#`xXpJ8 6:Q(4DW-{}ڥomZW:m,G`+ߩѭ /ثKu+:nl+hh(OR{"^Աy^__~eJmq *JRpx 1zrsbrY<Bc2a<¢BW O9!m[\Yp' OsriJpm^q%s,4pmh։rB|h_Qlr$#&^.,Ԋ)P^ǰ%F>jV_L/m=A%YrWx+-Dv%^yiZpǶN }|)!*e"5A| (#'Fψvڳg%n%zX;:ģp { k*=)}P_$?#͠4}Kϸk-c[56S윒 l|N?G9h u :ay5oQ)Nw Qu,zH2Le$WV q9si .y_}1b)* Ru45RQST>Y/^/_W:M#'ChoU/u\Pnxa( 6=9 x; k?a!Э]S ՉJW qO}JV$-pheۘ3b[|ń~`!Rw@[[)J>#zP"H\ XB "kEe v%V@~!bYJ<nW سMc%& v(\3ќ& y,pBf븖q7^bb+@ ^Y*wR G#309#+1zg{E=OvTHho˙=+ (Z0 ,nK0g@#rZpo,Azy#0l*IsKWEs(Cڬs,KmA0 .$Qo`^Wn8Ik,d'+ G*,8x-pe~%F1zg[p":Jb#U,.ǮoBLBA2R"IJ45fK(] b:ARw!moYfc`reKV*Z,էԫ;ݐ`:y U,5QCDXx(^ ݌Hr (WD0%|)BMA\y"-|r(>NawJ{FŔDДrz.q[:\R'7ԷKTlRâ Pze(R -eKp=N0BS2s~`*B!")/8DC$=L.S)W+RK?d=9nۃК *ؠQNOqa@\r_u3\Nv ]/w4-jD#'ψn<8%Lr- G<"Ǻ2] b^j,T X( 78|a!w 5}Ya %hy"5R-J.w GnWtC = Us:*M%@jsQiSGӷ7[`ڡNBYR|^cEq3۰{_˖fBVÈ6ru1{3@K@i9-KR$Yg`EL P( b&>y^vx0+U4kջ]ag9{ĪnQ 2ںGJ Zv># Q& h7ZkbZ pr vVc{BotJSawQ^i8^ak kx7,fpG#(m̼+h&t8l  pw V| Hj07!0,= _ ڽ H$-y^+TE/cB2ՁC69/񔩧p ;7ĻPjdР?9cZւX!A(zߘJ8f9* j5Hr &jfPXPeZ"@o R`n -]}q(ž21<%A/t\\.k(˦>E jXW!:PN&+ \9^gU M8cV1Q6_n 6h5@˥Wf^9$vBA'k8765DB.=Dk* aY^eU[*i*edWh'[Noh5 ^2"L.P=K5-z)Q0+ZZ3qPYuR9@+cY7=lE5dw2V{ܠ_ǘqT|L js\2B'y"Sl+e<C 2w]AOy `i`#Q{2b[Dx~e6F5Kq畇[I a |CC ĻZD&} *cVK Wm %s U3w 7+5Ģؗ.u9n +!TPR|K?DJͻ|@zoZWph Lhqx]r|6V+YcʦPW=[Fq 29Fs ?qͥzmpUdО%KNaaN%c0(V:hMh.sO 4,)Ⴁzܡ3@6*7 n~#Һü g@ae?* -mRWu;ajR [qÈdv 7w% UŪcj52pkuc_KZnk:DE*NWi_!Ծ WAKSU_ĥh@Ayl6!\RR(~X4!Ru7ə 0H<{,'XVШHmݮD΅% ZG.~ ik ?'U8e~ÿqEO!i K:5% Tw&j>"TRց,Kc\~xzJufmt٪f+u_ oI&'Qcb pa)ǔ]>#%P/Gm5s:@sn8 CD؞# GJU}>KbwQPwʼnN;⩔(XuyWΈQ([ž>m#iO P_X>?4}xCg kIͺU-ca7H#.3\[g7XZXn>n,WTaJO;[d,@RJ.0U:DmKc ..I b0' H'rxw;%(\܄5 FRh&?c\1ܧ|#*NŒH ؖ E45s-VF, e< o[,|#"$ y{%!c7}ņ$1gѼ)/:K_bpd ^e@7Rpyq U^ZT) 9\BCj 4 r> hQc؈&ͷ]i((Նj tA=P !v^UZ|xKZy}QpDʄ~ OSa_@s*NK,SAG+ AMqWWő@06VEEr[op8~СiS,㕁XV~b8jUx!OX =HUdD9@C~ }|EysS|Ĉ#̰.pQpʊJ' վ<ϸ-y JiC{+cB&u :C,ISӑpJ Jڵ/|+§ZBQqW  3L1@C/ĺPv;ft8(O"P :a#h/4*XrJҔN3Jiw"Xa$%l_ _9Jiܠ0^K4P u L8ü^%(]M%kNFW>AQ4 '{{+<%{NN$^g樕Sf ֤##*S!ߗBPT*/6V%4ho\WƩ!PntԸ6]}TX!},Tar)UeS[p*<ˏpQv:9fD' @7*Kkv#J9 p < >ZġKd>WqU銙<r+B='q+fq AvǴRQFPNa`ǏkUPY|IWKkAsjR#K tҶ4'Ȝ5mT}̀>|e|lym3+T hJͨZĸdtJ.BԍrċIU.Ob^ &T-+U7|@Iׯ3E5w &|Dُ,{@q`x7Cˮ@Xpxrxkc@W.J򨽉^x#| r, 5)GĤW&C 0:vZMT :CE=zL-)fR`ՐaqaBo1ڗ…Y(Q5dW(cF5m/2&JyjW^e@h!+^OD!TҒ,5گPo,R[x"ߐoAY}pgf{뙔(V#]d.z 1h|JŨe!`BCe51`v59~}Dlad"ԧ+q@ܖS~ik@HUe97buTro6KlRfpѷhٷscy dDvT(g4mʽGEj2V/]$sqNHW%Z0.۪q#xy]$d҈/^H)K<(LJZ@A`p Es\KajmZf/23^FBR]B)1=@+r}}67]Jƽ9¡aaf_8kiTNokĹj'BkRs!9dz|KewrŁ4UQIa G0nAQ,U㚍˖k2%'.JfE[s]*l{˛GEK,te|B [+cU>cԥb!E\T(|$@Pgn:slyj>|n5u˙y|įEgFSv 0[0oĺZwS)؏'3'?c5z?K@\Ez.oa滆GK9ŹiA$r JS%fUqYMv?2LGpT]H :MzvMx;; g KqAQAoU;7m(_̽ XR]޿xVyL!i`"zJ+[KPlM>#r/8tEUf T`mh|u@ɚi[)> .Wl0 JiG<vwMt{tpЦ{0Δ.R1{EMTFSiT\S;+)ҡqk]jϘoQ/r +WXǗAvHJh't4JY qy][p 8z[,9e}OMy[XpbaYџ_ !B$(ru(qլcpz"@d!|@;9r|@hϸ: (ȫ #\ʡa9N7,yP{ &)a_PQfy<@4eZ`CjxE"8 X%|G9#h`t7t rSyDTV3nfCNB甭hC(\2pbO:DrpjQp.\+Ɯ "]zCDPt1bY;oh9"Pm>;@A;\L KqB tb92j qG'uNM 4WNٍ ڶbD.*Fmpdq @^eh{9C7 J'`!R#-Ħ|C"DU(Y)Hb9}{RxyRgRPA^P·p ` [Rf W1Wyy8]~.VU(Hh+:|xG-pJgpu8G{B4Cc4JB*]c! =^1l9a6W ː&6U-}@{`Y}4||1Ge_C8Vǒ>"TvʔX -nZ4 xx3A\mЯj TtyY-ݷT"\V'XF8ƛOalr`xQSDo >%q{".qCЕg14ʗ!0$wP)qHn-3`j]cU{R5GBܞe팪Vr.<4beIoӕ"4ëUQT0f2 e?`{sE(MQ/i]@G'qZBSxa M!9evÂ7)Ö0af [Q3^ab-FFV# ^M~' |[Z?2顀]oWrD}|+ >_Ly4Jyʃ1̲#=KFW[O$WqZӘte7{L-WWVdq0fu*:Uِ"`JBt678^sG2ohp09:oT teҪŸEpD¼B%&4-#ϘPCAg5-4̳<.-8b&a7;!6 ?\~(XmHtSJ[ʑ`%S [ixHSXSoʴIqMrc[?m裪q2!l  Y̥IRsYT1xs]Be1?X(0 :?} WDsb]`TJ3KN"w'C]0_B"AsvWT.qj5#@oRek˂E[فg؟Ld7S^j#Tve6{nj|2Btw\ 5Nl7lkuK ΍xȞ oKc}Wߩfv`R_!||uFg=Ǝw|%dH݁*Ң; KO0( Z$[qFe3Yߐc*dlE<ʁSZgpw ג'!av;@ y+oGΫbM8d~0U;˄[iŁXWrďz6MVKQb߈ͣ:Ub*j[ЬXJuEpI!.%!q|@i?m OP1W`q9 NǠx;-w#| 1!@TbE{;.Λ8%!h$.6y8>4FԿj!)h rųr|E= )^O3@_17^ܴ =݀+ȋ~##*0+_&YEEz>bPNF (UmTVfľ['C^BW~pGU]խcq>o  5`MR(W hߘ̾'_~4,s.7ڠo$f ݷPxc<i1(մqZ_rJZ?y`~گr_EPJhrp; .T\b7}ۂ(WCMb2{m@3c Lr!4v M|J]U,F5̡53xVPz|îlg1X/VUcgӯqN}FQQ;8h~` Բ5+o#-9"CA\ eԥ˕,lT6<4w(.8b.!gCO(&0$R. u byXi jX%}<,wm$Ø,80s!wWPٖ%1 [;D PX/Dh',V,vpS96s!GGC opN6i]±]Rteۃtu-PYy1Lb]A8ZqpC<3D Mp4wJ0*Pd05NCPt_ׁ$t:78:FVn[M]\)o~S(xPOK V`|tݶQun>`x|K+Q6zf$_FXz8+F *qEӎ0Rt@+N񬷩.£ZƊ8?y(ZP["PMxʍ`B z~+vl~eNVNk>[~noG J[-`V& [#aJ(893T0rr0d92JGiVcE.;֍tE./s>5tP-#FEL Ԯ*TeF'q5C bz(&ZU݋m˜N.\2&=-%]%QGa;0j \ bǍՋ |d[ȮSZ1e+:Р9hc4eip fk=LA,sJ-A 866᝶n͠]-Π-'!Y~-fB[B[S,xGqG#7TFC;Ԥ*/l+N!>a45R5(tJU>6ũĮ*tIQflW\zb-C}G eDǸu8&p8 5PR![cW!#.,%`O,<Qr6+VP.^>gk8AlskpL/d WU~2B~29eJEj *c%hP4 80anP.-iP;&|T4 p# W`h:"\mDJqs&9&4O~,ln'ͯp|Gt9hkԠ)}4ܨJ[/_/Jx. (oZ3-NkڪяWQZ48ϯpݔZ?a+̙~*!WyC?~9\&!F9߭- .nj\n7?,YJw}_QRow!JF: -\x 5ec&" iZFz7r`bzO +2a`xښ;.Tʈȱlq4ҭ ?m@dթk`<AW迣IJVA \vHoJn8WbERD  9b/DS"G3k ޑK[ZP~'JQWTWܺA&WGPݬp~H^CJThk$x~"9]î`P8Nӟ0OmBcGX-b7 ˪,1L}Fu=AKc@[٨M2rPAn *^=DT7 ׳)Q☐[e-[Žh<h m:*չJXԤ۫s?QEFq%# ̧2o dAqP>%~_1SD,EnHԯHD`ibQC TӒ;5Esg q,m|Ao<+B@=W 9%{rW=<~V4s%e⁀5jP&з$Ω9h0 17Q`k55y@wE!,QiKMhoPAu+zlƆ7F`Gvg<Bp)$ZK`O%CO'Ɖs$oHo_R(ܾXj^B6k_V5-XU~~?(RYղԀk B^ J|CмAdwvcTCdOPADz5 yKp밼;ٲâ5u//VSxb \,IJCռT|Fp:nJψ#VԢ9zWB'p)`#HscFx.O=*.[ȩsmCP `F>#: %tgD=W +50i|@T,RŻO>!v~n6H3 AK}[6F^[70ݝȠ-k[+D` ֬a0tA8.T[DIˑP6L)r 81ר}PGXjyna0<B0!'w,q:|5d_J- Oe]zzxN9OċNW\yf<u(W(]ȡj+tRg>~VwT"(2dR0Ta.8$e,ǹ.|Ympî!kHu#`M^?jpqBkP?uF~ \=Kk/[nN, ,ڹ{29x )8;]ߴU{C}5\<E/%5-?#869S(q|~e~B~m䲥٧&meR̶0*?*pz_BU}ek (5 \ n^#VڐStsp K߰9Iz`u6SA u_02o|Fe)*եdw%RW}4RXP((MF 6<^| ›^V4 )Ƞu2vH(Bug R.V49d1ʄ6qGq[guC-aÇ_AB'T 5ٸ,9p\׋0<]"cL${^[@oqy[y{l,!b.>:qujϩNşF@:5ogYYs'hWA(n Jv,8ah` ăA(J%%q|ϪӅ;aDp60!Rڸn/R5kK2ǜ7B-vQd1^Yz#y90׻+k[MŸ.o&gq WUZPZoakbPJwQvBڿ?*+ÕTri-J񀩾4slmN ƒB6?.Q/-~֮?>A`iV_qY*(Zv,_!@xz  q9l(./xBp O5^8,,B ůoD3>G+> I6r nTKR hV3.6H{+Nf> 4Šo)ZD)QVYwoXnsLPDlB1S|`QqFQ*\+qtZE@,e5G>1D]L -xFώ hrHߨ/E#Yܻ.E W@?$^܌lZ93 P=)$`A`w\ \fvo-R^}4{վ%]L<`proLߘ7qG|COy{f%p˜ŖZr\  \1J},0F,I;T nyʜ3`'{)i]`xreyA,M /zDB)pnx/qC0nRN~L8uU=fW8sI/7:/HхW:b1e Soіsoĩpȸ' DCru¢9qD_OR kdnLnmm_B6,`)ܫbV@"6XR|vvSt 6Ruo>@JX`PZZj߈L@~Q -C+_H*! ݆?XR1$Yv +q tM:uݤ6vEȁϊi>_-F<؆Q$SZ:ow%]o;aK LK>G@ ,u~Î"4L}YyRʣJT P6nCm*]FaT=&=#- ,]GVR*b"v=Pv1Y{d*' ]QR]~@ܢ]ExQV]<˕ܰB;hQrebT u!APYW9)6W@Xn‹x .((\׻J=h^n6pmM>:JWYA/DAAܾ9^Iy{"oqE,WKjs%C1*x\SPDҰ^"˹ /} `vB4yr GeBzJ@AZس !ȡ$zx@lRB`|@JbKh#Qi9VQDxR=&ݿ-gV8+ܚ4nR k.criE5tk;^a |q5l[IǩS?|-D%"m'@@ p9"CMd_2n=S+|9׺|,EeۑHT}Vk.Mu]UzSZ}E@ x,S* >TW7)~mʡW~ϨQo]gT{t£VM=@'3%v> :\֮1QkF odns- EXgmU%߭~TIy]bۼ/3(B<|m =:ĽرE&&$(xp㎹η+yޣB?ܟ-hR^ߞ&)~a@*_tRD׿^ #ZRƑs>t2: g\ (Y vy*@k#j<̡ƊG3qsZ/(p מ8گDqTBcŚjWsX9wSԸV__ uR!˲S;!Mu@8=NekATJ^c7q8מr:/P,EW(ŠCV,bilx^(ٕ#ѕ-" D.Vpbg%r Z`s̽f?SZwCK.\JjfY?iՌ5ЍK$ZF8M\#zrM j!JX aРQiBpz|*ӂ! *1#/,w[,aZ#}V0k%DipI!N7ĠJ `Xxks.\=vO1F'?b(wU]"w +*#H%XpÈV}E#&JtX{`#[/eAbŷ!~xARFtK֧$*ü),d Wxt䗊ZE#U]S0xSz1sK}`Pjd|@b9XȢH>2*Y.co-ynT7o?PρzYT@u0k2%uQ)ܳq@Co}ǹ?MK> q1<@5҄%|"mRK6p8\dĵALP?C6b(, @ mwOE+W!P\{r0<]Fǀ-&t~q5q~{' ׎GIx !,^iX08nj>L`PmQ4t[] >v55B&mP!&^~e,`}8`_vzW;ESO)-|3/-}!pkJa)5_@r*7Kh,Jű~ш\Tbo4 Oo̺㢍G:, ,! Ke5b SCmξ $};ۯK" bژ$;rr JhWmPyD 0=0QG̈ZA;YEKnyrRp2," ;Hoi†ŇQjY0Ht%rDɗry;6YFAu ͣjMU!}U37||Cj]\~f%S"\f`qap;jDAPx^mc9vpfCW\ߩ.A@9n fVLHxBUSTnɬ>P:RnH!akk/b -rR {F^z,{(b P(˭e4vq*MkSꮽG S]!)Vk+_dZQBvb eQU.:KkөH/p); _W;y*$0at.%qwX熏cdMqj|M^ "_y/OPp1(ks9[쐮jР݌c*Ax,AEPts2(_ۜ -o-lA6Js kEa׸D*U PxX'u(%UZZWZ_FV, =gWD]؜8)oJ)ƊQ8X֬~}8$FΆZ FG (WaC`>?p h:s P0Âv_Op|ۮ2׳jJ1+'m~!Y@ak vrU OY ء ^d.Y"]'=qk__xbZ-Adm߿qF_NU|Ey- Iu`ܰ5:>j^z>}Ycz'T.*W5|0Na_k}ytTX?Srݺ'ƀW bvQZL*Oh!g;t_:,Z~"C(@ Qy|?Z!*W*,>ThId?1XևG y5)lwU:!g}o,tAJ;_1 ZOM}!v{ܶ@Fjn1DW @<"ݵݽ̧֠'ȡQ?F,\RV(eXFx9ZavnD1XHÜdjj[@yZ|or-Gbc޻#va;Et5遗Jvܸɇl؟kǙu)F1YZ\X̵ؔU瘫Q a_ h1MEDcsi jnzoP>1(|AdR' blO$+C:A@dǤ~Y4/%5VlDޗ'z>0;X]`%w.8H=&/tRm 1Ķ~=/UܸiyQ8:/C^~Zl*? 17j0cDQPEew])C=FUQU[41hfBKAyl85LPpʱ%(sM yZa1e֬߼S9~lbQr3R* 1RϯyGa|%y>~mKu%w WͳznIXup6l.3.1=usǘP؋+j|ZH@r\hCp<cq)B2*9׆5ʸDٺDY[ٔn&^|+6ë g]F/M8cdž)~%hXZAqP?TtC/̠v = P)J(y9v"'W^x/U@v ADSq.`eB-WUG%W͝TZU~2 M/q:<= n*[cCiyyG 5$O~j5@h V-Kφs\ }A_Kbٶ0h>ڳWL4Qs1Wn+>n'tnņv"5_uӫ_T~ *BW,htw +l4|Ur[*_9Sn̈s25#E<x~ S/ʭqǎIxXgQŒg QN"Uɦ3P]w.YM˥Ձ-x%Vp|=|@/kWwR%}a0uԶ=krV#f6~v О+`g'ER[I+ ~lQأFƨ5_߉ktMN=lh(%R:_\A2tdC< eGϖPr"$˻54s`"| YEڅS-n6؅{XZv=)y/)~rY..!E+}ׯBCA#P%!h _ [E`ޢcH*i@0 ⣖ȎC TKCx:@mɩFD*koE#&D_ql/==~}E8/G}o>bn 0X8?a,NsTP]kn/:d O6W,:Ľ|S)'.=KUM/-^CGb40  GMu4d3V!q[FO'- =}FPR\hB\ &ۀƣ%TNUp"UrψuϠi*FdQÝO)p?d}PC|Fأx*~eǏQD$@ וa7!KXR1/l`b +<:mZ**#JfWs{CO~e7/@( ^q(\r%j_u*/}(Dj!(a_avPڭb(ɜ-8ί,G4X]=kīQsHq3` o=?q4ٯOP~_uEKPV P peT Z X P:Ay0]Ai9HjEX-hURR^ꢌ'e.X ܹ 촻#]m:hUbFΗ8FN[\Djܼoļ }tHp&g5VFWrPKC.P jA%9 ]G>1B-Zb=[eVn[y6j`n"bMq`YZDJB?)Kn|.Pl?vR4hX˶?dXMuB>hFW/ P 7E,4`Or0ˀ ZǘMG~a0z隨>e\t N~#PM99%q`;LB.rOGK%KڏX}Ք9w@E2]Y)khMx\%(N[5qr?qQdiQBxrWaQ 99X[+#RR#n%Wrb|Ҹ,n% eg6K8"߻-< ^Ҍ8GǨZ+? 0m_tq~"BCUu[OH稦0H96$wq 8e 9Ac4]P* =Z u`u[{ fe%[p PYѳNS6zECiV4*0uq"`lۧ)e1^hDXuǃabp:<5plG1{(~2 ^iؿ;2bpOD n*("6 JUwAN%xZZbm|TCq46VezU] RϏOAV@W@WK^Pxq`ENXfI #-pÌwQ×1N\6}a2Ļ$l\ttyGk{ /`V/|U^T[ eaA0tX+ޑ3nDA89bE+YW\VJcqsk-B? _phFҍƲB/|j\(M߽.meAPZkA .SXg\QKS'()o˶䩒7ӷb+U7!@0p8 ExC c?iT.s+ t |5WnOb1!6\ĜG/z6e2EpN,.o7͌MpK[s: _2Z(*6]DP TUt L ҥSo:> (>o]Q[LvSfTؚ ˞I =fWa61ZT J\Xc 5)|*@w8.l }L;\GWC)v5\1\[U 5Fn~c@4ƃ̏E<¼.-z׃z#ؼhqEkL:6<}TSK0SGi#!p+&=BM" o\_F^+uZBpFCnac. *Q%LTeM_4y!rZ,r+Y88u悸R^  ܰMn+зqkC0QR$הE@ڈ (!PT/YEƵNupHdIGE`4^{C̭,X{!iڈ/zĬo2y^ PvG)K0M\]_Ouo-8לj"sSC9j3)iuweFǨ9&pW!5,eJeᤷ# Ջ6&HkP椼 ^e{4H$}y.aŵjQA9`*fmD`/*0.JS ڑ +0ݡ+ǍE$s(ҵCe SqVQ7M6: _Y9s/S BBر=ōh%#ӉN~~մ<'N72̨tܾ).8@TY.$ `]w0в`wCIW`֢M 0 /(('sBa!c8 W"1H]Jh$D/ 'OPT5>hZB?ZŽ}з]oƕTjQ !]+ac֊/|b#/_kz_HkEO)0bЎĴR23K,6C$PE%rE-qa9A)sT6K@5k߾fD wjj5YWe͹bfyeΔqxŅhJxk}:6 :^f>U_Qn;߈ i.ԿH"K @h*]dO fg@W̃ 8Au4ە7^p*Sϣ>y]̤K-ŗ2ZbEp :mSfoeKŠ[(~;(V@|%jE*McV ƨ.a!Hn[qկ cVJ޹{%Rc+_hh3brc'w() mj^=s>9u-fBӐ-![}hA]0Auw#8X y؋-)*"j͛pȦHE8C6(LQԴ⣈z Rl6 iNE)[`rٱd!|@*UB`)F4.x!L-8෉<DT /"R%ԼS!tcn6 7o%v=W>b6Wv:_T\2h%@o ^g2j{L.Tlk] 8^x [XTQU-y*L|`Hȯc>D^cOW'{oKN&r;D<`8`֞QP-|F"%k7Em 61n`MhŽ}\KrŔiU7 )J0eC[dR?2= â5P"qpjSlGZ,nÄONo_xtug> f#¥jU%Q[]q )VlKv _2^ /`0P5ջ,7Z*NU]G4B, O%үZ+k}v`j]%Cv0 -gډ\ _ƭcۈ4-eKZ&Bq`UV1!ȿ0L̮,U,#a,əW$HDMy#{px S(~f@ShE 33 / hZ;>eKH6" \oVy7cyljE7--3Au|ATCq~'z[*/A(0C|9ۯ -GJtw@NoS\0[%1^(Sdž,|-6l JMGSحEcaY~A²aI:P (C^B-xY3 ؚ7);ԣ#iFcHܾZG`*L7vR.Gd^B)"`!nYAO-"_6pLF0vآp;[Bf@WF̍3{LPnu[kx8 M懰Րwk5YuR0[ 0<x~hZT׎c sVՎ oA ^[zrޞ W++6)GCo ;|% |@08S}v `2ԯZ}|J"sz2žauܠD/וkVnk:/jR) &)>a ,G?s kK.! C:Hax>(V^p 22PЏ:~co ^\ݜ1W7׈))S2fD38oW̻hk*(3l^`V+/PwxCuaJ>FTXN^׮^}K:jCmPȤ)B6^ J+cZO"R+ Uڐ/a8V|(L1!`ώa5R'︥ΑgUJ;R' £,׸j{Z9)+G`ǸŲNb_ \[sӸ@w7E" \Rm CgR֯.>^(h "SCGɍGl1/5,ܵ\JGH0dl5K >S@*WqhڡIXñ@uAX8g-dX ^/loB (8\_q~x(Ԡou@ _``) );\;xX8曭ЈNYWAV]搮S*Y ]t#̦:O LŢٛ_j)`2 ʿQBʇzK)OCw:FM,*VaWcu;GB4pR Wo TU@=D4A{11]t~4߲ )f0_3W_"' SYE @L9Lq4 C&,!u9(&Y>~gbĎ&ψ b:?U)!y<n\Vdv"(rA@o`/G8"M$$QYBYpA2RkoK<ˑllMk9SxB2h q& ([s0 (`,4 {MECӪ@ Rp9_I]\RΜ%pH%܅2kWp*4 l,QQP檡wXZ^2 GU)G2g7ܬ F*Dx?<|Z`A]Q;ĥ!]ф2Rb'3=7HeT۱ke_ mK5K 0b|iB]|7X,NJ+WQM>aek]k(JP6 )ہӕX;mTi2Qc%5R9E]UJ:_UPRЭqq{z"|w@p}(h=5b8#Ac!hP仦 egEF!iiCxLL{7uN$y@#,0)|^YeZm5Pt0`/N%hSF__e:W9 T&ʙK|-GqޅߋM%~|O7QTs%CEUvE]IIsxȥlS|3+B6aYRօ8snu(b4\;bTCPx w̠GZ<(u*xRVq '*dFԾƑ%K@a\czWDbur´h_/p F4<@݅8r DjJPz>+ZZ DoY`d !5+]^٘G487P6xY)9^AP]z{B Žv\kSjic \ 4i]n-u/ 4Z@QnR8? Ķ_\iz lWv^# LP4r(([Zߴ9Wmwjx4|7FKi*&r釤 b< Ԯi0tEKP @~;2SVv>jXţ).ۿc;T}DpUcβm38w?3UgQ:QC٨Mo0UVm` 1[gUM /T7 LSdl~:1t;2ƥ iSS-DpALW%k~! +T<"UXHr/%[hpc&}J @R2̨xs9z8|fR& o])W7Ī 0Kek7IGuky y]ACYU #dc!P9r(?Q 7\ |E+-S,HkǨFaE*'1B5cvCWPd)޿gEG%WuoTTzd|3W/1FV rpLn) [03q&%\c Ӎ.]kT&/0 >8VĻ^wŰS9ϲWt׍!A3g1k*)`8ߛڇ(*0u|G!\]LL@cUax|G n ֹE{!N{Mޑ,:U@R"?iX嬠iRjZ@Q#G\Z-Oy !aʻ;{մ"]ٲ RD`Ŗ NAЃ[#Jמ_1PP.lX!ՁP^?dRFY&mwM87P˅.p^:^F:iF2wXa^%(.=S_0RuTtGK+G+)/H6. @XSz-; Cn2`x,^:nBU 9J9uM3=KWy)A%۩iF);cf ."h[ض-DW Knl?p5W[*䕎K6zf8"KȺԫZWRJc5ki ј҇Q=|aA~~ZcF8,n[_ET@hy/ocEa[0 )oyMϹH;sQ`w-e{6&OJ}DU]ŲeCcbͫa5ǹp% PMSePX I0iR~y!E(?V) &h?2h +Q$ |F*Y zξAՄ[0@# Zb9&g{Y(32^.w,kXlF[nF~%ᑞw Y ܺ Wk+g3"6!nF}'-X_m3Q=7,x˫gHՐ4c&BVO5gO)lcdpO; *[ rzmW",G RX5 LSfZPm,pl6'/,^en\_LdnoPSip y@ /J 3uF*ă*.âm N Њs̩~@/}zVa㋈nWXUdiJJPrjk7l jT{;8v9 kl cFȆ+r|7xVEhᎢm+06澯PEn,G@L*K*ҢM f: h9ul*qhW[`>H*úz8qU վ5H'a0VtD3EcQ k%ħ$ia昆l}gqx9+Wrsw'T|Bl.~s%߉D ?`|L BuUd4/@zK܅^CЁݟ<0e7-crUC-Q8"T]FZEPpry)Q(y[< <: qn&X5=NTXs\ޡk`r#\%u/5&~%h|D&`R&/BwCΛ='YR@5m,vAAAطxh` tEXf9R$__Tl8YRjzrl (>}c-hUO";ƜeaQuo~8+9kt:1@mW6J()[\MƿJ]D7`yE%=J4l,UA3ϘN|gP\)?)>^NC-'!|-`Q })B\RlSCq $9=6h) #`)nBKVl0C`H )3RX˶*k|?bAtn/ǩbۘri}4K⇤?{VkRC_MpX*ajATRkj0]cs #C}yiT>Z1YyA9ثiĪ\}L'~aシ hgE݅^"N)Wܨ 8eev`@ZW9+>lݖǨr6l;o)E9 o 9`sHD8ljcE;qT-|U?d{Qo@9P}4KkK" yx_Pce .)C~#t[pN#mJ9ڸ"$^ʓhJ [ dȮKo ]}B!im:/ќGW-eF(pzX^7bB,mb͋lo͢uF|@RD*4Ġ$lZE=~^!XWSB ̃9g>g>w)c[K.)> E[~էC`7BzҰE~ 115KO %Sb^k)FvX@^G2H622 eNWu7mE * Pxꁛ)יhXiTFy:ķ C1P$Nz Ac9ӡꠕ-NR$pbfyX7uҹjtD^(ֶJA\_ros(G" \^$lVrZ|\DOC\~&oup<ߘ+KQuL . vjAdLC Qܥ|@1 ^5r^/ycoe@ێVJoESjlU!ִ2IXD_V,H[+ xQG`\ "$]`4bJ:rԧ*[KK-}/eHQU]MȦᙊPA]>]1Z%yxzm/;{(*3K )d߈R>#hHb^ߘ+Y'(@1jۭ5Ot? 8 Wk}jwP([)-Uj 2cvyTh%.bxv-v04m|{*_hJK)҅NcĀgk.OPӖf54*Z['ncWTZ٤^ž8Iw^oXږx%/BZTX> {iZ Z *}UE~~N!s_Qz?!?NRmo+P)^[XU{A~Ƞ *G28_%Uc^!~Qlr ~r3eCPUP˯r;#@O?ګe9r *)-0iW*+ 6F^!h,[]K$VKS_/V(PI/v\P P/mr* ڪ" m|_p*Yl94@ 9D1/D吳Y1΍ m]0 TFࡌ(1ǟP.ŮJuoŁHfAGu>fma0?jfoܾ{HvA+YPQ+7.qFGuN>j=0ԁ;4 D * Fʗo(!g`e0*smBM %CEN{/kPm~ l'?PkPVa>#ˆ;rl8+:4?1;r]MeT m)hB[ L (Qqޝ.#fTK} Ȏ3T]nuqA"cfW2EUL/ixkwE/0!sz >/-:'^`/ zȔ|Xaq!;s&a5v$V(WmggVD6jʣS/#*v#]=?5|[̬]``:!N DGlGڮA4Kq׈17ju ogicϸQcFY=Y~lF1UYxdAR߸+jrPhkQ4GeJ a1 ']{:.55) ^d0@\AN«y?qޛo$acpP"V3Qc 5RXK}TګbfioP[e˫PnU[*#~#HuRjN*W_4}"\Ss8X. K6PKۗ b:ר+ h ӃJuPzV(OSP]VNF18+ _iH *L=c LuISy矘l֔{ b3.ᡡ yXGW5z' d+)1!^1aZ ߇X,Q’DT; ϩf%-q8\`7 ulZ@Lmoe w.Z= c  >2/1Dݸ\g7rZ 'qjh_nVQHe8>|G)W?REˇ>"S/㈤#A\9=B@9h3RsU$ڊW@|ԲIC:4qKU, lKk=rPo!_z{O1 =Ĵˆ FD]#H1^X%y`9+Qb"\ 4P[yzi{@p(1Q]o'8T5pP pКN( {H|߉@{YD}*8ܢ%,$^f6@,F8*'KVQh<{.9x#J33%uW)Ո x#sbp~"Tu]ǘ+{O]F13@uʖ=ˊ8bJR{6<-KklU87Eu" 񲇓K k3N爬ڋdWQ4JF$@>%USwET@E m<``-YWD:^|<~lnkK_L[mw\ƃnJޢ;ye⺆d>'i+ONy鞓3P. .R6r=ŏTq.#}_ܥ's-:Z G9O:OQv9h%f*w q+pQl aS\U S !X|CjP:45QЦ@|bTF;>EozT,=ͯRy2/[ 9]@<\pŒBjgݵrS}G S)f0D~FzBDu~~1H¯y:> yqIX娃^w nWs\7IJ<K-q2/H4b׃]W\>J<_? @TLJG1<1!T(߶Vm9}rLf0h 7?Mq!5M]lSn9"h\TD)pSmG;o"#sz`b=b{59%(EyvwI {6:'0{%LK[xfj S!,r#Jr7i~]WNs 4vc+92/vqMJwioP??h>v+ ֤Bie&`Lr f@oX J] ĭ"U(Iz |R88j)Ze1p[u*+ɐuV_k .`D-h"56Zǩ}tNWr:e@ye|βpB:;J*ު@̄-_9U?2Corۘlkx^XzCR(v{CnX0<~>bh*&wBB"/6ʿ‡hwK ꘀ{TT,FeUm_c502t݋ 5򤼻*rA( GVl ɘK>2*Dj* t;&ЅQW@ aaM<ʚ xEGV"Ñp>9[M4/[,koȞkwe`?1ZQaE  ?\sȦµ(ت!QQ%t)%X SWbzM$5fхAr,EǸVq/b*O7 yVGԸ/%"SVmZC Eg>h;HI‰\ꃯQg)J۞`ؔg5bAfzL|"N,KĜ]zc wxP:9hntJF,+s.X@̯i0-BוUՖt7ukN%(>e.mAMң[9e xrEʍp>]@[eVѫZe?`="Mcuk[칠bŨgaGgpBXn?m g0Q;Oq(-a&0J 1N5mPӼ.Lg?EgqN56>iQSxChC}D .s]V2ӕV ܡ< ˀvn _+@-di%1;2(& W ŲY{l )89#fF+DZKV `[|wWB]dWmxfv(5 O)J*PZaZשc5;bn[-9w%zqwZúj*` #(p!GB N努R߈ʘp Zy+7+we)@Knf@=KZl~2BWopF5)rZCĪKQ_q ~ [p䖽RƨaS!~Ghr[|E'+Z 1Cu_-^$P!~!Qa-]vJ"V0dT<|{&oբ'ܬoQVBy8aHRjh-=y%z!uPh$[r a`<+"Y\8c>UQPP¢tVU 9->A\ OQ7 U v,(|K/JR=sprW/&/OE,@ AsmRж(->IvrFER 5MpT6?h~etP,( D9G^{4X!,r#w x_Q%g%ma9kØ -EPBu xX: 7P|D\jfa~'uq[rDŽghŁh,Y% !MO\aaEXcy(.CMfݬ Լj2dVN n-g *8`Gט$Rn2^ʦJLW"8{gtBZ /NT0/G<BOkb2,"Ac ]!Q΂!v6#MxL:b|(3 f;dMDܻvDUuaG[ \K`GtIxDįa4)Z i؎BQ^w i,+\Aj[/<ٕxC.F7Dl[!W 8`FDw.oY]r=y@zyuľ<6K &wL:q]#,.\RV_@?o0F9 5d/\uWFE(,A3Ly*9wp4t*s5fQ/EpUOWAc`P{4hM5pFp`g}dWlfуWE'#ݲ|g/QL6:ISnx  پ |+i*SO^eƭ"*yw[}BNr(WSlj'5RhDMӚ, ,6KB[ܲ%.!E'Es Y:i؀3ȅ<jBqk2I.\ ݭ0PUv!,{9#DE|Y\K݁4-uαSn7PUwuMxZ2WlUR8P\ƯJ )& ge}x&HQE (Fnf]~BO1\X"1|@;{D 2N, Zi/VucSp@VY8`vz%Eܧ|@VTwβ8)'GlK~Q [P*[T|s|D(sd7:ھ_63-sej|oMȦ VFۘ"11{rJ]BՇ|C:2P{:?ed8K\6Z"L[dPr[aP/ӓs"wzB`Z(]rAe8A,o}QhBe>沜QW&N?06Kn=g3);DA`%B%u8&08".ʶK8Y; _b("?_ܯD/HZ/ EydWwdV„ƣh#'0~%ﹶ+G8E<,nTUsQǝ9Do&"LFμgNM/U-bNQϟV y +x&hc( tӤg0;pt#2 lKw bЪzx!2NosH^#{6F^3R^Y۔xw+{XTt6]FʔT U "< !㗸pb\i~bA5fuOq>r䰖-ZQ+T^FBa8Q|MwAfk=B+ܭP*B)T{]U)r01P鉳T>=Y2{*څ%j m)*_7~NފU>s{/- Ζ׈{ar@ݿ s\OcACkM9q r3KzV?Aݣ8̈́v.BX|< nږ 2 =ɑjmcHu\D$y#AUh/O53-k[i̲^| bXc2s[UC 񳜰Rʚ9"[,_17:=j ̾ plDz3i{?\T#6XA< Jtrq;|tw*)o7A+؛#-Ja!*VOXS!<rCC*Wha`q]=T|2)A+V2).\MgpҘvˍWNծ,_R[/y o׉g3r¼P~` +\JUOEQ)"scܲ5mEꜾ.a6ovbھ%xS |R[yjYu<p[ZA^. Q0ZЎN*]2" /:4ӭWu|ѭQLѲ ;+#:.as@?5CIG)[ݜ,"}Eicf?@<=T)uCá^+&|U]w@+E $EVnKӠ >)Fj.K:z9RgGVsF,7u$.WsxQEuR԰(I|Z-id0M_\.y*Yg yl,@o>uj+,]fpzxnZ~|K<ܻ:KSP CN*tť z=n0E&cܾMWP%Q2 oϨVb?+Q\~XV_R0,KaATٞ~iqO0hGq!V:w(Nx 5`ȩ\K <@(q<~!`P-5 &% $ |hn3l y~e`FLx gB] 5o7g}šhj #x L;9 uK#uRQ)rJM:ۋ8(N=uĴ^_P4"H3rD<.Q ⡂ݸ|,遲ŴJ#~M Uu +>-kkjRAG@uhWFd`wX(.R"G\+}P`qJL,KM#D W!xa; bhWe@!Nˇp{K鰩0W(8vK*M/["ҙ %{<)ju5J`EH @0<ĎPnq|@*54(fC*K@[F?s`u/OG514č|L6mq%@fe$MO Tx/̲#+Db _Sрeea JhY.r'ۘ+i2\:* !UN U u򒓣-bn(?t\Trz˭.0EE_;ߠmJ}yWq ;vw~2 ]:x.%r -"+rbɲӇܹ7^0X^:e@,-yqi SWqL--%uи?_Rʹ䖘v ?S@TkPm'<1Uל_... P*jѨ+Q _AmPM4oqΣʭU֞(`#j 뉀!~tgJ@BD˖ϧ ':sYYCFC(U~"ixu;Xy.crj\ skCj)iDB_g 5$? =EC2$D;#UYt"=>gZAoŻM An0Eȹh䞥OMaupjecW:`=@l .GqrLzlDC@ZڎZUJP-;Vs8 Wsxl'=/lv@>Ӳnu,D3Jgp@ǨY o`nG?8R-T6N@D9.҈26-+r)S9oBo˪. Էpp)2*cSߐ)% U*T:Wyˉ>wۯ)lgk@w)Cv%Z>b4(< қ/PO ~UdH*1~J2䧞eJ?wO'H`E@k_5ͬp Jt9TCJ9W z:a Zj[ ~<ceb_^|$$]w;qM#g+on/S0i#tj_`C+U2n*@</by\:~̥JmtJ'_p Nտ%y|HmDtI+ikʥ([rͷ\z!v\ᯘ^-ve'Uf:۷w-Ahr5?oyhuUtʸq'5ֶ+a$! ܲ/4eMyߒu,?Ti~6H)\lTj]JQ 8cSƟQګ!긽@cS##Zq}DQRO@ʖˊVcb[X;{+SC>OԢ&K P9@/K7]J~4@ J0R2W8$LK-wF))ːکE3 Lc|SFN,p h*X\76Ɛ zbZ{bmmQ%q^pSB iDCAws)G vh Q򸤬% ܹ`*`xȖ} aq/j]CcN@сvs`m_5hk g"9g0g xذ?P> V>ʅ(2>Ef)Bx,R6PTVUqہqہ;a(]Q k!#P@(:`~T< #ԃAM] {At3;|^pb%PZAUok}`kXJ1q`XX(E].1)՟OLn0DD/ kǴ@%Z.(7VƊ``Y8u = ە.kyixE;fw;ڬ=HK k0&Კ;J^<|T[Ww{c2'K"!.+>XQB{W/}GKS[r 6N!+ xj0NٸXG^)I!m H2\Zi-y&M\VGGCsy oQbŕ e?øS0WjGK'@uU!VJß0,=3FG⿸UǞ1,KUh`(uB{-,ƛ,b-&~|壘 7z?,f|2 ^7*xKJRྦcDUYOf솊 /w|-OU8 pN߄ik{bƫk& uWȺc,5pӑl7h?L+"++(F ~%=Si4 hQn0u)\ƀ/pnP8_@1I.+T@O#c]zd;/` \(]J/.Ȏc#]_/JZ E}/Ĭ#؀E3 \QR SVCvFj&Oj%q| #Y-V@w KD8 &/!,9.8Jʗfw ё+"< ye$[(9E4AO إƨ73˗ڐ+seV%ͨۀJ`-桐.CKNq#9p[kԋA/u]XKOyeITO̺8h1uV4\bQzKh_ܘ;GXk6( A&WDD|Ta{ckwna#̴ IZ?Qm]x̠ eEqѧp0'f퓜< Z]KIj*AqQ]QV #Gp]=A ]EC[uYTFSkiLjJE_mGvħ94,ہMɛ(" #ѩVQ@+ftVXߖPSrU /RX(!^_ VuPSdZN<˪3 <ĵVƧ@h lPw&p[CDCr^ HMeK%.^%KBD#Qis*IČY˵Ju:i̥*bCTF7l3A@,.6P|%in-`°rޫ<@"TMMƫoz,KiNvMu٤"ǨMdKwA*'\ q/jvpʗ zDŽWΔwmat#dз\ r,Qï+F_QJ73As)j[Ĭ- %.7~".nU<,Q_3b]rPL==Z/%#pQKTsnitBq/c~Xȡ k9`(K]w>~.%n.}T)-X& nC{b=zՅbZ2鬖S5E}J U}NF6(Zkr p# T:y&tr,@7(0d5Q.]N6*XzQQpYk. ( eU7l;nnF qVnj`mGJyK7ka )z~g)nڪ{qHr6tz#T҅heS{]61СʴԤ4V.AƔZ =_Gyr}׸:¼ʂ!ŧ#&+~aCjd ئE_GkFUS(V\T}M3K.$0;@hm6+<=|͐ 6Xkteɣgo4o=ʄzRR5hG1,3|R [N%Exeyݐ8@7A(U]]fOR`jQkHN̥pz8bII_/RɻRU9׈Re&K Eh5܆`;z&VQMyc,۔]r8Z u5N֥Q'fD'Udp`!UTC5Y还+J` g^Y-&'BNTaj]Ad= =U*K*px`W" aD;q ;_ $ZG喁\1`x#y Äܱ!Unz6Kmɨn"XmmR(&P%Phn"PiN෦>9LGmەIrf/T _3JN.H st[4)N ^ɖfj]LBΫ]rsDX%-.S~OD}B(xWDnTD䀯OՀj岆·), ;`MM/*B{C ňH *r<%sOscl!,4(T_U~ONEEޏD+ v_|7- 6#lWu!$)? Cӄ0qdq ռ KbQJuD%XпjZz< v!4\d q0B5>mZx} JTzȳ IAmwdGD_6cUF҉`p*^h  vn [ aJQME ͕Qq7SeƬ}R/P4tNݕYQ3$e\50Nw(9Z63<+N-L*\-ZcpVUWap[0.{ϨZ)`OCPrP״#c `cd:ZoEbcPwMT. iEVe_5/.&ΞS7* u(3 f" .^̓i"MBE{Qo&K ~ 2tx/P@ K U/HpK+D+>Oke:,Z9p@]=ǰkz {%`P;.e?ߨbDT1b#bCJ?RAVCb8ZJC"oo^JDk6ؿW̰ K~75/@5a-4{}q73 s x[78:xĴO r8BZ3aFXW jTN"`$@Y3μDɉfGrR8.t !kD{3Y!]&MWPܣ\\ŜY8ì"Gs%WDF)*kfKy ^E*([h(WM? P R+Սvʝ41eJV J*EaO0U <jL9NZw V G գfc!i5@8EJէ-mdF1Q@6R#1(rYDf[S̸ _$]Q.00uK,&[-GvBa%nN̗/rZ )QWrWbqpM0Pv(s q^ڒ\z*;.O&_3Q=,3ػe_ϖRW$Bx]92pxC4!^sj| nZT/ıKmlCE1T \u 惿: ʽTWwnBp:ao; )!WFeU0DՖOԴvTW,ZH03 _j$643 B"h#L)lb!Z%m1b{{**c:Am%7WXۯ,.*T!Ў)HB.;agLCiGxM,5!S'{(3n߄àڍ>^*" ~ֈzs^ Nxhhu)EzهF4 58vg)>{瘳7y`Z# V/2%v)B< PY^P8J&.Ъ' m^Y皍%a(1mk0hs48 @vSl MR.`ZizHfꇐYfʹؓi`zȵv>zN$!Ԯinb*ˀXQ?p2J PB8e==ʪ at)ȍ~+QK :AZ qJ>Cgtؕ $[^GǩŚyL SWYi4WBLhZ+H#זPiKnSNvΥ6%h0N " 딮K'ABS}D_;GĠeA\:& (bpڇ9`gDy!۳y טW&Wab I#RDz<»v!@nDMüUclQFIez[g ^Yqg]-)?A=LM!+*|-Dt%Yse]Gc:j5헀~aj;R<F1'=Um!PReFaV{ 6W  Nxe19wRTq+MSHr]Cd*V>`yrpàP_5L.[mSKyFX%G{ PJ??mi@GBҨNCJsqE+hR' ZyrʋLڞZ ^ZQ`<]P茴D[0WXvO,T/2"mg9o,_(p6^dU.4 @U.-ze;r\y!:+4DԳ~b[{y*It|T`h XF@F=_n=I4RQXϵQKq:M%jqbYzc=`me(]1:J8l֤5 s(L*76pաܱsMri:U5cfl=Ux"I}+#`}ߔ#*U!ԥJkuc$)\q 'h.BMY zh*AX!U?zZ!JmyM z̩?nFq.%gO qbcp!>']ܨ`12nVKFb6~ s4`qXKb|DG6vBہ@iPj1yeq/Y"{J+gabu- ::9Ey|I,o&:2ZsoUרp%:8aWpqɬ~l%X,|EBw*QV2 (/`bh ߘ< !IRŒ 4X"h䄋̴Ǣ (W0%G{4mFfHu+9—+ G'^ u鼌BX'-SQ]K#%pRe @wjAZxTvu4oѨǨ,$1ˈXK ~ů4걗x_ n]<4`vY̼PP./Vst 9#2+/3k#R\۩eY$^i12ĊSS95޼ +kYJ ֫:.vtfYQQu8x/`\r۷JJ+kn 5[=佌c8oiwcԧ` t0s{L4:N"|(cYȗ-Z{g]E4XRP/2)`Rl UE5u2~QZt6%21Dz`Te1zYb149l-%b~rZEZxrdSO\z<2mA[;HuX(FةGY [r#kye5jsp<68`N_: (tu@3E×+kYU@nW'!;[ʠ ^ GaK_W V-Pl(8eߢ?~bt5i[̢ {5Mvx ~cR5kޟ[͖@A\=ؘxqEg[bUbN!ɪE?Y Njy`虢 єFj2 Zwj1 -6*ZE`9zW^%+pw|3z^?PG oԜ/ cTSB$X+\2ËbU/^ح1:KK8y4_ߐ8G>N#(zfR%WIď+r%@*Z+ j&S {<(8▢^yLQrnh5Q՝/$Ų}e\l͊ *ʻEPYy#B5;<Þ!eIR7Z)11i Q[mh*r=TU2=0\}*ImKe]J|;d:߉\ʽ0/d#)Bp+p6c\JmT@GQnrК;ݘzGg'/8gwiR\qL@C@~1FQRmqu %z̸똎Ht @m C)Օ)m- aNXJO ܷ=o N{7l.ͅ(L)6z KՔ#yK^}EIԪĵ*WיF]/l!iD/!{k.ex.PBiU&힥pȅ#^iXmֈ-5Q}KBp楢g cM:د;&Cк˶+# m8]:Xzד W:gYqK_2oJgQQ{(X|FZ[+5b_TzSQP386W\za+9@P7/k3ÃAZRS'W SKAed$Q="Y\RGKrvK݈j-yh@U^!XpT+2(Z _K ꯈb(ׂtk P؉H$+yGWSBt]p dkCK>cj[M_;γ̸ y-k2b !6+E:bu(7$1^{"+:WhWs5)beve(aI&$c{4UF[qy7pOGZ 91&HY(]E-XBs9E2x\ޏQBnLD9ɂc^6qv6>X^=EVܦ>bcPE]]gbè(#rJpxzVfM:m- FVPԶ˕88N`JĥSc*-?AN upcؙ}Fe8EWsV9 ɿXUXCeSr9%㇊\xbcuF_Y FVe6\i l3OaVE ?Bͻ%eqpT֮fPRdhBw MX$Zx` e0TJ[Ut TP/T_^!mc)VN]sטb 'ylen׸cXx*.Q J?Ǩ٧1K]llg]\ $̾QIj\\Ry@h \,I;~t:v"sVb%">63)rLcW{bf8gg*:IGLpu} ªsĠ:%Y-&\K[٠YcVUc:ЧEFu]V$Qm5e8ϋ1\Q 76la5lfPl"Vt.° R`VJ1UQZS-؛V1qx#X%걪}WXJ7XQq)cIixvE,O3Bݓx(} w n~b[6yfDᖛ$*G BouMD[J)/ >'F 8T_uȡDpJ#,/Yy,&bzX!(zM+H{nHZm]CヶωiU+`>`wF@仹kg&Zy)a\ܸ+`;v9|J?XO+_̢96k\yo(j|Jd: n>%-FwX*oPW^8k0&ɮy.\4 q0U/^r'cMl`.{ GGG@CBjÀ֊k [P!זdO0ߕ! +/Vtx&>%k<ǘ7sicyiP*14KRn|Cχġ)y eeUg@ψj8w[\AuH* ^M({@!hkGRu8_0s=ڞ28h CEX$O3 x x5B~UfD0Ig_gO!Xr8C7QCtkQC8a ֙ԻQUb/8 pž-&{mMW\pc(2R_.,Ҋ}$vkg IQdr 蠦V7Ɂ722uPA}@ G*rŋt7,dU81I"6lw#ӼjZd;xs`da,JF=u9K+[βUY.UM賨XcWjp̠B9ӴF ˆ /^a7d[899I*R1(Bit8(Tp[VvFEz09*Sk$Pv~[ 9TЬ!͛}K 1-kp".BL6.y*F`rQZj:WbPr ){U473cDN,cp*b&c7bV|]l,%iSBV~#w-B)b"jKhrG #oǙ<"ھzx UÛ@ %P9J5٢Q-\N-Do,1PLwSvL##U03EDP a@ ۩uU*(RK,r<}@X0 !FȾ!Sಃd)o^KEL*"2 a%WgiZ|mI,,8U< РGJpojK. RmODD f%٩G(@"@BDW 0l ø^e`X 6?pR @]v:_ࢄg}n5eE1P2W^YkV .5İ K".7*OrK}Xd-?pj",RJKp/zWDèU_5?_DeWht^unU]liTVU:{XAtݪXYZo9h,Qx;k9/s)RR-6]*yj\pSq p嶭٥F M9egb Ǩ1zOUۀ U!RRi9RyNzՌIjNR9TuUVI] [x6O0噥ж~LoFj^)Hޥ:ᯙbn7+@ @PfYy,vJJK8bQؐaWw u |cĻ0^,P:q] _]oJ9;=ܦ+|Jn%`:qpoo2po.o>"46gsn3Ey[4<)N_IJ߉Ag\lxPRK`P:Sw+랻DIeaUωV.㱼jpCQx\T 'zJ{ >\5rwW$ng-!p2a SRH1+u px)AXKr7*;_p Z5xxlLxMz zAlDdC'ڜG !y"pd!nXVC{cG U\W\8D"S*rg )}3Ay''\V73jQ5:V$ BlI2<Q%X NZ!TQW~Ug$WH'*,`G; @)~^xX́6i85-b^_ i:1]~Kr !)8%#52>?Jy',akt(c@m3s w)oBWi<}jXP ]䌒)jʠf[{ FuSe?WAG0f{m0zh<:d EpǢR9GxY+WA!#^jRMKኀL=quHBp&,ri|SPn\u(@GsQU`r %ĺv򘦎J:> Dl0Z= yYtS0`]T"j$,T!VAp\Hqr> Ajר8Y n˺W2ˠ*4"Lnև ,(4s=EU,Ҵ;XyqTXwh(-cLl^"uap*AaevnmFŸѼ7HֲsR{XVuMMÎiح6ӇR/!|6P8wsX^ٔYvsܶ6ZRT{ uMKPpQ E*_j AmTGBnP* /e7_`Uïe|ʄ1薛-[10姈Dv& V+pf,1U߱epѣW񁺈 |AMUֱEiޕy͂9⡱< *in2s0JFXN Q@#!K`%`8m*wCoB(<\Edyip7+)bO kZ徦lŮT;Al:E-T ʋn_#-hQոIlZWsYx [ZlbaH%BhBF,[pjEi'r,oT5ϐoi1hA/a$΀jᬆQEUmJKs1]T] WfT% C,- sӕ2bPeްrr[Mؼ{HrPg,{+RM4RKU4/ܠ8=|cu' oX`qz#qFb&S6*/eNSvMJ@y!RZb0 4LxaU'C3[{HY6$)sb]^qIw*"-y)o65wƯtqŧdbv 0C _iؑ5' fZ|nҷ _+ reRu*zuDkL`CUΖrqkA_"𹲟0^@7+q3({K%αق2Fo㟘T.âfy"_)al4 SEQ|^`$s2jeiö0%FM_8W_/;kj^ ,/ U{bLP< cjYP|MI}4q YXEgZ5[ #牁q4MxG$(*bݰrCG;XcCP7 %i`v[FSb1Niou+:蝔glAdJ *]Bs K5eˑ8fNM0+8 4W*r{ǿPwP< Ȱd?nL 2?1|x;m59N;k yR?!x*N !ip4R$%iK4(OAR)L^n=o5͞r"ٍ+maߖqjIC9յ%;/'OJR:K&¢?EIXb}n~{ [^h:hXWAKK6:ٍ_{)HKEC<fFt "U4:}1Mp@ESa ]4^ߨQ|O@}Cz+| d1=Taī-j2[Ri#'+htCLm21\2U\uɕ  Av)2J*i&s*.U {u ndHI41z1G 9G Daۈa@? v._>.)U9MwqG§'gC,yw': !V|+;`Kx+#+o/1Vqv{Fq%w|Z* WgvGTH9e}#~ (91ee̪5DJ YĨK̓NMem]lF%DlLjf@mSJ/-W-*OC}(;N"yMКTՀ*ـ% NvC}tR@˞cT.^O^5,D!4V͏QZ]dX whq6kZ/"9ⱶ"PҴ &JSowꮯ*F/ $셎і]P`۬n+sj*#Sz}̪/n莑X=DZ/8jq>8y- * 4.0q˴l@Fuw.HAWVRA^,1.|C^+ܽ . x]6 t[D:*0b+HxP`7t˷ ^sQi>F=F $+QVE͕Lh-$Nx.6^ @K<-$y>԰.bJPo T>30W)JbKw~[`\~ 0-qE]{<ê[ \@v99v^'s3uþnY618ͯ2NA"}2В x"Bt 0x80bg~W$-g[FPoSb5cw׈%\}M [s-Wqmo}\<”.7.bW1\zpw7{U1Ǜ(9aۆ^[Q1@q*"'>Ur2*\AlOdYRِ@_P8?p(,E*̰( EY޾ImsPJ"הNL[FP6z`EXNnTվ.ztAcfux2 tM̹qD؀i苬J>۔voKo-T|i/pm ^[uGs,Ⱦa ,pGkMvӢ;ʗ{ NW8:YB|̤/GHFyrƲGzg]| V&9GѠv`)EQiN_Lj3vęN|^l/ `zB%+9ORl#a7񫱄%V=~P|\K_-)(v}ZWwM#/\Ӓ.U4ހ~!TxaV Y8~P PZ^J2\%1 Q> [6%'vE l_w!vF+,ȁ\5u:5cb`+As2!jr1O/o !UC )ƣDִ#߸>/b/] @ R/\RmvN7[(Id zS+HS4:C *v! +T\;\q-.-%0@uM#1T 5OƐ qݥ G\aֶzaJ-wS;GVC`չt_*\әKʂlFF1.<ϟ]K ax8JlkƻVqxXlyˁ*/RGH e|4ͮ W]nP*ǨfÑ|M/S @: |K,S. \B(G<emxjZ5TwScQYlDSg>!@@"[ V'Aigc Z]Fp0B /Ĉ* ~bR;)b++ yK5w@ ֪QPk2md0мŸ9.'0z\85^ 8/G;qg C2<.8q|_̭_ P6l[u)2-icR-S *rF'9ɵ0 ;!p$VJȢĮ [:[W0 ӘEBn 6̀h3U]AuG,WNai06wi^UlWxK!Ԧ(@(J B*\Dm>q܇ NH P9qJXy2хa_]M@ ^=ya hcVyNEUwP\"mUasq;n-/EԫZWԢj띊ӈU;pmf{D+Uuz irkEjQBlFqBq.eU98jSDiZr-Y d h!5<ӲDtwBq {W- ‹X>h+EXr@H]3`$XQZa]FR\%<ʳ^?Q7r]V:xɲMNMPy`!Jr(e]BA5X,{J ]RR "(igu )4w;T[muHs.56Q^"roL 4#Xߙ io :r%Ĉm_.⟺'y_%E)m7+P^1|Uyb*ЦʘvCP!K4qTbqYG\8xrgV TP$7ivj a^76/Rl@{fb+W @HPrFVSOYGO2aTat`U+HTƪJkS "47w:J"Gp)VBAs.vAU y5-]JL!kP>]ȩ]?RA(K|7S>v+pF@`Al@WQPmy7siDV.$cu1PUh\f[GW6/X<8JXe!?jEiKD}7b`j,lzՑqY['(@yAvliNd_0^O[Z.\po)[O~R`r~uR0 rzYF.G9#u},Q0-Z7h뺺?yBmĒliϒ%i9N탈9V#1z[ĞIFuX}#PGeJӭb*. (AQD_uQ6(| Լ]Wq" =,Tv) bO3aűH4|@񂐷6]l,,w ͳ6Fl9%x $ c#T_W-X=1J=@P/Lb^CM>6K!6;D'6´`p7_[{}L53K_RtTg`)YtF@{UaAy*k/м$i/+i-ZPyP=.4XːДg>eג'yK#bA"iI!;Md/+9цR~ DA6q}/lqGrVQo,BDI)vW0Ѯc\C A{}۶ rx<1^^EwTҩ4Npx! QKZP;+#d3tG3`P7eهa(OT^It|*B]CD[f_M)^AEJvG>Ա\vKUF+Q`׈tGq*'$Lb%Cˢ |Ŝe?lFuiˍo.ZkcsnASH(?DKwቛuKPJuJjPI = ٬EȜ6>y  A5IFh3:0BK-e E8g%P"4ƗuDeZI gԻX՞"(b*w*wb4cҬ91 &+djR[5%a۳ib?txkU F6!Ak9Ɏ%J#yW|z7nT^Y=)yuJݛ^`hXT"Ge(R ҭ|^eyF<0m7 spڎ`[a}B %ŁHt PQ*`z*:dX]TP p˗pyIMQP CG`* Gli%><=1 6 o71>h @9a(KMlb%<E?{i!gí|ks}yE考\@$K1X>*6rTUD4IP/=GX9k*OYLqdRxq1aW D=KmD t[<1?l2轑y0Q̏%s8yN\X 8oT'[Ui JO[ r|doT-ϒcoOy*ų EaYT+԰p򀿈Z :|A 6aP]u)mĤS>'el6Ng8e ׉CKgd^{ךo4Wo7#`,ŵ߸y}k~[&.*P CMp8٬M(-^CF7(7ڻj> Sc{(V"ufT5B-Rpn:U|#]@(\ᄠj:bǖk>v`^bP}(z$GZF Ȫ|(KVs6%UT:%V= }C:":tDQH%/E/uj\VSiS!^i%,]EU)zJܫQC31r,)/ĹZI_6E?2* U %^oK7W9kk!0V%1 j|X,\'HZ|.lt58NpxN"!RrtEOIqA~x%eN5q_=LC* w,Zb)_P/$dQxhGSE}GahEvFkPv%9Iqak qKqʖrW&;2g8s)88V1u(n3p° ᤽U:IL uT梼 O; 6Эy"Z*Dr-@Ӌt]/R09i@|@lw9.47(xo1 <5W`j"7Ξr^.-]̖ij#lw[]!~Jˀ4g QQ ,q *ժ}| ߴ_@췳Gj( JQ*eJ$[U0Tu0[%Z1Q %kG)Sեy]u.~erLǖ'D.&^ cԶ5uwIJ=m#$|Rqu<م;l%;K I+|F1FqP*{QG(ps̡Ҫ^ocGTG@=DŠbb>Wc-oh@)㸺fе"('#вrK ZH^9ɤ9W56 'c1*w!q$DS6ΥGnжyW]y. Pc 6LPBFo9PBn%p^uH` GOiED oC0yWqݿCȕ W@\1S[A;X`[P dU#]K7$eW=L/pei[C^l q޻]LA{(ZN␴klj+7hxOF8?Ģַ9OP@!$tEN`.oibvrXA\ Oj6oeb(E^6S³ERr} WK)Zԍ. /ec)p1V؎}"(r{U<ʤYq)JTu,S|0GJ*c%9uw!xmx];fa%{iF<BK*pRw .J_Ǚn[OQ U@#+X\HB(#P >c\ͫb Eu@Jm>@6 ()U?ޣfz|Ƅ:o;ɘ 芥@v",ܧ ]8=w*4WQ̘  co<]]ܮ+pR^AX˰KPckWf(8%H8{inhuu݁Uq*y6СV).)/wmʍ ;d`j >:xW1't@s`vQZD!2eOz8]zP6e.P*V@MPDTa5^` gKMAx2 >:sE/7͕]ܲ.%c|0 ĴӬ)>4cہk7i([G)罘,Bp5weCˉJ #jMw+<+H18v7iH+c+{N&ahsAr k5Nĕ B'QRD1VpM'Io`yP"(q.^|JӆF}G ]Χ jq{PFxj$%{5}@@fPhق,i}C>`!Ca;.mhD+j7Vg{EҴ@ÃB?s::FRfՐVujB`nVW.w4)G\h26ʗ_Ԧ{I,W *J%W%oszQĺ ҉GpÜ-@#:gW#< Z|N5tbS&IsOZC~& O[GE5mkLۃp aH$f\΍q.8wz`6}uU֍s 9PwM |Zuh9I;?< (,4e0E|\P*w$<0kjk6`y;R,AS{&Ҹa n*[@KlQnQƅ:0fN&P5|* xTTf`F0EWQEe0jD=NS[49}K h"8[@:eǨ4Ai˅^ȭ8: EZFͮbÞVlpO\h p~" _T%.h'ǵRwrpG*A)% vPeybv_1 PPu cԷϘHxg$4|ƫpr6-ź_^\eZxH $ժ5i4(r>M_ܨhNE,+v,NN~bW/! C@ '9%Y8͂oavOMNa^pACO޼lS؏?QTe /i-PA#J avpu0a'nUEY]lU^u.*G-g\t6naAP\s񍻌0x(_0x/CJm0}ԩ>ۭ;} K()G,Ry[;( &By3߄&,|@Y}Ya"E1AJZd 'ew䗄9|KǨ?1x.Al~N%69]keDkcVM _]A)k,9gjeG-KʱaIEqrzG,bU@/DjV(!!bt\@ƒBa&@1VRRP|.[ia}MASP [xcma w džazp.-Vl-k5A1<ē]ݩqVFpG[(E7O,T<`ӷ@mQt?q$OBQnG0g};+A[ܼpzإm.e)UMZ0-ض,C Q@s6mM8$κtB"PY Q΅!eR0X%ϘLy:@j̝0͡K52ڝi 8#..esz: lQpA%|muBM'rPHaxhp MìQQ[+WK/HKcj1kp)]UZP9a(⺚`wrIQx;pJTpqόCRɈm.@V=ƤEGJFB6Qa8h@\| `Zl6_mwkj⻝=Vj)}51UW|ƌ rPo!]hWPZm\.QiEW *h$Ij(T>ctܶISk1xޣ"KKt05|"kQZTXyXj!sO0jpmrStzAn% Ѥ:L~doKO x f&`pp4\[ QcVx qT[!Sሹ78,JVQo3eb?QM ae@]sou)+Q6&ۥEpEX @bFQeCZ $V8FšPp|=xc. ǘJ5gw. |\[~Q Ÿqo1Wg' CXn03=0lcG̠ Φ ktbCkX*>^P8wUK@b$%2MUTڹ"|r ;hJ_$$1d<.c*ܵDGk_dȖeߐK7[}^\B]JcKONa`]V 5  <ԾG p =[~:j U]rЊ2CuG&BڊkoM@K=f,Ƹ~2ja W,>%`︪*%˺sՑ/"}Z,n\-͖lgl( m\/;9:nBsYP_uL<΂.\Ǡ8xF(œj6mb;S:\^z%D{<$lAt7,4u0b]^(60B^`8-(* ~"CTZlGE26>bZSlE^AQƿi|Do˧ YeFh՝"􎚏[t^`-⥅kb*6% VNZuYRXHwZZ8gUaAT[,l[UNNiAypDM~ T9DYf( (>x .T)Qx`t^{?>{ΘL̈"QW$V-BH5ձb;i`.j+lfKAljfE _r՛D)Z8k6|2LybvpP*ej.RRċrs|RטݡH,,rmo29ߙeh_<]5vebi02ٺ-BG\Ha仅!?tzye$r(Wp kKmuPx; R1s&w.w6% Ĭtith6 L8J2qV3ĥWy<=@\6.B Vz5륈,fD]אDD?(ΣFp{R4 kV މ-@ zʁuP_E5Ns ]2C*hq:3DyS6+۷:ro[ʦcggԚy F.ekx8A<99<#ER pm>!jP4T*X_JmGiZ[5*TE_^Hb#h*'GSu69RUeM|}y(8 WmIJ1]N9 )zO ^vKtjz p -媛r#H(`Ȩon8 Gq+D&%2< eh}BG42NjrGV/bXMhW`[RXJ;s2wR.} Lp\F .;1B*FJGSiQH A㸪)Y$r(^kiG,pm]B䜅n: 7PձV!S4 @;Zw\*7^ ԥ;J ^d`ⶆˆrHo40 OA9`t v{eoVT/"bFfʹ sllE.wQ.PZS]D | Xg281e`hO1Gɳh:d8 #vC%<|AEsYSkO̾JUK@DLnvN"QqC;ӈT`YTbpxA( ^"+)呠ˆ2[{ӽX1AKa"&dJT +5H`tڋ1LaF+E솰.=i-ghpK `bh+kۨy2Ji8<<O24U۹%,#Lhrt=W1"/XLZL>)`[-\l趇Kţ6g;Ծ*Ҭ`{n$5(BoEC$/9V7X|Įk,BhtYt^J-q*dGJF$ / W[õFp=2ZUˎ̱ z=B O@%FLlVX{KB5<%<}{@ &/w7WE>botl!^pf]*&}\ LR(aPi8]݊`Lt_`{ bPzܹʧZHB}N'TK]1jKpl2L*ӤF?쪧KnKI\erʱs^O3Tw|8k! z]uIgKA1trUwhmjr"(UyԪqb'?Gv l ⣘bWķͪP͋+^.+/A P)hZ'oDt>*TRyZ K˾oJͅ[,Tc.˨#B_HmEmubgvh68Өl51 hk%ԷaKpzIEӤaSs9&#°qX[0 @]19/Jj^22@@oOD";%ofڱ^éd\;(\|,OygKcݘj, NOrht\AӨBLvu"9"o{VpUNs 72)W "85 (z` <1ۭ?VkCuaQTy^_q(8c R2 O0j&BztIYձj1Y48M`O0#XtE-~:ߵ t^ciyRiP.Sak6ljy|8rin%W:i.ap69wo7YXxn"}rfpC;4n[RRZ#먈W|A\X@=F2Cw\3-U~cY-Ъ2%?>eF `*w(֩2N8+[s @|«W-|ow/ 9.!/] Ι_F-AfDM`pK Eoє{N!qa8t5Q62)hB*\(l_ԣ¿v_EhwV+޼x._g;::>4_eŦhs=0q!*T*8Cy|BAĨ=GCn/v }`[Jq*а,kceYYRuy_1.?oFU_1/I^*8EA/')fn7% nw`Yo2  A9 n$K6qpf0Z.)GÖJC*t\DRTZ(_GsFQSLji5*$$'(^Qg ^bZݕSAuZGiFA*< jRҒZfe¶:bײiqzV/鈅mIe>_,]HF+yOweQ^32RyI=N.x7Emtejʨvkoj[GT+|7Q1.`MyS#][ooڠJ y`;[̤yX{;wg&bq}ƊQ<@ [S lYKůJiL%0wYo q-@0OwI``T mPY~ҡ!Y\2, ׷ }MSY= Ɏ7)O;<}b}d}+Е lˀ[ 8 PM~v7,0- X{H`4!~8\zgٍ~Re5y pn`_6K KƧU] v%9d)?Vy-s̭7gQj02>͔ha׈k1| 7w %_W'ԲPqU؋i`G`Y0]SbQ8y%WďuGKO2.go}JnG5l~yƸ(HЙoMWm&-T`rېAY.X.̬"A=q}>!ZY _s[1mD=gecݻwf %mI@in5|=Jg)+ѨjUo<6j\eQyOxa~N" AU%@] +.4BemX0dUϞe|hRBs!b[7(E@7**+*euKUZ5’ _p7M8EJcwk#I 謁oaF8{gx4+K 8(~N#0k ̹Ӹ!//zdTJU񰊩W+ y0B, +a+Vysil l P]¤ܑb7$`e]r ]jvcK0p:69bEG>#*|`lyE}Q14q0@%r2XT<H\$+̶, йQUMίoCfŚ["5(!Aᔨ1\֮*6fCWhP%R-X{lbPN {؀* ۫bN:g @W<G>b,Ǩy51[ߘE3Y)cUl Fy Jch 6ocdmG )TX- ^Oa3%Ǹ7) \c1"})Py(̀OهS\Dt?2:%˖̶կT k=ˈ/)9V q a^VmfL,9i%pf9A)(v \充7ʨ;EUvP|z与`-rw2'7Ա8Pܨ(!^fdXHiQ^㵑E!nŕ4.Y`:Vh"Qnm`> iX"\ӆPK)^d=oAD?Z.RY ixta|h9nq-!8c&p*ZR,GM>sV5ģ K7O1PqJBaߙEV3ȃ g ob^y}–ܰSC5Gwu!kgSS1TR/2ePUyBEv=%zF2T'c(xQm gZe-τK\lqniH2G ˓0hDU)\s0MfMrΥYwWQ4U)yGJ;k!REg ۹ys(_QXo|} Jw \I ^N (:T=s: ^%!-,n l"S6Uհ\--ˊ>J)E=s1E 0P}Dv-*9XavK*=Cx9ehz 8QɁU -emx+~FX=N<6_*ja0Ģq;cp(\1GwWA,6*YjQ,Jr]V14KEv.lelQU$4#9¸N1bDZy,pOEőe]v[ڨ+ܡj|ʡpn8)Bаu4eXܮ(V4XTܭfN5z.*%SnqvsQD#ypW6:-E[@Dve Q iHK_Q.(]Th9SGUo C [)eFUp9nъ@|h[vujap%b#v爉Jo @,U8^2]+*pWnۆvq5Ge&C+S;#t8%7]q}ߙ^nq%=YHNW[KG9_$9FGpQT*ZCӯwvjF6 5]0\Ҙwu13~+78SS`HC~ڑ] ԢPW[]S {ɮsR˻o v0e[ꫲvyRvK ̳['a=V#(b&tˬ#u1tBV%+>^]/e*RuV7+H,0N`m(w5B7|K}`5QmqZmsKWjﮥ]yw?2 TX %xw 4p@@-[W]ejeyOGOp8+jBMiɩP 9컹[b|1ܼiz(d gxgj6I V"E]ǧܸ-|VC0@6_{ZܩG)̴LR)L_਼2 K6qrZ3kUE@ĥ Mv=Q" aQ PZZUPxߝXh498Wqf()! E߈`ijY(k[V QPYV c ^c nCaQ/ls- Un!KD( X[|JpU0 N`(1*X( PlJ]>S$A`ZR*' ]WEWI6ͮ?1:SU~w|}יRi,e9400~)bsKJR̈́ :Qt_0א #jZ8.;7X͇Cs2_'"O ܔ/"7A5vNA@upDG*bsus men\!hWBء}^<}~H׍5hвOQ}sS G10rm)/0+B e$W+(qY;=##_uL29(V{W5Hzkr޺% s4_Di3xp2r7,D`[`qUTZ\5-|[d'QT>%R'bѰHcr; +|#K&<{KZ PC"Tb"0~*m n`O4ᄝRX ?cU#^80s*,)ivKu% H7~ M0@ c kx ^1FD ȟĴң7i JĥN2$1wq Iuvhca R a*+Zp'iY_(š*AC6;#˞P09WX;څ$BQ JK`Oq)naXWa3+,7)q! -gĢG/ڕӾ!EWjG%YWGZ O4g.Sw@Si^; U56 %Y֗,d:nS`PU"xE8@K^xYܻg*[1G'ΝD\P?"B p T@OryT/myU8h+SGru/U*6@(2픂ϒVu+fCB㇔X1 :ێDX8^0kbO0&6eBd ya@uQR%Й+kJzl)H-:=}1cP MParF>Yt$PKG-¥G-.c]Tf[K.Z@k( 8n.]&: {g mUÈ*{N͵اZe* 9teTUk\sȖKVzS#}L2ˑʮ-.뭁D5_)d˭c8ΨJVύձ{"\n UUnQӱiG B 5 `/X|[ܾsQRsmgCz4K VsmL0pU J EņTy㊬*蜏jY]ʅLK= ,[Q4+ڣǸhS)9YBTv^4m-գӨ=EACZZnw^ ъ\~R2\[ϲ+SI""U8NwRckNhȂecxG4*w9)gŀ%:QWCW Úq=TlDqZ-Vm與gY :Dɯt+j(~]\eojETrh@;!7^#@L9V8p9Ad] L.I<*@O2qYAAxӈR:;W'U p! PhKs0"̮F qFטK{* ;R͆e9 ]xUfmt/C,کN ^Bf:xv ozW(9noHXw,Gfh6rz|N) MSm UiXɾ[48Ʊ  "l/y rX) }J)Qo) wMB,2g0tvA_UL9A@`KV( z+%9edT0(%c.%Xia);u. q jHE?Hl#i47ߘ߅1 @9\vK_3W{:ONxRWwbvRbWn -kRi yDC4}0Ne` B1 Bp#폥T\K3;xW; fo5Qٚd4r"~ }Mlq sϘF?RU(Wkk(I.ڡ_tZW 7Q L-8M.DTܰ`rĊ<  xFX~g&lifrmo/J q++LbB Na**r 2&.Tӓ_7@(\l]6^c[v$ؔmȅ2ǒ@9a@Szj0Wh|ل5"~8ddv 7#f٨MfZ<:h}x!'qT #W`(%GWq$v`uEW5}@ګ;(-'|Kbآ, !ov fħ-SO`jygy%O>cѢPuMFE++KMW|+X sg1t2suhn8hyޯNMٌ-~!у}iBTQ0 GIEVqgRjri+Rr DJrC=4x+M> O22s:o-@(VJؐ69b_jl(qӼFSpOI(',#=9),L09o0!Ä;FDӕ<{pT| .y p =P-+-7_qv^|Aŗ(j,3u cukCn:mwR$3b{ w#bM9mL3@צ 6 +_e\ nKhJvzAW^8>x̡}yDh2mჷcB,2]Qp^sV\nט(bl WB:t"wgqNU棉ç5CxJA[|&߉Yķ,v0N"zK? E5(ZnR+ 1WZ8؀,g D?dCKMV#"ZD!عYVc 9ry"- o^[|h!cpٍ jXۖlٸQ=KS ,6x PV}txճu?`~aNANSQ>;ͅ_ "^Yݶ=+bEI`qes&7 D+ E=>a˵q-0[ɦ*JEu7$4KQ5a bΦ!Js1bsR `t:6WslU`Y[!c1* +bqWQNwD*"`+)5ǩQ VV&MuIڍ||qp$ :9;w Чp~/e'eYs:v;˩.&([kg[UBTW˸EʱxHmcʊpR|̻#ꈰ^; 9ȬTNkǨeg`lTP.=T݁j*o]q `5FE) l\KRY& ;bt);^ p g@%/_0 Zk1QY7wXZCK|dFT}J"P^ P._Ԡb* C`("zɿ1:Eaҩf(7Tlϙk晰~`N;ؖ"}>[G_Q.rҁr$#|ʵ *Uvg̵FX" [ B]P<6k)J'yXYREP:hhH:x ùȮPhg\Cbfo<ܱQm؋SR.iZ9.;@UFT<4,WP@GV'0gvSPnXb'K@̴-Ǿ5må4(NS{ezkn%-3«9Z yC#7oO,f6:?;X/B {Cӌ@Z楤/AP:&Cw7)ː/!Fŏ(d]5[exv,i T-Ȋ1wCd! `Brd}*anew4\x{j2N㠁p1F@˚90o"i4¹HkȗuԻ{SN/:WK!ԨdNaSQ. yA\KkKT P#^;|@R p0>(W]ͼ^GXu4S"ܫ557kx:#X amu|X:7pl"Fg`cs0֤=ԗPD7FGrb†ׂ咜hpA!~u>  H# nycGqnV{r8yVlcf\eFƽ3}F-I|KEh_1YquePP-Z5YMK.ȀFYc@T-BL[̋UyIgC+VD`QnU@j (v?(V3lnL<ux2YrWԥ-+BZ!J@[,~b4£"(vZ̡6os{_-WRnHz TR\gCG/_b%=J! fA(I[ \C&Р| q.!ǨŎ4{M=2kJݎbvH%VmBT٢r Zx; Ufvq6Z=L 8ymK4dq|E+no|ǠlAkyW7#Ӵ#YxW 6~"fUN1MMSQR+myeuYVG*VF8"r0.ݙ@{rojx 8"(]얚m+E(ic* SjBŗov3qsB}0%^KbBZE_iJl\]A ߉gXSϻAVaTurjm.<@88*T8In* ^Q_ |htz^q_9!ܩ\L/ j[Zjj{9)~jB WpAל]wNCG`ri A9?%xʴf֬MW* 3=!ʈq̷TW=,MA*"]Է*k˩ZI[+NF%vX@.U똓%FGl{E145z~h|,甖669=_%u x`D?e;zb~s5YI8>+Kuz?0+=FRxa=B;+>@+QqTjhS_A:JSՑ"WqĤ\W"@j>F`N͖G=!:*n*gND uh;6sp-zs Q+[by- ~eRa@ [`n`S6r$ ?p4F)9\UW}5s`T"z"뚉_5Qvھ";[/rG<YHRlGj4zg 7I<oFMtO[jʤ.:A"dt]Fx=20k;lY /cl^~"k1HhߴAUܾmWE-08e×SYU_+0!Pq_Ew1tA]ɬ#O5\|PqXTpN"4Y(\gPaNJ-b3+ Buml'E/bi3G_T4p!mRᔐ̢VKle 0G?S n5D |lcH̀DI}" /7 ۟!ĴE*.NJ-r>Rysb `-}s== ]h _̩-JbFS}+De:ϔ?ROXWM٥o1KiG_lpeN)  .ZPH>E( !R( pU yy`]Kjr$՟pt--o/YѨĜڷN#a{8?$2Eǁ+ \JA ڽZq@nq!|\Z%.F~cNS(wʪr/#/ },'d5FbwSZr[wHR1 icJC\0 ^W} 9 "=>eTۛY{!}>uYy>eϐKÐc2Z^@eMlF̦Y[6h8K:S~".thj5WYq2cE._qdS FʝJp;XP?-p Kjq ݿԥ5iuUBbe/Gl{{/[ 6 EvqHh@X D/Us(׋h69po+|$z5SUiglRϘiphPGou+hQrظy1Ȑ駂d*2bepC<>c.NesYN YSEmᨒ]zͷK 6"Ae=ԧ9bԙ̳+5yVY,d ~"A~"yVh+"Hߨ-81,peC֫v-T(MnP-(8MΣQyadz/qDoRcBּfFU5WTeqúbc5J0!8=VZҙ)-ŸNpq p|y9YyRD 9;ddīȂ'qXC{K_R* BsbPKuk-*^%8PRsRP$ `]z&)Ve M.,]Y SYԮ5vnwg)"*ɪ) (5-荖NAXL.5CJ'>`BYE^T]~b ך9 (s |B `(ekDtArёKnBR)Q[V胁+aK_bXw?Wy8/'Q|$Qy &(UB@.+[o&6_wmЌQ_0]ja4md?e\@)sXH1zERF 6V)VІ( aoi} u> x&tǧ:BI[c應蚷OF]/>yo]AB0x/Q;E(߈u{-(|m5 9"#b#PrP!P8Zήs9r N5 OR~X)\+hlu秕R@5xdA\Tp0PB xK4@楴G6˾"m:d! Ք]aǹ{%=xkG%́ U_0Q:\F®%z<18Ǡ-sSyڥ[ٮnY)Nb8Zy'J֦]q+i}D$泫.<$1ǘf&ێq۹Jk8F@dpkz(}O!Lb@s]Qe\Z+(]zI<*-ҌW9N%Z 6UHGac*2DK{,W|,m,Uz\AaRw@C+a.+dڶ % XRyT<ȸEmM5N)nD*+T[X55^Ġ[E棶dPfl8u+nx / UĹ^r'$@SFkuO3ch*"4/!TXK,2NN3T{L?po)0UJU`X}=˻j8n/N,Ƈɽʅ[0tq׉~E4"KNJtA7sJng ᬙ"zUF,t3E/e[Sm=Li`#$ N2A:L|Cgțٵ^&;F>`ɗ+4@s/qd*yZܲt]S4i%:+qU9AT^1_eҶ&׹puz,`U.A@A;brqPf3A)T@0u 4;(A+_7@Fv>{AaH**3@g-j 7#4X a gu 1%]8 3.=PaG5,"զuUeN`NLDex,b,tM<)4lḒ: (G0B 9P6#ȍz ?*Sť0- ,:Zc>V^s=R/.*еQ|n6\(;-)Kx0! CeN "UN(WeHc|XaE-]C uSA޼AQo ̡A˓ zFO1F /v6*F>qf$74rWP;tP*@[b|Y,߈ƢW7XKyDD f^\U\;+K%bqP*3 unN.5ҢԠ8'ܽ ;p ӊ\#SX'~;Eq=!H6B4~ v6r gb4(Z4S)ZROcuLa@ID^`xcE,g Jq'Q{%{`79ȍ. za1:NzUvFT@ /8w 0u+mx$Gܾ\O [a?\7G\"㸠G;U`>+ KYq(!^}͑ fnEk o^.!GK VO9!X(f! v$/HV=G'%u;Ҭh׸Iy.u1= `7+8Â]$580+6 Wxekzܗe< ۄ`qF/] IhCLVJ~MP]P)-s$kaҺnJҳp.ψTCBp7w<(RbU.@W%Ip if \|F)`$Tfye9_jFP"Wm;~ qDa$ۭT_5wy?q*r1]Dh4`O4ln1yx`ԫx8.\AZRR闯xZ} e@WS!z;l$Eoᛨcc6Atw ɳ$kXr]1ơܣNǰ/ܲX|*ߞo^ B?X{y˘8K x.'qpF!@t4UC Ws} _)R#p+J v"+J`. *lABJ&e6g]tp.ׂ;p7Ĵ+_1kPZB;O2ۚ|)Z&k9"f܇Y-Jӕ^半, {rEt5OvqQ$iCE3xp` sV`e$Ce %e{bKV͗!5,LϟE~.(2GL}c8b)ꇘPϘ&}qEVFqw`8[mz%J@!bAgQҭp4 P+EYձ/†;(G6LӉ`d*5 Y=4:P|BxQϮ \EiPBVur= x-?UL ]tF*ગQV0#EK}llL'0 {S΀fEҖy+|D@l-Nyi^H2Twl jF(eR+ۙ cJաm4mwD;SRV5a~8Q{Og2^#5ǨU)Kx4/ǩNDS橛*⟂3Mtu%UGeԢc͔p,QN6Q*h {:cĻ`GYݷ s+ W(V[U%W<YP{~Prv #nܮju)Ųj!j ӯ!,yOwn'9yќVܔ" coY%Te S[`J+Ը\^YDGB3"ZNvh, MΎַͅ71^TiET VķPQ:phH[טRXXR#й0RӜיib%Wᖛ+Y X*[;fEQ]L[/<;4tU16|DPK2[ъzvzmJq^[,RF90s䇾GO2EWq7%AwSw)coM{tB.x>|Bo@ڍ)u_0-*-ƕ t %+*7"W"pEJ.C]py@ybm%N<*P:81BcX :q;W6cΈ0v?066n5!6;K&JGa*ᣜp%B?l%!L;|F8RAi Vg ,Qb{QrK%$ڟ+Ss}/ O+j:&BУ:n80& svE ~XwF/)8S1 I0{1TWP굜5)Yz}Fkψ<s.W\D TceljG5&s9W`/ d(1RV&,_"#hqT a 0agZ%gB 5^2܁E/T_QšV+ ^Q N;S{=º ={`p3A|n%5E:qqp^1Gj[xEUZ"qC]e'"dur]pnh;.8%:CթY4W|#rPh@ kB U-Y{*(5.>QIo!y@t&qAn1e`wCGs\mrRvӏukXBTp҇@~Ңj+[ո T`wk]/RE` Ċ5GvOflt>E rԩE10{ez%p_ ^bVKk(%C=H.ȱ .)'"a\*n8 QBcI,(h1|㜂y3-W*XӛfTQ_7.:JpO"- Ǹ$aM\#AKWUr d'en=Dk ,UzdlE>y@QG q2s.ţ0*G_~VQ)۽=x=2 ]³k҅UVr2*|ۖ)@/ >䪻/Ik_!mB 9KSzK'DkDu4rh{?Qũ*r Th{?%E{[0SW%upl:"_9,j[Nh.Ǹqa |F_0s:S"/qͯQ4e:Etዤr/,Iz8rn.[n:(w k|".Ȭ1yGQ5*YL0$ǻk^b1NYQswc&JZljX0 =DC-*ۿⅬҠj4l٤5/gS$+ߺ %qh.ɸ0 -E2⠥\Bd=!K< \ķiys kxa묂M9cz{-dS ZҺyW-UXa(-ihBuG _4ASsE8h7 Ɠ`y-Fy >S,ݭk z/.yCՅkFJտPǎo"VQ܋Nl5V\Qg08ۀ(x(4伾FouԢ(ښ7V@Q%Y]u in@"}[k9wBAډ6xIy̻$7%B4׋VqY k+]Ge8;x.O r*mf#,cv[̩EFڹ(j_M|M~~ Eea#~D]]L請u>1+F/62F%& ^~98tMb>GGh:B9R oLӥq߉7!^J| W}YD>u/l}P,m-@%G,}.RY;]P+˗ N-~a50ig }L11f<5/* ّ uZQj7]N_1BR.X׏3M^=*@!{9mJv[ccS? +7 ߹q4M]Tj Hn˽D rNZ RBJ<1ꗙaE5qlkQD/] ⡭M(7.$Oq}l`$9n`/਼'f#WaŰ|]l=F-\zѵ)lo؎fЍ nʺbv+ 6}țB,74?1v-A*u޿p9M y_rP-〾 @ lx ^')R]Nل*uXekX\N ЁAj;Veuf3/bJbwS+`8㙗0券U^C' )5\6yZ@'-c*7Qtu, JHTJtu22 <5 @?S%.!NQNJ}(W |FAFR< Ie `PEÆPv8 rujcF6i*n0,S@o6)EJ;SJ;UA㩭w ^2qˡPl XKA=bW/F5>GKLr4MC]Z_sǮQ8FmרC+BhG*!e*שT)al3W;Mڊdt7':Fkӧ/ P\Ez!H9Xsj햸nRt-Zw.E(Qۤט@(q.z C&p5 }T=**5*t׊jXzD'{.ޗϧ\RyPfطˮR)h2s(Ϛf"btSU$;VC|WX͡[1mSE6]UrFjrzȹmJ2ƝsDju*͠96P / tq %hR:ejq> & B=`E2Ҝohi k4`Jf h&ɉq*S8_iEڔ{EFz/FeM:ғP褦ž'kW-sD5A tՙUi Yb4`&sJngrlZDRP_ RRcE9o7áO y'd32m*[I4\xW\e-ipJqڛ I¡҉>lfO$lDs f59UP SHIn1֩h2Xp"cf xmRaH5}Yrw(cEC64LgMsS)N)zpfNw 2]ro-|u]ԕ\8c*Dp7\qTfvSsHaC56퍼3lZ`pאjiOH{Ls7A2q>nULk>GI_<ثe;?*gL4=ƅKr&̚f>)No'DƇnHU[љbUQ6XD*z'N,xW,/D(16 z=/[&)H?S:[gcZrт%T 3)qRgk1 1&?!n%L  դY7Q$f1;4 ,Szrӕg2;@yٔMߟ22&vW$qiO-QrZ7o%NFig2r[TSKiI4>>Ѭ}7; ƷtʋO8KE^WM.`K#cK&=o"mMG.ڢCs,̀[%L3F},W*\㧗sXpKԉI]i ,.^ӧZEᱱ k 5=B|:YH] e'Z$Yir' +˄miS0*)ғ D\m-W<ֹ)j/Vpj^T۔=4Cm9ʧBo8'荺KsUdSRs-(/PU&BMUq4@nLHi[IMzL#<'Ut:,ŏ"'TcIȶΨA-.%r13 ytk fUmrW;,3ƭ5n&ŋ|\ٺ1_7Hi9y[ιl1Y.XM{STR->2ag }\;-9^u)2tZ=P֤ a3韥??{lns:Q;ӛ|yyĀMϖJ7s&D >;6(r'Nn8j+N5uڪW1Rc Sq2"9 ̺l X<;KV WSE|y\On*O#l+d7@ްJ45&?}5Ke&2 c̭blF.9%F 3Rx:;HƦ"/EL$=u**y4ԴCaü4\JiQ=BG6tV u)ZʦН~i`UAMTqY.EFff& yȤJJt+ /A55U]m]1jAF>`KJ- a*Ѷ@b((-XĂnhX9CaM+AR`lڍ;-qL9z#`zrL դnI=p oHcY-faE58]D0bvp5?:lXY=6Z#sI0G:-ab`h*>'٠kehNc6U"y4S5^4(A3M#q0ۭ5lk&s[{x}'F;ShڐPSU XMOZi.qT6!'_3 VORD[[5ޝ;Ɗ5]rL2)RLEV@)7zfif qF}pB7دs1M\%8v~GySk+reiJ]["[t4L*\ՒGŽ:DpyAhi$)*Rr 3d04mOrmPtjk]]F} 12jX^QxAĻ|ܜf-]|OH=͋K\G 4Oj܍MyzTҹgw'ngL4rfqF&6C:ja4:y8טrtT{mF!A9>jcqZ3KJs}$V`*+w(t0xT*}g8EM1  &B[K0 9AZfo3yxhn[JXx1Ui3{fgLR\4G5Lm|YRk(I0/4qZEͫHi<3y{BiR3&+rdWpBtvQh in.Z֠=icrV{t\Cj9i1٭T^@PKhL\O>镮vNWHI}DRY-$?ܨ=.9]cm3:ڗtPI(+ASϺoMmεTԢ59ok}?C\LR:#AL.%Ud08mGC9dK֗ \JmMDmmZLL\RseҚ.:BIf{//O=O C=;̋-$N-2HڞI5rz]'C:RDW.AqIz @:{)UY #֓ro[H:Z:h砐|!{}ɗ^2Bc-}dXE>JO6(+YFy!E(Xj;:T|i64.9TmlsCR'8\i.Rm}}%!*-q^ι$*BhZhK\MYWC9urz%;9'utݚ2- 4M%څ3L*gH)h7O[Ň1kNeMZ9+")%Sw!P"^pFC(dGZT,yM` <[]MOK^dR2~lk[ЎeM΋TtR)':;LΦe,D|(zUaΏc̩` ꦕ&+]ͼ%HߢM`gRfpU/A>'-z|:]åcY%gs)CUӝEt%]Ҍ|0IKYR:hű Q()3ii*LjQW=SN 5bd>~Zd& ).PҫPMǶ:nf!`.q&L1)Ō\ -T\4D$uկeZ)65Kf*mL#k ZrwkT}eŤ7֍Ա RRDSPl*'<-:묜L:Q#at*f!՞]3Usc\J[SCSqF^E R R+#UJҙ-15+ ڦԋP5IG:Jjj-H`PsS8P%I>h!M{ekso:i\P~wPclNB%& lL5ʢ"/myL'cgcGsyk¥MR:R::Ve*ZzP ^zWk hAbTT 4hQ˙˜{LkSa0`#n}4hRjS҆pshZH#:`5e>t G/woO @hUncoFTZ&\7K|%]]T{dk(Ƕ(AKVPShVn*Lҡ!*&^0+Jl&5`Q.Tʀh| 6*jsp7qouD"iKKj7U`I4LSLLrfzj|Kר.bwOP+eT\N&t'FRwiaF{ԇ j8S%Rjpj2t3.eUHSxg:' IL珨yаeL+Ogu=a(Tհ&n*$X9gn]-Rwѫl"͕RsTjk0}gNG17FA]dg%ZE۷]BQn)ԩW,,.=;nrhc'*}$[q1INJ*ǢrTvisL٤QBSQ?.:DUbH65 f,K`yk<9.jeҕ,"4( iF]6zUSFbi*}TuR5=&e.hqI9XyIjy :'4ȴ8ffSNEە5m8}.rڈmu&퓼9qtkYST3|9Lɺ\O_,oUՆ[H&1XACQBTjBz a.0YGLcST1,M JOgnv.:>nyS[\5Q4P5J|(hҥY`䮳D4lC4NAY8쓩A&jْuHOJdf)!8Y7h &Cl_RWwin]'oo&e')\c%84{lfv;/¤sԴ@+r> :*ٴ׶O!;4T ES=̚+9T%IhԾaYڎzzy輆ԮQIh 3r_5p3MM<}3J{Z=$^ m6'ItPŪ](yFԟ& Dm$R{he^5:2zatKAtjV6+sdm%bs\Vw-Th1LgbB}I~\sLO@A2t[IHCju s}KPQH5:\RE;3DX)[awkMLfZΝ /9R?\&Rlo?]d>>}=LNMJ<=2z 5x =!'̀քI P +hԜt^jiZܷHRkHǢu PcDgDEHF#|dZKT!fua^!!5ȧ #$efr0YQВmey@J ŁSkl܊e=rR/3RfzcJ:T.R];JsNiGm`J:q$m>D|[- S$s='>I1oD6D0篺USE$*s(BkⲚ "ˆTx{ű2j)ThTirT=e5njUP6L9h{r5iRKSZ&Cma(~!$9ܹsJj%VAv 1.zOk   #U)m$`vwbϧnlZubtT'/1F2zq-FI1kEL TC`+ˆ[rt-'*Jp)?3|^jEq7eB 3Tk1T .S=O-JHjqioFd{fs6+$˙ӅJln#E5kبFĄF.9(k6jٯ,c@/69w,ҽh[i8ibk0ZYˎSs'T*= sSGэoB\5ZA7"*kq77l.mOTrs4Ԉ,LeOU+u1RT3OBxƫi4'Q_t9=]L5._ J)䭭-2s4BZƒx Q"t$LL? pZ lTrz@HcS4ġЌmzJ.gH%LeCz eF`PkARuhĆ 2kjeK=HhA6RZPt)ryP3YX izuϟ[-xN0EG'IW5 YsUȭl\rsjq#n;S=H+H¥Nhͳp}ڭE\\24ib^ҙA^*dQܽsgɪ[#MZKjL/b>b|:,uQx%I)ZZ[ҤͭC i+f t5zHF6vG"[LNɨm/Bc(Iho.ˢU ThUbJ\ӡٝ^rw˧m#-M|4%;bUeG#|gsrC;ʐD]1TfرD7fFv 2EN!Tƫ + #箆5[MHժuy֩_-5~4J)6)7jb=c #LƹsuX̭6 ީ|p=ZUKK4g3Iu=R'-:f85z?QaVI{D Zoh9574*BXI5Y'߂^uOC61S`;yFLƱ:աJ:9ܐ=D颕XCsrMl9sn/\V`5&2h:>)ɞ-Pӽ7j!F٨J vΉ}J2tth`фMs};+Y<|5@E)`ƓTKL&r'OL&7;"  T)T)yM}װISrsЫ˝K9I2- KMD/QʵQ@#Dߤ3`mD|*q4(W-,` &skoҴSZڕ k 2ФSJn) Rd}H2҈OfվMFF4志tQ̑ (K9d7̚lj={*綡+jw9<;i|&q&n5  iO=r[Ztϡ Vm,k2X¬z{-rIg<^d-6 rsrOn>@"A*pQe',djr92M5GPL#g%YNJI3m+YU.ĥ];;.9Xf#w-$*_1Ϩ Ud*Z 6,+k44$o0Fz@eLT/[+M"0dAkp 43T%+\|~tϲkRPlu5CrcD/\U7 딅7U2չl9Js+A%YN7QQ'ȴγkN/ߚ{\!1@Iˮz1YDz Q:g{ܢ&K:LrX5ikewy3: 4Lm (HI@eEH--MP1y<ۚ6 IԹ3h-!i 5M_=FTGFl ;rfG8FEJ3L}ƺ. _$h\aJ3e=նU.б֢mė5H +k@2{EqU/{;"9ksmE?l,!'.мL{pTR7KZh,~%8*W#M)+)'R_OyTe.Sw$LbsBZUUI)浩-ikWi;jjX2$4]D4OW˕s5/f*tƘBZK >Hs2v\%ivJ1s_y ֝3_PGP =Иz5^2 ~z=BЕ&=&^o*-2Cvj| 9d4LZoF-$f+ѓi{6)Q.~VkA@! ! 3EtCm١(K45VB8[0d}+i sJ`{.(TԹ7؅K5àQHYEMRx APlMMQgrlhR4zY9nC:86zPDXf^y8Jl(ӏ?onUh:Sl!PzWL@5H\}dO9t>5B4PmSMc9L3\rR"n9cE4\dsRԘ.Z:ؒs9ҡ"{+(rjrE (63=9&%Rv\`/ʖ7:B)SERp'og7R^}ush/%9z6sW AOJM+"0 nZ)TTB,LKlV%Uz,ibjJjh+ѱr4湽1\t`iL5.|7%$Cf%!/ss*8z4XH~$IxJRoRdL[aI޶Vͤ(T:'!TdisLIk4.ti.X5ҸM xЕg^˷˧eF86LʝΪs뚉IP3RU#-#fVitMTsS2b6-s9S~zx7 梠964@fVsz(ΐ(5EI>i8>znKnJ*L isa2*MrkUO$6ZDb93@U5F kv.kr3b4i3shMJQɴ+4͉Kʵ+˧;zHWX߮`^`k %TN|8WJ̩_Ўih($)Uw%R"9鴉(G1ͳ*lE$J-gR4~5e@\ Va'.Yji$npKyf hKb}3ZU{y%FzeM =t=Yoҳ*jfZ,)- _נ"N@&a.hjTq5BZd{b<3GM_‘%ɾ\J-9JC"$ԱIh*}3~?zݕ 6`$7ER:CJXɡ{R8B SeOV)lh%Y^Lst%ؖH6-dzY0#1ɬ˃tRi>l6qh=Lo8L;$MRl.kVz#Y刈m-4iMi#IއAgK <ڙM9pY=SS7DKt^W(!l.#[Ps\֓k4i hKPksT!2jr7ܹ:KLk>/Wi4\s \(X,\i9ޥC0IBܷ.Yh+%JK)NFUTm :ұWUHim0-$:,T3Y=O0F(^3eQVJQwzsw|Of_9)QQQ,ͼJlr94}kZ4RII\S4SSJxmCigSǿlBTw1YNܵ5IyU.U2+U\~sXɬq4*4dPA"c)D2 [$%M.E)b֪i= :]Q 'GBB9 !.4c~JvNURENH٦`µ)! HyIX{-*R xj\*r= jj:ń+LPYSv̧CЇH:5#\%Pb{&lN&LJx%u+\'Ibe 9PÚtRp u,CjvQ:n!iܴl;!*.j뜗QcrؓެR49MT x\OD&3HF?˦6λSLR9qІhT8o ';-E HruhcJi[&-23jljQwͩc.=#iP isdbS!M r2`rbՋ&ܺXLL䔛bOPUFM;UZbT)74Yͤ0UT5~251]&l9C| Ep}S:&;垉LIJL)]ZgN]gkU/8BCgnSEJЦI}XgH!R/:%ULܡ:2kIC^R⛧Q߰w-Hky?C$fƠCbb)" f5W<~yJ!=)e=-S؟('8vS(-K5iq(%9kzBA0F+R%&+!<[>@{h6 &To)-, *Pi#y {l_TtΡSӃiPE$Rxl=[ch,VmŲ;% HᏙ2uR+&h/Rrzsjܵ\}'=onpzkJIuhAVҜ aH8途 )B-DH`jK1ԠDդ(Z&AR$J 1VSA0,SEMS ڄG0bݳ9s<OH>Ib&zÀ'3y砑8wMy7i=ӌNu寊=3UW8&z!tab{ 팊:="" o&3k\uҽC@հ*N/z2 P7A>kͱtOSc304t̬ HK\nBkSGT5in11ɺBCybX\&Oge@sG0@>(bjh!M1Bjd:X<\IMgB㒝d;FZ>ƚS2m1?D4lX#K(E=LOC9poƅS)Mt?=I~詹I FTb a>JUϹkH`\B3MJ7!5isiHXx\ 'ъͪzw; 3ʗ̞h1Ȑ.}!`EEl.L |54Yx5(ɕS` e -ezLb++cB܁IC|,Н 6U-4lH!+Nьu,|q% &b3ҙB!MjԮ4I:/9:! Kc5hnl<1%LfMk=ͿlSDHZ[ɀ(mRzeeDIy:Nzͅ8A+;|[a=t"h!/Dz3YastM@M xbC< S>s@@ݢ HKʞ[0ʝHeMK tgљ荩4WJg3\5P2;`*т ΈZm?$tDe报f!ei\|:MSK$Ҧdc'P;ZIRQmizPl f*KȤMpK &!>*cMLcphkZv}; yEV $sr^bkUS:q*%Cf4Uؐ%+` R@mt$<i';s|ޅF.Mt9cC-c4Sdl(\(8>s~w+|)3** ט9MDs\,d ]hm$tnv!j<NCI03rHJ3x*άK\dL*c6hTh46vPKʅL LW?w}*d4Ŵ)Q+HR64hƀF @Sk`RuΓTNҹJKA!H]mYS`"N!nɓ;9=43bc ^8 UK+c,- 'Q>u_Ϳ)gU/RIjZHΫ |XRv5<;d\URuLų4CH\5R41Ks-N')0 ȥDZGT&P(XM>ڷް<՜ ,SW O>j=m'1 PbQUlX J.kfFo$y^H̞*DC^" YLF<\Z"OV*M6dapi6*8K<:Y)t;%p+.[촄͋LSw5-`7]5D1q9*#HSm4 =1s|)΢PTc*m+U{-6I-%qҪt{*e8+==UqX:<zheC7L9[|ar\SkeRI #uuJGj3l( Rkj"LKiIGHO9Sڐhv+KrFTq+}9#$cSm!^6 64e4u):ɧW1]|Ur O+|>^t\xAjn:s՝`Tf檛EMOV~^:E2QzdOAQ- b¹X'V)$j 3=cd`iMRS4W*<ʽ}ؽ#$ sefhFK[Y7HIRhTM- *=M+49Xi// RFCP'bs +(\ST FιVEh 1%Z'ίLbs ">lY+Lu&Hdzdn)X n6{(Mi\ߜ{$  2J (.E ΨӮ*n ~?jyV#`5K4mlpF t.vs*t,rݚ5JGhHl!$C4K;-GG4@Ng lSFI54(`Ι7g?5mH"'T{*KnQ=KH`Ϛ!/m]%!U'kl{ҎkW.0DOjL!x<ڟQ TZ>o-Aώ˽5Jb/ѵ^2|U{hR j$iT4  X;%IdS 3L0DT4lXNro9kJh-5䵌SOt7W* Lj|ʣVQ`(=krW%:F>M- EF&E-JytdZ[m$T(Sh:= 6 \1kr&e?;jWތ(ɦd3"H1VGP н3Q.!q}>՛IVp9V AR 5UH!R b-^u_ *Z 5T ԑ( P1ZZ<`ѓ7^aDTH%K@4Z ~rkTȢd?JM].wk˗;;dS.^\TrSHsziKܽ)ݲHfF@AQ9TmY/ĶML5!dj-9ɨpk7`NʟL@1ZFKO0[48$96m-Z'f6ZflRI/*AC&j^kEppLVARJDobc)(J{gKrС2Fi:7*g^I1k^LkX, Է*_Rm9Ew.*PJLq4{[R5"($U(S$mJ0* QM2^MMB:x$\J5A;n,.wi;I Л:ְg i]'-6|l̙LTzkgi}$py ТĵJU-J'\,Ԗ-;&FK\4[-2듉4HR-QprQaLnGɃ{F ò$[*ɯC$Ţ ȼ8ԣAt*JnM.i`M2p ^iFR.5 qP>uL[Š RmmiУXK"(d6녊h>y׮n)szj;LR!*r.M1 $5"3JSb&bQg9Ѫ eCc=$ k$)OG/:y4JI=Ķ30sЋR gT^eHXjO19jO&rʤdY1[44Ojx҃7 &J%1+)Vw2`'T4BJ4Ƶ%p :ʼ5FMa!$j2I zeh)xюg6k*493Xk1h@ L({5ȱɩפhFj)i\8U H*P^~JUMRfTK9*\QSҝ3Y\6DZ䡩a]6s&e/%V4A345&ȖhdѠu2$ʹ)G:U"< iwsAdǫk(@/ ;:3Hu@Nʙ:URIO$()`MLM-CUBRծdS9kwd4iYnɯݙ" 5K2[3782K|('%UI`٤ NB3? U9 ʕHiP>++\+.sD̞h2Bi%)lJ[%mA!R3W5@ag h1]Y)X8R-[)'S [KRj`c[Dt"&QʑO>{-jJNO{*kV=9i4D)D' Y/4\ZO,:(}^v3^m!͚BImEYRIS- Uk\\ `$jTV4EbP1\u$礚Sz y߹k6iLPKhUpOuOֻ@"K ], ,ֽ@J% ( XyK;"lQD1oX4% x!KZsFz%-C4 $*&bäۙj5^˝$к)7:)+X]M83;pbYJeii@mlda6QKM6ԥB֌c/6[j6lS#\VSJ))$j}ô&e9)͸&.UR3r@Y'6Ʃ^4P"0b9ک&:#6D$A% Nk0sܪat"I+LX)I釠M%[ aNrh0hQRSlTSb)b49[tCmO֜ 4qUR`\i\W$-H'nqt[eG1r6%ZdLX FZ%'.+bI*!c6C-d&v b|5^ɶfM$!+jΩ+47|)`Ӫ"ŪwP*J  ,S(TKրF"g.HSUz HHLcҞBKX3N ob- $yt6' `)`-3h܆(] E'R˗-6Lr3OM+ n c ɣ;l M9`ҽ0jshLo< M;Nt+{d̚jQzqeyK\#|=IQ티B`)h\&2 tf|0gP5Z(m&cctcI2yll`C`"=Sx50 t n i!xK`rw921~X{M BL `KY%qV?I.b0|kUVz#D6;ZuӠ7H1X޴O *h Н LjD^=E& T5TGB/4 K41T[0#LuzMAFWq6zD.sZJo?fpJ¼s3JC[B`$N\Sd'QFԊcQ< !)CQ,2VIhHCE=7LkXkKbV.)Kb5>d4˘rYαʚJ.))a͢%r^ $5RIdlЅ)\7\56 ;iHE:-j^INSA3R\Xf\*uɃQ`DyKkRWьM>PӑEϹ$ܭ1R!4jL9FI{X: m-hmHҩ:CPdF$ *FxI2Sf!Sa0V5S(r5~ЭZF S  ѭCU9Y&HC6B, ,1Z҅$,g#5Ak(sCYR 6MkNDj\c܃Oe=z1."mPȪwԗԱa5*1U+sb FC%;_o7ޱs+ Z/+q 0J N61XSH<8kO4R<{2QjB3BK)pd` Z5=!19G`7_/X=`ztRWe5ӽMFBw +3el䱼 (lIA2fJZPxhk$!KF U- 3SA4 U!:'Q"tο& $ "ĆgTȍs2áHd 0^ ?mJO^҈'!Xbzex:擟c䒥`왨1# P Q7N$)xJ-FJm~)B(`4 ]?M:pZlfV4Qi0]_ FA\񷕶]|(԰Gi# {[0XCK3ʛ2jgb!.K9 J[YH¡ U)M^\+nwj(f$Y=d)e>}|@EMu8Zf&1UrD1bt*dtGKfNg/I/m %&J)rb1=dZH|-a—AڦiZ*I*$4_2㪌1L7 SIoE}ѥ:=`kV\\qS;Tj(a3YL40D?kJLк@-|T\浶707k8k(0f\>}G=B)R1:&[ZU0Di!c(E#4X S]@'zSkeXbU<,sM@^SH[UZ㢶JRAၦ$ngX`ftY&`Za&'VQ/5c"5F*˪yuգfms]$Z?$f2e0ʅ5dB5?IԌ)gD2:)Uy<^okɨ+,@lԮ6*MǬjɚ%:8z* Ũ)BS; dn֣L>TPu^&c,`бB;4v\P-QPeyme9PCl{4zܺ[N4S7(v)k<7} ]\sX$[BPLBs94lhL#8PMPk@^h֙cK#5Ҝa%5M[^T6Xp3.|T7,}s,dOjj\S+5=R1:*MK4)MJjn&pEJs,&nNd\UeB^K9,TУIrJkT4k٦~V\ F)r*Rsf )wBX'Ike>\K.|CkZ`E^(RVqK?E{W}?D֛3NC״&$ꃉES8 GJT%$P:Z j`2f K*rM>o(Jp-׭He0@W@1b^8{A#@*\w}s$<6t!jMjh3DO9s}S JQpF6$,iNMJ>B*%GQN E$J` UO%R Fߖ:$=R7-&58I5L*N0K@'f+ʩ["%zGԘz9s~92)y&3Z5ʹEJS'\:AW!>?ʑ8 To1 ,.wY")hj"HšeY{U|mZEce.(ЩV|%%'$$u28Pnf9kc bW,rsNSHA+)M T'* '-Zۖ*ltԤ"t*]5 ["ip+MmMgVPgC5Iḙh:kia s oSTB7SKph9tΩi2ɯ`H{eNE ûqʏ%1-:Dc4S"w'No@"94|7F yTȚiтh)t,2 5; 'Y|ws5Xqs#튛\R:4uPXCn)5f:/cfImmEHhG>OD4ɧ*b:_,JEPy=3~M%KpMR-h)bAxIzJNf<4i!#PF(0@`{D){ G1K0E $vʊ"IO"()4P*25xDjP gd1f''Rl4_6 &_FO'\ j-HuBR+5e瞽i7#"e9T9Li*VYp>vH,eem$"Y.S6({Jihr35҅o<cRx԰!rص b(pX62,I΂vmF3@D[CvYLȟu++kV䄶`ґ@h)w,*({bL-,V ԣ r_IQWH#hŘT zL,UI5Hs?&h5%;'l0j~w}sR 6Z?MR+`*k |)ة\K( cQf'NufB<q fj`-eD6$5%D-ILHƈQ挞)ҹ^L&59Φ_Zo>e lԅԩN:t6'*+'j Sk8ui5IK;,.`v6TGE3ͶK˖ 5L^ܗ gڟR)sΟ/*߯_.MGF2cS(P#éƢ "8+ESJ՚  XF˖3M)\ D8jJܲMlyci(!SF aʹ*Y$.A*<'$m*4 )5)|aJGQg=똗4\_b@)2PZ%qA>渜oTfNشG*rI0]ƪt51FforM(LFe&%b~mAh!Y &l s 疤m(Y{a`Sv$!ҙ N8ڔ+$Kȧ\l]c󤩖&])CTɸ=0\gJtJnnEܱB OE&v@m ^4eoP2ZIssʘ ={r3O7  ٮ^§ʍ HMu82ryIVIu\i)0Qhō. sB ڕqcxj)E:HudZN>sOidTti5/5c!K|tV'Wri liASm-c6W2neU,kg sޭ(gi+$S[{ ?-v42T*K]z4zJդl熣Η9\vrV;1z0_KCƂM%s&&MӉ=c{& ry-dE5eb.2>qa :~ϩ\օTyruJߑC-Տ 41]&z#!=*D\|,cNa"}NM?JwX\8}KE 0P p Pl.&) ]$@K 0z)KKsz:'w,Cs%)g'L+f& %A!ɊOIbfjM ڛ7)c'j % wQύ34"'WΔ7{g>rI2 9[88^KGsy5ʹMJJb%l:}(bĮqlK^ʃ$%Fҏ;J{.mzܤs1D]*JhbQ*GR'QS?4 ,ȒԮzTQHcC"d5TE-#޳ O7]Z(rU2R*z \]FA`@7T?ΐ"#VԷ EeQM`smvk WSFvk'm+$ crV1>^R, x(箌t1 nt޹1H!4Sͮk2dcU.,IV0m1m,Ш;\ؽH`Õϗs\[#h#Wԙjp^r&ta5˽Ű7E(#De*Ih5`\]*#cK]^dHak}a4G3(~2fh)G85)W4ѝ&~t$8)RBZɨ7hd8ɢjDHG[9䳢.BpLriuv})iuy\ͱl:dTpFx),1[R;#>u"xKM({bQ=,š`:9k|I1U@eςQrN.sKW`eKYsbYcqWBas]mP-2j=,U;+e>\qT*t,QG`eUкJ\Nfv%o.RTұ plΓιsG|599:~n}8t):Y0=sBXz0j.YY#n^1tJ^rh rs:yi>}9U6\TcM7 ۔܃fZO6퍏NSr7ƍTM8b (X幑Χk#%$R0AKBSzmtH) h^А0X 5 T&֑ U ˘U;Z9U[4ΗE6\l43ŗ/\XK}59-E*aRtd:4l׹7ԽEpCͻSBggJP׾C2;eK}hR)v^wF%җ- HWAHjBp~^E>Lӗ6nU6n:4Oq۾oRf-,tD7'>ڭɲNi.onh-&^{fUH E/0<@ §Ώ4c(td!Ko4/-!ٟ+s&ܱEL`%.6]Tٸf5iInn9jZM>^z(44}E5Ϋ|+[S ^Okhy.tǮjdSP3G_$HMIʽq4'x ^CcML[OGUy ꉑnZZڲT]2<P44G fihnTWT6;hh[RdrU7Z %rC5`ܑ-%`h '=ovzDG1]XtϮW_;zY6Y̛TFh'=>nj:iHc/L|o,"hpfS#IN3њfY P:!-[gs0i=U."Jnۃ絨=6D]c^ >ߘ6PXMKc)+'&Rej2%06jKl1f -?d.:cNJs5!]1A`!z%c)E/neΝgkL`)҄mI@?X;:"*H:I1NA5PR̉>cݲoFDU=c#YnwM[ A7Ɣ"(%9\f%W =JUORn lzeIR:4%4B4Ϧ^ ѶPU zWTWi2-93y恔]Md"%R蔋HmB$ĉBTo/r!)$>䭩"jbKHC3~S\R 9 :50T;"dN?T̴ӈ^#By|9g/JUEW|åkg9>nsyio*y7í6UJ* y4O.f\3\V7$cv'TKsjA3gN72YsLב],Ѕ.EsHŊśƐRrƹJ'-rңIlt:N)oir^HM,&KGNR<؜U:NRJM >؇QUNm/0BJh'5-%X]Wn %-U >oqT j/FN5  )\,h 4ԏ!zJULԺU!k5(BQjh*g9bW4Gi ȷ 9u8X)ykssl i^IEȹ\=ŶZ׎<7rHzoN)+44>¯-Fs`f4^@j dHCt1RTNPD*kΆ'jTSpb4A%oЁxƙJRMCdT'* ˝֙jh&guNHk\(Nٴhr,l``giNSȷCB&E(kN=cDpr(4YrKⷣ%Tui-'Ut4snSImY0lf bb/ԻHVQ诱׳b֏{:d*cT 4")ziP k4؄S"۪|T$&sƀTgagQr˕gO>hY ɤR3ck}sm [c+y jfZEgPs2 Ҧ8SG4=m20MR}X玪ɴ 60yTP/k*Jr#E~d\{P rtQUJsֽqI]c]"isRy/=jqʣl(jh?5,gSrєC^3R3 k,&wI!qT)d~ata\SCEJIEK& !uC*>Wt5tldd2Fj&V~EN#>36'=' ?)o*Zw{Nd]#o,LUeR$ßwkC5!f-tq.wA<]NҵRט4t|nGTgJR(sB^UI͗|#t/IX} ,LGbWOآy^xzLtqsҝZrhIsvlT\Q55Iu"ss^a.T\L 1TkF-EC1n"-3TԌ>j5i*kdS7 ~[PL']+*"SRH!5%+GuJНmJR,Hȁ\;#ZbGP箏G-p0 JķiPc[Z2 [vĎNS4-ZB_6̴RI>Q̨7|v*g蹉}]t ;c+vʹ;Tjِ雌6uT{݆XԪɤIpCRt>_=B5S9hN5"e'r+zu!`A,90jZ6%/?QJ B+l uҗe:VN"tZRVH:-4x1I`jW-kBc-jRo8Х훕ɜZGG"PRN4Ѝ9띣][eruhMΣYՇzn}FƆ@]8QϼAsQ=N;>/;-\r==|h#9Rl]^Qip "c7lBV_P!\}-:w+dQy٤-d;,((:gZg.S#J@JE|jFx Ed':lit)|qW;DttڡR66)]ҙۦֺ u&O2+ FMs˗n54MԺzL yZ:ν"ٛz5v&:5K:iKZ(^P).\DZtlK*k?Q4,޶-2{sZ7C9UZD&u‚'wlhkڲ&^ s)yOz"}sla 4fM{!8i)>ToyjS3tC]1hBi֜TaŏU-wXjZk}ye*sԟ9+~㲝3Tbig*Qћ.jU2^in,P(xJw2u̩GC}@3վ}u:*\b^Mum1 Lzg\Fv-T?\L"[Fg;qB#=@HS$u/6+hlOJ4}q秫l\ã\z]2! lR|ZE=Zrj|مLWDE*!"#12A$B%34Zg55&rxxy_=RX6 V4mhh-Tt jɎ܂Ms6ij 9b;y4^58P Uv77ct&мfĭ!k_%Ws11,{0[# 춹rkL9H̫&1kF?8m񵊪GR./=,^DkC)S0 :z ,6|Օ鸲qEIA $dS>g$)C#) Z[yv5DV-1Y-)LUEm +q PaVXfbӨ&2Ukv+CcXO*[b' Y v1k븶H0ܲڮ|~X'xrxLUexOa NURS׎i,AY'IeNN$Xs5Q{"X|d?ܖ-W]n1wU^Ek)'V: y5|\Flf!1$M9Sh6e2ڨ)X @LFO\X"++7*g 2I?̴R nEJT.` &` -jIhH=JzV^E>,3oDkFTb:m (6boȷ$ śUE&aLd>DF620g-ͽ&}pb ܋? rX!h%n=8TNgbǴeXF)yH9S3V['0e VV|rL4!h?euJ_Ǫ'.^5Pֱ\Q, =,v9$f'a\{.6E $+xZIl"m$E8IEpŶVb擞tGk7`wA\4X͕! ӒbknUUʬ5Nd<<;Lm,>!`&kX֨rec*v)3ybi0vfiaWq!9"(c٦\DNFP`xԱhĠ9`xV&b"قBer (T'4Mc̐XʋUw|N֍b꼊[Nҳ8{O:#[ƽ G1mruxÍ]Pk?/F\&ʹꯖnfq9`w(WveK#,6U'VyQdzHq r4q~TP!#J AP@r0+ G=' hKT,:s:ȍQY#Nx\rٿ=q/fhzťRm]:Y]wJS]d ' Ha੕Od?TV,J`o \'Y,#^y*= EtYk9܊w&/ay*D1%j#|kbYFh9#֥J$~%osLlܬV\%pc!.XZ9;9c1`gf`E$"MMS:35[ ܋+yb@*=#_Ƭu OS\ť" OT Aw! hB!Jg秐{geұSlf# ǓζYSݯj7m3ZҮ)pQHZA'+37 MF`(эf(kL<ĮvQl57"ǞA`n<ْ!] W~!<TO6ŝT(I{)fVcb،{h[s?3&BžbDLlԱgd .-PjnL-eRwۅՉJDeEe(X-?L&/p&38y }7'IZb:fhp0 e+ I׉ ejVul5 aD$s4[emoKzLCF[z|&;*A-U*2,_A߄)ť₺W3YB2ǦQc (Q%]e׭9HhVϦdf{[=,+ԛ'j✟ɃbcA4_[!LB :W3uNN pciQوjyZUf0L|ƽ{ƷEnce,fW,~C'&-neձ(Lш`'[׉!+ZBدī|j UaP>{pJ`Bbu?WuLtcֹ]Ek + #Ҡ?p`zXx(U S1}D@3P!@` .S25KU zMEmBfaA: S#&k{RCa+ #\v.65 .k+Wu7i]@rl7s-xZy*٘nC|3eDr-I+]"]'=Zdbgճb5j+ "LXz^*]Ǯ^/[L|u"8 `5X0$Sl͓&7R44qՁ";ffi;hXy }@P'}59%`E;շ@_C-ga g-ȌFU6?˰b+̳(;9log)83!O]80 =fTSTw~(0|3j݋ fde+ %ΪjTB\O2"X uq$"?&HVye$>rQT0f j/u5$WewY="g&Ɗjx"3οZnUj2DA5j (K`98{Y14jZui&%Tu(L Bi1;ˡX oN@Msg: 4P H3i =nEk3V+\OXi2xft:PhuƝX0&7I3xx,Ʊi7lƮęEhu dQ RMW9~:W%|uInQAсؼmVS$Da-dD&u"]FK"^2,K W0Uf: cq)::3P%*_ "WQ8./la_v7W\,]X;ox$0BB:RռZa'YRBW4\Ju\0YY5DML+ )6U?s˜i 3Q|m)X pL IOxN;q9<7Qe P %N@Zͳ=,&Pä bbYT!ԭlj€+Ֆ1ke+;|] YYlcf%@82{ez0QEqH2ϭ!71nc'3 `1nb[Sg\v'DFЫ4 5*m\ Fǹq֩FaQEnU-c昘0pzqejF1 0c E#TB¼L g,+Y xWHYa"yFQ.5[*oЩ=$kx4DZaЬTyj3_zU=E \lc\ЫdL0#+,N5f 4$b֦> RN0b3SD 8ZQhE{.O˕UrNCE^BWltdenϋ%Q0֬ǚ  pr bfyu1X:)Em!! 0#cb[4J=2hY&ҥFr&]F2J2+.x`PXBŜ5xi\C->mCYϥ~gE@D,JдL#H36ئY˶ȗ喻y*?刡g VY6&T܃HZzY+o* jsSxԋ?{5UxT]e~: CWq+!+Vipo(AMkr ]t-bG"{3Dj(q.EO ?m@eֲqjba5\)^NP:f qgd Gb¸0!(DΧ~A}Kh]KQ0ٶګ[].eb&_(Ms-^B5Оa1 gYVUy+,!nDlGhtt 3``#8BcǤ/aT E"v5g5̓>⡜/cH)XYMtsM50%,h2`1;32F !<辀T͊@s Im+Z^BCtVKek+vmp; e;O\ x&xtut 5F8TVSBPBzOWlmWrQB?~h߂S C0)ubkŁmb$[h5K\my[e*Odϲ3a> Do#`fBq6fn@}͓'$LW$u~`sx̝>O|"0`+ &zi1Yê*jo3Hhί"S޲e˩#Ʊrz dt}M "F`fPeͧۛLr\6b;.PZ\C!eXɫ1QTk-l6Am[tkXjئLJx#gz\O-Mp0Be`mV~9je<:WJ7(`ge0#4`39m_tВ%~Cj{魟>0)ͮ5dLIiR*/`ձ/!{]w*Qw )PF/^FND`NԠ D\FKPLe[Ef]uFfOm23lO,nP@<꫋zءէٞ 20^cyV0BFja^GPDcpXnJ'9Uԅ ^-nfzvR[%I.!cBK{7fe}jRjh0xU+`(IY 53(O {/*Aİ#^탇BdOu4r2܏USiB-mu]!ne/[2ߤC0:VTˏѺ|x+e彙vY,㆞4L$ۂ,hdղ;U)Ə1V:F`cɬY4,Q2J҆tU?*A0R>;N/"?jCS(xՃ֋ x-pGULBk3"OUVx@LQ kj_VU$iFL |ըwu`c)rO8\lAŬMD$ׅSNKy \NUV}5O>-_EdG>&+e+W5e7RD]gԾy[*0F?0bdBDLk CrvZb~0\zbR]i  z$X,a$3mEfUU+01i]+hi]%" }Bكʙω"aR=R15λ"^eQrL#+)ӝGљuk(WXG6#]-%35{ 3XRp|lg)|\5ba!` (0ɣ)h1d0`K]l 7[/f6Ш8/h/Q/1yF= #zq-z6O:rZ,&`b%c_rZTZ?%̘} ]ιM<ȋd-p85m`DЀ&6qWeR5a57C XJ15׎G `A o3ϛ!HG( \Xm٭@l$Q*:hS`n2@ňΡBksŁOph+D 00 aǻ>;WƱ#V~@]}7|CAkrYqKTnkrš!Pr@u[#, M~"}`?mԈ.̃cKɜ̰, <%WbM}cրƤAPV ZuxRMr^fK_!Eka:@\Mc+Cm94',9|͓<*er8"fNc+i\ Obe{30pVh-V鈯鼉J:8|k'X Q«6Q25ìٵ ͔WaUX Ek -VK4hC0+ ?Zn+3gQ0@mm%B,Xu L U8!rA >Dc bwQ q+@|V'bGUll'o5ঈf*`3 00c=5K5ˆƳuw y\Il2oI]qඝN5 &9 +q;5BL[0Y#OB̺ͮoƪȕjMpUTЄM>Ȅlg V,`OM ? vř  io2.V #kɭ} rhry?T <<Pqμ3TK?7& JON\^E,èzP2a݈PzfiHXXlкJקN]PHȣn3` sǬ$hȝ-t>̀uTMF̨A2j=uzlk=L.Fg LŢ{b걝2끌Kj9>_Ūԅy4,<3qؗLaj3SG1gVﭡ>c3gVm>"j!G\2NjihV3rG?5.f#y#(u.+FO:a£d*c'i*.Qͼ|) (Rb>nvhRaY$XoZU]1?9b8[)15u{ns# 6|kﬣ gS`>*6vl^.%(%Gs@ݾ5YЯKR:L]qRxrˑ%lG֢[9l;Ĵ` [AqV9+`p@j DTũk9)r- eV\݈օo 79%0?ylW.GC?3? ܱ+^G 'b*}o5c;6m9UK T q4`I4p:1k3n[ yq;!NTJЛ%荈([N Z([3B BgE+ EEpU pY)E0'g6VܜH.0tqqcaאX)H9Ulxql 6vAq+ lJRL4p: "Nv/4pнO-f[Z?.plCϕES-,Їn&'5u/m`2"֢?!aM]զ?M]+xJrQ3gϱ S@PB+xxy5{W=q+.ЈN &!F+hAN=Sfhy$jKR6fc2^L sǪUlܫ fUÀ͛l!uv)a-XxT,Fd:&t *ȅ#]b'S_k{;1[@\;R/_Ʈ]wƮPt#IҥHB{-j_[`('`iѼ^?Dӌ-&ӍlsR2Ek|7u%@[)6,BF 6Dc@+qa%f $4 a(}QQ!Kl>3t<é#$ES`MLı#-fT|tܔbXk&U&11ux:vUVYiYL*pF^3A5H5EV062;$~RVVyNEͫ||^9Y`U-VVƸmbA~lSBLn=-JjbÍ!URnM@XA`fn4EfaJEk #Ʃl F*l n>7oԣ0V6HS믛*h%Ln,Zet#{&̘ \,)4XPkL )lz~ qH3fIy;ufXChRk+IS)XuQXnRfK95ˆ+kN%!3*g9A ٖ7,V'$:V%o3fi48\뿏-RX;/xMtrm_eop+jX<~@k!K08Oǒ,r*'lbLxPl#1RrhrX9{˽dƧϫx_ ֜G WVĿ+G#c-'jkK+S[~4(d.#`~(`ʣ Ã:եuVSn+hpLN]Ps(nFw{4[ DJ9Ud1/~FrsZ킸*GdwƏil1,9r#\f3:ESa.V܅. V+ΎEMv^&Y gIOd^/gg;1'm;Yrh @lWQS[\umv3Z9W0oOuLַlKhyX!׈kQ<×Fq8AĩU[Z3]"'89zGȖF'`R-xeT]rMt 9Fe*kaSRoy;if{|pBYm"] G&&{L)ZƶrUc73[R̊ɛaRNkJEoү6j.bi 5Z$ۄL\7@z>VV:W'T(Va6H jt)\ei.ES,LT$a i`k5>Տfhvnl -u:* R5B,UH+n[)Y]vZ-iC*%l-`` Wd5 Oy/>R~7\ uj/Z -Ŵ%8 OA#C?i_R-M@!_^ EUiuH/a0+05|z⦢ߴLJ| LgMgU -0P_rVy DSKם!.X(yqxT.Et\nEUEkPo~PwaԐ6INQE 1Z΀" 6;«PRkq[YRZ6O3:zhRiXPN_bRRuf/f<-$cd 2'1)/;7 ,sEGɠ AY%A_\uj}Xy ]+w,{sbY4le6`j _ɧ/V1tX 0/эvmPE}zכ+rS#ǍR 8s?g I 5-[],Uc\J(V㽐QZG 6BPٶm )qOYV_Gu#+Ѷ@Q[T@FSgkMbyn蛕+s2'efr_yINQدb4ݐHg`apw~ٟ:^9 e)b6yfYfg&-m*P$3,>=ߑJy5zܻreCi56|3D03*>CZ`ZWĩR-kZ3Z=7M&b SB1D 2p͉0V_˘" 2c%U WbT1_ikGykKz1 STTǎJbܽJ!}hhX(%rKHoU>Hfv;JqP Yc a_%2#Ħ:اFN֫Q¼2F@$ܺ/!.}5O&ХrTM+in5nª.ni0'6 fXybE`w Y`4f-\Z  j e?$um@EɆ3)Uť"\3rOf/f*CGkVT!L) BXzMTOKG UuB GYT \z❀VlcQ'"-`AT]G +MH, L `GDVڥE ¥)^I=vR P%-A[]ye$ 2.2Ɗ>`ݶ%1@ Nw[]2k΢gMk0{S wIl ;2[-XD/Py]5W,c.sko ߗK^%vx^]k\n-M\*0K  ҂JZa2r +Z.1W }8;+7`iIJ=veVZKhj!T :(MvC_HI+3@e95,DFx*&RpݖDncUvkQ^Bje%c;%(<JZ 7sDul-b.©"Pl;M荘Jl6LWum:xYV%ŻRS d$o$&W68 Y7,?"amZWUeL-HLXܫ#6AuX5%Id<21ד-!BmG-[4qwɊm.'(+f_bVF .s5]z1QVlU$3 R3z?nZ2EdGNC9jZ #2Wcusg [-lټr9~+-iܴ^Xo<=Vįim[ԥv"Ueayac<r#6*Q]S#LvUݧ[z/YZMB>hR< v*pIy +KʑSQ]75!H][,#Uc19Z56(tV,P{%VE ?;.g !D‘`$櫭ܨvh3gye58jUASSPJa08nK2]J ZmUA(Ѹ%^ֺ: tڭ)į3R+ UZ8ЗgiTH#o X&M'MWEV=ܖhAl-MJCʬ[;.DBFO#lTB {NQgeky39]Y@%q޹W#]`C1-1֓9 2 \P|n:y/:CT V ˚s !UmN@%LV{o%]8[4^U;}<ȱȲno8<%xJ<ἒ-x8jI/cGsƏEl-:^-b*M5z9Nzyt%Vhέ4,Eb-sKclJڧ #4iYN'w E.z(;pHV*حV]hJ!Q@{9bbV0WmvGr9R"etR֤ry;[|6wֻY]S)i֧E9k@d(q!S c,!X_obMAZ'ZаlwYZO+#Zq~L!!gbaSW)Qe1k[ x WZ 칡r!#5Y[H˯lvNb'mTZ!0,fZֻF#ofVOQeFgb;-T0ԬP򪭻\%/i: txjK7hIla-xXc)?"h_f+Ui666T*3/ʡq'5!jkx m8\D6Gsr)YG6VKȫ@RMGȻ G" k0E u&Z*3U0ro~ׂ֮P\!Cr/*܎$VHzzЎ574<^AR6փH+)zںU7ԛ)QD~"dP )?*c~rH*d@˒$Z=`0{[튳5|uKAIW&mvI]ŖƇ eXa3];1eĩuV/}UɩzK'gkm=lbtw^Ɔ *آyp&Y/)|1ț4Դ,:ەUBDprm?UR{ 5UgRW􋸉ٱ,e}5űVwe%Py4fɫW79~Beڋq3ұZEm6'|[HY. 2&#W[i@ 1Y-%r5 ʽ= 50yM^~A-1QeP,*iTsMdU!+_d;@.̈́3X_l^* Drb40puNĒѪ|QyZZ νه3Є0ە1y ꧒K3iU#0#Zܻ,Acrc6L*ȹ=Na+ddrp+VUX ZZ]m.So"k|R;/}N*TVgr`ʍ-ffV 6W&}B&hcB۱5[5rjՂp- ^CXlvFE XQǮwҬ0ۨ[B^R9gQTqoR^ RmT4n=LDMk:Ö}m5ج:6gܺYeQ#*C,PKN:}̋CÌ?T] iӡqtԐ;-#wa͎kuPn/&NU2+3DX bDq,0Q;0* B/,SrV++G bfrWOr'I~Qk{J֫KNT[p{7ޤrn04-Up:g_bt,j+Fs`(N05.J(wT(ߍ2bZ\zeNbʕ+of>z"I5ղ q,*khXpV[ "u:q?ȵy[mܮm,l%dg`XGK\lqc .P\b?qBⷂ@]j)!1nKhc[̊yZ9k*~|zlg t7؊p g*]^VY'R-|=+Y9ӇF&BPy.Ur _S őxRs3;(Ls,2QpGk GdLu)*VbQEe>vփYȮ^x7[@B@QY5(kɊnPY=BuPuuK;Ek-mY/Z ww[D)i]PM90Ygqn _Pn=7v@!`*IrGDPuc6Q >HD<ɖP9vUh|m`%E{jc^Et+|͸HOp85M5)_ )o^5T`ObhGEOpY}[*K5B~Fu,%|nivrLfU{*lwPpoJMV\+[UvJneɐu"fꛈaKCO7dhZ^Cb#GXteg x*&"%haR31Qʅ5Zܨk2B*ci#mV9-F%@, [R SIzo@!lؕ3:C}< m6O8I[P#unqm<+G9/)IhPmybiXA6/"mȶKʵFzjKlS7L~MYa Lc`Y N=2.S0n1G!a/jvk>g-hҕaqҒt-R`#8%l aS._q͈ܖ-qHvRZ1q^x䠷+~Cѹ-@x\J JTYuU >=,CӞr+#^G#jKO'@]PKl.rXbLΣg-Qx d>Ծ !t@-4s CVQY 5 JTOF~ &0ΪgYpKkG?+m?1cG6홵S)Bif']Dpn74U=`Ĩ,*|N0>y%ތή&p&f̭*UKL,#BWa)MT|\ n1m;/;UMmg_3?c~Bq W.G`Nм%MHGᘈhnc g S\85b˧oXSs?P5 S,* xvҺSs w3G~Mcvˌ٢0r^ݣNȕ$P̸aN'I0T6%1%cL4ikƳ-e-/cNWqʍ:jxAЙx N;E=C U V?UofeRG6']3L6aX@^W^A`g0b̚ WiIhrezCbb>}) ?;mɬD !6+ϣUFمm D6,du1fhE{(YMkh aGZx5UǨDR kNPO]da5g1&.E<4 ),qW-J5yɌ#lml§%K7#8|.emf'Y0Zltp:yynU7xqGȭv(\xg[KGփW/5$&S4S)ųV!'ֿ]ƱƲt !{e+Zc]f̴;XX#Us8mw 0$OdH W #1+1۬K,b^ ] 4&~],cR ^=&2ڵ&nl m*űa7eU Z G>8V5)Bj&#螶ԣd*h z c+L#k7LYaHn3;8=k7Xk@gVbngu@䙇'9o#;b֙0=ŽgFjQ8z ՠ7@s * ?!R.NLj+& hѸhta=}8:g5Znd%jg^!F[шmEK5kygRWt3VάC`4-X*xS[rBE&`*jʫ]p}^CQ[Law3\tS%m<^4Zv>ZFZf́APbbF M886*mLLV Ul'M2fao_,nc;zi dpȩsGKvP bsn@f0~TfLl %[hRY:uy B1r",\YpĨ={JXih] *($22n5yu4AɕНI}=qW*3MQ6%I3οcw ^qZEv. rzY *HU`kkbS 95hp ox+,ςCk,^O2=ʱ]a ܉;94>ϱYOJ@eEN-z+AmFFMlɂCzi Ɩ7 58lY33OIo ;Lk&rTZh1,^[fkY<.:>R2Tl(5ʁd7\b}ctӓd*uyJGHw&u: ة`@ʭfhb{Mj%d(q++܊G"@`ZxU ?@چ=#3V.LMT*U~tEX-Ҙ :өL*2Ĥk/5Uf1H܊h XX&'o g|K `kruF85dX0L̡Cea-04epݕ Մ:&'UQVS4D{#mNJp֘]6[q|(=p'ZX:j*X'V!%i6xl-bκqC6&k{hU$RWs\v5bPYXŌƎ=8ZFN<,cx5KuYYkZّg RWY܉PpNmk34 2Hև*ՆP{S!s25[uuB.F‰Әx{E&k&B2SkIl +FVp8lk2Xrlׂ.ъf:x ,]^Oqc`T-D/Xc<k)0#BCҦ(E6t]?-8Ǭ;iyFiZ&c-WέE]aOdV`|F"^ĈD_ ;P3H/*$%c3*2بK"86ZlV5fϬbs`5)iZRh\.J+>x݆R&7nn&.'m2[Q-`/kk+5MPeMj*{ehXԣA?._M-#3M_miR(D=QàƦeMF # CmQcԂxcT7dx;(,3hb6NB[BF%'.yU#14hp`Q#_Be3JЄx̷SkX0֌:Cw!#HxJl~6kXf_ɂU'iG@t3Q20H!7<,0 #lfY lYŶC<ض]^@' ݗ&*;KΥxƌ!D>I!yYk-bꬶ,@ݙF1λWǵ#ꇨO<^)aUH^R5bt Ex,VX|4M9YoQ+Q#F;WD‘*4B,ʋ% }DPb3fަ.`$P H$6bm=x )P w% >m:ˆq#51nK+咕أQ-bu+fqɟi=j ỌT>ax֪TՁ^(ͩ|_!͗gzk& bԩbY-.g^ȕی"HZ(5eB%Kv3re5r{@f#P<xv> g$tqvmf{Unmd%nA5ץ2S\,lE2@1URǧckUV{+ɑg'aUXSG;53el.أ9#ΨR3M,0bc} VhX{)XBP91mWc{t߱Ձ—36! Mű`sl ,Ij2.ci1I&q>GPl1I)~XX<3h^˚u)8@6al?"(SĮb-bƯB'隸p묞έF)N6$R1aFw/_Zm]a3c{?$v\Һ[i@e6hlU+8-Fle{5WcnRThJf/,xUհḎ[ "3̦)L4"\egݨ_v]:xAE*nM4] WzmhKN=PǦ("@# k Q"g+<tUoXݬ7cAd &tr[!s8@NG&/*S[[ڦOe㸉X!vܵ\ô8k qvqJxv@j-ՂS,M5SXO% ZWIU6qxS U?o&[*.j\tq.b1v>?# Z*/EP؆ TC`#vF*@ᷰ&XSGuGKw5VW;*1Rɖ]v5i,BF|׌ ^EŋIBBNHZjIdkUulўłزb=RrYWhFZ֌,>x=<|cRRZCiqY"u9"a x ^j9pf"t^kU- +g(6u3OrKPjr'YUS(okDֹ ,SJ-:qR6#)f Y3_e`+#WtjȈr+ahVL2T*Bu+, q+;G~BY3XqɱcyKJXiUfFSXo@ 4FYDpn̬K9A}~ۻʝC,ĵlAo-@f-\[,R{.@.X] ]TO+$ίzMWxEHUb!TS35PG `-<0,^&Cm〜&{h3!h*\AnG NBVw)e7L<_YQ)2A{%n d(x^Zݜ2Z'g7#Tq_3(Żc]V)@N;mQ6' e5JӌԅNUR ,&Т*j}\uoP_bo3 0CbΌq[ !Z|$rL3fJ'#W#rxEwbE#5uXDk G<7z 0k3V}Ђ|Csgraێ6M |t+3<qPhVcU:Ѵj OXӏ s6ⵕ۱ŀW4m z_)*wJ*Ǧ?$ D7w\{I>hڣ{, o7BȤ9bPyUuߒcfWlr;B@v(=$MazHCʑU'qAF̰:v-u'`׈wƛM, bCZJ̻;vcS:0xUcFF8,JsB*x mM{|uQ\s5RMa M^CWL-kM]aS5 KJ@vgX/d7'6?*oiZazE|7 37Xl;2@Xx48ZGр6؃8SWV5>+ Y0J(bW}V'Y+ɫ;1a^ǥ޲9/= ڒuQ C=sD@ޚڛ J-'P##U; ٷ`;E1T,.& 95=&l不VъVWU:Hɴn-F"Tַ jW;%V XY" Xr^ VJ١+43t=Na>&6.p#Rlu(Rv֐Pcab[c[ ]( ȣY:4 /eOX*#1lWC|ەKju ]fwr3j|WHܷa(-;1<\Tn`ge+0wPrL_iʬ7#FZqiX9)XR 6,,? ׬Eع qjeq\~% ˯`3+kted4<.1m15, ڲpnKj"5YG3"ʹ+U,D v\0cG,;`Q ty4eNբs+Y|8, 9I8CY3&;kr`b7+B˦cNM.O 4XzM0yDiB YuS;-btoR_Y&Vd^Jd|א babcra]IƷQ+c]b0-1y'%˙qvTbY$J7?aT#MCqs@u)~Cbf,mXZ"[*cMmł61`O{'m6DEbKe֒B k @bՆH k)jİUkj-/O'=d`VsqmwSfV:q라kX$)> 5"BUZIqk$VbSL1B3= pƳA T ,89;*euJ< [zݡTsr׈h =2[ lQh1M(I?G'фJ\eCYdJteȋ #[#-2:WلA%^BBj k)9ZY5,ѻ&44̳RŮXw378K"فZ܌RKIU:0=:OyB5ǦqXMFvZn= 3PbY[AOUA.7;S?4d 0ܕ= STn#bd@qT1@f< ^Vo'29l{{X(>GJZ&ɋF3H]wb0Nynvu aDfm fN,V2%V^)M,3gAkVB^zElU nE6X٩rЭ={MMX1U5٫0cLr& Rg^z0R -ړ&ȦlbIXn` cYYRWt ֌Z H"^` BwIBஅW7VUة0WV#vRC?_bb\"µBHPRLJ˜gTt1ؚ8>y9"0& &X̚vcY14}6`PVŠ#fTA,safZ:jjLu^LVd3Kf& [!?=UNruu!M?s+Xa9&h&a 0 5KEE\Gjs/_!mUxdlW5_a @ [ z.\mPb;X6XrIFk-i0v,]6kMՐ1YbEkǍvY@v; rH x+ 9BƵUͬUNQk b תUmYK8fub=4jfeUS7ZiԭYm9C ȀlH.v/c xK 9u(b9aJAKm3ŴV;c= uXĨWȮ.6ek@ Ԑ]*`fCe-/ dq]54ў5'MbD[hcYzyifL]:rU"7(}Q6a -uevV0ױA~[CqPݺ5G X;Pj2{[A$ܐrǻeUO;#foGpy9hVXMԥڎ%f,N4-qxulMȋe\=6ݑ2DQl\&9F21%@2wB%FળUEs9E8V3F}׼(gvS].k ,IVȪ(&[|`fl$ucB ٔ;7|՘˶Ac: vmvBr2&f݊7xZ#c6a #EUHEzIU;ׂTְԓ24imSϕE X 'cuǀ2Ϭ@&䁴$!&:FN'KL+AOFEiO#zdaCǨ(Wl>" ,@ _"gYb,$Iq TNs?@mq60g%.m +#u hϙ02?(s*TB>c51]6YaAkc[H,fu'a2;Gě႘CʭgK>؆)W~V^#Yفd|\P9ɽ1K&0UhMv 9D+z\V23)&7s2M`i3QZm`bj@]q X7DiL~M@/e@>39c6+dkL&VCu' aӤT!k-Ȣ.(~]kU*Já>q6"z&ahh'Z'X$u^HiX ʪ3j*{O1q7s3hj\f؛6o 6λDo@qk1jUYôT ĶuyNMW5Uh8mxMpJAǰar8:O 9 lx*N֛WV*@6W 7k<5KBF,G$b•E޶Ӧo&orag !croֻ9lNgzؓŮhDe g^8#C.v(26WNJ+v2HjQ9j2zj=&2$5'@$ԳC:*~C5A0P! ޥfARGF uP@9WͬcXD6F2~ OdƭN'3Z'g4M =U78 ULrC(XXZ\_I #3lU"hd$c1tReMjU<|j\A] L"dd + ZCXOu՘h95>515?rNZve< Vz\K_bxIX)51+G,=~wU[Ϭ;Ķ[` uNڌM>giT#iE \*jgis>0af!6 %#6X51S %lȬ{3[ף1KB6SA \b2 V쀰۶ay "`HR۲w!|gլلgW0ʼn6.,%Ƕ!Vgٯ,S:A `jM- 0QZRVmU}mJMf: T>L5jMfՌ=Abԋ6\tbNX(*Cm\p@\$F-cUX|$. m]+\(c7Y:׍ҪJa g(@wM[LѫCQL- L,Ix^-UΊsO*lYkR_h5 k/b Nfa|K98mnƈ,S0+;Dz*h$i|Ko`^(M Դꩀ)05M2~:ɟGs%Ik af$8''%y)B;q@jGnO?Tyb͘E| ny c6kpvV&8#fh Ubͤj·dvju$r .ڰ80`[dTUXAT(a D)3Ǒq!.20~ ܥ?8ͮپE+`VhaLBH'G35 :&VՄgBZ`L 'Z(X@E=1X uBvD3B! `i^CfzǮ8FLL)9(H-ݧ4f,.@b&?`԰ 7Tސ<+ $ huְ0* AXuzW/x$ YjY*e:4B'(4ڵ ブ9U^rYHfTBkui5Ůl<:D KOXxPMGB0#WD9CGt 0B]ŵk0@( ppYoD!+L7X%j0 mԹXԑioN,(aRPxi\-t E>ƚ>xxqbNJTA`^O iKAsF3] 5QPAѨUPI5:"XӬ9|-,E)lŊ2Mbj+$WAU:z,(DMv9e3FgXȩgRU'RaA5a3C]:M1 *b!!deZLm:5"j#*7F֐`)\δYflk?M&2Ј:N&fU5+yg'Rz,gXzRo!bj=yVU]P(?,k`0&-|0q!*d ,c1 w#1u\?9a`hŜבlٚ`Vt#E…X[iPFfT}(a/^lD˘0m?$IJp*U9Xo(;l=?DN{Wh= 2N;l wv/= =uAke sY?Ov$VnH"ḿ̕'<ɝms@{gQ|otB]0%iy= 5? Pw3#XEy̶=!8ԳFwu=-7aM_%[ ּՓLvֺI<\/T3P"#l&;}Akd*XyЊ}ðjgț[3LTCZǁ7iZuC0 b ڷif'uȬL զ'Ghlbi] ;N#Ⱥ n' ">-?.X>fh!EGټ_K3(D?%vBL XpݕŴN؆S^bgr3Z#,()'#?~4PX#j4 Fkŵ%>D:LfͪZ0LM#+KK &#`%f0 D]A{kS]ռZhj+1n17%'bgA B5b2oqX3M` ffN߱7:KkR״ʬvPp3I+Yi$u3`f34 a⫉QSDzU?T!3v׷iLL5l$ЉӱZ&±s<" r=كFRyuʤCa4A\t ,`CT9t<j yژBp4L?vhmBS& fWQ' ݙXm4@ίZ°avU[)-X+Cޮs?ZwE?,KJ!0"<m$k6kHy5l tu"ghzg1Es+@6jhaȊ-eD[=jHwX@sְrzVl1kMT XnYsb L*u96`u{v-b,}f]a20 e@ &\eq34z؜O>gT bBN'uvY2L/]Nќ"|'ZԓtsZǡl12-=a`Ƹ$VW ,naG~Ya(,HE&%CϜ&ċm?1P,{*"l1U}C$`h03ϫU8;H5C~bb[;a^5Pvp~apHvTh#USa.,I QZGlܥUmKU5ulb@޼ .Xdgb-,*&3?JD89S*Q!lF-l1\" E,Od ޻lT1g+e9 bXf_.T~KflV9 ?jUĮQMeAjLdm2ړnO_B,f&u qU;sZF5ÈLg(EawM> #3,ةI6SLb3ze3sa BRը*i#;l]E_cZ4TAZ&*Qt{++cXqۅQBmI,bpS՚u9+=M ulzZA"g! `eZٽM,8B:Bdw8E;66lMv"S6:M}O;UYpf?)S] ĺ;P6֐aa! R3.' *NpiE&OZ*ZjcrDVNV يS^![":>ų EVjf*;Zm^m>`$fx#p%voY&_²ͫ,L !h!b7pM X@e^[FRϴ?P٬F9fLb C.Nu#15X?bk;W0|ͽ3,{ruvy߰6C bzh*<vTJ guP1Bz\Z&ұt^$ξQ yuAL>ݬ9Lzs fbM43޲tl;]2YLaYfv`<6-@ v+crԫZcq<~:M H/2Ո~+;]c'3 CʝĶش aV=EK A yŵ؂qezEJXqܓ!֐p,,">6h|ĮYwG+,1\,?3+~Vַ6/Ӱ´Ң=ZёmuX+7"вj:԰2)Z ,,eRkX9C>c8wGuYvS \X@[lٳl1 ^3sz̡gJ՘+뇰X(qn65||!lK #X0-&eM >fi>Za[=SXZ3J+Ib6:=.ZXZ1K!ݶ'K{fm0 mUhǫ=KN : \w$IZ?L@ig6 'EJbOXE}jgCV ,к ` [J̴܉{'!53,21!XmD>c a*'fO*ɗ`Z ÍDZMVk;W"ߨ\AiK]#+uN3LduXW;jA+sГrJx$-ZFPcsv`n2@Hr4 B5W]-]giY ZBy,oЯ*"F-hdZ0C؋/uO!20N?k[ *-5 6T\1lϜIf3ItZ#3EΉ??`aa>x衢I>Bev*wX-&uW&,bLb62n`~UaBq+NE/ ∶P`>{"Pbu*M~5 } WDBVL9 W!DC-f*ԠNJgX/\}k@XIy6eXșS;)ײ![JTzه9@"qB}MB=` i f-b>"IaiA5{&CR2,c"NExIiX)Hƚ&hysJ3l M:Y㨅'VL4u 5JkBtZΌ!̹Bְ5y,鱹v%̜EKO&321`E 6$%xk;~K:5d̏}D! 38f&VV X ?~,Nx:Xq3$6 )gPb ǵaFl510f񉑆Abܰޠw%K,jZfA:RvV9ɗ?sf$`O;—N;,Ca8>-fkM13ObYb$ 9Jߍi‚N'UvEK7R=&y 4r"@m\xA1ΰnF ͜hfl1ܙ2Moh&fwi;-,3lp`B\>ZA{1׏;jKPߘ0]Ϙ' %z5܋9;=ܡIn\b,7#ګ 3q':,kkEDz|*([:bLz Y{@,rsE;@afXYen7 GI`w,{Q=j5#BɈc(٨Ef*֊3_fV`Zɓ\ӬRCXt R"ƣ֠jj!v%Ӻ`d_p}3ԅ##~L^0fFs2g8ǥ}C{]X0Iؓ}fۇ׍]kqư,M%8H0q*i\6{s -krü"@ExI:,f O.zA؃61P̠ ؆Ԓ~HA~o\Ss:v1*r8x5#u !aV|n:mDbP~XlIAw[ɲ$v-W91\bu#=D&h-O1 ˜NIkpײ0ܢV-K&#l۬Y;Is z02~[K4Iw,-T,5B&^̷X5Qtu(l`TSړ , YAD {x/[Od7_%Er0f\WaZ c71f 0ڂ+kE*56*qBFG2 `E]#!,HϬ3a_/YEױ@ 2Ӧqt`c*!궞A h g ^{CЇjQ?NTelsHj&[lG tZG!M9dRC!zηbQ%x+u5~WH+t:c&B}vy1#RFH{|m1V>ZO`͟!Ѓe&f&Ns=)mS;+rƲsQ]#i(d;̪a{ߢn~;PlƽO,1Oi&;+@ }6?6f, F.f$U[ $r>3]¶ZEm:f MXpă^U&P}ؚv!W튺/o$ndZ2Ty(Wlzv0ظU c+0ܖ)"6 U Z^ je67 2;LgʢגH cB{,m Z7Xv1ԛkNUlb_$bЙ5'f\)r,B{Avc;~g(M&24C5@흮Gr,A=˞eai)eVH.CCeBgfbݠV9$#֓J5^ӌ[N3g Ds{ ;fTfd&rHY3=m+:5:ְVa0~4 q6ǷZX"*Zv_ ݴ[ MGd Nа;1e!Ks;"BFqbӱQ;Ip{v,'ޓe( C\v3xxgC4Adz!mR-U@: N|{5LGXiR.hZ=m 6R斬4㖏SպŭD/]h4fO`;>55 ,괭c=b f&h`lB"4G8[3,aWI}O;f?Э'{0MؔaW S`3.v 1>CVyK'3(f{26-G_K BL1@(1q *36\ Mdq9sq6ϟIih5tXl'&Y!PCl[o0=kBz [މu`V46| ,fB>txQ|ru1kQ6b `JɘtOz8egW3k AfL1 C1uY vfA=E9,YR,qaҵh 10ΕIjtE 25W >b3 R`A5}m79؉1jyUggy"͝@3-f<7h ,acĠL(?gHc@XI5fs7zc0/51cwX2f"ILAI?SC jjji8sZf5^*ka' bmc^@gAbw1Plzz<_3kMf lfh 5H5ӟjd{980B4525iVK9Og) Z[yU1-;b= JJr- 98C!@l7fMnLmUa>16hny6r9yGIyAgfGhӴsCkz[$=l6+X׉gl򣭦R!ܩK;k]+lF^\56E(a1dLfoiьW%30a#a&*̈ǑP)}/2 m9&XmH;Dț \B+_Gc#j#R7$iHcD0k#dVlgN+0e*۞(HЋ\(1@4ꨫ;D3F8L.* ΢ciW_~"́ "3>6zc'̮aGi5\cXI iH+9+TS66N֋c4Vuy@lFc gaMF Pvcbg b3Cc--70Zxc}aճ6|vL g# I&1UMQ$y&6 :zBsl(G%=bf=i1bGZ T +Έb,"3D{J;̪`rKBnnn3IˆJT}04PXbjma%`*3`R i2 . *zlO7u_ōQI =& Ntfj4bIyAmκU㌹yg*¦ eUlTgK )4 X٩Y--zO2XbS`pK?#Ov i5bufE+FW>?PͤyhMcN@&C&c=sEh+!<}UЛ{cqkM=g 5c:$;Xas'1l:PũTmjYcBpd5gmV4֨s⨂FƋPR]eXZ?QQVbݵ+2@+ZFI&En0pH&䫲}C(I#0j`OzMN|I8{5p[)jtd={YGdìf5!ICq0!Ab0-4Y6&gr6`x]5XŃ3iSR: ǰA[jM*/ A酐X-N=I TiLJ͕TY\!fNiD37^HRkUB䌍1"=ʘ+ v1ˆDn6pd7!A&hkfX4S\8i 5:ev(`Nf0jV~XE\^_dZM,NX`0ưѸ`;)֊@3(&FCG\<EPج1Tح _YM#R ɞرM3eo!ɛ3Mfς7K,6Vu6-1\9>bd`aƫ1fL;8:U]3:>j#CN#j`gl/V2J`VifSW0 -I^@a]Ș3hfE &7S={gk r\k1@΅ΔO,wȩu5FfddGsu_vҀ鏬YΉddƲ / L^؁jř\ԓw'g۲>`&։%o"<` jc=c =c-e+3c 0iYֳ/b5~I0D,)F oCNʌl,6RJV&Pf3*× Tj,pCkLV V (өUpLGD=ڻ3VXbZ*3d 2F#@JYbdja,0O&ܱ[v|bPkn}pJҶY)0V,MFq뭡3u0~ Jt3LDeՠXCWYUVćh>C]Dp-\4 :W3&bj -5,F%zRBVwU<g('Tgb`8bڀc=cOIQ=@R|q YX1 Uv${͉S؀[i >fAugJdEɨ*CC:Hua'Mk d5\V&cFzjk3ĬFXQL4:fCRkY P`P@S51UV=C=S/SBM+1G_Tq Βj:$xR* YKEcADgWc d* CU4t1 BL ֬|uzD(egT1HH5\3Q3dX 5k!F=}XeQe`+%(#bz|`kem0UdDh'*ZBè@0&* xݢUֻX [ U\zX@C qMjX50gȅ¦~&{,gnpZ>e:Y^V0L3L[S\V2l+rCd_ -ȳ{ma^aE1Kn34j,Ny Q259 &o;!ڰW;Ƽ],R9|9g>miSFOSRr<Ȍjʵw?+'hy\5~s w g~CnLh,nJܷ` Dn-w+4|7d1a m>+պUXA s2a|1MJmP24 5s3TQ@` b~E5U.hbNz2vMr4[Qe|B\B0+`- l{Xgl-f  CpІȸ) r3N+.TMu#бJR3p d6\%p93ʵ. ES`$a-EKiQTҜbY9M}lk08W ZKM)ȮM) ˂NLRfUng}n_aˢ76;daJKl,٨W7v!帖!^knw0|Jo!ָr 0•?ljM5vuǸK踧YO}zD#Hc]uZxqFB@![K۵>jm$̍ɨ*n+^@:6gc 3]LPհN=uJ=|Dez֌,An#r_ؒ@4Ry9,z:׽rR[$kWQlNA5nR Hi Dz%Ubө}QȰǠA#%ފ#Q\q#+YhQ zÄn1%cr, 4O4ǬX~%\/ȢչgB6س&\,(ï] P>D5T4kA&*zXCܿ?5y?b#22aXxzj0q8tԓU3 oZ kz7!*ݸdn o .V챡?:cT6MLd9$<"M-SZCMf%5\&,Rv};X'$fFю\b[>S!gG\RVE);+%y"45lG//m|I/JYڊƮHL*&M+4\Ke\JXԛeq+\;c]%b:tD5+>5T&KrK/Y]/m.Bը ^.,Pr6O"ku]QWb-oMc;Z , ȰNƻ uSɍɷf *a jXD pa{4*9o({eVʵk1;XY+'&c*#]Xw qxґ-W[>p0Wy kDkg01 X%ٸ[ᢅTJ2W1 T%0 !TwPrOzVPwvpS\$xqn3ǭaP^GکWajR5hZ-V} C66+1:wkAJu@̆Mmf2ISVe@*:nzL&2u0 Ϣ 9l\!sf e0 2ZmX$8e ,,B˴EY5Yάd̺QCrw|uh g4 3͹B=֩^MoCN`rL[,aϽrnVӪ6Sc`ź*Ayy/$7W,܁%Z꫇1+jK]p]bQ\ qLSS.CΩ%wG m*Yi );{q.S1uMdW:dh1 <3:l2nG=4aRg-ytړw:Q _5 Ht{6\Yy!*eLb)>vU6Ucv*Dxܗt4j!؃eLˌ(jbҹI׈-V*[TnMK 㶲 h!e-YF'&zqSȱmU9M?0/FaxxU =l̉ ֡k|E7r jr*Jjb|c5v)O2>k-<'U0\ǯWYS[I11h|ַa~g ^q4%H"yuN7;Z![TO*gk pu fv݃Wnc_RӞ6t-XʪW?ڀvTkUSq^{Y]*qRw>L޵նmL Ę,҈`Ԃ1L GjtvRl-V&[x*fTe+a էJW|##Pv^q+n&6l.MQ. NNV:eR聣&Su#3ZE庖e"s"Woo2Vyf2mIT ƕ ^Qͼjɪ:;2"jI@~XxcȉǴqʰRhB[d>G\: \(V-O̓Xl 7PƫA|'8! ^5> ʨ !? eXo¶Z7- [80j yQ)c0&"VcfJ5rtYo0a2?dۜ aUb@+1/"X*[MO7QP|8$YE7^29Uϧ:x8{'BkSS=^TOEKdm7)1DjfO"0:@"R ɼ4zFvr"]h{}7/҂fign=_X"H['[Ś3.Z`zy kSyLI6G 6yC)kX1CmuD=d@CŬRi b$)/%:/eivZ̠M-كNIVT9 4˺;Ϧ:@F> wyjdaTn lMKl*F,jլKmx;h!~ZBÆT@_Rm+H߸XLqԓ؍mLЙdm ٱ}[uZ͓Pizkc cW~p AP PaD Pv`fM& "Xy-+7ס2أqgIŇxD @ҾȨ1j7`fR]vlUc峁kT~)`gCy=U襗L4)B[rwg'*X{-c 7uaj*4`5bv,ZL[cev9&3zRw40u8,`#=y e6ZeZLIXO}Yi;'W0c%q>U"gn2=W %|x0>&/x+U$4cZ8bV8F&f[ _,=<͉ gz6טp֫؃aa0+Q7<5 M|w*7كٓe5 VT!1Ym "0If(dnHF+)0q8)K"Rug' c`x%:U>qw&"!˱05wplpb.*X<>Q;N1H-db53_FXRpJk{JP ،?qd]+7lHFGZW33JAr) 2!&3(Q%Ә+.Yf ,ȤiZ95W`-6W͒f35.'g3t64{9$ͅ^`|YZv@t-!mfWvkFf*F"3 i}5CBQ:P5fkSRuîB LrKwtQcbfVZ/0gw C[Tp)UW2 16HeZgepR1+\W%kJ%N1uR|frTr&ʋ5$< ]rQ* 'T\e> T :բSP" '1iKwɦG.fj[UVǢ'#;b06EhWM1k2ʬ%uLhZ[XcinࢷPXh tm q\eU'#C3AZs14&u{n%9RTrA3k&^FgVbFtP:lj7jXl80߃O!Q~%va|y̝uG@k C(3@3DMWX~BkY\\غUe$lo+5ù0:*V쥠EWq bv4uҥ,n^kV29Z #!ĩk@vn2ʢ_*Oj 9JfG$ELI#I\-1:Ƴ Z|aՠ~f^f&z*Zw1;7fijzq &Yc |okGnv2-»"([;B]^KF~DɣЯ%, 53OMeVגߔLP+lvHֱ0a>w au tp2naapU]ٳUP F Y˻O TKu3ͼsEuAkB^]K͔@5>j5H#h*ک ݦo0_gO c!g0 ,Yu"mdp'p'jU-<$h+Z8Bռԅ,)Hթ+\ Ɠ6ǩ+5.yOev@QLn *PT8Ő ~dMi)Q!P+RSO:ͪBƾ+͘7jrYPgr )R4xz PWȮLji`{󫭿ٙ(ej:1V?f &{3øJk /V*JMR R@Nk{5/,{ !RЄzZ%5q֒[X,RʼeK멲? Gcք<[_Ņ,s (43leԠ5ug[F@-UUVv)"ڡZRF jx-e3W SXܚU/6JKFZ5ꭃl5+؇2FpnC<h.`O:)FX+:s_ۢ*ԖMqY3 ^KvqhPrM \^%XTB[Ru?)PC:$`y dj~EgFMAtױUi:3IJ<-VZ #*'S6@]V+(BVlY;|8D~гX9e͓ѳ"ć~Vߌű129{^^?QuŴG(r rrG˓>Wq.>2rrqNN;B퓃 㵦AWˉQvB ф*#DoIK3}2oGf%z$DxXLZ졢rril^1X"̜O7b䐎K/ ,^T#>]ѱ"Ij$= yRYHZr*U>)r(Q60sGh$͵^̧LP"v8rQZ"B(N'ţLL%ȐƹYrK~9#'У/*(kйџSˡ_fCHIKz11ٍt>6cda8xĆ-1hJcfQђcք$˲2*2!m~-: #ƢrpNE-wϕ%)'DFRe6JBp_hdv}Y+rmlZvv$vI_Bl`0!}G蚒D%)vn)=DF8*;* fC$"V=~l;cJ=R3Ͳ̩ m YbˡHROk߆(Vą>QT"-G##؝df~*.I^QF&&DSD+d_ȬP|鉢oh9,9QEOHq(qكd8JRVcZÏE1h]#Q7(|Qe]CxG_jՑd>bF682I|QDkH EИ"d/ hcĵFJ}^S^3AؤFj}x݈s:fbv&O! QC+$swgŐilHo"Th-x$4K9E4`>4FxO>Ls59veLs9*ȱ;8[KiS:;ؙCTzb$`ęF--#($D{M_TC 2׌z82LČl 1D6Gtqʣ1Rv݊'C]#5ʘحbgDzB]$lɣ^#3DF>4>"=ݔvJ*Zd`≦_3*{dxF"'}'$hvĬ1vKKKOe{#?tgdaecRdtF/fI5cbC~m˿ ߋ3"̓FLɔUd&7bt7XdA?f(4Dɷky;#ORO/ qNdye/B}6NX8 qf?) (2IԎ_sD B#%?fQzOb`I#% N38r-K%$F)♎C GʱE2h{U1F%K!q%D$~X1*di]Y'Jīe__QEJ G^>x叿B%] (QӪ; gBH(lSCنGcNBEQv|ff[bY2c T$ФއE)t)V?2>ES.22KąCcWЕvR]Bev- E&%BL;f&6Zź}#"ގ.'R:Vj{(Z1b[CBğrq؞qGO?FIA*X:Cbv4d)PEbv&]BQǐ Dd̬R\آ)|+T}̐ݗB+1ͣ+l$(ߺH_2,2/?و㖙(u]|.;o%uw~mxQP~:ctr8+?e>_inkNqȫe[(oY*.#'bihqQDygǡMȒBcd,N&7ы7_1iz;6ȫ}hmΎ1+k: B٦(kׄ^_l[D]Z:%hIůIka$g*~GvŽ˵F%,Kr=߲)RDxBf*ΆR9%CHn.(A2reTdFESK>nF.?pFIbx3LOQ>J BgJעW+")jlYbbeFY6DѐՉE2(Dkš Cv&lG^(X~ļK<}}?ɡJq΅2ˡ6|_ѕc bc؝ fCf*^gBcb*kЕ`TQ5E ;{.̋:(Fط~ߏB<{%F 㓓#ɒ2-' XI} я8dcKf:e[ن]xj/Ĩ%"Eq]J] #!BČtcF+cLn̬tUvU~84&%KŊLRS?W6$->5%Odbzb;dfך()'csu/ rZGc^8mQQ$ \v|z&J[ JEHcw;['&F.Z>9qfi1o5t7bx Db!ƟK؞G+}EJ]+Ļ+DibGͯr_#ƬjВHFIBeёvWG"G rJqd~o*'(ֆ82K\'eb#{M/6"Fqq*46r38)ѐOv}T)vq>dxSr [dETbv%B.d8Qx;bVXbِhІŲz:J r(v'~ Yu[DXډg'yw" D_?#1#!ə7ZԈ}"t/䳾aG'^R[Bkf7%hGrLL.?FB 2^JYEe%  L\dy(̬L܇H MGU EGۡ+kQHh D|1x)twcإ1(%2X)z!pCJ2_h=l9?hiz9#/!{'Dg)v;>!Fz;CpfMxvFCvBF- 6QGؑ#{|s#ڱAqȡleFIXWCnF9YהS^R QGP؇"J*$c"9?.7I|~e݉dQM7n>_C ;69Q)Ҳ{'{E" d?'%K,ГhƆ;(K1E.JV)>L{ؐȬNq3%e?D(_U/Uj1B2hZ5bآ(F"%/ٍGex;g^HU *($q"IK-sR>\$fX>M6Vq*^BDd]]sol z5ZLςQo\2Xe/|i3ft.AL^f~D&4ƅh=QlI߈ؖ>"QLK[芢[29>5hF}?\>h\bL2?Q1~I"2U6 T?#dC%Xf<杋Rv>y.Sr잌#ْZ0M ~(˲l3C~lpKv=Z"%{!\x&[:EB'ȟfUЦX#J<2rb]eQ~#>D"CGDvYbw;Fk|>Tã(GdKDyG?1&GKr{?2s~ŝwJSϏ.?ƖlYoJ8JrJ*]>H"P.+lR''(coG!*+YDvQu\D9.)~ 't+Bv]~WCč1 bbF*gB1gʴف . FkО薍9Rdl[Wt4ceC- =!q-CUjx'|$[>Hn/8;>XϦ(R .%+Ӥ}OeI-m=}O1dz"""TeMIxRQ0(2-\rd){*5SDeOqkE5X&&.g;'bُ>'E,%1|R}!ppظp4|ĺ >BBF)"1FΌMx^,b՝ &HR6=xt)LM,|Qc^п*%U=- Od8&l,J2c< ?Pl"نoeCp_ظ UHR_OGܴMQPS)^=Kf$U(>=?Hôaf-vʓ+l`X]^ъ] FBߋ2ߊ1e؏dX&J lb9&=jZ0MW!K*C#%%]$?PěَĉcDz1R[2tɍh=(.\_Oѕ??iweQrNqU^#-tGw*sq^ +u߷3RifCW鏖CP٨G͗GԈ`Io.4L!-Хz/ge6-v= -V+E؊-_kv'GHjYeYMM GbT"x??'代d[+%>,lfq7ÊůBϊRw/[juϥi#ȸ>\ޓ1/E?&46>144%e1GC^ME= GbMxE[b,WeT-fΆ%lrweC%hLN3=#ؤK0t˗`ԑtO/Dc9*TU^GsKIz[%.O\T|G"7,cŽ?)9I"1vވFj(ƙCY7n>n/DS$ExCԑ>]Y +nԵt5P8T,W.G1iH}GHϵDt*,^ƵfW%>I)$PcF?тb>%KlhvWU Z!,z%U!dF8NRAeF7g^1J~L{eй] IG?׆{6[G#oiKM]Bژ*ȯ JFN]vN؜3>EX]j:l"{2C<#6J侂;[983_XLC-fL'bHb"+4lel(w~>EKÁٱE@WZ\6*v7?D>ڞRwqqdo$'_jl_uâ+\}ve^;Eʺ'&d<[_I%1;\(H{[Q0_+%gl†lա9{^N-.dg)"E;QoUdvJUe 1TW3wSvGBgCYf xdakX}3mޅwlNJ bG(̌Wh|O.de.U#6օ.14g\Ʊ #u_ظ_o5EG|Q{c.qnjR$RN6G=!r) ?0$19DYl߆%qv$ dBX%?ТمoS$WlÏkf;BŔDf!IYb1GeP 6&=,!K(ӻ>5=IH*ʦYFDL\SUY'$RK-Z!)O6.8q-dF ]eUcJ=أK-]lQT.T%9eY$(7qc2kq5۱h1\J BKG'%~P7r0|uc%b%].7% zTSRUbZEb|puDy/'r"^_qьc[(J^DXe?&B;k"f9eZ,rʅv3*ƧtQ[ϩ{:*ĝJ^#B[#&ь&(_cX$К#5ŒV'd`B=1N< %D|lDd&EJ|HJdO"Q}-"%?Z)Xe KFkĦ+(΄wTZ2ׅql^1-Й~. ٲZfHT1)Yyhq쭑BK57{CM>Acb`}0tşBc#+> xꇭUٌ`Rg{$.|rNOD}!h5Щŷ ىJ/n·!ќddz#ɻOdV#Cm߳ _bt9XѡI{ɚ4SgGb,k+*;kFV%GcYG^TĔ|Z(dF4GUF4;9We_:BoF.]K2rMb"J1틚Gcg|Lg WDeZ|-Y)J}~l2:#6M[+?i}%_VGedJB+b+T.wM*5-q|qZ2=v^l#Vēz١~K߇#&;#eWOEѐF^lO!zdQ؉_;,QKmMv'~bV$)hiU1c}kEIN#;7.ğb=|h GZ ٖ=lE *?U['*:] eئDAR#8КDʴ.%|IюtK}SE7Bop9BFL[whl/v&'"$v_:QBT/7^),OOEtw*_t5bT?ЋČ%$uG]$>G.U.r_)%R4GDފ N m 1= ^ǣKNǷ}dϊ[DMsأ] iу)[J3ٮ(  [>KuC)P%OًBmx#'7]*']khY~-MHM,[/~;ݗx{ˣ(nߢM1rW~6%ُIt'%9df 9^ɷ%JS[BPz:C 3o$>RɳХCoь(TJ*+Bй=$9&KLv.:ЕtvkNiF%z1]蒱)K\gޮ#d~т.+%tO$t)%賱ش^E_E ѷؼ4;( 1?bC)xvXU)1ȦK_ٶ^쌲)8BO.[Л}bR&SEP#"-=(JKmt;l/5+֑w7TĽ˱- +G0˦qpG(WbSBJߢ_ˌ];$FzC-CEG+'9.Olr[>''$a/ZF/dܺ>#P>;_ C,cHz,hHmUЖGEPye^"Nˮ~-΄:{;vF=I J_kM"c:Cc, $F񜐕TtpP>4Gz{zbDOin^NuX_8t$G\Hm\˱Et(=.7~%*S#OD#V^|BK%Уu/b&N|cK}"<q-C2buLPJrT']dQ"biB:-z6l[vb^S]u㡗ene_7se+k$ ܻTQ?BY>"+ad$Eq}3ȶF_iHȩ QHH*W%rDa)/%kdyB׭k=J"C~5K7?g<˔Պ*/Hhphql{>=1IORWd[{EJI&E;$ VdSeX;r2lW!#] v[GEŢ YſemFEʤ 9;;1Q˧DU (t44)DeñG•v#/Tg|߂'Dr~?g7oe.np$5Ȼ!clum#(}]K>oq ߱ō)Kِٓ]t^&1olMnn#C0F7ъYvbVvFe)6$]t9Yi ThLv*/) ׅ 'Тž"hrDz*ZElID[2llՋ7^ -9z0mKD8(J[cdd(IȒɟnl"zd] .V|+{| SCrM;,m}-#!|sؔvn(}l_QW2yK%qLoqyHq(i FH~*,MB0E/BGƑ01b#*!4LkI~ 4JXՊjEY5vPv*j)|d)t):_Whdy/O=%| LJC}^(8~,E1\de+rdZ{Cĩ|ɉ~Qq1ȣ>DG/I䌞$|O ې5,z-m#ئcWGF+KYJ'CrRdd6+*1э]1>FTm TNNHJX\N.^"G&1˲H؟M Zbf&"׌J*;1Vh,~;:;kQܿJ(Dv3۱ltģSM??dxp'D1G&']H߶O=ɭsNDm}ٹqA;:[I$$o0d>2ύ]!rI5L}ZIݙ2+Lm1FxBdU["~W- %/~/Ó^'qϴjD[d"SK~#rWo8hP}\_ ]"\?ůQNLFm}c^(LVK&'ٔgdğE}؜W}|Q_$䞇lPKvϚ\ZBrPvgȺIrzzv<=A~{&مt[}#8ZF1#tdQEm HZ(Z;4&d)QeEU##DQfb%I7Ф'Ct)eыqIP.W{G˗Ddz#dHRP(׮:{>B^(3H.ώfRKZb&c]3|FMvr-tb9GmCI=V8~0Dˮќfēvƣ8峓(`(\4՟2cu_̎^̒3?ؚz;?Iآ];D_b_lhCЅc~OdbR:ܽ"̨VIY.2#BoCh!ͦƂ蒔Dx}N} 1>4$N씒B[(OHMI}F-{>ґ)!OcϑCl>BuvIֈ)*%ɔGW1!G'Ծ #쏊}]&n$̣V6/J1rQ;4!" E/YblJ&7Cм}d :; e匴bؤߣ/U?s5Q_}Kf :##~:)rIV%фWxvuӉ&HrKIqC _Z3GCQ"ޑ?Ծ'HV./DiÇT{H{Ц7?TAMnL|NKpYt|Rc4ȪDRL·cپ^#N_hHR8*Uj"Vb$?ѿbߋrum#DfCLm пe|!mQY 5v~a}cx"2GDԥ=W)ƷeɎ?/T6Ec.Lѐ_BY{2#CrOsVg>(Ŋ8Żbmf#Dnv(ϳz?D"j,+x+dr\9OCO}(>̡- ;bLs̟F .\~(gd{oΎT]ض(Bؕt@ˆ-EBvPdfEDdM}ȹQv%>1ɿ|:ȹ]V&& vs)/ z1p>W%l9_Dx'X(`(d(#= t.+G?pDRq[s}W<2d“~ WJW _PؿDG_OD\ilF]"<<1^Ɩ»0cKb^pE. Qdx? XF4%eX$iYBTXbhІ%[,{:/ĥ[d+ NBy-QQZI6lYw˱R'q!7>?mСCv|SI۳QI ل_h_Z>3~wmkD%آ:[6ԼO1'Gl(>.z"MU!C#%kCa}(tJI{./~H=F٦}JKb)RDmuѶQ%*HDS7ؿfGdbS^lQzDz WB~?Bro~LJqЕ{cD#Ǖh__܇/dԻ"K:(Q(,1sgC{bCV1J FǗPcĈKF|x/D6 *0,K!e#&^]lQQrP'eФ?)(#b[2du٦&dF~2q?hOE$?ѢqμSdWt&]e~+B񪤴UCxje1Fы1{fMOl:K%L U}ݎq=6bq%/Fi,I89yRh5\zGdbIХ'bn?ReJ-߳lvٔ#|Y*!I3Kt).9DX?iN=%:3^01LMBb1gCGBFYtYq2fsl[챲ȱ$,Lʇ!1H;5qEt-uhZT;ec(ߺ#Ɏ#ʥe!_r_%do:~6q٨tenϓ''bCXODg&<[(pmb\P(hiqt'7(9X/fDh$?&lH-hHƻ)!Pe %Qi}5He]T/vW)WX̫t+.*ؿ] Ytf<ZN= :f2P2RKoN56N\IPIRtE3I ><߈q~GE Q.'#){bC.7_] F3[oB 3KF-J$(RRu쒗CD/ %lZ)b-xZZ1k(μ#-!~_2 U;1.*]];$UGDɯBجDct&GCbmClPS(p\||!+dvoT(pwBmDc'B~GHDi/}Oȥ%ff4Qz>l[0swctIФ|rl{9l+!'ΈG*cs$vdvE{bV(Je]qXhȉQ_# ($$U[%G~(h't'e""梭2VĒQ Q~%aX[SόqCṂwz$85Ъ&`2~)ތ"zԶG1v:z: 1IC#clHSS˔Х{>Eb~蒛.OF)o'w QFL32?b׋Dt`!l+ ʅȉFB-y؄l2WWŻ֏B=4 Mv'ɫ3УK#5ъ5|zIJxSYHD88&Ei$F=|O"W&C{|vC;ϒCW).CC⃫=9*)ţldzKbBDix,ΊFBeyFů ˯]%PDdlLrQȵ!IHǯ إbePdeBlL+/t֌7v=L.تI$B1CiKOd<>/ZF-x.K= /}n_A'5ޏER<4(S} 9~MUܿ[ct}K.hGBBV!+!G٢%tXv#} 20/WؕtvQЗ1:;^g۶eD([.;~gEbUn]*dv_\sHN ix@{G3y1(F ~N5] 1˷T(?g'!#H__|wpE6.h|iEgۯCrٟ'=h||іڇ9IkCRkl|m{) FTXte}:;1b;.e]FE6V='e(Ȳ؝:CKEQVB4%E!Q"ED[}5b([LQNʝ6uyxbMn_rcQF[#4~}([:B䷾ȗGG~"R2L$Dy:%_BGG)G}Nj!1Ȍ(If*Kߢ1][نʐ;yc2c?/}1ϒ]mR2:r|kob .D!N?X ^EF^"Ƙ9ųh JУ#^H#ǣc"=٣5cex^,O/7oŢ3R$BX|4:z3ò<̽*.dFy<Qkz鑃܄*Dy_'Dbz2% %f uJW\ 7,7/B"LݛGE٘E ]"\JJ4JQR? %:Rr.DbV=}(כGFLe 6%E7*˯ Q^ʓxK~_*Z%⴬SrDEب2DfWC{53̹=v&J:EEQm-v*rckrKfY3>L#oօ4ȑDZ(FM &m="Hp{#$SLrL/ƅ&XcLI]ĨlmНFBLBeёvQc:"zQexBЬF)Ii & جV-律}&.KS=ˮ&i M!鉩1F0w[mk%ƻfT$C=I YGұd#C&7)FQ^K%*2rSKM凡NHKI37hqKr)$MC1dbQ.#"ѡ&hס̿%Xbvh,В4z_CU x)B:6(EMYED~WF I (L]k/1Gr|>?ɗ ~FDl6G-3ǚ^53qHj,c蓌7"2WAU?ǎ1!t{qTNN)r~.?أFJ#E5CEi2R -كYj[ThIJ6_HɈz#GLR.ǽYBiQ!*;9R/T!*[dxcgBN TK2CP.NOV(v%Qr/d ۲rrͭ |l2Ufؤ|h|%A62 #t(ɍP;f#tmrCQ-h('+ '7ߋ-HыO$ybFvi Fؿcኇ"F'FAR:1kV%C~"CjffTlY9J?h7(:/1moßY 4KcK}KB_qM:+5jbv|qV/ظ|?A/D${j~kW#TH[CeVJ?d;NvY X̛:*)ؙ -Hv*2br b؎ȯ x7WTLSb=#z"n΍l{{*h6싓[%l\oؓfEBf̫89i"1|o&eo7+!*1KȢZ#lEY)^$SfԞ~2I$)#^HTZ,CF"lle32)Yvlb7BvH^sDWd}LRR]r}dʮqrp}_c>*}=wѱYt6h߆=\ˏ&E xugO}yD=HFYoiKR}=$OiP{.#~7dHe3%5:d QbI3M2dc+#LVS|.C[dtQR#^11F'FE~ 3DĄ{mً:*=YbCRox[b+} .5>z>VNWءŋhNe- HC'/Eҳoô)TD#윌F&2r]/#fuG3/Ⱦhs^EQEk8Ą=[$sct9iE>,hicVcf/lhKи.3EƐƌLk.$gIWdТ.:9x~M__c)(сYJ)G72^-x豊T/ʡע'EE"_Gbd[E2Л$22,jǡ2;͊#l'bb,'1v剌9.,'+FrK(PWd-9" bʣŤ5/OTgC~ϫ)9tuҿ$b]E(g}Vvw"Ĭ0bg%t/t6"F 'yF6%^-.&\ЋHůgf8_z(JIdc//%%%DǦ).&2EJ'b㮌 hrFW%5zѕvFK1'1Fq+:.X4cOHDzHȶ(HQf#q;Z"(UQ~-eٲF'lT)GbWYg#t&- #lQF&HJ^ KT%OqH 1 Rbث剆KFJf5к5Bkqȣ/1UKؓC2KCDRRBBE;:1r1k}&_!abUHƄQ$UT/ݘJkU%^+ŒQ*J}_Jj*ٕХEؒe$/#)K)TG']UP1Rv[fg?DLЭ2/3^#Et&.nD{Ծ}$c+3%+>d'{___TfFRLGO)befEiEBCɢ-b+æUHj:(C[;>j/f̥"G~:t"Bь"3~h{j}f"JhGֻFz]Su֢UآZEHzF6Ut})>WZ7g~1IKeexZl$&]-bR-6Xct$Ц&4'E""d{21Iطh(-Gf44c0E!E1F^ưD`P., \It|xEآ⏉4}D~<GS|lpe .:0+Uуt>6C*>:ŒVFQ0)FHs;lL;:0blŲhLY~5";h[(V4 :.Bl.#[Fl'#t}C/s/CbC̻CuѶEIv8bn&J]%_mzFNB.Bwz|De8ً.]T&v'貋!2GE6WQZnűx))_~1I~~%EWƽĖH_J0gG!h&9(?G;dg}w.$(2PI:%XEP#o.lHp5ʼn",K˕Ey>6(e.R2BQF5b;*^:>+GeЊUx7^/E-VdcHƄFvG=T(Z5"D'-',{Y>;V'[̩ -t8bTK$-[hkm+Dg~e:]6FTNciȲپbVtb5^2ıS.$eFB~,FʲlN;*U ^P;cxV/Y}T'cђؖIGhfH>Kb9ob>ZuC?-6>#,F윷^&PoE FRК˾=?fE f>šFH…hJXGEأ7HGDvbBWVb*6QVW"#QhQlT/.hb]'KfBw;$}HE1JTY.Ra[oJ^Nقh&{2ٕCUѕ>J.ˮʣ/ɒfBgfHB̑%GFV^&b:>^T8ؒdm ؕO! QCY WPS\i;.8&_w)-"*} bN]CJ⭗Sof;Zϝ%fy IjdAL`|e2Рh.Bv6mh)Kt1Q(HPn=.!kNT2eBm yHj1x6SHVQT'Cv6Ⱥ7!Ƌ2b(IˡKUGBvUoŗ7愆(E&E6|bĦТB и+l|y DPo|Bl|M||4|j= ֌ qA~Gƥ(i#CTFb4ccXF,K#,QR1EbQE$T_cdP5"ђ,^,!ɖ2r,L vX,aߊ(r׍ٕ-։.l\ٴI %͙1Mɡ\2c% 3fпgݡŏ*]l}Uͣ1lތh2rqccT(+"JEPbo2)tUCDcbToض96t-EP8lT+Ƌ"4- ٍ ߅Cׄ_C5ѱ%cўm{'̠)9m!1gDESߡФ~2z"ԏo/Ќhm1 [;V'ёy?ٮ.$V]v&fTebUb2f- 6Ri*4m ؒ,xHK&,}BІQoEfߋFI+Gf43&] 8ɘ!C!F}$RBf>FT6$St*0OU苢Li3wFʮٌQ׏j.&bE[ggSf6n>.ʡbLi" ՉW+6SC Dr.hȌq AوCmGCƬ`b-SIء)|){*"ԇ5 *;hwɦGǕ}CT^]OKJ=$al`c(M sP}l?SY.m :-Ȍ&q~Ċ6LJb;**#!S)bb(-o~2b(t;FO!*Y;hhٗ_WbХbCt]ceIJ[3rU5 v6*tr/I`iޅhGrJY7Ji7[cFW<]џSR,}DpKcؼ$tW1NKQ+!}"Y P6*c)bCO-?"%9Dg/Te"gq!r-FVmBBSF݋_ئvE./c#~Z%I_RK've9F؝IîaG<]QBqctj)We&EEuѓˢI˦&7δeDyS1/$NDd.RR!84Hs#>J>K36̚>C&eG|\ #2hRgdfmؤg%!˲쎋ctd)eFC4kVbQ$xwfQkLŘ q:`ώ^G%p 7SЖDxك%Q^ Gf7UG!|>>6dx݊b(l\ P˲r1»>'# `ǔb.3kʥؤneQʣ^1,^4Xů E^[xJC1͕/_ݗdC41!q欳lײР%P>;1;և!Q:>\HID{>< 2+J&6v}R5(tX١VF F mQtJCfVB ,HמP CfЋ(++՘1Щ t=ilhrQ#㽍NtEH$&f:(HR+Vf.ZBeЄIe+Kx~%q챯 cb:+(0H#(9c٤mك,BوU -Y؝ErHLZg)W4*˯XFJ[Eb$;~-oBs爹22~r*ɷEQFؓBK/E5ٕK$~)9v6WfWtv`}ِ"O] BtScllGEP2Ir_̯&d 6V$df˱D[d}^"9Yd~W+e /g7Do(c6EIvF$ڈ6!-"VkI!rn$(cIt.3ԟv.5;B~} r#:4D%)~Mћ%#mѝ6c,ɋ$ŝrQ|hz:,FH ,Z'!67eЙt9إFBv9 6oٓ),%e/ Tiѣ.*wlPQyq~><#t<؝•Eڌi:#J]KwD[kefIt*T՗إgɊ8ɯgʒٜeWع2CԊ"i Qʞ.ꏕ~ ܾN&ԏ'˽*%̗%lƨ؄4;]D3^˲BTc_(b(;.-~k"Y[,C|8I%gqM ƌHsFHX䋡o:54)YѢC3BRiѳW2!xr-#/ F^䊳F R..gBW˲Y^$d/@edG}>ݕ&ƿgGǻlrWeQ&J'B~lLF68^(ƨ^2иfC4;F96`!]bJ+v$(!:IU )E>D.$UN!47b,Ce/ȲY.%> hW-GLhOñ\Ovp1~4nv$ح}CVbТ/cR.6c;.( V΅R$/)51:lʍXBG^:ˣhG|tI 3Dע%~1׍"1h11k^;wᑎ"b.t(ͿR}_f){3LLEIUv^D%5))ttv7h~&E5Դ5byCQ.)ebF&(OFbw)W'- eXtvER*h{Fc6'%tFeї\;ёc~'>Mr.#zM#'lQ66|P'~ <2й/-#ٙ|}odg{2#fT ]d(ٷе䘹"N'1oЛdS,rͲhXQ_I1U"ĨV?,b# ".1 f"6oEߋ/u(t%BTQƬIq'%(c:|K!@D`YPp %%KC  Iŏ{f^pCGº>6 ..ϋi6|tE %׊Ec+"͛6}ixN׎/Ft?LrJ!~;e^/t/jʮ]:(lb׆}v+]CȒ?v)R .Z*G?RZl+}F#q#'D;o|;8Cbd%п)ع9N9'ȄGBCDUG^*t`λv`fL'} 1+)&d|$HVYׅEyWG|v/E3>C>T.d'=kt/g]~KtɓC嗳)>Gh}/=>4#NQ巡c/F8ė&>.OB53 q>(&8ќ{#( .ТIȫ0q+"Lɮ;#ʨsL|ʨP:'`㉕EC&xrlNe6blPgEX-ٍkq2*NDӽqO)v(d(`G<цKf.[z4KvajG#Ĵ9eR]ò<&V4o(Cm:"5f85ќ#(Fِ R#>I ܺ#"kD-Qʴ=C/}&b׳R}dbI.)td>*z*9^7%fc}(1FMO#Ⱥ-H3FvteFEΌ-ϐ:22'bCv&5*#MKqd&Ju-ÊCElŖ_ˋg4649J .yOr.>vCR{&JeÕ|TFGƢ|ZchY$IF.d8>̬P;%[]}cк%-͇JNI4)?6^J.h#]Y6L̨R..{,CtXTVBXDB:;òLm XНߊBv%/!!K.0ݏ} Hd] Hs}I5и||}_ńKĤ9b_ݑ┺tA|z8 E>EA:l#Ĺ{1QZ1>,tcdFk/ϋD%'آfp%u#2+V5;KDe*f֙8s~ϑV>eȤɏ)d%)vCǶ| bMDkbV(c$4UY/^-f-PB~DPVbtD6Qה`"F)l׳Љ63K_❝ytO˧F2OKTṈt2 $|i}΅Ëj8%rQF5!%ظ#I))rm} י:.C.U1}Hq-PQ8ge6[)ٶG^-Ybݖ)ФhN+2,fGf"IxJMt4%F#AEc6!xY{dEфn9Q\|ݏl&6h,#S,vFC] Qg#9Vƿ"TNtG% Mh>ItBRqt>L6ȏa.r+ Jђ'$rwTIY,3d%c`F(E_f(lŘPʄ%eFFkؙ2ʲEv- 􇣳/brԴ*FHt%G$X$H_PB]ǿ/#hc?PPU?A/}*)_v(.H dG6KZ'O/o+"(1vJ9_I(ɐ'%{81*0N4:d#}WHEN,:3>E.%(T)~Häf4!DIIE&cf&&& 8mE߄ƄDIЙEdUvanr)}- /vO2 KJ$7V4;(VrKN<%NR>\:CDrb}1蒱Ѧt8;ESjlg$q#?TbM_ؔϏ$K lIp|(OdghGFj>I YGGѝgBUOheWeClO(џDұE¤1*%JFjZDe)lMG\=+-І|MbL~Ec3RVO2PrICdx='K#P9".d?~c% v}J>ķfCɯƅQsI?{dKrPd9U['?,Ѥ'*DxcG-}h\Qb%ءBDE~ be#e1kH Tdد6UM!!f2~*>(xk 'OjD[kgɣIb5]7(*ۿУ%B1v%O>ύ3+ɾD]udZ,IrG&V.C*لRrK%'F^υ#f[*6CtJwwآƬpϢ.N(T U.+! тDov:xCo"ё E،إBeѕLX ^"?4+D]bRc}k8T$cyvQ2|=qEtF8_&# $|ڈpӣv*`"c\i . !h)&Ic(>3KI.NEXTBJDdṊW%Nr>F_ˌ]1N,"%΢Gj}l(|&)teBe!;4:1.Edv&X衢Q1K"bև ё'F7*$[+}_l茔+߉'衾KB;:uG(lGE"b\d>h6*BL:[||ƌGFv[7,B28-lJ'Ba+>;~B-GR,aM1e.ˢlȭ߆ʳFK,ʅоlEL"Ͳؖߢr=b`׍ cx!ظT%(_d>}S3*c\w=ER)Xr0Ĕ+bQy6bIRCG>ZC1J>5FrbY>Hbm%d /.QRz%SqfJ"ԆԶq%g+áE&hhױǣcM -QfFFTYeP?ѐ"I yKD?dtߜu&{$"d`1DBr~.'.~S0H?>F>b[gBvIdF?,pR!43Ov)bi;;z#|OIlAlRS%j#m9ྲ%Ƥ>8BQ',xtƬوQ/f4F%Y(Z1=f!,BHБФ#;"xq6]c Yn6bv27Dƽ!s&%'%Cq6/Rي/WI=Y8.p#s_R!^I&'Г%͇g<'}I)c)e[>QGk\H,h[RGv̥GHeآGʸEfФE%E΅ٗù=n[)~O$Z BXʏ&ƙ%Cɟ-Nj Jlɳ.8=IhJݓ,.L6`pKq9*!qv)>\;=ʅ(zR]4>TnB2%]-)˱.".#ntGc.E&t1ȶ(%ыB! N"W݊Dc>2h}okÚ],$eZДh}wŢRBSzZ4.ϑDVs'|KFRb2K+v6_P9GĶvؙ)Ȅ= CKj_%Ř>>=Q% >(Bm˱JW>\'5ٿȌp?7!1A"2Q aBq0#R3@b$?YJ %CCeX%D bdU$EN>E/_q=ܫ}5~Il^i~;rCmrϧ;Y'OYT5RFKXziiO8' ?܎txSU꼕؈zIgZiSCtM6ZHpJcr7ITG+;y7i o㐽xN<69*!%,k$pXf㎨.B+2">'=90U}U6fʳRq בKIiӚ"Qه2K#оQTMRt-?䖴r(:x"nQx7XB\ f^ B*BiIhI4tĝ~nipi< SJSx'⭲84udN"nfi1騯T'fJh6M72Ƭ)Ðe [^r7=8%c]+u/Ȱ*~K+ 쌜x1['oQ)'D?T#SQٸG?SGaJKQYvmҽiׂr_^!+,JR{HmQ PrDw%oo#MpoMvF-4['džij.:YT%}X%BLG=?i"mtJ.$rWWH_rVQҔ5_d0s㬠ҖuI:mm!Ɣry4w,ߑNzxNIϞMG(Mw]!ۣ/H솣x+)[3B)Ty-6Fbה8dux7BYd]е/#;7$6hgݏlrL.2n]<Ub},.ӓb'ezdY,1 d\}DRk^G)KMhY~`s[[%I5FlL(S;cM jrFǩ /CmتFje!Yp)n2Vy4tGJ/ nZƬ3iY6hhQQF߶Oh2\u]+Ul}dvK&_jӵb7°%c=LӛvjKW6#'K?"MKN(՜[Z7:Ὓƫ$&wOWw,Sshj*%&j9Ar(=N"`N\I+iq7yEr2r Eu_ME}lRRfuTw .[FcɶYM-UVjj|FTѹ"38$%dV:q8>fԖ!'i$6ECbt$| >%crE$gFdou8(bw՞D=y]+W$%zCMp:iis,h5OSNX*ȦOOgBN;Ĕedcbk=\v "xDɥjhz*cTwg5Lq$wƊ%pND67)&l(qJ6eN0͆BE WJgJ8+{cRZོ Q-ihP6$iSc':#ԋX4mzFO>Wľ(ڦvɧ(*Ft$&y+^ r&-FlME#^$~hh;v=*,]EuxDB]+MGowlLLbv_LZRo,#'W>ZqqD,FduG7!iiwOn݁*ybt޲A?j#im~Bj$4%<BֵL-GR ܍MĞHRTEoJh"t'K 7fJduvS|2ٞR/c_DN,҇ӁZr*AςQptͭҔ=jt-W \pOQ}#=?+/.?Q=)i%G$0GJSpqt„Rh^Flzl I67fS4T쎃mu"D!*;!@Q)zE".jrMe*M>G#Ubm$6n+wӑ;, &U}nn좺Ѵ- {Y9k MgNj91I*4zߦ{VQ=/۶FTmFPRܹ%(*"H1_$>R$Щ '鴌_8dGk7 6$hNQ5'-^GyfG)Y`_{ͣ⍤y%=5 N5UI%]\˾ٸFNӁdbe}bmQiZa8klAT$R4u太,{y~CW2->dcy+c'=ю=*DP>Hе4xZ4^O+FR#L-BMYBCḄX-3`]S6ѴaCАglEtHM2zQi)PcEt7tn%}+J τJ]`ɴJͩ #?إDDQ=mʨgI4 i<Lsӯ"ZHQO=#DbTJI!Ѝɛ7"OeB,oi3hrH܆pce }<*]W_dbI8c#-&+#v&7y~ j-WJ;x4~:'t֎v-NnoJi_eaP݊T2VG0Y}{rM_RkˑtyDoغ'CɤߨkK61#CGev~z;Zn}~I}[2%*G~"w%E } 8L_LYكN(hBEC-I?IN"IFn9ǃjNǸq=_="8lbZ'NeYT$E95f6.#CD.[6wŲ3qvOVZ:85_O#4k$T }?N7ө?D$(OSX# /i|XޛxY"Yrñ6ǯb(ZLI$n#);bkwIȃLȷ͋NKӳiW%Kmc7)"mCNŦ"2ٻt^X]% kKu V3p7Fte5i9UQ+4"څ҂ɾF'őnN$Gs?|MSti#|r'p5B7"6Fp^:SYN"jO& 4jaEofX!=eG07p/weG^0Ey|6~D(/ڲ88IOչ$vp}/BPo[}$x3%哳K ɽC0hR݃ G,L8y6b|X8((NzsB^:]8D'C{]uѻ7x4ՉYEmTcԖKUESQxijl553pmzm~DpJ^r+č=-)-ґ=Z o?W6 JnǫfĔ]riav՝O1\4R&d?pxTnܿ'nj'.m|!9NS Sr烻cn~N_$V4z^KIFpeZ[ZE2T^EraH%A/px,I>Mׂ2qrWճ^lN.Xdis'Ub쎌VJk\ӂ"ܤ%"I"H',!=-cZ|CTr*o1'-?q8%d%& ݊?80EmY=M Q8ebo&]37[|D_I^HJo$薔i(:6/ ֗=(T?Y5Z&rzY!FHZ&5v!)CS|~ F0Xv-_,ܜhNn^M k!> $ WE(pmktzH\;TJxoBoM%7.EJ];%!c+:;j6!j-R68Jl|l{fD߻ZJFЩG-t7O'w&:Gj_= nkj%W"wã˛m+'"֜HWWIKGVKcxFhەiΉn;RHDuE%?[<3y٧ rG Vp8nO1!9scusDx$My7YɎ [XOl{< '#]+ G'Rtƕ /'Z\GKU_أ^$yj"ۑDE3[ؒ|<Li9}U"QeZuԮIk.7}=cuւ|`Z%(ssRxO$gMӃc y"._烺 ;LGwIF:|d1\hj[J|ir9;"BNO.ȱȕr--I;#:]qvn͞㶈}&- Wdc+KYFRQH1p_K=zX8+nͮ\ _DBw \tW"C/~h+$cKFWZǩ_IYܢ3_:K&uz8TF{H5-@H5MVEKQ.|P(rzeM='ؒ{Hh4X'6B2xO>D&I1q\ h1/-;\(ro6"_5TRUpFKȤ 侜tK _Z6`ذrWU`EK:2R%n<noTJ< 7)7:/ [4:4p.( Q tg=+T%hX1uCDqrH(s|$(Q,no(9 ^O_vRKA%_R=01ϑTM9;i{rJ[w&=79zhҋnړEEzlZ ^K+Mvz|6c!pri%iQݖjIpCU7Rdg\ MP 7(oR~z$u>:3wӏGQǁ]U_G bYVWNԹ/iדoQzxd}&C|۝ȏ垒1OSN14*7+_hK-<727/.(Pn=IdDܰG9e5ʝ%jUrJ/dx ]F*zJjjJի#5l$p[20"9!1qmm)]Y䋧IGvFM18(+ZNyHD'ӂcB?cĬtJǁatXRk"ѹt> \m#^DGR^ܒ48)'LIY)x\ RB{V O,kgx-G-7zKҫo?ԗSFQedPZB7lߦO,Bގ~ 1cj[;r=/.Da)A":p-yEvXVF[ Y%)k\NK|[y ˅adqqGԅ ȦCSh EE őtG+Y(D88E!D.Ԕ8gsw,}#CUCK'u#5\?C;F=Toz䒂"q(Ey- fߑIJ8qǒ_XDҊNvXi' MбV-)<-MjjB|Fj%RVQ7GcZKSHK94i ;}Wb?I4kɩx78Q^vYp)\-c)>Dq҄W[6%Cv'dx%W_e ֔ȤD|D7jU0t+~biJK,)BNMy7Jylzwԋ[RCq~ iB9X5%M9 5-M?z JH(enJpi='m| ZZ\"^UlҶM~Q*Nl7elMV֚t_{N/k# Z؞Y# GO/"Gm Gx7\e3ўGd6FQB\y#9+&Z1y hM˂?I9vP-88Y6?-T=)k3$|ɾpwd\zXB֥\=(s7*d] Ֆv=6?My;)yQTGI.HidQJ1~C>H$DEHYy8=tZ|#Og sOUqvil^?bI~DȺQஔ1In72L'r=Fr[E7<R%'7rdr)Є!ɾG^ r*F{Iiʷ2/cۆb*ՐO[$fıcnLQPu3kGF2rEޛJSǂJBȕ;c17>OC*ӎ7 Zipve>Y.'jB>Y#o!n Ǔkpb.y!(8rK'#m:DI.H㎑IQ.K)ElK,YbO辛uc}v11Ia> /WEHȡga=HBӌ?'MZ :#K-0rcӒ"Zsʯ.P+d%Q֞pko!6Vx;r[#xȜE9~ko"{p#KIhA< -<%2KFVH;i"&GOr 6iO輗y5~JYc$kj퐗o)G& EWD%ps*=8,}to{+tsUTF[~ةѶ.=LIybd\Pi :;`brۈ) ;,r^"ST26H'fHi fxP࿒N" dN/Oyl&wڍ=fsOi=؈IepԄJd:9p-ExSR-<ͪ6ScQw#wȵDuv;Dwh瑷%Tr4r"QNH*cBW+ in֔6/PJy(QFN{r5fbsqQx!9ENq5*%{VDӜ N朸x|~ x=H/o7#$ƞ{=6E\y#=,pR;E%%\ji&(4J2!^8-6ovz^ ddui$w<7|*>HHZm+"([zkT WJWo~HbLb *btDkK u]98'еUiU/[0 N8%?zy"$GQFҔo㇑hm6=ċzkr䌜ݲRo $( -'q~.K(Ur#= WRpYQR~YR |o2% =[7Q7[?I?)813V?ǁL%xFiT23ي4\_sL6dӣ&/"EPpQN:$xp&)RD˾"Ѥ®m)GlRh6!Gr䄶'7| _&❝ط,J.Ovo454=KGvBp^dP4-Vs?wA9p=`U^P{YXUQX0xf~ lYDp17X8dX؄N"G#U+$Y*o,/ȝa P]wFsD>X, FnR J;:#)G M,ٷ+,Zq{Jq"ZnX "z%|YoQo ߻ݟiQ_ƛKfRMO[1Mޡ{S2Z:Pq- $GWRkjdޏ%.2FKN_#s2BenQ^QVb^ՏϨ-FHR+ bŁE89fc8]mZV*\O^m'{Պ[b_Sw6iUVODp$G"Ko#th4ETv]!D08!~HIRasW2cP\%śQee^M%'1\h)i,{H?nPTHP9HjiKdtd7 mp䦅:r_H1\g:,"tKs,}笡]":,}W`E6؎ܚ_QӗPtGK)鼝,)꿖>6"cJjm% ܳ)ho^KHe ѻc+x&,kG,lBKџO!*7I-gv\8{]{[ߦͽ[ӊF 8?RnVV~M(dJ;oFP5H;ܐTTxb*o?UdܴGWoz/"r;ϋ>QDS#%޲:%j(h6 S{pB1=6%poBRkv %w=M4˿ͪ<c쮴P:pm%t)9%b/: SgzI;n't7zp'.r=(/q\V Q2Bzx7&w;zh1RDt<,"FyE/jsi~,#i.\?O9G e|Oؚ/䜈Gɳf ApyxYȚd#'!'T41oi4(FX%q ZwJoT%ȭp&$ǁ5/qj\,[4=7Qg(J_D hGW":E䮕g N%ӳF[Kʼnx8.ؘ<6lHHݖpF(|"7rFnȾ58mP)M#q"_8(4^ l46pz=RGkbɺ2XC"Zy%Hr=Lfy~:ߛM+yCZkHM@S~l6,QU҄rWTYbɒw[>l+#Un:zkYM~ R)B.|i[CUɱC2fѺk\28m$'F[Oc6JYFMV(!FYZ!v+v9!\-=M;V_<OY/x7Ep&*"R[ǢJLjkh7 ;\ՖmWx"ѫĺrP#eD]7}.\%E"k碕tHVFR=ܕCJZ"}SM X%%WF9ȗKFZybO#mq呝p\6F{] {sCˊ7$\7IS#RF'wUQCdZ9x#DG P %.?+%-F#ۨ䣎Kq}+KE:U u돻v+D:(dvka:/$tbFڹ?O(s>Mϖl6JqrCTn7nHSk;Fb7YQ#rwߓ̍Aw4_oZk#_$bfnSOf=YC+G2f$&:ׄ'5͛|pEGxKGh}'BcˡlHNx"~ kCU_, ,rb;w]ce%< u`sry"iA]E\E%|ixGz)n4bbrt8FtBל+ y;"ӕ58r-?v?okZmŷ׃1'^by岾E?OOm,#/4_/'O h#GfGB%m#"q":2m"}D] (xSrTnUHrӯ6A'捻N# Z8>Y.Svv- }M/[6b9B4;cKohȾ+J-}=Hisz_:sFX 7IbKZwkINGZx|2##)%OƋ" .9,)tqQebsG(0"#'?-'J"U䌒\ts:3>G/̲2O=OnIhN l!'cՋNGR1x5cp=To(~m1#&/a'%mSow%bhZmV,|i1 ^EEdf:{p~.x6'ooӑe[+g=tC,J̔6P%pquІ^kGg l#E'&_QH_PҥF_-'HI.#B)Uiw8\6Zmy;yd{|mx4Q-E%QTB-%OFO"-F܉ Srs6K $V#) |CItQJL)r긻.z-!)GQT'jd祜,㫖 #OHؾz9!Q{}QVCASyj'i'88"'ɳk'inLF.:S >I;x#*cNO4܏iII`Lr%EӃF͊>NK/'EgmZ;É-ueA{IXg ɻ69Kš5.QȗɧL㯑>tXȳXF Tœ(pڮ˾#x$fR!gefc:J1xva`kqT z8;r F1y#,|)EI!RUx6_"0䔑' bi 'ǂDTgˣҸb-DnR\ %d+lv <(lؗ&=)M~LrK_o"peWZdN:m2WN.W1]{nR_ȍkM8n%xeTQ]WQR+*IGoNN ׏!F M*k#F9C'U/ jG sr4PpQ9RVFѓ%#|U isE&%(&-TF&\Lrq)7j=<1NRDoK` 7)6zW%4x86B]>Qr.noU^ʄ| bHgrosb%%\-Ow&'=40^WKj~;#1)OOs=.הߖEibI.NMKd?<!ᚚr^F{JHS!PԺ3dc~GFZB=}IS4XFՎP?6ӕQܘdcdcel1㢑g% j']< r>Ki YO%7.KOk*Q~ >D-G'_Q)*eIja664F2j_"_FXۓ-2kSRZB{r'F"JB֌b%£N 8٢MbEʡBlmO E2\l 8I4ER6KjȌon"Щ k|1E" ,yE(FN9/jBTq`eURܿ#buѾ9QܳUXZE]<FqBhR>E$>,n>?sdyɱ%;zknQ-L-F)ɫ#:y%=ҏpF)roc$uZՓ1ƩڣbIC{TG<ѿ&݄~J*k.5EF+$,rEoZ-Jx#DFIx$O,-RB pN!6ɒyj+"Ed^zDT츯mv=(tF'i/%bBڰ:[]89TdetgYɂtbR?T] %p(E^AZGc18%;WcE) 6Q %ȴ;JǶqrw&#r(ؒݧ%Dp{%&>sOdR*Iۻڇ9AS$Х~I-47b#yVv(W'ȡ#d[pGMybm~Eڈţi̼Q^:&chE:XKN]sXݛpEn,W=7x.+>$܎^0J6GU#er`x#ŒP~YKǸ<2NpzXhӛii2iE_-;yed(5/MA K̆p%-4{XBLO:\ԕQl*8'GjpT%8nD%&-F/p&ߒK:O 'Tsp'G"}<KNx(JtDt%5kbpJ#K#TFjwIjS"+HiMn*:Ow-zIa`ݱS;>Nk4TyV6E"Ȝ9rG~Mw=΄E ;v)F\i@Yf|EfKȣҎݺD ?\5mhV$+OˁP"A"(N{tYbVqѪ"BWlW+< uD(ǁ2+E0`.M,HE܈#of>Hkl☴ަNaP݄G'2+4S䏯8*"K?#9DUB{ģv6vyrߜqCC{M&>rF[8E&.EbrnlSqz~I7Db͛$+Ҭ~HGcj\*(kB%Pͧ(CFW}WKgM`er'o,+#NO-JݸYQ۟o8Gq#q]R52z|Z$)DŗoQDQK8h$_N)N#bԧ;Eȝ>Nm7G"nG[YWmQn;ɣϪ׍8#-}ZGSs-QL"lbw#-E>MEb(O_etY(}"Qe"DdS+=*zqMӃub=M:!$9_$u Y)g?FXH[d< ֩"+p=1;;nXBגEFwF;[987D)^ j =!(ɧ%_Q x#(DU_д .QP82 7h},iEtBW"ڿq)8mubEQ]z.)ErJ]"$l\Q^QТHS!>MEt$\_$|=:/Լ16=7Ln`XSdu=s79F4pqGGd^H+J';0Cg=+prQE`:/:#*a#="+䓋E).U՞FqWX0ӖmMLZPE=&"[ F5B:&8aW/vhVj:Y*c˒&nd]2A$\h,Nd ,H6>]T*ݕcm(&Z2y0.N~{#>Jxأ) `Fbd`5vdL"'F#.x)EQy7W)(~N9LJONM<6䍼Ȩ(;! VPɷwRkDux0Mp)K7:cG"9"Թ#!K7p].*.Yb02|t]+TqteeME%fƄ|6z:c$["n ׃9;w/3 .p\<͏&hS\d=,rȔW%n&?adIQLZ3 ͻ wf_=9rm3M겇;NYE/쌛7;ȥxRJ&S| JQmm_Kxg",㥍P#N=/S:bQw!| BR蕖$Q !}4\Pl*$tܝ!iӽ:v-;vRmۑmߖv[c-j;,褈Oo@:k+w.&pmXhJBv:5v݊ >2vȢqJƗ%vԿ. ~N5[E0w EV/#tfx\FO8W n*C?+dӟoutHQ_ӵ[UTL䎜&'^I50D(^w%K&em4"NS,Nb*O< V[ZOm_<VȺ[^H6H^lKyn7Н啿A(GNLNTR$8䤋^H,h$sӁ+0Q]9)m}97>:'zjI&bOUϑt=FFi1`ZM$oFrG&!䎪ޣ=O H/whZC[i %&-~N*8ZsRgy.~KjբZ۹#]S"UMx%l3wȥF4FQ3ݑNˬwȤɡ3Nm(ྉQ](K. (Jȝ%wsӎjMsniPlq-.F!"QȊݑ,t*4 W_"$$xBd"8!aS#҇()4mq '_j~ lbi1Cq$}ӋGmxQ"-1s,pQb~K+Hb*䮎$ "7Ki '06!zKrSx9XޟؕG ng#rȥQzaɼ|ӬMW$uEB`ݴPza/Q4? C:V)PFu;Ȟ/ĺ%C7$5iȾ#6bUcܝp(pcȠ'M6㒥1"dW"%]h1}Jz>6mo T_JE^MUm"Wo͓U#Y.ק M9i"iEy#%M߃v88)D*=> ,KoB$$3uz{D(uHЙx,+W"ے2"/./v2Ϳc}8樂H %.KRP݊U]pJ" "r3jt*/s ޞb^f\.T=D#lq If'l"p" _#R cmOM0m`I|E KJ1BԼ%%F^eTiDΈ\#ed]$>tUe3=(.tG}eTGoDe磉Gq+Of06"Vrx.'d~"x'{M|9/sDtԝDۤgTx6Ey ͛- WgVFݥb(9QZk?ѧd(v뒨y,ie~i#$d^8ӱȤͱnDs8.lEeu_f:W9F"RGso!\V &#I@Q)$gzMQܣܑ깛דKU#MssU|"du!de|HP) "r,'Gr&np#+䌒e؟Z]l_o989躮Wk4% }1M70LG9-":[FHK--2K,Fw%QC *>DxQ3jB)P"ԄEBQRD\lFB96hi[o"i q7!IVKLB,HGJt.,ڕnkug!'HФO.Mx `wmj\ ~ ȇTȨ_7,P%^VH|H2Y6YnQq^Bǃu44'HDt)q\%m7Ij"~L$%CVy8/]wfd]#Sx.ƫWT%t WORApz|ݛBPK݂*ɗ!ב}\Ӳ g#xzbDVQF8(I_,1Lw(?Cmi#(z"Qྔ'xJʮ>FU'Y1Db/de$d~E*^ xclGOܢE9xbxBF#C7 I5bDprGSNx2ۍ{o"LT(HɩPڞh< Qw6w6Ͳrsy$Ȓ]\;k$S6me3sFD~D~K}S,NEzJ#W׏29nbG鲲%-~IMϒ4pr-<_0r= #psiGOśs9#zHL u+D0Shq=qoMas)`^H֞Q-m"*5=$]\9" rG) YF+(H D+oG"EQ_j$F[s'},JlnNm䖺jhN1w_jG܉܌q^ =d?IYޏG]s%g~<wN#$v_3;ٱRO$u}On^H"LKUPW"oL;Kq2:x%؊iZhz)m,M,P!CԊ tKQQz#'=S2'f:dJO&:Y^_K\Fͭ_"7MX؇&EybjVy7?JQ&!Q" q \rwDc5Hӹfr˱!Np/XfHӒqb0&7Vq"3z'$RYHZ~ qs-287XQl%rGU͖m.Wgm":6ǥ&:xVHY"#{HiȰDH԰r8C_N>ƋWV*m]?F7kp7}.ȨQ$rR^r)ɾE+6p7|zp1hNz{]2y##v=RYcNLܑpsDr)?FN,RHu+#ɽ[x6ȢCB_utwy(}(9(J5]<}QWI5.Ӂ:#^M ~E1sx+"\qX"(>99tbԄSAHBLuǓ*\ vdaCwDP+.;k|YV#T=W%Gj GOK&aLڠԸHV-=z̔t!"D4v/N 6Gb7GmQܮW䆞JyNF%_J""onUEL?d%:oCUi-""ZIfi9f<ɋN4ZVKnVg1=mcJ/mm6r5.tF6+e_F~-&vQkM6WE8mR‹k%='͝>XG~.EMr( t8wsU\hbCڊFΊ6m YY-DnzTF{ rɱ,PRBL#s-DZLQlh"5) ɶdm 2d9~H(K(4$_f%}k&.my:r{KsQJ" [| ٤$`z^ ȩ<8SBq:#r? n7PrJt!;pIaE/227 [D^Jp(IS0K EjY}(et},yX``8Фx!=VȲCԿ垔( TR:g9䭄gFb{E.0Q1#srp+"MpG.WDV$9^3-tNJ/E`g=WJ8S|U']+,sjzip俑967mW-N8EWk|X^?xb_ˮK_آS| W%Y(%vm_՛aaI RݻGZF.pFT'}3._g|$ktT4dd4ODQZ ͟HZropCN?tׁNiĶiq$qFt,n<NxiVY#&lsgn#[#hbUL-ŠE x6ɺLPIWx98, e? Xx}6KFQHZnjآIdaȺA$]v2QpZF.Hw% ؟ќ=6#6?OEB{K&y"e("דȡ$ t+iX! 7nNDEZZy3j2*)dm< 5.DQ\nWN:¼?zȒ?lR-G 5dTg?$VI+MX%bӔ8Т/sɶ|ipKGBzVٱ}ˑ->Tz)EmFk(РF|(!G˱+PlwdbZjHQp96X`Z- B($e6K<R(r^ .Nx#;r4O܋܈Q](HNzP}H<_8'GHKKq,6jif\-&-)1bi9dv)rPFG%=OS.Nx}䬐j(Z;Gkɲ=Y5ИԸ6 ]+5ѻm%-bCU#GVy蓑eNܡϑхǑ:;ƨ-8HJ.ɻD4$m)Ury߼!kAq#I QM?I)Ռ=K5>rT-7ԫH'kKG2sv4vnTCp ^HFQl#WT~N{B7d[dFȷpOTF pvh[?K/qQ kpuRBғirsWF2ۓ#JC_E&OׁSgfU bo)Y n%R!ߧ%оpE6͑*LIpV={T? XA.'`VGSiv;ZӅͯO SNWyJ4FD4GRC!=H Ti{HƼ%Nfĕ Tcn\JBW E+1_ѹ6GfYՉԪ:A,znuLx""xzXwEIc]-RTiɏWB!$_K,Si9-GIPJ!Xx4>fwpll!vNfQH>K~ 90KM&ir,|s`KXXxxӹ&`~w=8kڎEsj%s:8ݑn.',ׁNY)CMaOM蕓ҖρImcxD4c5P(VSVCGw-#i|h?#u1vdH%ñ訬'R/([HCЌV=M=HG^dg{!G~$|!HӛܮF;H\7Ƨ"$p?!OnԥȒ;1k IQP\ .DYHD~Dݾ-4=yj"ZY"9ѿs(pr![,d8L}J.W~:ťȔdzbQWtDӑ'.29V,_Q4˲:Kjw>+W}6X=z*ˆ}T䶷m`R4gvdZ.^~G-n.(ލ-M#$ux=y;WI=NIB+۲ޗˑCk4{W%K ߦ4w ,ɲQ[r I(HGȴՑy?{x)q^ՎM;fQ.zFb]} D'EFg=?ő5]#t7j**&=5FB2_輒S ơ\N=8H.Yicn=%X"Cy5v->3OmzK[&cdud",hM_PF1}4M':2߭bF>LQ/~,l ~$},ZrLtJ&W9p{mu}[uNҡϒ&2J?#NBRBq*%pp% ,q\bGM~طt鍪dRv.-sDYKiiVɺ7d4;'M=9G)DE9&Nsd'j\慭wQG/"(؞Dђ6ۓM'#&odU2YR]|M&(ѵٱ@P^x89X%E/+vNާ|4/5ueG> WS^Z m8%dV 7"/J|ӂX-yBW%\qQhK, yN1yz(xv\^81Z'w,NoWUbW'] VH>zV/6m~w#JvT+ohPNieY yGF)"BԌcUbHibbZ)f͋-:VFy#)5m FzGO ԒdХgz5n /=y\Rŋk>Nr6@rKKw50$6I0h=AiQGEp=͒%g䓃 -&b#uHQe(WHqTn}Sr窯$^9XCtז ݾ5V.w(7{UtZ[OO!(ɧ0='R f8vGOq= 8K$ESqҌp~HϜ"{c"*j60  4E]0$}@Ш>z(htJn)v@XsښUNrPoҠTbWDYsB>, @ uO -R]gY ?T h[FQDbBm&hk٬ Z>l!\~t -Ap>8j)Qq\'$tDPUo (,6 ݪ3OU7Tlyg P\)rܢ_V1>d"h'uᣓqzC/y>$Zp+D4mRZmH}Ψ`.Wbco3$]}A.VEǐ@3Qh֏{+ş5Mhxk+. +t[ Т@ckvFǣV$'|^ qSwM u ~r_8oR 1L(/>ǐʕ=e@G;ƌ5W l~~г٩ n5K-(m&aL!Ӣ-4TH-F"C9cU"|aݷ/u5R'd-sG5â?/06ꡡDӧ%f'$mʥꞘXqioJզz ߅sV6Z663#˶BJ=u<=e\ZcMY&])e M:͡{3AnA_XO)=ݷ*V5\լZ쭔EԎK?(o!8ѩD7WGž/TbJ|sTk4Q%<;;vڸ6 vu xtG;d tZxV'Ef%Q"'ݧ+l .%Qc|]ҦIVcTR"{ʱIŜ]PpA@]3uAZ;5LZa˱]9-Կ "0ԫ]Mb#KhXPwX^Nq^n\ZTrL$Юh$A{A"ZA #M(VJT`l# tD]&yIR 1ʐ')0xZ\̬9Tˆ=Ű =-G-т'C = m ^ 8%OLs@Qc#t$ j40?DrUU@y.] ;5^ԦPqƊ)4Rn\l8Bjʛ7rR1J8!@9LaeM2ЧMB<*c !mdx݈sǪŅkm[z-2:, \sgpTI?R!xph%iW z%xn; ,'.*F裿LLj!LHZkl(q^-z/Z镕޼†aL\S&vV)Th<01=JSGÝT v$5ix\Md)=DM1llg^ 몛~7(-Q SH̲c;pWC|+`hܟ[kN05\M̘1(d]J-b cO'+ڶnAka?(n;̸)̎![Şaaq7#*IKl~ܬqlod]7epi'@QBxm37\= 7Y{KdNBtRbNK+Ku^H܈Boj0gA %p5Rg?-?5RW@?SuGk (ݖ:@Jz&`B,jpAmp^#7:OʸRjSa2wW-^YS/T67T`|@EhE%V=D.dx^бёhSwC&7]'ý {7MBۨ+.\c^J9#09VYsM<|XXTXT۬9Å<#etB;-2ccjk7exEٚ:} CԊwgdC(=l"1ԇ"UU?T;BZ6jgF*_I.ܣ ΋INڽFCi`\_ 꽥6re\=Sc2Ħv!6'pV?U끢"c<]If#Au!:q *"vFC`mQ pk+ڜCtТE|G J=[!i5E xiY{yuH3շ9TD^7\#\Y'#3i4Iǵg0X tDw;huSq1%8V渞޸CuPH\ιG-8'0PB8ZNp>h:T6uBi7K kr͂UDy(~Z,T&sD,G9l^r`t)>K+<\n ͡\]yIp'"sBLF *[=АgyZ//,axt乩Lwζ=]܁ݦ۶JNΊXN5ʗtlJ;:]R*A 6yL_0Q0OQkҋc+VLRS&ttLgffO'0ɀzlk JҼݽ Q<9ua@cc^ԙOʭҼ[i*wt%Ph&t警l^É[MpB %bB@ Fes%"Fʃ5;(t鱍@Ф} ˝OŲҮi>g^Uh Sj,OFdjkX~Ww TaMDeae+R:J;p4;a4D9FUtQHoڮ]̝2]i%VLH-R TrJ /@a^:ADtDڬ4p5y;S/!x!]$]#sڽNAVGҵxxUJ#ڙPvkYQ3~ॡRZ E0 't5:z._f0Nz\U'Fu- 5Z2,R>AYm/#_clOBЦ rWXOBn%ʤҙ{nperuZ7Eg-^Dwk>rPp'DarhD SSa]k'\1Z-q8]K#;Cx*X׳o\=uJu|:7sn`:\u@V}1jqԳ{K5\ʏ W{: /XDLD#դrc[mI5Bukӝ䡍1 Gqk: g~5QV%D r;@Z(VcGʙ(\g O9^L!E=aZftZ:N姗T Q `):dgDKkзԒEc=#Eb5 TL|0W'k egaǚ3̩uR:eD6H!f?0paN;?JրTVM?-.ThAuxh+5P V,;IJcT@TZj$"!hO^4\5*~KɉFZB 讲ƕhh;*ֹ)#_R$i Ze#sX `f:N NK"yxc -!ehֈC fD螺,3 QԓS.L,SBצWZXL-Pc|quHbi,!fdiqRJ"?E 0! -?[Fѷ):Bq1unghS̢ vyӐ^Vs4\T(m6mAI1Tu绥M%k>`^h )Ԧ#5HZC)\9\X&F@k+pLωWk„-ZňpwjUG:HZmv=e.^ 9,c.;xtC r `O9ʵi~HlXIX 0E:rXTSpg2729ܥ\Tk(jyE?:Cs \ڄ}5BSzݲgf9Y\,)L|6 S>%i<.>Wg kJ6'LtP;;wXqT9=F2z8ߧE=J8Z(:z7tDkIO7"Ux@W4l.5jJr\$eJ%LŚ%ruXE[jhhec#u\>cXrɻ)Kʹs?(@|6gփ|qx%NdtX.Ίל VZ f=?ԫ@~WuYq;./; Iq428>y!'hY G0ge-ln%87:N,8ZI5~늋?vfc mڣ 'MxfW (I5 Y ._~圍0Au&p[tj;S(=cR#\/` zJ-W"~brl致qa agP{nƹ@5jtsTKwb}j/l+0T8dΠJ 2tRN:@桯>.*l=m2'dBS̻u 7襔j?#^9K¼NiT1=gDJ)t\pvw:\VL"4\PG%Xދ!aߨ|mDe^Fԃx]qh\/u/f`Q޴$ҼGĸw/kHfaKZ='ETgEByQ_A$*kRGʤRk6b3%l9z^GYN7: / {dک@;cp֒9@@JdBha'%)Dv27+(>k#<0Wm+9cUUo&&7Y>>W("(#̡?t⎟褘e{ϢhuX8FQs_'k uhh~1T׋X?h\XC_@d ,Y#{NsWh<=*G߫\Q='e^'<7o ?}NN^=骏n!1"05Jim'BvH?5~+rӫU8lIXO¼OG.uPZD1ϒl8to70"4 n歝$WO%>#9PYu@#t@ԫkԨ>JDhБ nwP9iX!m ۞K3$^jwD:Fڗ!pYw 6y)oAZ˒$..[fG{#\VMJҡn9@5 8ajwXnE @w*) eI^"Th+0F$"Ʋn؂g8Včy(.Ӓ "S\% 6C1l4?\d!z"<';+LIB2y- tEc>K*{`hRsUً;. ȟ5 @ 8—1mc|2JWH,P|4Cça*s^\/{9@UHFQwhY3+k0_DrQ/1sjy5.iC`L)5ҸZ:ʋ|98|Y{xN{ 0FСKi莙[Ĺ.T`r |y&&]ԅ a"(T ?];=LehNtկ^_0ewSh*hsD/J*ln[?jX7*%H\/pM Xjr4Ϊ J'Q'%59h'!`NÇJm-RLPCAD"J[I3 U+7tST8\K_`yu[–U"9`BLAD$(g+o(M G:ЮJu+ +)=Q6Pa8[0A̭ s-I\NqPo,spi<ܡc >feK5qгUu`=D\Qvz^|+Le~+c 5W,el|9@_SN3?GVX"2![Nro, /gD-WUM_oŢ1#)[JX. SU&f,4e s~ٮٛp^*γXFW*cE[giA\-xd g[?,͵Wkm]Wnh?(('M HF ٖ6e,T1jHׅCSl}c zd)$miR(='g7+ݚ}OM=>+jT+9<m+]!w~Jg.<Їt+| 7-xt /lk5ESOѫ5mJU5^ʕ7"\;5n0D#ynQȕ!L d-=eo[^&v(gE7Q0w(ᾈR$io!wK4]j ?k.fH%Fg}N9.z/|8)λ 5AeڰrHb]ꌘ;A^4iGG^Ϭ-i-"Ln>$;zfJ\t^w#*]耑YO5EODAOE1J3jd1T񕆉¹^:~'hmvtکsDݯU`sZqSOd|su_C洟=TGb7z/yQJ;T@{ݕ{:H-Y uBsu͒Z^H~TwԀ:w{\"D+LKuc9-"b\h9P;E/+thCX[=M|M"yDOuQ~W3 NkMXsGʚګ;yIXG3Jl҉̓CZy44RH\0WuJg,acEjEA™丞Xx=.x}AR|.n𯏑+ٚ<ą_*zۣQ)׀Aۚ6Z%9<#gXnT6F6~Q}@(7 iӦϵF ꤴP,Pې9t`[:͋Qm0ksh .MVUcYWT2W}Mp^ܨJΛn*];Dl TaBBHXXZCv, Nc%hPA:/drӚGTY%Fm3(Cs 9qL 3(xy(2zZA-01Z~eUoo2B u!ehT+ly7U6oқB X7[ ; p Q[-<΋}NXNd%dT?Hgl?T\U QrP0 i+ h'O(x"XHe+\ }*M1!ݱ~HV1W9g.ku@gONJ8"N >@6QXfqŇeV&7-s->kHQNV,*Fǵ͔VC؏kNՃ+LwQ Κ𡑍>}1:"dF j5Nsl:H@Zi'a^¹kc%Ot$o5'l% _ s=ox9bQry.-w5ܵ\4\TΫ𯇢jzhWЭ5s]sL|누8ax|g}Uˢevt2:; zAaW sZwfy9Qw2;HRA{ Pa;o.7~]7hefuu2,̬Ta]s}ZL); @"z j0:(eZ{7ig@^<~ˇpSy[r]Jvt/\Pce<3/z#ٞ?^蒁hs ##RicE x쁿sΐƦ+s gTGv AxWH:l}Ti̢nKF潝hˊFy(ɟ4LJZʇiFj4YkרCqs_DC:"&BEO .(u5@6F -i=W`#x\mVeƨcjF /hj@ F}3H`{~[,Fb1TZfy5r9+(1:=k YGBժCLμ*UooiVK5q+A(9{qy)㎫ƫ*?z 5y#XBF9q7_6IkWCx*@n~4J*qúØ=Qi1+O7-ZgrD @:eCypbE:'c@zJ6\:!Ad8 rḐlkE捺m(@q on r˽y57>0+/wU5~!s MǪOB v.(>A{< 4P>A!cM7o,>-6%ejI!xZ6B [>K> OiwC׎t׉򋣋cu"3NGwQc&/N%e>Dx`!NZ,ew7}ߢD΅$Lݔjy vAlVuWP/xy[e{k^ѡҲAX"PǙS+AZgQ;.̝K\Y~b-D-ֻH7TM>U.U ..>C9Xz- 5@]P]"Giރd?Ar7T=^{G.k.#k*v~LgEoRh uDŠT&ŰN/ [-v_rl_Dr⦅1T7x$/TxvZVNv@ I䄉Ƌ.%L6#AH9]عx9+-5+HxYZ~WEp8^B(lb@YG?f:Q65j5"Iyl酨'TIsw'"Cs-*KuK9B,,Џ[hFG_]rvFӃsWcU ۲!jmvqf/% 8J3κD!"8v*Uó;PٹJ>pV]?P~m:. 3jVoFƐMkaeܬB&ŏfZxuY]VcV=N5HsхkiǪ6t;ș#~%8Xsz-d\Lz"H%bӜ6uW pPڀhipXE#T)cQAYl Il(hYkOM QiĉW G6"0y3(;kO'{.~jNՔ !\8JyU>qh'!g|ie**ԀnUfuRN*1hB>Zn1=HΘ_Q33pc*]k0dU'uA`X\-B<5ۣF%^ wz-02֒o,e1\BB24N@lgu/fO$pAkl\kk= u^,X"<t䌌yhk|ՁB^6rqZNV4D2Nej:Cv`en8Y%h<CV괜(uZ[i"R`^ OC+2n[T69c<C5y(0"PuV.UÑvAn0D4b!5ƈ۶t-:\O z+C:Z\-@;B0=0dA+]Lyr^J_PˤbHS6:'mNgE#R5Sa'y I( tj^Ex!NhUf? N3\9W_P5[v7J|rQpӳ=ЗKGP(˵*M"ACtpx?(^@ #mS'J9 tT~2zΈHt q]w<ѱ!gv \}۝,ܲhq\D~T@k9/g^V uWHڐu 7aZ-@ { TR׼*! .lXb#Qp/,(EO搡 neJNn [5Θ 1@𥶞m\^?U5(Өfx邸;%)5xC'@x39?.Bv|+SpZx)9Bmk@ryhu.+ `1ů F7Xy r:AuŪ{GG/z6CY9.cl(-l3ג=M6BLj\Gia-庆;z,x$)qSh{]^|mƩ[RO% #q 4 mcj#XRk7 nQ>k aKi-w޴SX.lNuːeܗ Kq29hӔp9+Qдz >ğEB2yS>XS4ZFZ}(EK2 [PXY-xFrWLG#Cæ%%P86J){8IFj4lm9*d\/xc -WzV}^K5ş=Ԛ4u佝6 #'+"9oۆbtV:?!(fez9 $ ~YDbRF)ˉpsEPuff4 n0(ˢy$%E mpP[NRu^+Fн C;)tH]ZLgHHKK:,(YV>9)%(rwZdk47G$)nln69 pA.Ks淕4IjSቕ1y-<[yh2;C@\ul+.̕_aDr ^JmQ s\8% (Ϋp~%o-{7fP \GyC^)lcRc"Ux ?\0 h>!]I̸,pkDt+頝_[#}P=8ru@grGݺ>PҠDE<tr"Q>yB$=`aXZ/ 1L&eї{6F)۱:h{̕&?7E6 ÛV))骜 eG+n!wv1Qޑ!UtBk?MzdOKY{Y52rr<~ZN xVSPfge Fu'~h:+#*{@7O¦>&]5<|u3 I<)B5^袛l lXi2UxݥCCk<^?0DuT1. \`ţ)ơpz/(Z9BѸ% ]׊DE>|+Q[h(]YvXȦ2Zyqܣyd놢jV5i#^0#@iD\G ]?ʽrYpF0UyWqZJ9j)=hg%S0upTHE?uRmZ.Z9]tHEINSIEjj4vՖm@<,4?hS'9fIPDs;T:P

    A>` {!ȽbgNT X5ne;:{gW8,x#"jdp:VM2b@IԬqж@`9G >#<{=|ӰP:pƫӉˀ\oсֶJ֝{@ ~p-6.&ܤ7jIM3AܝL sSþK!xdiD8)gGA;w Ŕ:4PjTxA<˕Ăy7eäT4(iGE p.\njH- }/04#E ,ִeh}VkVnj5+-tP-B4-#cs;)q>ht2imJ;F!RӁ8Q˪G"x>.*{ӅwgX \T9ra(2j 4b3҄={t>j[NƁEЭZ<֍$M@?Kjz,+4 d₲c}0wn^;!odOXYagTWFW<*CtA.ts{;U.{7qچ fUq8h;&cUTG.mLl"/vchU%}%wUTT:%ԉB?aA0\~Y Cj *汍E-Lu$]Y /hA4YcÆ*x,GrDĀ\V[K8vP䁑2n@+>#hR*7o%tbY dr%x[;tBi(&X#+:􇅞G2{~?+4G%or3۬Ss6;bF !kjBwhMG#(6gpf0W3B8^'+,A^hc@W uB4Ppiq \AFhU{Xu/FҸeEEQa3 jf0(uF%&E?D+~sQ dxk)gi1ladrh}^ת1k3Vo T:HP.ttZi~8DaY%\t Mlt v {.w%C j\P2`ۢEH;Ay?˻z/gٵِ&&VMGI BѦHJv jB/t2vxݭ%XDW$ȠKjE+:+RZTv0:}{ˎq({X'@LJ1tM(-ax3Wpٍ.Aƕ8$U+FU"1BX aHq"|Ϊ6tQNZy͵C^:HY'^C r{n2wW+L:9tYOq>!kTSӓhF-l#up%;e ,.Aj\os 9>5m\Fd|ZIP|V8+ܸG{n$ZÎl)ùZm7sw*ƘƋ\t,DyhoŢCi4uq3dek5/pSi5"\#<К`z ;/+_( n 1 tE#b?2 JMCVk\y\l漩-8",FТyTý<*\Ah2sj6u7W@Qc A<\-nW<)")NBLM^K:m [:otX1b|<4\4ZWO4\L&wRiut^F p[腤q8 { C%g'0Ǔ}4Q q#C8j&KndGܠ>+gMxQ[9uF\߻čv!f&Gg;.uŚ~&?E%Nd"M8gch֣Kl3q?"8\/ Zr1l/Q𫍍?6V‹Sq1uBSvmՄn,xj" s/eU6;.m{}@G |ƈ= @#T )XrkG myCkiw:Cu39xssV^-4yvyQhC]bPlWlj[P\=뱭Z48 7*Koyxʶָšb*$Tj XE'GwGͪ&.}T]7#qnC#kB6cZOYd`B,y7:(u:;:I ]soOͦ(ua+[NOᕎTn_wùIx~J%5\U-3<(^:hZHOuqv{zUhY} EjӦӔseU/h@=Pytj )k1p|ԚŃc+S{f T6SK .L0+7veO7:WHjlUS (;4^ɴ#EOΛN^ي Z1좝Vu kL(FVJÛV*ӞMt)q@1JßDf'NZ{ (ob.1~vv!tHea]Vl|7{)UFv2w>˪[? L|CA8DScK{*li;hT b Qqݫ[\~wB7Gj=êjy)j ]X/F([HЄÓ];"LqeH  09j'1J#vh:VSohY.4+OtjPq ʝ3Vjùx\:;ghϑn:vpvV (@)?.Ih0+DhPp#m6R/{Basv袍|?僄Z\9rQ`XjQik 煮8ZPcZp=)״h 2cTsƌ<`.0ѢHpa;IW#Gz[cQ=tl؄Il.sHƷ+{fgW9ʐ\ԯi3tuvf Բ7ʲF%xoҸ=㪸֫gRdN0:\\]špԷVPx\t11vvRg8  ݭ ]VjgTKur]T3AF=?#YӅOui@Ɣ&'bT`~岽qWT]un#pdDƵӣLsv=AF|S渝X}ރ>?0+K5_7զ\ޭSWi /;vP'>' QhX̡ @e|>|/>qt+򥳮f'7@ !O w-v'q:JT%_M2W:R+A-iVA૝RJ+NQgwNM4|+>^қrD9VkUаi>ΣהD4;^QҤD/㈴(EwSP5cD |\exD邸i}4GR5jv^>MMpvze [O-,1 rDYN{c^4‰ Z)~?[71' *Tm/5"u=@(5>D32z}T`6T?;H %?E=]| wQ`n`;eѪԾ4+.jQQe\ 2; -i( a u6dj)5i8mF6n(ۺwy7f]QFZʑ j:%7wSB5ù]_9䇅ۡ`QG1 [2nzɡDu\ansLC~/Ԧ{2dXŊn#T >}9@ٚgP| ;.3Sz$)zjwy;·z}bۜ>H5 G$cJlpb_ɍDZc:SEu6e{BW1 uk'bQk^x:oq SR nۅq|޳V5k DӒXB?9V֣@騮Y6Ok6/kSeOx?] Z?=cva:LOr㳋G 6aZc‡" Rv \mn3 %`#WX843WT ZXq=D^@+ѕ컋&F [ڙ!CzF&VZ9 `)Wk8u|. 5x/XuAYH 4!K;+jŎ2ʗ%`y; c&})ӻ. x$gD(,e&9%w ~w-"t3t4䎦z+-JiFJ3Ls)@wW\Zq \U*K@+Gվ%;ƻ BɭEg25\@:9 :Y܅ &q*j*CDpi&C~iSy/!pN!Ws%k^͡Z$G@2S#VHƍݢ{-5Yclt bfDѹ+=TBBu!`vPv2:,Hҕ*l!ky0qm#Qivq8p/T1F*nTl}{[S] QJ*n j/^QQs =&=XEB5F;%R6,-lh\?DCAoWәV5!I.+942{uk;q钋X |3N)O{ߙNk>1sQ[4PkB;1a$fwX6ov_U IsR\0ŷ+cVƄ.B;I~,2݋W{J_V/x^\jSi42Ƴrrt@h1(sT>i1OT[k 1::YNuД$yHSkF5omTƴ}A[`ĵ Ed֦qœP4=T٦f]tS5Ώ *(=I=.:B2%Cjj!aK*Љyk+4ef#Ȭ3tY|Y* 4iNqpun TA5\+QySxQ:aT9mIQQWBO];Rq\Ti oqV3^D.: xJsCj04^ɭyӍ'w̡M q倉vi8^MJEXEw{gPv0)1C|/i&~YsOU.SalK<ȊO5 (RF hpؒR$0(ks8r*lq~'S ݷڥχnN[P? 0{C1BmD4Ts sߘ#jl )c@D.. M{'I-W8)Ͷd|ڠ Dp?D%$P7Fov|_c*O~;7iCV8W;G9q:(ں,Uė=+<<y ulP"N6S=ۏUs_~qn)5O7jn \VȽA:ZxacЧ1)sCrLu(@P%-#7tSm/r9X0<:zՕ3e@aT]o]z-IN8L@+Z+:pTl-+ aq<`G E7R֟BTLO%( V5 Kp cE))d͈ޥٴh∷QAiQ{y3L##_d (6RġOti6ۜIqÉ]cnWżl Q#nHCaO%RH>l d& ϑ qvw+;!rJAaPڑ,klaqJF?i<;JJu/Up?`NJTANt!E>_Y0Kk\-K{E@ލjェZ^nƢo%!dkTo%-p+{6 'oU7.SLc?R}HtAEJSb;~^ͽu5O]) ߚbg` `[2n *lMMZ? iâ9xi2xDF[hmal}$|}`Zl<iᅯ&R)BQԋa=+8^Ni6iAw=g7F*Ge"\%'?ʾ\G[=UtonfmRU*@Pſh=(6etwtpF鼡ポ 倮[,--p_tc)1NH7f0#gj,nSW=1]b .'.]?U'Y )A7hcIU5FS=V7OyML47vz~V']F!$+\jE Eb CxQuVk|KVpɟDl8UkH2$ӃmVA]/6B8zBTEꃕFp索wRNfK&T<-337sO%6rD_쨱t:1"0[#1`—&48ԈōTGǐ:@[T_ ;ǏµcQ#9< mo9&WZhh]QY:ZM:k؎'#sg "EBKwD^_ԩg U9.w9z9QL\(DF;6ݮ/G6Wx:,7S(AødSW ̗|#OyPo 'le;sDXJ^y-s~/xV:1n,4IB)=bkfp'+'Gt}Mq{]:'Eb'C.ubz=>wenyp]5}*9CveHOY R\2Zs.2O @i+/,FڇƈhWgwӅI!{XѮpTߘG$5r*u^{% !x9H\']\u:8,,-H{E~( G˪%hD.00?+߾֨q3vͿU9uV3~24Xs^z1?uMˎ)7@ţtmk#WPyy.?kUUG\C[H+{jBݢ(ή2~a4 .' H꽥FӭO%E`,;.qG%!JL~\T4|©M' fl8\pPU'Nep:uj Enrm59p8=C_Fޒj4c$Ip}a+3%{vѤ< F2Vii\|&u+nQt:gƮb4.Eԝ6DG ;#Y Zg4Hjk%qS`h*LgEqYܒ>Y4(\J,~7?vp9 i^ҭ"ⱚ.m*@nΨ{k+i-CFU0h:N# cs9Xs\ax1X$/v%:z1]ڎ0>S zWe(1\Tj縴M-WJdm,D:D4@O U'Ψ93Ӆ)ƀK5Dt\Nyl:)>nt8ĢE;9Dz֎̜si9qOϪOhI*5g^RVkNM)x8VhRʀ&ZkQ9 8gZ5C-d:9?Q^7Nw:Ap<<2U3:es\J9PKdu5gbu+s*EN2ad<ŮP)qQƱYxAUqh./Z~JC JcXWmIJ":2>l$;̦eCnv_86#FR9@4Qn衦]Pt-c]]L"IS(2w!L UݟUqt<5A.j,[$~WA#Ѱ2Z9.г9uºQTrKq6ux6xIdۻ̌Wǟ3)qA.QF9[jTl[sR(5ZCes]P7JS7#}2Ѭ/t€0Ҥ0B7k]ģ ~EFX%|HؓŢy9B0ZnRo U7!kAl9kxLxGCahLgGMИg T:^cD3A̕@wE=GsG-YL0@C󺜯kZ((n NapA&;As>P%Ah O}Ӆ4O ύ`=FvU.Cj}wVj49I+JtO &e!N>9kc(?dl`~y:wsh^ aHg`&gBJDgq#U}ünيNv;e5vsVhWNM7vv軻8٭^~Tgn!a\}30N p({эZ{u{ ) ˗wIٍ4]̮KG.R\4pFȵceqPÀ.'љ\GRvެxURk_?[R[Mpu<emŻ!e5(SsVƞkE.oT4}X/^̩e` 2uB YN7nM)ZOyUXkd1:EHќ] dbzriVr $&&7s Z~`gZk@Ԯ2BUYIHӈv*7 iִ ݠV\.?){Nq ;egTc ?M$oiH1h\ ү~%nS38Do\.a+uv_ m75ՙ4qj/8ךz,Z gM+Zq(n*dhhiյd(qc1/fn=mV1.&;.YsT6s/'$1ۺR$Gv.*dܨK1@\,H+RxZµwI]:/ \B; B9^7:u /1xmGibyu;ЖM|Fw %C4G MUbo "KcD/y|zkj<5 Zs~ښTvWȔ`yu՞O7nnܑ},xq5SM4\XhѸSQ;@SxN/#뎊l$e*?QioPG%suAk5OyPN-_=q Ts箪$kƊ kEv n# XR-vd`hΚ&5-]ݝOݥOn(!.5Ѕ'D(;νިK`,84}J;_ frG%_eO%Pƶse9w "Jͪ7Oi;0hL3]N0%|wĩu:l 7и+xH4= "]I̞n;fepu#X4)MSoBjUTVps.jHρOvAR\.+N9Ҩ~_mR/tʊ}=ʐ2#5~%v<课 |N 䁩Tpޣ&m*4ߥB@$V;-0uCm#6/>Ɨk* j5? {mqe:aL)qw@lXM̝{ҳDOꥯ>Q\u~Z:\^GH `cL"D%pmڝ Ac(sjn#+*, ;-uFG1բCeMۛ]O 4踝U5FEihׅ[SPS0[Ly*?{\ñvks$NCKoGX+=QDw;TT}(޺NX-Ѩ/wLTnڕmN:HACk" ֊p5rFt豧Pxk;El.Cw.yʸQNܕTh&ۏ 7Bn8Y +7!G<(.kmx-ƳrS漝jQ #pl8Ʌj;̹q Ov~*Rr[RJ 8pд+*9PJ\ۣL:䍮둪Rj8/b-uD.:-uՅw:Gꏱޡ\2bSKn;Ô-jWnB/QNgnq+IFF9 DT',u;I!󳵛b"jX{;>Gf3襭SH Om"wa;ùTbXN;BJ+P [uVۍ̢j֥) צSo$; +(=nZΐE-Zm\Tһ"{806L 'j63l :G%>(3< %JU{ݟ vٺ2<,aohvQOk&ennYs/'S`U P.n6ʖҤsG(u*-T[W+(ź˽rpӻh@hh wd9tPh"Gr{hrr ^TqZFDʗ8r]Zm5ft@>^R^;?%;]r6tUCjqvV\,BdaqQ2+-|&CŞ 腴KHiQdqpBsIy̝yf%M6p^ҕ08'Ctݹx F*ZV΀p|J+'bRn0KGE7c 8s-m豰uBy+EjNdaP 'zku^0ޚef%HFeNݙ1UqM{E"" s@Xmшj?u[N>P?uw'`WS*ҽYmW&w4^c#}t ?b(YQVo"Eƾ6L#5gm*m >nGx.uCdqb V10>E\w%lqDAv I JBXgQ޲"<+}'@LpYGEmJkā- hkBG i RKKƁQ3wXQ/ h8"3jFw΋ӣc5 h| nHPpb| ]YoIyIss#op\%[,s{@˾;|#O%Q7xA=RFZ[^<qWw@覵 3GuN0kqU/)kOm:%U|n1)üsGIyC!os:e{0A(9AߒL޿iLt 0:BZ̄HioAj6?eā  ^v̡ihdnB&D @p{O@Nk^kZ)#^궷 xTZ Z17,˶",-)@ZUQI/kzEnO!: = GfU/n-w*RuSê@{SkgRF)Ecέw51\%{5ȳU:-u\.;Yl+!\dBx9A^Rݠ.'8pAojsbzh֭ϙST\'F;=B5/ap}NҘY콡P5 4v J8Pad^P+Q'LQZ'EOQj!;Oi;YMiTGu.ZtPqKa*2?UC.5E3 wmW-Su;v*Akt_q8 UY̸LQtæi AݴK)Ϥ :~ecZQcZ]VdL(d0waINޔW#:s%bsZsd{w>:V֤+1rwvl|a)=v> T5X-.Hc#Pn5J3~FR1SSֲ֝¯5)]=?E څC =V]کx{SX/J<#(Z,/[^)ru{G0fFR:0. `#}!Lht;7W~L$ }X' 3YH92E.$|EEqWq Y+0n6IC$;i?59^޵tF5*{WTIR*.ΠJ Uŭfl5X`D.Lkg$p5P* l-s] \E+C#Ui|J%l&T& p.:p@N5^һl,9J4tjS8PiDW(2usYN-c )sƁE{"Jc^R՗S4Ee6p\O^͖Y*-tW%M3`/uT +ԩѰk.ayz()Y1qy{'!x9uXe^`l(\_3.0e+1;4ScF0/k*#ƒݓP1LQkXAƨS2hw8(q.}fih ҕ+w)xpgFvUoa艵s}`|D5q^6u@$[DJ]6UFx[|c b"jjoQc[U#L `  sS{iAEz"\rw{e@- 6G𒮤n vNitI@Z4jgvpqZEߺF(N`jf[1TmsO~H@ B8./2me8gaɉ`}:ˎM/;4h||)ѦVq湓 \4GTx:#N7"$YpR7X%^ p3:;ꍃ=G~rtfw»shamoiRnɺkpvw٫a<Vl,{zpT]'\kORkU?WqTŶ*4},‚ʭ2eˊQ6-&~I`v[޳n DL}<岭 %\)L,Tp!@poLzƊ_Q? [];jRi%{A  "DwL#Uؕq6wm^5fa{6.\M84:X27.'iXBK_΋@X(B ۺE"s5^pZLipSw1S`q;@ܼsw!-{8J5"4?M4P bGvJ0j*c0jWIe BMaΆS]ʀC>Z7!0ΦiOƒÝ\P^NP 9pvcVu{*H4{rhmQMhօ?cwh5IYq RگgمAukT֧Jf)ՙQ榝Imw&4c\. WCj^pOd Rgiu-kuQKۍܫ\qpWe ~'cvԴc Bl|d/ YNp.~'PЯI96JQ?VrYI~{:EwaGzeG@5%OeKhX\T2SӁD} )+ںKUT9q -lFY% zh,9& q9ґU;N׽LahR|єKh%UԩjLyT`+$M{GtH;(V8- a{;yB?9;0mS v@ jը>jMeq12't̷引s{=/2хÀ(WB-0LA΁s/ x f) y1 8XI^жEƓjTZ. jl@ïB'z r^ңm'4ux&W7ka9G-R&LF€U (m Jv%9wFTvt'w"oP!d낋Mȗ) ϩ3质&t--"j]W 7 QQI(9ylsܼN3v<8.+U0#w"(=up{#2"jCE?2hS\sbZfe`4ֳJEV!{nȲm00Dwf:)0U*}oXJU'N NBWv:c|V5@sNV=;M5Ka<1Ɛnaյ(^AGIE3J˛hqw>P'iK&*WC{. rƞ|G|7 ↟04 [t.r0\U a9r>7uZ½GFPV+C\9epwѰ|W܎N.7l/8P;\W>{ --Fi=yG{tC kvP'1$D.'ݼ\6l ڕq3ƢJ2nÿ咥!nitg 1;W@ ⛛DO \e2>mgEJ9sCLuoƌSAeA?+T3xqXǪ=Pq>{c9$( 'GQ'bΘ8QkôTH YIQat!{ݱ‹?7%wHV9$du6"Tx 0"d'ZVOxZr5 S{[c+ _Es{d'e{;ixmlB|g^ |Sn 4^ޮ*IepZ͇xW q*x1%E&f'SVP?Z7 ߄;'+\0xM=T5g6Ui{L`sUc),:H ې{ aF#wN"O@io ekf ٭Ϥ{F(lh. |" Sp9-V4֢Y,i(qN6и*QySx0SC5'NK cX|un=nWRmhiD6>z^.z&b\=Fw)ۭBݏB5DcO黯yrpri]k jS ^϶2ݴۅjep;8B;Z+]6xӬk7y+9)5; p:uZsSc ?e{tKpRд}r9hGG' vu)0L5hN-djbr}>ܷI.ߖ%gWA8BiNFv-RԪԷ*{ڧPfz.τSc Bݝ[-@ ZxUFЮ7 @Q :Bgt]e[S:]Hh%Kh)HRY Xw舟s8^"-аQ&›|;% eeqӅucX4B_r]ᑄ%ӵlM0gP~Tz T7\]C }z2{oФ1ƫSm1fWsLj?nr-v6ԃ,A"~<ct!@U-_j!Ѫl9bNAh\]elmpGX y벇?TWHqh:ܼsKݖdJ&lL,rkqs:uN,? Rt^ҫLkT 9g:5LG@V\F0axmIKlR3%A.>Juoh.(j;p\4`}'X aSswm0,~ˀF_3WTtsʓ4gW i4@S}U&OQB*S cMJD+?*=i`8suPZiP p֘j ɕ LTmSn91t[2, zs3j V!OsMEݲ7j)$;Eegݲui<;)u^j З*mcZuJ6u^P'ZC [٩]⾟U-F2Oʆmok0I|iwbэ1kXy n1XRZv%Z@ QGѣ:L _neQk?$KGPϊ:C_a$J .~,ZpcRT{-9c=݀ .j,⍑&vwXwܩ>W]/1ȄH.A {*a3 ."TTsZ`)sOЮ ZsV1ah|+Z)AN쮗D-ݭyR־''hs>ʫ~K~ Ɯ(~sH^ +tc±'j> [½g=U4Ю[5, &%qvN% ,U+Q D:@yM8WdLrԞp<1Je(Z'ߍC'I Sc[4Zet H뎣۴,vK2#,4G#x|𥴤ȝ 0qf91y,TnPwT82s'xP4fZo^Rn*tpu ,PZƶ>@ZZuSq;#-6hAdM\Hqv-6?邌d#H+}NZ694pi#ToMrhvRjGiY˹\,ObB豓:(^Oշ%Ius\Q{ٷ [T2kHY5˚.-J"{IRhZ_˪[>!Q cOC<8ShM 00 ҉>0d(5PV̑q*c|,YŋAqH1DbWHb=K-uDn ̂窎+QqZQt0BZ=Bӱ1 HIp )>+Hx iMݑ&8i7!,B|b'OwHSLtjcGemm cď ? a䧋 =✈E+10QM 1Нΐk?iip5Z vK&L|nԥd+ .'663d#ћMq} c4@\I?B3@w-3&c ^\+ZϘ*$/'*qw^O'vl;k7q8Uk]S= n Uc Na90H䍀\[I-.tZ~0m^sQ_L"!6G:T0t6e_R6.m296#+WW9NvFD?%C53F~C>(5 V2]XnHQd%LwHQCKWgF#2X>(!+S<26^"é ZzB .Ӊx%C*|Evr\Qk,>5$nW(>4^A¡g6;ۻTwz{ذ/Hn<ђp*/~6/eQK;M>XX)PYV .Ǧ* cbeϊ۽(:~a͟by Uʕ?i\ڮldG b*`\)mߵ{b>TÇPYHsz\|SWleC+}epS Ӣw%g>H#kP ۙ@:q=Q-2?t7?2cjak[fPNӼ{X|!qNa4Xx\sˆ&a[Վd#!VA tc!wOv")}7![T-ؒiPz;Ǿ~g hWb {]'FZzmt}6O;c岂  Q宑pX6e|і[oꉆ7B"XK[Le U#qc⡜ \Bߴ-w+ժg#hڮn(өS;|öBm'K퀥ݞkog@N}hx:S.ݚ3݌9# o0uQu?.Ӹnk4i*ӪDx*0r!rƪжƳy\tN| h}X0eh#U8sЙ55,L"ȍ5ڨSvv\e<-^ưD/rٷ@w5Ћ_RM. C` sR-yNm'EE箈Ψ- qw EQ6fUΨ,B˙ځ=gO'\rA o):gHKzØ a\-&G X/vB>mT^tӪYkxJ c07 {4K v@Wڸ ] :! C[u Iŷ+'e[=la]D!d;V;vNƘ: hQ5+R z=ܧeOƒFn5ů&֗}{/[).qWN86뉺cE4W>鲳o,w~g(LAbZӻB^b܍T(4r]gU3PiTxRֽVL8{ Qmoܡay/heWvx?̡-qQ啩1).'!Og w<FSݐTwTOEvZJp7*;Ǘ}Ra{Ӟ`+*2{Buu_ ֝P_1Fx]kDm]Sv+.tDE %h~UɂpLq,5譞L(`y6QϖD*̫ +\]ԛ՚#GMc$Xk~Xh-w:5yT>GE;P5g4=Q_Jӥ(gBpj?Hp7$t8F=x  d?'Q 2>Jڿt!/6 1%MEns@$tPA'̡c;ӵ \LlUWtMPYOYxQphX[O꽟t>W4񭬕BХm39(}1h׉{:MaQиTCS8Bx|m?*c\=S3 )fBL^2CBLg':p螺#pH uK^y#2r,.2EvZՙvgpFTuZkva]t]:7{X8򄍿 IlsKQ(Ί9Ѕ QܹEF7o3U&QNers^'x:5>zvgT0{BЃTxk~g>og-a3\M]R{"KTnEuБQpcbOGh,#KB=0s,8 Ԇ!@k %~@찎 WJ%DE'ɻtsh(oh 2uR KZNSK] o3OtDf4B,|eC{#"|}ڎvj73.c)7J]a.D CGպ - uWuhWMZ~@x_ę0R V+[4IP{U|/A59isy&Ֆ4pQa'Qy/:k9L-o~Ӫɨ3U;{?3tJKZݱ^IT s|%.pg(C:\nڠ;ψ˵GY^TpKceowQFϰi&kbʗcrWĺ5sQoŰD38eepl#l !M FJػ@wo;#*{K~!;|΋ފt;b5]kŻؽy֘8qr3:s>Ku?,)I~ֵC@s+ q/׵3d(õ^: hG|g=N^7|@-j\AB6#s Dbu<*N@s5e Qg5x*6f`u-`XN8Pݝtu:߲wQc^īë_EC}HRNg(iML~1̗p6"4b~Wn3}-:&Uóbi.05vS2[+N?;eO4 tsSF>% *CQ/8ݮnٍMZՈԋW%T1*m#$T UՏjgO )}Vr eӢqw.P(yE eυi.B{8whN`Q?ߢ=isjx\G#*9,t4w7E͢IF1vq(N"Y1Ԧvs _I)4{P}!^Y X9wYl CBmhӝtVSL{#Dl?(轠t( sU𢫎Ph쵚h`o(rah;<;jiyhkd/r@Fnkz[FY[ Ψjgw.™@@!y/p)9_:B'!Mκxզ7j'[9@hQX1쟌)e6Ukwx*֒qV;$F% t݉D6؈W#;,6MSɪրu'Us.P)S-Ӊ{R>1Okjva:]Qۖ\5_Vʲjm2>W۪ F\~|ikͱ`x@Ǯxj ⺴ ĒA%ӿz˼ӞiK$Bz~*7;I<\G[sc(U h94*Q717 SM*έ;6s wH)qr1'|4 3f'u IIrѢ7\LhԢ鋜{Gz'0TMI@TMCZchSPF i 9tJ* t!uji֌;j0s[hT?E a.rz7 ]dB@vQp''*d+GcÂm6٪;jgt]Nm<2@P@Ӊ˹1'A/-pЩz[psf-W mqל,V+^:wywE/~m;q>KޑX~uBR5Q-s4#wU44r c^R^cUe``b̠)}e7u0U*c..Yvz > + wh= @0Nf?q64k(abg QR^";Gn@4^>aZtG^Jխp+ٙ[3] :+^w꽐̯jUί.l+6:⫔4`tm3_踀p<Ѽ1KWl-1in23Q`u4.@jm$ /gh}tO^ڳ gH#BZ/Uz TE-sW{Y N*;F_Pn_T?EG>%yLN&`p١Gduk~VYgsz@RW :uN6YAJ'qcn`4mr]C'DIм5j8=3}ΜN.K03YxECE%ǢkiQ [jݑs=Vۤe0d#^]kFWNv28wYۗ1{ZI lnAZSk~J2mKR_RA/ 3([M _REpJ"o2#}&r{TPI>^äĿ[v 1*As@NI{׎m: )v\x76lJhk3Pdҡͮ~b᫅!tv1,ƮQEF ^#C+U@5VlHpjvnᬉ]yIclZ&2ؔIa(항NڙM0Mkq%a Q{2 ֱ+g۫q!eΠgwƨ^7s|*,@ ?DE ~vr )(#$n':o.5<$\>RZo5][m A7+7HM]2[8hs Dewe#_rrAO tZi:nNNn-cr\t; {0w%۠gnuѝdKΜA jֻ 6G7o 1j, EQ]ϒ͓Dpw0,TkT^+FڤZu:JRK;BÛBqw'X05*)5BwDMFRšܗ @zrR\ƎP`f3 0GUbJwMm(Η3E'^+Omwju+jݑĥRhm6Tny2dceCS(=Jqpʿړi\}dc]6kWnq=󋻒 q v,e5,dn ymz.<:C|L5Aehbjf4= ݌n\ofTÙ4i"4S( 2A]V͝2j9Pt ѢPA)*`m`+ToWSBʽ,\}i ,n9a@Zw{-¹VU؈u Bρ,>st T8vQm@!`0o![kuLkA&~"׈(ZFtqR~Z-yASG?Qw_4=-]B[jq 곳d+Hx?Hb.|-īW n Vο5GhMZ"2Qk2Ԟߤ쥔N5g]H,:]v=AUt.ѯ p6. g2$C4:Jկ{56^ЕHxʷd֛v* I!f\ON'pYa܆TnseUVb x8!CwrC;KAиQ#OD *iP5^҈:qJ_W" tpm6~ZY_qc YD̆ڽ#D/ayj?)w{Td(hD譾F#G.`IV)0'I?A7 xݵ'֭IxggD>'Hơ[IQ\Fꮪg-'Ii1D"%-imC-e-3#B#4le9VN遈zǜ.Lꦝ{} tV(R Ԅ&7iQtSݴÎ{Ś!e6GyF1j7; 6^ʳZ'ł`['#iZq.(=@ Ƿ#k@>#P#cS-QNtu&Q;Oy;Y= ڎﺐӤ?|xɊYc۞e^݌{LJ.&o!+XӨ6hϹ,JjHXH۪hhDCխ'p^gk]޹N*K鲯lh+b'>j.u,[,zaKdy(/h#[Nuh^* r!Cw76+M +5*ýcы49. mFf2Nա`3i:zz uZj8NPM hbU5rFn {J1 V`x?)|6[Юu(?^ѵaxA;M>*+).y[DIjBsi)m'|ʇS@T?t-jRp/CbΣI:Xs׹H~s'>"ΆB3MѸ<ʹݪ};FQ^@gvNͪn9 M@'g\O\/ l[ G{*6duSDg+Bos#&w_ң׎x+z*;Zҧs+έZw;?cvx=Wh* fkjTaذD֭a 7mv^ת˒ņ7 碖ӑ1ݍ|a>gnmF:y @vrg@T2 #jg4j=dBG7g=x V6!²!1")zJ^cMYbo ePBa/P_V/=@S.?|B1j8m29W3^һZ遢.I..RkT1\ڇОӞ D¸F|+i<8qikCv!qEwmFXHSg]u|I!\7lwʻqC%ݞlݖv" }z^NΩWO ul2yA`t~WIk@BfY&]E˛neqP'l?=+5*:.e9l{'cg=6 ԹY{Pbp[ԎdhO;^Wvzw:dVSo2L(.($#+4]JP"\~(P yW8̩uԀ>CPX QFeԀ\UFv\ZQ myfvÄs^&XŊoqjFv]ṃp\mk v^ď蕇#R.Z9 K-UM ?3#*_Uesˎct '~JFg^7r kMc5&A5X9j;Kh:DCe{|B x;C!Xd,1x3J&vwp;N\!ԹX]\O(:2[0\x@tj3%C㧳(}V\oj=4Z纵k[M;ap8P0Gք6U9'D5dTI QHjsr4q.}g]@^%M+9mHߒ%a!D;.vrp&@2؅h /.4 rX!+Qx7OxhK9R8vCur>3 $5M%L-|.&sull"WUIX`0hVj0sQɠ4!zB1 ]eb!KECB`颁ٟSi {øYuz^X^p92 Gn'U6TZwNj1h .dOU^~sYD'qR (XeriF 긚#KP }CX^7$޹pKQ42jCVN3.c- nYf6c\.kJ9J[_AX]B{;BϔSW>q#p5l#EPTܼN~&8@OUz6=B\>B"wswG GUךĠ՝/u  4qzK y'j6J7&BطDRԮ&1\ z0BNl Q lo!p#Y`s'Nptjʗ\DrI]Fƹ^ns.k=oJ1T7T8'1D_Jvժ^49qq3':wGzn8~Gl <@Ԯs_P@pEaw%ىiw Th輹5e48Tm6Br:lqN9B*=pq`R\F-i<&" pK%Hp'HD סh$%䨏)iVtإd܌5Ѩ#+A͠qwRcN" NJ2H\>V D" Q܆5ۣmƶ94Cv+/wE7 9jWi2HNipY.2ƺswaAٌlm(whTMۅs( a!ha_ egdA~ykۖ%C(peq4ODH^P9rTp:ۮtffȇC|F^0ۘ>,AUw D#ܼr +hnBPkj B9*fx/fO)q+=K#i{0n=JoF9ڵNBUNw2 HDn-sLEq F3Uy ";wmwB@qN 8UG#L4'sy_ z )2hgw&gJ3C~/|mh ]-U.}cw&MߪsmRtn ;^4;;#~;l[wta!ZSW,I9n3uas-ۙ>6[ [,riNtY\G `sRqsF߯NTDTs:{"KzpD}%-I%GeCLFCV{Eo0U.l@9Cxrm(N[N@κ$mDwnmmqߴ17\pvDY{v+WƲBj;Eˊ$Edž4 [PF[oR!W)Ƙ%kQ9R㌝05h+m|qU.@o5Jʑp C;woԀ#_@UӑXV-KWhνG4iecv+dCP\tTu88^ѴyJZ9l1(m"gkdsFy@zur5IfcvW]2ϽE6/k0ƌ+|썴>hMxO.J qVZ$rV N~eRȷU/n+(5iP̈(Y- 7W_ѭS] 襴 )499 xG+@OҤ9rkGFH \e;;DKURn?䧽[R%T7zu+F wBN'*G 4UB; GN^?|24 QH-w30ƪ_pyh:.9c!j=%< {9ݥ=W&c W "u>EJmɅg8p!@4h\ar Fj79rɅgv`A܅".'anxI%qn#헻`^˹ S馾"^`sWp{Ś m!*fkKɍ]eSSݖ0)`q8+mRa\W0CE`s;jV $jc*^ͨJW7A?keM:Wyq7ʤHQXtR`!1e=OR HB1<-A7^8^մ6ϸrж=@ ].j3Q䧼f'JCAPzSAك\T{XAGټZ3BN@5dB`J!NZ5);T<NMPߪJ*|M7 STY dďB׋eJ}`S6?ek;E2vAD̢P0}pUߒ/b3d=ht, hd Z̩^6mp\.2^ЉQ-fdIX.7򵐼nNY+'{OUV8Pmg'gr6]l 0iU%[V;e=r;/z~ č7OR=s ٽo ^3 hQw.kW JE'(9ةVp3}'4/,vGE/fQ5kt!IP 4U柵| F]4#m277a`L/iP<-KÑ_̃7wk4勇e$<8 D.X빇&)^'+ H0n睭D VwY?kGB *Ɯ{7q'FA7NS( .VG^cWc3ŕ0ӵ7B?IT"Q{KX#E=fK~[O"~rw2Nm[‡JLl%ejY? W@G=‚@J-$ \ {h1wT픇={;\#}z%cwK>k=j ,0k s\ I~@FĘN_܆@l‘O:`xQ=uZ5&DbcFP)hxn=Բ޸CӒ?%:$ z~gxZUQkIZW;Z5o^9Q.;9q8kXӵ_QN FVZ2"c~̩2c? cF5`Ws mNX嵿Xj}jk>ܷѧU./W ?HP=ǓeG "*|78q ɗ-$_[#Pyk9D|bpqxF w\?+nlgiq aA{FrdkMŽuFk!7ocp{re5;\D9't{_կpkFu{خu6\-o M8ͤ1UJ"tgM5REy,%!xPwl1%hMk;+>ynE{2O"Lo!&5W8>Tp N$Z ()ɕ.ۮH  9~,iۉнh %nV յѵ'Jt(;WH9P{E0F˅9b#䍳v/R~\XMOL,7ywITOk)Ԩy&(eK3 #hT!{:$; rsOx1F?^f4/ SEF*έaWYRv uϕ%5QtoW5_1 ;;s)j3yV)B/{.QI6%b@@񉓺yҋ]JԴkou8ŪdN!}lNbћU:hO3B]poFO{] 'ab9N>RWUjD]P4+W0pF**&+xNw-Ufz^~ZI G)]V;JO`%\׎a~PJԎ+U%{>J=FѪuԩ82]ۋiDkJCi8~ fp:{݀.CD.xp @w$,QYQBF՗RQ]fuYo_4r Yו 4:n hYJ82LJPsЮsa EZFu@:cQgy@GͿkB1kӻw0:743\]gXe[擂e""0Nۢ {iD >cE<0y䋃?V?guDj%qΥ ~``w4xZrZ6~ kR{>?'W emtR=^8yl)r$YLKvz#a8 <7E6nGkYhv>V] [M=7\!s|n wYZD(cTn1%dS8 @wo&T=hI*m^2:T6J<"j)O07xzD QL[ }.="m]xF(i>%m&RB2⽳i;8T 4`\4YֵYJ:_OFb03ф_j6MQ`.=ۗ:} [=FfEtb U8o[BKX>a$2f\D\ZwaR*f\Yxbr!ӉN7rSwhd P_#rD,\rݥ>!tLP}S:1~늁Np+;<>ѰB}ԫ8*?{A0w$`w7-*iTYysOXRA ںxs@_ne\lɌZp :.+%8^3ZqM|&4h cun`ӅLXuӚ.$g͍BGjtB 3SIuP!{w ) Ҹgt|[#^(ּiЋQtڽ`9`(/DC]!OlRnJ2֏*ۦTsN?XbMq8ٰʘqEt՘Q}R6(JgLqV g̃]a4hv[CFouPx%n\U)#.p6a.te㒗vP_>.aZf9XB5;;V=V(8X`{sGB]L& e,f5i~uQtȯ?qQCjlf&6}L.ٟA3@ ‚ID iiKJt ]sGF&1L@ʓY֟Fp6F+Q.4aD`Ei8!xLO%wTD-s^uU_) [2uǚjbnQ޴Rc W2vQ61Ѥ(SxD DʊLx΍ʃsƧ lPlr hۉ I!e;.;OԵl\U b5w4ƕ " &弡 ZҘxy0ks+>z#2[k#^Icą؂Dҁx42n ht=k[*-m*$Ɓx1 $mп¸uu@zƫLyrR} .cy6sjGS;yIZzoUlO]{pDZaIW ^Y Gz6G9J&4渟Q K9ë<<.Q(#U\ae>c.[kwV Ѫm+c]mn#E" $ϚP~&wsEg8eMΡpS L jovBi*n>2P[Ʌd;Lppۛaa?*h-$h+VG.þ)ԑNrQt.!g\ q.c1i78UTpƮ>R@Y/v[jKZaS'uD8 ʛhۼDŽ(| or綫2FPs]Px gdXtF  O7Z9pcE.d&[4,8ǜr.t 5/-B ~MgXQi?ct^7@;QuN늓--sÆWD?\}0UŶUt!NeCG56ӷ~MD^ZznpU$=%o $btSƁR)E`u\[!y3WA+F8K\9ȫgW ѽ+ޡq5vkSl53xNmXwDgpMT4/.6iy*dT5j^ʵ{ܤ=ϢX9[ޑqwjE7ɍڃSiY'V&:c 1usU. Xd`1\/|#vRj&\y#RC퓠 q%j4fq8krRFPA:Vep)R~6Ra-N5 q7+׆Fk/%l /gDUZkxQ8,ʾbNrqva_j:sX1q^֯zwsG9Y GGy;C 9iq{g{Ο(4@;KmEֳTϹ;8>]DS+D3vMAoΐ]l"r<*J+mXP\~+I]vRxpPW\%pQkH›ON8[r {VZxT &8!uTH{ZPD{Ks{jmI(iH:(yڭʶC9..T>abG%Ó)T!NG |Չ=HYo$uRɍ2A{W[.^$5^HxaC9M{:>XQ=Z}*B^ ]W<%ϧn /o=kTd7` L Z Q6*lJe؄Cm.h8ZO,, ?[nيgrҔhAƯGF  toZ]Sɯ!E&4}W4cXjCxg>2&uFx,Ϥ'|iһ6S @D]!D Z Dwmq5GsiF 6|@JR ly SQWS Mq7!GTꯁ裼~*i㛕N8Fڸo~V:apXSP=˅״sf? B T>BuA0@G%q+݂v-CG0hw Np^u 睡E/pfn\&G;w KmvÑ·uBZ[<ʎ#|Dwǒ ӬO›]Yp4SMAT95h-jnT,0z D/ -Z#y 4b}T{I"0󢸇gSjcO.MXGO8}-PֲcW 0_(h Q~=]j5-ʼUqQxp 0$%C8 p]D浧ձ(En4Py1fgAr2ˣ/hlB0Y+G#N kjާ^ f+*il M },3:6ήD8iK9]<,pwbƷe Zde.,'R]S±q+Ə5)$4Q*1* {@Eи)% zpj۪GSQ@XIPS×O':k-C{k:!phqwP2B:z}W[3JzgTU5ZA"2Ɐ|dbJ=T+ 1պ^Z٬n?1/uX)떬Eӑ*)mpQT%j51>46\ i(\iPZ:e{ǛNZ ׸6\h7Hoܬ9q4t^ukYIH*.##vMHԕn#s$n\?7Z\ѓk|WYjc]MM}4Db?75OK,nS {zZwR!k; M.$TSWLCQMmwbmQIi0T6J}CZqȑz5A~KQӜ: z"XcuhsB\g,azPظbۖ*ci`sgQ,ʹ:Xlxc]㺴U!P< ,\.ǒΩ_֠S9 w[G&Ƒ´e{wD t6 Z\ոpح2F\6\-(O@<ց%rK2q\oإhGUyk)1X䵵Awx > 4䅭rWa=\\o'y䋘Ek@sip}Z3Z㱨aqUˢ=Zy0c2M,SԦyj|K(2 Uџ%yBxU;U6cMj́4J ?@Pu=IW;ȩ5{-+͍URk'BIW=LQފ 11)8njQ.`.P:cU2HXRaV9sRxDx㩽4*ND4-\49CJ~Aֆ!G9nz xyZguz»6$;vˎ7l Mo! ^`:g{:Aпµ/kJ8ݵ%aq%Z-9y9Mzp3ZwDnc[Uݭ*˻ΕltH=VA[0<.0  ed["_N̨JcUɁ.Β@6qV UV SY-$fHFcXAv -t]QsM SY@ʊ'zy$`Į2k|+ӷt`-:Boj1gYi7T@ݡ ESq.H!j9ј)phoRNҴgLkZyᬌNqNsq7%/ o >hC(mVc@*d6yu;-Z< VG6G?j;P!:L|WI)`yjqhs}9"n7N!fyϴ9)e:J3 {;tAr4`1R P]GƱo{>ʂ>h^Ҙi]RkzNqh8v`v4f1B#={ rY00VLB)9Es |0QŠD^ύ4=JK6:)|i'h >7)F6~Їv'uC3꯴/ hu!m>Z s.19eqށOUsXӥ@-&ԄZk3eKid’|S%y Ϲ^ʽ6(=hi?NBU%?HyWThaL\t\N Ȭ츠QR^#~VcBs$vaN}d8Ci_ =#zFA ,G*u!uGyLU݅$V}X rxJ#)胈TSl[[CШwolTwh]9{U"p +=s>fgN7kc!/xbSίs9iBp0 CCq >cUL,Ӊ{6N!J0*\\kX'y$ yL-B"YrCF8^z Pe7CYdl`f!qFVNȋ-;<l$~R>߹vKz!#U=@.<^ng|Ġ%h <}a A+޴.^6bT44pé du\L `J pԕ In #'ha/6V6J@n7V9y+i·O 2Rg!7]tr)mAJ*Voڻ!;6pz,P"PqgR@h)T[w5>gQ9K#Iq\5cS [dZK<$7\sGvHQ6g+O3:7 3#HDM^)q:ޫݽN!GǢ ȵ\ ~5Qt\8 ^(32 [a{7(ZOD Z'Xvy\QfC{Lxk8 DNn(0;Uyj cA aRch\˘+En'ySW7RG+RZX'J+2[/Un5QD//ʂ' 7F2Bu/QtyVL~2:YP*D\AK.Eο9-? :389 DרVc@c: 5.syBuqX!j?$ Qܼge=oYWdk H耳wuHӅSqU5 G- Z˺eLCWs{.MwS;WH٦apSsЎGWUj9~]5%IZ4;*nwE\jr6y2IXdpT<ڦZ^SqcT*dyMB:(;U NR){PĕS @sjebe)*`Nj!fO7#avToZEJ^E~wJǭ#q; SO*Oܡѽ95ƪ#W{#Gy'x+^1*_Yn /Kq_h7r+G ->ax(;s\2PMv;,k]NpoXU=E&~e3^ivn.T)Bn<ȅ?ʷ(n#Ah[rVX5clepզ\vA-!I֏]`++>'G60ugz/w􅖚N [ϋT'fc@mARϒ=GgY 9p?\1nF lDxIM:q.BҦ \y';M9)3 @踸k i\*. 4Vp9nz)h2U{WQ"3h9B5,?'|M(2L3K'ⵠuY"44= ZsH9F\5ԭF U^,m*F䭵('D?xwʐApP'e3eNeA窋)y[*^C\UG^юpwE2%/¹GMWIj>ghF2ϚKNxܼgM,::{@LtZ{ǻsP-w0pTЬI:aHV-sR)25vnw`BԧF\BVFߓK.tN)CS:+ЗJ#hCޞ^Ҁ=ip~pB!۫mvqQգC{CgZQPkJxƮ. f-%M17\]b&!sET8-#'+D7vW ޯ^ҫO&&ijFQy) vTwuXy,\6YPL|zi㚀 FZ [x_37)Ƹ9KN/ضX:$O2i>Ȍ(-}JC1;:Wȫ=|0KjmDѬiW ;n}deA s YHc^Ѱ6+A! [NDjThcN#Z(1Ԩ5.*uz!xUfwN /pP {24+3*B_K\yz8x?!Y'|\¥78ө3 v<@\]?ʡP8]-[yԺT" 7X_;@:Zdo8Zu6ek[RbeԌ,<7Ɋ]kah9)p*'we\0ݥOz9)-wOj7e.Zd˗.7k$N?l.2ټG')t֩9 ]vEY@Fy\5rv9 uC0m7TF9d-%4cqSU^4p"uRv+g (ԟE%EȍuB끞eu+ o+Oʮ5w\%N%/\#Ziܬy4})=ru(j?82|轣3]HGDc?kJCJphd8:+[Q(X[9 uѥ`Jm;U4q8gvb>)ϳ3s_CX?m"[0hnmErhxln[+F™ת3![9/N j6_ HD,qn)-$k` TQol*7E鬹!F:7G d GBoX+ݹ@458ɵ_.νV|)-ư==΋8aXT#~n\XxSl2p;)Wͼ\<0MehuZ˅(:b6C5 : J67^̀q jwsͫv0ÔZZHL`I#&cPDƴs79<*ֳ]4uRKn'CQGz#Q\k$+jUFtw2PJ⸎@,3]oOJFlnn>څ܍A*xeImF3-D9\l|q. j aޛI%MJB-1rW 3k !/~ V;y#rCT66"v1Av8ZJ1"eBr6v@R4ph!Q8[\SeV{Z*M7@Ƅ FܷU9\, W5.{Jt>eCBxt KFU77,fzFiejdDp^!: O ,#m65uxR׶ʼM<:+]El,i{H\PXD/i\VL|KUR1ˆQϛ&gZ9&â:ɝr O4Kٶ聁0Wo>ElT'r(. 1R\6pY`;\[ɢTƗ%.IB{7klC[@W *ip& HB L[+]1 {ʏ꤫ڣPm66& .CcHʞ SZ7-:,3˾(aG.u{ oܱD5}\KP4 It\o}pg62P風k<<OVˤJχ\czQahά65 v66tOt37}Gh(*'$Z['F#U bJې6𓢉̕7'1o#L#;r@78m`w'ցQsZOϪqO9k'ƶChͪJG5pTct@UST65]Us{G LwvqjYҏwB)£ڴ2?B@KPZ8P~MJx.BvSB\>%Y8ۧK`+x\-V;rC|%ݎs41hBɟx݊:sO37Rp0sE6 h+\U +X6x1i*b}υ)ލўZii\,B{KRN%AjOM\]Ϣ- qQ.R6}ExE =uN7Ke]k FEVުTɫ{.%76HH#Ɗ:HxCTNZ)tFJMvYi>]پ~t.YwjI`oӪp#xYu|(5 NtRà~Wk%K,?PlmK'2h獰PR|-y P9.hVKj 'F2>'(MqIBؤzT>q?-8\N4‡`Gi;/eDT  fVYlOi:M{NapЇ Z9MYwi8ǚ?P,Ԩ:P&W?f-\8爲ݻ츅e'f!F&![t;a*PzY {@q}qύ5=\TulTn\-z89/,'S"ZZ@sP~.:tX#1Up 9@D2r"4J8?*uǗR^zcCO% ڄTyMp64:0Ʃv#Vh›j:pGs87ht8s %Ç\,9.~yc*nY|Z(ӝ%;}U1x\ޮ ܵ>ѾW@.ϑ[FZzF۽NQpm3O.'\5=ҵu@dceU>'ʆZwK QT'/ 612:Zn@tNx|׌^"G$8O6ɐ6Yw#cZy5\TJAhB.s>kG<,qb @Dkʫj:0IX~@4Ch wWC|ԑ&_% N[rU'U jS0 4H"q=W@A;蠲q>J;$;G@* M TEH8)4<9\-aW(60mqc]oq4z:V'o+kOHQt~2PAA\,u\Pw^!a{}a Z:QT\ľ.n-%%e/i8ne"o';-Z%HeˎA1W!Bn[4:\f4sVcNhD#B 名Ԙ37\4W8 q+8e )nV%qss8V~{)j>(ipfm;.wњ@}z)s^VO2Shl6UomCtҏTc<rkT:J 7@@27/h|A )h<Ԃ}6%;SH(H?,诋t3'en脊#ciǘQm7IhxP:"Q HCQV!Y #殁vVZKkh@|Č-dr#/A:+z?r"_7S*h2 H9΋ksVN)y KD).??I8d@SM'/x#*2vAΤG5 1e.yZ06{GOR>b.˥p~.c+11Ҹ^ց7U$-8-Fp>CDKc66/ u%h NEHxeLвv%ޭ ~\㟅ڣN45BgU/v_"s&y/5a ^s|I{VޥGzY0*g%q;{G6G'KV䆂@/dgn"'V܌{)s#5p7TCF8u`›\^J{Í_]bBJ%jb;sjO-BWRs5"adϪȅ'DMH V p/A؄KvE88d0!| =B-˼t9Vwn .6#( I׍^`5_ J-d$D/6vXu_0`'K|Wk%FgD4-MB9ŬO<|K@s zKZ%(16PG p9CcU>#cD -$?D_tssj#z!.svˈ7^0@02KpCBF'Z OkgԋD@q[pC-aSN]h~9m 7a;qj'eၬ,HЕ8-Uw$cE *"$r[y G!JꈌF^'C\$N%dxIߒ* PEf.wR-E [k .%\Uk~N3ap!`,~WDѱ\41Hၺ:/gx@\г6 I=2/gSdϚO^IV$} zAl,E=\Ou\,"]Wr&WM:_ڰ'Y}ѱjc&7*YZ÷M@ﺚgXeA,o)Sty=O+" uO%L(ύ;.tURzhk .*#b9o9a;0O{HHH q#y!cKVLeD4z^{(/dArTǙplT?@Di x(5aw[򲤺P:$Ee-3EW ZߪаNpnNPipC90m{j ^-pԒ^~[x:.o„:BM:h8kWNK| \+RSv (|YD@i)*W t\-os\MCYZ5n?"R늘t/*,\TeiCk4L^56TGxkzv9RU{j+2ѦBQN~P<$tr7[vA7,ZD)4˺#0HGWĵeFӪNvTVwVmFWtN%CEBgK G(YyoW}g(ɍZ:6PYTp`EAi;U@a.岉8:FַԵ:AJ[H!j}YQE2'hcg}|T?j8v}g'֨S$|[.y!A !*M*.j|% 'B\/9E5h'+܄qi/fae-W +$Vrm3+43*;ϚyIG۷jx>^tuR+۝-Bk v"yWn~%1Ph7ww39+5 +t{F:/ kGdBƜʙcӢ٤>&ɕ&o9cmv:~'u=5[2f\E櫣|2wG zs%-41pk6ׅ!-J-d4#uѱd(h&5NUa5\CR# T&THk>4uk^s,V<uZaƥ`:) g^ x#YQkT@ Ģ w.Oy[֫;Qu'deuH"uB W# g+CK QF)1Mv ̴6ut( x;F4 ͷ[Z4F8JDzB9>%eC8Dt+qù+6P>cu@$\nyee>x. ƛJ(/|њXW7d;#3q*fy,Vk'P+IX>PQ.{oX|EO=xD^.и3ngWp<9Q$p!KZ:!q6dljQAS/ cj60)~4BE-9E?xM'T荴VJjg.Dg D[+ޗ {Qg0sXxyF&NpU`4[1.+>A謸7 Ѣ7wJwBZ_Ʃ\Z=4\N>A;9VQk9BV-E@oB]BG7yC\y O1E5,F5Z$ir0;R1^ rt ШKEwG0fW' 8Z?+Z]v_2bF#X{-^ F;Yxh׺z!^ p/fӸ{W8V~@{c_ 7jG9E*{ܤcFJ9 BcJns:J mAeԬԻ¹&6kPshP&mvŪ! g>fD *\N5Xފl !eךԩ\]I]ܚ0#^CukHXֺ9`\fVL]HhJEjE(}@ণAdbn;PVct ebwU#E%`o)0~m'.qU$iֳVN@:.n1L骓Ry5M-Ө2"xJǖP,Dq9*qN01Et;/-#^7klVZp4tm2{c'T y\&4S޼I3hLB5wy%KMˈn⋀Aj±X-+..nt|]TtOD,6\nap) ,wˢ,)i\pΫΦ9ƈ̕ <>hF^+C$qqBB R=Fl ^7HG6aRcE7u{:Ľt&Qwv ѮV_?44^Sovz Wje/n Sv(MBuOUe7|-\-q5Gv,sڬh_(Ays_֡X Z~Ap΢n| jӽ6<]śFʒ7R{Oiw0I [4hNFL.eku^"V G$0{,:Jóшqkyw:qo^T4;_ővq şh^';Ht \Op?8{e@t+]%cl9h8 V$gUmgT4Mw9.a\V:}>Al|VYW|@h.R||m;ܝI HԶC@tLdJ{+djV\Vq8X^ZA2`l7\NO}?Gy9+0w &ydk ~Qc\dp: spQiv GХUHВ3؍xwjb9R(5K^Ҝ ̫9 2}5Bm脛|9FF5nwt/m ~ j[R7SpBm .;15"gE&,RNQqp$Fϻt"ӡ KXHelѶ=qA?4j-](ef!^'+7z}VhR2G!\wkW'ahR-m.q 2עpCSJC"Q["Z?R㳒wN\+0lE̘sI5@̍%x˺/uTt$2%; cgKngLM6~OYGF;jz)\5 yp5P kSk󌼠3O<7,y9kPw' --X+n)FOU:lvaP4~ R|ܽuqXsZ5KoKQ\Fy(iRf`\iEr'PgG[z",&Ku$B:QGͺ)>/=xtԨ:x]ndE{ݐz5u cLEPwnYZXDE \ .3Y:h;C~UB#U"]֤HZ:W\;k 7^jS 3j'x'`Pꠐ m-2t90s@0t4| Gvaeo#M)f#AҶ y@Daioۺȕ>3NZӅZnJNjˣR `^ MGX+$TpjeZ5jeiæBƣ Ϛ(G\B$L^֍G}+ Eq<520K0W*W}}= Y*]݁u ]74B#`~{ސc+\lSIuCh2}u^8j=+ oH*CtEŘpJh:.v,7FL97;:/ [W?%;ipVPmΑr1^Gh6O֎bZrex@o$ @t)_#u\FvR\7ъsuČzK`6./6 mSxlȺ:,i,uR\BgۄnP PehmΛ)%F[0^ƊE}!d1aMVs_%W+± LyE.н݃Yz[V-[u( ׵:\uQߵ\":(IlU u٪ ͢<=2<MB:\!=f 9qciV-9D:Brė[| ˟DB3hW>h?<,CJW#{5acgwoĄ 2eZ;/d5lmq|iHhةo O5&Y .&? uy@;ač1?Td3_̠ˉwH^u^)6Z0J= uP jf2k\v  |Sse\Jm ]Lx>.HcU T8 Q՝dS#EGܠ=lZ(ΘYN0W ΜrԸpq {'&S#d5^O@E)W}<|(ZЫSk+ gq(}Kyp:,򵺯(8!ʈ;ns1nJ1,y%q20-MiluC>ˀݺi7_  9ꦛjzG64ɸЭO1*q5p;:L#M þ1 n pY\5r>h*1 KuB; +wB\M3RˮS|h - ;A rBQ畑sbFJ;x<շգq(p58#4ݦBpSg JDsipcIqvwǑ[mYa!cAF@Q`Q#:p=4PLMTZ./\DP$8e̢S9ڮP&9KTx+<+s,od$5A` R d< ۾\moEGEOX_!p VHv3w ÍB}mRgxr RNHҁdpűfTZ`nR!G2Jm:Zek*Zܠ?Dqv`G G9[4wUBhm#7ʦvī,yPl 0I{p DxR ź@ۂed!; 3Plw1Ad[Lqv6k k5*ζ /㨗 |t[:!>bV`(cZy^,G;B35 TC%q[ꣾf57M]T-KCCFWSȔs 6G⧒ggeZI0XϑR x}.{8T/iQmmv9JpO1_mAs¼:d.^AKIhwJ߃!w]TRwۺ. WekuPI HkgYZ""#U]譛~QNN/ {6k:t5ELkKe(Ϛ 9LrXU8~,cN%K;<1aKc.RZgbJH Ly# UN滕|J-T 5RZI?0pu. %q~y {֑<ZG0˛oP1%l! \@Z)g՞EM3G ;ߺؘTWpI@!~KFFl"x\:SI3yٲ>3υK\OԀ"I1+ JVG&VawPYhؔ'ϒǪk ԣu~QnzUM:,k[dyW[j~%V8cS?9a^/87.Eeqy/ ELgbJV UyfTkGҢ)f`X"5(.nafcPEW88Xu;,T xmh1 K: cr\%IjAj{ܩzh1X-(wtݪc'\t9q(J:r\Oy&̴+}.\6"M7E%cOB m^:nW3$GztXW?$xOD$LWp3\c-n>ID5u8%xs' ^.l/ }6Qs]z.+$/$p_0ܽJmye{2mP`}nI0C`ڥ4YiO)ZFY!+ ƒkzd,ǤW)#l .7|D 1hT9f[:\:GD tJpH aoQݰ6Z:лEttV.qeaaOt\5& u>Vpt-s:M[""զ.s@7\ 4q+;J=[$75'6*cPas6Rm)mF[s^wxYwD[sSvqp~(pym\%3LjLNy,{Q<:.uڃmef4H+jpPsi-P9Sp3,kkV^YQ,R-<$Ouˎ8@ T'=e 3 ›qEN`cDlkn!} \fl9-y.FHL8Bh1;.=i]f##ش# tў @k-{OĢH3aW]"$n`E'-*_ 2TgSUOYPiX×8XwñF*KnXnb%Fr ey#yZBt_2'CEZ/f{OL{äԀ_L`NKs0R1@hT\'0VZEY4\4j=@]:(sXuXC)y 皝j OV\)&~

    ꁖi+#]fD~y)5?5Ơ49w/hk^i9>jMN\u *.lk0xQ5Qp\$8y-fE ƙC=ZD-!N>eyD-BѤ,@sPd}U5P浤Y|8ωe堙+ꎝKVȭceΈXwr ‡Uc]Ƚxq4jH^]Wm5_1ߪxƪ 3ˉ"@*^F]%I=Q|Վ6㻑;# 4,6<:.:z5Ki5sk5+ r;F=Gx7! cab:D٭ٚv|7uý x}gU?7tEϐyJ"9VD \j@P*np(P\H5jyKwd!gD𵑾VA*wX0~BזO]\Mu.2l6^:v.7 ; Vd(&NޖUOT!Nq^ :啀:NTL.(o%Rfޛ(q+'bhۅqT/j< \y/swK;(ShRC賷'rG3 *Z#plF#E'eyrCPF38j禊ZnX\gN<1@K!w+6 kUl?qW+EU<^Դk$cBOXpFj1A}eTZO$/ ʻKS[H29ʙϋ ^}h,!4]v2W+/n!@GC8OMw(,_'r/<tU%TKX:J)mʈ'p/^Mc aҧ@vR4êHatX98Xx9(.CgXſHx O#3kc2KRZFƨ3gH+ )=qnݲn^o^εB(%ɭ&VƺhCge:/dmEyւz/U͏E.d:5KgetcdI`4̳FޤG5$ y/ KD+mβJ0 eZMQd֠:&J]=W T*W?-CsRH*.F΅t^"OԌg(i[QQА$b?(HpW[*Ossp--f9'%[Ey&Z9(k\zf[W:juC`*<:}<T:}\ω#P?56:rZ[.ssrF׉DNe SxGJ ^Y5'pF\_mIY~1.GcQszrqFTO!"d ˝Aq*epۢ$鹅q]h kx::sR3 NO뺖8FЉڮ<)u6G*d"?UXJ)F`z֙ Ȍ=0V#u Sl=VeEN-xj>4-BiToBz FE=Y'5kgU@y}GD"ppc5CNv" SaqiURr}6s'Q=B}Ks@΄#0O_5O NU.{pwi#@e@~~ i3l$LnH= ٓ.*Apo)V<ӢQz"q*^1P+FŚnS+wXVq)V-ԋT>j ԲGTo_9X.Ƥl'-sqȮި![% U1=@P{}!ay҈|AD0~Ef-xiqE)Oʠ dGBV0`D A^4sI68]Q /+1[Gw@ pF }%3C.mժs耂yey8\Gs^+U<N & esvgW9܇ʈaOx!b7‚FUhV]u\FFK/!.71YOxhO菳c\#`#7w` BhWAGG~]MB>*㯙F3gq9G$ZC\QL} -N0c(5kKDeoj kwT7P'āCDΚ+PT n@X RcGx0TNBOImh&4 [J5!xmVbdok[ȍ֭nP_u9YuBS8GDRrSDeNV) aBwY.`N 12pNpd.JLnQkqeq6zQ"|P볮PuPT Řu9.& /y,AiO :WiM>v(/.db::!n!IWer/Ek=TpMS er߄"JK^N&6P Qy.%$Kq lsKGSZ5~KA\nh+-&t)e9'@NScFXtYr/xax6-Ep@d@%*91J ;ڡԃ]:q$`1:ޠrQwBgyYp`wB樜s'~ uJ=ߨ+eǜ(T5+']эVHB]zԪvUNPDѫݽ@w5 Ӓ@/xo+`-=Qk#9er Z Ju=m=˞ʚX֎N9@)Ҍ S +TӱyI;@N׮\18PQ <'n^5E;M ݨ]{X%MF#hl ۅxok4\UL2T:ӿ%uAN\o|w{RsݓP7(+5Iq :ae'cd D~-@+r5V47~[F}L o /h΍j&:)᝚)y'8za|Qƫt]pF r?*>K9osRyڦK98,Uw.9̕t™숇@?WSxb~hq!EʀxA±q ׏XRrT5z۸p62G7z)Xap&ZbcTS;e6 ghw)ngu}XJ (o ?{Wyktݺ(& 8wLO̅ nDzwq+4NqPB׳ce'\?ÆNE{HAE3ΠZv( s|c+DSSWt_V;GgDKDx\Δ\U'dӟ6ch:laqB'e;R2|.XZ9ڼ9‰$r4[;)5* . JԤܱu&OZG5oXqNQ7]t6Bi(nnlD.`JlX6c]Uq>"Z tg;nU>u^145xVA>,z!-qGаcQp:$i {ꏜe]5 'B;p xNAkNP :pIĕ:Zok[U Ԕ.ttFjru͆˵^҈`^YpB|,R\zJdIx&9)±IjCN5:EYF &PZZ+.B:єn7tX8d,7G5V6rRۄ#Kc@CtBE] bXl:# 6_[8]zlXp#]5W\+.ƝT^wOBDi:tCBDZGXZ"t*jʤ>qV.jϋRu\! dCiECz8l pm^>Z5Q6c]]\S(\Mj5j: ~7Z>rppkc+8x.2G]lRF‡T&WT]?E'q#E972vX^tZY(ye&X% y@B#k׈B8 V'%RgB5#4!tM̍M23.*f骓BsEyۢso@DȬ0J skT/ʸ*ƳNeq=PӸ,PkQpr߽ytK= WΫBn.kr3W"UuEhhFz. ep=T# ,?p oU];sn&$过`ӕ,a <Ԁ;CMG2j{vZ4푖ݢ  B6;W*_t44jJ'Q"F/5d9I &T_уT}Zpqr6s^ش@xZ[xu^1ZΫPU7jvQ=bJ}4RL@^qc@ S}y%SO"?IJwqsa? WMOG6I\t!AlTk[nNRIYzŤuIR] ,_ lmz7X Xy=˘<׉͡]gBT@GU̩#%)aj1pz < d,~i\R7VNEl۳O%uJԱt +JM0~ЉCfZg|_ӉxrqMᑶn2.(8P:lfU\Ѻ<ϟE TD;(9#8p !;/H7e-)ڳfy#Z?5YsZ:[EKj˵W͏5%h8z 0sUeb]stGP[MϴPt@C%um8+>եi:U: 'Kf:# {F|oP;/ ROv5X{ R %Cqv1+3z U \V8X\Ř S%vlpܮ>hp5Yon@Zɟ';,p\_̖X< C|@$@gSLWAhPj9xE4jAtM!MҤPE+i (.j}\.%wS]C#*w*UnЫSN!kFtq.%—Xn;+)m6?USLaۼ;Fl5yS23 ݍֱ%l5xG2\6:hV*71Z5U.q%H[޵Pt'dolPl!/䉷Zے1ʁź4Dfk/d㽻/U' iܵn8/(k#Zi;"[B E'{B%nY^4sYa8w&9YU=f:,Ac QF,1̬IԫOVȇY1碆KI2I &uN0uW1Uwc:&ABmЕ[F< O9/<]TpxPe\ M $HYqOyS_\d 1:PWeaEE܅\k_dNp񞰝q>KO(œ'[+yrWw(qX fDhgu+_4jV@V˪#=7DA˜+G@ӛ4M՝V\"%g|hΫLjY'Ua+k!<Yq=IX-hQv¶y;_:\9BsȬR8rfy+ae=k5*~֬R#9qSDp\-lkuP'QpV2V%]ǜJ1T. ˗ -;֯d$?p\KA;#A8WþA,pkݶ5pGT\*cv!39maxok?uk |ꄺcmWu fdz4'ʜyFO đ4Sn3Q2Ƹۢ]y#NcxJ01)6~OB@[<`@Y.` mZ߷uæHu=Tg\ eIv,J/9X@p:Ks<]U7wcMu q n0m{H 1K)mE'D"*ۘ  +w3W`$-f5Y˼恶> K`膊I%Hti^ 9J5>wq_U-{ReC<.2MF]a9Z.`ʯ%1#m1s B?Yu8P~w 'b<tM1FW]2 F ܅VdBpË=F!}:{q[exv\$ VK]ꎀi3 #aV]T6;3PJ]U4aM0r cU_/h.c@Z^+۷EDpfea@WtYnZ1vH-.h'T-Pl+t̨m=!@C]vaxVjm.*Ϗ8C;]>Ap}b?>-n6j(A~Qq*qܕ2O%7ޫ?+C 8-?&9-,.\̬굜ez"۝%@:ꤰ`»trBL- +qgD!ah5G`!dGKZ Sݒ\3ꥮ䶍">2긭iT:֬gX#Y@ ZuʐVDH--? G>@`y2:ʛgQ =TFi#s(,$"7d~g+t9>KrtQvIO1TGckHbqۡY(9\Yi55`*\='"m8؍UʛU1V6uRcNJIp Qtjۉ@ѱjq"1qXXXh2T ׊>HΈ4k%m8;G유K/ o9^+zm+'Q0rPϚ&M뢟g͢1}1/KGحMq`+ƪ@+.aRaFm Q:jy7 :iLH3*;AVHAP>_ yY Ks^}WRN7k YQepơfVNuQ2U#l W̿e[-B@w_V8 &dx ^Otĩ\(jIhGF3`I-IYhkyC;yY茷E 5T%d] ;Sil]T >zn? 2m䠸5DwP @UR18h( 1 `9[~V_=zc\^O\<\.!P <*G%򹍊j##/BV5 ;rX+`y'YG<]"c_pJcgnvc d~ 6 t[yMp$3ځpQBNVi}\'`7Qt"W. 52wkZJ1ȵD!y.eR!Ax05glWНʵR 1)lk'F^\ V02Ҿ'e9Q{yN"TK~ @=>d u\UiugQug8"zut\ qX?r0[[j?٠~vcebv KDG]o WWTeC @s' P*kDy:3_  rW 0*sZ>'8(ogxo2s>z(m3ktW:1rH?K"uW>ߠJ6[7h.Se){W ܕ. y" ;Aq÷{ Rj jw7l">/%G0Qkecq wЦ<ޅHBuQ8W>XGD P+}0+6֮88ӒhOBkIӈ)W%-نrwq!fq?1x~.i˧5ew|i2o.V)vIuQ%b"uy B$jATpăpn { PBΫ^(\Y=$7Ϛk5Y`>A?UhqhB~й]95CE`' A׸9[ NZcEI$m [+: W6jR}ڬ: 1o7&NDSCheEԖW_ODZ VOBWv "SFr7O'(BM ܓ An5"OHC0Xm .㚛Zf K8!Qv|+41XαG B0ug~!Q&tUŲ˧,y>z Ya dph$Hf:Ss#duUHZNW \iSkzkRRsUB4#Ts$,$q- @e傸=Qu-3?%#>k $uC_5OW,Z,y0-4gX !j:í96.j=P^ޯxNhuV3$k, (uOELub+PQɘJ-ş2}2$f5iӦ:<?K mijm;rq4cu߁eUkA[H#\TO8PU3{MFMFv5IAq(d(ͭiLokZcqy(:1KB!FXU 1˔hPrUΈoG>eCw-IrP\7k/ag*`7(;?rݮdn A2v(ۃg/njcVKpHEs5BΝ2RqE؜'Eh%[`ص,`}YPIT@q۬8߅BB͠ E=ej'Y#kW/xZ2곅.4B^^ Y;{Gij=h~1{ЪBEo8p%g#YYcizsN5 E}aq >ݯ*[Qj=b̴oQQ#id{RVzW5/eMQPdGt*#8z,ݞNR8]=ۊN?U)jōP*{" !(_O?<$[O`WS&թ(0UHtZ+{@wQ{vˍ>K 1%gR)k\l'̨ޜOߟE-DlXSך2]<+m3Qyb ոPqCβ‘Ձ!ƪ,py!qe}iǢ<# 5- <Ehc񌕆~-&QseRCBN - Kq):ꧻptSl@pZ9#S ]n/Le|1ZfI>[YNܹz50Ըj} 7=qRs}T\<\4{wGިKźC0"Gw+C#g{GvpA7;R@$T:le+L+ԅU3IX=i䄗y-kG7lE+ {K@9[_2jzkepҙܭ<9-ZG3ģ}ztW޻XLhQ/b\yӴ7Ϣm5js3Ņ<̨E. A$<֚sP yr<#BLgXs]߀(pB\ U|ʆW:,C#}uZV @8]0g%P7epxQq8 /vgy 4 ]MӴ7)y,>tD{x҆Jeq;(h>JXX7^y\mvu\<+`adȔ?Rfvj<266>x-"5Q`۸Dڳq:-RBĭaT@+`ۯ $Z4DgE&?DpsQoFcl4(iYkcB %uy3*?TuT C~gc9GʧRok wFTgu^QHqGꍤdO(=BǘP@\-nVZ=v^?8!DWQ+^e9',XzQyR2Ysz!'R5b%q6+;,({IMk sR0P?j܂*NޫbaaA 7YxW 0 'S!L#>CcBI6:3'x sW!h FN#EߖW 8Db^;@q<|R@>)cTق(lNW8$&r\;kSwNQ̝ 45`|0䉻nh eCʆ<9V_%[q%MęC3+i18Wߚ729 䥃,UFy,RYX -]F-#eV%E\#7Nn(&瞨;BthtXw2k!By#E=S8C )du^Zوh0?g,1; lJiβtW 6\ՂI "6y!9jepGtRcJcuRg`(1C`fa]J s0!ɕ.cN/y.+paO渉.|˵ye颹#+@,)&9Rv]ƈGPfIiD,#; TAx:E3@w$.2Ft`^JAF'+^nJS;aa:)BP#|"Ѐ:p Cj u@ݦѧN}Qn뺙خtSwpI&y3 (s!vP?=WԵ.S_ F,B<;}J'x4 Xn6^B:jo;L){^(hx Ϛ%Hmw^53䤏D!AI|6jrJYq7Dyi+n=BN^rP`sGNXZ]IQy}P' pkDT6L 7ѪqK?{cQ.<%Og@VEDt@AGFDN 25n1殪#Eqi(,!t~]τ8-r{ -8s(r8P8>eQ+AM$AAp^\YB"#l0h.ewP!jIPB=d.2=ybyeI^XnA5O}VyX+hGH%, J0`Ēږ8P(g75!M@#Sxu\N5];ɉB?3O2=Q.B d!kJ.ៈ.J(mk ڮiY6XtJ>v^ƁNUۢ|P=vSP\酆8gB>H}S\Ū9lu:kQ(D4FuP3rFH`:Fu іEq/x9kgT(!snW[LCaqݎ3h'n*d2IY{+: DU9(fPu}sh  k耗?FjƲhw4fgxUmObXk(1=vXvzl}KqC)r;CGU FTtE, m+:apKM\7^ĿCGvH\N39^,IqUӨPۅhY\E$K0Ό^1wBK@r_#~\IZU(">k 踘zJ8PlremϒJ5.AL.N(x\uG9Y+< oH.iG챇|8W9 TgEgT*olnW kgTw ~^&V3:J8eQ i^\t\.h0N/hYqSNi(h>Ƨ 0ιE%i+]S{@;+qvvYdy+[NާuӒ6z^;,H.Hi+gYBż-mjܨ/Ǣ/xRUx`Zq3e#M?eo"#C1NJ@5ʌ5\W:!W~ViSm(kh?Yi@QgS\ ak5]%x 2T@?ʲ k .B4# .X*eE|DvdVVPK +?S]>KoŽ蓱X@9FKWt[ayR Td9/YX3pxGd R:DgO -V^=~D&a| )6)Ƌ9.\zJ O48b m$!qBF,cQgnK?3(Xv No 'Fng¥)uXDh:)N+UF'hSt|֯;_5P$FҠhu\GM!CXc:(#ÄȘeO#Els,iV6VJy-rW,lTl5Δ8s䎍9.B$M@eq:'F%,Ș\KA3@.XˊgLC!"'ȅVBqPI#]nP7 t0WȢ F_tW@t^6E-B to;a`-@1%3u"X-n<ԗ+2uj;o#Hh*东~%|C۩Uz0w3sRG꠆̩ чjs?e\.K9ÒݦTZi2G5.7gD[9:99,X# /Cۉfhk|\+#|uRj1$+w\5 B?-&:XuxQJW.+Vj1!ADf7[ iFinԄuQwG`|.n6_X g%pqXRcdkSoӒn6СGxCyV/J#ӝHdK EIq/gnB??tr_{07PVO궁qXxHƫЌ=y긍KZ9U\ ao>Jte!gHDx>^ Q7Jjg{vYI[&ʹV(-R.  H@^n@s,vf\B7D~e2f"CEl&pHZ)X'9+N&OP x8/"">j:ߵ[u_rG5S W%ZN2Q.^C2ømCO,+t@U&nXs\cg&t_R6g7csTEe\  l̯tMj?+ak̩pur[ev1$FW@>Ah:,# wTP8` 9p\gUs3,OKTc~%u:T5wL+TGrY-$+^s:1BAE2U24DwXQ\YY no.H¿b*#P;+s;-7qvj#Ȝ)H=BF!DbSKO!Mj{,/|^qyACG\]Ψ D?kV -s _ݢh5?D9C+-sT(>v^ֈ`3MiPX<3>z,DcE.\tkJiyV4?>K,cr94L;VUW>?8Bj:%xiQ2>2U*4 GsT* RM 1jTK1aZ.ڢ4ZSWZ5 5b͐`.?+6`N|ԧge98@wOtxq.x`DʁliޗjÏE# @dlw݉\ia@(v*V\ݠ\-cz[04KIƨ8XH ≛L&ִ[\㬣qrA 5(Ra.DRjF4,qR`ȜI*C2P.~K9W`壂qTL\PgyU?޹D#v'1s:N U`^gpmGc:mQ-P% ۏGxȒ)Y/Ţc *ߚpҁ:j(Y9? e:R5q g w|2.Ϥb-Ї:>WSmu\C^ʓCt7zfwIf1aދhs%B6ޥVzx@E#GB1cp#ƫ޽t!{ˏ7)US5P Myo+F/oL@Z:v&$9ÓB^TgWҌ k jL)wlaRhXJ̷*FLP7踯nǫ\u MfJ#P-W\g!gXCݡ[cWuZ\z0pt7Y8XL2` ;nYpͪ.{GTq'I-rpTI妋X1%#+a;\r+u "F>L. \‹j*rGT\9S Ncv uZ'' &(Dod^(>z)mEWsK=g=lgeG!꽩iD(sw W 'gq m'ZΉ8ôY|,[c(Et=qv5ҸicBuP{3P.)gEt>ee R Ǫ0c _e8Ψ7t\A2?!p4RYẓaFƀu$6Ku:U;+՜b<$di)teCFFQpJApntԂ[81_H)5T|"'hRZ>N \͸:ecƈJւz"jۉi,2t2c{-8uQ7f#L? +gAt/+B.Iy]n+95條ZT2e7w 4Fp]tTs)14D58__ ]hk[93MGv; D0?( H(5ž"=\]kPgI!^:+ٴfUVt>Qu ƙKZH?-Q1NWDbr4^kXcՎPF[])P^Π,^ҝߥcP+~eBӻtW6G W2:@јR6-Ch? ]Py΋,Tn=燔ZDuqfvPv0ytj e8\<ʊDKYսP>լhڌE+i2L, s?+aq YP,{yPZL -E1â-l -Fo&W´4v ܉Ps'"1$\99Ij%qOƫ8U 7MЄ;ߨ5 уUZ2y_Z`E-*iO:e^MR҉{yS޼aDS[% *nq BOrPH Q/FnfCKMROPz{KDé.?Usk(W+Zu.#*x{|Rp.ٕ. PR-hMe:;]Gp^>.*w@3֩< TCږGQ_]b:VrPR>+F=yߪiQي)6\My,VbuvpQnwrˏUO=V^H5_W488Hx[jLΨu0KJl`ݭkJvi.7)T<d-xB >5_!ٛH|ۇF[WE6/r5+-2C>xùQ9 u >.4"ިK  8ߢꎟ"n KYpn u؎AKd(h0T=r T25P`J¤\׳0wâ-hǖиYs~{mi5DEnBq-Fu!TbJ>Z΋;GYFP@Smҏqy,<c CT=i csӄ.Oʟ, Df%x]a[DiB* C߮в\ZGT8:t(:l;pFI3PiC>%7Chf`NpL¤\ưGEwh^)w&^լj 4m7pZS C{1[Ba4ڏx׉] ~g\V'|`BM;a:,yQ.H^%\@%D55zT,Q/oBh]EIܖQ㉩eMMoڮhj:To)?TL@m?)@>}[̩ 'D2pWc*7h1c+2TȄ/cjƎPitwCRg5 P$ gx+i hGa+iJἍPuT *qV!y 鲋]:6D|Rngұ7F-q?#~Di!wmCLLk*HPA?J%ϻS=Q#mCyAcĵ^+FZTWh bV+8QRX@d=L/ q;BU25F#*{Lk )5=Dd0|m Jge.Z9sMp KCm[jeP\V5y&KwA'j!9×wGߌ&w~OSPy:J)Rttvy@{0v5D߲:߹]Q@[޴U4t,s] i-ˇv:/vXU50~PMwSMT:ݗ4W9B& 0WD~[V e`xWwYDZ&5D &:kYDxɧ0?Tt@g(W>NM;O) 2-$|' aqupw[-Πh(5s}ZOXlg=(5%kn<й;j9E&6:)Lk04ڏPR4 ѶU.b6c%ZUy YHȣlC[*d|DnIx}%``x'hdބ6e'$[};> q0ݢ"A? T81i.;c`2J.7 _BG8@C7U0:fWV  SP2::POyQu?ЖFyqxSWh¹kUQC;gu*guh,q Xm0xY} b~UIW\}!&e~ЋLk_(45<ԻDEG:>Z$QE%kF.Vf}7o.\4'ʃ'nV?1pv[HB?L,v=o#Ne:yE?7m7y6Vq=tVAU14ԓhcxP.%9;"1M4Ewt$ƜPs{GhcAxP˱g KZy=.# #+]RĹw}ˀ?!I|ЂǎRd I8a K2(:6 sQk:'0"$IJƹC i]Z9B  +,~\<"1*cHZ6V܉;!po% bSn{ebatkFJP9Q:'rE4L/q5×8U3 Wϴsƪ @݇uEXs Z7d gJskFց6^I#g!x:8j;/TeakZ3窖8gKH+k)lҳD # 5׾ TvӼ/Jc'rčUyD:+\Yz\]SF=jcAcۏ^n)rKnSYg%@dR|'@ PۀB.ˎ \YBҋȫfytB3Uyk"@ rE:mcUL JѪ: DŪԫMF :/ڡAs1o b3²Ƅ)>K3j4@ݒv \6}I A'Ӊx0ꍵ)í:){0~hwGtFHPOB 4Cy졭 -uSBckwD ojd*NI:(ycy˔r!r$|G2< C]轝w4OX6W͝7tcRH\Eۺ#̺05lB&Gд=0Q|Wo>$` |䎰vY:&AE^k7U[[ߗE~HA Z'8xx~.2r-J壿Ԉ#lBT+CV,8s^1#sZ:[SnN.+dPgyXp>eaV0\ScD!Mt;]>`m:T7{ o;J$J sSMV)ߨo\Ms;-|qll0]ZMBtPPTZ2P-ow8Yxbc*2C,cQ ڷ{(e(z.1kYc_Qw 9 D+jA+BG5FU֎ZhVeM;GT 2,ꮩM?P\X8CFY'ɭ%b5`)>Ak5Y#$rX]7rzJ$L hi@)۔/gkOҸdcJGG&!hRsn\IE΢UGqktR(C@j#\5O+]/9B6ue=P{TX(-2P"G^jp|;N5i7h&= cO6~j.kgJZ-:_H5'*Ao;r ܟ5Y\T~Qܗ9ߴ 8zSK}o{lp-Myġԃzw9;E҉gP}\)uaߔ..PrQc Y|,m>W2;V7" 6iH8|ʱeauXʌzWpBoQ˜c4 bFe I{^ϨQ +xD #]ԝe RݻfT踈<.܁iaql%*jW}"wGXvkيep]? el L/Qډ:jZb7\D4 Xedy X'U ?e+3˝PO=B1hn?U<.<<*n\aMru\/ljc.'60vDēvDA"wP\hzl.1xqDP^:/-WCi@:)tRghA0*-vPK|'VF5͸kĸi2v =r)sl'njvTXЃ]U~bO5e(#YlSLm]ګn'eA:gŝU̦&3RfB{j5I?!'V?PSH @o##$s5۶WfSu袥Hv6;wv:q9ƩMj`8k\8T*\1S<ӕ0'AJѾH4ab.y.Z4sF~Tџ\kK6kX2llΨ4ѨŠ4qp->sȃ*ݻ"ENxH;uzWFr2rz.Rk l{FüDwN c9qNJ0}TcX2IvF NY\^[(9|@~ g#e(EK` ZX#M51ewPpy#K<|+=A:5"tX{> Ӎ@A^榠owe.9nig8Kyc [).F:r4VѶ Ү%rW6 ^X=TC.=HE!Chseve?#J5Y㏊Z9h; t]z9A3AavBnq|:1 jݮCe!aZw B{L ]Ml@ը֍O=GUrQ;BuSak~"%vODq[1t;pN<4mUk` "ۏPZ= xwѾi^SckS|7P-(Of3Yu6X<#'l' +aK\@Nn҄gV@&WT~y+5)xl ]P(w\{KBruUajSqlΰ!C.;q+&tD56`fp:8Ww-xGyM+ǝZIIadJ70M-Q b4t^ѧ;5˼.q+N~h'th%O膚ep3]%b1U?QkIMab¹iw |/;Y-^ΛX>H>a[dDDb@^-j> avpi5-i\4j0{I) h/hI4\&7+iơc~2[Q[8"Kc)bV+ƞcegc\$Um'=.Px{{8Zy|ڭUXO%ki2GVZ'=F?(w;^`@Bl ]V|rآ ےu\yLs H[/MhZtXō@^kVڅho*̕ -o'.Ę BѠ3z)ƼbG9I,26+ A]QQOӪ=68;XVF4,S@1%EQcq5!EF t D5]ڠG"kF*o8#JDڰچ90;E`r{ s1A;+M@|ec1CQq6#G`WPTWMOf9xUi9WhD"嗏i[Bak#el?]! tc3`uSvֱ)iQṔp>wߔ!:u\6 i )mW '><򁪐ܴqPYVeJ|[ P|VP@畦4SN6!si(7yiYLn fMM,{O%}cGڎ_kno8-ZZ]QOn&\Uz(kkdTq2QͽE =tVș`fas#8Kh踩ݓn!!-hO v*f@ ]e4ŦUp%qف% (OhZ#3T:-ID2Lyp{ӉSioB4QE&F@nwxPy{Z$&[CDE7=7Iܟb|l{mAkq;?!DsO‡G2UD ׋|+a qp +T:ARPNUvh0!*8k.q:*KKҳEI(:4 )>.@G(!ҏvƁˆw؏A4@[թ;\ ['X%:'ȅoy,y(8'Ya͎F懅OsHP_eR';p+Y+/'U7-@@~K8dWX.ֺHAhYYHގjZ㬖J2>{ԎDש? dȣ*;A!ٵ۹n\ ƸEGNJ{YO3.QֽA;/fƉTeū#H@3:fsiN<\TV W 'NH蜷D& Eo"\'27+)N9,m~-C紼Uis0gQp u: Qj'x:jB4W3 0Ё/v+:([HyF%Z`m!_?I/wZ. nvG -b.u24G ڮ7J0c\ mݣEpg^-W 2P&ݵ1BaEW7)ns8QM=.+2 ]?*.!Qk"0ӕ8?ZAGڇQ90Ku@/}Q TVZK JVЦ ^i*qPlhHXl|QDe;:/&'D]S;B5tk855**5O8D:m?x$~e3lݡdek;?;eN!(qFBڍv+ֻWFWԏ5 ܮQsg%{6ߍfA\Mk6icuj:58RYD5'76vt *85d&6 A?7A\[5l,-#!%q6<փ"RV k+6 ? v^1(.?,h5BlGAи ApǪĩCQ0q l u\(N qncUC*U4 jY٘G_:Eg*ʉu1:=߲Pu p˼5z8*OiwZ=,c\n w̝ r7w@j-uhQ5\D#I 6EhN 'hh>Kap 轓iBO <*eä7 mm@b*,11귝YCbVÒЋFvQcmWu=Tf'47/n'UEy-ڴçհ ݥd))ᰨyFdZKxR^eb̧Yڜ[fd/wVikild(x몺hz,Ta4uA#Q!ΐwra] Dfwa͝ H9[K9yL4ƸEh ^ LrsD^jrDbFdAP̜8QywR.UUɕfc5ю)^lB$ucU y).̹|@8tGF1 rzPSyFA3r:D P̎_uW@XuÄ&F9h7.ey Z^>aۗ Ss:j{{6rZKwD%Owtv:Aâx(OeDtXDexPf;yX;`%B8xKuQ;{)R%ѩT FlNE6^^Pt=g8ʏOXk 9p%wUGL/xs[qBS݇YpU.j&t+Nz\ljhV'rViecH\L w1w¢1+~Z5 ۪hu:8ȍ[/ A1.$p$qtKcnKYItH?dG~Z  {áYQڡ\3 j1hh'`6I!9ޚ nm#.GZؐvX![R59\-ok.%& Je{]suʟl$oE.2gq\T(? 2u^ ѢqgiK[4 P дUvx ,cTR\\6(ZLe$I \rt,4'Kj;NqAtlmP1scم.o^3:tPHXsq汢y^8kj7!Tw 0t*Өgj5*e}L/QuGrOkoU2KM6cEL,xzO2ep;ʳϙ ^SlnJg=-Y&&5@dyO{XFa=IS}7VUy!]T>\+3T'L(,.(m\;CжUά$>gt>H p佛[N7?H%L )'/z)Y#ř*o*`IgZ2Bu$,-'Z,CԫI 9[znQ.&5(chZQD$]5\4dijYIHVVG!Ap]WXǒ?.ha ]yoTjפ(蛖inKfy HՎѴx8Ck|t,u!q?&6p䭤~`T3[L{js6|N}0MѲa dy)-xeq3!UvV]wCuya"$[(S(;Ff=yK*S_N}bJpE)s ;@IB \%1v@&4s ̣sF+QaSk-qB oLk1jy#jB+B׆e뎫K 7*- :JDjvgw$GseJY{l.=A>,ӜTiX@ Vmlv]֤m%EНU׈䣼#Ȣ{ǸNbc 0!c8[뙼xWLhKdG%hsZD5 [##ss}J_ >@ۚr24VlRj:0` O.JXGy!jeIs+~cy5\7fzxJ3i*A\GPr0yJi[WtΪ}!vy1L=Aa$ =P?4-;Z: Zx rTiC; #;4N,-n3>Ĉ^|d3䎎=TS[OL+ZVS1_/ɖ G !.qYjU'!KecaOv=1֑HH c 'waw€OP)=8jM-.mRG&)u7cѰ1CVBڀs\U.)<1Fׂ0djUs-`ꢛwi{4QP:Z/zy6VL\i˅@ךhT:"xQS:EE}N4+5$sն& Ews]I[q\'jjc'Fߢv񢑌Έ؅KLH$.`cAt@UԻ9qgy H>XZ7?Ϝ ''6L8覣] \S3& 4sxGCttPފ4*&՗f1/2枲^2띖-?qVu/$/4Za\X P]sT'+Q}qҰ16b#Yhˈ}րuΞ(J;²Wa sI001Rʅq\ 9BhnVzi??dhΜgDPP-_Ey)MrB؀X 9$uC>3 ]DswTwSQ)ai\'apSkBs~[R@ 4ʼ*/)Q.^ϲwxg4w6ŷ)jD 6ъ ۀ)}B[~VmrPT2u+:E\ZxPh& gaV>hBʆj^`eKk|C9Ng"NT0:Ȕ袥1Bգ*.Ɛ\,i^ҍb|C `*&#w)&5⫕3 G@W8+,!zn S'C=vShqsy,a#r4F!>)Ztd;IcԦPwC㒇rlIAb[Ñ_v8ԝOW5Gxm/y#:ŜR^'{7N\3 >MCZg ?V + :4^7*dYx3Z"S= clԘC>Ky="Lt%x7_{=WlvD)5GH"4Zg(Z0^/$9t΄yʒވ:|C=y!] r8 9o )1.B?,ioԨi1*\:s*<lsGࡴjp\LCE{j"HʓDru2'd~ 4r(84z-%+#r4Xҳ[:JDi*ƹQ7 kf7 *uIi7T6gA?,iVRS°^.-ulj]AV [EB6t%"`(O:$lȟ6*Jn  ݃ ^>^qW% kv!ҲkTn^3p*S>Lp ;VvGBt*;m ;ъ` *T.㔄 !uSS+hx2WBuwI%PgetB]N78-[hk@dGm5]v `Z"[-SH\Rm93q78ʸ54 Tgf/̪t?*/b-#K%`@eфK/&ZlZ{~#2ڻe;| n#Ս23 ӤgV%muJhpwp^eJx MP3(eh(jK|#7Z_g3WwG)N3(bHR6{AP]qss0AϧFÞNOi~DкꙖ62XUj?luq(Y.0ū3.WTT\[6G -^ȳHF[l>%GP PXȨX:u@ ~^bQqsFwuLGB*]+HM*2&YBu b`4 c-cZSmHH7pl\zRv!}#\A׏ya|ͷ._i_{FF>nCnՏPV O˒݆!z&:&^ WS`T}:hYWdMf: oS1J-0]! ۤaba9,]+0S AĴ[~UG\1CA-mq)nUZ/@wլb4sWT !!-``|q 8#'*H<e|  ~DjH7_qbҡu֊1t. eens om?(_Te}̢(?Lh+X5_>;Rê~)ъF$ S!_S홌wAXg1:.u<ضY^']r*j7@bPb ]! 4_h˼Y9\6j* JYqƦ/w[*9p!KS< 4ԓ%o1S*͝&V#(qPe\Ҟz}'[0DҴ[ k'P쮱 #.VՐ#BA U@kb/f F z#z+[e3`AN\ d9@".5er_D^=꿘];@@ {N([ֹ-[u)Ձ!0 tm=b͹/qt"J:?n ۇ!Ĵ=:uw-4YNƞQ]G4g{o3" ZP,MЕcL˶J Ty/(`L0SZ([)*VZwqmRjh*ɏZexSrhJ^}D^*NFT#4KF]cn4HTG1bF_f 2^`tPڴ4%G:Ie9_ϱlbՔT22Pmi8 &A, G0E(P`3]60?0"mui2i(L-ps A讀Y╍CaXX"kDUȎ@fप Vzs5x + W4_mJVƯ> PDlw4VbSɬ XE)y%0J!- */ Uҍs*b*d@q,) #kpCG2Aɂrk* P\vvYTu/F':!*J9bbT\L;\XYr1%z6\[Ґ,&"\[#z%m.N`3_-v~s`3wb%vR83$vR9Z`((6%JSdos/.}¦ad[FEwg:Q7u^x~yլx(q.~ӞaXs(a],QexA!b\aT ))jOc`:GJZ3 l~"BeeuKL#% ];dR*9ޑ<]һD(L*+; +/ ·NEU2aVlA7}9vWV2[I]x4czkQ+i<1!+j0Wk%f/Lr!2.>Y:J?(:%Io(آuTdl/.7!H;pZ;>|Țe1U9?ZmjQ2bQd9<&Iz\e)P \_e)"y`閳eHxP1ug2qōzbpUU3-rJVL:ABɤ-D^s[cY8 t45C6g@Lb6a-/mȧHEC: ~H]3jqS&a `a~`wH1UYEM-CԶ&qKyd-t<%0wȴߘؿw6)ixFiCcn4j60F"noqxYj U}=YhJ]E-*Z RjxРop e{Z&`0vLb3tb ! *YNsbvye`2%zX߼"m&|w5\kKz€1N҈f[#1+h `G3 =lf8h< ,@4%-r T0qt1X"jl=XUf Fj_y|m ^3VXgS*-'1rFf 4@\ AgM6咠-\9V-M2jQB"63pwnoPXZmZr0S0X NiA13*ўѵR`3߲QsQuÐb U̘#P!B2`DH3*U(jdňm˗foWkz%W\ Ksjq6k^AAb When/ T:kuZzŠh=pu~!6R!H!9pBZgq:;*Y/F hސ7-¢޸ֳ2cRm\~(!T !\½rQ4X/i1-J\[982QRqlSX<0|Az05`ESv9mCX0p/h2{Cl ϼ 4QB+ejlGKFTܗ Q7<gTC$)P%Y/@l6 ( * Q'Wu(^`rttZR]s] 5Z#D}҅[M9Vu+:Vh:hϗZNC2h-d Ɖ1C+k26 1ifi&`:voayrKK*@rR КtKa p( {,ٔvMPĸ"VSw:yX^Js 4;.v@=Y`}&GH*.P+[&r qh,E EEg'r4wS1]bYF@NU,lq]2 5-`ЀLaC<="}\Gc1n%K GHig9EjƒmhXX +ػ9 Re%c=R  l].( b_|͂Mx0| !`9zl{])|p|U]s]rfbP^X0`2ľ}MK@-3h4@ 釉]/d>%Y4}创}&@$ۏȕkϬ0(*ds=`!"))Ah^q镶$?IR68N$Z?Pn킔P/-&n^S0=dV1b(ij+ش+\ LJ M22iMAƣC@^,"(8I]!Jc xՁ*78Y7p;)_PԺg"n>i/]'H1#qKŤ:h-ꎢKTiQE5*jE~cs9eƹNMĆY_ӬeFͼZě +, }'j g3[\Qvtdw ui/|L8EQkJEW(u.YA(,Ih߸t&f1 KHK:1 (. V-3Y3e[ L[J.CX[QzxImj}e;"CFO`[2Pqf B\svwFtvy8ѷǒalvpi v5u³p+h]̙JLB4cÊRk½SC1Ԁٸ.K= ʃ{ k\FfX 0į :XPo|p啋]%s.5B϶C 4Ǽ]k^`RİQV4KʓWa?nm L! 5H|LNHTfq) ip*020j1)/Dkg%M9WIk:EYDv堵Nz~b$ _=n$ [~ Sȭ9 ue ۦӬG8ʰߴ~L xrlRT״ 4S N`2nT"i^^ pf}cdDF6!G9Ut9G魔3icx88R ORHi 4)˱skн8Wbl>E-V7EYd\pơ[/MMGuX4d' c :EEt0K`e0-1W wUlk*%7U C?pOMcLUݻ=CYrd}"Q*߈M%h"V` .6 `]`c;bVcJughzzتr.z"5B}Ǽf Y0Չ3Q& bSC!|1K8VQ7do2c(D J!ܬuSqNJh([A}QElO,KLPP"غQ~Ш uЄh1i ~cVT7:K]ӽ` (ɎZ"IML ‹F7pL0""( :(߼@*O\S~L&BVWSxrוm~"m-DW2[ ʶ-]HT1 xPOO%6)T*q(jVE. PAcVx) H*VϬ[`(TR Q0JTp=RwhGfS"ΥA[-N[f!R=CE.1Dm>ѿ>vK0pꨮ @#X\N:cLj* 13SLxtJ44 _2\zL"|+~hXVm1QaI(%b,]^:VoX*Z./KL f%fyoM*"[U :68 ѵOҥ-|1JWiFp5 onv^iq+* 5n?3_pH񉜽F؋VS`Z\BT-(b<+a1y&=:QIwx/E] \IiZE6KQU 0m~z886!- X3fL%S.yL[3̑mmLǤ/{?25Y f #<hi) FlP2K}Λir#A*d԰3;G>!yќ5N0U;Вg< Ryeb[Fk3Է -{4p&E󉎰UOXhѩH7N1P bѤ8EMjuk_Q@^J(he(.VGRXj hf-"ȠbfjX7{mFhs)ChNDXJٺ>Ca=QԆW0tuJ5؇5BKJV׬{4^R+^DP&K]fXGu//M!M9Va\d_oc1kP@it&ԩX ̢q?Qq}UaM~)X]AmN_eȭ\aEVӌUpn.C 5["`41P(BRϴЃHilE5]w8o*9D0Zz.HH PKCY72aY*4cUl*R!$;*YT  -Op8L)-f^Nf`6c)Id2R[K2%){.#[ca$:x[ ht<` B  eIoc{MJ˃鈳Ex%"cA MPM%Uؙ-tߘ N ^"CbA\vE[0b򽸠V3GC5LO\/Q`6:*s8d w6 \|Gź-N2Jc!FaFP)r1?1"\s1Ք H/4'7S7bS| LA^Uߘ_I!G-3E@5RF!&%GTe Q蜊6H?9O~CPl gU%S(W!O؀oR[+ver" 4f\hU^zJf&Rъ#026FZ!/Ρ`/t0]jt {F1yʡP+[9F&=.j)rPK{9oЃnޒ5Zu庶MKPB;,-[ԩ/rXZ8A+^R`x&E`j@5 =%WlۦhчyopBS ʡ*̺]Xz``b5|% s_߬_E2N:u҈ ^Y]QbΓ9:(v,;MJ9I/Bd :)a֦krpz* VuB貼bMcGQ*@nOʃJ]4оnUPHHSX31U$Z@>s\0w@c}AWxi54tD=w;v!*('yKIEv4H,&F 9щ@M" @b MՂ!pa|C4vxtt5ZWX]*YhZS,8#&H "r.T=\OyPW8gq:Q ɝ0%aP4WuN X UZejµ1_Iǥ)ËKF&TG);J`hn%@Ĵ[sT8a#%D!UJER R8 bZna{G[aa-W,>Lw_AREۅTUIfՙ-1ƼW1emA;֠)r[չ `ƏNE087c/_ ]k9`ZVJR,*i(A(VUr%B&\PVv%gA@K9;1gFD`Yj)yR BB/hwL+&X#,3YBWۖFQWԑE7.ӋX)_b?2Ƴ4Xjw.,ҺlX,{]QbKS^ؙ 2u#!ZZ7\:6P͌@! > Z.IP4Yej񟘪;]^0a c93gcMA*7iU`k`,\fU|~ RQme7UQP0uF X Xf͛Łq!c.+qYm!]6$W\B)oC,qɦfwXWh%p+˂|JV;^yւh[nhDȈo(fN)e*c|B:y zΘ4:e?s![ua]aA)ٗtjBh ~S VSxwK(:B˒ Ul PFg@.q1{d0ŭzWC1af+f*F=5 ,*ECla s lG \\XX^ 5_0-|g ƭ*d$/ .sr#C\'s,-qCZM6pC/Ҵ YZ38@1c5#.gRjޕo̜^>!5BwD(Bn!eL 0qo5L]2M "rQ-`)y |B֗;]ږ.j5n8a n.00-p gX9[R :)u~ l'9IHN6Re 1rbYnoXOߔ,ieq3.c`cd1MwCFZBbP5ޞfdPOh(;:,DuTYoflw+0%CK*뚊t.u}~`‹6*-^x `ĬUrn=q9)a@2+qf GI`AyM J)cw9XZ">6 ᄲ}SkfNM_Z A CT:(. LUPb6ު" (nS^SsT8M.ݱbʣZQ4 W2I&H59K(0fљw [ۨQf7Õ+/,bYƧԘK@0GFb+cY@Vћg$K+(QfȦpC]h. W^aSK><Z&Ĭ])ꇕZ3fr.۪)_,`H rq Z9(u-S 褚=˜S,9kysKh3= hV<06uҁR:0 ,2=Ua1FQBjXQ2,xJ2yʱ YjTFpP11IbSB@5*UԥKkف).N+&EwCSiӺ -b7XUZ [-d}bU-F#W,F%?S[0^eÛE71&|JB€k\U\h T%]R6 ͡5.D~R4j5*i(v5*FO5 8w\̒.o_D2t'1d*Uk ).'.(l\S/DS9Zy#\I  [t)WBZBTU>2EW FŎVy`hp"qwFWgY~r~wUv7Kޏ\)TȽ;;=%Z~{g3;U!V%N*,Y=`F™bptpCq 312Z\ ZTM"C"_/hW~&"^̲F 7qNo7F}I_g?UVB'?yDk3yl[silh"ٍ+1 _P_tVIv`yaYbqNS,lCiZWG"ԡր-'CoYiSZ ߎ%W+ZoZ#Ko>L EpOϾJaY(T[=;J/XDܖ*KRy F2j5Z]مb)nIt zU<)b)ˍK,9/zoO wud/t;p$3MbKX ҕGLRwOϤ]ذv幇B*y"lpt^!y-mOh|+h8IskՏ7H4B 3r3,(4&efKmDn hNrXgx^ JnUf4,IBYgXR#Tӏ(;4ܰA4fDғISDe2?{Kju7EnP+yE]U\Kd=VOY/P$@2!EL`0Y[0`bo}i}mPbPg!-\"&AP4EDՀPj`ҵZl 77VE 3ziy1:(8Į&m{3,WH b6ǟh8 P+K얥)))t C/_-+X ,)JlR[M<ڱZjc+f6 w*mKbZR)¬j|EY:bvRL[dn \0)[ɸ{)u "Kj$\ nV牙sU rR T+"LPtUvۃXTd:׸ d,:ne*1K Ź2 [fi k'nn&\MRv?@УN<ָ![5OHÀ_ uK`{el,҆>f$S0.8)yyMN%TUeЍQq4h f3|&̡ª`V˾ʂb'0 H(łL@a HXmҵc[)H:؈;,YgUcUXd ?s?"mM&6pDK>"rff6^P߬4jDkB1(6/CĢf4;%4K":왮cB)UPF#n SVB%U9cX୽e -iX+uOB,ZMwE ش.<Ub{ŬWx 5*9a_5V?٨C.7Z*Z9 c``߉TiX+Q2#e}d,Wiq#_+=-FVܵKaĺY=3v1VoYCm EyxՖԲCušoh(e;b8g{[&%_}b9 rzJ<*dg_9 Ѵ MWeK^(E%KC~%t n+Q0a8$]6qXĿS}:uJ4$ z#yP0,/\%1+lRڮ%V׼[?1;>q4%22p{( PT UvZXݘP:ǦjU\V0V`Se4%b -+f#+VV[-u6 3J9_))^Tu ט#VĈy/}$t7%-ӂ%Aִ/:\ ̌8-zi^a[=#۴n^?L⅘wx $dh1{L{< ׬:ErNYRl}(c[8;Dfd`)a Mt7 9%{uرV6pvb'bPu)^Y-t]RBƍJfA|.dk3\nfL6;l+\wꅘL ( {3z fl|LxFiİeMqƥebQe _~RrT+yk :GjjX)8E%;`G2iht,(+K% ٙ 0RxkIC^>9?`Bݱ3ag^f%Ģ rZd)_JC"d  mʞ? UjVיՍ>:Q_,ꀂ3\6D?|7W[t]t#g`S_-AyAI0=rUWl(kEtjS+FE.C't-RCgXV !ӼVF:єXDN lNh\]S ~M$vrQc2+4r)*n^2lшwmJdE桷ԕwUz 1G+&qWKaspYO`#ĢkL;" ["ŤՈ:K 6Wv0a@wTي#;cJN*8CyUICU]^1r,ǻJ pE/rgR֥(GU7=x@c"\H Qs,ɺ]06AL ;bhzRs*1tM"uKzY&A7I-KIZjU7oU UT%utNTrQk4tAZɁ5bv8Wôjf$7uE!gVC0E yG gEcJ.%o%7BlR ¹:{&]ˤ_XaV^[^2@,=Ln.DX+H빸f)(E:@ dt:CxIeVģqDlQAQitwLa )/@).G5j/G:DB])+?lHnŕ )/yn>ǵ.#w71=D@4΂{e[9/F3sZ.B^-JpnGدx-6Gm8#1Kp,*%*b+c%>fB0p $,@ O;Tnh{ȱb jIJkІa[5ˁԼC#{8uFi,`.yRU‹it6 T_u _%Aнevq)`9VR6/{SB:JP'ݦatˋi~HpP4G_Ykm8HЕ ALs Ě(zf( 0K#aZߘwpd`Q䛍lv..bJXV[*y *{^'.K^/p)nU(FmcAO u/N  'oeTY.ίCa%Y1ÉU=[]EMS1b dVāׄd, 9+J鯴⊷*C *R(3w<{̃#RңI.V/t\M4r1ω [MZ;p jy͓:&ˤ$1*+.PAvܮ9[^C@ќ("֎DD GB/Υ.ONw ks'nrF5jBd_r\p6 pB4׊I8qa`L6F&NNS/ĉ@B= V N=Ɵ %IKα^DT.q, ?Ex(HCM*w%WGOľ ̱bp?0Q0YE{AHxm31~cPP aN}aBisQU#8#2pfSsU b`E&_u,p a…gC̰993iE]LbYC6,} 1e#dƾ:U9ub`acV(o*i(*]cҒz[Sc.l4YoOJXwRtuڔ t:%IpV!F Q(ۧ]p\52JX[+҇/P lԙ(@KӬSRUͬ{ze$.跍`㎡E⽩CV ۮ `k6t x ~VƻW,s?Oe4>f"~`뿉u0ږMs҇\E\N?q)XCr;@fq?^ғ,JhlL{<-T8h4+2ᙂo dMf@T0Zu? X}A*ak2X,6\bC1?0 y.VRbZ{бc-/LrWO e?*ٗL\X1bd~ݠtш,\}1L{q[ڜH0`tJFYpڝࣶ) M\FYHj)QX8s5GߑtW(nFuȅeRFHߔQ7sF@zn"UKk`j(ahh@}j-:b SRÒ!B99rNS҅-3k pm֢>E24N=s`2(jF; ban"7k2, ֌lL4Ѥ+.ce}Eoi-?(+J:04p,ZH5s2VyAWʊ/9_HZ_bd )k/Tz戋eGZ!rEx/dQ6:. :r:*&7ۅl K?zD0.3l(VG2|BEsZe HhÈ\%,W==fL 7=e|xWW f5i:+; g;M#p9G[Uި[C݃(ً,b_z>W`7B?5v#8G}cYq\PYҝ` ƼLo勋E&ak鑮0mnjˀX<řB Ó&r:DNbL8($fY:=i"atV ٰ 5%yW`5u5^Ϲ0V.Ѝ朢 .ʨ KPxbJp-ܡA騛hZ[XW-,o/}{ VgnҘjW>@q]y0E^ Z_x2J17#J#W(l[ UB](&- >N}.x$i9rQ .3FD-6`<`:Ul_*tw4YhzzjK=Y@RdESmM5(v !iVϙZda\R0% 1`ga6Jְ.o9s(;Ǭ'9WXZo2-g2RAv\Z} oטxlR_YniB*.m&閝/`))bnN_Τs/0`'L(&lt*j\RU|̤@z({KCԥȽ%i4-4 (JOF][xN:yq+:}xby&`AnBc8ChH>cUfD.6ꀛ Zİ/g P@UQ"/,LQN8k ljCgf^GplDqqn"RSr43q%9kH:Å# 0pbv"aͫ nW «grE+t[.!næIQmrܨ4D[P$$ d( l@m ėՏ3&1((`,Ђ(³c P ^قXzrfo֫~H, J @hŨ^~Ϲ*uvJ!X*X^h- Z˼靵 wuCavcL[-9UnTSWv ߘ*BVP6O8\7AZ 84[pxm2Z *Æz韤]ooMEm ;4UoX a_Plҩji+)]4o9 #O jpO{LPg3 3JL [ KƖBrtwBNTJ)|UR3~>?9{8<$c;RŚiÜmAIM}Y/e.x&æZc>lubTB8-Tz{D=fc(b+ UcWA> |!DܴzpaVϩ(7DP:2ʥPa܈!T4XQ LGB'E:W8FHt<F#ajZ-Tc{!a!đ=SXs8=M{x"[*f=ޝ3)P[Xg~ڎB6r:|wǢuqrrܾ!\.RɫLI/߼LzyQ7V WT CW\8ŠW.DzKH\NzJ H5M8@b,R&VR~Pho&6[ҬBBtN3F7__O >{@J T[#B6^)Xк,I00F[ӛ!Hv:QVLP}Spp&^=_K*,<ڔ@EW=δh~拮:zC./Qt%vHj M/S~/x݅ ]b+?#Bk𙂬R OCrX.$Ʀ15M1Dfs.0ŚmS8d җnBE=7 UA(C}73 ;~\C u'n?q")qOiDҚs5`8b2  e%S3F6P ~QK%,'h(ܖ1Fܡ'HtJ*w>ATn&+B&pt\6lz: ~*QŸZν}>L!Z! yUxc9**T~%<#ڕbIW1C׼py\U6k>u maN @yC>eŮD:1s5 C^ ŁǨ,hGS)Z!ջ"^kjCv U`Tcx`ʝ9?.r`)Fu5(!pB[;VKKJ1J@JS.$L6@*ʰGF S }f6wLsfr> ͝ .91iHC q/{DiB nW%,oq*\#e|7qmv."*(@w"no$bO!T6 hsj*&ve%Z*X+7c9ԙz%0uT)µ8H +-:asR i*R%# < UX=$YET_  Ur@nSplmu}%3Q»+N/Y ɽNu==`묱K@1A Ri{#߸Z|J<#[nB5̉0 Ԅ~!tߙkbʶV5Ȍ62) [,_26䪏bj;ږU;$, `ݞؘ!1njd.rKgII^k_'*0];pXsVUHBt5QUmFo7Fh -\'V%2(:uf%["eEo%  2-3TFeD&-(C7uhM4?0/aM S0SxWy*S>VPY ^ $¢U }ֈBNUP*|7nT5S=(N, KDgck:lghN)Rr`w}*oRݴ =]r%Wa3!F,P09QQ#!*m KF;!ĦcW@!eaw d>ªdNCy l۰GbDALx VU3)Iޚ}UWK"ʰKQ Ut=C=nU@PgT 0Ucƀl2q-ctfBo_tg;MmMS`(PEwL6Ӕuo6z򘁛Afΐ;3w6jHA"ˬ3y.uec C:XV; hc qX(W+OkDQNFj(L'ƯL y 9$nxPquUQDIArz ✯hAK%kYA̪ 17]_)u+z޻IY9znۼJ}W c s…| rQpIȪw!ScfwМh?Y78rW>.R:щ}V9]V"QxU0p*ȁv Kn߱/i^Pz*Zר[HS o1M*Z,EwkySWR*WRR)Qd1aAW>xNb^ȻMt뙏,{6G׬Md#yGQQ&IۤABQongd. )/ѧ"+ 0Dfb)`&v%tZe\fLMŃ 5.\7D~[h.\6Rg1*x-/ayy Yi*"ɓ˼mc]T޿*dg1މԴbZ`VYJS:Qy4j~l'L+D[z`\}v苢^{nRLi Yn3: N~WZHAYN߈fou :CvA_i[B,uQ>XYA4\nUHl @!~f")Zlog%1_%ܟ{Y:Ll: QbRӤHdvB0Q5 wm B%AfbPW Q1KYNIİxiяtaQ^ӠfQ|DЮ-!G$Cr`wŔa0/Q ͠0d,eӞ%{ hOG XxK*r|@ GEFWUpl32E) •225 j+>RQq%Ci\/ڡkcfkqèLNm7Y? c XcB?e"4.f4"t߹noed8+7ݾenaMu,p@ry)e- vF*Zjֲz()E39T̺$VIQWotGO75&Sb;9:УnS,^7ᷤ0%ۋ)Z4n[*a㐐PĵXΥsZU CcW^[vsO*cw)ŶE ^[U@^S/.o2&`P24iAW ^b :1]×=r+ṡ(q]I_RWH*Qz+>ek},Z)ixB$U%6<5=/w\AI̫J[?QEFgH2g$ADQzrSEGZ fY*U;ܙhSLw̾0.HfwoP 88ĢTj:HeELSyuw9V`JBiy @ RH5u:"֮ #bU:=ۀV9]E#Uހ~V]0+l#M| ^wqɤ}V!2{# Q!p}R=s1=7zn^ּv)JQ+(0| ԯR\dOyErTWc&UUmbX)4-k{ԱbAt%պeM S.,70ꋔ'`|]&gcGj/RiR};%DPu Jkٳ+6Se=,O@׎bCg[+4{֑H2]-H:R5Â=slqT,EFq h$ѝ\ YGWY0 ?{F^}aS7Aq|F9O\4rYKc>W ) XCBQme^@ n.fn;g gsv[DcXتzC(%fAyP/Ia a6G`$VY,+: LOy*hw lA~M&rT)pPً57pFx`M~g# 7rfЯBrJzr9 WTl2~5+mh: fÐpQ,W/c3xM /[ЄǨg1hXk\5cxӐ1<{f9[m Hl$D&(Y3f퇢 7ك]e۴_Q;56Vr7HKS|.2xNk( JqEHaۿcPK2%+?u∢AJlFaFM4y ('M"7pgsUHa eJ(9MF5:\ QhۖeVP&o)P!o|KY(ecE 71ښY!s+2_EbPbw,+YNGr\qPۍXEVo})4VPX,ӝ> xƭ-{K|-!ex;衤;Gێ)] *Z2aY z7 <[a,B}Ȍ^f-O!h<' x. vs+pXb(xP]򀫩d_x:޸" 1'۔t(j$x`-]X8=kgLh 3S'`o@TXrj%TT5hAEXsfUdc]ʆ:p*[Xވ|Tzb$VVA-v6DVխvnb”tPa:Yһ&j)CzQ"w K W_dyI} vQIigYR ~!Zu`5(-v0rfֹF5{pg ޲yX40@ 6>bJGޱBa @,ר2kR8x%ijk%BZ-`@,82J5"/6eW,&aiC oJA >yc ^3,"|~nvvN9Ic#/xܝ)K7![qy<4㌐(z : 34rJOZa j/F''-6[nĠW}R-'g1Y( # 9΢z"V!|AaX=eO W~%5Xu +{p-".?S5>9`xE[x1}TXSS$xHw*^n(~h3ArvMV.{KXXS7RqF0,7?DgAWtٔ.T ԡlX{Ƌe&j!0@ۘ_e-n>3Xo*{&e.3cҊk[9pR>ث8s)"طߘ9-x}i&^L1+c0Zo,]q\4(H1}h|#"`Mm|#L) EZbG sJ faĂôvUY=GRӢEV;⨗(< Cg4>Qçp_O^qJ7(>L`g.Mus; $E_Bʁ*':K?AD>kU *oB_}zx%@՚-!DFP:6Ap@ 9@JZ2IxþkywEzn=$4xïx 2-o.P2(G>`8(RU^% bѨmyЬzSlj [S&GG5ukՅ0+(6bӁث3rЂUF FT0{MٿXMYHb Tf0*`fX0*!!/C]7iT/Pw~#M(k9x 47mĩ\ Wڍ2h&.wۼ8bV :3hǤc"Qd8ʨuZ&xb 5p({^S?Hq٘yp_X0j:5='\5w}"}zP ݖ~тo4 >8xG ^$k*MFkp;**ZfP C,v K2 WvߴH?dex]6_pQԝWR#Z3RXaеnY|G1^)Jv}oΠ ?PeoTyUCB|XL{. APu4Du:sr*Q։Djo<=RֶSyl[b0wDasio׈7^ $$:)d p eFVR:Xc3aH/9`meM̦^6?J86|$q#a' "obS3jng~d)`+uJ&YЫ4 ӴM?PifM'xdH(U raZ ؛[v)F k-OJÉn9nA@X YZ `e0c_=UwUX `I}';mQGw;AKMkKج/L(DIǩHraE%č-Aʣ{!Sƻ_Xts a^ļ<8ߤ'rqVGe*~c-tE))0*4piR_oK7+.u kʅ`D홄Kbxrb(׸*ZXת _jRkʿt=bfO]1+_x,F[dȐ6iUfVqg=@ǙПb n*E߼ K}1Kol1u?`&f+]vҳebW,|G<-ŏ+N]Z^+?u1eҕߪXj_0 "!"0-%A8gGnSTa ψ0Q\3y~ zwx̼p3R mzPw[lᚗ =8A"㵓2U n ",=Ix5.SCl+1H٥nvҦ7F RP̧t(X u,6 ˓4Ǭ'I^_jSО`qT0~|@PrMg'Q+/ z=%. EY5(DZhYaWasg\*Jp.HbZ-e r|tPv qD8=f *@)hHUnS2mxz\0`u6J;*[]1nAEkGņ>5@y!NȥPyˣcUÀ(( 0G#kaPH6t=7O*NAl4V/X]PLF vWo_ZX7|Lc6Nw@]]3m^fOD..^S;qAimW2,mž~~C. b^ʼnzЙJ%>"F2`5 Db}mowIGh'[gJ s-m,:FZyuPJ][އZޛn[m}e4쉫꩔z5bѾ hJp?,x6hˆlO=^ޮ& vOHס-7gx"kpJ4i-k{IwRh|ס- p\}܄sE#%40!@"/PЂ[a`Es6+I^`, o=z3[w<@[ U2{VQLmwUll{"1(var - ?x*{jnnڼ(:<.j҆Y.Q9i,Cq{oXVr5ڼed u2+ybCXh˖!05NRZz5 惁q@-&C> EW|R i^6{@-Uum_vE `bpd._oܥU7Dkzjf CZpDrwNjLH(q>bl5ɍ(홊{_YQ gxcap3O2R)(`3k}{BC`W}:ˈbycL=R~Kڣv f(]ľ}SVoõmBUkLs/T.)x6pr2K3G5Lu9җO{LpsalvrXMK2k43?3p%yK?The*'HJL!5s=j CkYt+l@˞0@.Jc):ا"6*юo op&ݺ{̦N}`t4EJ "m)0e Ę(L3p~?.rD_آW沁x~gR F>K|mL16hpDLƌ0RW3N]wc.:ʫ AGgl7H,&-ȹpMtc*Ͻ3D,4L;tCW0@1L2'.9N.ikKJ=A0~fb{e}:>=Q|-x&P2ʀ8]KW^ܦ%Δ-}#9paIAjT_1>aa/mE]<͇\0 , wbNZw[ϭ`Z1k25 \*&k36`D9?q)Z+p\ܨr~P[s%ԞMnt8/VD."RuLKNĪnq>Yp qeBh_+V@%aB1uƠ;T=rPoWZ\֠6K Ţ_>X:MPiSsZYKs5`R(pR=1+.O)SK9L& :q_9rXStxܫ#r~׈X+Q4hp*ل D(O%GIY? dDB3d_Kpt+ TX *^Ju+!D e=7 B[׀4F@㿽!j'?Zm"J-W̞ҎbRUeKnb0>AwGUA# J nRmm)΅=#0>ztU.+z%@B!UQrBJWf`(60s/Kx wh܆]Ɯd=D"-t[{^ЀKqGw;InJ)ҋ7lMpk͌O̡PF[_IKpU33fH *-K f2ɩH. 0—NE!ʾf\!ou%Si/1ݰx fKxN3 B]1Ea&ĽA5J8ZϘr\tޣjц/qUPPTsPZ2=KL4RM%"p5e)l0 fAՙbNp%%Ȭ'ʑkp@- 2QQa4myaJ+:p1 *f9V![ƅgJBFFV;n)] 0*R3!Q]gpq40o'KA/*U(vP%F/1 da@F\[\sT8 %nQc?HUhˉIsK{Lsɮ MR*hlES3梬l`h- prfL=6' " shY#\9ssp͊P ~вݢ^1Z;%4@8T8D7 [Ny\.p* #ݕ*5R(\+.@[a }bK^Y|9_b;e7K CEqՀu/- iT^=%)u) &t boSSԥ̑)SXf3&FnXWH3\Y 9E.5^Ka8XMan̝P.h?u ̋B mb"qv;&50)Ԗg T5- Mg.ʪ`̨nx0F:. üj9Ǹ\c bǡ^E5}p LQ<-ڥ53`z@M`k4nDo:XI~&qA5$kja`rHmug2%ZxÆ2ek| (mϯGUʶvXuw .l&V\ݢckrg,RrH/%3tīEo/Ԇ8S6>7):Mw7*FN*?J1f3¿ 8 \6>zn%WkҗbˍӃЗS*(m/;Ёx\q{ܬs*[0A#p퓩h- 6=S vvCIp.VٿVm|uhZ[~:Ls9举 _8)lw3{*xT#mowY (@XxSxkYhx79c*:*B9$Ȯ"wٮ"2~bro`\\ Vlg) }wrCPi+% +G#uwep:[ߖh6kp}}Hzf9%I7-67^ޞS=U#w+v4-3XwO7 ,8F7@>!u-+ u`ϫy}u JhiS4P2'LdLUQe|Dp 2B\`ꔩǧHmV-/*2rbH[vOz:heTpg&|Kkvp)2B89 ܜ̵XPu e{k0~% Sw Xǂ?˃(IjUD~0Kn]Ւ@- d{IL w0J1y5Zz='= j2 *L{@C@% ']x,B,jf^`T05n5ڽ!]KSfjuefB!\R0Zb=[%FmGECWnr-[A H4kaB_XbT)/R+c˞*tL\;S]Fƨ3i^֊2Σah2aZ`۬qTbdEjW{+":A(U97j 7,Z:*X?hY-0)|g!{SM\ibb.:!k{A-{Ħ Hf!bWWAMCWs/'hը~% 2&k@!0K'ZY_x- :]~"2ƻ(ϔ1,ϻ[9*/ߴRmb`Sdo'j0hwz97Q3>2*tYQnҳ~*A\k[ Uп0;t~P4XYP6_LJVw̡BYadf[t6n W^*0m.]2ie7A V]%*%2pL337r $̫2E-sDmHDȪCTԨ :=fIaU;{2kX([:! xXV(I WobG(?X*Ѝ4o5Ue+ @~\`bSRAAI =aY&7lZؚ+mJu6Ɉ7riKQ&NGjfd%2oQ4FNߘF%60n]bmC(hXU#Ă !gT*b`հJ.x|KKnGxyc.z !J5]K-F'xЈH 6'nҰ=*q]z`3mVvwBc]*RqWPw hUGz⍕ge/uع/&!\.^cZvx;$ge0toK[0_ApGSfLYܚɐp .,x߼ϕMBۚ/ܰ P-#= ;ĆSGN*s7믙@-Ң XWT$DR-֐-~?ɚa_,r>a4+{@ _Ŭ\€;bM.\[NE?rvҺ%NA(=N ʊh]J֩{M vy4o^#].W,Sfaiv]æXhEsmW%0j2ըa$ FKٵ- c$+KT -ZWЅfPN>e\ mfMi4fk $t^:}f4AO@P[W6Ucљ=A=+0$JX%-Y ػ7 5]iNÄeRtH J0:o!bLxu7;;(] L;K rh2ݷ0#њYauɆ!]G9F/ 4`%,rQsw03YUi\LXĭC~eezSL ]0=VFKI1\AA}9 5 fZ=8[ї*K S7&qb{a4 ,SE;M'c?3> TBEYތYݝBmG s eUm}%<3)W94@ sJLo:[2(iYG-)yI4nFKj%&󝔻<̆V ,,rDε,~fE \EO\N= CJ`kg/EĢI=;j-TKu "6MYvb-tw(z†/ra0bop9Z _!T9*a9F0 %a xGغzIW(UB>l-P&}c&T86ѩ+`Mɂ\nCрޫRy|{QU]@nQW5̋P9і܌|R-7<#&DŽr(<Rf^s kf4srB(-Μ*DdDxE /V2J>% w]˘va)"l qfH8:l1*Ja`LQ偆9wK7mˊok:_ aѧP_e)Sn*Ͼ"3n{bk`5 \o*D'͠P@A|ˁcnOH&mV;F`5րm.E{+ 6PnE4x=3VEA8AC7SRWMgrʮmQUnU8wvKRE8L$*2J)ԋ9Z61=LPJEYaNޜ5 ʏ>'!2sʦ-FyQ(ky#UO S\{UZ|b,;F\3Y|H]OiJ-B/ t,̙ ˙mb,r^z?*%.<]`J[X?*Kt^)mqp պ\GLfۯci N0*{Y}n7U~%l;ue̺p00YSyFN.h% tfR*uJa2otЀiƆm]}bKC w̪U+p-o^J1Lpë’L>p#"+DJv{y zwֈ1P:rEαUldUg2Z({Lg00E$WzsU1cԶTk,"H+]~, _ iBtom58JE.^ fRѐ#+rȲ7C.D_#n Lߙi )e"MgqP @8J>eq\1OU`/L WAB5-( +Zwe6VF_M5o'2; Wlk[l6̶VKSSAo!$^0"IA"b Ycy,Ϡ(@mTفDv 6dB Njjf`toT{g3u mBXd$0{+x6nOY\ZQND1&o޲m wuh0V f)ALCۯhtgUP_HeEM@Q3 fiMV!X"ୀV%BnDJ3lp(t.oH)ևf-*3_ L4xJUeRdW~H{ jDA;P!AGz>NUJLjh8PxTh=c;W.d q(%S"%e\JJs>EA9a;~6龱gN8h;,ٮ812 ACR抳QYǰ]?~YvK0KZ9!BBU-WnX/s"OJ pZэ+?Eeϙ@UB,ѓ6 Wyym^C&-Ϣk/2 q\B%WmhsS) wZ͝~fYdA/!6@-KFUrQ놗~ъ`]Ze`=%-lbAnֈ̇)q zbgy2,0tPHGS2h'7()n[`ơ˛ 3*Dn_ɨJRsϘi'M)lF=f}HBDCoXda*xcⶵ9dp+RЬB?3B強lrC~`ƿc^>n{C&M{ {(& ٱ ψ}gs-fMQ,«6.o~e+bH 6,Wa|zb!tre"Fb@2hxq =9gX7lE?{t׬:gӊw-wjĽ7!H[ܲ_ ̋k2^TF;@ژ]Weܑ|/Tnp%VLޫ{3LhV=ft^3Bj9R||\mU {&u :YJb̢Z޺Sw(Tؤ=E`CxEU9BJMQ^YḵŠZ$ŹRȸHE2ry/@ " oD(˪e-`QF*0# Y—GKˇfvV]KԦ+ wĽ |~=*)*>{ʐ:c~YCl{TG&qAZhNkKfkBˇ(.tybfBׂ:`F"xArk|y ,ah(6 ,N5 6dQSW. p0rs]%F9",_˅p11)3\UkFG7Vh(/RX3E6t- uffw`VAӰҰSsWDi*  %|ԿH'UFv4mCi#^K7%H]fg"+g*`mciV%9f>.bM.g뢾`zw_ܻ4o DjhU;Ԅ4aJc_٘W A-oH-'g@d* + +@̜SVutԳ;8sBzq<e b+3G#z?T2OtqHwhyvj`rJ!tLX b K qwI+VW^P&1$W_SXWw(V(sne .fדQqUJwrwFԩP5MԵWuT4R /R_`P8vйp腮C~_[,F^K6"S^9Хo;zWau `@@f+;H;C\P=xԞ=`UX0nWjrWDzBnsB-rپ֩-љxT/$-,t٥{[Zc7  ޠhD )e+.c-@'kwTB0<Rj'hQk_fO'Π%ز޵DLjqԍԔF+Hk(LA #_.kc5cg/^y߮ iQ{B(|K2%1|@-i@'kŀI=Fvh4Z:3d`Z34; (82 EGcp[v~rHTJ+ϯU7 13 n 1J~aA, ,2z4^r3߼KHTA- VgK(fPO&En`myRa^S.:}vJa!3?2햃 {tcdsx0pe>7iqq.E=R ߵA, fjW]*1l-td-֮؀mWC*r.Q񵉕F4Uz^%%3sVh& `Q F* 쪭v>SvH6YDCD%wnt]Jai5J+Je7)U\!^?c^by|1Kh>eRā&So6/[8\t5 DrdKJdj2\ABn/-1teر.156rz1ҊꎋI;%i-J yLLFK(eQvx7N jEi@ lG ޻[{EšWh[U-mTWt թZ3[uR 2 vˇU=Ž#(0ς$.>nP6AYYn8zkLJCt޶L+94+vU&x$/Q)!;`y=i*[ۍA&*wwsM T 63. /Ūl|zzA6svW}|5XL}-]ѸHZy )ʮfZ>wT%Q^%g,!O}۸~q\,C UۼsM%&⏆ЖK:m/M$6誴xj5buwBE%Nd\d6\uSchF#FNRYXYmn0Sn2k`#O娰҉xMQ{@d!OA ]-Gp{%7/$ h_3fd̑.Xo2@ ~e[,Q 1h6, *cO[l88B/Mˏ!g KP\>eK}ʵ5(⣸ɭQY4ۙ] $]lhXi1(h$J#hV[P@m.l9 ȏ/a(rp[:8 F;Q~V%b1DAԠB }~&I HMWEfk2Ld뙧^OhD 9*Y#m0hxy ."T *ދo3W0ZcV|^fXhT>gL݅)kaR_1/[Z˚RX fߪR ];˙Pdj]Wf D5Y/8N."d?0`} `Hk+G5-?J" jHeCaW}@Q 8Jqxc`|&i;[ƮqM#Pނ:V0x7g2R >BSZ\)uucbe(*R7dyVB9]jS[Lƶ;MA=`3@3u{wJ ZfSO͘.Ʀ^ G JA|3 nCb"4BK\=Z,}QK#a6:d*ذl\N3h7QʄQ>qP/ }$rم0_cR[oS/rv-gjHpCW ո%*.!I\!iD9Uąo guL .h+{^C"1 aC1N8m9>^Ν_0Ejt18PLn 2=E)C;BƮQ_3)Ts3#}!AT낹X(\3X[퀝špo:Orr{K9khL0 _7ͽf(Urq `:1" i{Cmpi\t Eh(fXE-xG prU gFɪ~Ǔ\A󡼙W]qԨ - m~G<[X t7lVIrrGǤLJ|BKGn%- OSU YiohQ,Úae6Ҙ 7Dvbb# Um9̹,ךv8Wf=]b-n k;gqAi*D 'Rc[܇[<4QI-W;&)/RT3:n0ߚU\1#ҡo`B4=<$̪ Z~R}@e ]}pg~70:~S4QrUO4bAȕPi蟘 x\v%{1,WlX4<7Ƒn^Ĺ0,'D\ԧ[?/"l`-Iz by!"T/ ,ėZy1X(d( Kmè+{1 9jn^b-LTP3W~3- =I@UC20T~[GM1 #=q%A㸼5 un k;zLqԨRv W GDd3t̿}+2mp:wőA[va\a&Vk߈ף)p:2=cVS= j:rING|mTHX=.Eקvskp*p*rHPx:-;s0Ӫ'K 'HYfnblrO+0'lNbzr+Vޑ`1!x9QYs4^t@B~~P+l\d71.UGW<%oZ4ih'Ҽu^%iߘ.^| Z?Az0UBsц72Ş=N0\"gOJW m1fmo=%P&тWX@P>12mMeܟnAoLS0Tԯ՘U(2uNPHl(!ff*Fh޹qy͛l2J;Aq 2j{_dhe{oߴY",9P_79(^ `cnf^nӋ5:IGе L]~f6f]T%φ ĢW, ƠY/S@ 0`noEUy:D{\ R@3|1#lO AiI6WiV3гF X(L$D՗bv- j3ңVȯ2> daWt=Q2 fYbdRҮ{:)LqݥA^7/]%_SL2uEԍd>%{ڧ5^$h DJUy4+߈X-^>#Cj~QC E=>w`9e)UniF hPjPs1RJKX[sZQ]@J= }hxP]s AWP~T v)ŻR%f{wfҥvNNlʭ : (ӛv*mǟX?72o)ǘK d!yl˼.rl31k9 ^{eT:~HLG{jgDZ}s<:T)L//T1U/s^ _޸BߜV-c s.K?hMxǢm7v?WX]1F)"2;ٖjRD'$uW35UF鲱 'fF eT֭v9ݸZJ|ØJ^H8j#Z Ś ceNbC 3u`>3)cX&5ƕ⪣rD-@C[h0׵jt*Ķiے &@`՟5!hVìঢ়a}P*aEDJt,4qP-w.V78Ba(M4׼ܺӗƠhqF5|cU^5Bo9ZH\7R=~F8[4VUR>C+o䣕i:taA*ʣs&8]ـ\+5 Zzؖ Jr.p enw,"T3J&{՘G7#*kA!<ވɀ<}˯ azV{7/ in!7F8k5vub/QPǡ1b Eh| d\VԣL1D#cr~]}bh@2VZ 'V~j7hC jx3-g̅{x -3 O͈=/m V4/U֊P"\:rC\u ˿Ñ'o+-:Z *QQUN߽g3 r۽;Įα,#nU#qB\{ eXWi&ɯՐR  kzK`46`c˩s L b[0\:` gXTU@]v R1 v@wr^ϧ@QT帶[?JafOiN0o(mUةm\Ja-_ %VA{e@SՕh03Gl̡fBىo<>Ӓwwd-EpGW1EŪv57^ [$Ce~]QsSnEғZ)*X !1OSkrYU3ӱʱC4}hp2P 5 x~Kה1/9i uy6T8oH [m _b&Uo_;}yF9td ۟[6bqUCSpkq<>|D0˝ߘhLjSo01݀˲n-~y&ufrk)sQD&KA=aBX:Gv)&,ZcKX:ej[;o&z,$Gqm"JU @AIY-eb*!-Ikv >elXܿ h Lw:nb)( 3>9"E8,v3 ( _Q!iE擕A#tS7-d v `@P+J{bft]Eۂp`$e{Fyhϙx,ybS} 0EzUtolohPÔ˴׻-}!aV "*4]Cr 0<(Գ5w0 @/dh>zN2Ȟe:iCI8(_fm<0p n{L!|̸TN¾-vEUK)"Sizml,= A£iPrn11-]7(*u&4O1`)w~ڲ0KE[`&!/#j3;Ly;NB[#i.1Wqw9JEX5S vg10sl`PPb/ZϨ!i5(y0grf8".|A_qra[t hXJnye0oLY^iJW*)V;E0&Ј(]/ .na8)zGzvRwՔvvҮ#[Aٶh#QŵvEX*"wU,8D,*\OeG% j+%fg X5֖Oy'b+E+7uD 5W./l` Ҽ bSy>-RGH4.?PZLF"L5a)ϘaOȫ7ˉv٤o$pZ|}RK|'2#hn1Kvׇ^oᘁy75*R \'W2R@"67-p kimLht\n$3_e4P 2N4\C~ڵ-,ɂkQ`aW cm)i u( T.qf[#0.$iee6N"/_0)xٝu ],,Mi`@CA,1 I{PZ՗!qb Tw7Pʤ<+ *ݎ g:xRnE V~ON*®)->ܴn]:ƠKѭPio**hm*4iы[˾"XT TТEaC̥-(O2=';!C,j}5ZTW[.DAoz9\-Z!.^_Z ;'ae">sav} X uTLhHy]Xmc7)( x\n@a* "Ps;C/?-NƗ5oNeq)s2 2.? cԠ.n|H3/`@̨~*iD~|K xw]k*(vVJrَ,Y1.J Up:/yaQc֢ T˗Ma8V1_@8-ݹXq,+;n&E [jqZ+J5P2*-·YlL=,R!^pYqj/"R7)cA#6 3kIJ$ ڃGcXFl?MigӴ.r3e4TX R0,%x*Rd?1Ü͸sz˪]Lz. gYMxI9T yUS[;r=;X&|<4-5Th;Gi-ψت2M Y[e8$o=8g tK Gt6Qu N OgQ-(~i܎h/ W.!)x|J/;* [Ps`LNlARPcncEtV WܩR,l0-7e +Onɲ-|emB)(-yh*qREEoN=aJd"¨߯.af)N;46S[\_XPJE4V彗f[LͪTr4VuOӬM6+.z11z[(EѪkiQ~1JuFɾ_)Dragjɼw&Vv~&d7pZ,ffMT5h(s- A]S2W2q;KCɳgym,.$/h"F¡7q2/1@QQjZL MEڱlӭ,e88;0Y K@ B~ aUcJͲ!_cTHZKBL<"dʬRy{Ti_YWj|JqK@RfR0:^s3G7i˨~Pm!,:DGkV\* X5j;p2qtOՆ`Mb&pb!Q,7szԪ70%fbYҠ̡l7ق  & EL&Ž!^0]wKhPfBg%ͩEG4𾥫ʅ{ -^Wrœ媽cŁM>tXl,:ss8f5is2-Jz ,;F ¶QuXx? \" ,*3-@iL(4&, %rt Էz V\0b83g%L)M..G Pk3@5e\f W^RPr)`]ZL/(y[MnfǑoli%Y0@紿VsW,4b:KI\ SlIAEB-t6zK"K'0#bl/Mb' ۱xc@"lF{tpL!fe2]p)aFˎ@ ڎzJa}ǖo$=t&|(Kvq=h{E z|/2Veܢ́:RiՏn7M `=BLh9G8 2 l.;'!V+:QJ*DlTJn:*.%@/f$RwOev[}#^; NOynQ^qO}%~D~N&]hZ3|ĀyWS1ɞ[Id(I%3]?R!YU&&\&q;) 0 P,bW-_c!Q^ ke/MhM9zv7#Om=D`u L՟ZS:HU~_1EEx 2ňEŠ>EKX/˿yC:ᣃr8:Ū 5=Y+ ;mA0 j Ej7+VȨg 7v1Vq:+quF h6fxuIĬ}.c9#nu0}tttCQv~`򅩟;Xf!5k hW5IޢmB E*&7+?b'#Gxfw^X*: C(^/U8.;R`Z:t+R?R7Wo ABK*:0+g,k̮sN<2&Rn`,€{ J s)Tk |Fh{ Ø+ZRW?IA\Nf$.~vGPP5xBx)kugN#laM0_H?HԾT!YD }'<b7 OC!C%OҌˊ.Q?g)r_ Эuh`TY r MK9VKĶꂫW5_)~`Za\/ R[5DVg2z.% ¸+?9 C_*dž (SC}#k1iZKꄫ98J{oqCæopT3fLC]X7eӋo30o* uHQcl΃WGW`T4Eec* k-B@'j IXY( J n7)AN_YF݌z|J!-Į[2 m|ex56xXQH[&?2VeWyB\ (rx]tZتV v榾4_8N+ XkVĴR 9,Ϡܽ(w 10`c,7C'QFf86΁Z2֯Q+%Tvfvb](%o͚8zXk\:dцK|a)c6e>WM~}fvvs"fmnuY`vkTRRSd庨R?T3+fҎ<͆ 212.yzw/mpll 6]_0T@Wqi}lŝҊ`/6>E f>J.^banZӾTh ixm{ D2UA}bFVƀ+N3/FÁci DM5튈 BTĽ-ZX +>W'ji C,UU#|Jh:=ʳԮ+cG>>Rn A[$𱞬  `&թya hBEX_a{-5YWXwT㉈0<սRK@7k,:W%0 0C4;{jﮟYd(GG &: @EbSd2/I`w0C수~}VJ3-=;BdfRm }oݷe mϼN $VP6%B\N! u' ws-U}g0dfsAQҌmXW0/5]L0W7 #gIAGsS} Ri1)4:G=& -*p ^׉W~o :E@3q/;Nj@&Qj4lvh[KVk;}=勥jRNsu'OaM唦4z3i2U| J筺gq$8\g)GP:;Y?anR=;}&u%u:L?r@;N[}dtRdoERh7Zzc)%L*AZ?eA&V+v aVS;cΏԘNNѢQ~bO8.50|R% Y|Bg VQ4$?)o®:A΃T=jό}%-2wi6;K%GD,L,&1M@]oRqP >S:Z=QcoS.f8[N}Ǡ; +zH^`̝] W3Y%2e|:nPbϊPݳ"[Ljn=^P DofXVvd;CgFh_CE _JigK+6[9eLV2pٴ~+!@ͱ}lA*bXpN<̠VzG +^ {F,ߩUEuӷyvjdReT;zJnZ`TE5{FP $Bs$q,KCpMqD k6uQX-unʽ~ICbPyE`ԓwc03FC/V[IJ+;.FNڡ_م٥G36(C6jd3lSg}QW|r"x+!cKИZ|= *c&fTd%o CY)0=03PtO2Q@c^[Nu-%5x&`,S*сb@ed|nzj6{LU33FS19F s''nB\E.z"xIRQՒ / _O29ٟNW[5j1'<B>ёRDmXV{GY]/8ȁ? XP+vё;3)`?xpt-=b*;Ł@':dtk[#szv'n2"vŋ麨@3'.P8oYhq"ӈ.QsMoԬH54+KRAhq(JUL*Dݍ\gKqQc0L!iqv=X63߬,N$FRWSP?1*+;Jxr#7 ;)c,FuP[Nt Lr3Y5XU&%L"E!-Uzaj̾F`&diˢ-ڏ([{M8E0;`1 \Lx-mMCuǥg \*,vA6ql90.(ddzq g6xDeԲCtDi,@f0ـlv,J _>R'Hs XW0PɑQqCf)Oxp%"$6/Zcn.'t"x\A+{śR'W-z pJmn/#!8=,hIL!²@5fn᧔(rJJ/eղwB퉮72DZ{wE`;fZNHk2˺BoHl]ss@TVOZ ٍW ?Sz^ۂ6ʪ+62L S56!j% ױ3BanfT+ bvmwۣ􄛍5ZVaftKVNÜRpBދDgR!~͌Ae39b:r @̤-EnZ_3Z'w|\dZnHŭ#IL tP&}.SwFl"@JбTg+S\Ъ`B5֛`,((P>n vLy'=vPTޕ&WA %K*IOiG)`PmuM^f%2kz<#֙E *}}\^Ϣωit&6ѲJ @X(}"WsZ&CA a[%WW\L*9WzojtԥمDj?cp}! ~xT#wlSoBl qf} "k z}9<4\x|c̼MB1ouhQ۬oQwaK|Ln >(bq/ Wzv㎧? YzjJJ:e%A7eXE!kEU킙O ~)_Pᢡ}P֙c r3כ+eɡ3I{L]9c39f0m d-+țE!oXhp r6Ȇje*̤X; Bhb_@U$0 5nQ+-"*af(,( ^5706XPs0@F%%Sg!E=,p0*s=t2QmBvag)iIc9n؇E70],yg^-~ES@Ȣ_ccL=Y hP~*}=%hJZFDV5\J1zGAS3(ZmԦ]bG<,dvݔlxʯAN|GE7A -޳vh_04ۘWLyM!*Ǯg`r<ŬLn} Jv}Tja\corXt^f#l@Tj_jUN9J @n׼Sek//׉~^EmZix'2N 6{zQq1\?NkrsBEz³԰)dxn< r=rX hqo TzZ*}TȲڦIW+˅BM o> 5X (X4j;ev նeMv>Ո[`˼+I|tj*t~S-0/ 37%m_K *{lʻVZEkڧʽ?쇴@ҖhHU0Jo=\]  [!xf8H[1JKSUNv); +yd/+Hq{A eɩWzZʘ=|#T&'α(v)aMd$l_8'} |׼PGϤDoj@KHg!r7.p٪5.+ mx( =Q\Hקi{mfԻW!& &gya/\IT"_hB(9}Rʆ| ^~!)p}8jBW0 ?zDB0\ [ 5>ݣwV/%@L=eKph 7C+@fI1Q_hF@9*XOfWhhihЏcWm)&75Uk5M6LR@ql]N|;L<\S^#w&pxK ps[A ZFY/.nS8nTnLDݦ{x,WJډ|. ԫg_^Jt;*2xfIg ,HVn Y>`9눽⏘(QR.ϙC&"(Kg+]In]'b^D\r6{nlD,>G|iY=F S(L"|[_)};..\CH[~e[`BP0( cӴr_Oc 54R.~*-8qem uc @ Mev: Zns%4uh#MVxdwߤ{lNm#Q [VAxد =(fd:yl^zv1-Niq*0 f.L[44riRJPƒ-CmkPv2J =p-y@`""b{Pއ }ٜ'tCcF=HˎBq yK1X/.hdʞD$vU~PEb ̘=mEV[) JkډZְMK\A"VRx#syu ڭ}&ǘZ5D KENYQ mo0]`OC/LP5RY UP܅C{I~B87_x#]4;|R e&YA-:f9Q(۞-+Ϙ)1__p^uN۶+QF{N T{fأzF~67Cnjve;n&L hLlk"H ֡oLj- izNgYhD:s5)gwQ%j?N4=x 4F ҃1kI9\;D0^oa3~jkg~YnUvwSϪ*C W+Yb1g$!T^SۧA-@r+J Ljɯ&YI%+`#o1LCnFK-  û,t.X,Ґ]dLb?%A:nWr72i-1g,Q}RTb>jV.Dr:rZͭ`3ښ B[U#Twzz0ɿ)`t=brg* ךaMQbyL@-.=>ao|V}Φ9+<3ըWg"HtA4ZVe;nӜxBQ%~K:M !|Ul[::k4I߸Ӯ#W:jf=ssys Ƙ =-ь x!TVSgiqݾ`\q)Q lp3F"r#QFC J{NX0̱1d. "M)^ -pJ!FT[m,RTts(Hֲ9Pu/9W˦ێj_a'R6`hnC~ ەbCxH쯨Ukw,\PTTڰW V̑ނٝB]aTpkYRrݎ(9v8Jř^LƥF-˚YKVB<{]3]vVd?ҎcAVu̕%aqtu*ƫXs^mS 8wȣg ;A؁k7 Ȧ˭Dʏsцo3 {WVZa7Dnծ+@_=́kE(gX&XE G̼iѣ 9Q̔ owL#a6v uёJ0^؇j+@KPaORlOH&P/ \ ˾˗d$-VqX`Sߝ& j;F-c2'cJONp*Oк2w~E<=)~g @UK+r"$b31?7.Z*Pҫe3&[o01M[8nZ H8L?jQ+J, ѽ'q?&`(,+jMޕD8G91Y8щiJD+wiJV2NMJQ$|y+;^@˔7(\5(agP5Ǯe 0y<{70Fۄ^CbmCV& I !x8b`Ey (ݬ!cK`o$zi[*K#~O^f [2nq$mxO{yΣK,5Em h]GQ]qQJ [7 q# 0=υ.p5wΙvc!Uv""ms1*BIw?E7ψR\~ tlhQe\T~EWR+8h{.g۽"9}-G |FkRqa8#1H kijz!wn+8#w!PZ;ߨ=6 (. 7 =Ȋ0\hg6 ,++/ZSaxP0]t#+SR2%9w ;S8&(qyEwlWr#rP>ex\j*w0./l7.s].,YM (DՅTI-6!Nz@Kzjǯ&!qLEK_^̧hxuZ`?NUs/B0m'Aq%ݳO 6@pES~GB6!@\,c/Hvy! **|?[#ISM*f@-fTW!nxAEaDW. s2zpr753`AbU E7.[^Xb)tca?yciL`Kߒ `ܬ > -;QTddj: D\e]Kb}t3(yC3@?e MgsRM A j2d =XtUE鉮%uyaT_%@mhu~f1S]P-[O Q+ @tEʞw(ܽ{j^!- 11 OerS, H1JiZJ N`fڰ\0SrO,?“bhXȪל@rrR8P=x=4kG+O)qu2JUZG*c|\ՠ_<o54BE{<22dB/@]J0wbUxt2QVN+'P\&dz3ކCmjP~:t^т2J*Ք9e."Y`'U/f Qr\B1 o?0]aB4^0ow6N -{^?ThmE^0H +&v%˨[|Cjdޥ62oE>}J6m i~_Vwm*K z{pEUc(ȸ)1jDwkiO+){>RxV1gs.%njRcBLb^NFp[֍k}^(2zX;PWJe€d ӏ_hݒn& r^_6n[p«َ׳%gyDG4=/+R)(yxA%ʹe ׃%jUZ ƞm,p26BŦ3_5t'Ho9kelOI\& \Ey+մfnJ)LJ`qVe%}Enq%ń&#)^8 9LfC!O-/cB+oZS2fC!Uuw YU[_R+no:}yp)J)߉mX}Q[äɚ5oTxnjZDjؘq`hLE^mNҋϬ6ϲ B;~ebACVX]ewy}-b`pPX̌ws j֬>aURŗ i}V$PFb|FaWjbV6{/3=m hanŃ}~e3kX0k(- U*lr'l%qm{o`ԡGUgei4MXLmoуMs~J=NGP@Y;z,[~6I쀃s(J+oZh]pJRAmU`~T.\s ?\Va>&B&8#R!FȺd+T\W; Pz`cJ%"5cKAKG RVTEPs;{sf#GtCd̼{xU/+LLKcą+a['rs5G#^>qJ^<ˣz.2 [(G7z( х4t;% Ka22ݙQHSzn]#f֊D=@$WuyqcV4J0[N0,1oHQb2p]е{>q[.F߬GxbBܟnp;VU^~]7oiv"ȳ;h4p01@K/ݘ,$!Xf9<$.yq3E+*{Y֖:L)yNK٣%AT'W /`xJ^̪\@?e3 7D0LqN#tYb(W C@i08׭j[zDV Ӵ jClS~1D&X]񾰢AD%$T|vR=OnvGx]KIhTqd0Sp'ĘXpE7c=Mbʓ݁~GXę&4v)\9k!F#"P.xE- 0P7ҩ R[R0 =`0)qpU 0z?SN+|R(QElC/XArOOt:Jv(۵%A5M{d6B]@(LoꍁPz@SXMx]~-q}K. \.Jl´N{FG5u4z(WU"fms2~0Vn, 86LW\,?dk;%a}tZL }1x98C^Wd<fv:^'eSNu0/%n4)< 9JE)K0ރb(3kyw/vJ+UQ ~%CmFq`_IsP ᇺ J.o` U 1*4`>%T+̨;Hٔ`sUbpٍٞN2A̝aJGX9߹.b秐V y@єN_h=J*AI¦,>e޸}ck+*&o,\5Q:CNPU,NU86JlQQfb3~pK_]>S=b*@bYOpn EA3 + OR ?«Y"Zk1XvBGB.*f^Ar=:%K@bޘlp aIe#KIl,ʶ%CvoO&!}" 9Tsc؏KA+Lx[)k.z%*W,j` :״yi2v=(u_l =L(}8tg"Gh!C݈=!i]*saS_N!K_ ; faSFјșE u;#D/m@#KtA|(w!K]6*/|18)Q0Qhj V WL-Q&_ϾC oG8+l#ҏx$ggB4fA PyX.DNN=ǺX|¥.JScE$5@B%n V&5ܐdj(YbPfAۺAe5*FmaQ q`j -vmTh;BHr:LcXNQk{,ˁ[P 9 gV` MۘNGZ&ei@.{A } EJ"U%{k 4WD؁̸.W|jDk^<YzLz32Kh-ߡkuTw1!++Znc`˃+$l //l\ GB4<y͈3+(ݿz&Imun&EjK2=IK oEnps܈FquCaz`MkX,B EEq\qD' r)<_Kɠ"jMXA笤DʍюC- 0k&P8)Uae:СQgS[^*&F23a:T`./ 1p2e@!(C{֕{:1u@dIɄ˘]ȾyaYPEoq,̤߇x qbSe`GM*fQ:Q*˦&]lpꘙ(e0KD%~OWP@Ff$mҼWiUv#`k]+ (؛2` [#J0KЕt(f~@Y@={Cȍ:tj)NU 6 k&7~8!Æ7ǤC;5`g `7TMOVXp~"1kQUbsx[E=&2CB SwN(Tt7J t) ^뎶`Ü.j@?l,BT+NǮBHcCd:aGd:޹22ęh't+e@7m[[Jl\Vw:vE%f5]w- 4vSAV0{ 1⠒͉XSKШV0WAb` /_ X(Pˊd -|Al w͈|֛bX~Lwj Xa%`[jȅz2;pd41J`+ en k`:g? ;rݢ|ADjMC:[|/ /!_)_lִ)+/a7FfKzΎJ̪>b8,\&>b9q3{E˞c#S/+݉^B3.Z(;\%3se#ObxlH1.gRx{قTaBh)/傇Q) -+Þcb@Gnz zZ땕h;wb,K|ܼo&ᗬB(4:`{>U_;n,v M`%X`W{[SK!5axSthveNNL.ٍٞ 0eҷ̋!Cjn& ɬWE{!v/Xc_TV?W*#eky{JB u #lj+y@}"Qِ 2>Ei,΋Mk%prΞG @:6 *ʈfGrՎijB9)lt|C-1OdmE'reFKR\4Nas}eΪRuJR#h)bboS#RqGD:j8,$,D0! CB6ѓxQS= +YUk`t]-c^YuK8S2]"S >umQ zwb+( A2p)5T&HP͔xh=!!PJys@ zij\0+= 2Q.NM /XDDJıS^~p!2mdtá&(ݯR^7I%isu,"9Ur;>r%[hzW^( !ym=˖~%!<*:)!/t=%+9Ǟѩ0s,L*L gAp%u#,c  5({)BGmTtޒ8iaQDgyJm;֗p^l'^s0@a:wEP2v:Z,pYk]NK}{\W"hC:/jZ0 ɻJ!_ &CBy,k_$aTUo!,> Z?sp<'^Z]CwK Yv,聲 (xYP;=Q 7|{[@j[zQP_cL: me&,uJTR K-uL2[DG +XOi}LT*K1m:tb49-@cN|( ~9"$'H (hl`X{ pfT̼ܶwz^ҡ[g0mpRHtf8"~v{`X>IuJl,_Fp!E7V.=KL#h,pTHToX9(_+uo"p50<'Ħn. 'J/{St{d*\~s4OGu^ɓ Ӈ1D'T R͔e1vMVc{,UN| Pp`W&J7ٛJ[!ژ^'Z%-FS -~ȅ9ESo9ME6ICc+SubV[#G0.5-]w_%\Re9X$`Khsoye)P_I8ڹ鈺R %g^g2"\p;FMgT@n<';u r#G6db;GW0D7'y' 1uׯJviƵaK7750)lKhm*礤r*n 169U1(PZe|ш[D\RG5%X)B?rٺ)y2:ZFŸ;AҊ(RzˌÛj^!" VqAۼV fhoH efT:P١ǥiu9ynwXTUW-UтXX"=ġ+Ϋ9i5`X*Ԫ`e?'\45gY lHF_2uMiЊ~3 G%u_e܉~ 0 RQ)v*+Ք mh+Vf 48Qg<0ȉq,XVTf(^X)3ALAt\P>)*;#po-`MCjkx@p cyk@ x;)4CF\Vz}ܻi\$,]R`er·m=I%gza`$`= |fWi?1Y[Һ?`׬yhr'bd 4 D 9oo !Ʊ]4gC刣uª Ĩ ]% Z`Q%5H!޻ 83LE)-J#̶Fyy%y|KDǤEMZ8"oTa "$.fM.qѨかO̽ ,5K~|M>g73 ]H:Щ2Ӊ[ݢH'!U]]w3Uߒd `hi h7_`ֹwĮ(IDLxő~u펕Ǝ/1*Vjl:Eq2=kUcWnX E"/3B彗, |JT:>%o3@[O0rœkGh%m6}oKkSV,}4{F(slv\S:XQT=@a[$P_*F!DbX٫zJllZv)X亥2<0#Qk `~u:dn*ޱaA^ѢՒt7  iܠفw,+ނdxwI o1_YeuSڣ\8=fR=3*+F\Kq 1~K1㙍#~ˁAkpUee5wl0dk lWDZe$ZXl5ڸ?1qz8w9KsMk9mۏX(.o jYǏX_YgnѷHP}uNGDikJ%ɜhvE]B4j]`X7J+i~}xM͐5HX4Y \C_1 ‰ ~VA<hU9ŔVbs zi|vGFpJгoBD.Y^p%N* jWD0-z-Bܷ}.ѣd 7)12FF\rÁWmC0qTO %˂ q8()*N6\j&Pd8K7dΒA2K4vJviLoсJNzi)z;ZM;h9+'5;:IaL:^Fo}! 䡧2UcbgVp^b@C9{~x;tg_`EtX:Q®( ڰ~k nX?Ԡ`&̿ 9*G*RuApYiFqIW8{ L.EkJ/ytkTy`ܮ[޹7̳+Bm(Fo:j U749@0c ޱt8ȳ^f.vJ#EEMo)GTǝj, e %IW`sm|0"@ljbW`KƪP")W2^wI`d5OmtT5%x A™ʗeyyʦ[2Z@*X ;. ǖe,>A -Jl (0LS).&.p<[jm}2Z~yod,%[ + Qʇ"535 ޕ{A:^F\2`B6r=%x=Z;(^Hx&luƒQGϷ0= j1F2()V-,̧uiTrbçcBeks>4xC!1D"vzb4oef&y wJu4p&&e  xj[ n]&+%W `NS.1(jAhyLE]36Z@S%:-K2Y>xl*]\;&9h74 C\[Fyx-X,ըϰD9 #KʅI 깕Ɨ]]HMEK#UN5  wbsSakOyv~PU=cQwIk[īL:Ϭr;v4a,܋K5q,JU m]t+3f 2:Z;+K0s*Ӛ?lluxG{Hڗ,pR8M9F 9KwFĊP;4x9 ObH6Vl5snɰxt3)}|9#\ˎ"+U(KU!0B>HZaC7 Ź4eUs7FkBӉZK28K0,4%Z;Hɂ@ [ӡ r0_m, U7F* ś2B|\ҥ[X `H/An`6Ŷ`B4MrMln'α* aB:[t3H!HU-3 -ݫx~LhNki.+M@Q2^WF3ݫK5*5 X-& |Š!}nu ZmS2 ,,*[ua2Z 8S鰿Q{zY;`/R,1R۶n"f2|*1)jʂ B,;MgaZlYi SJȈuxE"`de@ %2g v+(`#=J]%ҵSJXT6%fN2pJH4Dk.E{L d>`(rIP27+==a?LȨ>I]۞ qFGlh:Nm|Й_H+EaW=jaR \; ݔDqq0(p(.:ly@9̷2w\y*`ԥ%VnS=>-onv]"\<GkzJu!(]eRRߴ.VcAW礣!ll=8mA /s- MQkMNt gU=aKmg4܍@v.I:!\flLXS!pivRwK+{k"8(3AaЊuXaci)kkB6W +Л{yn]BҶ*mXSfw!nfjTRvu[PI]n1T-k=qC1!NK {_ZdGOYh{RGZ|ƅtdQ$f]D ЋJEs EUTu]x}eG"w2՚3qڥ2փGn 6]LT寗yC S/b(KtXGF[MM:ZJ]%x|ǽywncG[[oD+`34۶Jy!9Rűl:j:m"TXwϭJ WI.D4!/=e,}P:&`rqS1@jm(-+7/b-gOɾ^s XKiv0)Xܥ*[q<&INYZdCi:k}ӥ =J`:3NM=wkK:OMYB,caU`]VAXyyvVygS^Xo~j5P1kNCK-TeZy鍒Ef f'w12ȱzEϬ " ͡?U`R˗6Z[M,_lWRŰ9`['iw}TD7!sXt*r-*0H3[WS>칮I~̧]SiP >8c:kR_0Գ^AT8QC8c.ԷP@p^fbhn/Oķb.{KKa2zBIDHas2Ul+p&*S&e&!q5lF~`j -U5Z[q˨?p*j@W~8UYoey`c!ht=2s|A'Fs& ]Li~-kRP1,*+}F{0_FI~0%En55\Z7߼]9/y3p,w5RoV:ޖU&|PZ}#-5 LLI *˨v̩ \G)в=D_\0i5O R\wڅ9eNˆ+}W1 M*X3 KΔQxamj|oJ4L1D|،@eږuU ԻoANc,6￉^71+hfRQMNu^ :Ni@<~1\)HGRȮ/c͑B)lWa1 m'"`%҅I |_Αc@9'eIPy!&"JjiQ]6zD_ @La388_q6EGRhe^/֕]9&vd-.3lZ ,efG#8VVbq޸* iaE\(uu 1Kjx*wRflh[̡We1a8TL>/C>e7ق.P e/]",*<̰@^uQ@ LHHdQ(/cafUy.i S.qvc+)2]&s!,Zpؾ߹U*y̦E \c7n%Xi苁^NvWx> ωI{LI9ӽy]'aZV3l9 iK#d;ÃHJ=Jcէwv|L@xKwTo7n\`.G| TZ…hz{%H5j[9v7iP1.!R Q#V+\C‘kq]292īP_6޻тen&oTjIJjQ&˦"=&'0 f.Mİ,v: -7."[i& W z7sF8x{J!J$px=xG:2ՕC RG[v"-U{5o3_67*1[%e;E|`Y.Y2r9YY^ZtsJNby9͂:A]AK++jYCNtl=mMYcJ̶_bJ\q/Jq0MV1T{LkOn#Q@NL5+heu h4>(g we}M<} % UYM-blԼ&X`N`Ќ||CR7*@U߸9] ±0کf=R7yض[/_ش`-˩#?6UR͑/ SI+i '7GJ3gۍ3-݅=`::[u]"𕰷}=aځwLVhaj3`lBR*FV;]:ʖ s RW{I-^ u􇖶PP;T7QۅۅYٸQ@u5o*p~^ܶ5"VDB 3Q@ۃ0mUQcE$}P>rd kGqŖ<ꦯ2ATH-"vQ2mqqв+ԥXE\U_d&d5\ĦL g-&f]R,`DcF"6u!USNt5{3mfChۑsH؈ް@QnjS*823VX?BzJ'S/"*f 6h2.BvR+7 %GhS4T W0n49D +%ƃɨ}C}qBRmwE D .Cl6>AͿE=CR8]%LQ^B i@ҨҞ.LfQ:m 6'z?p d !HSc$)bAvr|NvAQ0-6xFcf9/3ݿīEWgg e,>TLJj#i0im,e1 j拯mg/shT_i\+M ~ux% ֦{Kh3۬]U:Wv-m#G4+3RETwf* J{,Km-oT Ϣ\m7YLA9 Xc"ZP2,l-* 4T 4ڒ򛝓c%MXîg+}]jEMQVKq a}ܲgIvi%EU@bdm}h(|ʔmÚH$/A0/-;<)Y>B:.*_k+&Ve@-bo*OX] J1KJ*O{1?KڸĸݧI]Dd_RP/D>`)lMP/ |]'K35Q^T_7PYfģb880}}";5^iX8 1&5_:()Wl43m_kd[E-Mb4-8KqCฦMʽ`ʴo5uEf%]q 1Y؛bn .l(>=uNY^ ;-7g4{L2K-B.0=%m5: ?tQVo!͙/y4-5e83:LI j%[nz_lʄc `ɸt\15nT>r0˲s^ Z jq*H̳8CB;f.qeӾ;V 6HKJC-Tv0R.D65 5 Gꖸ XnrK=?qgl_b|AuYp˵GZhؔmDxx6vq4&A,åQ~e븆X%Xdvӈ<yu+VU? d*H]"h1\(h66ʻ`=%M+R[w@{tj CNxk$;!MTߴi,*y R&G#Jխ^aEajY"";@h [zDNOH hEHrX1k ˻FY.ܨ)dk1,xhp?<*ps.5Xm&*Y]L6w(Ԍ+Op*;lFC.7³UKmݬ1< ˞@IJRaJ%s_!$*dȣ X|Yr [Ll&@ ?q[߸/̶~;LL.XEr9d̶Ho5SCWÚA-ڽ $.SվٙAb/}SЎ!QwNωOxJ,S.ӗ-~17R˖V [ 5kFnZFEv~-y迣a^WZBvicXݱ8?i(ȅL(Z]: -20]|˞za-#iGK2ex Sr0d' *#HC| 1{{EBo~U:u:Cl›Zá"933-Zu%MxM4YTqu"xBۙ0bIkt`La\{FzCuWGd 6 SR(#z'LRe@%&%,SQ'@mLQ;yezqԪW6B?h1E@c0ܰͪi ދ5]@4["3޺+UrY֋n dop(lrG~LLXs z4#WSMz_4q~&x23 Kjq; bRX8J,|G. :YۖjEH @7uR) X '(jfQIu+}FjwK$'̭TgcP g/P(CuѾ6wb(sRvK%-x'hRTzA'P,Nsr֞ b0ߩ @t񹁡mK_M-VG12ڄ*HI}X*ٳc$ kl,"]Vӈ؊sPnoe' Xo.6P\P/&xkz 7U^xLD77bV9 e tQ]4kn8:G}n? }h垓/~CGma^[2q?R6ŷxj–5(5W w-c)Ҵk+RVaUt 2zI] RVmn9\ȷ& ̛QmS`-!Ju~ۆ+"ĹS L/1X;2Utcяy{=Hc0<-[3{^h-OV^RCИazinANUns$ϸX( lsUqQÇ#DS3`+`JK> E\X)Esq7K-L@*Eu= Q]cfh9[›Q. ߬ %hBTԹATA$C~&ݺUKV c %7uniXwC=&#*+QEr˜u|swf ik)qswB雁)dRҚ,YZ if,j-ql[`rU{3Cf&ȭbEM?9 iQUuF B=1GniLe@|~o 3G?Yε `tt@Y<}\:!B5udԮ[&ܴ!X) `0 [  EqnE vĪ,+ Crzr\#4K[UC *Q5-CcU_o  *ߌE`T2eEa3=ƀ)81lGRπ?MLZr1S cFV5AMA1=iUl(-uJUdx@I]xۘ/t\$IB`ę5g; ubfCQɣTwA[DrD{蚍צ0ao=aqSvGU᠞4dvaAxG!0Rù5#`Y8C-]콮 Q eS!Ob(,8~%\&[ݨul 2H'w0-R.\?aMωa\8[qQe􁠵#߆[sn?Ȧ؝fNĕ ƥ @IWA4(s Kc Up^AA-y pnў2UVqœ͈Jy-Z G, [Fjr4zWY€i*d>dyR(lJe+u\Ebƅy9vV9;؆zqSkn5}'eA:G˹IeGYurG5JW4L;_%+1@x06SMNJu+B3 ouNUz[l29ĶXf"*m%fb02c 3m#~M]'bFɘ/f%KQu5\Y.\+#[8RJ7hK]t%S:A},3+ j6˖L.kOPCyP3_ 9+K՗zm _L6Fj*󐬏?uD'(h6K OXN{BYu^j·/Abx79cKNLkRՍsC>4_,@"8ǩUҮQvIȏ 2rM\N #cU S[/kcun Œ/sS8bNkn4a;XWXRܫTl(e_XJRgB :_n6f%rEi0b>!YFY jd; b$(PPeetfu[e0]&c2兙 IMUf@@fӠ,$4Uʿf rBnV³F5:igQ> ̙gԱm[\%鯽fm<=&jJ4z\WN}e3Dexi~_9+~$ʇk6%͕no@v+ų2Tn@ԮhRdKY{߼Z`ĸF O7`yBm]/єkn-);'\g`.h*Sj\gI%9smTۡf m߷he(Z:?Wгiel4P+/s-3įwLYE%znڲg Y]&E3bU۟al;t/?PbR-5[ d 88@Q`]= kA|Dp{Dޠ4>%P,3R%Hbݯ:76k-IO*̘=~D+SY)|es%9*V&'zٯyQCL9')V~%0=VeWg"6"3̶X.C! POX2A_hكvyͺMDg:r;~Ҫr4|K4xs1mVKMwj\\Nӂ}/Q[57B(7K+5SKb,aRrJufh-PA+2-fB` >Sn0ͣa ouzn[=@IopcT=-y]LB0JEZUzUJzʪ,*߄ŧQܠKq:ٌcA ┠Rip![n;B}?rߘlIѴ{BA:` <| \*XNFF,j$YnO1qm!-~l{|!vj k )RnapM0CsCIj-*_A.q]*YEXDʑGZ6*RdFC $Q̲rU`D; KEX48Z,RqzQ3b *|% 6K>ΰy_>Y %Mi@6:>UUKr//$8~\4Lk3EUEη "=wL HPFIX&OŶ0eh!Jx!q)%{E!jl\t6`)0v|ӦQ-h; `NjS_s9OL(Va p@ º@[NA-4ڪUb]8/-Iq6=zqf4` Lz"`@q2aLVv3.vw\%^%3'HṶ9WQCUv#)d K4^?A@o^0V' BF}]-OHؖ\e6!gb(l2 ^.1g⾇pq{,0+ff `S)K}[XmN/ySQlu%<1CkUV!D7?06u "K* C0^B@.T65P*_h b.)<'V#QA]O8j]i8lK+E+nW5J.$yrz& ],BFذ0a-Q˿]9ՊEh8~]0 Vp*0yl1̈RSZ.P`" oL~6_ ^HtK}r ]қT✠q'ӄv@|Dv'/Xhj|Vs~P^E/C)%eyVg21Յ'R4Z6l_57H ˅!Mwف;+r5 dئmLji@E:2hs& 3g̴piMqUiÑ bolAo v|Z[faIm/7 F]+Oi",햆}R!2S+L( 3f XCމzWybİ Z+Q|21@vEVJS0(9MŅP`Ӑz`{@3 Qnޏ֋G&BV 1uc9Z"%P9Rq1@t>V<`Iy@k>"ZBƎcSM"׷0Knn ̂ES0*SxՑ ^Z_gC}h54z>}_X2qa?RQ#mENAM,m`^X?ZRV|=01[˫5w '\Gj-6?)1@=uJfFQ51sEn]56@ ѡw"ZeU]Ե3 ߻[0+1 hsx D3Q|V뎲CM`~2<+=\ޒg8X@Ft[s(;fмJ# TێEk4]۩] 6*ax 8}Whr~=嬼zfkzkSZm&asyjF8T5cJmf p FԇP/B#BiZal uPc-5p_-}͑a\z K3@nr-=ɴu43j8 D Fs|ԧX@ 'Wb -ȥ~,X9,@Y8BHT\XmK5|. 2pʭ]>U»cX) e@a yRS0V`C$KʡK^UO-\*Fk VlZxĢ3X3Ix9\r"'sg{aKnL."̥}V x.AD.+K9{[單~@Jvޝi5ʼdTqucw5yB`KEw7HwQ}7pfo!=F%,ٝNr'l9 .=*08zMMٙ ^3*vp !ۑeX;Үz ^dhE ~LJn8`$K?qrnC3<[(wDi.̅q,bٖ\A$lɕGpШ%Kҝ6v:ʳ`q]_mKJ1ѦK4`B'b-eNzU6\D;tZ7[ju f3)s jpCvn \2b@lac Z /W0N]XLƦ h5T n[? gRpƐ u`fݸЪAa{$UO\[ i!L4Ԭ~WWיL Vj u~x4_?՗-xn/`ιK R[pd36К ]HIoG)IG1ZAb0p ܺT>󐘣OL^RW$[gC?afK[n^GQ s! sUЊjXbdab~qG"fiYf rv:PSN!=vh1˂d8پ2V,䫘{@l N$(Vq-Z%K[;ER2IKgMMI4Avx8jlw`2}+銬܃qSCr_)Hh_j k: p@*T-CߥRԘn͵ l&;-quZ)XOTż-}]/B B SU <(9n$6ɞD{=!PM+[_xAXn2B՞-}e 6jvJ90Y >Bœ_Xó%hvU3IN }.Yn\[mB9#r쵎kY;Pt"S1ͺ\Q&hpoW3[XbuȾUmʽ̥cˬ;ٙXLbB4KN|!-0 sYރKN'U\t \bquRݡEPќ6 nN^}`Lˣ0EI{%z0 ;G|k52x v= Y~%}yGZ k0J >b5 z[J~D*!FGzJJ8$l5Q=ruqWLF~^ji$+1a (~>I0յ{r O/Spurcl1MrP(-'h@W#Jcrè̤gwo[:°(Tp 4RLn<.@wAewT8ƒ) ljoFJb]՛Tj1-Y'Lˤ orNL*V Enhssm t8/ӟY@pt%nϤdᏹhFxK#e[*t Z ƣX FvMlg2Jliye|:#lxT%it*YxQ(MX`=.(13Sal.;=(q|V,\Mu8OX/Ǣ&з/\v+U)Ǽ w{xDO*J'R+P[ܧ~ƙH^c,ܥRS _i9sqg!.B|/\(TR)w^⣐1K\4Ѫ!-QMo-\`93+2~MP7a5$H@ (הȤ.mz3cUZ]j]fUFWJf*?8pGvff K@#pz1A4`o=s ºDdJꉜNpjh,ŌJG)45ω~HٯLee.-ac\TY[2g/P1dޥ]OKV c _ Bs\ӛG7 H@Em 1|_#/Lg\|لVh-bYLQ4*:Քc>n 2W4]6CaӖ(<އU]ႸEew{!`mFX(c_yZX }Fw(<$Zq0LD^FΆo7 )'+/ ?09|kϳC TrmǼ6>ғG#HZ..&Vwv넩Utnt^KPoMvp sj<HT  嘱6MuJ@Zko4 <˃٧s3Sk蔀]Vk=)CMƤ5X5`$}HpcJ5@L[\ ܎ dK.H+9G@KfNK^:@EثED6#+%ƬYL3)}_;-{8~8,];q6qW񜱀e}i Iyt&y/)i.De֙)RveB9c5ZmzA%V`^L.cG-}TvM:&cW"eRKshЧf h\v즉\ ڕhU2cATp L pIcN~*hܧ]|ʘ=-} [Vk(Va/1-bs0\_(}Iu`$+++&X0J\X\ QUlcD*]K@4ұ%}. bkW`~:)8ayo9G}e-`fe <aϘqic,\^;bX{ pbվw1ԯU1GRQY,帨`rJr j HlEٟĖb~e;q6o'FQ;EhP98\ND-ԱX>xN(cOȁ pjt`&S ˇ*Ou %Z,d.'yх/㳽mWۙ&Bը63N-/Љ6XVht Ly s̲EtQ<89j&&ұWs"Pwxe.ʀvS 1B~%D rWoQk}vJx O|q@qg ]EAϺޛr^ G 䙍e¢o#!BFNe$GRv]X˩JHj+ЦnRc*^!x@Yb][٨`&PfG[9Vrb"f^bAM]G"}c[ֿPRI~ep;/r+s1候"7i>B*jߡ^G7ziayCUک`v3 q„a݈pC-vpK`%ۡU޶ u{m??#g 4UT*oR*6Rzs% W ːV:`=jLPbmR\_c,HYA+L:%w6c !Kx KiK@l PiBĹd#wLqс XmRؙ~)iCҎ(>?P>mZɻOu1EXSpiuI'bD׸1SCaYʠk < %Yg^F]~T(+m,- eO EVE SgY_wJgY&wWQyZ`&cߛl$sRoૡFbުV&+d1M>VXL U,QF\= _Li5 \ dY^&CtarD,X6y&q~\01 RqlE01toEy/+GGOrg!J".%;{˛>BUqg.8CTF@Ea-ɾrlci%1@Fsz;@K yhR0E˭҉pR/y zg,R"ReNɓΥ1 dǴBfYw6>^Фb#dK+U( w ֙UYK?=ӻφV"F+֠3j"-~fjv@f0eju XDۄ>|%6SX;L Q is3ģDa~be{'f̄^iiSjcPYDc-;J7:L^MLA(}ّAS_2.F؆+Gi Qz%ym@+SxU!EWZx(K\*ۏpOP\3ە)Hpz>U(8=Pg DBm{GrU7dB`G~Ԥpcه/*DA0gfag̭a[SoS> t/`ӯx+ȶ+^ DAbTsa0 A4@#1Nu&;a"B zXb9{'n-xS>` 6PJV;H #m%%pG׉uh-~>`JeNKnâUasZ ӮY>g .淾 %r$OlG ɗhT.Ͳ=AʡCb0kUٖiK p0.rCۢ}a˭csm,cxTf ^E~J#}*ECaAY/u3Lq_ipE1钜=gSATz(EW$2[5[R(wjL@"W,JI1Vĭ{fNbnheaMYV$\ vtcH7Fa=%% Ķ5WKX8`6B盆*!Oi@3`hejPWN)3΢Z+eW%*$=zCD2G@=3r im}E3ԺEI U^ hEK^#H q0OxH!u&KգZ-Y9,~m327]E;>".0vXo6C?i ȵEiB'JeȋAcY8!E-2XZ-%(3r"wqj2y(&7M6N1+ 0c oWrO*1a۴B wҘ(Գ!Elۼ HI~:ïMWjW濨EJvژi9mk9y" 8K~[lCf`q-^n4 ]M:ǨK 742ge.n*:ɕ)Jd VP^97zG18U+# rn[iu(e(hTdf sr~Lr[Ua6ye#k4QR(Ug=!9 p1E 6֧[rHYhQKںĿt 'V:d ۳B+uZ]冷 mi¦{_\Q:/WAUEH_iat(}`42f+To#Ggͣw#^Gxjm8JKrKC(ýW+.r] s';X"W]ũ8MR(^N*FPo(-ޠO33&S_Y+jR.^\ h!PS9ɯicGQ]ҟhrLvE%cijQ3h*jJ<)T^R@,룜/8ȶl̡ *^7130ЪS5uF$l9ew(J-0ۚ6;X4mb ԀpbOAP²2ѩ%? lKWLaԑmd]]Vˣ<KNLn_A㬨Ʋw96Զ{J?Q=l3ZYKL*\JXHA:m]ǀTVMp%VP^{ y n%-'8[JS*{]S,bAAMs1ˋ-2q, X˴b4AhHe pyE)UȫMf#E&ͻ=ᦨJie.1/2{!W b'S(5*68jۨ[$p{ Q^sFa hDZs2D?U2(#f5{Z\ 3%n+|Bpu(Bvg ydf8aP5:1EZh0yaW R[X]NJ۝E5F2Y}[l)l|r. \zFt1` XSݫQ%'K!0̥vʢ~o WHF0 ʦa̶N^;bd8Ύ Pؿ3H%mAr Ʃ{Gavg)Mb`)Bڃh mVu [/*` #uwк*'Q[*jHm 13ߔ¸{UVE -X)]g:s\EF{N0C4)`kשXo)Al}PŠ6+Ӧla wUcX/!6 A[*d A|j,Fye[ab!!B;.:{D\Pu9{\Kʮ2M)YݾfC)_K,Ei)pp_́鴟RV=Hv(**/I_83jb6pg|ӔOq(:itR^r@`>R ̱MgIԱ,I`OKe 3#l zs_E1` bq4Dġ.9*¥L-&%ȶ~rXIY8 #NFanj<"/1 փIpf o Mb]⡌%="avST`bFy]!IB*u|nns `6Jd> Pލ^/Ri[h )eݱUE,>Uc*:K)v)U1es)#ĎL.e FhP|GK |TTt2f}DR〘Τ/rm7h:[)͑p$Q-Q5,կ k 6VH"  fGjr.jP#B0-@mCY0-U;7&?n0X;L@¿3arI(g%}!3QS/' "Z,͙pV/YLZ]llA=ZAQ m1@EYvゝD, 4qh z@T[_HLE p/* Ь%b,g14_)ytd|Su-EƁZ!1Rrl~%B)3i`+!dG6ArңdYDzIu VHǘ6Bf8$=/AXtK"F@4YuC7faV 0R:k\[>sEKj^`&jmʺS[ ]lj֊Y p#2Uy+x^R{[5SBW!RniOy9&<«94G8fDžʲٜW2࿔tb'^CmhU4AhlJ+݅}b$;Wp}K+5E/lL@tXiv-'^ؕyQЁʭڋʕC-֬\pmnĵ1V2nD&-,ZJ0| kd|P:"U[΍X\#7rNFǚ0h0zp5]X8-+*?$ 5Â78gp]Ӥ#lh; 3)`jȋ8A=b<7QK ot 䨜W*XUlxYt]L[7댽,F/_ +8߿'Z% /Y1\]:}Cڝ z~cY1Cn/g_Y=f9@T8h@G1 QxqMEc @OQ KhdZƚ- L\F5LCD,eg(e^@ ?{t9W*eL3LLAP.4+oj)p}hE,qM,,NJ ]bmk{Pt j_єͤ'*+5n\:Zo;T,XZɹf߂*3/aq@[{s%C#7߮\$9meTl,PXD屈ģm+c6㫂Y Bv?H6b`Iķܽ]dt#eE0 RNR(Y]L.MM冩qUUTُߤ2Y8!C<7gP{E㣑^+?"bÞнJNu(Yjy%VG+s %ۤ*ʹUX6W2.v  燼b0͢&:e`+hrf!HnpL 9͎#K|fKE|eZh\C~;- բ<5S6hR+WZd'+%0-q4\˘ .ΓJ֣1B` 7_(off2w>`A9@ `,C{peN{pyܞp_; Fs0dq*=)l.x[$橅]̦,ɱiC*ݣ QҾ"%UCT:Ѐ1]aaN-$x_*WsCyLKޮ.[͕%aoT)A41(,ACk0Gә2a1E9 nkr,El°.kr, tq9%X`!(R6\̼)Ew 9Ū`39)}J/*(-. a9a{߉xj`U2މ9`2i bDQJ.$~ez F=Ĵ%[KI@1 Xr[K(6:_SN}&Gv6e7;tBv q 8LP-0-ՆD~ `UUYE\6NJ3~D+bS.UZ j_YG৴r'+.b *B[ CeQ @ˠ%!"楸9DVU {\rqb:f6R[p`}$dg,JIR( fvg 4i{ZM*0AZ{rHtŰ{ӭS5xsj̈(⿉3D XwX]5Oh‰b,Ve3Ae~bnT1AF%ٖ-~Ç^ (@Zਤ6@>h&_ܥH[~"N&An`Wq Q#T)J zV혵P[c s D_פ19W_x *S1 5aMSJP5E?w7fӚdjS>/* E50 PJw8 z!6μu,ߠKty1R1GLU <5g4wsFX}%\$Ub(Xs (1~+U$Rw;*7T *ՠ;xPY^ISm6yU*TlPR ػ#TLϴu}Ы3<%x|zFri aj;:T6U htqz¢ŖfX86@AБ5ɣ\62/]DrJZK{ B3*^b5Mʊj0N`rAA/y}`yʾ[e{TڮGq@.a$VQ3ڂ0(b,WwƼK Ww[FfE0.XpJ FFDwYo'da12h*Cv|2r˴r)oa0`wBm wPtFɄX-4 MlC/hTy3bܽ,@:10?-e\a[Ay]Y ?)׊8(m+mau\b+ K=am`}QBuovbO@oLTy:Q. ?2'wtvLρQDS}1\^=҅J\B` `hE!?UfVF<ާ-WGa;+]`%λՋnaYC_( K(T!" K[|R87@ (堯K[ th/قBqI{1bYӗl``dtdyNZ,"Hl*S@T& %4U}zjPu.[An]*fՍkqoYګ׼76߈*n ~\8ykO2"=1Pˈhr#Wrt,7D(Rutna%Z=28M"r$.Իp] Od0R6_ae"YsBodߘVe~y?Q08i=}Cbٷ\!XQVkaV n :=J=.fY}oE¦4>)BϤef0LvCwEzR]%2অ25ܲ3u1[mu2Q$d+;nF1 c!J1UeD}eZЅe{K9ȍ*.ͬIzS`╙*,N61*1͔C NVEcYeVլ1[Tm𩒐aLb{SX-T2\2vD[(Ifg1&FYV&XVZK\sG+p"ļXI6(J |N ^jy]dV{rRv[eE A[P;iJ.}&tVV+A^v˻ih8g&҉ WUcR;n$4MC .}fiJYg/yYʰ`0et`a`nVl$2G e7Yf-\Kl ~" qEX@i}6e՛V׈zϻd6-5[x"dm_/X ~uD*a.x<thb-ө ,7|N l0io213." v!`\2k=I1K%vg htٷE-;f xh CYcMڬE^+`ʴ8M@ K2LB6@ov)bY}b#Z K];6hr3W5ty?p0Nl=0, p,.Ug9o*-SU3aI[L/o JK21Ö 0Lm0v']gco%eTg}Pɖ03fH8v'P\JKrMξmwJ9$71ī#,\E*P;6τ:9[ܳk{!)y։П*f'-\0Mx(𛴦UAWiu ;TVi;؁,W,_d3е#d6M j󂯊Ҍ=69y}.ntJEOYtXoϼsVԲ^v1.WF.{zJi?oZ1A1Xz:PѡW1*T@%NhҗbZz Lx̳kNpA#_[xu,l*^V.dЫuh!Ox]2 ƣjї"uA hbv+WP|ʦ(_ k SD^o%oYA29`V!esVde;gsU>Jl*Ltm`j,]&eR˜vlNә>Ă(FT?w^5Y~nu&%g{ T9Ķ2wlteJϢQ@#sk -> % ۴XrT]T-H6RܻGN]Q7Fbn0ȷxw]dڤ_AC5#E/p( n*0u 5 !+FA⍑2DEBغvXbyt&q ޤ" rhjzKLV + ѨXNA8/` QV"3듧G0cZ3ktG41aK,RWg<$X<&ZZdC̮׉gA#01ox9MīXø[`3wمDp͜;XN^ +"3:`CE v';˪kp {JBeE. ?'H6A *&8e [YAmѾX= zXPֵ`AB`JLt3ڪ}:A3XbIcJV91kxxytwL#yn(ٜB :jv!@qh9գ`2+z,ozQRTI+P)_6)]h 80\t;,q< QWpR~#Y[Wiٱת2T6.1;jpyB_p,oOZ_DRQWC)M\FT'5B`{/sOXOc ϠCVo2bJ)F NubRp"tfNg. B7v6OX8!@: lź jW9 Ix`ZΦ`HNN4`iUr 8}NNLa06@R M ꆻ@i9d8p}d] 9?$x͕2l?Q/SɅw99(M ^.)Un *R ^ǤL0 ' }[t!l&^ $1%Ye zYQ+VLqc:540oFX@l)\pAҧPsE5S!ۿEc%cղUZvت%-k ;a|4 =sɲcrթ]=clfTʅCq4ؖhw]\rk&B ~ׁ8K? e& CسSr&0—Z]s %H.אhN>cU ̦Ɔ V&"w F!t\-,I8y˄EUa⠴ ߠꓟoYXR7P[w.lbzr’ڳ^Ҁo`U(DECgL|uqG5p( M02 P>2 #3*DuԜLZ [b&U_s)Aq[gLktFpnw a5UًHu:ԮҘiܭ;n DV dy.7CsL߼k #<"(q*q Vܴk+`MAƞ(6ޭhÚĹR/DsKUcŊoV̕D00Ռ ؋aZhWm@0X8q-e*1Eu*AϷmkakF[ g+[os2,^!jk^֩X /LGMmKl oeJ}Ԉ7faJ\JLIܿK.Aĵ |*vщCB5&>hG Ly*L礱@*Ʋ͠qC0m`C+)!69^T/{N]x+uC9ȢU!uZFebNjRJN ˧oXJ7UQBP5}1W%˖-.[ NC(af[ZvP+ہwVw:gE %yj МRӸTz+ 捾;,`b+Dcz}/ħ{^mB+IYT3K,`Gő(^\yF1>U')G+ˎ +ꂣauQ<.e\DPjܤQ;Q42k [ezFūd~.ck&+!h۠\oT%gnC K]yKXvƧmDϴ였B)8ߩ\"s=O_zE8ZMVGCb%myHP<Ԣj5x]xq/h UrІ]T͆ɛŔ }|v.h+`kxCP{KpsGB;Eę DVO ز@Ik"X95vIB^ &K1:UhϘ09̔O'b^mb[)rYGehk"=rY\R@D_ (:'ҚR,EV񫙽2oISi$X]!1qܩ> c dͷ\z@ \ D,7ZnZ9ȭ~cHfP ]M `$qɋWs{Ň1_ݩnRdG^5euB9N2 P/U =638ۣXn8c̵9@^*,P&ȁan 2eګ09[AP )bJZa,qUK\S~ HwQjn7sbFf k5sa\ws:!w* 9Į _0`bylĩQ4W ʋqj#!}@&%DũWɎ $hi4(2+_ok^JQƢ&^< Ktqn?Lޑ5v`yT 7Jo Si ݜ},8+X2@UbA 1-Kk0V K R+)gaV,QX*)ŭ4Pg" &Pr[-1 l7.1C{FiUWY]3Ek/J.{KAfA5V4K҅Jjl0!\zg^ĦJ-3iDB BD4F_Lah^QcߝKZP+5qѻ{Da02*C"E+*gQ9 И:h; ֻ@O~եXuv%q{H1[00qGHbt 2 /YibcsD欣TOqT-r\ÝT̶,EN-T-Lf/ʺA4s,Ǣ혲{c2 mc]= 9T1Zg8Z.5]/ }q ׄuEV:DLJb§+S^AmՋ̱M_nϪ@&TSj%M\o1S]1sUAɅݨE-=bҶ[5]ᙎʓrfGDɷqk. !NM1gX:Z @{j+D|.J^4\z!ѫ7(*gj0sey&At!ݛ$30xN1ͷMu"\^d~N *Rsw(n3!%+U-r1ej=*#s1Xv hܰwZaM0=b/RM:Lפ-p .I"֍FDexH\tuZn;Vy@PVSoU)Pu1!^B}^C'dNIw:i@i:5թ]L\JXq76+s(X[B^4Ɏ*Z#Sم 0&=`"@6WyVg@3 MHe7RB$~cUQZdv-9QX pr b}fİJuST .:`|ؼa}i_8k0SK5jq$P x R$x_&ذ*P[g;OPekȤ^G4#s-ݼf+lWy,騉 T&)dJ0jUb,lਉl8<voeF9#3-RŨD42@ͫ0~;z@ڠos`DHͬb4xlP6:`AMCܲەW_B۵ i`o"iK׎e0*% %k:ZmsQ2D)PJJ:2*±Y(W[K&_aqbO@T. c?r.`FA+PYKi*k‡'4%Xt¢k2Spsib@ V )B`GG5I-kЈ*,MHf{"F4Jr0T3ĜxF宆 r%% in\%qqHeE{V!(X#e7یbLb 4eײ'T\$ {L_Fԩ5#`v>feװm =u,Ue,8@fh͍ oU+ &XU +?"-U(p7KSbN}q(f UEtK0V']A/ v;FxYa7굊Ks.NBqFze (A(@]P-dC,YnE@ҿhPuSJxcQȧ/ zDd)({"CIJzIs.%!09'9OĢbQVĽiqV>lU5ee&U*՞f&Wt}gXi(y_˷`ٍ``67IIkl^\sERu9򲛞R("܌3-vyP_蠰fЊ,]j81ܼN~NoLL9/J ^f vp^\1Qݶ}Tqژg LSq*SZvʎH[슠 =bh;2?^#E;cSb^C 10SL]R4Բ" [>en>EVFk:A+ rs!k$[,iuLHSG^[|%UU04RyG[k ٬1Nغf(,}<LWl9s2q(`U b~el3҆V&j9SJaeww2nEdd!*/86!Wr*-uk}MݍSm@~J)8> l9Wƌ7K9F1I73ٱ FXzk=62 b,~Z[r iwdaL Dj trqoi^^<>h,Ck 裂mh1lC?$95:O&.hqF^k,6̵nL7̠0A+[-c7INs43XK0@*5yݗgY@rmqsJ,/221poU 0+Wlou A@x՝gi&]r {*Kt;_I_G@.|p-CZTeHn:aeL6!{d^Hm§%T̩%2VznZu($ 褳n3#M𩊼2=MxkXdU5 "ꟙ]ՖG-UDM1m92p LCFt!V^sxvchL&)sCR.VpYP fh%D#&LQ8rr B5>qQdqd9:{{DA.>qVwpaHi (u`c[-C~-0+71MCs7>Ԛj$X @"X{wls~DJ\Np&[[w,`6:r 駯P֦\qPk`L[Go;y&gʻ؛{\t6_hyG~RT+l[ ^7! A#NǙ(%@f<97qf&uQ^] 6UkNm1o20 Y)DaJ A'%Z&0M!-Ey(b[ʥ2coIM5 y[guEuY{ M1Fe8)= &|A;wb\5Wk\% ]J[}b`w.ig"TeJyT0hT)QY`#LlF5VjTX4:S‘fjT]5 * La*(R#2تR*!< *b>S5B^NepΗ7.g1 1K鉢zXqzbpz~n\q;,H j0Ny8]B;`I_rx l09 /_ Zv,l[.F1,U+ &[. ZŶn%Θu0B@nq ͨAHOVc   sh,T% h /&n+Ny $[;ZdBj-T`J5->嗼P3HKN8EE`vNE{tbxXݎ\1 ^=p U½ pYZv[[X%/lD.c .ÓHR/Pץ$ceM[@ˊ!VFxA ĔЮYӆ zjg rΈa"3kFe6]=L,I5W;(HNϤ1۩QUfиAm_[WjlZ(783*ns}x'/Fӫ-f.@h^LUalfz xV&*M=%`N4R2"\=e53jMJ4:7 c0jYbM=@KԻ.4:ӓ~gƓ`V\qൟF\^%"ffO` /ȷ} 7`!S]>7 u Z6)#Y(YOct:](T)4Ru?0;6wk dd|,~DW5 -D;l-AFn?CAl:'B`7pNZreCVD `Zs[€ŅQÉ]g^͈XiÑ \MjVz2a-ZWaMQ8<}֧YnC$k'N_TWBr*{D} fipv]u,9[7Q# =‘I2ӨmWvpx!`ckM@!Ⴌ I  u%@+R_LP.ZС-3.H()!exھSPNiPP mxL Tunda#(IhJ4#7+2;H8%Ht0{hf -и-y1mBN`"zj{3 j&Vd6JZ.~Q) ՜J7ul5м]&]3%[7\j9/-e` Wx;.2`+?ǻ: v\h[{F]Ll0ZSCYcm*1'Q`Jlpx&vƠhTub=1 % .(J z&wf5D 'XS6!.@t1M2!*`Rnf+ ML꫗ wB[SrdTVQ:1bs2w=|4%8gыX 6 3SG~+-j顦Ӹ xd-EnX<%faԉT,Q&dif͉_7)nS$:b2 迄.v~eF鯜lWS@yϬӈɸI[{*PLZ1Tef:i>ߜap䨱. )jp:9܌Q@s@z!XSZX!RGK:W/\8)^ Pפګ yl$AL!(̷"G1Wb>V1MN`cWeЬ$eq[<#Ok!,P~ES*倈=̓@Vˎ *'<2ʨhEYA랝e]pShh:|K)rWH HN (9(eCRE/L V)J 6"_yIkɝ\S~rRׯWt6XXFB'AC/ܫng9kĵ4~KՐv@,B q$WN45[gލ7bP*M,B+O2^j/CRgйrU.ήUQJyc3#o:ʪXzGP7[{B88&J sCh5Qt`EdP ^X.EvXmo_2GT.puj^e[/6ņ n Q)_b1c>"`KUKܠ"zMl,PY8 vyK)QKTt#IeXb*JǼL#]2iOq.ت3{X!iHbҴe  ` #W7`?T9}b=km|." 5q2!i@e)R3ZM/l70HOq3)~V$ټیw$(h8`1ˊW|bKRF3*jQ˓dz{Lj-K0`"b=nkzT/ XE2[2E{qLV:Li G5>T WGf`'=8*6xv3>^.t ,ݚVbp{Ȫ*uږ+ W KLA#R&WB4#U/5QXJӡJ>a $n9cf[H,ƍqh h-Gy֥H`j)ŊZ[03%iR +0EgeTҞYz,DVH"m!Q:dlȆ()vמ!B~;".'*/.zHn|iSEF9bFTEkdx`0Qi`?^M{bu8[&Fe9fcig saXNf 0kjub RrpBU`k ״q9Ct?0 DYMʎN,ZXl\uBY5 ԜzON}̬Ξ>m<ͅ7{ 䗎G%Y).2ϼYZ,w+'I`;`9&UIL٠ͳTUq҆7Fڟ3f5 `Ik- ǔmMGROdU@deBΪ塚4.feGH鈭SK ]˅&@nK-<0Iqȿ2i[o5ʝ,ݾT5KBΣ 0@wxX֕mԩ92 sM<,jjPɜo9q^5bCGX, ~d`]9rbȪO&Wwckhյ$jhnC,J"AƘXacwz1[&gp-ȚKؗKBhR̈́[Q/oMk3;B5P`Txk"!HbɰPB`zEB@鎥d[9m{80fN9J9!RgԵ}ˆ8`? ;q:} h3Vpޛ;#.ᎅRD QZcO2eƃ/+|S =XK9eM ?jPj8 VުU"s5]_b_D _ EovbKڹW]W%Rٺ>`Տq4Vi ,,YXx>VL%XS5@$W^ ҟ],RլB9 fks1*VBe$] tخ '\_WhvvZ%|nAj+Ee#U2;b2̦I%3RQG_z]_ЎQ3ODxT&:f$UV`>bFqclXWE Zƌ?Ys.ںڛ?e3Ӓ-c"h&vb,`QZ`7%gB3UYɞa _07Ar^52\ Jb}fJ*,jE8Z JW@̓p=J| `2z5{bD]ek&:ke 54Ypl&MG&h"`f M)AF, hdksP]u*@*g1 dP)^ u)\Ϡޚ@y[g;ev Īu^=@56f.65ʄitHڗ*$F:0Ĵ̩ɚ-}B 2bm`;5K)\@xu.j4,jtAtw4(~P…^f7V-B:L/+=G4m]MUjTpcWEV0SKA i11uU fytƥ:e k/2a,޹cַ,=mC ƋȐ\2rh[\Y2S8e, Klw@3U`h4o+ˆ_x[N%#fGb#ڢQHEHi`{#@RԵd!3Je1W?7tsRyZ +<$x[yVvҼ (-V}eyeL8ى3X zb+[>MCLΦf^fPo_u:xZRlXe0t@ ?jt$U"ӯ: =vgTbĸ pEg-&zc&gQeĪUKxw,e; >GѶHXXb\Xi g7/7fp(2j3FnJ=̴fw*%&FL7 +KBLؙk[/m[\zw%jUXmCaV5j 0 _^-:pxmۊXjU|kJ:+!Iw@x֖a^)L9eQUl ,%O.0C*\8H@[_=z %!#9fs<HPe.,\]9e߈v첔V( _^gaVZ-eJA)E [*>!,qMq3JTc`6mF L|E@5')-W{L*%ZRu}L u7NܰfwZ*7$c yVy@U >0Լ%7Rӥm}'~:LB>%TQ0a 2 FjS IFz[n)L;Wj-`]btp a:ߜbb'pS~0-`t!t[nP4DKc1N\5{0BEg}4/) 8.V}mp-]'J ӟH֥3j8[)|I 0Q/MFmD0@^#Nwv 68]fQJpnXcW]p틃E(8DEq :Qqj qi3F:st x%,%S{cz$poZ|< .Mb_9jiSTVTSBԤpFL4(َ͐4V^;M`-NY @NaM P(sszb ҕC.(p "Su!@pu4{`CdAxn(.0M-ϩi2^:P9Vzac ΕRZ0(v9sL Vǧ1C`%1[/оf)DW1zbL8t7~% /AtVʫȍA#0WBl\i͉0V僳 )l#MYwBۈi=1B" Z`0ȼߴ Xx̏XwbpѨ[ İnI* XSZddc5-)bX;Fn#b\ ^E dQ՜XZ0 ELfiXu|ƀUr-H/h.2Q%xD嗷@o}!C)WC ;W(4P"-ۉsтfFgy4q+ XFzhJM7)ݨV-&0#$:`0i \[|!Rg{X٘ `IRٰ㝡U/&`eݓeطpQe9"ݐMX ع- ;IeXZ{E -Kof)| y[ޅ.-"l4҄>e-Kណ#0-%+06g8+C!KeF(5DlI4RYOA+bsߴM4F5 Ȯ"r+2@62y!K\XDpt.5xD8eJO h#3M'ML!&M+&I+` 5TrT>ۂ қ + u@q‘,dp@_C0@΃ WSo*QpDʋ,H eņQ"z@A- hkEGl]-@ࠃ1,@KbJ[̥`i'L;lhoXyv.چ؞U$l0V;ffJ¶|\> VjXF >Q*GFMrq| e:Hv˫`PKNTG2  ͩǠ@߲dS~=cE)Q6Hulw(g\pg/PzV4f39EΗugN/o.fth/n.A /aruvlCߴ or GTטTceo{ m WNhO4`)9&Q: ‚QfLsa4M٨ P[&w*5qc;[N7\V$]8YPfF艶ArE\,H61xNGqb֬pWO0D Iv:E8Sf(QԋC!);KMED&iv^ JoەBzDBycOInxlF5;;8?4|2JJ1 7. Y 6!Mh=oB|&BJc,3i4Y,n\Q72>h_2BxBl¾FKESXv-(COz̚tV艗ZDD¢b}`WS)v~Fc7)U@rUSR.۟Hx^"ֳqb]F_Ѯ2mfPaV4 fPn$ÑNpUZ8F--L^ngfh9Գ+AOM1S)FH4wÌeK6En_+ ˼7 GoSm&Q3 -pI5*UoPE]咾giU#0F̓O/6㉠X-z%k3k/)*mhyp R#e=̝eJ_ۇp8yDopP.ݻBŅz(vT3e4ulUZ.b~›n=:j/EqY]V5yWk,zeD )%֭oMQښhguenFa(Ibq^r n/VЗh4/P2sB;;uS21J¨_Xܱ+ E7qpn/lh ~31"R2?2߬E-͗Jբ@vdZokb Afn(.[mQr8"NDǬفnm`(Wqf9=!̡Qś"}Qv[ :ÐCغ mR!WAX B:o[`XrY-EYEQykGY!=x8#@X':n+eb+ڈ*\,)m5hN"J T$6YOU7߼fY],7ck3ԶЅĤ?H+ D󁽇ha6(e!,zF TQ2rfŭ-7˜2T2JcE ;lBMj V>fPlE5ԺU#Xm_cV X^P|K06Qꃖ Ct KlzF1mjj)"[.:ꉆߔP2Mf&7IEXk|XzCJi 22s/1Y38,)`tz b)]Mpc)rmW]Уn% |@RJLڭQpR-WޚŷMiV߿E+IxnPxC,4j, ƪoL.,k}}x Қ =W@ VN}`ͱfL &"Й;dʷoV)TQ8i(<Hm']LNڠB:[[Qm)o"V>̭&J ȼY}!K*ua0ںy5Xn:0% pտR`sQMb!B_]E,Q‹y'`]R#7fY)5yYr6.lp:X!`ؽvvKj䨜:dt\DeewϿSSH=K_eX_ħx .c6=xaOBf!M`4k *gE'[ : %о*&TX(eEx_/*iǖwcF62Mk2jZh8q$.x!Zg}sjĎ~ V$*]."̓yYIEMKt@DW.nN|RcER cPT91;=%,ՂbJu3!j(jkrK12YT_y4$x9kVg LEKufAdP.`ZN6 Q`L|k,)N,QJ]ݩ!GUcca8prҲz]X95(K@/h 5ޣzK"J BƓ/yYRL/#d޴8 ?1.:cрn *˽AC_*%;]wű 9)^f@ Ġ.R˷˛o8AAȆ[*@Q֔E 1mj. 7IT+@0 -d6d!}j"D0\`{׼FfC!Mw +iY  NULJ$])1q*H*(lm>!):qCN7wƆW8%(tN3KO q Rv -Td |@fɪ R}N 5N೩UɇI1X^T_h_BuacrҪteyp[Uȗd9g-v" 6i._ ɕ`M,5BWB/X.a ߈}Rn0Z"Lд=:O@Rew 괝6"s"Vf ˘PZՑ/P]2 )ce.2_2T-Zf5a-^E1/~ԍ.haw=ÈjlNpd6vgaQv.eTT Oizqdf '"Dr4)F@]4ɫBۮ*hRķA(T(#ءU3)>]`JQCGdmcl#GS`‹GT+/|@\I˴ AjIwZMX֜vAnt ݝ^R=rZ?^8tk%0/[B_vnVz&__nQGA)Ի;Jœgv#{Q,2% [&F:b8hP9(Ըy4 ́A6Dg <^9Jd>ۋ 6Yɸ:WIeW˱v)BL,}3iՌپeLEvB#;Ug|K"˖eZMg(Du%:嚠^z) DW9BZ_WoLiwbiJߢ*"'/޲F_(A[)DZ\۾;"7aє5CDsrOfܲTsL",CKD(΢HAcNcsKB9F w0Fp6}b+},e 0h1t\E ˊZإ|F sV8E fW/`f[w^fW+c^q,੦~o3P:TdU*88]"0d24k Ê,('".)N\,/%e\_uUL ̞fojooHm\1XޜG 67cmYQHVL*9RPk^ϣRs%LmS e5HZB sBd4mnE$ [-pqURb:njCX~c^6zL Qof7*zw^6XU] =9}2[WF е9lT$e#x\Z`.6%UHR *p*Sō@!Y\ns 3BEv4xK f(:5|Alz!(W(5SK\VwpV]Ub\K+J5 #saӺpxecAferg;ؖW i}G®%f0KWm-Ye\9F*( ޛ 4i }dVEj\<2/%VьIW_ 6XZbYjIai qW R]\pRh2`A730'2n>]9JT p{͈MZKOX 2VP^Qaj(ʡ`/G8AAקvĊP!L`e_J^*qoj|JuER6QҰ VJ72#*3R%$]ҫ+0J_p}ebd{y[Sk<"& 0/_șp 50'>V6Vrʙn+(N-jC%ϴKRqp7eq|L0\Z⩃b6/\ǡeM,QCQ1M`֚0܌-N 6p]ٜ%>N m`*u.mB9ȷP]EZ[]UJbSDK',h]n=~%3P8:!wyw̹W QapJ-eVxu^\ZZ`J,tP2Aic \y"}(&{A#E`g (Cd34UŮ\}(Lo .u2Y(k8Lr[b7:TeF/mR_Dl_ ],c[y0au{Gl ;S:a X-0raV2=ҋ31**pDO20|B !eh)a}chb>˕^!ka׼D*(]QE5k5ĥpEHS:0Zc4/RKAXzc8^;ͤ_Ua3SDXnғy*#2"L{@#JTCNh%eӃouR`aj^J* Ae=Of@&LVr~Rk1^l9!i"qHE FA6c hQ7>bSnL]+@:_X(Klŋ±I1bv;z <11B%Qi` 1\_RZ EWucQi" :+a!NP _d[-y~C.[q\ָBUG ]7]bL2@aC2X( )-8вGʊE^FA4ncr>G0uT)ۍ.E^5QPbvJ,Ev8iO#+ 5 P-T䅮TvLHuU[l*7dPl@E/ Zj` \7.T,[;Ma!jv:)>#- ph,ܘ_`jW܈;Jvr,NQ PwSPK w +sTE f Nlbl FvTsAȷ~%.˖uV98`K-Ha!W29F9aդ5R\2[*-*v\(֧VtT]ޓKRc[v{coKvY fY$%%}LG2b̵k[3'$i`MpKJ`eҭR93_+v?fb6hvϬ߬24KZ~L&u| iXH(]mw*uޒaUEB%m>%:\6gRM/ 4 );u@ۮ˾&P0fuF+Fr6MJ. z}}Ԥ0[ΖvapS ptVduRY[]Y5Û>eӪn94rySK*ᆫ`z Ir5ZA4;@NOnR )Co-FuvP,}~mϋ]Q|3{e@nahc'Mc쩔½CPejvr|bB%!^F4Z64pqba NRL7,6 nJ}0=v v 9IoH. 21^=!KįU zt@R5-eX Vh:t=mD.RE6-/, 4&%+:@E5B9jU&MInp==f@Y tSlk&؍TgDm[ZYG,߈'hH]=lՈTihB  PAa6Yxfn6qCƶ iGH1 U,<"2`y,9ԾҤ@U,ؼCL}.-\LپJcM'*ah\6]_>%b w17^0YxzgU?@xU} i8_Ɏ ~Qbpi~ @`aEMǝ1(l!vXi%\ #! .M kTjʶMmlU ʢ3#M K 5 @-Q9˽W{%sHKd<ȯlPebq/)<3 N0iAǝDas)p>f(W6BP[ܜJB̫Q{rnN!J'RkR*yE)vg}6X:& zƶTEQJ1˄imJ&UNUCwȖXUF)biYwx[d?#Ln&vԠ3툈PI pq-[V`v@N]%rg(T3It*JtS\9Lw^]aPLS##FugR{If]w^H4.b qo(2C.P '()gNMc03c)[XA ƘfI$1&Ǎ\6c bG_ي xB9Ar&+ȻZd1ۺ9?r>bXP|PỲt4^@ljm/왷y0]yL0uY]aV=Yl*HRנ)-U ;_ZG4䆸m,ˡLؐSxso\[g&Qp)$J1 }s6RK\y׌&~b-SUa迃T Vjbex%|Oe[!3$,|aj}ip %HАlsaz vjNaWI Bè{̮L8*x DiЦ*Gc0*W"^cO1p iABӠS=h"U|}7//%̷VwWb6AITU-¡6֚6/(?8Uả>kv9h\ .Dî+J!Ğ4=|b \ 1-#.bs)<~|WdLʴRYZ^Amnn-YYֳJ۔+{* Wb9,˨+03CHM~p<C/SSE>C3"oy~sO.K)d;Twn!֩XQA`vIz n2XB /ĩ[ 0Z*c1ƚe5dI ;F,5IR׀Clb(n`D(u!&(]o ]f7*[Y+;̕%Զ())6s tΎF49eAm%By*gJhs0BQ2Ԛrpg`"Q^%RPYPn V.@ g($DZo >"wxP0ԫ}!}ah!iG) U2_jf`Z@vxɧN-,+IGl'oH),KV1*J>"▞LtW`\ *œG  /3D.Ë\IO"$Y@f`@Yܹ!K֠컆E6{ZK^]KO e4I*JYNMEG1!agi)[5DrnY6.NeZ/ E;nJZV)u*cƷ**V [5  DߌM,'M) XJot J9dѱUt34XW+[ydڅQ`Ew@iGgN1D%X1pϤ¥^ze!?HؖoRtJ)M=`}~;KrG 'ʨuSh r?E˂u'TC,.y:YiJɘ; e"0Rم,Pϻa0uCDN[_}*ɗYuo1J,KY)3@cZky)-*9UΠPgneڰ/Sw;LX[5<(VW]ήaE\V,vzFp(>X'r(hzJms1)Ko7_WW3L5!iǼj#U [@K9&SBP=Q cU ԰RiL-E]vU}([*XjT PQF%d6xe=B3#Hw.~7 1,(Db`4[e-*N%'X^Cx8bmb"1s",;Z҃P&`s+}70,j+A͏ԠV^ogUkbӆ2" )cG8:j1ۮeTB˕]oǴ^j`|vI|}1*6i%w#%m~fA0@hzeN:E7Ed x|Q[ u~f\u㴀ȔӼ/:R;Lbe\* {?}e⸩,3dpɄ CKfVe`Y1 cXWc[ ( h<=M" ֍LUBҤ]E,,.A=5`ZC)t8QV<@Azr 4&Iq m-ʰ5{GsSy('yGБ8./A(U)G:XrHPC%&Z 1C:900J,p="T::š Y`@G |S AQRۙ趻S}"TO@!Jd/1UQRD߲ kCEWdC B6QpۄUȋ:Q0{f%AVpi  @Rh 0Bo!`ok7{%^<.}zl=dLKkC;Qn|(֍Wt@-.grfi4 ]bn_|ƶIPV3\LՖǶpZ meFEU6X/bu2=Ž4(ЎFU%]a|DN;eks&B2e bvAahV} lP͆J!썶3OcJ  WKc%Z:C r-(~%h'e03vHuУ;w+9OBZg`82mJ+}w1ܭp\C`ѸJ Vik1 5.w,VX œ1[aw= hYEKMoyN1/F-V{#+n2Yr& _҄r;F2ށS5X%dľ $S՝sOrպ%DA|?[Q} F=`bF3!j+$/R Bt}c.D2{TcEKm0Q sj_f plTl}y7I8m-*hjtR0 ]r0  |c..Wܿ|lqd7QU4e0qX`?Py~C&"בj<;V”~zo;L uH L%CXO1N9ƒ zcp߀i 0JEْ4D[KH]@c-kXM;ҧx̰Cx"wɋ1ם1D8z~"ӷcR9[>c/1d07pyp7.t& bf*DaH ysKaˋh١X'%lԗ5GSL8eŇ$~ &]vB;B,b[ -n`YϘlvfoeZ4j*x'b%o{9ay oel&!m'FE1;I8TI%ΑK`xZ e, Okez{hb+A5||W:'/)s@L'hW>8&N_X 6Z)c M'QCBu0/!g8M z@2+oHۉ%6I+ b1>rn3Ͳ+LTM,(0L QYxBzhsU NY:'Xgl7OU: ,m LKoYL;JC&^L;VlX+F꼠sjF-[)sWP+j caa ؅w/FRq=-{=@ç۔A::HPtDbP^Wmf\JNxg^012''4w@RiwV(b]+ljZm`\2q(u z5 n ~Bp8Na5ݥ(m3/fsX m7m;6tPԺֈj*J.hpz:ՠoߛ[ b&(f4<3江謘;Cj' SZRke_Ĩ,6~3Lv^L HgL zBm:-ũ#s+BemS&J1F=E?2U -N0'hFB(h*dР~bg0dTeiW A524%fӑ}˓h}W` l~P>9n8ޘS׈h8B,=:w/@Ԭ_RXlƼXSg2# >*cr̪Ww$îGgLVHȎo.,zo|XP_ƞ߮0⃔ )e,"7_ Tx!nK^0mgbA,+O?|Jju1Jv.p3LCk!6> E!;nGL7ָdL1]傝'ڝ^{5 K cg6)4 Lj5/}1^;etHh P~u ,%ux7MEV6ūiQ\j\7\ӲTWwӠm8ޒa72D"pUvO _1Pz GfK50dw8¬n`j Q`Mp:f"Ց+zXUV!15WPU皣۵K" L"aAd>Rw%˥RPs &? kE-Ⱥx{Y͕`+@f2F۟Ku^:`>TX }>1X")̙ZȦ!b0pl,.gN& zX B` |FZkdil[j=q4!j!b)tΜw 2s8 L;U8 g?uIl8G.LXRKؼ`F'K&%Zakz/+UJ`KQ\TAlYp۳s8|.9`Xml FLm\;siDzmgoJ۠3]Wa#۠HiV,wpg6Ph12KʴIh+ Ghc.M͕Fj8Y,a() ^v<YB$'F\ R}/$`jKUKF 3יxRG!hߤx 1z `6e0vu ]^vb}Ft,l."EÒ㼲r.Ret?șx%p0=e/:]XWn+hƺ|5.B0qs*2nPy %[GاnٌրDߋ=߂DIM~#L4btdhs1wdx@dY]F8F(Vr3\$XؼQ[4J>Ѫ?y( nvEFAIyd.f*5RTv1s\ 1~ODOn~Wᅬ94  j9JIaJB@XQſir,īzoz`0J#O&n1 {\Nb^򚗇xU5rnu\+̃JۤS8# >#KȎY?& O(4o*Z^e8wJ9#5fUqWhX@]DVҹUJ4bX4oY>q|C*e/Ԣ_B0ˤϔmh1R8Yx/.2+( ܎4TdL"mQ:M`;]b!2+%G ,D#U&5,`\]; -%\f](gZ.dqq֛~İ:b1bHxU\YX!qCsіXXZ6 TmdŖc8_ܪRj4\O"^ jlZTTx0@AP:SqQ9neO4#ܩɁDgp w9R86ŘRЗ[;k$۳2Mkm#50JZ$N`ϜLȶej[o+?xueX8 l[νL1h(j~L0Qg6!L vvbb!GYR'WΡpe`QH+oi`vAۋQ+MCO.f9o0 v%#j˂}L-nҼʵWFf[_M,[;8c4q R¢)f”g7&P囒L.w 3̰uC_ ̳(egf%sC/VNNW icth兑3V*U[Q@]"o YEJ5|dɂ>3-z= AfWn߮.iv$!e\biΉ@ CY7Y/7W3mhep5/i)+|bdسȢcpOW 13 !E> =u,t<ꝺ- 85ԺB1iAhx/@*Rn#pu̼S6f]< VGw/ӮAb_=%8"SugHfBJES"ٵ27mH,Y/SE"[HJ5gb- Q~T&8V*&H1Ktkf-4I&6GY7ihrN#Izh, v#n-(6JjmȘ`3RpO3Թ~0 *`%h{jJH-^TǮRAuLۢ= dݮ\!rSĥ9\r /̮tE8)Jh{T;8+n'I^,.#X-('N,b ;32-]#_-8@iF-jku|bW>!&5w90b\FP{vFǐѺGyԨvG Aɺ U\·Olf{*bMu8Ҷ--=TEl (nL5g[1J ZsgQ7X<Ứ ,Ĵ9yZg|VN!;y#q?(*t/ Ys* Q1b֐ ٢U}57~V\АV[uD>6%\LsuD㊭/Z0Gh2K~CxKa4p\w'0('%Q7UZ0?"*3RrM1c'N6Xlf# ȕwdեVO8qG3vqEޤGu C3bnf=FZann|2 TZGi %jPtqĠ^]?2W1oE&{p瘾FJ x^JlE%=5AQ- c*ѹm:ڏ(g\Et g {:KP- J݋q̃Q`+Fⵛ.2̇&Qv lTwYZ#BZ*Ȕ \Y*V:\A~E)Шkl앏Xs\N[A0&V}iMKh8 /SL 0) KQjY i/bzaO:QG u>z9^H _9hW:jjTYT_ka0% |1,3CɁ4챠Kݳ~XX]=̗]b:Ј:9[YΥ?\x`a7[-fbPGP[n^3;C9xD͖E0IäR-G/0)-zy$Qꡕx}n:q/c.gZxm7G'wک؂6pw+sAdda2V5Ə bJuRޝe v$LWN%{Vm%d|Zʸn A udw=eX,IN6:YiAmQKȔ& ~ Zd=bE4mJ $V eCo/{T唪&0 EG(|&?s qޘyv1JU>u* ^gSCJY|C80 ^/^Vzq1Wtg{s|yˤo?(C>R@CCg:-?+^/VSmy DyY !}0zVYLxS-P#ZvMIOFo27 A*@uLr智ҙH@yjE t*x/YA"Rr4a%7$Tls"/i hKЧHP*u6꽠Jf͋?:^c=;@4$PGgfn{#">1,Еzbu(10%NTl{KfF%u-e&;L2s״˵0SԗY<6\#2ĥ,KDZfgL/> ![ gxPm5x0߼5Zq%Q!QhZ@^v(ι˩+6>wUviDpE(X3+`,WEbl'[Hu^"{m|Ĭ<{eaF .]OS2( G߮o4ljHSG<\V3ɹʅ*4g2ffo "aZm>Dl6K# -1gJ ]!;-p9Gx{lib|5z]  z8[ |9"NÇ1ylMp&Btf놠s+4<ܤU.R| :!q{.:_oRY=f)4%$4 }"j"-ils-k*æ` ÊenՃ>ؕ יm[̊x?'9WoIHy2[X:cqՑXy˵<紴y*,H:.9ဨ-͗sh6W@j!HƬOx2gMsY7 N\Ym)#MĂm()1O7Uo2)^V('h[-w2W"a<'U.IF ű\t1CFi].Koe$ J]ඤ gCMax{2KF -XQ -id\h(1K<؁[ w3үnV<WetUM0~Tt!.P*zs4:6 0 ZБ?aPטoV T%ctI[ ? ѡBh!,6n5Tsħ",\2L6"*.YKƸTrʭ% LEj! :Q kǴ\="_ZpWs:(in[9j_!Qb6evj67_)8Π+Cen:4GՆAgqi#*ѼS(`_2ܮB@kYzrrAZjw@R^K[KYcy?>}Y".0E歷.5PWXu-p$N R 0qZzw9e)h31p Wg8F^ұfd-]X1a6; gD3^ 0\-SbΏyyqkqֹdK]=-O|R . W,hHph'YCTS)&xØ,Ix5i}QPq5{˚"T'RƒU[ 8% [?Z9eJJ=4N$$șޕGL ^q=( vdV,D5,]%ʢ"Z4 f^zU1m`\*Zi{M?cr, \4gRe6Wq)Q(axʱYod\,pK & ooT_ƦF[! BSC?" KI8O Kq4 &ū(0ZA9+aIEQXv0CduHaӓR6A˝ i;J hMlԮOL@hrɻK I/W/.Y#M5)ct1-Cb_ ꝇ>dSH^o} =E5xiKg)yX/JUI̵T2I&lADVQ0raesݟv>]S%1c>#%6 aE(OD|`u 9˂n$/$ &yW ^yra*3x\d/(]Q,(\(Le= ڢÉ:fT/RAH'Ҹ+TEoúqj=coaY:`j64gBSX([k2O".sL=D̓#5oږO\$\r5h%b d JT*S5Lw8Y .Jt?^笳d3 .1E[Zaox#TԯMelJjc^6]Զޥ" JѼ c"Y{Bi}K Ѭ7(h,V  mXc@)vfXav|BM _ZiBiiH=Turz aI6F\FJf)?Z={Ao]3 ]+fq{*Y~#OB*g!*H-`a{Ze2}i A@Bi=PUaZ &Y:X $՗)Z +֝.B;,O> 8uEk^'͛F 1] z 8etTv:kL9y% L«qg/S]] 1<g:fKKu5Wg!u !bi36K$ CAa A`$(mo1ӟkd5l.!:cKX{ oԧc@ tk!w4")dSV n `2̴xY]B/"W24)꙱ZL2a`g@q3_4QE]n2 "!*asR ryvQ DʋK3V#ѩjo&=fSut-[LMWźuH `FD77 JV=FJ2*+e#F(C-{;&Rot"V :A祥EKq_]h`Fg&U,è `iS&Ǫ;C!.|T7Cbk ?/Iv@/.FK0[zs8z$i.DWlJo"4r@/ ORIũP:iWrR˼tL|jT 5" {3a d9[AG;S6`{6X U A3hWت\n1R"c4wvYRp+; 0`Uvtjb˩FU2ɩPu, M|n1yUL1a^v`a@ , 1~ӽ,u.tQ?DRWA9Ns_wGQroR6B%:^+ swʶ:-* g(Z~Q:B5D6] (TV6€޽Tx~bjX'!^E]TܣvZ@A&I%7`cuwTU SA"4MQQ.%2ԽmX,N)/lt-s@=g'&~B]r ߺ8@5ӄ/\s.X°yeKL ;262ܿ %2O0ɬb^FW9.\h9L.zLFx,lpJ֒p&RsGӔ!gɪ%:g`KuPNfeqVJ0^4WH-G(*xp+BPKe{ dW> jYbfCB}p));CB6Oв{D yX%&`&S-[fmZ F=X%2o=um' [Och9:-e.Tjhռ/:.]x蟱txh_ EfHrj4#17.ZJ S}.cĬn't0ye;D]EtIJ^ߛ' <:@e8 d/+ ^0. +rVǮ/ XXF{UJޡ3ˢ,<+:tj]йe]16d)bȥVF,phFP h"t`!s\UdʝK"^_6+|ëk\Uw-fvt2a h( @ m] Tq1~Ӗ0AjmOFb@CWh TŚ]"[P~jvK``U]Q _wVe BӐ ،7\όڪ#}ZjAq*n:HWlDzC a {LћEq{E+,vB=GjcH5e44v֟-Ef*VOб;b/7W ͹R3P Ɩ*)nnMQ&9A6B\ndˮ]+j %'H6$h 1@ĬGHڵvKG7AC aN pXEvU>G kd*bLKYߙFuq[jp/:v> JE^LƛxVbmYpQ.'Rr-+ՂKpwa9:ϙcR'3 [iq1r`X*ѿjUzEmdf!`@k=㭱OXGm`%1T±g[EHMv]=gD yDRRV7WbjdVސ'hVZؖ>& KZd?XK鷈iO9*N!o_0O\8̸gH=DtM.X] @ڳ-*r"x`R+#N" J ؏ +b̴3Ff/BY4wkkjN'Fo4ŝ/ Z/Nq4cYt)Fꪀ GPlYcM-sB1d da W)Z4 n@KdwUl׮RƲHiY(JU-(ZaKѴLuU*,J8Lf_"ifR1>n=M*xCg|BESl]1c,/ 5kB$ D`0EZ@5fp%4^}ᖀ"wk3)B ]$ Bp BG 6o -_}ly'~"HR1yZ lfW`T. p'8=s-ɍ:eamv6 1o{vy\]d;'paV(bQ&&`P* x}}q؋V\v-4:@V67]u:J޴E+mfToNaoߌM1GEja¢ gDRn-[[ ̷K!Оn #)utMWݰ:@w%h.%R]#y]l ehC\mYMڣ6򋋽{B˄P  ?rdZ_PMP#zCdU-/uY`@8ɐXǻ" EQ-)lsoXmCd]QnU[̅͋oHL[׹ZhS{9 9 ĭ\@ PAL =ͪ2/Fk@=YPzyqNԨJs3"q+W%%~#_tj4o%Y*7Xc!c\~=-nʟC*jOkM#䞴YN L-)VpXbUQs]?TFK;1xpB,ۦ"۩?m|IEj8ޢC no]@D,beOnL݉=* bQk=L2&`)ЖRopNk3`a4씳=LF{DkE+e\%`B4o@وkߞIHQ/peUӬ 504 l H7ptB E0YL#_0Ͱ_%+->Bb-13 /A2%sE]Mz,ۘ[½wqJQX.60P; JX V ,阂hzyJtb +_*p nD?IXyKP?=fyMk5xq6 Q=+b9 P 3bs'%k=E-5+x71]0LEE!nC(R޶o{11Xد*>Ŵ-PQM_ X WQfhn;XqW:wk [3>"f,zBc=H(/ZJ|bYI{`Wޞ%1yoSd DIp0],׬8])RE˰ .j0*5V&M(7X08/D;)g(ȴQ@pkWf9Y,)cwe{jǤT%e҉n4VN{`OVT6Ku/%H9u^`.B҇Yy3êoX2̠P͏\K+mR.ՑU}彂saq&q))תPZ]t~eE+=&ݏ`v>ajXKlxx.tR޳ χ2I@e$4֛ݿg3ҡ|Qb-yOv?5I@Qj+2v A4_Iy%%2!]f#1_U&i) V>m=bkmk(4x ZzZ-YG|EK>~9UuDqWedb8S 4(S2m"E3 ΉxWH o;ێe]w'm9P_hDH|;&IWS=Mq[.ilk(g]2)‡;R >^:G?j]XILcWs=)`ېoId)OyE6XH| yvJ*)L #h\ J?1<iv*6f ]Y!ʳkǘx"ڗ؆Dlrnҕ$`]=">U vlIőmFw~z$Hpж4EEAt 22,obx,B L EX'/!"Fe!^4)(Sw6xVI qz@ QXk2F22m]jm3Y괪onf5N4re![;/J.-C#>݊ 5ܸe鉊A2@.+ijXTP&Q-^_i]hSGPHq<,od4; 'DLE5qoB`"a*(2^yۨ5dtԄ" Y7&^.Ȕ>2]Ex~V([b{ ש=5R<**)RAњ"N 2J&A8' "ݷĥ /=aׂ,q T1s:KG ÉmXUqj .Lkx?SQz+3d68;jLj(G `EtKV) ^%~TSW59O2x-1 k'VD[cemȲGLM3,JTfP<-.b%ZԨ4ֽHho;#Hʪ㰚 ճ蹉Yv.x~ƬK(9pF˩K2KM}~'P( w` rbPzP7ʘhL?Mbˤ!|cCp Ty&yѓb~+=#xaV:b"ҰX]1)k!MP!ONDB%Y s#LJ,Д" V(+g-17] C|a"3Đ/l,:gY%@g1 ģI@w1re&%} hNTiEiw-=t6@c䓞Ǭ*hjSD-aMh0xz ^qwqE/\w-gvH*uUzձ^$)X-+| WƸJՎQ.]{J /G066l,M⡮쟯:'(tT tQ`^yN>hϻ,Jc*MvYia Dk㎃ "hĸ_T\4~n`l8'b^[&Fs )`V,3Ku^Iw/TLZ-nY_LbC[^5)7*j[Qa):KS@<,{Ev26K;ZSK#ve2;qސ+vU~evݮGZԵ*J= `.Wc.1HߤvLgOWIUH[ My~_ee_[%)֥/24V9٣flܾs 3gp_[ c:ɍ~g{h/SA+E !\#M U %}5(^Ҵd]r;b^c( 2]+ K Su]^R@B&Pbq0Y/)~~7cQQ5pzo;GiG--]=ee xD9b`e e,h-U]s%%_Ci\X(:Ҫ:x8AU򇂣:0I7D8֛ ~ΌYF"m( 慪Uތ&P`}!M>YL2{Gku5wXbP?kOiH&_,z(a@p2-^mMDVN=w RU$(99^IiO8ۼeMm,5к\/LRm*pD&60$ .7 .0 K%4Rr&r]"0oXv,@QF:հ+|\Mcs&;) ?qD\p\MF(ɺIuJ㪡=X{ii1m@tsbi:_N))*싘Q9:w$gc*O9d2FJgޒ*.jtۏ΃_,|EQk?w#^q qAm>V]+Y@sO̰ wIP?[U^eUl$=Z3_y 8f:+tJvRwB|N|Üw~u8xRLNQO LEuiS?̳^.hR*1geZ~rnzEb WӠb`iSonqEH0iYjQjXE/dz&,Tg rPMDufe"]ޢ8i # ~DQddчHAB^{Bd9h&DP^jtֻ#. [oC y80MA7ަ+H q i@V>aQԇwܪL]TtO#'D;ыP7TzbĊ'7eE N!6K0[S[U$N+?6MDzMWOHn BUԳXEa[E 1p+]tvWa UlXg!DNPeS{#ʁF*3ւIۆ:@Shje<5Lf@͐!xAEF_aФ BWb`IIMn]hisj M|ׄ{X8UT&>d_ML]*RY0]#3rX2RQP zpUܵg[ X .?Boimy G{ZRs*]9GOuA[*!MV$N`);%7o΀Nj<; 15'_U]\U̘5Z+_ĆT=y͚[[*i*Szs⠎=WH[ЛpiH)i1yHP)C %jQc(2 %kPyhQPv>̇@&"C0{\[z(ޱg,ؼ%(CH@'f9UO mXXEJa&Ѧ4]AVfD#I3_ZF8Y_rތ8Ɍt(JO wƕ+O:"81JSsٱ`a,OL  ᮷eO!4 ̠.8qy'4lόùv%d$P'[r&yCZX8m_Aؑ|LFco Otk<,1,tS+3  Hn3awT"xӤDsb|"\֏8lMb˝$G€%sp `J%Rq]}R9R25޹=GAKw^iEy/pN{1CPEpֻO +3*!\T6@)|j-)=&=hQ 6F< nq^];"i}*p;[nX)cz{/Fs@Z?n(U^y8ަ>V؅1ppp_eJA v,zیi {p RYi ]]t&LmrjIgen )]6:NOavm8Ea7'b6B4 c@HVo~.9GlT20ƕ `ݤ bN\.NTX hP=ìnW#*Mll)AݨIe} &B_E| \S鏹[gx6ηnY~i9q, 8 b$WpPLTJ+)hD@B0q;)hKfi{|Ї(X vuUwqn- c4^ Yfv 6I!|P fY o!-b&jqg%MѼMZ޽U@mw`r&E`EPH^z1[f>P'7\S ؤ_$JHGal~maxQIy,>]Jd$ie2ȝ^(1h aghdsT$gfb@~[)@jŴg W) YWx}{KׂQ(z +@0ND.L<v*T95`&Fs-Ct~`ᛸ.0QP͸^1TMNڎХTPhqP={R6 gõ)S^Km\ rĎ񫤯衛Rf4@NjWq7}LXޓ>uSԽ?ar /dvq?RtlXICu 8A5;QEu\QH=/q㱸ԟqw7- n Cy_\UmiB,ql$YV;/z~}?}*kksH=>55EԸ*Hםu*8ִrsH2<@&kviBLBy[VI<7p XծܐbWJqJ*^@)Ya,8y{@)EsD`X2+ y|VD=vKz=꒥{x49ՔMPWxel>^r P+/]#J3MnkG^,܊`+hFl[" x,=9#ہ[#2.vvreZH&'|=m^SowWͣ(Zy4eFW:x&G՜H\8x,+|mmQdRgi9M@y5 EEW8VIpBT.4wOD"h&RZؿ哾e ɸ K.@)QmeS]7'uz>;>̞v<xTCyЄARd >%3E#88?^% \-wRT0[HAQ{QQA)/H9KLDЎecwDihSʮw zES~L8QX}!EˏQ9c CjKI T$-[ Ob]kyUM$1HDZIfܻ6K ՙӤCC!Ҧ |#L./R4ѓ;PEzHC0_4WzJBlh%wg2:rEn&SK%Q)<Ð݄!Tez# |Ҹr;w[l@џDåTqqp}Gȩ^3 ](ŻE:IFOI,Y;QޔIcvJ0aDRhF>^0da/]~~[6, pIaʅ ?yIY;߰Cٱrӝ9Y|? .΍Kt٢eiŸD\(#Q꫊͆]{KB4Jjʪ^Y^؛30YQm'~ԋ/epx_t9bJ m9ۅdiTy:)]Ljd @Pك@U_mon3[9V9 Z3!6K!i]jxl#nY:̜ou`u$gy!1V (Bޑtl[) F$` kBqF[9Hƅn|!CFz%]k]p'bcJI!%8qBYNieALR.PNq:͈I33ЕOX ;, > rk NUb0,w5s';5:e*p*XYBuዝTƺ@?R9F>u}רo%{BYS^D&:H'J"D0GGŦk\32jW QDh:#t!(AܔVIϲy+A ;6sd hD15/F,g8~D0k$}Ś0RQ͑pJR ;hnu8/?ݲCLi#Du=t\aC, J^SxAkwS`V!Cʥ^%,^$p;H bP@n,PbPe^ :Cf\IZ7?˞Md^^W. SM9PS$h*O \V\..LV|HJLXm 4ge2VL-VH_'$tSm13fm#H'ʡX 4A{ qCH-GC^fxb\穠X= p`jE VASq7;v^^e& ӹ( SwUfľ!E?P@^"<4QoƓ=l ź;,sܾYĵf.()et#`bH*@UNQbQ#miRZ-}x=@̳-o0,Ty#xXD5r6ġ*:@(kԹ( ޠ(N (KK  U %JPa-0is?)V@$"̺שpiF6LU8b,ԣj!^')l9aۃf_p;]:.#iL@6yܢfY#DHf#FR\- ! b'/e̚x0Wsp ,k\ sGDJ,,ZXрaS9KX.x}AW>!}AHK Wx@nF~ l:9Lpk(b|(יyiU¥(f3o;PJ3)"lz]STl`G`b0k0~,5 H/icQE # /Rp{eΤv* NbĊ\0|U/xJ2&F"cC`  3q\LS lX4ۉk,Q~%XlۘN: )B k#Ch%6K*(7*ip1U+}%CQnX~b0b.sЃyGrxTl!GMƼAeLsDB0rnrCjpQ6h\D'Ń] @䊪UsA7PMfP06MB eLP  "_)P"[R`Dx),`VenSbr֡d*2Nf78lK5\UNb:`&AHBxAʟp%G(Q]ƃ0igR,Ś%(iuRp:- ]|-TxL̖'(ْNO,TaP8s L V4JĢ.$}g[ <̪2=: IJEˎ,K3,T *HJ 0j n59*cPMK%j %.+kRx7Zu8\J,P@ųU2"e1cG`jfP $ҍ@xK Qw7\-&i{j9 \( G2'%mxJP  7s<1 ^m "v5djQMG9wQq)D3cWmUn; ix7 n9o-3ĈbUΈq ,af<#jg$Ui]N"#]kdYU"Z%[(rP<;X([ya, ZE%L¾." 70*qaCX ՜\m F;kCuKa,A5bc\TM $]&b>޿2eLs6!<35ܴێ)j_@Eܡd .˻썑ҍWLHdo&1y99Bon\D_ u R v:xETDM[",Ki 3XfXaLq bpW?`)4e*B&.s2'd[\bԻqé?iSFZVԴ̹1P^42~&î "\I/FXrxai4TМy:QXdX.+CMcPx!Eyx,wʋUP[; 0C3l1l G41/bS֠lc0+i5% Ka t+DQgihVx Qc WG9b_KQV՝W\c wyc sKopngLev zL!f`&\2\Mõ 1L_0 &?T8yp5*. |ۛd\ekB 52n,sEƝÈpᗬL-A(a:fLTEk*f$P B,⸀@1"ji13ɒ7(dlcJcCeX:;.;q֡fPUU@+&F76[! Z1.C튚e>߂#5{1R(mQ'up1䀬90(-YkjbBmL@_2T'D/)V\rp'׈S]5hbFml8[8]D.+pTԲA-70YAͨ#p g3G%>]Y$M %Iib%F6_S"&ī,ĘbTce@xb Qb efhbw([ BX\305 YrpamBr P5ܥ etbmpLL-Y(+qZf[Pb* ۂ)ORN(j'd` WH,èc"kvLY/PNbJMJ~ae9qu2.fj2S_dL"J72%PD^a!Z{`)(5tj&ˈ1x]RnHr;gA30 +I@'( ϻDJ1bţ|õ3[jE r'C\ڗQ7QqR+.+pyX1Գ@r[ V5 6.gN ̧k^`xo HnG]TZH T'pUUL% juoV԰ /fƥN0!iUP2cvU{TJbj P=N@bjr&8JL>"Sp5̢ ͏WpjlJ2gR^.΢k0NA"7*D8٩T*< @8ʗa[<9r\L:^˘0[sĈcAQM Z[n xjw*UA&dB z"y-MѮ*qQKeaEUy`G-B̋יQDahN{@?16&MTWrCڪq9ikh[gc*R/l7p]q *{ =D,=!~%%_aF̈́lcݥ&*0T;F4AܙbNk`gj9z9m1N5\L.ؗnr &ʰx| x%۲MV n ,-;*5Mݜ@Qxj!jܽ0Rv1p6POh8W6J=Z:X=u ž4qL\,oS5n0e&!.Kd3}fhYuoE%q iq8ssX#ܵZ_S-e"N@]BpB@4cSpN ;Ùt >` _D[4\lRc#-郶 Ioh[Șr0h; hW5U(%]`VXUn<@k W(5+ј̣ t]s|Gu0W"p@+PUpC5P\B[v4.̵?2j۽CL0 bR~#nV7eU(hYVVkE$[B( rXY{z[;-#%7p\9fWhk)GAK2j,/&2 MLU)}[>6puK[ D_$@Ԩ @eȢZ-^R 0@'q1E4*z hyZ lDi"J UGn! IHW1f0aФ0J {6|@pŚc_'wj[ n|l{TWsuEb0+q(7/b=K^Ś +*` ;A`zcrUIADJ-iK@n%3ypVA8aurcw(Pt TVwTB5,[;VHψ~heSGYG <è(j :VnZèPR2s I2`vlAdL\pڏb$[pMf[Uψ#,;"Fh%EE`rpb״%tꬋ]WSYaV%vU !u^eZj O4n_ DT%ՀzxfBS6Cm]ܣd qS8_qo] R&@2 w*WAC QRp?hq5S@8 xne\j?KWtB nde1{Kxb4>Zؠ]Ė(^%)Vz BXj*ىk\eV(cNjZ:;w}ʶy"&;1?X"/J>~K[d]E12y%#pꪭNqj1Wlʊj(mh7xHVu+^gPW2q`8F\J @+mB5~2?Ҙ(`!2ym!@`U`b,by!o/0Ț8l̡|d ȁh/HT__js(DqIVRÓ1 V%'q qWLޖ-gA!&rc\<v:Y(D&kg9 c;0$XT,(L#f:^=]e(@r 6p#YR׉X|@Pu%^z aLV[s)-ag fEPVfB( RHL8@+LkgRk_ (aX.Wt. 90ݞ%Y!lj k&kR&(вa*j{JܣĢjVU#-K*$q^'P2L_e35Jy(pЊ3Љ8%э%miJ(0B6{kT\r/}v [DV9Ĝ@X7+ }4\ /o7QW2  *d˗W V/02ŭ_P֏q"@ LCP:*Q/*Vv &uo =˿p6Raor1 EGn`!7خ-?A`@;\)[zxacn 1 3_ަcXhz<@`UOfnR#.0)-qa`-? p¼?PSL;#\äJw.8B`0N@h8r`Yܣ=͚6 k.l3!z̲@ޘ.0}AlNbB̌p6R\Dݓ:`Q`%t+ j:x)RFP%T|}V0E[+;& 1ƃC E[$ng"qH;F98_ܴW"䃅1|iṢ!ScWIҁ_wqiA&#PMB Lo 8͘:b!`8VD6 T6%i) J3(!#,j]K"9iekr mt%TA@G/QqsJ-遨Z ߁[!, 3s 6 YWLS1ps'#mXcLeb aF͞"|n `ԩ~*5PQ!E9&>EX =K)4+J NĭFl nPiUT@kň#=.4(ј^"{|uShoi'0Ő)vzt\& Hn``-F [+\U b S .!sNkY̨ AcV4F(ܵ3wb<9f0@~Gi䌹, Lq P1u-wRY60|7@X4j'Q S^ `v@Ph83hy_Qp bhpb4eC !}›XY3LjjM> @PZޡ Zj .}ų,cd7,DЪod^2SBNr`%!x<+_WŌBYVPN x~㠨3oH4\l `% Z%q㘋4UPT1/:.0)ݞ%h\1Y8J%MP-TDT%[:SO,cݱˆS儮il8@G.anXTI\tao(kR . |_QS 4j[4 J: wQb(0zaB%J|a#+Fdǫf+.l/DAK DZ1 mFT&Q݇nT$Z]v#W&Bô_ R< J{DvvJ_0GqMqJ?.xbqԥk8]D@ 7QqHiωo& W52ߨTBŭ=CFf0J5\3YV =TͰ,\J4  Bpj0}J ,P*(ݯC*<0k nOa\eP,KYYoi끖]]q0Ӓ2DWGrԹ(-=90LFF^+SYF?(XA0Wx7iY,>&# .sx ,7Y $9d ,0yUbNE,Bqx. |3\WFȫT^% O6TlIzծz 8#1beCm_9IF3-\HfcQVN9;0$VJb2nCqLWܱ2fIK#ˤi Kn7)R5 ?j`6 ŷXQQAU4kVAJ8Eq# k5ܰqR;NcNH*p ,Ybj3wQ&, FiTov %7YSaPGQZ{pM )JʼK`NXq gX޺dS[r sP`3q\#sr]Gm!%sQf/WE6s.qqz;5TZ7!f-hBcP\I-/E G.%QSn^5qBҍ&izs'kR3cRJeM1N ()5z{V"3SV[B+0Fe@=:w(Zܰyz@. FK ]TYT&d fGRr@( 2T8abQlw5eA(Y U& s"+߉au0BL*' >:UWeE0I`J:(DG6蘀*Jo3lPJqC)W2 b3|X~'Y G?O;ʠϨ Z8n~p?!R-q)p\+}5q1g@9olɢkL^g:0B^es3Fn^89ٵԸPZoryV]l u+ūΪ*ig+mo}9G#+l0Іءn%2\puE,>tp^IέRQ,~ajEx uP ܴ­n%+Q:J#T@u0v\8QˊPTw2L1V䀍Va@UeI./OQuoRzħ RN`]KuŒËq8g q{KXxC`]e1:UaZ.ǿn9z0Pk \48:m­Pb)Gw'$R.Ayr}M@'(m[bT2缳 >c2h{n.Ak)|j8s2^^biPw)Wqn`oQ:K {61%+HBՏB,t30Mu2!^f`Cԣ;,6<1#U9#7:(w*Z?9h2-rFj1OQ:j̏  3"R:lDDz@_-s(ـ偂5-#mU<[N!r"pbPT(3r X\Y;K $@--VU)CV2ќbg"SBh>KmBb &']u")K Hm㨫Š8]1]Jݡ0+a A Ø2+l6ܩv"-vu)"F?h9;t3p/PMK\<_A7,~Lb)I3"SSz`O,TQdh1¼#)an+<%f)|u)Wlu%P@&AAgTNcv1͘1^Xi_}f"uԢ a(;|TBZ0@ 4QqbXZ"iK1}?Ev~._+@V 6އ4mZ*VG&qq@@mxmrGJ(5;#Sn 1*/91 XRcak]cMB+E;C$ޙin}ˬ`*-ܵ(QA a/u230; {d 0u g3lsn<@r9/ŴJ0(eV?r|D#ĸwxP0{`w1"6iKIs-: fqu) 7\)XZ޺Xa+8 Ν_0QW"iܬ\]#۽0 FSE9'R tJ\ͥ.@ަAyzvp!:V \wYyN􁆚wQ\s+\j@>W AqU_LK`.`R.LW[N%u%㸥ø^eܰ9ʼnI`3*pYZj^7om70*(S#Rؖ5LN hĈԪVrǎ"_2 B4 4pmg-| @ۘI+$4B\.o?UK,%`+Xט%CA爸;NnlwhS̵tE@o6NP:+OZRcl 1E͒M +a],N$*'P1da'9 |5u~bO(#/Pm Uy P$( ŖeQsK]`].DD@ %b-s`17=CG=A)RLQ44aԽxp"rX\{f!ShN9Ely"]ڍH/?F G}XHpKrD%7_p֡˸ :1?"3$~%Ys2:%4ͣ]DUXxE?PvDŽPu,h?py .&!eA(P+lħj6jU)qz! ]o=4w_RD*qN<۶U,LkF52RjƸojZ%fO:y&r 0U^^+[#~ wweLjl\`$*U@y~fN\7A-Ky`YN[K\C)~u5Y11_rA" +W0)P++~IU 8c6%#bzz{ -GX {; S ?1 Ո_uf+lV|TUG`"~#Ǩ-|Gx`n!PL+e)KB_@ͯO"oЕKps iX2``1ǐxA\OCmyeRy0TkP7*%7Qa+hk12$K`Ven8!̭ԩpMxh3I+ZT8 ƆBAMAHEi4u_]>hԬ 9"D,TL7lAVr "aC['pE/tҋ˴6ٖф=OfʤV4&hdhf5riu,"ʁ"Eu)rkCLdKZ,`q/n82.X X<iB6Q븟FE1p0* )'X:7QZ1(38kQM^ [Q1C4PNE1UULe.!Msx1-FG0G2Xb"K:4SlD">"/aZ~ *{bCM :5 -pq2Jh₫Pq.Eu rjŊV'PD6m'0g/!a4 TL9UPc^3Ի˸bH ̪0iq@9un^Y"l F"ܷjo'l daŀH aqt=@prj*D9#O`"&b&7S*Zi';(Q{a3 Y?1q3jZU1X g¨Alcxb,\"H[G1ĠR@jDzLbG XFXcU]WӖDe  S+Nl/XDX@\0 z :0 'B6#&*T>4&cl/~R \Je1mmut_2ٺX^&X)6{-EB d3u`5鈭OU2A@e.<%)GpoGP1@_%q6JGЈ0&.2X*"}}-q dR츆>aCkp]P34Jn_;ŢtTes J qjK),RPCD*DF0QqoR࿸*dip*yts+Y0*,Cs/fr#ˎHo׈0/c \c3 bܭ7)Eq,8'r5RcS5V; TpʙeW ӼĆ3~չɭSn&X4:8+R9D j!z¨b[7ܽU`bCNOsA;0u+;tm˖ɗNDW+zX(P9Se!bBra-|H8L009؞j] ܯqM7躂G,V!F%I70ǿRFſ3+h$ !e@b+N F70cRQS1r\NZR/1WnY2jj摩Q4AK7pKMDVħ |+[ H CJ ŝJՓY*.V]+=C)4gL9p{l؎ v@Q452Vu*GGB1}09!ը2#;OܴCV4*Z1-zy#I^D +&;[(*cEˋ#QfT‰ˎ1Yo5,ei `+\D(q4s-c\\Yc?)4b*%¼0F5S.q(0ɉmY߈Ut>w4A( Ң+%QwqGAJx `yǽ]Jm ?p&1k`YѮ2ͅJ_9{D`5`֢Q!. WQC#J;$ *+80׸9"(AiP1e%7*3 UjD*P]E-YԺ "p}%ڳ ̖sS /"pJZڊzwUbw5,"i71~e-p\xL>&(uoJ? ıd̻R;f8v+32Y--BV"&؋\gr4:a|+:.,napZ^rv*.&a>}A!. ,BAnT~Y/#~#(n]OsIP}d2VLRKڳdo/2h B1PrdDN Xtsȅ_S['S bQ,QQB+8rl p5'%S[  h!PFx`;8L0ıC gE*3&̗16Ns 4(=6~-vu,`w':_^e.B=fd,Қ ImeshSoRH@2c\LT]àUÔzj Fw訂60hP9@zzVp2? W)WDrٙDIĺp7T)*("9, @°pZtG /f c4Kn Kd#mMFcZ%Q@}E0Dq!0=+UqP8W K XơN.fD(J0e Q n Fķ!kDK roS̡$CB*`ވӈ䒆 1MiFb*% .E`K@<ٸP^zXf3U1 &4 y`3>[/1v5 mn:ֶKpܴ%=Kɚw(Q =ln2QUY7a+aCkYaF5X4šA/QY"^bo9BikZԱ+ܾb-T/& ZfjqsKJ"`AfZLq s|Eѩ{u Y4ZS( w \ ]nW 4hTeJeQ 94=LDԦ{ZL,C?^j.+TTSpG0op"䭘'PWz͂q6׹rFtJV7)Fi`I\O n wU~c ,Sq +ێNVPL(Øl*4e/-E|W.BDȉ|N50Cpo6-8s2ƦN`aBe\ R FȰjXgrniܷܬ ᶪP8PNab#J6Es̽/% 0P4z+arsB%tACZL*Չ/֘J75DAEQn[mN3C.⃷3QҏPZi@DWPᄰ"ŀz!P4(Zl` b8 sRUqQqDkE&ePL"a@ѸQ %R%ͿEwK^o%TfQ94y)Ӹ]櫈%,e1PE;ōFAVZjM6@)ނ5L0scxeZWḌ)Ҙ<<Դu2FC6SA.ħg v"w QsCQ% Ru2q 9aa 45iu9;PN8'W,v]qr"pMFu H17)RfmA@s]f\6uPpb- PUOn9 L!:0 KVL\<!F%O0ܥT~`Ǵ)FP=L6A3LjN(#Uw^D91 j=qJ;B( +.s> rus0Z-u2Sgrw.m9USw(.c-o:qy4ջkBnH*..ˈ5yObx-P$"7N3 {d.=ǁ*印Mcg«b CİS;&b \DXJ^ޢ%JnQb_p/֡NpL@e14&HT Ru"&-c̺3F~` sG[<;c2]iVYxm_#MP`@dQ2X.[7TxU"QCaQ3P$V{5ܯWifĪԔiЋCS9݄F2<f_^ &?jAhRߙN3!S2s9/p @E#S"; V 9ũj(0s%K,G ,[Eīw^%$3\D-u)Dpph;EP`s-0-\]Ű-1K\f36\M+@20\egQ!(!["Xe#l-7BY*-=E !Ds"GQ$x;,KWs&[s5 sr̫Գ){\Hkn\ V fEźp&y6g \$^"Bo=0ks!G1[7aEXa\׈d/6 jVf%"/5Gq&\ޑe7c7k'BӨT c-3J6PUKޠ'd[LJUn%(bY Ό U7[N&p.3FQ!7q6 协-̡D`b.e ._:D3w0,FL4 S&dWBZ6J"Fq PU{5i+lB( Vc d{bnV f9h3,i1;g`mL&qè0N7X&TB ")axp1Q1U曗%1f q5\ `[+N` Yip6P':Bz urأUkHX1 'f%KqK5) AF.'Ll*1TS H0me3[.XlB _r DHyL̂:Jm lQ0_aDD8Su,zGeL+%sV\ʖ c|SQnA!j̫%V1|G*pĭXovV /r]pFq%Y{$04d1GɘOp]Fv. Pi!qbsNjJw7,w\"L\8vDMF7Y ͋f!rS79;)1x  lWoS"D +nVu1;Aˈl>t[  ԭC1"%P8&*[1*yB M+q(\Ap":TWb7U g1l~nkNSWk?̷PSVL6bk,·bMA`2Z hr@9w()=A沌&fTm~Z /e/f.pb8\-C[wf9[7iTØ?8@AS#fĥ;5))e )!iuZ5 RpI_pUO0 `Ck<Wdjwi^AK9e`.Zl;"1_Ķ  pJWP -F7,YTjQΦV4 Yke RZƢZp%=^.u\i9g1nWU.Z.(‘ڸP?rbؖ.`3CX`2VQgDC99|ʽ!s- p+>0Jr:?0:w \0<fGW9`7(g/p<%`QM=;@+ ZlTUG[X[Y3^ )QXV `dG8A&y2xR#3iC / fªme laNb6Jn ;kn[M~a2ʣ$A\~"}G. 'N@Έ<5UԨ|Ke&#d%o( Y yE ɏfUE䎊u e%x̷j0zyU̴Z03Z" !n"Ơ{MxT\.X <ʥ\Tʌ_|f1)C1z);2T6Y+E~h\o{f+;[ԵQf0f`|OV E>iW0;Sa*#qV~W,rÖ' x`[b n=}Dn}7*1~ 6s(ee%7YAʢ\cm5[3hŬ*f MƟ".sXFM)6)#)!-SeZ{do\Go)Y#]A3$*nֿdLW6 VTi7g0pq9$ny De0c( ]s #ØH£r/2+6e#߁[Z!f% 4f1Icow3=Px =K|J 9j4Y8.| )S0…*6F iLǨO3DA:EC!Yg?5W3-pxF,dHɹ%LakVVm rě9MP4L i\7KwR vC9eE%*5 0侙V%P \MȮ "!ωόn(̷%HLarq I3&S/? 3>ς`~&qd=>+v` bQac +f@1;`u,⡦1OԦ*GP(`*͔WQo^gji8u Ϙ.'&LI2+15O3 Q?r̯D ] Ƴ@#/W2fX]Fb17Mnb/L2o$UٜebP  ᖒVY/q 9sщr0&I5;X PјʐK~ 9!DI![ @*,qUDDx=N7`K)2$"Eӈ=G0(cpXTioraAPpQ*ុdPRu8qbc EW*dRog|-AWF<\@Z`à 0j -W U˜̕2o,g3i:ԫ\&MfGpA-P{HNAi~& qxSryQ[y2S(Ax"]VwRX.,^OuȊ0/n)N/s8Q &'DGq5wƫ-ˮQI lj)Sˢ5L Y4`e)Ms>q| lg2'+*Ĺ0r%0%$.ֱ0q3,bB@YhD@Di8'fnUˁ%^;ly7']FtpTɈ0:|ʜ̸b^ʭD%b.)w*u2!s8>9署na*)qv n<+<@+-QS 2mE1JTLxx׈nbhNE<8빡E (=1 IK&zE1ʹ52;JY |AG,+ {E E̤5k_s Rܢ4p VMD]j5 DeT|mQWq-f"\mr`9=_'w1)!\ * MW^2]3&~f,ԱoIm ȮHC`?ջd3 * [2W~|D,b U6fdUTP6[@)^(,Ծ YbLD()1b   .)* DiEe"a,Z!F%C/m!p)c]L*j\&% k$N ,,_ lA␭" j& d '`s,KxntK  ˸I] q V #]c Xܫ,,%12-w ,s› ўXԪR3:^+1(!oSur(pzY@7rBp%p+n h_)_E F(qM:NPzخqx9vYܪ2UH[\K&QQTт:\w0F w4q+٘_0rfz3.ĻT/޳,_jt~eMB P;q?È3"K%)gps%DuW0BY(BF-H}.O%:{`N*)V# RBe.7n0BҘ+r}F9F /`B>QJfDFGw2]6nY =KQ%DpL3e]R<({9"w!P( \s: yBx#r cvn,O_-bDw+6uq\{,EMJ/gs|!nfZ޻6G K_X\WU͂0fcȈnVN:Lj-Q5)6VS;fޡdh Lh4{wbk>0I*)X+48Jw l_O3E]J2"1ndu*CK4%u*MD-b3f; cqb6Z+$X1.n5;Y3̫|K:BgkfLb9}xȮdocv:"tfԯ}Aʗ[8J5dܠE*ARttCMͫm:G7`lC jQ2Jp@b4%;''dL+fn%'ٚ5iWhA0NxeK=55h^*ىA "Q 5(q[~Ll"*T|ǴZHep#G~krqLq*\BgBBMʳV- >X-̬r8Fq3B˄|dFdRBj`"e8hگPj0%Щin`*Sd+.mY y.*&#+] 0j v1m?d!/pSpk12Shc/d#'!X"pQ]8 zmc,a}G04Ů jDhs9Q]& q9"ZFs.ABZd@as#Eb)fʨ*PcdCpIx0:(΢MI]F`{,ẖ_2f!s9 AWP\`(4PHBBBp5-)̩z#Ui3*8SPzH kLRkVb?$/qƋpx"+\6c3,lDP7ip2c7"dѪ-\M> o')dUw.93Ѕ-Rmw Y耢-{55_t&,KYp Vyg-J9c]X "9;{XT"ċ¥C2aXsܱ3:ZDoD?K0qǿ3We1IIQ.FjNj"U#f0 #.' S"Wlut` brP:(3y~$8C, L(~K0dYj}(ܱҔ<I-#ѣ0D",niq.El̼8!T3F@}Iz sLbq-nQ׈"cLnYPԵoЎRs,*@eD.0hiCh. y+++H6E6~[4cj-ڒǢܡV⫹]-C-"#&2iY3cJz1Ue<ƭ8%bQ-e d< E5bc%u0 WccR˘A8e/@%Yni8< R Nw48E6ဲXҔrk@2Sq9q+BfLE{lm*F4omj/qǩl84O|o\V$(A&d",bRQ/2ƒY(f  |[RRDZ>?Lo\.`̰tjX˨:ƺ%Ubu@#8>a@'D1.H2mVQ!u`XghUeRe[Y:H Zy`AFH\Q8u.^.QD"\{f c6,A"&(-MAj#0lYد+tQ̱8#/pbbVu- Dи&.e ƈSD <)(8pek_\U`Xt8Nb# %5HN`rg75\DrTk4aDw⥸.k0lWh25d!L<)grG5.DϙV ;lq;FR/PⱊR.G5)JQoĭdyS [%)Tz P-ӯU\F%8sQP1p(&p Ģ`Y-p/n*`n),%rs?%eU2J+5 O΄Wzr@=(,XbPIF ro\aiӹj̧Fc$A|fۨp¿R*Q;\rK-胎A:YAU:J!l`^f*P0LEdi_M0;'7pTuR*- Ѣ<1 *Z!RK;RR\.iDs|Γg(qi}!Z{a+ι%qyVt.5:(5[ZRyL߸G ArȴuD~L*{n#0 %!ۥK]Ƙe\[B 1s e?Qz\ɨfB1%)bl.H{w\W(k oii̧8,j b*b1*0Hj1P`qܙB.J1#`n)q<1nPӟ"10,KΈ)fjsJZ\/uSGPBr A`-4:Ԭ4kr D-gEFsH["YLKX1ei0.R.7_ a 1 "s/im 0X{#wKƠf51 ҫ;f&H0IZK8m=R)^θ(%f7"K geURfI,`*`"J^0&uqW1qIJXfN+  J)VHS%s j"frXR%svsC!6c?3%+Fqo9Rk>< k 3PDkȘL5rB:(%#o g0^`!5*zBB i:Ke(Wrǐdm̻B GiG@,sܳ+$$g=Ly;)'-  {(UTZ2̶{DfQ"9_}g%k RD"d 9~7](_TW1X<[03^پgV-E5Qc.[3()g09%ܳ1En`B3Q)fnDo`#EV&V-P?-]"XE1Кd`Bؔ '[Fkd.5лdVUb,_4ԩ3Q)]y@_n2#cIL- P5Q!\. 3Nkr")CU(J:@ Ar0w~ s,VxeTJ* \,5s)*e/{-VAcW _[SS)Y&ȀBbd\FX9%Ǧ  N&nC+o ۔1MP"ϩJX*3crR喗x[N\J-(5)TT@ B TYEn%x./uħ1 ^ER \T|D  + v.=fz[\)o1*P@+sūh&rNք8cXIFyR jlfL{X+Hx[W( q1s 1+K; :p.Yb&4Zpw-JZm+zYIG9(^"0i &+jKqk09sN Dwԣ߯P"fYKFwak0^piv/V# FgJ caxP*֙_q *:vʼũEqD[p/SE7>:JyAU G"sE MZķEMTQH%3Zs.-Vf'UR5V Ronni&km/t f/! ˆ2zax"8TRTPY410 %oHV\DodT\;i*v"`K8RB%9;B.`fa4ʭDUf2< 0FkOaKD!%HۛJ,3vq7WXH TSz 0*[72an2* ,'9'|a/AK u@ɆԱ X'pYf0hJF,`QgtO9hWqG1smuꜘՈKy-pĮ  TfPSD:#{Ke(@\”x1)k)ȯ_PP9N97HW W:Pk#BJ|2FZ@ϊ{PJeͪ=Tzʑ[:SBc.AcYGB`40*ʴCD[ܧ94Wf5 k  1OSϸ9Lܩ^ bQ3.̺#PU:n]y()f2IK*Ùwk9jJ@B#Xe̾ HRp.%bҸcY+bUqɊ5osRPS3f`KX톱|5(D,a/.b-!#xs70)Tųtl ۈ/L#Zg^"TKؔƑq/%(ZGr\u17xru,j&s ʔaUPA۩{cJE\eAP 1Q03*1H|b)WX$eb0p:+00.):+dT w+j1XԬWS&u*!vhqPLn1'@+ҧK+𸋭CX*QoZs @NMqy HQ&RćX(?plw,FhC ۍO, %>X1Pl<)dx8L)9""`o\9%+ L 쏱ר #y#[q#9ф`P:ݽG*abdW1%,((VXMDDsq*0Ŋ \3-]|7&HREz$AlW=ʕTQw)O1Jz 2cj5Qu +PVvbJ2wC>2 W;1Sql(~BuE? P u ߸`2ۏḆ- ؍]F-l`pdƩn!Q)x]:mF\Jr3k/\Ecdq3M/|MuiCt*)KEfخTFq3຦;k&" Ĭ.tǪ -ijz:mOĹKQss=+xCfqPPFKLX+.a0 _jS+w+Vf`X\9"VJAo~&Bg-u5 P_ {w,dA.ni" `<0(]LjVid3TIƥDislYd e0n 5 rFh?Rm)1a9a0 @0(Vh#0,#<ާ(!1AQaq 0?q@5JV! .aqaZ\nPQ7o|ٜ tH~^ZuAE>`cv@Om޹K\:<@ׁgķӄ{3&JCY84R-4\g1CZ1C"opi9n z7 5{sSKe#(kFmY,6e\En!ѕ*>Npu3B.7laD^W@Ϲ bW#pϹs-\fiV)0BZ"PĶxVPRjxOY ƠmP517^i?WuRDyJP|Ufb@rLUNcWp X#s)Hh ermir6P CHh4O2AiWeYhBYsGU2mz-ՎaҋzJq2Tc|G57`Mꠀ6^.Zr†Ġg1.p`LԬO.dj 1)%e7Y_pBcr !Df/Wi-xDE _S%{8 ?\["+On  Xfy{|q:t0V+RK#Whg(z,SgaTلY-PP+uTE<7kmؔ Ah7(q9Z!4AمJ`y^-Nd:u\+0 JEd,.oȭ3_qȉ/(Rl7 7%ݬ-aԶT- Ÿ;QS@BJ9u,qLq 1b̗/փObm9o\erԻ9.g0r0[cl5ȏr_@D#XjTr.I%.&nb鍡9Rb&)5,hVe&-$%ŝK˅s.!N5ж?csU5 6`_tX͠A:J+Σ 0{7Ĵ"6!P@EV R*Tq+de!7 kR[W8:P{bnT薀ԥ30 /+ c~oE..o&yqUn2D1 Ђ˳rA6\\[X̲ɽԨ^Eg؅'Z!\Q(^eqĠ+Fq oyq)%q Eu h<)YKP0x"ABTQApÓS(6q.0aAۉQQx¹J g@Q׀[s^VܦDFx~h0YyךD(J9e; UFUqPZc0K=ĩI2|,=9JpD``ΩzugKQmir %/TE&>z&xiͳ! ҍj%)"% Qn!"GR%!}M*_s fτ=M,%wqSrxUx=):vpٽqUܶ*lM|wJ7y|]jS$=໮{rNHk,5!Aƣ{6`cR[ |~~ e0%5mqϸ#p6qP "TRBf6j73UsA_mȻiGo jNTxj 78x6 c~3yX$>; QgaD2o~w Nb-EA\G+hV>t8KcQ2C^j7S(3nƃ-)Mu4Ps`> bXK6 |SD >3 q (: VQmWyUP|Ă n`bLfUʭCM YwC9XWX5=/R P{ )E|dcZ 2,P2:&`-j&fD6XyT<LmQB UK0U-͎"`ip B O?R;[Ug|$@\uA,!Pm]̲U0.[ O\ʥ?qq1.0eQ QKJߑ3(Bif='И1*>(Pp|5| 111EEL[+zc4zHUrAL AimZo\u=p u ]=b1WSgKOl{Q5 A!)5T˂ǸkfVa5v&uP~e0H3qS.J@N%èH7u4*[*<.bX B-q =KЎKe7^RS&#>`7K ԬQ-ͪ5G[ܤyMy nlȽUܴ)tmu.5-kV╰ w)xm̕px,}B,0^ DYC2KKFٹL9QS;q9L/"+&"~eqHrQ71 ~bD7qaP$8i 06ihnVYT ,XSo4.Eq1 *}̷u9pRʥUw  m~Idd}3@= >g2q`G`UP.*Gr}ʢ~'2I["˹*<Tqֲhy]Q2,^*N0a!X4+,% 6& m {`03,dJE50L<0lģk~j (s,T Իp\FF_U4UC2uDvfel(m {Lw͵_@~g 09|W>=xnfΠjBéz= J̓wWQܸTjP SPpN;kwT$hP#]JIHtuBV:1XoƖJQ[*/ Pu-% p f{TW0!4bm0%bvw P6 w,h\RՁijQ$!;\j jf{F-g8gl!ŵ~"idԷ.z`R.k3.ThNb ?Q;w1*oEP7\G fqi @na 0kpc .V9!p5*ToA^f650,D)-8&P@"*\<̕M @ľpR`2ϔ[S86,l~LL OQK.WN<754(U>u׈ڂBQZY\VcC :"x0yKw1 pf.ࢠXQD F 76;w95 ظ]T"AKpTJ} ;zr<I4!log=/R)kܠ90b"G;&Yi%Pn]halL¥˱ Q_.cfXV 랑 %pp n&E9_$ɺ,7.kctqV\.k i&Dp. nnT`ϊL0Mo0.#i45ԦP߁Yew+1qT!`rx3%FnUx5-RSi_nfUGm\0Y!}:8ٙvs1 E{bхK+>6q5Z! bLˈ5멆^*rO*bXplfumd倶2v9tw1醯Eg`zA qWSh76UqbB S,f.&Ņj}38X^^NL̹B``%UkxzP`}rw[OS&0_i4uYQS`f8uu,*Kq]=>Hq lOb**Ŷij Za,*kȸ% |IQ&m0KjQ[JZy &ޑ-&aƫA~iy;CWedQqOƛQts*V_V|.'uZDRh{Ib4F_tKDMjrIJL@gطp*bZ:گh>q*1505(a`g8NF^(@KAЄ 9.@ fd?ԍ@--UQ9B.)#R1hP%M`.20Pjs"Mbqkw UgD" Ʀ*V"k%wȋH1V =@|x{50XA+CzO;\mf@QNC5s_;LH8h%P)7-*Xno'S/Kk4PҠ\T1 tz8s^4̧S*ӸUJ` 2 PnJ8㋋PW%cUF!+?$ZƠva! 2i2SeEps,}8u~%/ ]nUcgLr4uB0o+ e28r@#fw2_k$ҠFx*6NūD22G8ANOf_®WܡG^p-+; W:7[85A]ݰ+>WvJpp`a XZ%>9G:=Kb ̠#iv!Ū 22~CL[ >a+4* 1_31(-_0K< |~ rQc蘩is0!dZe8Br_=&X{2c 3mI)` " .|NkJ!)"tj\q.1 0q/U{eO"Xu6zmy. _D(P[:46RD9M*fhQ N]A :(pa@q K;G2/|Arn]QxzQ=gWO19u XWb/C^? {1j<$Rqќ Ea BKz!'2j4;W2sT~Q\PkËNoT^P4i%R;$Ed-}S{d\F_]QxbRkh8P_hny]aOܰP發l-XBZzG8^ޢ,2r=pb=aQan> (GN`2zkQ)wx4jQTgeT@ׄ%H \ItpD-mmZM#o.!@s)׹K\8.u̴a4Էq9Ț˵ChFQ/`$t0b v1p ,$-?s4[~%ԷQXYFڔcC&@,}TSl7+-J }hK0'Cѱ 6 ]xk=q+̧L2EܹGYe]lJ5{a'*'5 bU]<{ƃ@]4ZKqQž6i[^K⁣Vnqj5NթX ~ǨEX0%Jq^%; PDx(>_'d?p+ i7ԱN\|Dg.LƕÉjGsK55aĨa,[@; rˌ^]Ep`ųawQ, |EǁTCaO,=J/Gޏ0ibDٔš2PNdrPwPvK6]Li]@Z8!PJ ~#A]K[ZpS6 Ybmmd䖅3ܠⲅu`!K#k=Z!<1wIlYDMՆ`C/|AZ"E/x4rs)}T@+-o7ImK w4WQ'l][&{E0Q&P붿kܭM!X,ݣ 򂩯/|^'q:G^b`z7)bAbX^[v<u qF ,s6N h2/ư!%e28ܥj>paMsܬ,]U?Pm:աDbMzjhAewsls"`sbĩN- - 3 C|B0e<&8#%T,m#WWP-Lrf#!`h=w)C嚈Q[1XQZZϿ*+j=m\5DR׈ҩS+)qSK=scd{$s3Q b-h9^XVFezJLJ j-KW-|fz_+K`å1-q.쯮ώH#K)',+OpWP8)4è 2D,Ts 9}Cd_n#FԢa]EH5p>j')j:qɂVָ^. (IJ] se^J/))BpS+m‘XqZa5 7 N(7Jw.2^@['ӈM]a?VqS͸o y2ӨyIz% 0Uܶ53/6-z6,K!M,`1214`>`!E#viط#@'((B0_=q,Y2 -0f*goqsTݿp"+5ddBܧ$NdDE-Sdcs(BȖBĠ*VT"u-@dIq<@ޮ6"wD?gW,}zgGgp7%A .-lQ ~rRL0jr BMECxxX{k\Ći8jj ܶnƗP.YpJhu!/F V q( 1EdW]6 v,>tn C4.YΣ,aK@ie=ˤҞiuϨ”޻iGRѨ qScx`P)Llx0Z=V! ͛F3;u2ӳC*1X h? AdxT _+z\BTCsjO:)`*c.eQ ^M(,d)ΣiQNҳK-fT0 P;JMT^oTIu F?9 㙍`z0V歹՗)u`/,#L?f }0`뜊[R' v|AkwǨerA6#%-`D:0=]Y}JV\{E%7q(l#jWZhF+WSb+}縏 `j|K"Y R`b *~dsgR5U5<]ʝAtf U:PLErK+JvT6ߠkQa d&VsRnSVy ?$4zִP^N%-T]<,VL]OJ'3b9TG 7a[t'dTVE_B-iQaU2L~`w/jF9-],kj7,N0lSFt[z/M2NVؗIxac}F,]"1%]&ur4{B1=-Z4ZQ|0x3bR^\-K6Nsw$"Vbڂi(/G/_R9MDp-ۘFtsX4lA\Jm.IOh|â ZY{9ܪU}AE! DgOA=GqjFB|@Ĩ a p%[" ̳ȹC58uw+h@[-| |AxSo>difο⒍uQJ#]ZP77Cp97Q; TVX~"]WŖ5r3DU+e,~ʨm/$ӝ!C%rVz(T9"Vln>/3PEy,WPJzr{hiR9kP%{¶tLHcFܵ5w:.XzG(m}Bm.ھ ezfSd3\ş%epD JuF˾f1K!cpƣ~:7#م;Sh'Ӹ eu4eՂSP+=d˘0G0P*=?IsL>f{JsxYdA%dXe׆b1j1kj\Kn#jZUONC"^aou).!lU*XRX 7ߙ+Ja̻&qazPP=(P6Ɯ6q.\[~dpn0! VpR ۇ{c["1 rh⑏ʷE(BR}!l 0!PEc7GBD1_(AP@D#ԲVj: gW)| fg{.[ppfX M&fG1^u20D`ng1s( X72.AFzSw.!. ":j#D(2ԩ^a?bwO(g%wп1(mRMSQ)J%,9-5, )/}cb`"y. iQ//]H75o^R=,Z(Cձwg-Ɗ!Z < gVCku_if/CF{勖%1\b|@`V " PQݽKzzq]/$VU7Zķ ]zctsd}?1meBpIKxX+X-!TabؙN:UEEƄLB!=Eķ݀UJ?$C+U*(^}\ĴòTs㸠8`Q ucwԥ\Š_ZQ%CgLA\nnX2 ]1+=B7f`+ܳNYm&D1W e ~qxUAl {v}'0q %;DvJv_ (ͳsYNKWn aw +Dj[NIpCi.ైjeG^FhNN5+M#$pUMɉJkQ +s>R qRؗ/|C+n*W0 [ O7"ܱ+u0 u mZ[<P +Hn^^aD. (;%p!k7ܣ3 FPip*K#6!Y P?(n )p稭x+?PW/A Pt4ԡt'bcFCS#C%t|Gor+..qI hݲz,@&@N %lJ㹞E㳏pJbߔ9ѱWܫ^ݐ7Fa~f!Hea8,GP m2b.]8B 7iqDxegԹ~ R ,~ Q5 ._rb"= \}GG06uML{0U@!3喠oU!%k!cIn F\eQN?3*zpU TG1drq)h&%Xg0'u{=KCSrx=@p}L/eV 4NxpbVT3 ԾopL?Rͅ?/^0ԳIcOqh |mC"vv.6\;Kop|-A^3ʁfghSw$ىcQ]7aXYvTx%wP@G(Zi{, ;/1Qq3Qמ#8)'\Y66siGdQuI F0Lt5W!A}(vCЋ=kqfi- h y{Cd9%w=3`(dez3g Ž}Ek#{boq"T3o.)Ff TSjYN#W kgoԮZ\]1n%[cz#/)dž=x,V8w W=^FiqPdn SV2fN~$@#`N&m6>ȩZX\K}&=FU5kyLQFADp^PS+S''`/|T&JF-詎!x=LTbp&P7E2Jk"U0TMuQѶ:%L%,0-AU @D }Øw+`Qu L;O^ƃ4 P{J&y;^`TpJ,2rP E7Ez1|@6 eU("!%l 4u. _h[g5 ,7Jq$1o|0RI5vPS 쁣.L* g\_0mGT}.Ϲ)LPD Tv3/d#ǎ_3߆ WϴH3g0Pj6ps;+,:F2 DKe7pSI UdT Q`%IvSzqAX9b6<0iϑy\RlsRKblW J*V> 埘UD{@9fX`ġ|gGQ [gd{5#֦Q[/ _pCql1^P{6 eD,>" 9(ć=߫RN942pè}Չ2aU@*-yYB\-c)Da /(}dS#m2 ݝ`bKzBGn%)֢]e{ZWkSW'xfR3} ;܉P$G`,+@_=J3@Yޠ1~`>Xe& kҹ/*RɇܹB/|fjU,[YK!Cqk=w r. E! K#0a4-R;/pf˝.4{S_Zq1!dpxq*4hla Qh)L"A(稕-kV]Ed .sdpBQ"Jw4U_0;!Z:^TpcpRUP!Yr#FvE@3 0]} qTJzc (,chGx=q+sfY~e' #QJks>v`DԴ P5E%Zҧkb*YDp}F:a]RGD<^͉yTP(4J9Z ,1-P+!q׸>`ٿ9aF' -jtlīAq* `RiQ;^f k5.]^A@Zs1B앋b6zO $"|7R0T v/׃U-lY4QŜ_"9lDCq1MvDgD+(Z2?Vv>f|L 0tDcD1o-Y]ܣn`T^8-L[UT_O/KeVwh3˂jTTNV={W=@3BwPAZBWRDs\I%g3ph+(m٧:׆1P e!o8: QNamE. b4z%lFJ W|.@"2!bp]O&DLO4ĆcQN U=h %*֣|E56xhjeԶq[XIO?pf"TgKF |@tCYLZFСm{{LB}3%KZcQĪ01T|CSy5X^&rK9cL52sM; [U-{y\FT.#D6%.B,7O$TB 8%rFQB!G*5 */ᕀF~9LL)KgQA%|ZLcZ޺8*l2y(7o]CPLKuh٘\ #BhOQ B, qSJ ( X8`-+y9MH8Ds\򾩈.̤2 LA̭?&7}p pK[eP)%k C%ISB"1<((xq|o3@o1Ph?p5ElJ'`YzL퉈L8y*40^< i,nQc[Ÿ-e A/׃x ˌة;P/o/h ρ0p-+N YJ'50V1`]nfU]ĴdK˘PϨSaSH[`"z%N#+gHi{lR 95vc.^y%!3s^W6,טt:qP#GQ6R$Ճq}EQ`"̙H] \ UA5,</rGHa Ȣ8BܶuD_Q0gܮ !xeuH\  ]Dpx8MV d 19/#-0`̾!j6;|ü߁ μjj]k)bE;s=KkƢke4m1.]cjmIfp%8rbkQv@kB yRv2QC^ZE2Q^/Ku{Bh 8fsT LfPX6 Ӊ@0 ̹hJe["UxP&m0Gbo{o]{dj~9G]_pv1G'O(<$voRU.4j_pM YHY0W U P @1n(@\yqLWM*dGqpD>7΢=D`̷rՈvsLq-Vz鎦Vxtv5{Dw^+;SJK{+xCޭB#eoY7OpXɀ`-4kls[kosaWWlbb  EAmֺ  }BJlܶ# 3>I~tޜB1e+S 5)9j {dp  Aw}ƯG{Mx>q {iiPn_^]Bޢ q-)-uHgRH5n"V /9 ? q*1J D! +W!wY-[(1[ļ-m.Io4; 舭ձmV5% @e4pUkLf x5S4;ƪSQ^e\FXDQ똋,BY>"2wl+˜A(sJ}Qwc{b.vK`"3 tf/.wr-iG9tUܭ%PP/7]>2XndsN! 2˜~2_1*821RJ F-쓨&&M~u[yqqop.SFʽ{Aړ[4C%7oS< VUV+ca(\uQUy;U`$rLonNoqyXsǙk幃g\M F߂Cz"@[S^PeUUW؏q^^5&.vCHQ%k2=Hx.F0ڎ%WQj'|F ݣIrqeU_HL:E.:Ial,ʴ pF:!lkF"nS. pF9xVS ‰Y-Y?1i>^*yT* ^upZeV4"w4ǹ-CͱKý@3GvdF wZ9,F]WLEK%5<xzr%r%6`208*4̹p!\DzX;&eܭ[n(dx B Wӂ){ .If @X5Zϳ5*j]\?To61S)s,Tqо'Qs8{CRL:!AXdj";FܡCu71W+H!W6xԸ}A$4tu.lXپ"[_ ρP0_UD!\[0u@Qkvz@uThKj9}^P)Rp8ĨyZP%~$R%O~`!ǶK+11[[q/u}# .ܸɓne-aRp.X7CzI8<*_qDjpNebq qўfw,o:@;5/Pw,qRmK;7~a0 }K$WˍQZ+-qV́Pb}hx%:1oIc~ˈՋ"sPTKpK2gp`+l+.Q {*胞/r"Ja_pETᏓꢴ !P[2LFhyfzpMWgyxH.%RToU7dALOPYg̣_#懺7WBs2rY')|L6q @ tRV{5!WenEG)P\)JVJ Ced `u}ê3??p"P\ݟoE;@ّ(?s+T vDJD -uHlybTa| bQC+DuZ稕x3S`&es^ܻPw,a.;EEvTovjr8 _3.sHP*bEP{f KBH&w?r]lV&NHXiv)ge ++Q gS:Ժ5')r2ujGَcW)T*`_s5q A OUKD9rވ: f\1hL` 9_p 鸍F0i߃y-x" `p҂ Er04TͭOXlr֘ۏΥ-K69lNY]=( xVŵ7IG2 拓ƢՋnmRs~ 7 .;#(¢f72˝ f1%sc`., RP>(D\UwUE*)eb]*c;?%;iw8d|&Tbf-p`P@34b%\N]@L6#q.ܡFT䌢q2σ.aCxԣF^3eW郼sNewSۨ8"Sjbla|Ar\ij$m-lce{P Ebe_;6TխĊ2A_l< Ugad}D(Qc70a/K9`m;bKBbNacP,2 ]œTKT}QX6AaSLV<% +ŤA Yc^5}B[.1(`-ߝżbnMw _qoXLߨ7D_I.(lzvDW1&~ͅC \x8 QCE6<Ե5ƽie]{ʏ#Kw3DLTvT[q!T7GL[q&*Qy:cVZ25JTTKe 8KVbS 2q"Vm4w7\ BIc sLJ514j #_q N gGq\(EM " *nZ{k2]D˨ m0?N/QIo 0c•]9Z&b=4{F|3ve`eQzr[fHEҘh|ȮbHV-)U5 1Ae+lbu&5&khw(1@?$ @q 9!b.B8&$׹ ,і2qzm98U4wbگ "PElPپ0`վ=Jg2[)0ndYmʖ?20CMK2\Z 7i &vcE+=ʬYUgpQ g`l˧g+|ER2VɽLDV-Sm-f}cd /SvpuөZZVBDXUL71e'QkN#0JRֆ`r_:Ms9 \-zDd70Q2QuVhP5* 6峰j\akZD aqD#X[T."nȋW^,+eJ梿i{a #n6%[gng|GSn 傋n uu[s Bz&x5Y^fE#4XJp Fshˈ//hP9v 7aGD{+CN{!*^Hr/ (<njg3-0] +V1(pCU2CJs~To4jAUkCX¨کqj5kܵ傆oF%hh9Cc"FQ MU +q J:[{,0j4.D#ӈ8'pg/ p1xIB0t æLy9{eQ(@'`laQJ`"U2JJxeV#H'fp9<7%A. Ak VDvͽT|~S\nS\[劗.ȇUq тp䨖mR ׎q[Sx8c^3s^Oߏ7m9_Qvs6 hkn50Pk0s,[G$d(_1I[x L@KdkԴd9+,+% S['}ʪl0ug;r Վ g,CD;a>!8 ⤭QeCajYNDQLT;'K-e6Yh)zA\C4_1;X`uqGd= T*0gpHSg1MD\h+1 0cxZd\b:|+W >5FMTYsGf*ehԢۨ;1fP̧4 GT0Mx!poiELwš׹\WЖTWp0fKI0BKܣJ T-3 }8rojrX>墔qjP1eQ@xh0è,ϸ"~5-^' z / 3=iԖ}#qndpq0\3,aC~xPsEFMNx"6q33^qq~/UXxS[nrzXĸ5P\eE Nujqq{DDPV9W3k A{\R-DDQg1 !] VT efEߩJ05)-a>a3Aa,,bAuܠ@R+.*ܫ WlNB`1+ j?-E}0ϴW2ekZHaa E q rhoLU(!eeslR\27ĮsN y9*!\GsA&%&IgclKw l_rAMs1-^* oPAY::P̥I#P AOrKAL+: m hQ5Lu H,|-҅f!1x8Uin@>=GtOp)y% +2rN ,G0D[]I;G|EiaBlhQd9!3Q`I@ERaX5|Dzq4y'cgm+BZf02̀j- n|!ԧ2J%֦!.e3⮠qT^^j9_Êᴊۗ<+2kJ6f [[̠Zos" bX7B `@-.IgS-B0Q`霰a]^((=VމZ"JP۸%Gi l&5/5+9/y;5,R(HMZ>,G]~C,AċLqj=A:f+s[-Ko Cj,efEY(bɝP[p+Oi'S;vi~BQ$y>yY(6KJ8eÝJPs,=S&o,,aTAJ.࣯#~`^ܶdo7<^ \<N]1:0"kJ`qo3J-g,Al|bR5SD4E?Ro)B)PQ-o0j1^?2[AVQP<ь9fQ|EF5s٢6L{1++8BzK6|olZ&Q+2 `˶2 ׊nܧ30kyeAρo>)Wp / nrsHFtPcLޙ FG&m0_YmOp_p U/TyۭTP [w(+ܭa[0yw(D^MFp-zCVr2XTN Zy"7BM[W hj-e`wVu w /ozD ø7iQԠsԵc$jXj"x" i S2TFxe@c0[>?^. MF+,jUsw?@{0/ (fj:0U);1ԬM#e!n&Z>J̱S$-POp}FD%X  f` L oܴ({FZMn" &Pp 4F":T"e OE|@UL#jn ̹[J0li{>gԲlfP&`~ej-AX'0 ֠,|K'>B` ѕtsAXhSo$Q@b\3 ;XǨ, ئ!;QszD&S,!f}KExH{3*m$K l +\_CEsx7 (V&.\0٧Yz%ԹmwTsBd=DxBRKx,> 1劙}D2V2qqD(cb_c mADۉf%e"D &+q+ǹS)-(5 %7Dk&FaA4%)c#K\]ěl2-bYIzM]1*ۙljl2ʊv-_Q2jl]sGR{%@{"G:2ʪqqKz/o  0 ?(P߸ Qu.PKZBu .&2tNqSWKcBA*^1eVHs` '-3B0LJsk2)j 3s-SBwԺR۸5,j5jɨ#_w=?^w;XbCvf>935+cU9Q j˪K{fTݻDaj"-3(loF@e(cRB֗] 5FP-ӑ\{{^2:vD@V#,Dsʴ.DVN2DL8 D- *U`D%t/%/$ĩ\b)6q)g^ **h=Jw_P,6w(MG3lU坱GI/@8* @EJQ.,UoSU1p>[\!F`EuQW ]A4Mbj-W,Q[u/QtUSU/j2P& W5QRk:5 XWq3Nf ^mcvUUi=ۢk8U(.ު#¸bTdk}hY]@7OBr<0{gqW 1%Ep=A5PMʢəpo%A.4𡕡3: 5 #U`wS592PU/`XçM{Jm|FHOl ӜrC_1D5[3j>"h,Ek)Pr4@l&Ya&Ske/T%KUjEj x̠pk+6jhoܷX2kqTcg SfOPĔw+3*+7ʮ{}T"Q=CVaZ\r2z,-52ؾjkz\plܱe:g?*;tL"(ITj8J+{C`Vuң|32Y n SO$H~,B ;Ĥ X+=ţq5;r/q]ogߨm+p ^xi2/\GCN< nk+^ .S=@Kl"R``cG_F\ᕋqS-23;M8eS;)iuq\gW0RS T*7pN\ЛW*[As0 m,e ͇))0 bƫ+m)zPsS縷jU~%Q_a^N?5pXM~LQF8 zP{~V^67*^RS_:~cKp?(6 SG1dk-"N2q#͛z 2_ØgqT; :ҍK q̤iH:-12PXBUve xV.ac'=`5ԧ$2;™%zLj4YJ[`rĥyI=p@=D:]A3DUm*c)sx60mY_9*ppݖ0gF؂PMͱDŽ& ,qqss9`HZڥfx \&Y{-Ř:ķqD\ `Jxlf!(>tl:H=﹮) U=ʅᜯVq:)aolDXw  yX}]VYUH&ܠ+di1_0NB6fQfC|V쨬b`{6#}0#G1-&[S0Xiz|0YD f$=İUmAqo1,WIQ+10|+;< K3 MG9 DD E*8p=xZlwP-`dӹb0( NY0 .c- ,`R|G. pF4; w|w@oqlwQ.jZX%ˁƀ~:b(md)] +r1#L*+Pt}`%- |%*c'P_z@5)a;`C;1(wDLB^.QT;`K2@#xwWk\:G%jW7RGITEl0U^2ԹB @Xe@D8 U#P-os nrg) ~㲦n w:̡hs]ř^ubӸ329{b h48ܼ@,081JS\@# qpmhr}&9vFÒ r5Uӄ/3ׁWsN%lp %@:TV;O){&ADx)Q@ O;`f+j:u78JųOrY~DLh bݞ:'̣,RX  MrJm|n YeYtKceEEԨ Ȧc~ /PR2Dr -lRl}F^ƣ+m~`sp[}z|ƋfufDlnYol1Ŭn! ]@743Sp~Ue7x9ı[K};?1ҍD K/\82pp<(`l̫UTiN`pql*g~# qrCr)C=(G/WA.]j K7s1|xAŦ%^Sf1h]K)]\ˡ d-e̗.~")]s2+S=CB8dqw,!P-\᧘69u Qw*FWt&1 jL1U\ɏ5m$K 9➬rjF".1P.5&a/8ŽqܢVy*f3@lVf?4Nr4)7u"e /0QW &%@ b!_PiA p7/T_-x[`*UƁe1kca ֠[۳SWp \Ļ2gr_.sc7m=s7!{`1V+ㆮؘlc.*`3DT2WY鹄U+r!{s.i$ښb*\*FvL͉R1-ۦnQJr Z2U9@b'qb] Qpߚl7 Ƙ㈯EMŸ50*Dm Hasz0s((<)wU A1ы0p]J#Q- e*e1-)AM0sp%3|LaD |̆}FPbqZ_pf̺ʶ@[ޢAc]@y #ĸ>E+TR\ 3*\k_[p/̮<؝7qGpL^,%Pb1ps"n i׹s[f Epe}n@5 *hx*qIq_Q]iã 8QZ,-@$&2؞PwQ2)~A(e 2xERIkN"KW4( C`d%/qy<`ZaoׁÉTxneJ̨ʘQ M k_9.ڢ;B-P@H0V> u P$k3 ԡ}ƱLs) &wYv0hpڌ@5’Lg&]2Ƀ`ljw)Q?EALܲV]Lb:jE T >g\L6 Y*d;*?FƵ u2 J|)ؐJ[}et ]FKy@X3_(5 40G6Ffm]US8=X A'D˯z&nYRBSe f'Mp-q ߊ;kgǂ k$U,vQmk hT*C7Gkk1qb-) *_GHn_t8J0H&DB72W2LA^wj r8zsoH BcDQ0ka{DiӋ )VpXxS<8(_ 0{WIJW5V~L͌0mE%cVEDΕpq2=L d_+ĤLՒ!ڞMơBnQ)ώ) E;ChF/1m%4#Q|Ec7U+)WU/^ fSWn>PO fYsQW-J,6]J TZjZ'%#u)/"W@J09Tn[upYF`,@-.ZPl Q8Xōps.n%LsnWpC_.%!HB~ҵ(9RUn`AL :)+иNu׵20nx(/70]}W+:dwr˴^+hlPJ*T_(j¥6V/?efg* k5A18v楻@F pb{MF.^!̵x*SL E(zx6Lfi^q+ޢ2NK6$-aO2P]dcJ00m,}?i*^{m(_ ز>B * +-DM=w-)ngkSIj%Hj|c65ҸQItexn@6ԵEucĎ]xE^p|q.P@ ,cDww&9E̤ܫw5:`8lRKzD.›b >[3xPٸl.{@fmIRw(Ő 5רe71}(eT*8%[u,nTR  zZ_@Jk`:qhj 86eT\KnY 3M}nq,HRhK*vxq&" 8L^5'|ĭjX*u3 Hw"Q)Ax嚻 }$`N2"SP-@g}Jr>Q/6xꈫ_Dl`e jB|C@5 qAQ (JsceYg]rb1Q+J8Vl/G*7+!&XPĢ稀 R .];7U+:b & 31 /AX*TmԱIUbyRB)Z+Y01A} jjh5hnLqˆ mU0@F=ݑZ53]ܱb)1DP|D\ϲ %.Ɯ@XW3+IE\@*Q %-U_/Em$ ˸Q.`+BQ8e|RC DWHlv]pj0- <$_4Ÿ"ޢ]7(n"<$\eaP-ѹT帿ٙM F:8bb5测K/ܵMvJիGCS@pV !z f8;A*BGYG=4Ch5*?5J1h8Eu,U}˲2$a >4"q G03)eIl-}#^Y8rhRV{ [% "8^2: ;FU߁]2:fEOQV&.R-,%ߒyu37eNƫTX:W&?F3ԥCc(߱VbhGj =)CC. K :#ltXD6gzBlKM%\[)}C+`W@id,bYgKP~fCKs (p׸Q D!%v2 sb`z.T%9)Dd&@Ps(€V5$Ž2XS.eؚkg$BPCyP)]BAPW#xb9`"To]x׀LAj*;l]XGv4ܒ P7Z=)SôŜoS Hrŀ@9n;1iL&_N9_ᘵbٸSa54R2a0^XvH%LN S(?kT:FIhQQ[Rs$'W5q8c@0,6J&>EgG#9!@F՟S㙃 2sRn XNK+ӸJ00p`5wSgXf:= LYf%)^A AoP]R`k09c`WRsn⸇PLqQL-E3JY> E_u+!Huq!LG#\Gp\k7]A }@*eP2'>^"#lx5s>I֜B7(,r#(SEӞ~%qܤ- i-,(,==A>B{,*.ddߤ` "*W]Ӓ% rRaT3\DG09"L@ B-3PC{L%1r@Rڦ Y T`'Rq]-/q{V| eXAB'PSWi|x /)}%oyf*LJ>/(G(q fܶ[0s*$ DJq u4@tK:mqPj,Z1."+` gy_*\6g!oP{*_C5ųBWcq\CEvd{EU:,)CrTUc\IV0qd?h eVwj6rͥCDCV{#ř妎 {_=AP MKQi)>)l&˵O~>&wQwv! 7+h` ˔w tɗ5Vf%/L%ihPn##-@H[pZ)h  -PT 2 R0-. u1wns(u15WУsK~IP"k*4kGrKN^dE+osygWcd8S["*{kiDB&Ŕ%fwgP|B.x dVڥ@?`H"!5poGJJ[FY1̣ PdS(G2p1TULoK`,2p20?TK+f4 7ft !7AB7R^DxU4 .x TXX;JCc}qpA|w77WoVgp(Z4+K7n]1ZYb uTW,p^9Q2b'Ә|,Pߨ:#?ZɈXPe0|@C"=JZP0gq;UxJN`75GR36 LdF=zKZA,? B!&C&gFIggb?dc2>bA4;Bklˁ84x[:cɇ>Rt[4ܴ.%لEp ){2юPe3pjo+,\BW1ko0-,b#Y&Y)DύQZN]s|-bV+R[+Q,#+&0 bŽD*q?R^!7L=,$mew*~hB'feP]YN0Q0[zcD#T >kKÔ6 uj[dQ:47d[o4qY(kK7>)[? 1W`r#B Um}@ܢW^+U|x%u2aTq)yf9_rT4<sIWi”7.+fQM0D2dt; K*<*z[Tmz}–K[0 "֥ch\28b(m1|BcAnC`Q`2 ۽{PT ʾeӥ1J/9d-)9\_`Z m5c*&L,j ”rO+PJY1sY7 ܮ!䘴5>fUs%!1AQaq?36lE`B!-5k, тb ,)Ok P*&~p5¡ nbW ksH!]tX1N0:"'#$2:M|uA p^Cd!Gp EA_E3.W8[0GkEC2@'"׫~y2&%$=boK?|PDp0՝yNG٦i< l3pc5K&GF܏hJ떤5@z wF2^cAz 绎$@N2 wRޕmrfc"s1&S.ekmc681 wlқ늱ƪ)Lƃ\fF]siH`B/S\) ;㐱10xƹ2';.C2s0P#6GS6Fa3nb3|g )='$ 79/b s*mr㠅 }ř׮r a򍆨a( MaekE&mt@?dKWߞĻLY&V3}a:9 Teop(ڌ9h (`)ة}oo* W"l lY#W@'Iw(%6~8`H ѸxSaysu&fR_=@j\PzC&N4lHm\ "jWx58H8LW}NJzcF~X[( 3# {&]*e\qJ rvDo]pt);F~DwYq[ ) 6[o}ZF5d ў  9}Vjt"5cK}{|rJ$йuts[ HKg9Xi܊2lGP2=~=ٜ /bْ}6dMg+4$Whjt_&%PԺo$|l׎ L1CXe2EИsO|Gx@q-{NѬS1o/?s1ώb*M9}`sF&$:7'ьO|̇>W|g|Uб$˟#b4e.wx"rJg|,TQ$Hja:ƸKsqV-nwJH3'"L|`ᣦ dt&s|fAZ4>z`oap۳% ` N` ,9P n4࠴+~<*M- .ء|xTPR\0l1}) ?bE珘N|޿"z8tnkʸo#癒G1)e>~Br̔Ykc,5癈4T*i MAY=8R!rC㎱&=wzT&<!L`:0C㶥 qOG'̵< W UM}a<cttO((|+3#aכªa]HG9e =SnYs =l?rK!.#,*!RM1L`3b8!}BA❡0vp/jc5(,zSZb` )j?f_!9)CrYqt }0d- 5Bd(Fnu^@7tNn#XݝzW޷Ş4|T!7C] 017&WXak.Izgf_(9e|W_v }LTO;e `56ߗ$u N b>:=y] ɰh{SXgy_sc/@-/pp2Wcnqn:5ENyJKB{P,נ3)ˍ GpT!ԯgHdnݞxHh焀AH:NZB%NCHKX!q" .B[❸ o?A E3of1ʲFZp䋓;q \|cآfnrc|pj2j\qS,dC+=SAepn5)J/"m$3}s,r0hG):Z73 ̊v3!P{B-~gzX.Iy{E[ :㒣ī^z \^7IA,X.BSB *Aso$OB!F7Rhݝp4a_A0l( ­Df >8!wK UZ~qˊ^Ԙm 4\v$cB'l5 :}|BlJ6CݼE %iA:YQ]9ٯĂu$x_A$DӎEem7y)8vҿɯ((_T .z)8H(\/pxne oV7~{ 0d 0ǟW;h [qAph5?0\~A)Efx81:\G#PԬy ЩU8Jir Eq.4Fux܆f!xZ (QWF s{q{pV(niBaToi 'űD #u/Y1g4d(n [ڡe͖x"BqbRy9KJo~ =Mq'nIM;y)~aa >4)8EUݗă{ߏ x1{A=@絉]|g\%Xϛx }5MYqs.rH"`o?*y;=$C?9T+$u![ &73xo#n=v)<"&dYz@ F׆ZcBI]qjf)Pŭp HU#Q2 jc+:S#&q:^TK=_6qX3'I7%(ΪpPr|d( +gkFㄤ3]*Una|S'Gl\PB9;qyO۶2x|KNc9BJHɢ?o .esD@ ?$Jg{Ǡ.jpB\!.h :)hNf3;Yc*jg-h\ Kc{Kjkr1alR@O}!>Yp5p286MMcZOt[חU*}})34Û;\}W9Ƒ/[2y|]Mۜ[Z _}` H̾%fuU. a<'&mU(j"3;ӣ;xz0o-Ymrg8y. G« G]zqy'#i-.5sxo `t&18ۋXƉHa6 c*]~ubp54:Q({ZP::sA@˙|-1#>~8T>87qPZ\$َJ[µ4eǣSǾ0,p>w"210D(m[gw|ڡ# C t ppY4?D!?<<`@۷T0i1|q$T ෇ iCsyE ޹BD! HC:UZқ.B8x4@L71i96@Xi6hxh#կ| R&% @6[rUP]n_V.+"V"g/ S"w?``>y]2:rLc0/є]XOu5O:q䳂D t+X;:%gh48Rշn9P]0wÅYGБ¥P4Q<=<9Wo[UAIp<9LɃc~Q!A0qd xcTHQ 2́o,Zd={ਡo:"&%aB$Eï$WfCK̎sL0 R{O|j(=jx(SJ"N h:F@Q{| d\=>3mbk+<Pj=&䔀fϾ&JKH>u1׾ypLc٩Y"9x<5rdš'8pRu;.>Bpb{"d :ܶnӌ(̴XDc$Vq*EU)3(%500JhLH|wÌTA]so>|CQ٦g8B+$Vu %S0q]LpCO28 Ԑb\BFgs`OǗZ@5ҵKk(Ip]ZxXbD\[\^ѝLmai!*LɏW>-.3ݤ"; AbΚfqzX Ըoyy),J7nζqFb1>|@)O c˝z|cw7^>xݸڿ9L.zÔz,K0d ,kIk$O>,@m:6J\qd|7gs қ7N懙B&HBS 厎P[̠'t]obD]t2HboWPn%tU!L>-cNSP.;\W̿?ש9Zs!~;$GrfqQG"˜A"mVhiM.׫/B@ oNn]'48&31лr덏P\gGeEJqO>ۈPn1\rЭv.(H{M:c(lqJ”)Zx7灋X;!=[n\Y*c# : C}@i=bgg8eSo`S[1|LhFbҳ 9nbG"bC#ZG,$8rV6[xld.|qt9mչj4&p8u8 6ϣߚ?߁3JC+C7 5 L?gl"3vyyX&:+ tko8 4m#P/=&-0Hp!T3䍸f~9Hǧ4p V O K>@3-yh5Ռ9}q\%JG\/ >sI2 :Ԣ^86ƺf#˔qcr8 N. YBY$*/w'qާ,7}ָ#DB*1)Hd}W<#z\Hmٸ| +߭\]$>0kF#XH$=<n'cz"5ĚN/Au?Hm3`}wk,gc138o,&8gC) }1S;!Bu38#W 1ovXpa! 'lGθTU;Ͼyn\n^[<-#qj2o̧5  Y,=`ƿ^yZFuxo4ֳcI+WD)?|0j8 s<s>;h)q;4Z`Q>B8 ̣R6m g̗G |Bڴ?"+z+;ώj.;=E^G%|q9ǭ~9p%r8ՓƎkFf||ijw.~ PwEé A5!6}' &xv Hc?ZՀa)u2C'K)H /B (+s uBpo^58 C4g h+Yl9$,w>u#0ߏwj!d%-rBjʼnMy'yLؙ;cJ qL0_Ga4EbqF!?Xp xY^>X3Q'PƳ˨kwǴ&RmBɟ/ Ap{)V[l]l|$Dƿ\PoB0Nb]B[e3̀ě S@އ$QR>/9K5­ց]@/ȣX'J3ĆraIGJ -p$loH>Fi6 p R$&< *]R- :F;< ?# }4 W]S"G~cxM}r$ <eB$MO\H0 i2T,=~:5NP^ϝ OiSux$ҁ(.S.uxA'|;C WI~UŮRw ee a &+]\DžFO]k @.J.ы8i vޖ,xI4i]hppx]hu7bLSVE01D?\(l 1OƷ($*8fFqM@wxꀴ9.8x[k_ 4F΀L~|7#\F~\^bJ`qyrKجPX.4ǎ01젗.}q؝;lu1JNHAmf.>`ogιBP@ry%OS,8})]Tn/ ߞk4:(T*6fHTđlu\A7l,kaYjAp_* ޼~~j4o¯%QlMz`[SUAmۻ,>QKu8{v] >µ480'8>FJB 霗8֩yװ|n5l *α":?%4d93Wy ;:K1"gN]y'lfp\ d 4IYTCbFk86D"ɼ~ pe+9L8xߧB!0[#rc>RZ3w#>'qHf>wT}@۬11T 4LYhɎ1b, jb˖XPEB$-J%\?.bes9Ho1I?F "= Ho4/\SR`0B"FW3đN~UďiJ>?^j@V D%`}m; Ϯ(i..[:] :1n|=` +٢P5͞!sqVU&LfT6p!M@6^<g /yk-tos+™} ɿuox~!§S+y@%enw w_sFW:f?8*2=g}r )=x4%c;WIH#ǃ 8#)qlX;q7(2.,NWsP9vWYb Dz_Ԩ*{YA)Z qb:!p^.#CS |32zNc}с0i=ƌ+Oy$(F`!Zp$bm18t׻s<d1- *ƚpB9g2A0V-$̺WnlM:w !9R;Z脢QE2eڣ<BwFeSsn-Ôc蜼3R2y_f\t փx8KsۍOP#쉑c&iC; $R7ߎ ;\m<,\?;JaiN'R3?]\q,)LJ`O|d^Zst٘Z7W[`6 E֦'<wh^+Vn^B!2 =y;S<=aiБ5p : 2 Sekز’[3Ʊ̭}<-ɬ մsO Rf=Q#MK[#UR]ƣ+`E>{ͤ þ>ξ!>_mWKJ',Y,yyHwRlʓO(bO_Ҋ.~DL[<{'e[L-KdϾV3'W5u9LNޱBI1y46[yx.Qd8\UbU Z8:ˌz?1A% y9,Mվ:.&G8@x,g$̦>8ˢ0:<%1C"d"햸*G>EjEw:=\HѩL8^qFzO^ sIdais|E8k*MяpK)bMfS\[+1;*@Q˫uɅ mq[M$G>g\dphQZ;t71x?SEӾ,A#9 )l_B|yZ\VH@ǜ\@1 >p$}!놇YZ,fܞ^. 21Hy[H1-_h$e e1&*Y.3޼'0Xd֏~'$Z{)#aG)ߜ ω+C|q@|)'|le)1Xc,oONw%GN8jlz"`l;MeyX.s˧Ix_iX\cF& 2OD<Ϳ xWjP [}ʓC.<xRDWa PB GCjhm+{ȁVVm24V` N"ii{?8|ѐ#WӋ#%~An6.;'ag~_\5@^<|RÂa|9acEҷ}c^F dGNh}Q08'%;p2XS^Ex,4U&JHX5 !5I h M33 E&pGBϩ6"m˜1g͊*)\"*;4=M'QDF(qѦMkm+z:@d|\fP4CXk 622nO7;5_i& 33Ijp!AH$781"NL[|p8,!V,mc+ ,-\eADŧ0 iG|@q>19eqV:۝q>]X&vdq',-\P2w} Cb)8Uئ;cpϰ3=Q|{5#qGyɗA0h{y'ML~\qqC[QI7WD\@d0:t\Qg PnC\Q'F(O͈[!^xD-g1k]-CJяpiBrG9 W VNq37\)8I{Xiӷn2xf"%8= r㹟XGj"Jg>}o&qg߰7ʋ^o̐!-Cg C\qʚlr[ܞ$02vUk}qf#V%4̂e7S^FAq0W##-£N!O.ϬchtgOEM90XЭs/ gÓ c"EJX#>\dWD sL\U ]<{֖F~#.S^爘u3~0q4ԦQg'rEZUD .\TnAufx1ޙ(jc6k{m(Kw<ĂXWl:~\뮱<@P5- ,ǟ9JʵlP:I~\nq)I<ȓk_f;<;?z#*#8Tɯ{I[+k@qLAlx@~?oT5ͺ0q&uDT,[DhæfިE9 $3gD:=?ӆcQY1t4g M _yhޫAYt$Yej5wE/V@`p0_4Ƒ|c|o ch#lNËlLX35c4 lu\ 2À$]7M [\_!xOSP._ry03Lx 0V=0 ,9;Yqxq甴Ҡv.G񿷳iJ NzcBņvZ[H0 F9F^b$]#$3xxKbM?50 r&QƞirgS8ZjF8QQ{~6&avC`FA".3KWELp?sǝC(>awηĬHj/s&܌"gh tpe*91y'іh} 1gx kdI9<Uz5/ܛbwm(ʜ0~w’TK^,J2;U2iÓA!p՜|EV=jn |oN"_Yf/T&;cPBLe8Ѩ3r|k\x !p=|㒹#c'g_R CRk]g>_ЉL:3=(A1ɷ*gӉy1@_uب:Y,P/'-5)\G9=|IŅ3a |ԩh% gǾ#P0B|.I_/J4|O*L\ou7\~ 4ًq@@ 4r*nT7|= o7pd gɤx"Tad 7r@l`B]N aZ"%\y90+#9G=ʊjMbvE‹ hO->1=#"LJKUz tc9%Jq!y?B`y <4FPȌɾ)R[1I`%ƞ84F'E EtqSW3<ؖl[c ۨ ]+!8@ Ox!q"c4"@%sۚ{x)aD@&& 7 :Ĥk_aŧߟ<}>}r3<%);@ :}$ ,HOq̆W]H[Cy;4;reHH€J7^N)^" tј;\ߺM"Bvz\l"O KV %CxOX5 GrP$߬E ‚ j&KLAME&-LǶu( (Kss* _'RI;$iC{# =8u&0 ;18 aC>h;U'\P7,p{ղ*V*"|:w!t } I돿ΪpՠHx8!"Glyar Ȍ†T7ψ+|Q)5.A={P8 9œu52n.T\$/n>¡CPIw 0 3l!Fm{I@6P8"V\@AxwYGِ g8l\ 1Ȼ" Ҕ^^n2pN5*{L(U2k[s5d*0o ^_H(8|:&wi ArK^H j\2* o'$%Ib➻Ϥ#@X*\Ťl%G؅+02rcQ@|M?]P, h 8G383(ZrWBgJU`5xaQPZ1z %7G_|pϾcQ֞Ŷ:S;0/Zƻ@Yθ*^] {ϏgVa OY,:3JLyB|1՛^V#';MŠsBrMyx׹ X-88-`acR̃2:9ФʫOHSl_î`x^l3<=:<[hC֙o<i~/ 933aZ?j$dtD&,$oYū.a[661&́0\t_G|ANQLR!,Ck*}9|qxkhFfw;q"WTェLTzk h0pM;뿪,eYD`dRӜ= pkLr+|Bo#貼 ,w?<yi=WpJߏ| dsⓅ_-L\.N9u40B6$qNqã\7k"b_ ?QxXAwITY JӎT!VZkN ^קȸ[zB͚er4Yo^jEӍ:3d1lTFZBHȒcϾ1hE7琪( I7^2Q s$P 5W2{t|NZ,xM.wu8fos{y9>L.s63EN9$#fs yPn@n2lNJfn\ YDjЪ|p<wg}p H&,tC Y< Vnϔ BYO:aWqB*`kuՈg!&e{>DH͑x"`_`B ׬]H<:72 ~ H Yf&3W>3~2c5q\y03Z@LbS<Dч>½EiN jf]򭸔Z?x{kc*ȧyBنdӴ$8H`-ns(hvLryrNQCA|_pXy?Ϟ4 ; ~ly|qiUdAyG9fWjo|(+O<}ev }o h: I&댷2elw|VIdNNR W*!C,mBnxlpJ3=f _Y޸Lfsq L4YR _Q팷g|($NFJ_6 !C\\F&Hytdu!7Cn qX"U|x#XsB38jܚOK`f8zS#q YG8PkR -*D7kQكWYC<T>/\a3o-D)o` nY|nC;'qsĄvr} Q8$< |qB`[es#h%V8yqAOLHă1|I':`$ fXS|h3~7z3kkǾB$.HN,9=ۧM &1}"ro%kHYʉ.IȵLf<, GbIk@f:Ԝ r=a^8\: ďq: {@q "w<>1:S# 55! ~=s3W8Xng$֝omG<-oF[2HQL10lWֈ+[dž5E% 25ln L(qinm  vdž6EM* (6D%?Jo&*ql[.q'V'a޼!)>MǪ eE>:r\XX߳?:pqb#7.~zdܿ?$t,{!5.ka K (v`<Ğ*29,3mVjyxe̥}_\{[yjwu9xiYgx3p8,L,Ęm"6;O4TqbCS tNk{H~o}ᵠS` \p{2˽ǐ*a\=qhHnp[w 㝻#!̳$F~x̆c$QnMyo8ѹ7,g2ָ/ir3Ld7AߒnF8YgTy!Kkzg031Yzn{<^,s\"sB8s+pp+yő6P;4w / hHY6vvgZu eaR0W掅эRMka!}pWL{4H&Cp+J{xeS)3,P-H $C P6f<w˻#v4¸)ǮGYa3; e<=Syjݤ='ŭtkZ;!xMzpoL%sT 8X s8 >>P& du:t5Ƨ\A\C}e@2VH^`#8$L/~9:(Aex4$͡p~IgF}DL<<`e-.wBAZ0') Et^9YPk=0"ۏn=,iXD!w睎> l̹]s X!g RZB< +0iOD|oY^ichi 0wd mYf.p #V2Z!Ao@8?~x\s y1fz3. H.,X0:|U+lWrt!RP+W>@œi!Iv8Kz5ٮ>9ʁ@~T.x>z+g z I`Ǻ q)s?<#>J !$1:K z?|H1b{JT 69*g>7/23nG>TXK)*-3x[V+3c! 2?A:Ѯ^QV\܎|||zy1 6;xȤ1xxL<{g<YNz-jJ1C6cey ur8~ӔgB\ɜ0 ; `U0w`n= QGj~l[Y=9$.AWO< !L x1ژq_wȂϣ.]g\{ds7ȡCJ(GLpL@{80-\,W6d<TU$ 4o-bxV}k sx1 '/Z޿\F?a L("!%R|pı3W+T_7(O szǀ 1&`gy|x3c%J+C ѐ]diR3FO,r\w+|vy0r;o'YQ%127:bȻ<.`%d_%Bi0Ȗ a ^*`,LuqP ؘ͡Ml} ;qZJ\Il?' !`2Ώ^& j,_G| ƃ"i}w@2;T]>8، s~8's޿n8&B2_"&QP_ OK=zǗBuIX`ȸDծ'Ce·%%lp9爋|#DwLGq,2O8lVLx%B&#.H"my#AC3bm&\!Pfqr=ϝзXdQ,#}H@PؑCq W+xqA| ^^[Q36./qȊ_*G{JcT )$ X""0~Vy pc=8`m=$A6+J=2bTZ 3\B >Xfg|-6pݠ7JLq!+do>FqqQ;+{Ϯa#޸ B1I+ZYT:`}q5"Fw83fxv MI?E!KVK{CtBֵ{s":09c=GKfνo=plW7xl80S ߓiSm ̠, CCfjF5aZ]^=#Û*+]q `vHD3Zрwc!m t@Srߌ,ٌ[qPtj̉R6JDDS谾bQ%O0Lp`4Xtvp {2C"~̈́8ߌu}LAL?o7 V v~1mMjTƥZǬL dm Ϊ pwh"[\aԼjF5M"/=qoR`lӜO\ 4QTLG`|| R{ɶ)P'ƮŴbŏpO*۬9c7E ?|(d.Tx3Dzc0l&1" +3߾|("s\ἡM\P"f@qq`%ۿQt;{ֵM&5イ D} c8P{x_![ CYCl} XaP9S.{ˇ8hz{\tPέ_ &ێE<=\]OOFQЩ(^:z CN8*4J%3>8#?'*! )w{_5<wqI\u_O^86T Sݘ|!MLqsPv3qTąO W&x̎sMpiǃ\226,7Č 뇋K214ێ|%c_O<>=x6LSkQm8qq@mЛ>?<DTॢv v8UQr}hy+A1ߎ\RKgy8}F\W 2!h"|_=uTKDc<"aɤ_BDA}5$ +Շ Xq ;KY!6=k+vgBEd. k1u*HVn)J#[?B]mOsPI1ȡju,ǎn6IA 끨^,Y.|wBu;(f0u\ _Z:䔴WWMcJ}ZXg?z3cESH{|T ֩Pc9H6n| mόr Sx_@PZi85 Zƾ8~-J|L+R,5/ 74ISr LAI%rm|UN) tu?鿀rMwߛ]c "c| T\Gf;pڭ|jmo6'ᓺ ϫMVd T"3+xcy@~.pJ`לͼ-}pS8 vYLDr؆18,GEcJ۾6٢T㈂o 3ayNNt׍౹E'[mq;"y )Iւ PPuau `QߦN@]C;9j|1L|}^- 41%ʶ}[z9"iX_\<}č汧bcӚ~RLDg bwaO@3LKߢՙ~[XQJlircfr9Pʍt1; ]%{GEtn~8cgХ8pC3d%VC6cF~18P9ko(.8ٽQo)$ axJ6c5V& .MìwHles&PZwe{IE&( HS EA-X^5N~=NAҕ YX h'ƹy=qk>=NJE$=pRBN|uL [k=k#i_%Av~2 Z\q+ xpЈ=pU炤 lP4\\G ˳ |d 뀚.q>lgֹodSnUs(iJh"c!2w8f\ 5$pdcA s9*8;Mzm418 u,X|R&30" 1GfF;_&EOKzxP@ίJ4<=oX@ck }aw?,YHiq\o#W4 cx:v/ b_p޿X=㩵sڞaLڕcG>>ı;tpD.rP{`[&CtP"W[/^-qe"N<_7pH/pƧL,L  0gqzvtFϮpdXML! d] AgnE̙k:#vgqD5"292oT ,ѓ]la#~\|)wQ@/pNYN*P:xx\AHmDL1޾xG/2Cq+$W$3x*b@ܘ=v-os~r7ޑaM| 0#L \h,|ZDlPۖ_̟\ DgE`T]򇱀y.IN'M}pX66W$,;pi`L<|3&xYgd|LMk]`k+0X:kO帜fImaO}s HCRDP<:Gb޻P[c^2$:xԤyCIg}oho0O\H ozrt,/Ƶ<`Mih=$ OZ?HIY3r8n4?9UZî"'ᎅCG6^ίkz9Y]Gvk) dЈ$0őt(cer!XLdg ?'QbGA#F5Kq(x8IEjSX~?|(D)719y`H=qf}G9IYAb 3xfpPi=q)i tReE< U002QW޹Le w>%p-hʴ<|WN||^&cֹ5(SkE2?J֐1l9G T>.ϟO'4\s~ j|&.)NJl<ۈ%e$/+\V0:!! f'rϚ3vkK["Th82mdBeˬ>x*Ԡ/˗s|ӹz}qFwdm\zWޏlPjϣ ,Wxs8s%H!E81gXL>$- 2 IN2$ʺ.)GWϤA49$/m ݸmآ&NZc<м8B`!H[7N5JSʅ0mlLa d!`@Ħ "gˎ|Fe=tqRB#xl qpbw!sp!aDhm**BL~H|7n'%vpcbdπw#M&lo[Z i- ([OuߜTr JHY}p4pWdl:!湲=B;/F y =`HM^S៣o;^TR9|K1x{bB$ 偧D\ǧ0K+tmj 1o8ƽgȦN &j. ޫhDx>8,9H)Mm֬o9yjRo%cƲqP,[ 7\2ArXS'䐳zz1;[2y74Hm~ΉXP,QdgB '%BhIw9pCsr!{c4ŋ瀝Y3fƳ䵅1lͭ\HPuso%/d1ь&_@`~#~8, }1w%T! .7FYⲸ^PF9y`k呍 )627յ4ٍN fE}fa!QtGo S/39O\JTZ ݞrR%!1Y D1 Yai`Ĵ9i_~A6*YdM^?^΄&WxNBn&׏KVLNx+|;*aѬ"L3ff:BSĠ<*EoSK 2Iy8!pnY$a,{$MA?Uξd\TQ,|x9e%mH^I01c41!_wYu (ݓVn\wq0c62!_YA' $h*zb$[49xn pp#L{x+ұQBHlfPiGqKڂ=Er魫=sl̖Q3"CJiv$LJEM/zœ$T*=QbO/\np_(.Į15Ŏ%&,DmYqo-NH\g0뵇pToY%l 䕌o2r#a4q ≰d# rTq#[Hpҽo iw~utR̟ģ%e`\`K*eno\F+BnM<~My1F_Xnw%z;Iܐ\cZrrW [!W9hs0eh_L^kͅH/ RT>:Y8/b,m;Aɕ#(x@rɯ_B12! Zw!8?_qmW~g` YW GW ^[Ͼ Dm(&chBegr%3exs(7g5FLOWQyƷX}ZC71Ks >Au! %հ$:M%SiYup bȽ=cIFq Jeuw:եu|c.Isx9,LVg&LbÞ|&dqPФN rčNNلF3V{5s.5;{9L xUd/Kэqѝ3 QjP&WG+hCe 5p]4IA&۳+kDq18P83/&%wL >ʬe1Bkdw}&+L\Gp}3'&(B2$'Y 8cKLpM&ژqֲUJUFrTU؝c+lUW 4Tq犘28ˇ&6 :qhbG'ιTsnw)z^1Q@=2__?i^=} Nl||;%ցy߃o^blq'q܌иgwrܪ)޸{ORQ`dGwi#%0FŅ>;,mZ;T;Ŀ|g`EaL=Vk %:`9kRA=8q&8#gRł&3|~bt"0MG&qy D.Lr5'N8f$8ĸ\VA:0FQF8A`0 s=< rEu|ME8 V\8> s{ήPU$ DS;赁"*& >&L/ ǹ rueǏ\f]3j 烠8韆N\ iwTqzȅ+sۅ#RI3~Ǎ#Y5 HvLv|Ql\)̴@@kKS6k}ZY'T\e+YZgn`Oa덾Y-Y| ίcN#$$k.teH"]J|zIFk#8;z+JmHI?֞\>| *~Q{fVYa!Sb.JL]BFYv \wR9pb4=E@ˤLb%Xvk_<" aqܒ|NK;06gDͅt90^ׯo1-P-31'I8 z' |F¡J#ԃ[ў0l7Q,zBS`:?|v:8~1*oJ)Yqq%*;QG8ߏPK 51q;gpDd0R#Y( |cz~$B%C" L~l,4xD4rvl0 ᑟZM^ia_:q+r TpxP2ׄe}qX#̗(h=gĹv. `K4Y!UҀ^9D{97lHS7c/\ܑG2u xO׌z3=NN={>o;z g9\zUuOOYB+LUG3х>y>ps&=6`S=w-"BӞ#pXn}R 'S\fs8}FW$~>C+$j\煁 KΙן1z,x*m7VqȰo<㗥@dty\h2pgdӘPDY@zp*iV~0.ZL5s@vew =>q!OqgKFQ4N5Ad ܚ|faN~wCCNu3eɤZ;#B.d|s. o%Dl,8v<_}5u}}qgRsQs*- $x]]V}%eA!).j9gxVpw-a,]* N#t\q҉!zGcl߽f)7]1e։~  xl^o~x:~Z$5fRqbn+x8Yc>~H04T ҊuotuzEc..]J.G\b8Ahqy9A lHVÐothyH{zjF1+7y-Q33w/ )I!od?9O"VL {Sc<:U]v{pqo,3*}H7{Ī 8G'qH P k[q`JrdݠNg\L2%P&/ғv1$@Ő-e3:Zbz|⦈Cߏ>)‚cqBUV40tqCiLɻD4 =WXĘr`59šV^&q8*7 1rW3qH<{ [C8𬗖$ iޫ<u&>{.Bƹ`#Mzܵ3Xw>Ŧd.U2f{㏢E٬yĨum?$R fO!b?YӲ z 3O :8 6F ì<$ W=t q+610JO?;r"W_|n5gfqĤk/wyy:,hf)\Tf`Zt|B :"g8`͘vcV; {oGckpW&G KWg~5CqJg?\鿫-sAYD<,( DW]pyYi~}a#+ T"OaJD1['n/zq8Xp|h2"BwǏ)Lܒu:,R]j~.9ظCKarf ^r;Ylõ:21x%pf[7h;~x\B% ~e=B\LÆ̲^q!4D2b$s [F_xN %:cp#m@P 7x h3 pT!GbЙV~M?Xauk< +^ETcy`.ޛ!L8ϓ|5t:o4L&g.U"qG[(ZDSEm|z#Aai@Z>M=x^ꕫVV˖W!JQMg⣆F7t #nS FP`ЙR\8wăf!hZc{\Kソu θ73wx6?˂jm;"Nɏva.xø>5ASB  W.Xnyu)d#>,5ݯd9|v ( 1*煦0']?]2`<2aki,84{RP\= mlW 8U5\gtDoSOZ4=oݭ~[(\O2T6U4;iDZ>Ox`!x׽%'E$q ig4/ @a*]

    (.gWAbOm@(zh 18[ S"q〺h&8(\>8wGC b8^ơWrBN["c'XsL""*ቍvA Bm|/1,Zٻ=@KlB[|`| N@`b ^wMAǾEW~s4E ı1'XLܩܛש.68:9\-wv15-3m*;93+y\?x\~ "cZeuyjuMixys6.o!X>_,X?%Kwo[TnbSzmSCγ]=p9Atu[ ;9Jz=qI$MɃc&#Tfx[Qg]%9;V8I8ޓ"fl!`:㠔Hs,[KX\77s8oA 2SSA>:=7iљ|A!q{8'u;&2: ͹[?\*d%/mS^ @θD{$*-"~Udd\g_r x<V;Ygd9`yVWi$7mIھ##oYyXp u^:@nAsg:NFpL|$P4eb ezÌfze *5*׬4nLY끢9 ~}.Ey㍈FW9~9  wA 0ӡ<223}/TI1I ?~ϔ:q/^j&4"2ΜJa %ዜx`_ gbe/Y(κA{,Σ*2ReTIBP[xSBPf?|uAR<|rAkAWUtǞL(-d/"WeWp{ӮuゞaM}pMlp㰍*u:8$G"+(淪Pt kz6&ja˳PFu?< 5˧B9upkư1mx#. >sxnCq@jj@ :G}9@E%* "ƺsql!9 Ү W)Cz G@>Qc,p">CjO8' ˂]~8|͙ǔNlMUnݟ<[f2Uì9!ŨhdʼG{TnD9BHLN͍ O?'04Fnwמ R0ĨWGeg=q0!<)`C#Pm0coA&&\)FR}!7)Fj$`nמEzS3&?4j+㊵׶z^8=d&];޹ *rE,ڌhuqj _WdT24Y߭gܙo'qcvNjk]#X<.O+C&xikk3%SQ㈨ X5:xf`rw8fYav$u T8``ֱ;13 s^DsϿ` } ŝIցgoW..>_\yט"0ն 3X.4 BB8R Y%LBCBθHæ$<`.~95Egg"̛xp =9p)q< =Is2%zLaS:'@:fg, DZ~x#Zx0JT[;1 Nf;&H[&  ϋs)H l>s"%1]r_(ې$Etˁɞ*~NY’_(uV{(< b Kya!0CkAkw#d@zL^f<ўMgƘ+] Ar4"rhw8 ҂Yz\BXD3Zm̀DYSƼvy#r/B2bOiǗ8Y7F oN4]0Llg[8S,B9e+3!QfP)!uwE ɞu8(&4&淡07ĬeB[/ q Eܞġh1rII.3BϓqV3duXG(4?|AfL'yYJ{@#v}(X98=!IY#'+R`&*, OJy2eM)6!..-!Xk|~yg˄{TH&2 KNz Iɫ`~ۼS5hDdJ!qwQ]O3rqqJ:ppjόFG\FLk_5L̔8b8aUP tF xspiTYW88 *NP[-\{5SVT<0ќ>p^+)2tpf-(L^9I0޳351fkEq\/s%Knf <ֺee|󽾴<Ce P'mJ+8vbS[(#q%sbXyyʭgJfEVgߖc׏p"V_AC0jJ FX(K_BL;.y'ag}%F1es`I'PB6\?"w<8~s6y<]xDf2Fr:Z38bUM~04%=xE,w'_&#q W(,DAx,d56rʤ6xlnxちB"nキ40ī'CN&Y}YP ?Fsʏ5)N"j /y0SjxR;sK1g /|ҾG!4'B#3,9 Igy^ $׳DpWOZQ09ş2׃a4Q0m<ȹ)N'1 Z ֛ȶ$JGSR8% /Q I 58]rpB]Zh!6opPFdwƕ::?3ia3܅yyk@?5s",R Ց&3E780Q *AAw Jz,B`y1X#!: |C q|Q(jU:c!R?fN o -'ෂ)z!k=oiJf7!b[L0z h۪>X,|0g?-W49G(c? ~F C3 rT)h<>J\hAwq+"QYȲ~/\4 ]c9:|x6&dTp XBNCa1 rGU{{` `-erL9;4`2 q_N5$8"G`xՋ71rN۾$' G\psqHG8޹&Bt|h(\~8UoZ?^rz(`3539'YXe 8ۼ9}wuN2E<+%\:v`eV0Fj`G>ql#%^+V|='\J{?\< oBdH}3%A߯Z.3s&.!&v )\aaz46^|zqQ`Eux.% 6k:# @ܟ/\D_tV`]`] & GX)F2;[8E0`eoWQA<ǕSxrqmgk-^vLBC[+ 9yԆNˉq_&.2=' vpa262M㎁Íb.J7hiVaZX&je;*szN GQ[*VtnrgXVW8I,z8rf3'Vc~4}.-kyc Wa\eM#(~'7vE8-zMQAdSTWcXS6zbK53K` .fa{ PKuYFf&}q@nRtQസan8h1uƂ5(:`)8kz"b'ׇ0d<,Pч[Ͼ,9M Gm9q|DH>|#k" &Wc!fBSI8խ~)2D>8D+#]_1CL0Ω&ggQ@1ㇵ0sa|M7B0ƅ{0*bhm-BCUu}w낌}yyPA]n^}])>yundś:3"zNpIAE09?OXjf˖!/|hSWKcY&wcLٗ]9+44 T֔+\fq&̖@bd=J(l$Ծo TE}p S+1֯J2K 伔 ޱ'P\Y0BG93pLezò3\Lqw8f"yLWA#ご˞Uf^qf 1?LtN#~9=8:)[ j[x-F5;v%b[xاhu%1"Ǡ9|q  gyr׉d(Rj웢fa,+jΟ E|J2yX+ɽJbs<&x]xǭت3kEf!g y&=yn Gp&;^ILM5S3ǒ.'@ t^Jg4W&3+~k-?\+`:zì3,\he| 3_pU7|T f5䘡`g!4X'>%-:5/B[C-puCT*- !|{#zF(Qι,_fWFƸ2 S.=\B nr9t,9`@vnU}!o-\g|hy2Gh>r򬫈`f 8ۼnqy/ф aWXlA+ a#U=wDŽZ$1PCPZ>;U 6 `0{[EI238dLcg Q+̛1̅TU&8N)i9)x9x Lnz`?ľhY'#-W/><GuZ;p()V&s sB#7`,T\:Ɓ4"A?9sZ;36T ,ĉeD+5;2mQそKGd8!dJ!C}0|Nb`?<4a@zaex)pvGG1ǁArNrE&B~xu !ḋ-etр W 0hiD6z동N@ R!#BvW7SMc-= H˧8ܞAq\g"L( #?C;oXy]`^$Ao t ԳdNACqpIbFId8 +>I! |pA$+M1$Bt8PA`9.2}!A޶V`5R|thIpYcS3p8 BLAWZa1o^( h$6qXtVG +C<.CeϮ)\6$8踗?| F{x/Yr@jVLS9s)*e~cy'f.}^8.0QQ>Bd:~/fr 2{larxD Tڅ7l\(Lf~&E3iim5#`<(1'}=md TXG 8LՒGШurqg8C>%eH\$S &爥D$IMgSg +- y#:mGJ_AQyr[xoϲDJC :hѲN߮BI@>¬ݝ$]3߿Y'C8XeJ|k*7o Ӂl๥X5הÀ e ,/ Y<DVQ:ӱ^iyp|nj52 h{FۊM% d(817'[@ݭb{_LQi @VrSc!xJdUPkJl'rL =r*L\і\lnq&紪^ A#L"_C]JO8Op3t+=HYiJ"k,٪7^d)Yշ4|v ` rƯ5,D*2/LWdñw{<ԥ :j-녓<0MZ)dNqָͅ i%ǫQ@ \z>5b<`O: 9,q׋QBa[!CWC 5oM LH̘nV&>1 l2hToW7@ͷ8m+1Qx$Xga)E8NHt1nᜍT;,fa| -^.F8 -);g{t:N~EM}ѫQ/ÃS^HN!L m]" D5,#0ٗX.6Bҝ}se/j{]e8sNn0 R ;g}ff'rE~Z(4Zx?#Nt唆Q(ՙ !YQZ}N%r*i\ruy_H1)'6T8Z v` ~AEJ8"7/nipMq&fXRp2 \|YG3(r}vp_Cdָd >: ν|qP< YMn Z7$VS4&5K4HLq] :gh)&Ն3ql픘2.q G&̝H/ 4IK[܎|dq`&fIag |u,b;.R׬}rl!9լ'> _#ŽX27^ˮz7ز5CX`N|Tڴ˙|}J}޸1DT'[Lyxnr 2gfdz9oϟ0ׁLa2il0,ӧ>+D1GpCˮ)i iW)f<#| <9Ȅ;|[yqbQL{dlp[ ˤM8׮(q4|rst"eEgLCrDJ>$q1$sxTsڕses0d:; RXT ˄3\^@L7 <]љ|% -L䓊fXZd ?*wlK"=at3Rÿ HndK"b>LQOSm&#ȁjl 5g ھ痛" _㉲^SCGɖ鷿Ў#XKQ{㰁ApQw6,*o/n0q4Y'1l.x5s fULJPEI=~0p̼d 8JL$B8cx1*>maє~w]؀ ~]s~`0[=qPBD8 Y ue8I@R0LǶ8R!qIeff7jH8zlm[w#.bH\(l&sߑb Yi @UG. HF%&V Ph63` :Jz3'=%ςw޹u/- ;1ԛ.(,k1sߊno>![0'PP`~q"!f: ZiUcW(H&[%g ֜#fɾאVhUE64DD>^]<4+f?-uh&vq 1f7|M9bU1'\RBP3˵rF/nu,(fgyY^]hIzZ|1EE'"aQ'` HjHQ$0WNt q;&y1|OK ]E5ZH Į||2\m2g7x@ Ȇ{WÖWu*ӮNt8˂F6y\C4L)gU'uBMo-K;ux0gY4 !&jS8rz,yLX%zj,vfbqL4pLL@zk1g.Vg84Ha~80Jܓ\yu AL)K/{댎c(,S9UcxTH΍8- Q緛3fl4 AXS-$\bD,rgVnR|ZFJc>A&Ҋ =8[@P\c\%0$½L i2T{3M=c'k3*ds +a; V]ZjҚ޳']$7&kZfu9m>aH:"8/N<%k}}o+U.dzV!2b#PwDmΞM_]͑=mk4BlS:*$H(aS8hܜPF8d`M#5UDH+ڝ3g삗[e;}吆 izU'J=Njo y2\%f@O&B:"d7‚d?ysĢ|ӄޞcI=Q - ^4ffzG>ԐG<$IK 1:)#P,-,-lr ّٹ8\&k곌o86i(gD2 z)Ad GĵuSqn/#͵[ʟ^x,X %9>iAL$pN,$+eK&kN4!nlS.3Ȓo+d'h4pYĆLpPN0q69f1t"q|gQd80KǤ5;aES0~U?09qf0V\W/+INTf(Gj>E tꤳdtԾqp7n^0.ZR$>x07RL19%am(eoqNdXG9;xL| @ ÷L 9[CQ/\خ ^,l04.c< Ջ \ɃRq$pUdhTYrC\J6ğ< dJ;9V8 ALg7?l',(37:p1G9pcP.Ř\3';x9dA<טTn2ut¦3늑E@9+>Rϳ\FSRe͚a«MY iV5#ZW-fhhS tX{,Tc+s%p\Mkp #ɗ;ˆ@6<f#f8eX /e 2>Y%L7 |rRۜ']\[p mt.2 u--D8s T/~89]0/_O+Zى%cgIނȮӇ' ue8h!YiC`V96s3?<6lGsـ1 c,7V n53UwɣQEDqI5NtSw1  ~:hX)ne# zWRs3igwSfDZ~4pDj o`D cE2f!l^֮-Mnh𫛛Gab?H Rc!MUL³$"0(Ç'cXiNbR4)Ǫ 4gneVx{ͶpCr\4޴֧Hj.<7.S%c9NIَ$ K#.h^3e8x,\J 60jrh%-&&!@F ˜aSs|O "ϏLA'u=fLeh0ox cS&8ӱD0+l9t>5 t2X7Ʃ$ӎ1_Y]c(zAͺ9 T91r#wŒF͹a&'xxeJ+_&gոzeG?ƹk!;1[NZS|5v/ۍpa1i No!^((`5DUg9=3B^g8h2@w-&s=2:5e@18Tkȃuc\XNfVEiɅJ狧U.ih̓㙮W&Z7 MN+ nǽ8 rUs>(D5l@К:~bP]ԚǗ20SBMQg$5!|9Wy1xCaYٗPMjb 5 R:z ys_ɥȬ Xw// WBC1N L7r'#P\2p!h(VP Ua +Jv[8q$' J$RJ0t2{5p[0T׀wRҥ3xbH@C:O;"cj{q4𩴒/Ne2-#09Tb( \T{*Bz4ԋ:H\7+vm&ߡ[4$5%I|zEȕ2gR^$kZKaGIH'N=Z@wDaf?3VIFȷC+$X*Y9LmE5vLfgF7fC˓ {u HXG5 O\; 3SF=/,↖32䧌E vf1 %AhH`1 I v+D+/DbP (^ T9i](#pxiCG/ӞC0!amb̋˓әs0~[y<63 6Th7%1à u}p& pͧ)S" q& \NCno>' Ci^|<1ara`s<=q+x \{>LC0Ɍ@b)=JG WU;&!㘟bG1|qHZ]1x el ָqyA y 눊&w(g w…VL%#=}@B<{6p#Jtrw8XTJ=>ED!Jg=9a!eqqnBx;4sg-n~',.%t(XrXv10Nc:G$/@H ±؅J uDsq% C-pHAӤFp9JXWcw_־pkɍӄګ̝Wf%6|)3(ۉo.DG&c}PT5kUW60~xc3}b`ÜɗL(i*6 Vg0d 9s7<f{@a?|)š|cTV WTo!n |\ H!RBT kH"d=~g:cI:}n~HM(C+Ero>7p`_(ȏB]c 5& E 1jh6h$\!%B96BRr3@¤Ľ%;9v+9FwUj` aiRۅBVf|IT@i*gQ }8ɈCr!CZc/zs1މ qF?<2T2^HnpqTjۛWobZV&C1* & e&^VVͽ|a sv7&\āZDnIsSDX{!Gq̢(@PDf<tH vN%hi3Er޻> as6q 1-XR-)u1 ~;K8x ;ꆧ7zuP<Ĉw& khD2bwOn䙆ᢶoI35 .zn& :+UE:`H K=es-)f^H@rh8EA,VcJEo㹶ωrxQ{TЙ@F.H!8,BpO<ЂBAF0aC g=:Xk,Igyƹ˩}p pY ֢T\sڅ |(y|cx*PC0'㎈Tpȝ SMM-g:^%|,a{krȄ$LU9>-oGgܷfG:\<.m1!T ;mS FQBAvMˤ5 Dr6'rZyit]s3x3:ZKd%"Vν dƅ`s8}6&6n<evpQF 2(V bJ6T1J61;πS "<-.`cf `Ma<;r<dR$3_*-`<}sJ.g %dSWo{8kr@*-8(*I a`|AP`"o~8n!8{VƹwQ݅y\f㏛QhP,TbG ҩ9/ Z**V6#c,C(Β8رFIm)_\:Uoe7R6a(ޛ(^ٝ߀(XdH49xSv#32yn([Ig^425 @ΐ,9^ARˎoPQDJ cp%)@XpzQ7 ;|[HdVDV\K$.P޸p:%FKІqŊq# #9MB#׫ Ri<1c4<#.T9Ppc3kg7/CwD;2,ˆ`oq!qYb/s`hև幉 #oi^O>:s3:0񶅧۪ˌd닅hWn]Tj{.2q0\bgkJԞ7@ 3yE.juqpK*cH DIx!V97fSol0PDN \yce%s/ ~^]ULIӥDZ Ԇ]ĚMv > ] 46v JBtu 2Y:rKb2İ)QYV7#P8#e:dUJW0%I$K}zp3pGp؋1CH_Ȉ] "I5 0GԻ&U8!AMU:N Es[׾. \GJ:L -pg4Y_ʶZ%q\<ΰ>G3S 8Lxh8&wmNuK0'KhF L) W2gɮHm_ "g),fI䍼' m !!g@cϮ9uƔR80ߞf ~C&)0HcQ'!r[x  `*[Uyztv:EkǖRlLv,$_#0 A_"C.&CG']10h𥘳y$22R: tx[4Ti-ȃ@hǎ $]e 1gzp@t`v6B:4۟1f #|QOi_Zn?9#cya b|=! efp`n=2  B-}pE N2},UH';Aзɇ.Fhέ/܊R,BC=__< /cew ':xUhWŤ2 zu̴0"tn7yv]t6!7<:ܼQEl4\E5*oN7>w5ŊL'>8fP3z8eȄώ_ %ʸ{ @j!1o#Ä,jLyijbd'9׵UcR5NY}h2XDG[%gF> 4" |Vp9 as)3"0=2cT=zXs;w[[\:)3.u pᚦ4j^owS+P!rYI6 N%WFИPrYu: ᧟Y`e!'XXli!pMDQ=ҚkEv|ni 1+M6j< ls0ǂrQyB VSH3&l&O^5#=bӨq8Y2XtKI#1LPMz 1IF _DRVϦ3&À!vpu`c*gl0&FesBWY:ڇja* :]&1AS"56!SwˌAB,XiLH#€tk5Sn nVA/vi,-¯ )9](S&~8834h_!0\G-NY p)w& NB+uqs'\<ּ^#fڿ73kZC ''Y\3-?@Jˤ;]8̲ޤ2pSK&9pd 8 A_$] Z֎0sڻ}p+4pGc 03 |~3琸 ,2Iy6+xuYb V`m'|~FM]8 \mpw P |xj;^A%n\0Qci31#&'>[{h(;8&A’6^ 4& q jT4c.*U]q +1''+oP+%Ӌ޹ D͛,! j9fazit%`̺:M4wXZrrUgMw,h|r v2,x-",!r.)%ĩRHjuΰ:@uxx(PX ĺ o+C0ox. a+H8:*Uu-hgJ  e(4Zİet0x3B &WGLJȠF04K3\4aqƗKF(& QZHE/ 8De]ESJq8?q4t^;FmLmGL$N dc 4g&9PBuMh¯|, -'O!xtMCԲy9%1!9*WF's>qr-Įo_^0l\)Y^vծ hT1.1!Sc*: ۿ\XďЈ30PL[x6[1FWoU+5@)I8̃eٮV&v$|դLs#g A8~޼ *N$!1DTch|(J@!V4- K ]Aߏ,FM+CV4i6,#1y\~Ob]f.l(1JLpW~ .|aVιX:{:^a׽rd1Lhw "e!;Q rk' r.EgƸ0d'_\Gi m09cs9r8J񖘨ah~DY@f_3Zaq% _eB&L2xiAV!x,fg ~ 4=N3dd^t=! >#5r 9@`y-3?s7SҪx 'e4ĿJiwP6ua PC;"6g1r55X*iSFEC ܣ;ҍp`#-\C1kM#&TߞĢZ9]U* f#]1#wEypkKK 7ז8Au2839d0\ˋ@Ǟly)@A~\ ai*᱇W:*&~~G1_:ǎ&0 |yy p&{6 tL/#Q cYB#g@Tf'c:frB=XN$p KrC'| 埊Rjc K {9!q=zx#+d{qbv&If&eC0 ]:f &8h^#I-z :T fD1cy]m@Q[7$;o8إf>ߌ_hgK!Q ͜!|DDE~3ZYK<κ?Q(傎~L+{8HF%'$d!M(qCrCVj<1hP;#qq]*T5qfUذ 3& OTxMnj11ZAID A$)2 [ahmMz h&m?4 gp=*.B=1я;2rC S &7ԜUHPTW%w>|p1dTT)nOh&(hӎ$,:FNgĖ(!N<^*P0"ʹ M Mfbu=wKrk60M^[rGoyKJ,@8=I]YNY' f f?x$`W^ŠYvFv! 5b VZ7H JE;\{Q<4qn{CpqK$FYNƣ}$WxqW,f(zpBp }nk7pָP$M*c"⡊ 8`D渆 V.s`~wn_HG# PPT9AuidǬx!FJk$.gvS( lN{Ch8o*yO3 vƓ9aȒgU/\o&3+q⬕fِ€P1=|i*`ZfuzXn>AfcWuĊQ)pȠw[g{3Dߙ89(PgQ'qqY&07enH5WIh}Pȵ1|&P(yfiϭ#DJX X`$AL>|}rpNfqW6/kqJa͸4" y8m/ Bhks0[y!b}x@߱LA<(Zz{ $:Y|!W\3jա=j_2rYc II:L^R]eG7R`,_ޡnRۄ EZ' sa9q%tok+F\?@ !(|)c,ileɀMiJ`پ5M˂.{s:͸e Pd^LRC]ϯ˔ϑ댿T˟sib hl#e~sI h,.=J-$>MYJ2 [*oF%! +W b@L.K֏[D Lp-ϋ|0D(50j w?|IIY2kLᭅ|9Fu`.|)T`E!L0x:ߌ\##?'g|G$q4w&ʹ*$o^.&|HU`3g2+"LtxL_!^CJAvchsû *, Nك#|p->ZLf ^1@oW)L͌Ė`:dyD80L4}\)zv$2e:׿ t)M.`O"96, $u}!8s 񡅂C[P%/L优xg"~%F2X4 Ɲb +ޱyd䢑N)(j!E`Mlw1@&qL۾fYFT^S+}pBk 5a>vOfpb <GvkL"&E+zqij֩gUt\5 l%g`hr%z|ɫ2Ǭhx  8*?6 A\*t17lC|$SWiICߞK 9 f}'&j2fkv4 dXADlu8NPT 1aauün$q亡 4|>a{vTm |qRȸ. *`gCq4ex3@#7% /j݃|1An d1RL{5w;3xuccwԬ z]eWn,CNce' 2M8oN{u)AZKzXaQ(P\-]Rm@8[/DT8s- qG $ Ug I5q㎼ٺ;f=Z Ig)D躕6&2Lؒj/ H31"p2ޒ~x",~<@HӾP:n;<\<:yc>Lx&U?$RKxhlŹu7F S O!k۾n0&)\ʳ EL1Zv<~1ܩ5$|legAf3@۠KU|%js&| #X5=r$ e 9 ۻO* '`O"ԕQZ \NsZQ5~ r Y=v?Y`6?*:3 fݺw`55 !dIUkpl5jȔM|cN\&j涔0 8dȄ3oxq;ݼd\Ac |X9A8g17K nn,5xgS]"BPO8|vx_YT{BP286DԙwW\$G#L'|>ڠIQ61ASPb Q!a,1gg)%U!\P}}rN?:xAS7}8Kux"߮<4yͨ,Q#oZ@-ۥL9h} 6|o ,L1fg~'z|Ꙡ\jezԞ#eNǐY/]Iz|12pRt_4rrq3b ۄGy񁗝L + 1ԾLKz /'#DLW"\ ߞ&Ҿaovk_&|C(1=BɤS>9Il4XpCSNYK_3 b=q@%A :3W*t1|\Umd0m 22L>#"$``FpQݝ|IȖ"3NH jSz8JK lW""&oO`X=N+!ȌD_;I*iF8KY"  +W}!*Juc눨t錩QYxFBh&$~8 Z? 3, ~8>t1>T붸d3,b2XY5] \ubQLkmSBB3)s4ώU1l;xP-P\ 5..wRh3Yhi2|3Zqּc6(>H̚ߞb#T}:c.~_9N BI;Xvo\PIB95_ b-:輥BE2%Q^MpoBbD"?,JrJCN06,;R[<(㨯%:" 2dBq0moRm^=QBaP a̵j]p0!_!Շ/:sJw+|`58=uU5Hauv>Le0T"Tn p{n(gn 3󅼥MτFQc& 3is MXA, AQm* , % .2ek 'n4Fu r`oh%c~{퀏 Y#&*v#{7;g/юpܬLqQ'E\c!êǂ]@lM`AyYSYIˮ5 j! q&c*iFlrԢS8n<%2(7r Ʊͪ^n!1y8zF7jIR߮0Ħێ$FX`N3#+p"a;)|RW#}NV \ A@>N!c*O`0>HZD,.k0LJ<#q`I|֎ɅcϣY1 I2*2IJk!~DB@PE J!QKPkcYpvjlחӣb0t=\b9& </xR2 j,]dfV;9!nc(îkˎ rXcx6Obh[GmfL 5|SC*=xj_5}p2UCX5ŴJF fN236bjpU.*2_>SC6Mw7EQ9],5y\(t᭪3aIٴI`Eƿr5V\ HXnǟ!>7r!O7&q!P6'D/F:[ΟxV]4RB{\;76p5* hU'VULt8]hQ?p,Kh{zAJġj le0)xмІaK ؘcU|+0quU< DVn2ucIJywp(uy6ǘ0wBPKO ( @ ~V޾kr(5yg"kK&z0|bp+AYmN #i}9B/ ыpaa3OzAJ1 z:9vas1r\xƨ6} *=$>G2qfr0!kA O9.3ƉdY*,2FLHL;U«4P~gx 6Æ9%(3jS7B)TtGͦSx2|VZ)^_bKقhɇYV,kypfR8xP^fq<B#ON8H]&!]N9Dfs  M˜32|xauxkQi[ PknE* Xf/ D_q茽;uז,'"s!˜v0 =g$ |,"t.P ;&2A Uk*3by*u_F(鏃| j=鑉'k/’Ѫ4TS9eT[/v׆a&pg2V]. J$ˢ^ܨF4]ްEΗ\4 Ls W#^O(/J1-!0u$xQtz{vMSa;#{ $/G7) 8e@ABE[q|,g[dg $N ^yG`j=H@DA81U;vqD4FY^**\ɾyP?s 0ٯO|4mrn*92C l~x! Lu4X?9/ְog1gs=bZ6 '}EG.sk(Eq8ZyTgqR7[]+FW~|&=>8X&}2 a"3|~2:q%30bfԯN;xkξ9l[ڡ:<ˠH=^; (Cfo?@wwn-~B [ùLaRM9V!Y&LSx"- R*xĬJ}qX0S󃅁xB#ڷew4Ccu054L3npLurl%$/h.e@6[82SHF$L/i75*s>ˡS LFKn$3~&6@*33Bgl}7EoE˷傔A98W:RJE~ XtJt) DŔ#J8VQwCO|oC7nTHcXxoAL@NL ~yzKvC |⩗QbyK\U \ I.OX|Rb4G:Ԋ"&G$D l?.9Mqo3w{Y!T ޸iܾ=tGRFN.Y `z :;׋\(B8@N9nbCf[aO|,L\~$T>pɏZxbָ7Qy|q} Oo)E\xOfd؍bIH&0oB!$\]`˝JI++Eɳ'(%aBkPФݥ1Ǵ..ս eDߜpfE4&BjEq k%ՊȽw>>AuzW3+a"I%&F),.ZQA ?G|*L N!l՝Mb!9g냟0(amcX+#$ 1fcN'# Ęy(4@1LźHr f-J^$jɀUjMlZ90j% qZ>.~D/Ut 1Ox'YBf",e+ymWXaIřrvg?0Ks)o2Q>`U #g^:e_'^ 3#Kc=x+ł0mTx%H6 ˨X¦G `i:[JKF]gK@Ѩ&3b$煭8bN gItt=}2Gc5r3\U*,ǯ*veGu2{ 9"Em/|) ? r6 $QG߲3BǬ8"Y&g FvG*p:lxT\.y9zލp G" 4@Ǿff Bg|2蕢x.2"+ޓ[0s9F |s yߟ 8s-C (^>NS \Πq> 1_~Ht(~>9!mp@D(-eTDU/ntӥ۹ˡ!L &9-m;qaG0畧4׿'|Fg +l؃X5ɺAB1K  8N`TČ뮰01ԇrGT 3ѯo AMtxvw,( mg{JV >^1m˷{pzO|2`ZpKh@ s{B!OnBF]bxsbDi#z5ϖ\ʚQ0B y{@[p+n:.Hy0Y|qb3IfWb C[" Y-DW D fu4@ޱ\* !*HE%9oR>,k^R |'2 W jdU;;2\74HTX#7!W8aϗh%]=] "o>~%cnW]w㖴C 1-(zN.;Z18L.C| T'ռBGL Eg Ia8MX*2ߞWTߞ 2 pǗ'bn7:;^2!sRV|,`akEL: u5~ݥAy\9Iμl YYώ4^ xUwo䶌 )m׎!QfzHޤpS7rC| A$DiGR#0'M>bDd7~o9ry: ͻyC(CY&&}pAm# tM/sCx$X>Llr+ZL1hwR>P_ʌ,ܽ3 ECQR>"Ia$̼jU9] tb- p⌄;B1mEEٙ9 n{qꦩY?u=$:>yH f._#k6W˖vi=J aܞD N,"tg&x&H:}@k9B -?p+a(>~XvCP X\q)x%PT+G499y|MrE2ULSwlřzj2h=E ѓAYVvFg}84`<2@M}[WAC[L*MW712 %)캞vIao7^~yACu2e"ӑiDֶy͉F99* Dݞ"i -T uFXa8~ٚ{XDBk?Fb-5d ?XE)~#tn㣇9;SɃ#~d̤]#kZaÆ5I#a(Xr[yeL{3b! *@>눖kW!_G<;y0xj8 uTC)>S%~E1n!%h 1VIM@&3_|Vu?L>}J R x`q#5(ͺ3K\}u9#; KYr œz_θVU+}w80,eEFƖ|3]`lxl nJBOcT$\ ]H%rsS䖭'1RĆLi(M>,j۽ IYh!"0]=TJXS"Z&ZaC놙q`Q.M߮,AMY0Y|(`(Ó7Cq4R˞K69w4^oMi gX olXf5cw.^pfUaXO-tݣsֵ k;r(- }X 7KPYWz*WtS0ǖ"qoxg,䙸*g!D!LR/A(tي )lz`hPd7i7.J.7xlvgpniN 1"0v"8U]ۑq1% a SMAdS-%ycO]u8,3PT8㪁CusqQԨ[JC z_19R p*La\o$ao81a&*.9#[hLQf@*mRL( M)\!`h^uJ`>;SI41"_rJ qFvi\wapPћ'"S,#^Xt4#|qq%IDr튙42 aC@xRmKHJ6C63\)U䠛<\H5uc}cxDѩZ|`|\Jg4d1Wy8RbBJ^N|%ЁuVtΝ{8 ,xv 6x<9LH 4k%5aOIcYt3i`5]qTAާ7㌪H787 blPw lX۹@r0l! j4;86bg >s%S{ةljBcc/E!.XrMѠ&w9O(zϋ !!qxyE0οm 0*~^m8 ֱDP>yUVメ u[Ҹrh$u@ x(.狠PwH}d;u,1@j}lxn_7BR2C,W8Ki‰a2gcgJҰ7L /DnI!Yq0V#,Pv !nkg G$,p |6Krb!#F>l(6&S!uXFCtTŜk+5:ǁhۜb|ru$o|VPX:>CʙW"c߮t<ŏ5ŜŐJlS7v9M0 qc8CWKQx;N<|n]IaMp-8ơr]OPz~?8y{1k Fz*O( w<}% -w n+_F`C["*ۑ?IEyxM=d F?&;ҕ8Y=[a0ոk0+K`~NOz P2D}:x%!!qn؈8.JqIYF<6W$o \4Us'@y-/6>ZvO|y7+wS S٪oqbTg,( |Ϟ/'ojg?7B넀@eQ D/fux J#獓.vYk " x2"x8,ʡ.0$Ľ( iPeAاY1Ip}N^UC8f rǙ٘gǎ `@ftp؎Y2L|84y #7j cc:X4∘䄅W~9Kl= v:I)M$2w g/DL#7%o 2ANu۷Ϧ t-l S@,Ԏo "$q\r'>CM5R5˷^N"$B3j@<|! Knp ]r<¥eNܒ("1A"iz$S[B1ruį>\l68"FπnlWN)*dR|; N5a5[5pVc3n'i#Z$Wik|kpd"/u+Dix Ifw-2r1͸Y cY*=C1@(oGHM1/ަ 3gd7aq =\pp8֣91n鮞$dr$"%7!A+ݻwQ!quhr'/-B@fLg8iM*gUC+1KsszG ޳,u0a@0hg~СSb.1,y4 kD!(v1(݌8:ke25k;z坴j,<*mjai= bj»^nxRZevUĮZUq%ƗDpAyXZ ux "H| S|p\"L}NDƭ. ES|IlIlmMw<` q% 8c θ[ So e]vq>HRUR^$ FCώl~g5!.8ŽrazZN >+|C۠yWU`Q)@Шc%xY(EcgΫ@d:jh2^z^9W)b$}sQD$ A!JcGs{lϥ . R5Ôpxb#`tc*t52"' )*k / Q:y{.dA7#qQ*'~18\2z π{| w0 pɨF;&ֱ9]V JG76Ney@yf\J"< bko7Ob!Z&KH$R{=f!Ϡ? `Y?<!orx ె; rb|k= ]jBL>?kPёn!>~9JVGO=9 ],)MUUb' %{JZ_EuƀpZ[2KYcC;_ Ь6yL& Y}?\Y0yTǏ|`{Xi>Ho I0i8QXXKa/o͐*Νz:HZ?]k|f.\/#%$KAgqviũ<~ YYf\oߌ^G!"S5|Ȍp_9أk*`e 3~⠳3%p82|&JqSSH L/UGPJrR0̝/+kCʀƺG #a2sx]%5Z=8L,bF#P$xtmgJ\3' $aǮB.*% q:D|8#bqX3<'ŀad:"'(;LAH273^BL=w5B;>1q$`6xs,+Jh.Z t%u`oF%1  tv=䢨 vT%GWʪ|N%}FWS=,$,wF`'2ֺ9𑐙*#5MT2kdQ'᳀ Μ^]qct=k= 8eBE Đ|>FFƾ-<;'6u+d3FKQ.7@H WUaZ*3`g\>r yalnPn2"R6Fn\x]V[S1t1Lgs'Rɮ8lpQ6l,G?/>6 A+}^Oāy B}Jwcq4lP2b`)ZEÚP)tg3{},y"\=~{asi@=gm٢5!͕lI7}DS&`ʾD׾aX70Rk$Q Qf8g^EJF㣊e !&28 * :o qipɭ5N&\m 㳒ͅ~f spt#7}uƬРkS0@B.181JJ2H W=wx:3x!ΉWΒ 8JCA j&e Y5P"]~w} !VoιqJgY $|> P`NIp1V ]0[F֞R%j5abfՈ/<0WtvAp\N#P1ژpdh%Oh!IG8Bk+\.l3=W}2,V5+1 Dp,UT)u%#-ƵpJ KD<=+e3ʦd:E`lI:N{4ƌ+h.D |̍A^\B1Ψ$9~"鉬1x RsA)/7F;Wiq89,Sf<$1*q &5xXl7'qP:xIX↻'vqt#{-sv@ f G e2z8aت%N4I穞ctlP@ysgVRxKzi8d[ 4ߪ1u$ ɸ%@3*9M?]bh`z@>𼥝 V8x}w5'ǃk3_WĀ,L: )ɒgg*p{~ND'rg lʞ;48;Ibwml|2 &G?<#bA Sy^% d[7ʢ@/zGV0!v2~C[%\tFV^ LUQZ=f&7;xqU^ff>؟~̕Zu#&0(44o<Af/^%VZUGm}SsMT|q=y )0Inx%ZG#Cw{H=>7ŒyFM'x zUH-7[jǐن2" &_?{D g #@†W*D|ٚ'M=ݓ;їfB"@g@4-(] s!p*JMN0V(0a<!V|*1 aBϮ1E5l`0AEˊdq"5uBD'!CkyS#W3O@:.qUYUi:6%tRrQ)W/#WN]w1J7x$@fqn8$Mphe`v,m,1{[U7PwPfi"ո?{X3Qṑƒ8:]nx!Lr+CI\p rgΖ L1y05ԙ@7kL{* q#V+L[A5/ Ht£L/I|c82Xx\F fPpK~&q,gY.{ !t2M!pBb0y/~.FddM{(E|Be\0<, ISU\~xd;e %|q8\p,C\,~xx]3"t+pNBWE|l-d8Prh{Md^+3)>xMPä(ЯiB1Y4 7,\߳(džB6es[I[N Ѡ4u@C~G-ڬ ^Xʆb ߭>(?f^Bуbk iI\gWAheV3{<8| izLdW{+g߳" $.rpn`)ZdnWɊa&Só Q* =bBc˻xR'+euY@Cō a/ `v=MpS \gX,8Z fYBz+qz!“1>p`\=udލ yY:2Op $ cRD%ÜˏРBTtE9㸫z#@0$/wQ@2n$2! ahFQMsaM$-;Q;^*AK7#35N5,ў)άawq*.׶*W!8Y7>>V(Rg6tx"2uVWul!<});Y740U(^0\}uc7ȐB~ 3Jj+P|P23ZlSqr;ͷ&E2(.3P" 8Or=kXRRY%~CpQzB!כ9lr!T1߈8ޑqOS\64ogE׆cQC[b*zl%_bq"]V/ `_&(ɞSnNzlC \3 )cYG`[rMj1o&0uu΃:qT9.FlM1m$L/㼼q2v^ɨBIbc\8@"fS`ϲ9JSh8A**'+BQaxjҌ鄘 o0Y60s޼p۔.\\i{ qr#p%HrGb/%ES \<7e8u, Ԃj$\&)HbIJ!Ҝ`+XyXtÉQ yg8 ̡\~8*,Y X;kaI3GXlX/s98|aL:V_8J ٟd~PDɍ9'6DjA3YX׹Ks #& qЉTL gZBpr5!yΈ_{)Gr;6=[sTNAXSuy6ftjryr{y3sL"3}Pk.!fRTgYǵ._o `T4b6o@YW62Ng lV!9 Ky0T#v3lj+/> !ØFo:.|ȹ*.HPUϑg^xmSI ;Nxhb%Й34 LuxB. 3 GHmxb sٯR _$LǛQhk@-^׍{JGp Z/g3I"kI¶tg|Qc@\ϻxJGĞ63T˹yHŻ򊨠7}ủqb!oG8^EbXju/j3yN ?'" цX2 AߎRW[fΦxC\ {`gnxb?!Q6o,Ng`T M!t&;I]3? LHTAH2 U]=/I.á$*Ƚ7p/޻5pm{Jκ`dnq$1r [~O8CՖaN)X*pYg:{cYaKLgaaA'p(pOW&,Hщ oTMٍ*#6=Зw&xQSyJK&_ĭV#n.d$8pRi[ָ%{iοǭp4Ğ~x9Baf"u 0) rs D)gfԛFA(ᵘ|щfָƫ$\,LJ!cTBi29nAEVc8DA d|PB!]{rd<띇Υle=/^p8p>/>\\eT"#=wĈ2M6c̜ -!/ɬ}猔P1)oX}rCEDp9T" *W8\PkQbޗGuSNj; 8ggewfaP|0EĽ8H@eɸ1rr!@qM(|mn#U {oa^(=sUP0M0&b#(#ar^)UpS\ߓ:T󀼈Ga\ rcϾ! `Ј)޲T3ŷ9;!kX`E<<>cVl `dkƠ$OXA7HH}@}Y Uq0~T<2\{A*5H3>58"cb1…4ʕRC|dcZ"jEp 8 Kzr_H_tgύ7 DV_\]FJgY DadGoe# 3y .G'a ݣ gxe*=Y}V)U< V|r+肢\5_3".'yŒm8"!TW&u̍}"ϳ@R%' H)3?X){.ur!ixc x*~PՇ{=8L?!IFt (X0q8ue 1e%撏cĿ8'})8"4 frB13:*7`zA YuAjt֎Zcpŷ2tK:rӵ1è5EB&Yxy:L8둹 9_bVB LòOWшfi"x}\g3=ZႫS飅,ߍ{ē=Vpa^mТ!cԲ֋bBκ~A"#'@rr5|XS&EIDT]p.+C 5V@)tgx)f؄7H'`颢 gfr3>ױWT.|8E$!%^e\p9@ū`wŸ r2|'vM(D.gY2p_’ UTws;*)1q  T[dC -HayyB T^pP9{+A$,S v2)놙咦r3 0 G@&D;:#&H9)X 9Vp=*G=r-*2RF#ss"I `i"M3 ̾x[ D2@K?&6xoWC(lvS:ls놡^Q% jLiLu–kI;޷\sCxl{l`ꏮ2+a=+ FVSdG).)T$!R9|vWmL7ŧA.[5C‡cްAbRQۇ$<$ aGT ʉ@a;vriI񀦸QVUl@ KG͸10Q;b>sL 6?UL.Y~_\bg,%YEϜd=<_KL>\Qģ_B̗y1 KCALWfyhC@)w3Ġ%7Yus 9w"_!w.hT{2X3&_A6Z+uC* FR@0K6;Ӽ3|p<[G|yBO7mYao!*tΎF4'r&POЁiPl(ƗA ORf yHb* :>8sLe Lxo,IJl0\PcC:,ьFMrja%в"gS/n~A%BN%R:fH88P0L]]r@L6-vyQF|h뿎m@6ah fAۜXQr`j{̔W&\WJV-j~6Ѕ9NTƅLǜgկ~^l3#2#6wpure\o!ؼ2|E8ًQVB!^$w @T3/.vUumG ~xP 7+w#;)M*|`dǧ(."q3 D '}Eo GÐP>6fqp85;tƔLQ~^4IH7jb;a|P-{Y{ ̽睸" z L@U:=U]k E4ZpSdĩ`wO-}A46%MiBul8Gͳn˾"2g*Q=8[MMA8 p7r bpFj:YIp&>,IKo_\Aoޅ38j@5'p?Qw`M0ߓH]fz-p@>r V4uuAJĠ9oiEjTl2d3١ |X&/2>5wE)뙐1pVHMgP9Lj&^g,J 0j3xc-V| ^_B4!x'9LEdIEgĚ3Xޖm\c/IAݷz S{?.skU"zx0:"?`H>/u\ Q\a"Ƃ 䍒~0 튷/׎t5.6ㄨy'P:kk 鯼ckТ/|1*g;<8))) pyf{}', "RLJVb\MP'Z܌-?\{Q\3B#"2/㧂12CHO>qȀl<_G#4.J!QI}8OG(eΘ{$[A)}q=No= j*$x%=h]x:UCy#EB82|Phm9vD^)1!fcrrC$R.tmwK+\x0XzxiSY3T:"姍<f7tc8!I;aB6grPI+/)j+u߿N0N0ZzJ~yCevS&@g9dX8_9_S*=w QQvJW)+s?yVF86ny ]rrx/- `P&pcTww&2h,'s-H(y&-#q 3+L})=[ֹ&a㎇H7EqԊ6W$4 dBJLMRa_ &xMjBkpN>] rwY8j.&3%o %[Ǥo_/"Q)t|;7 ot $\5=4Li|$|p@>Ћ4<blj0uĔ1O: ҂<++w5rK{<Ϯ 㘬%c\G!_'$պbf:s6odA]}:6Rɟ%c%31)x ^EŸF,3ÝeS 4z,Kf9Jr9d,Uu;'ס 8?05]$wx#G&xD@N1DF~$4(?x2Zo7\\3j224M·pcY j^Tnp:!&޺>׃2*'~>XR!=zD+Bjd3F,k?θ>% LD|B* 8C3;52W !YʭlU ƥXQTzgAo8>yo.k/ 2׾0gXP\:> oq^Z[@1a+m VReёāXEهyx3 ,*̻)wƘ5x7SıQTs:ֹ4 koqE z53 k1n뿾4H+:A&'c8T 9S-PE(TK'Leۭ-h9e HX,d1x$7x^D6^7;jʤ: Pp V0YK(?pGA{8is +%ujE+y3F=\<\c@ˑ ,ԑѹhMwZ³ /A5!3y;2. Zۀ-n|v 4CBO6\F|~@ΠYPs ,_!\UDrQ[gE4nOki h&/ ruw4Fx -YqZZ`|՘?*e|!oe<ZZF%g-WK_2 ғCo<@fvx0$PǞ<*mhQejfD7x b XX/2]]I&qGFq:!b. l|[zpv J$/AO ̅>lߢ ˆ~[ 1 stT[:%c^Ez4u9vA癊cvsL ݐ.LU$k;qtm{sC^wČ ͸MOO\\ƍE 1pيծxE0K4r8F|cS(gŅ4IN my !`YPg`@68U0sޙr!_<0&4`ÓY8A{[ 0GrX :/|8 ELҴ/Ia{4v/v'5NH(6g Χ]G frpxΟ3p>@ƭ ˲=T@r语-b`ljg!` bg\RAʫ'eG0T-85ǵK>TB bB8 o9'{~yN 0Qe5=@FGݠJ܄{Ypaw)D}VrZN7<|gff3"H)BB-^'4Z4֬F]lgS`뎄bPcc j@aoQ:НmƸ@ue0#ŵ1q878oXebb*Q^;Y MuP0٩|< "EM7>Gy@Kysrq 14K2&P\|oa x+?9 4egE ?3'yh!! =u1Xc^x}Xo<P[ k/kpL#xn}N:mԼsY&7ON꛱g2޸4DO{yxpʎAUP+Hy ƃo y-Ud)|`C}xBl4 {2ܿEA_ve6B@Pzhnu1C^gy.; *>/X`bp]g_ ǹpʴ03Tgr-2H5 k\o{<@qʘaUD &0⻈T} :d3oXaTbQkoW'WAĨ94eڛkyc}; & nf57OSf¬v^.j St{ ? -޵h ːdƹA <7em Ƒ5yR{9mxKlqb%;x0(6\OctBg'5>4U.Z3h0S#>'KX>&-αǠ6 8A:r`]hbwB֒IG.cVéf8;7xA Oo){Voh2E )ЅT7O1rg뀤Цހ8MBX#uxתQ Q73R37ļJDjEd3ȪHtH%^ |kߣ  mɜLZi_Fᴌ L辽-d+5wJ߮P n;[Ofʌ4s77sW$Z4ղl\ :v}P. r/g˘RPiQyعzfM̦¾8[磾fZPb8< RCAiuZGm QY yK<X2,{m(+-ƽoۅr 4Ç|Hno:7!?_1ėz`\]C lGOР GTW&6xLs!9b)dC=j9%QQK2/1(n'rNHqUgZs 4b\&Ħ4)?6m}w*Eqp c s3x" #B_cu{SӦq5)"r -2i|d ?VvcĤe@c.tLFgэr׳S'[%JR4GdM5<h%}=Aoq k+$J[<" pwJ2)=k槎夅ff#;jFr5n["uooXz=u**>O^5“OC6y,VdPYpq+ \Dv3Y2?|cD6nγ0{b ڑL<# %d3:Xn䪇ļu[@ZVO*TH_@݁p:l2eZ'`#I8NYCF;m-7JxB @zwTݛgnP8he![ЋzH#݇-sbzIUN1? 3,buӘU踷99JE`kAX,-)5!?  sƙԚ\TP ѫH˜L]ar"]d r89Ы;a+Zr|DȠ&4 T m!- jC3uGW +xs&vf|17[*Eh߭8h3<Q4W3\S,?|v0. n`ը!qs@H1&k|*jF5<1R'4,7݋ l(P ҭW4n:u1(GJ3pIR 9tG.ѽɻlj.Q½&·4Hük'05χ'X(1'-~7hIYCHa'12MTbY74q4d] 9Y|]aKFϾ996!%KopT V'PJKgEaZFq4x/[4%0ȼn(#e!~g 7I{<#(-LIL@38A1{ sY  fjA&]8Š5R^P e![?pDQD,8Z4)`3 m6 \c.A #Dɦrt]lR`xɛ_fC.:9/52%N#;'1difruujfqLw8|c{>#3n稰֮ +ݶ!$A/d][ifnTcC\Z:ǁ&ڇ;E܅\{ &I&Ťr>z8:deЬlu V )/sl|PmX" d&!3c$$3yMCv#15"2hY5w%i[go<  C 4d*ʝSCA`ar7y~7\˖H1VWxaHl6G 6 ~prBL.RگBRK➋r (aAfʔ@>mC+ ]\![S(09ǎ ڬpNe eCA;y{?VQN8YLD3wJ6YL=m*ťN``]!H@8G>#/f@n3B` mNXjƃ.Z8Z e ɇʦc'W8݅GDh|Ë[ ݩui hL\yr-)wKd-g_< XM P \0,r,/&zq.0qrV;%ϕ㈾Y)|Xu5Xw8 S 8T&d/RFK;Gcn+ɲͮ:bd;QwUKjH!5x8+c)zJYCX;!@5RqzͰ.©IH$U3$qL7EJVH8T٧xP6봯7H(iLl @tUdjErB V^ +b1\Rc}qxtǰh ` շuI'Fw5HHPKH0ڟ %̬ٝT:sX{(mA2(o}~J*Sir0눪վBy$Q NŻ !\X#zBdÆ c=m6;zuH$5Bp*$A޷ ,j|4u Pe]|g*rc J ّsVl80t ׭pc : 3d%Na90P.3n\^dVzh4ˢ<xVw-F2lΝ' u$e3%  DM&Eǒ]E4:@mIk8q &BnxJ5lBSBx,oێ-3ۮ`Z8mo\q"%5".!'` `N';]9'Ndx `j^ ЅK#!P612L"aHvFZ UߞdpWC `[0P|{'lP2 5 N"LG, be F!GPzO36byBCoP10v#~бuz!}Xt60Ixn&ocb@LP E6K9NHmrXx  c3h̔W0ABO6>#o~d "!i\wo}Å@AB[|~FsKGm|9E.bV zsE/ m/.^YƎa%S5J.EqQpL\:e-Pz ieUC þV!h8sQAq6oq;a`6c}=͆l!vxF K._ZG&e\WX7KQ5R$zxIwOg=Ƣ.XY' HOgt})悽=0[BU I`뙳+szb5aUs#B|lPy M=k;)<"6"JvsYaE5|?\fv J38d\C'wIqDOx71fwʙ!T!.H2y ("J 8$]$t߉4e0<rʰTҎEي7C @0,jYB [^ 0p h(jߎ.\B24/_̎r,˿6׊/vι% 1ӳc`Y!Bň\xF \B1$h eArBZIA jٳl^ed@;i{ԚG dVOLiviKNpIHྦྷ) zo]84|dy\ggℲa#=^qt2g6cQeYR,;Ph)1 Ëw y^Gv3P2 o01UAbR).sE@"һ @V|[|4F97q10ȗ<Ҏ]oK}J|d8 q*[t4c U% _P8\6q:1L N] 4Ry_`JyuȐm2wx:$%uokB[Bc> HZXzN .^P2Sp #-@Pep#Nk\x4Tn>ޗ0i@tFxDeṂ9?ϕq\Gn"w[/(X%?g;2wÖ$aLMd~[-:"je뀦!$x#prC?/ ƍ^IdLὐv΋xqYUgB/fdmx0U7;\5Ћftx(W=N'EsFڪo@h2s{&@ŰBצKMx9яY z5E5ĕ4.xza'uB}cẠQx#Q(Pb%ݮĵ*)h15[ Ҕ7{89, z :x ) Yg.4tQ>32m%;\D*B*$Ko]g`@~cG`%e>MrF}x X x$YM~קt&]#˅BYGLSh=ChKR{|cNOa<ė$P,Z wHg1O|[K+ʌsC2bm4Sngls^:8!RyFx)ms $dv+ TlG)R9c<Z``=o+Ћ=GOBm"/@(\CXB8!r@cZP.3o| /&SԐWl8x>0# )|êq6)|TK|!:eN\R-ӹJRl2.}ctEMڢ7NXQ3HnvlTxI&r2$qs 8eң0? UL2L(fl7!EÆxŻhD&>ɇ2I4E;2/(^^T WmwƦBjc bL `# g\x^80c*Fzǎ|JÄe4pq;rb뙺 $"s{0(zx"t R1F8KfZ#1׹Gh&Jcfbr !wTAꩮ)|r<ڰT=T  їQ2$ځf1u6FP`uT1_$:sa R;uNB#U&CMɆ<Ȫ^5Dq)piJ<8@F& 8C VٙԁCPX1q}PDw쳏,2NC1`R"K BGϖ'19,/4}>,ESa3s)s [j-tx|@("q<7<h&F̾;$SVc:JZfBT.%m'!Hl0\>&#@?Szyጉ#\R+T]bnx'U"#vœ:E"!aӴ Q\y`bgxeC?a]̈́(Ep/pg/ >$x\CG0dmQLTZk~7Рsc37^mRĎ xDåoG=ŹmqFwr!a6[O!Nٰ+#~MkORp<%Ep],D5LMJϻ]{,\bt+QYC^z䖉!fp(ٻl10!m} J!|3 s:R6qj cW}q86)\/Oj#dC1drH˧HZoP N\%)5SPYINg؄0 ujn'lCG=Uǧ! ҷu~fa^ -3%%&I⃒$%OA'l(Ewx$ A~FDY~LR;~~xLs9'u \֏Ds"w 8|sd&x#ʤM_,%\G||P&@mϝ5F Sf߮A >2z1\hH ~](jfk^'3f"!5록xZ gXw~: *y ;D bB9P BG۔jH|>8¢6s>/F(|uz1r:x4Cnvus=(׿p<߿P4|1 jsv/w E &+F-7\ :E:zJh3e 獆ScxB ,WMY1FZ:d҉|)hrb^8~A }5݅qcLdL0̶p=3Mo%GX }Q~x f[(Tf(Y*mBM0};<[d=w8@$T81 dM: 6} +ZJ5EnWr.@`TIncC |NNLH,1`$|`n" Iw01/%;f3Lo[Z[<)z@ 0͜<0f.n2w-M[\,YAt !btglx'iA*ytǔ+ 7#`قc ٷƺ$y,*B fa AqaOH1 |:Kl9n>75&z0D"oI4a$؈4b2/.<\R^ 5׷A~CqA0!8ha{up`!q!3BuC9獦bf?('6\S }}rDeeR >4=eO(| %s=De-uːC`I,yB%CibTދJ] kZpڋe'esȕIBbsqTg¨i 1'Κ4낑Eĕ@p ~ 4BYOw'E)^yodVyjkA %CYCYE#pYbWƨdW ΈbaAWY]_\Jhba9, &b/s=_R3ܣ]\3'^h9&"!I(Xb] $B@[I"ީbť>9E:Tɞ#D2jdUFG+{3S>LN%šX޻p^S(@1S(o+=CdD(o*yqH6XM0,*|Þ\Y ]XM;љƑy>|_г8=ϸneq=0<J7y|8 K1]w0,@ UDbĴ1⡅SI 4p\8btg~B-Z@mw>c V41={iz~x 4 MUށΖ9ɭG; xW #yhh½z$4REMĽa?*ڳ>1:.j`%j$cбؙg?9B X8h3.՞sS^Ab=4g0m6MH0cnCNAbhnoSʠpLu A< gP8-G%cكƤ ڡ 3.dW T[{ŬʼLP:UGrH@ g[?o/`m{`ǎ/ Y^qO^OS"P"H4ñ0lo/pBH)_\v2@G 't/N >0_Ȉl/ &>7qTă8jt=86* H$"\^Zqk6-!sW`dQu0\Gvg\WB֔(1B|Y9!AkLIJL!/0*;F]<\kxc \bnfko TwF #43o4@(MWzd2"|cҌ?]NIlQ0*QÎ4%Z\egǧ˔v LeݢrM4U's> @4 QX'u9+Q]=ʣfx %~QBz3⪑#qؤ/ .E'^Y OY@#j3JE6cjNǸՎ|rV9=mY8 W"g A.M +C"MXUN*ǞT K>q>~x<4(7d R^շ$#jzMߞ\N!x8 +idY]A3q@U?"^^ o|@?^y) ,Gx@1 &|h1k0&sW3vpk_ pn#'(j3La[УކS\VO%r){yxG`M4 cm8 YnRYvh/u~=G 2S}z8s闂 - .M)"w~\7f0tO\ Kݻ SA +ecd~~x32wksjc8d5A#?BsDSGS[3pl9}0[ƹ vZHob^a0)\ oMx *"i)YZ fAg`0.uOA\Qo1mev3{!'Ȭ! x{3md/e$")% fN7FQcfdImϬ o%Qܺ)1ZVIfCb]&o&Vj5yZA끐exDomm `P,HRon:!!7S0%Fk K^wʛ@ jQqxYBu׷񗮝~1$?Qv\@YIxA ,l?;'wf8kmt87x;R00I<5\Li `y|peQ?)0#Cf~ Xw-p](FHA2C+ƊZb >sנh(EX]'VVHw ;E"H0t)AV e+_\À84; 2}1 koڮlwƤI0P<(J37ōL/_K.єhETQP]\y=NlP#°XT/gq3D#o2eUdcâ\ʆ6dz2dRBXYc<0f=}))l)F`8|bq? yQho&by-I1ɼ- HZzdz@mRKMvXPF3 %å x"F8xn@dZJurL?\RoYzUD5]uk+7dxQ7 I1YIf]C`:}p"+K`YP8<KL2caVAM9XS Q$ϊld/8a I)/ Űqg8˝,s5j!!/9Aa.J]So U y88H|:nu$G3`+ b0t'";Ô|U 6ԡsί8SEJl8R53?@Xܦ =bP&&;xr]0Ѧ%1k_>`gDrǣH`ИkFke C#:_\s. qLVIֱ|LkZ=1cަ5Emxe'Z|h}/ ? ӅT1Ms|v~x#E̙Cb/$'|{ď'^_;ɏ=3(L@.""Ddf ~8 U,+*R]|9_bl2'qǶ&?\ŠABOʍ8z[-VuE^='NxRzI) .D .Ҋ~gu[eEg6"UwrMF5J:P8ĸ5$X 5* p|ƛ+L?L60㿞4K 1>pgmʨvf,>9kĕ$*F؜[ hw¢:>>yC#cXwX"޵_G#(ziw{CsrFfw[ҭLʅs\/CA֒j}Ύ HflQ^BPQ7\[Mx-d=7aJDwx%5URjk8 &jRt~]wx`ޟ\Xܳ\/H } <ɡA!A#cxuk}k[a"dbF bq؛ TAgÕįS& K\Q wQ|ʸ }[w$Kd_< X$'C.翍zdA@DTQV1%'df)Ar5Br 9 "Ak4peNO|{XafG<Ìa.Q}wʆ69|j~Vt//548KRb7i.{%"gܭ\)f&f 5\xEE wpXc磙 HtFB oRBRcL-ئSw=MQQőJ,򉿐F%;1s} lB)CgTB& %ԔwZ'@*ͱC| >ShUm 3-rÙt'iZ P0Eك S¦PEsd[h!KpH*m H;Fjo|A7e\,+ Ηʊ`o{dCf\f868U 3whM/b,#[ ^CyמX2W4#<R3g$tL4:1cߢ3;E f,N!ԟO\a-fhA!$٭*rM=] ,DGz+?2AOlvSq !K.k?xrp##"e1r';QAruEEc;K`dko p@ , kD]Ÿ o8G#YVg {1rQ8CQ[^TG^Y4pRpcwPY$wrAP ox44f*R cyz-Bajg#8Yl({5.UZM#dxH&hҎ<1ި ^aX֕Vʼnz>Re>KP6y^BI`{@X5])8%ݾ8] vDD;xc#(X'^H0.1x`{ ֽpED-8iPJJ_[#UC(#-BO!&MPx9`'=XŽn:SZťS[Œɜ9#2H0~(h:(72ա:oS(!)eƗS\Ý^)*kChĕu”!# y1k_CKb*)1>`o?N-#D߅p&]ylA0Mwkg"a]C^Ud\G;yƲ\9Xq6%,`Eo~ώaҥeb~q KrtB'ns>gД.2f8"y$4z&6ɖ23/l7|F xVA\Fy9oA[~D8$iҮ@֝{; A!/P3&٠aş\ 0+H\^s2J:Ϗ\ @9Ys B m>v|r[AQ4B۲.&n19r7H`  TBw:+X P!NBGîl!n*F[/LXJ&NT(\e}p1&6)'!1@@KdC2u" M1>ZWyl&G*[HUݬa;^qB0{vM< mqʃEk\̅DBx,?`h2߾M+I*죳( uFѓ=kx@ Bt˽85$D 3 STҜb77E^bÆIa8\ؾB鹀ٹAޱ:Ye^[pQ'dT |΂%X11 GȪFЍn B!vú*o?eTC K:B#:SDj yyEAVQGָ0>znݩEU20WjUDcctOoK)0}y+! 2|c<*H&Į($} <۾D|$hkS~Ťad9$#=Jyx;@dJNmJSxx4V0ތK8îjh1>p(KF6@'*_sɢϟ8eX'4<8$ DCi)۸U3-&A27:!1؎&{M8ŝsh"X>E8JbG,d$7?eZ;+.3ǭaUEUzyYDx&猅T3\5Tٻu h{< T KlGSREL}޸2``HYx);?<px^X8J2Lf\npOCx`ih?A c}k!2`r ߃H _:JSQD9RER>k-a%ȏ3%@ n.xfI }>Ƭ2/fR04tr |Ʉ NT x\_] }@?c5c>/ʪ>^( Y3d8QG[NSgF8#ͷ60Y*ԭ߂q݁.w̤#b.Dƹ@Me'U$n2g\%D;O( ?,߯*0gI20d1A v83AnW3ĉH69z6'E둋P8lug}GXa[9ݼā fY0'`h+wS8uLNKasS~~Mr+??!{Dqvʰ;x~2bi*VT LJA,qi&{)I +#;,  P#~;8yJ&r'#Q?_] hvd哆MPAd5gYvZ1gk8DsZ~R˟fH'asڹg 2ʺ rA8e8 d(Elاýl 7p]0qE @w tue*\b爨87R "g\̙у#n_g #+. 'Ɏ0KAOAWp&'hwz*b#djH'wn9FK$;*>ɔӓǗȨBp1翮RI +Vqg 4̒4 & =GG(SioxljE+o, pAC_.|E nnM^$J15Pg+×>8ped/s"w\W a%5N>hն3YN Sb~x ,M1n{4(E <Rk0&vDEsP"$&0{x 2EP{Ǟj= |%9 ˵&R1~+ŵq}5ɥϘv'(x:oW  L=H"{HT@;28&?9NB鮏&JdJ`Wgd(`F k3@[[ vT>D72; KZW(d^?gk0"',>&)ˌxJX {ц>qBBUFMmLۼ1n[p> Yot`r_=7Ky*p48֊a6KE߯@̌k[:P TI`//p)exBj"8ql0n F˯^xȳB g`eK^T@0Gyߴ -z ȕLw*-WIohy)PŮ7j;S\ ,,˧IH:cc^t4hZ﮹lu$XuS<'f0PsEĸ('JЛl|O;bPlb-8"rtM{: H"X5e=63]`P9Gfx*#q4ds2ᏴjaGxlELb_7Y_Es ?\D3f׎9 js\XGtux i.LlEQpi᪃gb ˜\ L!Yb3!hQuA]pg"E^ zhpSf,y:ϞәpsIL^|X9Y;J3 ٯO|0 :878GHĶ*D@0| 6y\1Xy@s}\oB|d*#Iɝ5'Y4! ?=ܺq8{Wl78fk_@W7Dg&ۅA#^ muqC`ߒ}5dŰ∲[ "])9JobZǷ"e1;'ȕtk]?r!B4&(r✿ h?SN)}û× yEi)3uá v. edQ8F|9\=,)4$!W Nq.IglvS9L5]<^^«;g;rG>{pZwBcWbDSᨡ`zcfew5JWOFa9: Q;x8%2"U€luh1i;{KC 3ӓw!<['&x@p> Z!3 u-kpy &s]Cra=ɱ"+y7N(7*$OpuDS=kDT@Jvr"Rh8VEHD=qH!c5PnD'( =YӶ{݀xHe-y09A.f8:33\08;? (pbP|wRtθ3.6 K4 Ej!0Tr;9_(9j>< ^߮ka &j\0ӎ IvqM\1n]c i(8Uߧ$ .Z|aʘ)w\kAfqja]病yM0g"e ~xd6*I.=yu@*]2k\@8gY7áרy"JQmnp! %~MFJ -m\I[R_NFAb [T<0t$׿d/zCR <^~u-hrh0"0edL'޹ 0c跫T!7T~~Njh%rbEVD>י31cmȹjW&|@V+[qqPeQ\+TlY.c/^־al8ga Õs:ttŖ/|K&@Cu/ C '>D=*Yԙlj3`{:Ǟ6n ((! c^FU;?^Drrq|2 <BspP@ISo":f&?I4kZw3`Fb^PbrƑ *h8V#&oh%=g @Rz\18Bosٲ!gs珓)IMp֋pq0w *Tk3 Dz,bAa1'0jz/!K&(R'PT0Rl8}l۟p*$߶f7vܨ Ώ%FP\Z[Id.z{%a(Gve &w,L-t\9<!ʲ/cpsOh//\l֐?N(똋1z"Y+hTV!S/+Áِ};pQ-G"-XG[|m_g8+h@:Ea%mⷙ{ Fii`q+2 ExUpas$sB,YM.1%„ awĄp|8CwD{:rq늣0oBuׁ&1,KZ<@J_zΠb@^x #F8L>\,=\tB鵠|\@sˇ#]٦ei ůK6 SU늋K``=lzNhAZB\@O+TQ+2:DS,Ă@e [%-ksM `EQ˵(X:|ݺUI DaP(xu&@~aNOힺ\+ n8lqz}{NILB!3Ͼ=) ]<LRij#~40d)qDj3F3 O~xK@BigǨeg"Iܐz \hYdFt?:1CjcH^`.G\* ck,ɷD0h5iWK qs_.Oh1T\'Pr#&c3oR<Dힸ!ׄ`LBǀZ=w ^^$Y|tH{8 M u3jp ~:R<~*_ɬCu08[*&1J.81VWS;Äfs? ۼzV^9Ă&T7q!J#\Qx_C)-<ʋB\ۋSX!|Xѧy߷Hd4`:‡Yoblɮy!%LUK(b%b$jCݬN[!:/3'FGY 4g25%cKjuKo%<!2Bb,!Apv)`c5W5Qq9?Bp5E|S|6pgS91엃c ޯ.VգWnPQPƜLW^ @ ɭ|y@)E<, /ACFdKddǘ6`S>ag .:Sۥ 7aYqND`ߞ`;đr0,5dКa8Yz [?|M%YnwOxT*sXbC &Md¸5!5ʸ\ \v_LEIr)W(H|,2t_@[`;Ljpx8F5UNxؠ,roOw FGqtaLkf$sZ Gv+é@$9*qt)@\i#9¡ (۬ P2&cZ! ((8_Mm.D_&Y kfkKIyPO$| q5L1̛̅_/T32^&L_ PL_yLC .4xy`DmA<ĹqO_<7޸l"wfϩ81IfYQ8{ n>xazVXBcC o6>Y}LI9P)iÓh2ExFt+ੀKVO T 2Y){zkMEqs)ZSŌRdXJG[I+f.O0d2.(۴!#>]@ɘ2*!}qXe@3]vfz%ZoNd oXH9Y>zu8*>DQPƱ{8K!wQ#6;RAtܚ`'FVx6v4s[M\ :0EWa kL}=q=qԙe+Cq 3"YSY.5 c\P 䫊۟11%M*aЅnA2}&w6&0^2`{$f"}J1rUJoļM:x1 1%\r~384K!Ն\`6"jn $֐7808EqCMr2 Ȧc3r*cLdY2[&ݑ,}ƨ-%6:W 8EaL<(ys ࣲ82Q[u86Oɍ\p5h7cWf%QBv7֌~_eg%(%.E)9Dr&|b|gӏ%$ kSPU3g|aDc#8=|V_\a/ӎ?O%EAguK@ `fzc2gpp0z0evPO(Zk{xpԃCR{'i8gG|G[gPz3z@P\V:` N^(b=[ܼG{ɾ L$Ic>/rmopjȣ&qEg.dC zZ&JL ^L^pnuڋk!4.GqH]\rk^`'8Q? ,r|lY.g{DaD q@#K\ÐZXAR!+U+>潶{7c +K|xQwXʲx8mƱzg0Xg~L)+ \i8@yOAm$6.ʤVꍬa E+la%pҜ=2<$C'ƹ`FC Vއ8LV M|k;5psL_<.<)!Cd_ڲxj"#Ư&W&yHvq!\rԪbM7.@ %x2:SZ(vB$LM]<|i'_'E[j78LR[4.ЬM5Syu]͹/OX}BB; JofCoTj n1y!TQތ;$0@^ɍE4 QPiYlx byf.;fI\)3xy@10qxmЀ ޱ{bU]BLWOS|]WN\ycؼPb0Ya#¦!un|IŒC5ˊ  Mah*hu'CYA@Z@%{HK*`- w9 B3Rm|^fMWFZ[\>j}pY+S*FGKJU %syF6=*GRm01G;"; e"粥gX9g``헡0`ϫ^X%rfJ2XRָLCpoK p=8t "c_=y ;>`JD!1Dᗍa M(-F^*V6i<f+spgx]2PR+);w K#;xvV&PDOn !o WϏ"Q:g `Luīh@"$\r>Ω%!ps܆30A̳H1{p_8 R)\Y Aϗ&b.k `@,E;6 ʟe`3A(#fAH-H69H>Q65O x68טILc 3ۜ"d$dpM?"3+$T)!g qfk[ōhhȑQ{h*:u)G]u3ȧ6< ,X~;tb%y8" ~ twOc爜*As K#aI1O9:ɧ =q#@Cz9$Z/q8r#῎6rm r;< lw.,̀?aaŀMXt#' ~XBle[<nR*GZ7Vg| oYdu4Sw:*gE.rZj9B/8n\ky =c#°F.Ȉ=p˃WȚ7QL\DQ~<[܉^ɤߎ"<١e\ؗ-z#!p#ؘ! To?OA3GaeX[vsBB"۾\a=-y (u3>D`Mu3*S8dӕ5pîQ+dZ Uq7(qVwgMeAI Bh-,Y;?J3Q7+3a;ړo] |G MI3/cE?4.h|x Vs놶2N8͊j8dmLtS'798l:9@v3LXg?;y)D9r9*=\jE61/Q oBKxȐ1o8\@ކH)500M+.'<^đ0fU_BMQX]wDV>(L#DToxq ҡZg J-C>`%P;Ugr6G\BAOLRRPޮhJv6vG|@m\SFGYC2aF=q`ĂH-eM徸5oW>X X < .)\k9k7:860f=G (-Y4& 78wv^Gsz>g\Je+ |:xqd 챧 [YێOmoq*phaE@ΤdjF(Hb QV#$ 0R-bdҦpi O )2 MF@h$S/b1Q.x-)UD&ykf(3rgpB)u9 &ƌQH{k2|a` pN &Rvpa-0~Yp|pK!?\#`BHaȶyI߄&8B> Do~qn!Lp0O5dF!TɮN1kML0<Ym&ѽǞPL0sFK  Ɉyp "`nuNA8AK|q1V5m*N"FDPD0:PņV<, 0P\z#`}cw@BAGHu=/ϖ GA1X6 aڅjMR(g; m1Xnq Rw.%J.rt`N>|*YH->=Qњ5!i>&!oqQLx$ͨSM<GL&R*;޸L4+@25|K2aĊ{ܥ@GNֵ۱q`MŁIl5ve6pFÏ xHGaz* 4e00.aW, ?| esV4c6 &.5 &hyHɫ3$7N7@-\!{ DŜh\٭ 8\ChI[ acH&[sku =,gSG21Uɖ`㮟WCYݬ\Ͳp@4 Q V?%*:>L2c,$10Q(kR5 a873:8\bs5k_xA,\sAiO I w_ƶϞ(Uٱ K^q)w()s @"Y;ۏ,șF u`XR2cy7mK#c`L0ٝ*ISAM !3Dq"l|ˋf&I@gn>? !{dSNO" Ȫ kh<})-X"]QٞZ,eq'M'U mE2lH ܦ2&Icx;g`@aB+OESFgy!9m~xxIW`ouJq2V̗_*SZ.O~%SY/  RÿGRݦ:YzB2 fe`տPXwv҂̙:y,_6=uԩ\Q>R/D0DiO灸L.cS<ГdܼR=[xSzwX ;_\{PY av૑@qD|36v&P`5Cl'(qPc :ߞC0ފg:x I@ε m|Q 85JOʑ|CF[fTyjhk F˟\[* @D8[\($ߝR W w Y8LJc*}s$E-MDpD18b]Pf gWPI(yl7'4է@Q[g> a_qDr7y8 /ENA^w~50<,QrFhołuz&:. ^@-("Pe*~MLs c (Pi3NCچiR}n`%TŲk〪"Ѐ}uXU8;FP\b%\bp"t<-b;1p:\*L@kGq,SpPf.X40γS+{fmԜ 'Y+E BN"e1 4><~K72t<Ɍ&@(.WDnxQ u\q%oflVHoEwh -`,V(L%mE"X3H=ZQe +n_\.>87;Ip^4c1b"x@O2Ȁ@8&oθ0=F<6\Mo7|/۬2.yAb]s<Ϟ8Lş;S`nu69 \||qgc Эӫ&k\G@JKxEGX4}W-N@T qSs5G%'iERܘp<#LA4f\>&)RTh}Ph rhH\kFw|w w⤴LDfJC -g /ǭ8Ne;Qc?C"5F| GuY`'f}mȗN;i[g1]hM 'Mwgx"NEZ ׷G.LD ƶ#!Q;<r{ZeuEe: k \(o8<1 @3 q4BHfxI=qCS$k0{牳K^tN(ϔR,1>\f6y| _ 4FJ[-CȻ<;R8H>e!dsRDrL^Egy#5{8y &iNq#Ph̴3HR&|b5rYTu뇗${n8u NXJ玷mZixd)/h-{"IgW(#(DQ}Gq%u tb=k ٠&8y˗djd6۾JqVeYKƆ-N;1̝ ]Ɏ ^\\zGm1? w<\Bei -XC 'czC`oL?<`a뫟S )\HQ9GD P:s >.Î/6j_w0Cr*{K AU&[щZmقmjPg` La&d cx69i+4ٍkH Filj8{ 2Lwx(Ue81@aK8cCmROt k@[f6x]c:Z@e$+;0ۇ]p1S#[KX|b ts YSe8d}f Uq-<+t_ɔǮ[cA7_3dՂPG3w0R3b<-';aD:y&+s2< Bfct" _,' <(V+ySgzd\?{K|d0bzqPxKPvPOG!_>}x2 `Cw;:(TS뎘)jyϭqٞ{1sH5N8aKc|,H(6ǜp[13ĺ@xAAXbqj nsޞYb@{,NJtZ!/<g jH޴8ymq! )ԌXd[. |Iw]*C2H dt|X*B}a&4LMr0F =9I!J8be)+dBP;ۏDch"Kߙ@'tnǮX8<Ǖ>N ERwKLI[FT!,wO X~s \ S0V/TA5MnF[y/ytIty.=R g}܁<3*h˴jr vnۭ5ľb罉1RG+!F b`qWO诋 L | &==qSLb\~ȸz]#^#  Gx&dI|I4#?Hz R9]A^kV Adי;NR/sK_95A MQN&8$"_n҃ziB 0DkrjEcs~>M+8p%"6moR!D: -&gzjaTiuֹ/C*2|2g7|V;)In?@;|Nvi@2ּplQUL.i:S0L/SiJ3,rɑrzzb &D8L8zb2ʼ~_<-j0k'=s:-Gx LP%>Dd@hA1~A/bz^ oI!ZT \ٳ}3)"4E%ObY Z' "E ; ⢷oRW&gT \`"-UvrLQo i2͐s ;_IȮ* ?o S׉IDj]D(1sƠS?󇮁IaoX pz&d%Fݬu̴wLGW:f1͎!i&s&9PH$qKQ 釻T ; GW3T{hMvvreRq V^8/.4֏N6 |p)ARVvp94:(%a燑Ӿ"5+f(Ѳ}:\hGl=P;A:(VX;G~*@hQ.Hu&;ju%.sxخEu,7&h17(n66āeV@ĭϔ*ps^"W=W+^0~3 Rק c*A_tNUS5P u^"Gf\*gzǮYV2 @5ky.o̻n8`)[Bn1s<W+@q=-8& ;@ Yy:9JQ4o\XUxyl`Haό콳44ePĮ5fR 3pYrpQExl$ǎyOJS%ItS>cb\6%f0,')2_o,a_8*0|Ɏ'$sUlyiɖYrr54ӊ׀ o`)TƵ^#\XtGxώVt38zSEXat/aXus3o1@3o Mz85a`ê4 e0^*3CzZpDrFg~Q*)<ƾC!cwύY3w7ɤ#G>H=, 4m~Q5h yr\&|h4 vju7Y!1i9VZv) ]_r+ƞ$ˍ<̢*=Ԗ%D^G 6|lHAv\Wגv7+~s"s[ C.1=fUc2 g`rlv>W|Q 4&U=w;k qig2H24{ Z3ż e`]i @9/A20 u0[>-g<"B AL~218d*[$7n8!)^2PSgEep#.2Niєȼћ}1mwf֜$Eg7/@nejhD7F& wʑ)|x䳅i >IǹQU1˿{ `ɄOh Ϸ`K8ў)4Y> Y1y%3{8hg]0EO;i*U K- .AL39v ^UKpǕLўγP I q{(e7*1uPl.PTdB;>o F)5 k87d]|od'c={=H v2㼂]{SI  eh.LV;&d\i~g u![pD^k4C+Q-,}p0xO/eR`ХG0^~ 4$îW_z=nq&Vv}phIPM<4 U05£M:>փn-Ļ=Lm9]1\r<5Tcau}s!myIXf.:ҵ9ic)P=CyuS&)n54YGXU121.O#מRQbBMuxt$|WTr0 #VbLՕ=rC麪_?/b:\ku,Wh`CI'nZa>hz'Fx&Ⱥ'b~=01K#ٜLb -'l,Wo;`H jD DBǦ N/z` 9b(ї\BH Sz,; ei\dǴ< FԈԁ,8 y$"Cy8\Py`46SO A[>x1i`%Yr`qt b1"߂-hJI4ȅƌ0|E#~Mp C:LC(֣ZӫHK8VAA<cUPTढ़8msE^E\:▲Yzl8_ HmfgQxUaZh18JHC&6ePDQT5|hJVubAANhN㾞9'ݽA@@Ar v1hA4jC to #ONнwTYC+W`c|gAh>8JdA:s{y an<]u; <0(y&D16`c+!/熔 %,F^xH=i&r.~9IJ/[bi~<Ҙ,ERN2 /I<f*Y\ Ȫώsn1\N a;1̫1@GV SܘAvpH,~k# W}q(O%p./ űL} ,AaK}9y3`'煒1Z0`"/=H\wLGr9 6q 7 ye*`|d ! 9؀ c(!Z.@ aoqX1l^5{\pR/D+.6wġb0c?V *хVlartܴ1xB`0CVlof( $|Lq\u 5I7"TW/|T>]9  0QikM 䁠cy&&eӬc' [g~#q* 3ĝ J.ՅzB0Y3뀊cѸN8C$(m *DCXfA0GZ~:} IE*X7t)5qˍB|>4rl˦({AocA`Jvc̔zW;zR#=X@e/ !E1ĐJSFέ婄o*ځ޿TG)S``, 2z.qS|`q")踇6)79X2|hmP2 | &.{|D 24 b=Þ|<Ҽ_%H$ԷE'$pնP"o, tެ{SL[p `A?v-.B% B a,JF !Éx$D<?C1qlE,wzIk4Zə7>&O|Ak?-;]z\So]gGټQ:&"}pa4v QpRtqB.+g=wqKCzEdw  g`4.mpil7JDBL-CX(ojb<gxnA.nSz;HiN1e3q 7: jq!./|x0ybaO뙥.JG”O=uH\e=Sp7#{%3栞r'4g d&ʇ(¹ h]yu&O- '~gkL'| )SKl ǎ0%L#yɠ`?d!X&=Pɿ+@^]DRsAD:cL*ȒpqI"t 6gv d3 |?0h#TP]E.uĠ<.\&O~gIDJ ;f=XXᅨkU?LtiGlK PI*4uKN.ZfvIm* LE|c JxuuiS& *`72L_f|:0UA/Ɏz#[Ypwyx-ާa0+ dx8gfP6h8WL&޹ش܇.l.(`[_;4C0B2 L,"\lS5r/ ؕ&]ns3qj-?[d㭠/FW8]*-llhT@3q*(XӖOgSI`2 Ͷ!bרn_ZK G+Eu!IxXo LxI2]<'t^%io}A q;ry8@B 3;CR rzT2Xup'|mN{_0|x`oL$?*+BSIPcep`;)'ϧs"k1%{5|0 S]ԭC?sQAp+ٵr3kQ:( %B(1~|PwNdEM?/XsWc$b߾*ipQڞmxKR;v4G3V|k\rQ!^z|+ dfZKe\~yU~.?g.Eu~9TNU$p^C_8/baSEvC hnT xa@]7|Ȱ  }|tr!hP4-b^ј2Ԥs?0B!'' o~ v4+`.|y2ޏr'˦xβ a?ykha2q-pm8Y5f'p'^yaK{k<.˜|X0)'4~LM ε^D}qHz%,R3IM2| tT$0s@C;f=CC!}pXі8 (ev̯p-[-,X k*{\$AYozas|d,i\;`QNl.{6NNjʔ @cq>)"]OrԁWG0G -;17jTI+FBGlG FI^b0XVȬ^n3tcALC(O=Ƹ$U{%`\fS.F&ԓK0`뒉ﲮdUWeCG޺V<)qGa&H\)<DM!a!9OayU*su\ N6#2Y\M,:q2ړL`4\QI孝\EO#YJ =r3}<_(GM^?'2NDG< VZ!S_3=CHsaF+`_̰20G$m]4Fٯ^2lzH7eM"u 2c؃M8sw+aq7ŠZNW!5 ,;'k&$qyHB#8SSjc:[e 2Q#ټ󇒐>?Nwl(YL&58`2 1`L`jJem$5od!㏺@ŮRkۍ< ,RSNB"и  CwJ.y,)5i"]8Fqn|3 11qj ;FoG닱,ӟ8@Yݽ @0ygYdU&ea,S=D$ڱ(\mnx2bmKɿ:⌷(/pXyHHS ;sq*ʂվsy 2#3yԆ0ez3z̬!36+u (}qҥ4NMF\w9,1R r\lT !cy%\d 8M "}R`fjφy$-88ɆQH!3m10qN >~95F HcF,iq2g>X1i.lġXBpG0#%ZduL*) ~x N;6 GGLu$xEb,2"ώPk?QM&ϾY=!m&8)WnpPAT=LK3rT@뀎 q_b8 s= J_pp H :# V`(0\䞿g,FUl;?:(Z!5Ty%K|81l `]:4W83|^bi}W޲х"?c.{RqIAI g\EIƈ^K!T?γ8 ,}#}`Ty|`C.߮.C4dn7Y瓸`2jB&q>@gtF &9q-5Ȁ"܇MɣwjXߋ ^aPRNM2`F7u".>]qY(#Ic|1Lr4iue}qQgfTP*˒̼^vT6VQvn9lH۞ KQ}5B͐hVqmeIȹǤЃo\w:[8(?\x:?O)n -cjKc͵rCyU(G,|[)H_Ǟ3aӺcDV}Ƀ'dMw> ⊾"L(Q7dM2k#)٠I3}U@{_9I!Q8OƐ2bF|aςg$XB:ј -gl5ǜx9ډUR\Q#R޹Fr+mvXp `fo 9N3slLh;|*׎ȽH{DaI/1SBoaDrLB Om7*j qjȤ~Ed} !㜢pֽ={ٷ-|\(Șm" dC>P&X`,XÂaqFI4&'t6W!70_\L,- B`s3"}q AڮoZ~砿[BCx3=g'XWo)P@o/Ӡ\w#-?^ZJ\W91=p0$cx㈁JQU %peg.#́uϓn;:׮#Oe cnmh:dE"+w)+wV&seo QP>GLK2_kN]$n#%&dӋH gG CWc;e@ޱDڕPqIfE=xcӼ,oJ* z4-xgGU<ě;L 1/+FV73!Ds@ G <"L~BŸ'W1:vTY/afQ|dℋqʥ|rf?J0QazP4 -3*=p2 35|+L)r=gْ3?Y{î*ȫcX:2o?cO#[gb[ F~2rN.g7tgz9$:Ԛvw̞-vL2qdPhtD ATγ-89px]qҳrj`sS~ wZ0FMMzE ҀvzA:-$&#Zk "(u\ 0'ț\] @2vOrDY&*HD63 "FD/\F[<|e5=QiJCcr ?N0΂X\B~4Vc)*NQ† ׇf8<5(:nRny(DžF'|EO;QSm"r6pXqI'>1/'=;%`nE>©s3q4UK~.ɱl, +ԗ%_o~MXuሯ!*Y2fD^a!^`IjT*NwB4tq%gBb댔˹8a0BnIddR a~qxHz}SG1-VK%R}H38BAt }qtp5<#1FF*Z|)1ce(C %[ ߿yFCR(\(l.a˛}w =* [^9Lbio(5NJ3 "q1r7%c%I+Iߌ^' !pO=P3xJ{(:.F=@rdU'~Jm>g!]t5 xkj?#'B" VJ'ʭyaYf' }O$kDƸ2ku]hFʩAQ"pnq,qLdW &"i^ d]|#Sw#'Î%S &OoL75x]i|Z{:O<E e|{9ӻ|X Wv0omrI9f#|oaH50H]6֜BSc\1u? DcÉ 7z y|y [sSjnWDĶ{ω!jU (mzfWX  c.D?BUa'YC/#F9T}g< ~gy8de?0).^L5$`95r,pY w(+jKrc8mjq2O58g5y 5o跿!"iɂuN/)LRPBuD,+{| 0Y)kg ymx/u_bW&O‚ wn>' nsF<eό@|!J:="`P0vxY4y*ler92žOA1I&«~5s|/4@Nƣ\dn3myp@2W%`<'j ][z[Hvh׉n,TJ^p!5Z N8;q.+,b@dӌx#Ȱ 'fJ=Dg71|_*5\kti4bk1P+^f<ZH+w8H@xg8"H*-`iw|BQύ:BRoa^ሤʅ eMa'g;h{^e>4RQYY<L78&槦D+WǮWC'|70kF6_,!M0XI\ q2[Y% ߷$`V%rg =plbvUg Y)4LA8JVl 둚Aݲ}iቌ7b$c 4027x nd]ƞ]$CE7@eQkJTg(a\O.A&coEAV͝xş@be|+( ^;0MwSn𚎡degG р Ր5>51"DS"if%u`Qjc29!?g00ii<~NPyI26|xw0<;#'[wмb&eCq9=FE[)0aʦfM\Ɗd[ψPssid2wO\g$+Bq&J( - 7H-?Z,5O<2Ž2]/5qP,_ÁZ [㒦PÑecsUs5Nw:*"߷i{_\ξ]r)ڀFRĩM~!Fbz4֬dIs3>\#q!W,dÖ1VC̯qZjv[/1j6 K_[92Zʈl mY&]p9ǽuaP\:df:L85CyApdMpnd6 fO%~<9w 5\c#G"! MqD C\4ܐ!8ѕ`юH,:##syf]aᰊ{GǷiaK^h(|>?eOxy bR²esH1 nau%3qX_$5̨'C% |N0瀈 | gHۑ"ffDN1'+`cw|ǩ_#`=~W&-8L 8InSx'5@ȇx% L1 p"v2]M@YVhy*Se X^q d =NDcPrTV!?O1K=XXa|cX%] 83P' [:/ ;y Xt ʧWii| [L1g;dƗIq+N.<(w<^"5r% y`uY SKw dD'/J\c/~HxЍ7X8 43 Tf{ Qۯ>PN(T:{M!L =nK܄g 2 XMG0r&c wx~ Ninm"_r)1r $2<2d!4;_)M(dS3e ,{Vk{x39dGtyYTmrѨ>lB1r`z}vل"~O*]kx*m 8FO=wxTiHy!p]TPfKvF$YY=\j8x"X2`ؐ q*u<^P. 9V hRz8JUWTsm}|1byg3O qY@/ktѐ|ZjK;qA4\5z|D;_f}4MLfKe< U14#L!{{ģrW!7cs#1.\uųV}2Ss|ɶ (Et薣C[s1%m!+yɣ8=4l3XIȇ8s:PX÷)a6J7>۲Ʌ'XȮrQ6=6pً1 KٍZ %y1@,\Ul2{8*QD9!_(h snUwQ{5@^9upl xVF&0jo ) x2(FAe£x:ju>r(#s8m [gقMe,W:,.zL) o6u&qxAo_Be,x&$~:U׃Dgr R8g]ox2UT=Ӆ( dNNGb-m뼧;+9` b9@/X*M/|bL3&~0.YZ!|z)9N&^<ŤIpwpb@MW)mD |r@Z| !XVs{f8+|;/hיte-ĦLE^^=\}NG>| l |ּҔq]Ębļ$3Iߎ[ $E3W.?R!9 t/URA;0O#8|ynK;+gq H*5y ={ +"zasyPI^L7|r@(׌\։[6h &Z  ؃u+Zt:Kat+@.Qujܦ 6TpzATO%kƮAsp)@> _c`cɗy.<'aM=8Y3i$p.?O%?\v5-Z+:ʢM"'':uBE\b0a&)SJUg+ɇ_MBP8fq0X * M~s8U};8Qߎ`?g('V *nfP Zas%nʁ(f"$$mk޹gT^o) &,yyņOA#Qp9\]eWUw1R܌>ZazbSFqxe lc/ㄑ̲{1H42 )zE5 սqc(*6i4SAS%` W1{Ć8u޸zf{'86՞폵ѭSL䣈 ʦ=7NJ @ ?682QV]\Akɥ#X2(gG-`#Σd`"Moڱa2w]q0 wPMRV'8ș|3.B%+>ϳ눵ʇG"e?_T7)|l3ʤZơ8XFȌ댚%&KBmV(WôBۢ* Ć|΍|B4Ltq\b3 ,xP[!eXFF 0( Mhֲ.q$3]3:] .=cXr) =L,z)6iNNA;gʂX5ⱗTL9D%J{7'+XIK;a| }Mrӌo v:\",򋻜)tYa.( p-Cɮ &LFL'^vϾH8y6|,=Dp?Z6h &&[|/$r*prpi4OΝpHyG n˦d]HLSEΞJM$as=Ǚf2?6A`p03.3u0]\cѻqɡ0ܪm{p1ٔ"`iP͹%YcPz:\ky[IԛT,+k6bn#+UmT*ȪH\됤 Nc~IP0{`l`g2:wL pb I:ê f*K#UD-m<}8)z;b |[C8 of3;&Y82- "@H657 3!ⅵ4*fC '@[BkdmSy{OPL0S<>Aw}Lq~H '|<*Ɂ\TGAF+ɖe5 8k%yNT|fy߲Jx.X-Sy=BUdƲ=\"&Szl4u"w:xj2޳{٠-RUY6n(ɃN7*;@bnonybTeEL. E=]se! b齁s[! S\$)2ԻZI"@e. ㌱̩DŘdB)pdB({d N1nNʈ5yF_}x8PY,*5ǀ{ ( /b@K[5vOΆQp g"9d6)yA { f+(xsLp 8&Sk~8UP7<)/)nex\zɟ<4Zu@ռ6Mx$~F#|m:a$&\hSĠI" \dAd!Њx诅zkԎ<' f] :\m3 DDuC+pcωګhK x0 n~}N0k"wYdq˒uDe/B̞+Z[w +BDoCFHBG<#Aj4694=!tz8b`ʕ0 F39hĺNng8!H ;{TpИ-WXq`X9q̴͜,E($7۬S4slt>NRkYZCjĺ0c\˷@VA2I#5HdSuX(,B'8x sxS'Khk )2+440 Uc=G [›w*_JxZa69{]kp: P07S1?%+>U}m䬰?{ẙr2;~Õ" 9瀏Z'9$f}qV*y1n||qEin ]pA]K볭kZ4Ele6"8ϓ 뀀!OsyH\լg-㴿jѷV0'{o/ Y-xHksEAWn G4!,6XCOY.!o^{Շ[?T0J3zpc5gޑ]q#b)zE&N14ar2!R< 6Է! 06x(XuGB%9ZP|dk &mS@.>SVi K&@tƧ%Iq6G\g rOP 3]8#(5E-ZKo"f՛DCNd+dk:8ES|e ?θIe~b!z pWa.f;tq#Q]gE ᕩ H  85Zw #6^8d[߈C#L9uq0İLIL:˝rZ^_wȬE/aX;E1/4T8u,iq<$K8׮9+9jp]@ ҉  %hb>oo (䫣<5@o N]HvX|t?_ Ҿ:6jWGh%ױJ7] "_<(6?2n;*G[iמFeP'| no_GCG[0YA2x‚Iqeb x:#7bv.;؍Q1`={eF<Ed1E H ^_Ҧ}|r?|epf}Z Cp'?tJ&yO/.x&/jθ+#"8~pBZXk;|8 8q%xu7A5JsLpO$#>3Z@MGk9< ,Ӏ1+Z eRg|F#Q\8ָbbfA'Zu<. +EbI1q _FdD y9"IeI8E :q0*]˫GbÓbACK%ɉT]e|iXu_<<R2 | @jo)TSs2!qDFUN/#c[=B*d;?qhHex2=9!XzfÜc' <+8̌l砍n|''g ̇zL6H3jp>I(% g㐱r~}qX߿4h,Rq{ztk^+&`-X!#9lf/{f'3S!x=T# v+(zn "6%Ym\?f8 G#&Ϳ 'ܼqc9K\s L`0h?tng1L=q!*v ^=`JK#48샲՘3pmkl5Dl18 ϙuW>;€azrJDT{%% **:><GeL_<) 8P°\l׳|oʦ|=q|Iی[|.,O Pzo2=ˇ?\ې\^^)@?R'9RR)Gx\P+IϒD վňX!<;3Q5<][j)Q 0 <Ůp@G[FSY];@PTY06fe0]̈xsא7&3`;B7Lz 9D@?4JgP15ѥ£#M9 rbep ĥ?~~d "fdwixZ,)$BiV>~LjFﳳ )nKL"~8pG]OrKzDѱaf>&zP},y7Ju@G=X3:bъJ+;7my+Y{gTiM7]*EfX{K"ON*)*g @Jw+kc3`D)p}IA؉\IƃAJ#ڬ\6* ߀XYa0`gPn %5 t#f24B^2xIz5n;ᨚYTFyxOזԏ5GIC?\ k`u>zbzﳔ,C!C='Хm:DWCxPvoq˳/. eV=|0Ώ2Cqi  )HCh+wɔ>IqD1: S)zu c L4OQ > xEQ d2y㊈ 3:s("\_d˼'rhWtk Ԫ~ T?Rb.xJGԴ2U :d<*[ۭ爳%L8(&:.;=f_! -W`0BU@VyxD[I133i 8iٰ!Bٲ;^bx[;ⵞ²+%h rS<^3]2Ƕ35C+WLa3De<(y+= .f4<_D6XMZlXV!DW߾f2@";uG.zþ8e"y|j*PYS3'TAֹ (311N Ϝw\ԟq=3n.S D)Y&Bʔָʯ {6㠐|dWz?:-NɨC^xE9x߿\Y=15orN&fXCMg"i8&1 ;X/.<f"1'*)qtHcZǮbp*CM\E{F3 EP8Hڡ7||4AJ29] Ej;'NOvӄLZr+G,nw3!R_{mW½P]RcLHO!PWJwvㆯ$63ki'-$;x~1 w wٞja*~XrACp;! UYci)!?GhHYr^Rtu7̈4 Bk8pwD .X5"?+QD\-qy`qIjpB[R&(7<|5xx&@Wc,R.i8jtxYݓ;)yC;xHm}Cg畑ύ3VA>ɼqbԇilbf)Jeuo0k\\\ֹBS$.vNF%bdJbv_\&3]W5T `BT[XهD>1둰,:r:#u~HB o\fgd(y>z3 +똱#;XDxzr%ɖTyUI'~C<,K EH7G(=(֠sDŽȐSw0 7F Oޯ7,99(41HghLxj;?X OW4QRo7d`pvc&0 a1*#!,0Q0q-CQF/|h}_7^ ٻ)QlcjD남V1\aa @~ Hgc|) p`sU'0`OAҋfG3Jk3ƷSFG8Ev{ݾyVFHLфw~9MFl]\ 5P:^8ڑ|Ĭ9;r) 1Le?%)%x>&sE$l&+PX;ąؤ"j\Ƙt-e~?  qefhdžԜ"v ($HvZ]|xjd=/t;ǟ̇,d5ݽ=xמT@9sTGd|r0 dQ-A-wN=ka=\giϜ3-wKqb#]!p"Փ·<ؤ%YKA`qiBL0PXr"lxT8R> HɻXLGEH|qN Nd6XAIP-s|* nZfks`065iOAF @!p+.coɹ7NZ:p7b\TAK kw_b[ǦCWM$Z\\!kU*xYZ@ߟ?F{092ę+!W rf/(C]SY+B7 ŵ登Ш9psʘ~Nǃ69V (Ø_#"p0h歎8fˤswA8܍b\-% Rc"ɜ K᫔[e'o^~9 NYlC>u?<: >4> Btr[!#DHPH4UZFZO?{ƀHtzc0(/fP1Z9R]ik(E>҇y7\מּpgVTgCN J2`\s[} @0=H<3*M9@L0Z|I1-sy.Ƽ^9N Z &ڏήLfp,G @ϯ|  \3}_#X><ώ) IL=dZ ƹ ,mQ9}A3 񌘂 [Z XeX7OT @cRNhv(F3^4eYa`.e/=,8ppBg |8|pO_*^9طhM9""0ǣ+"Z)!W{A0,!uӬ~!7#q?D.);_@mrem xDC$/ 0Ezx> 2hbMVSpӿ!`iQ8fGh29ؿs|IgVMo1p\JB(hDk5q!yEq9z8áz_Pb|09\o;U1_@oQ⌳K`U>] vb1.Ү;Y2#A8P 29!5u QϵϗY+I&N&`k-р~jb]u*VEG@ R-d)F?v,E)Z&>_ TUNgv >^:c"¤ qāteüƖ#d$0"@<"E4|^AuI#q]IᤁBj oTgB:M$'h{T+J7Ƨ3pG~3Y $8F,1K d|guƊZJjb¶ฯ{]E.$Ʋ̌eCIЮ8mx{7=J\Hf9㫠ϊA+;' U1E|46͆?&RH(q:1˃ @duD0bKq,(7|qÅpUr 6J0UTـlB:+z;PDZ߾H $ޟ=3]*xw_*JdžLp/.JrL۫9Q%UQa=|qpT ZSq逤4sypͮ4(.6 +~|r48v,88[/JQb!8u î3 o}3 eW_HܙLג>2P1Q"BY36ӊf—a$ޞLRf< SuM}n1m=Pbރ||ސe?y"ٿgm/}\ XȌCǿr5Ç> l cƊO| .@ԍ&_9\ X < ){DPk bp9qcR)N{/2|387YwDi#f11㈤w5" bt|7#@}σB_/焀tyC@Dfk@y'3b輥"Մ {]K^١3|B-bu]2ra@Vykm% ZwS2q<)dewât 2s4*'(;P^S4g|VI9rWue9 )#(t-VK'a-S|r̹`;q^ML"/t6QOqu&٬Eq1xXRKS)f9hN떢 bȎ8n3[uʜ|lh&[b2|nx ^&˳Baׇ( qPO^>|p3xN5i7%͎<4 b16uz阛`{tH8˪K$]Ĵ{Xn:<8+R<1byO$`svv[moTu$% wqɒE@kk6$"=ٛk谝g|b@½PJV* 4Mxng;!&XK51FJᡉ;8M0%\ɻ)ȇW'RPJ6I/y>kx^6i{h@f]ZYG+h;k1 $X[VW;es>| s Q;X)ǟ\x Bf5Q4od ĀX؊H.Hx5q5||fN< 6~=?F2ݡ^R DxrL U'bÔU 0D\,/InH&d~ctfɐmo/kr͞rz-sB 8͇CxaC 1=:* +dA3 +`#ιmX :)\b":d 羝1Fe.iUqA [dʹL85=F1C6aI>ō  | s⟞0ֳgXxb.Ё ƫx/>ܳ\t FlE\nY h \{a]rBv񍃁GL^bNN68pejy^4B\Tsë2$D@L珏!vUQ3"ԧ, kQy8Q}qh "E 2Ȍ2UƸEg2\!Ak'4cyZ  Ǘ5̫ZoSCw_PL,gCtfrt/ZH84i0 `#lIHe|Æq eW?]`.񌯿\iXh O|^Ǔ^8y`<Ǝa/2@a#_|p8.OXC@Z4`Ms!d0b *#ǜvYj2y2̳BRvǮ&3SJ"Lp&wT1UWJ5 ̒;=6WU ,{gϻ39S14- %s6vo&907 uX4Q@&$Gn5 C-8MiJj7Ǭ[$tMvLz~g-f3Di<(2i]ǙǍ^x)o2U - ah ľ'Dz@Sclw0 E14ඈ(S,}[FJZ o{97Adޏ 0V x; r${|\,rmyvPeq?&C3S OxBo!т;6υ=đ [f7rj}Qi fQ7Q<އOM8_gS f\RdA(>Xz t`],ƯXNٸ~BSD D gX5a(\6#BH1r.Pul uԬMDʁL40/x>9@̲5dFh=$g"#˟,F6w)U 4d|]K- l1}'8"|$u끔B]6miNv^3qČhA8+x18`6t8a 0О|}CQX d^׾P!q0:}( T>;Î8%r3o@hِaCO pcLe&eJ_<x~3 0 wIޭW ],՗32`KrgGE)$ цp/i@5^UĿXN.rueQ=4|xL/f RrQ8^v!c*1InHkѸOQt;.0ucKL 6Ap0EJ7^x@fGÃ>t ʹ3{G^L!"E]z+Z+տ?W(Y\Մ?Bȅ GQZSSӠ&ѝw\!b4@1凼|ٔr-:kCB252N]Q6Bjчî[`R7ナhq:%^7]4kH=BsNvj#E~8 JE22cZ;[\$?<$vf:^Fga_gȂ I$)CCX,:NsgkE(I9dHN* e|$l##2/!0i^< J:cf S:z9ctуԩ<;p* 6^`~h2pIG\T*I]P[N6-9q(8=Dv>G @YE+%tat YnM_$p@NTP+'|Pѹߎ`t+5ѤcTiP xLE!J=Q v-@f5;iL5v!1|' %fݛr_hn'\dF@㍰`mq>>X<\Q3Dj{ \Y~=q%9gG(tA$S8x>3*'CU?8⡛v[|z$q{n:?k0/zw𫠧`{Mdl*IqBs[K+ i0sI&2j\rN(v.ŭ$8(!1hDaC0&eU1'!zqA6"1[DJ=waM [#YIv5fW> Kz|LUJyW|!daoF ACCKp<r`Y 5AJ9y$2^uؔyL%k>8PhfϓF%?AM_7"t] B[{8Kٜ'^/N|GYǮpix.ޔ(8.}襨."%(Q[(pU,HPFKYfM]yr$ h@m  ˓a$W8Zg pڒ o8W\z?>x*^+@Ltq2Fm@k&ex?1 4(R=爋-N]k,ޥ:v.rF7x{+'v9EŘ5BYIxnxx3_g%Aru0b\LY :/'yTK0au玅+f`_ ]be~UVjiM],APv<r^Z'8{-$\&8%͇1~\g;ē.Sø|U[a[cVY=\RBCٛGL\xaI xmGCeC,ٹ4tNV1-n>{:JPy6L*'7/_ei!7p+Ы,35ײ`r7|Zر2m,@ q|E:a}079jۀ3|<1q"F Ƙz!z⃴E%;<1ts2EzW1&}o3EHHPg<tLa/Wn1& #7Z,c1ԙlh;šP%-f1inoXo7a C>8HERq'v3!wR |@M.sYCg~r_Jb.9w@Utm @>$hC{X\%\`[|?}0#rZvn),¸{B!P8$wPJ[DTY_>,#^adۉ 'E޽rLZI1(fpP;/\q*3l\.CV@,T]*۱@ {9T k{R] |o\5-G-K@"i vq.ʘ.|c<`@2~NC%ӗ0'Fx$+Ÿ2(h;Uf"c\F6 汇l| HJ mdzh YQaA]$ pfS@|&7E#ĠJ.S6ߜp4" ,3}gAn6i'F1\3h#Lц|LMMLUWr sqst\JbFTD3 NM ˆ8 ꉿ3qЕf8C$B2]&x" m<(}17'!Xދx8 0 Q}p[+2,69I[iy1Iq`ы^ 9wn|| G1: H!pnpܢ@ Dی`"cs䴴+kvb)W]/RQ\` `^sF\ Nt"~' b^<5ƴX>HH xBIݱ~̢e;#YtIwXo (]ώex3l;@%CO7O]g|̙Eg !^@s/_X)M^/B ̀'m\"xtgPaL91a, Z\8t3{*OH_!f~3 ]o9ʣbcg5aKqBYCAd,XhKY34 ˿88Ƥ|#ZsVߌg~015~xLOc,W0hHc]is:, L&ު@G@mdp&ei5p9 l q\Ԧ EbK'LYc"1"]圏c-J$ێev_l)0qc0wEa*gNc=g a&D]Gw>D73FiE)́81r}81Hj 4s1`/ci6 CeVnw^ŏ(D|r Hfja!`E-3B"q?l[pm @wN3P@!'M/7,t~QMp;6rJ/덟2wԔiEg)P agRB +}+/ `;>8o~k,@`F7`epݎmDx2(w:ńL|)koV3/ce |g;{:PIRW'6AOahbƚe|@u)$j 9,kS+uI\*!HWfipkg5LL0ˎBh )(jXS-f HҁP/_<2 2mX k|%L Yッ,0kրꄦ]8X rS |>j%We7 ,ÿ\phA.=ǽF }8UYtn6N|=F1!xNe^NY?- ~_|L reg o]^&JhRkl(.Z-eĩ ֲxt B0>=L hJTMxgf2p=0Lr C8 &M/e:yeϮCR0sAX1_Ȩ1fvj#jA!`ds׾I wގ2M{3߮&^xcBY"pwSbTZbk È_lPdi]xxdu,G\XOFP0'^0!f ۃPi"7,J6]sM S&F;3Qfyz3_!EG $ĸIA+0?|-:q + V&_1Bk]5e÷Zǖ9,%w|q (oyw7SÈa^$5T΅|= {1睃7_06NG)*၇raB|QSBS?PR3@f׎Ck,3nqʃ"Y4wpdRa\s8I7>3lzᚋ-4O{wLr0_jsE N;UeYχja޺Rڨʢ3@PE =×AE% fnl6RBFy3˟qˠxB3mug$g >x!Rm/i ?N1Ws %M3!(s&*ִxW/:Aܿy^Cȳ6V"Hux@McpNnp:@T#B)Ф<704'p`/(Rex!uBYQXag /e3Lc"˗8 InuT$~cQAc֯_ [_/JHV1ӗH)hL&z< K 3"ąC0oE 8yB;qK8syƂ'NxLVh+wͺ,+@mg  a.C8p'nyMZÍ]ݗ%l)ɋ387SZ& qA40HK7J8T~~8yXDn{Z܈ɛ&I[[ V\B!L?\msaf:8y }/}~7: &^k *['A:9'i?\d̆3: W&."#X MQPX&-qBv,xda`.`8.G>DB<[:LgPU6ufp+0ބs3'ڰL4싮+2|pJp4ū偢~\AkbJ=օbkN|!mxu~!Sm"1v|r,YYhJK!NoI!ӖL9 3p4B,;xvR#2o) tvIiffu}Ppz  m*yAn !J^Rp!>hc`4Yj =/}q&>_Fq8/˪f'ygUϮy-EG:1"CθRUCs46ٯ^9Y=*z' éu>1"R5g\Q;c ĵK֝w#_GWoLIYۺBEcBsR |8#&]LT>ޖPpb\BD/pVg%Zz7P(OatvPb.oώe#` ;&벐Mxy'0׿N)}=YoG3_\Jgޱ2 .c|k|:z}QcARg _Aalw $_JQ)Sl><2c?\3DN]3cVZ|˛S,ʊMlI \.=z8:}*o܇8 U&a<7<8AH 7yqK&,B&Vcj-3e%O/tk 3|l_j:M2}W֘ d3 (.su(ѕi$ +t.{pؐ4F& B@qEeRe 5cAUFXXy9X%`#Whu4]{8WO9N⡆1=J+߽ ,7:hF#Ņho>BZzeP~su:8`"1DWzaO^xA"_w'5b /O(x%{#/r~C9mGh: :ɮ$89E!'*W_?pp,i:'ݮ;|k&? WA"̰':G!$| "{k|xm8nAG=Y~z2kRÍ38r Di=]Yy $@ZB=ǎ2]T0]24Ns@s"m1,9 {gVtr۞SdPcKLH%W)N -I?-Y%@/NJьv B8 ,A,?LcKuٗ=,DOI|pN#Bj!i2Z6=8:v}y9Gf75ĀS`Ooqv NrxXhuh}QxO:RPAQ`uifSW<$E'pa2f\Jf)NT}Ͼx9QJ˦@}+: +N+!@ wsVT!Hӏ4d06~B4 W6Cr``xdE'E6QhӅI"D@^-  ,]C@ y1Ш|Jg88x7 >g00 9:ټ ]99t68':vLTB؛=8AB'ro\K`-N*c%5s$lVG3!"ŜEٍu\;pgO|ķ;pk H,19$f -Ld( Tĥs?|فSd:N&^pgxtb0vۈ:8zMb)sZE\"5ux6(:OuEekc$㈝xx|9w|a?A3usv߯EJ[ͻϮM^)6IqSnD9M3`JIl0 4\N481Ԡz!x&/C{㡐\f8 ҨQg\b3׳8|  ̹q##d?ME'FBsv4\LMk3'}q>|1c4X2ŮՁ+Ip}!:p顝*i<@n?!xvufШ`Ӿ*5z Qot'ռ(w|:>j@/~wšS XEɱ0{A)SxB`+\\2pJ98"Yo~XZ- 3Q˝G L~:8mPxgD}xyP0_r)A1(r^\71X2C?3P7EPT&$,Yhib,Jn-13ru;L)jAgJO Ve=H8tjQ,r9UHH Nss8`ň!2'[^a͇ཊfH3y<Cf]0QZ+A`ggW][sVy9x$̑X儎mă`m@zH-P-%"}˭ bCx`],F˝vyKr\ gD,pW6|yT=! ώaUn?,`LӌP}|q_p8<=k39i6D\qqRat mK4X?X|^,`A 5e%0vg:sAEq&4{xf,2spatr`O%8hUP`2Q=p p#lsʹp~P2c.|'htީhW8*2@CQC4L@?`Ϟ.$47Ow&re Z`yٽnU E <`t1J;*jG`;>Ϟ0J@ƍb>(Nw~Kcb癰T2^|(R\ٍüm"sr}:pg};[̡!er=|z Pg\-&3\<'yRrc RY'%#u 8x{Ҡ(oipaʔz}ykh*/(9CF`g\(o)(7><""0f U!;3c@,zq)R 82iٌ}%'!A}6ռBW+ (UtgÞw. y}V *@Lm8;ѨB $ 6o@zQH Ecs@W#Ҋ?0EU~~c0Rg#=.xڌȄ&1䂆NɎMA,bZΥvx=6+j<6G <sI6eѾ3f1oH\d"%ww1go nw 3sLX]=LDn#=>)Ds }~82T"K\!O-,]yyq+X$Ź| "m౯e"]PپZ@XS AڜhHUIUOLwJЍa׾fv<8 )p>^u?=<pkî̡A)5q*EeϙuY}w?4pLx`Cau"Cӯ/@`H.jkS@L0 wRuṕϾp_ARsn.:qu54\/@ϑ\P,oK9XDCIy\"LWJ&r_\p eqFhS2TY4놩՛0WwX#  :La*I7\A \d#}*5s oMa׾ c/sR .O7U?Vv@(1Y+rrHPțx4E؏7#/06PSt&=_dYɗ%Ƕۓ23x@7,BpP3ǯ/<,zձ]߾px˰afg{অyf,4xx>2jZ&8Pp1!w3=c95'wQm@`s4MK{YHO[!4c5:T"N Fh`L3uB21wye;LL82g(@'K3w:nՙ좊&EDc<0Y'dÛ.v|q3 rVbyܨ<| X4^;Uǎ"X,Ҭ"sJ )2Xg2Y<8@1Cޙd&rG|AU2 7(&THU<4n3;Nٟ15[ILPC:TN b}\aW%W9%&w͗D:ɢ+Q zT{֟$ѣPeSYMAåJcq3wXxe8 .8d&%mn ^Y#jLfP hI\(Fݗ.OG9yqs-mqV@ovwuųE=_[ N1kE^iHcwH:Ls!r'3/XÞD14'x5Y:)p5 &2Vb|CCɆ ![d(k>&40aJ 6)_ o(0Ċ 1'S k14[N]C:Q'KZ .`| 5xp:VVv״O, Fc%/W@7 >E务#>1*v}5GX2KB{2a1;X3*ͼ&>TW; QUdGж,ʐ2vI&g `g}PJ^8ʼJIcss:{ttmǃ/frIb%(,f]E/8H<"c4kzEZ[j`(:{"ýp%Y.g}y"@вtyzILɅ|"gxT!w0:.Q#H@~S?Q;+L{Fgx͖($ͩ0Μɞgzd3pðz7J̸{#y _8~8;qfԗB-MKe)%un9w E1qhsmU`j:5>~yH5}W"AίFp,?\R|WJ ;4{>#ZrM~=9v@02ͨ=0P0ds pCtL~w2 a=O ´ W14RĜ6Trz[AZw?Sѡ0ѭ2\1W6=\.o;9&f{LםPٕPߎ>K?/j}WYs,jGdic803rr;,QBPθt1blP%3%ʠy _3ʪm2Z" zM81=gb^1")IA珇 Qq5AYX'_^5LGI R# '] ӌɼ1\=L =$ᶏ8( jq3`6f[f_X9RQUH3z )X8UoyGTiMDux4Ƴ;o,T3RF ՘ގ %!)x:a'xm ͒:G!%\`L^q#r`Y]]vQTKǣXB$N ;B j" j9R6w93kl 9=BL^:d18$@;*d%^U ɋ97$mb"p1_z{'*р:E,ZcR6&70ϗ:!#h4@>800 Fky7zs,9&@A_]ps㎩ -NI/U0 ї.Ď]{QXM"P\jhŀp누)\7ius_BR9""И2cqƉ<ָ r{~~qW Q9>hWPAk\:W/+gezw8*۬8זa b3cs)Abi 5MߏS)M&@ S'{=dVӓD Ы\LaI{(v9b^J98"2W#6.LccKXyA)<;1c#X[yt{}~{.?Ma& zxPY#,ǎEA᫜~ "euQ;,%ܷhR|qҝ^Cn{=Q7DtfdGcįֆ|載$AUH Ma(8rc| f$edױ7< B(ŝ!=F%z 'G0&aa6^7aLkK cyL9PMA9pgs<$'ȾLU9i l4B,[xº@3uiԙ>83&dX N2XId(SfK EkL]շxfo:v؈IGL7phtJ;g[ c\oazCRԓ*a.q f8ޠ>uЯ.W._$؍W?y!{@c9xEl"yU7}%S"kYV2vIhʕ4v+pUaǒah)ÃMd EIz-mpH#qD4Qaf' Px?/KZNNd*J.(|p%@j )k h':9L< 2~Tp >5<9rk>db *e!utHf/1*(vOB -|Lnu_& #flY|C 衭+w/.8"hI[ rqk]:37 y2x d$s⾾ 6R͟xy`w( q<Ȃ-DŸ&LOms[u9 @^460mFc|ϐ+4 emw@_'*]yGĶh3 LuLJ},q-j߯LLGs^׷R2Πx"ᡤ2m 8ĎRfv3.|c)zӌ.ՙyeSaDU\Vk9)HRUu Kjx%|;Xj!ޕ8[>Fg>&֌'<{#VyqOX1uB 1Ɔg<_R}=gUI'X# 0VGdnL #-+g#|&I]Ym٭g7 $ts~y_ˊ9\F*OV|yXqĪo *\e]rZkPC琪3W7u/p u,ijSiM~h'o8Bdvn)Nx6VAp2r.ňhB3s~UB>[b ]X Ѱ&o3iq1EW@xP/QeǓ|(F9/7pFNV B  1ؽ BbTCRW=tˁ:[8g럢% jAg 'm@Ď6z6!Z bţ]F_$,(N k %pF)7=7DGkC?|F ¶8h+859Sɘgp೰!83{$Bܔ.\;LPPΔ>$O+g )94Ls. N̛^)P &/ h-wSjDVjvɿxskOpu6YQ(:C`n y-!v /\"C֯8u @a{Sg_be4ℴ#璹\뼦t"^]!=2"(]0ˆf;5#+`|yyA2 r\h+l< Q/Kl IJ;M^ޘK)߾\c<Ya33QE:&c70!>u ke"*ގ}C%%H7-#o`7i'yȾ5K`0HBBf2O痾g(cewn~:ֲCgYsF w&x8X-&gQF q#{7ǾXGf$= DҽG1}\p 6|0J|up;ƌz'z("y|$ϞE@d~K4zrM;8qʯdHb€2~XeɅšv`_3R]<jSÀpXtNe} Fd8<Ġ)uqvcR(~^+ ͈|m$ BZkg+\7Oᄗ]>}7f=ŽBdhl/ ZQ).4TV2w;:X^pLϑy5G޺ܰUd[o0K78l)"[-*_w> QOX@k{Np n6L`] `IpzVA^U h+Oop5]A83`9XBhZZĒ&t}9")yN(SL:ts"ff90p%;&qPtKql9q3Ė3(S&A9+UxI|TQN0s(p'd|y8BDzuxH&3 o%;h]庞FoK^(T*U O.߈^|da fW#"xo[ᥝFrJaXpE 9g:b-/Y]a(I8v3xRhܸ%m`ʓ'XNd xa!tL.Z")&ap t&޹Pi~ylK 3uX \ O?g,8%Ps.g_.%X F{Ped zD ?*O2u3C|x<őTmHCa{1׎ ׎*̄VLzL=FuɃlZkOQ\`Fwq(.a09:6Q$Rk(&wGurYz5`@P/|@ÅϞ/Z0XwV!/lM\>FnI9eRIi!hȞ;_m 5w2/*0=ݬfGDE\ huĘJ3Bv#h\zV!e`QuiJcsC\"zOi3@t ٭CgBucp}e8Xm 9PmH. >\Ʒ x&5.߿!'LC9~@xE|k% gJfW gfº*S!Nϝ{㧻wL6 :|o97£2m,y !wSw1S!j-=Mq1zt"/7g5b՜d-ژai|Q͓aDϏf׶Wv \@M6O Pʐ'G|pѺ&XR3WDZh&^dl Ϗ|D,  ټ%!z48 d|9/|'98jw.O̤QAjau㉑E1gLQe%rϞ`S=2pxم@j>0I :OH,83ƴ^u&Q!̾P)o~8`D}2_GŲylxɛ@f|y\*"fCsn[:/0;uS}TJ_dxxR)^>c]T⬑ ul]%Biozy#DX˔M=r1'ўOEaGz˶xeia6gR 8j ߾$68=v^jE3e禼.)ܺbB3˨XƎm\D90ݗqN'\ L::x=h;}Ʇ3y^nuuA BF1 U 8'G|t|PthA ZQhѝ{"S=J=??h !Yt~ ("&ѝƼfE`4~iaM|p즁"νb̌k+J~P#TK^w4던LptL-<@&A2J0Qg)w<%w|~8^z׎0uzˮpD2Os%Ex$5;O5T|\cȸs- iB%31PY!ag1I)nvGF !ǜal ɕ+s0(83َWf,@`\P9zҩQnI^ erW-=S`rVJ\ ! d;C5,wgLpWI*`q7 +&I k@2*d(y"+>YgHD ;]x\qCOم,z _ V㛖`_"/WA#ޏyWi]YWAW+/~H"uyTEw^cXD<g~: oG\aSN WAȧfpHPλuzm\@i cQQ1# \/4@4pJ-KaaǙ+!+ sk4 0cY(y,8>"I%|2'=tirq;Aˬ\q֚`4]a!9aql޸e `X]~ -`cI]ǐ :䢘'Jуa ! q%4x\ >ο\ZSc4YMD\> p-;7xeg |YB#^3Ck&xq59!0hMCEqJR/kpegmjFddۅ8Q[ti?G׾bR !zmkj y#ES V.<8t]X\3/U֬O,h UFlMo6T&#"T떎t)vwfzR^+^'V Mn~^1'k}oe>`9~p+k$3g@Qf^UXi$5Ai!s<}FwO${]-TŘ>.Qe;K̩:;3ȡaX;)` g ݉9Ts-)z$rC=KBDf85*hg*JhxlK`\XU9N&5B V䯖t |~?<ɜ+Zopd :7ukf3uɝ+)`dܰoBe`q<rUGAc|4(+Q2X`;`JEk3eWaN*e ?7 X@q,, 1f%',9wd]}>ȥYXb¿ FX w0 IѺqۧ.C~ igRްϓ(j&|5H,!b0kfz;KNM\}mL,?Ā*_w|Em}oڑtZ|)RGkώdkGԑ-=xn9S! ~,x'CsOi] 6y*SGwGe*c95} ~*7ÐO\+i!axBH[\M1.^Te .g, ˾#z4UOg!gў(V1҆BQє᐀h2'MVn&0 M#5Vc(ɦ؊PC_VL>{يzkSPrlbN G:4gELw*x#Nc4Yuf/Rr.OĪ\fVHL JJ뀔Eta\IBջ w7:7{\J 4:/|fԣ]4Z|^,gf9aIxי򰆲b yxOD KƜUa5㉀qդs.b}^P3Bc ;|ZFV>\x8t[55{'ԹǧJDUhd)&|$/}JXӏw&#.s:mh)9V N]0)<^}`z+K* zSc\~'lZA3[I`0pw`#b@5t"3rP v{m\2D`q=K5g'[g\ɍ)(ߜoxv }q]X ʞx| PӥTȮ!o1*WxS@a!x=j~|Q7fރ7XJ 1q=gW2=|%&S7*DXc1+'*7L9Ӈ0Z\%k|^&'Ts w].|ʯ219a&>O`,V0]\MhRA/`f〪| nyȔ:\v ARw;i݈ w30R_2鎞 97΃+G\R̙BΡD5+'VĚ}<p͸ p(BȠ(í"1va"wxLg+pYѮΰxv 88?ߙ`)L:a+ %]dmUl|N>~F"ayȎpw1w9/p/M84lܔdhEQpZ DpɆ)&>XA 8r) ^ɳ^*2O Ky,DG|Jü\:: cT.$\=|q^v޽nY??N ~/P<` f"*q`=낺 l&13fFC:~h3RLW}r`CO$砊,aʤqGu{yyt\[4S1=p@k_s,/* q~y)+ qCT{oJ klGѯ|."X8 ̪ώq E9|ysB#T'>u}d>8dCgsņ뤸y 2ߞO% 9dX`;5Tz@#1!.e䅤'GOq9Ȥ A2F ©9adNqFZF҈\'F2h< aGlQO^ l:r@c8y*f@v?\)'@47V& Cy %{OUz./RAz^ұF`"]93UxTZƁac&ƋE\YGW"6R&/a)gtG-M`Y`B蔜2/wyB|Z4H88n4^ .Tf ,yWM;Ypɜ>}*pR˲w9%#<\}+$ə 4tvcŎZ wx(H޹de[JPQrw™2^9,._ǯ|'_Z4ᩚ'/5 /юWtu1Acɦ3W͒A_8w]; y .~ؑi`N%N`sejೃZnw{߮-Py!))8ۣɭwnس(Y V2)μkރPg"O fxfOqqzb3LCm^@fn5Er*]P€4)Y ?\쀝_>yPc$65:o} CXxـ|3F\DKS2v {ᄦrx hu3oѰUYrTS]ԩʼnpeLg')*%@5 "1fGʹ>3dIٮSӴ|ZF.bI7f;ѫ$V+L16j ǁ LQf7߂SYy h <\*U1 : LfЛ⚧ӇUMAt6ə[MyGʌK'KZDC;]reS=o+,MOvkK ceKg_;b(dv!]78 |A`V'{VaλpQ"\Q \iԹxė5^:!T]RRɍS)Ua`߉d?Suf(JϽgIF) 7#x44F\a>fnKoPCLtdt[),YR<5d%vW380S.[Oca%\[t#s9O\d=gvߋk '˙or04 K+*d ȂC3 4C\(Nz8sAK\aKs~xsKK3 UR^ *2.2roVCK~ 5Bn3)  KQpQD3s(d9&s0<1f{e~/ U:)[ÂOs]bZɘ~o6N|HZ Cqd ?|yPL;ef6(`Q vࡅF{saYm k82"K5$:r;z\fܟv(XxY)Ȉ3kZ`:xU/qpBU25dt_ ~rp=|N*; wxf-^k[PSduUe5u=g+hR,<,*a- d2H[Ř)&w[kL7Sfd%P8!P |IcV ,  V:z%"dJ"nM=AA<@TjַsEBG[k`iGR\kh&0E] HQ.Z-,'{^Öeabuep8[.< 10[ xnaK_\-*z0EC&qi+ŋɞK!!i޽4LPƞSns&>suwؓ9S xlָǩx∸c3پ{RDQ(a• Օ cw\D<Ђe+u"a&+ZX/܆wnq005!qsrd;--TyT1p- ֫1N T: PR3} ”/&ŒNO<0 C n9$ 3'~82FD1~|)w4158UMx)x"K}N43Fz;AL^.MA}|bM"UUkP4@[k^MT2gۄ|c)p D۬YKl ٖ!' [8M.SEP mg"kS|b%'x4낢'>f';>:4oE,LӪSO% 1^?5 GNB~\R2qclNVlD=lׯv*cC Me`_ˡ4Y3sbWfx[bpR-!{ِj5l<fu$\Ls mjBnqYcB̢.jjA63%uĴko qv)<<&^*K|tRo+79V.|9i^Lo# MW^O7#:9Q1lk*ώLBc'xn wp\0J×8a_6!ͽo{p1:>\r|?< !]&̉zqdhAne`HЅqCu Aq&M1"YE6a~'iAw;I HF2!y&͗Fjx3ӆ H)s\g5x??L^@!ƌ}O@K&P u| օεA!"~C)3o}JeSq&) {&3S(&ߑ `dR(tu#3't'$o&# n0_f+ C̸bj"Ƴu@n;wӿ % {n8IϏ e:]qR6c-@4n_ZWK?6;gW_|T(YbLY2eUqkz&?#U5+;?| D2x@&>|9@Pqꑱo>l{+``3"_p'r D\O,_h˺zˌI0M:p,H|2Mã<F{L:ȥNqV.I+5F 'yPVV7A &C(c2M?VXJ)Ap=nx0GY5QTSr{aEۼ|qg,=$m&< ?*A X^"LИ8w7V%Αs#fedoL㆙5 `G^͔@9)LS]x}EގP0;ch`b"x!:u_t7f}88u X |udA:3Drc6 DE2i=p€l~>#*n''cD| qϮ q!UBI㢙녎1MŽpњ G!]|<(O59Z`4u)9"0M`B5ǯ l卸U%6EחHB1cpIz1g\29Qn cIn$ܲ]lD5X Y0p,2NQL2g"A i)^jUQAYqg8n)~/30)\pQ-H?\we 2㉝i |*QLP ?gLą3HqRx8H{H#ߜB!Fr`'z3|:-eA̓7%mo:<ő8TFSuWÎcTy㌂~^ulT (u2Rbl7woU%f,÷\z8 2y%(O\h p~y|W A/K"8$ܷLr|IX3.K>x x"t =9+1ĪM|,4ߎiYH3:PeUu&;*.qLVaLaPo+⤇.gLr&!f4<!'swCKB`QwG`EXk.!]hd%H%iOd:"ۼk>y%]K|E'gɮ.efe50[ր ĭöb&w̛f^$yr/50x4m)?Hp`FZyܙvā"2MljWX޹6Z4n6%l'*gBw²w.{_2 @o&`𸞸= 1S> @Ʒ4sALG Ǟ8b ] E⿜g<4R_4F<;ĕx2.0d4S}St< (DŽzt#|riG j;:๏ (.9C Si<\U8*5=c 5? ,= D(UHq4lz4qt/ӣp0f %'O=r@Q9vefYLnӹ?SL fc@x(Lu/X ~!Zt;Za|ZJBPE{ yWV5Yd̾0P\cθ9JX&vDb^GmLd&||?1F1?scCzᵹ2%!\heQ2'|%Ti7w|piُ"V %R:`J7Yq,uf'yu1)0?9\B1WθZejHq7t"ԡ[|͜ߌz)g}>\[r3"AvRcN<)|Y>%fuR-5 '[3|lJ8V~:!2}΅$fdGVYLu+&\?2 )ƒ*t\߿9\@'#9lqǑ!;'Y‌F. ߞSF8w:@(#9귈qjlbc6C\ &WB'du%#A%Q_7'9M [LtWqqjqaY)ۇ.D3(;rK S cU7=ёqP &Ο灱C4cdOq݈ ֠&rpP F7ب ٚ[ܾx ]LLU_=r!;C\I {Yie|nIi7I .s|,)3#өhNp-h)e!&;[;8zA̧9!-MK#[ .~g"Kg۬,w㻌|P]l21=Lxe-q(*$L&:Ne%K1R]^S,J|r+n|{(+6/q!X H:;'g%U(uim\il1!) 䇟|]Sw<,C ;i b pw֮DU.uce,?/ k A x#XXTlp0 V]a&$W `狁 iR=K:c|!XþP4>{w 8Q6͹z:!i4:u|xX-6d'ƕI8yZJaI279 «ͬ En\~!\84Na +ؔ)JD>i9M/+O8J[drw%lD@ŹVujj a׎ e$F"@ro(TbojqLBuHl)Y`$OٟA2)qu8JOAm +Hh^9@ u__kf_,ċ2CC C =r- ֓|[.>x> :b7Rc^qXHwpIKjdjFi3ṟH 1[\H "RX]dώ Q@K5T/(JlF?^XCZ REP8dL/ `AMƶ[S 2 NҜ˄u|P9zɩq&#Z3%ٽvBr% `Qɑ{"cTd ;ʾ?781L?%M\%HeՄgԳpa?paWCRY%n"f9I4VT$ DxJVֳ4"eÏR_)|&(%M9 70P,1 3u^g J 8 L+ oy4]'dcsvsX8Ʒ DU]V}d<@K}kcp5F_r݋vj,8gN&$;oIb!і}qRk2޳Ms*뽆\9 (`g<f x4/$iA rN!,04ƷfP(F&\xЮ3=g$닽 _2ƖrbwcG *: EJ@ ɚA |Ng4+6l86%xo6pX\ǔh ʮUs&&ɇ@X!G#!b]DC!1cɐl 4O%Gjs.GeW4$ʚҪUrneA!pDv`O]\y4aޮ7Ag/tޟ ؘOdQPQ$3_#D ]u͎_5^H^Scbmb6r jt0!b)C9~&#c#ma1mG\¹h1%4khR<@#nwmXml@%!َI.'}^, nNrJn:iB/`xgt!O5&"̯`(z03z1h(|FM%HVX<LŁDu1SR<*[dFܺ8 fS3%di9H[Lj~rAX7dsNmfCs>nE#n(\"aǕflyӁ"b\(IPAwljtK P̱O.Mk9PPbɅD@oLl7ac XdÛj@lE+o'|V%ccR}\IEdwz܈B=oB~gp"(ܒ?sH `vMgſǷD:LaJlo)Ї̘|2)#K|`JԼ45j><P/@&R:|5EĔ16fxB0ל+AoqK H c#b5酭Yl9Z'`3s9D;1}g:_}A4\5yͦt \$v+"0_y1 % OhGqÈy SS>zp'Jݎo"MC1}tk] kY=V.s/ QmO&4p>kk|.%yr!# ˗M#xp2#S{f10"g(P!ƣ?out_@7f=>e)ױgзap=)n7PpI;tc03(muf/ɣg amZ|fQlX\xpp!"*B˘Ó\{e!aG~3qXۀw ;#&х8 TKaZ p*> ,ʩn!~0PQ7>%kp^lI`٘NȆjX|Tk:ϳ,+On5="ntcAt71 4ٔ~N8׾ʗlSF'*#/(\ NYɸy5jc,YK]c_|$eq (vB}߯D G+O*/9V1Ϯi=8o:"KcDi)2T3L&4g˶<@TE>j>nxjDY~9Ün/X :T9W=dazpRدUaK*UDs9…&Q1|4=T7\Fsa@dþn^[40@S2x^cAD3E`P,uq|J#,8a@t&8~z~yhSXtއq0 {7c k8ʐ*#S L#^Ös)[X.BX0wLDe۹y4ڃU$#LsSdu}\c1Y YZ2U%Dy󫳉UC;q!d v&.5DZ]u9uKLw) /[\ 9mEV!u8²}qf@a(jE1?θeZ0; 0eAJtfZd/\'88on Xt s'IdWw)h/ӑw51 # &jDqƔlY2{1Վm:#4 U S yB11θ Cp_\D|#8agq+ptO&9Ѡ2u|(Pw:ꜰ}E]c[s WBUp?g'2h)S=1GG[ٿ 8 k(z9TaEgx.=s"PKU*o1[PXS넭$Q!3[jUT`x!*.q 729sP͠ ;α8!1y,bgg$E 1hV|jL0Ɨ0K2wIQin3/_V;-W[Ryu1hJFVA&&;DzxHrhfzo,%_ALgpyd:(@(43Rr5N2׮@1([_u4vq1{'f] )<cY4g]9{PE3nO}0~Aq&X#^+y$H9oo0IJY9htnkǮ$ (CgǕc[gψ=r\eMXE.ύpF;|\)>{J:7@,_zW?g~G42?\k\ZWÙ@+:J*gS'Kb$QΙ-F&8(3w)g HF]b&=qpV2]jwv }zN]2ec&"H$>c BG_O0ԟȀop1$x%Z4cud@2mx yl@v<} $1:8+s:E/o(!@#1믞$iaa|[Fphl(昂ASЌáp5|x8D*d\FH ɯ8Mc:]L د-cWpO\V޳+01LMY[Tv}g\S% *ަw!J\>&m:8$EǮ(8RVv?>reߞ^$b(u(i 1^\MyqL`![jO˾5Jd} +X2y?s {YnC5)AuE'Qu ][3lq:hZuᗀ“+ $dϙ(BM $3:r]盘i:' B3]ϭq`*J{xa~q"i6M%s[%ds|6ry~8@+pv8ҙ<2v&S, 7[ (Y\-xc=ppiS]N4 mO9@W耤s#џ8SYZDA\nNp^=2An䯜r!nT2Ia$GaWpJ!덊,g`c {I1 xir.tx㉩/^71Ghi$xK"F | 33I"U]uxUMB\ȴi& #7 8A<>ѷlQDqێ%Br,78tHd/s#ѥeOG6ƈ|3FceBC<΋?䰠 U8M`>yE5e-;,-d0]mۜj移~ܭ ׌6M*{>8ا` &Z )^3Fn1'h(bOrЕ˯-]jp ]|k|&7;x +M& E&q넨h=%c8;ө*„H,`{&43Pqc tױ`x/ \RXR|orԢ.X*C]uF$L_Yաy Arh)#4< 7q(<1? h0D 7n\1ॎsRDaۏџ2A~*ujpDF87I6S ؍AN1 pp"P( I<Ĭiwln] PTOK)&);T ,551A(>FmXW3r,q2 B]t2?6c t` NBn3:աN!ag1C*E*# !cg%}JƬ=gA*Z%y# &=U.:奠L:/mQd[町t!73C?^t;O-hr7Z!T41)wYrV{FؿzՔx tG $&k&1i&CF|R쌕k:Ǝ7!V|vz y1bJO) vf'a|%⭔ȩY@pq[/1 9\}LƉj<haY;|i"urcǁ63M;w<-Fa6:"E= IY s&\pI!Duq犄dID@)nqpc*:q]SNҩr']|/kfW+{˖d(c||p[`p!Qsp(ō==? +Xc\x!/!+3^d6)[QHNs[(޽CiGR\@k᷾/Ό) .uySGSwav~' ALR2 VET}pHVF1{u!;pw^XiɍT뎯+I]~hfh$~I^FF04Qpoՠp0 s=2 @& wBevZPxD*P]p^ePi] 8.3T =* ͱ]@ֈNfqYqm ,09<`f)cr_HG9PgJgc@y}wƃgIG&я{B@p@S8;" "/lCL-Գ=pх981!#;xD3A3:ӎL8 "[ VUcpz>R6;t2&gv"- ?)KTet_n"/ Uo%μ'"CPa & S kYk@UAs?64LŒ{΄Uj:d/6dRG1}Ā0tOC6oEG vs\ c<2 F|uLpUFPR+j YU qJs~o (e!끠X 6g3݊,Bz?N ƀ*peGHDT|xV8ҕ_3s_WEyFhk"@IuǾHΓwp%xn-Dvg8Naz|[1Hp@߮'v{q.;= hąl{8;iS_ʈ/?\PWZ9gÓȩm ㆣ('@ãq8-&zy:z ^u vNeIAPm~7WĎP]w_\Phf.^) C'2Fߗz8Po% Yo**Hk:=&چ&yN @BǓX+7xD !IlHF l6qJa*{ Lڝ}u K.5Ů7#E\t<DhD(&c= (C9u@m߼T\C>ڏ$nLk!է$*n[s MA|y6o\>Kz/[*YxKl#.`w8"x4FnЛ\*cj~9`#f|8NK I|o*`v%/ 2K ] δѺưT\)b/_I?̚@ ʙ&(nR<>[͈no98(J r4$͜2Kio\ [0fr"]᳚P=oϞ)ɫ0>x((=zj8|NIkpǾS+ }rPq# f)ch&JĈQR;ǗU+zD* WQ1@F[/Vh+\ CyYyAEocMI& ē 0'D3fi^pa uNs^dop*mz"zH sLM3 3Ǽ#*pdqSe!oXă/KC%g2"߯c `&s>wUGc=ťv=)J0+w7mʸ:w|<P4\¼Ybg&DϭqU ]}zɃkvB$2AoۮP5?oKTTKV<˝7?WNHc<f cgmx 2h3Բq^b5fG&3"n Q=gR>)i5"|!*̫qd;ȅH{]/~pgR> =]soH=uLz%2an\k@ OPz7@n9GNM2 r)p}z߬nVC2С'Y_J3oILTG )dpB29?2:ĦÀB1SD5羃*=爼:%u!P<&3Llf(ݧ?  Fb9og2|"al ŒY_%N= adkYql*(l>F/Cd<,X: ظ1ѥ5<$+_=pՅݎM}>#?aNK0qXED`F)(N~*p>̤V+u']\e@z=kQ@n]xnxVS&wۼ$3q̺E1Lpw GR}y t靓O L/*?&8x΋' ?z Jǻ+ùawgZM{Ұ]ay̋YrT7cֹN|fqK^ߜr艓><\áyf0S\ &RRՍZh+B"]gw"P^( ]7gf*X׾^TW4LՐ-HnDxp@#"|EzLuc341ôbcq8b%.@?)njU)2b?m)`E\R׃F<0h`+@FUMyN=v;Ԋӳ9)ȼbǒlI2H Y ZcR%W]bAEas9 2^?, q)u"R!xЄ<{SrbOOPI, ͖{:PSy) hY*A!|qHzq)#ʗ~WIƕ&>;BJ;fgǞdBju]N6 @Zyݚ"22+9fL4%;qM~Y|_qP;(Te:zn5k|V*R@Íz850͝=q+ӿW!_{8H>&L.=v E'+U7Z;gZ7̭Qw/H:q-{h_ŞWW/:!4w댇Adž\S-l/E8R"@u{x)>;UEQ\Xh:ԀS)5/:nRJwq 164<ӀJsf.`]TQevBڼZ0ED &96Z~{y>yN^B"s%\0ruDg O\E0"7\я9\pRK i;7f91)3~M"8|eus:Ut5ѹ볐Jt<|%JK8#L>n ʌ :>-G :'S3zZۏղ^5ƞ1xy>6zwİ *р`Z^ Ly֎+ @M8$.l1O4ROλÂ{fK%JxI]v^X+Po\͛5iz ~XIiO[* a1*'5$f1Mߎ=nL$~5oOznٟ^Hg| {[3lk A{q=y<ـTJs|YXl24Wpx`ԫX ̽rr{_VKpn^'R+v1ۄPHuヨ{n˖ q1 &k}U8e#p 4Q{%\LNXjeJ%4<yENf^(=-}<(X;vYkwQdCvt 6MllTYo}P',.+̡HB́qk P~~9Yi鏌%Tbǿ8,Կm^8VxjA&9﷑A1*gvlE`=CCT3/=>76EL0]MqHѩ[_d>𑂘q0 d$<eY *|RZK@{Y Ank˾Ža;Ģѓ}7iSܐvnI%:H 337>83ɼ%51iMXfG´ZrOvgR/)kǿQA6{ O{h19,\.gvv񙘃w]q N61͋-4{paTσ9>+@h* : 5p[#_SD{c)!nr1XcŨ #X*adC+( ,~"rGjp3dcw>[kR =(9w[;5nfKK:[ KuÐZp+Ӄ{|$dL yO+{+8 c0<D5Ogɂ'm=IÙrG4~ϧLyQb@N~88NgX:ƿ<:&84ө üO"z(1S6y9Fc\  ('-&&3fC6 VEL{ގZadPژ| nKx8R ^׾'B6(}~8`Np&G{3@)s|R Ys{PrTػOP3W Lk>p q|.c+#9@ $DA^2g7Et{r0^a]dr*n!c(VpFyPڶ6o[1K8ӡ1>80|S@*::ۇ?^D2Q{9WZ eꭏM|Eǁ/vWug| BX33 :~5vVKΌm 'ǂmߞЗƺMC'$kF] ”>7èج(pȭ]&y:B.juTސany8,$4I΄t xΥݟIka5> D _D8rAYk%1V\#^S VDL=¯Sܐf|Q~\~3*BiH߮ P)ˬd q۾CLlozu  Nqߟ A!iO);rҶR*d7 8*&/CrLr$, 0NϮbG%oUWNeD,jU)fJFOOn3wA7œ>U WTh>$9C']c.OEfI@٩e߮$u9 yAA GrO#Z̈#8zAETs2wKą`U w9Sl?Mwzh`Ϟh^_/HJ0\6,ŕ->8BFaJH]nJai-x+BK[g7w1&oWfRqF29ώ 57i3 焄$\M+F(\]>^d~R&K|=g=gC@*XR$4ZfuAl0{q##" x ߮Z+ ;[_\_Ch>PVO,2FCw|P_@Q 9$b8 A޸y= V (E1<J"Wjɋ Zpgx~bfX gup3#+Y:8K!%z{ / DU=rMl5)bw;[׮2{oqî"](%>9BOH %2qR`zc-h=rұ}erO.2U$PT޽:-.q\7J34>xSf1lr >$pJ^NcNm "11WU-iy03 桪{c Ls VP]m( ݞ\d8BE.|Ap!‚uZ<fF_Q!MwZS}LF 2gSaǃ,@d'냈7ׯiH%f9;YP(eL4>g g1|vMQ[q H>y:U| v^دMUGtBpÉ s~8"Qs9?XZ$ }Y~N:m>~Ã:8lsI`/Z :9He;VڙmG@\kV Db e ֎(QXUypI0~0fu88*z(Ŀ[ͪ=k!K?s*" NX͞ʺ\LFLPB g[ l=892^32{ a`x _ggFa=5~R;xzPB SQJ3qYokj.| -v茷5 >~9:˿.<`׎!#Qf\*0U{K1D{ pX21^et/ "4(32Kh}qck[5tpBfx p1sRQdDf/ZL%Ps;o7L;x}0IC|v# joW`xo(A>Ӏ'zfr ZA-H쁙`?\oGRgDG\(T ;x*'7 -tɋ ]JjιxDՕdlYx!nb#Ւ|=$aNE%zp@c 2C d00c8 ^ኮG'_xXkbr45 fq d!"k%i % *u ذXK|cLʩyՁpAR[^^.*G*|g 'E3́{pf:@Ǔ,f9:{*0|{Bo(2(VְqֹkptG;\HgukcYqI,橙) پJM$F[p*MK4h!q!C$> >! h_v8f+ ۈ*x@J|aϮ8IsX$P$[  ׳RQc>w5Hہ1`=cY::˦!cc[8 .q焑FyB}QW&OW||RYhv= ;ܲf׌g"(/xcq:ox0M|׵#t"<(& hשX|Νr xLXm3dbc3 f`pO!U7%vM(uQ$*W:㝈e~PϓYa4B Qwuȏˎ 'Ž(Ttȶb,Su8pT>o\ )OG4!+T2Br5֐p\G@2OC8Ӽ(b!^Rq|Al Ȯg{@L*%*q`2A[So Qz.+)%?y9P]gc(@5<[O:Qa)(Qɇn O<5[_OIo x8 gff 6/uDBA_ؠ4G> NPy8C.\]`$Lێ(Ma0!m\$_@:l_%r0|`w*~8瘍lcl!;'!I u9n!(lx<p;)3"$gεK˟K'g)M^S:sgG| *%9QG33}L/eqIdٵxXN\@͸ӥ10ݕlc&B!cg%<1TBtiӚ__{A ixZC)Ʉٙrc7%b^vi8%en@& VA FqѝurpMGƮ<$".sؗ$$^Mr-[=?|{*OOO q3ivc}ͤ D2˚ŅEKߞ}dL0ԩ!2p9]s3q8 c_/z$M84mݡ;.uěh"BZM-Z>zȿj3]At+XK=;Y,fKÖ0 At}m4&7|q jю\O焦Gf}m0$}G6? }UY+-*3_3 h0<-DPr}8C4&8 2wodΥg Aå qc uSb(ї,ҙ-^ǯ(X^=10a$)p%D(]oǾbIڤ"xCEOMrp1w oxR4G!EXb|q(\}Oʔ܏ur.Z6kTK3 /џ5 s==''Bu\znNo7]4fOPSo " Y{"Q0q드vCg;<Ϯ9&xfTPw`Y2:g}qd|Dv>^|qZ3R4/ϞL =b lP⣏1LR3H?O9w_sF ϏY}:o0 Ź{)KG#$M4{;wD$\dߡYozKYI r&O^a ?0nk1 @r2pp,,a\!+ QWds@ 7y6r5C&k^){8)IC8(8]=v~ W%CyDB1 h㮳f:@cp zsIXq2}a8(fcaLV7x᲼?߬@5ٟ+lXǮ4%`Mq8;ʽ91!#\O)D]-LTq`՝pP XBw׼@@3s-k7u+T;Iׯ +zDRY72:5)2G5ÔvuliSg} 45~I͗" Q; m~8<^bLQsN!ee9jgt(}aぬWu՜hlԘox& 2Up.]xre`CLB/)L̬w<)з 6¨)M5J+2a3 XvݳF ֐\+n=q]ClDmJ8SqP$x(5}q qI]̴nDٱ5w<\W ByM8O_M2Ď=['U 5?9Ptb AsR .LfRwung7Y9AR|2zz7X@Z\G@ֱQE=g5 Usx S{1ףY 5;HaěD.ʐv(`1N *YO&0{M \Ns jip+c=s7չ3e,H<3ƚ =5s˔_Ư#Q k獜FN:8`)qe>>ar;}d41xMMH`oYC?։c۾V 1.rsq9:. G&>pI'J-#pZ Sx)zPH)w#\@CֺBz\`Ï<46\F3=+ QBK9tYrmy%rB_[ ?o[F<_$ jnqGw&c3O xMkz"xw$\gPmY>| %#747*`̺̟:Iq}Qd"Ra&784wբ GpzHQӉ|2X M̾=F 'wfs&!X a R[p~;Y@)NLR~٤gbI8PX9$T3)eD*ЉNp)cdh\|qAk;tú~Ñ rg3MXɇI;E3ߞU];fY 5Ә\ EU3/djs8})*U4Wf .(a -W5!|[HΨㆬgCe10$Vx4*FDs"=qKT wą 7!M-E\o:-bb0aFώR%pj$3T7*sL ځ4W5q rd8Tŏd59Z9xt㶉]fߞ90oz8Yuw\rl:pɟ[#y34/$"zYE@Q}yEaM}А_03zR Ah;{^޸AM\ߓSNTTS,S pz%.x:]]p'WLy8:[S&\2irA: Xyp}'keg&NQ?:qlϭ͞C.NwŢ9u{Pw|P6(ܛ0̇l8$SZ(I/fM\0rG" 8 msS ?$ R:GrS-]Q$P#~N'׎ L(|VswjR"Fddj 0ay 賮[C'Bxm|7 DH-qXIb MHD_3Q*eCU)n1{vɲrӴLFVC3\vo 5{ȫ7Q9500tȾS%Nd[Ț$k_DLWI(3O~ %G8h_gV_Z]Wx=k0{󻾳sw(7볦nGUEދLP@G ~/X?) ((6/f VzN@s@zgqP:qˆ@8@{cֺp]%}c\7ۭ" 똅̟|Pǐur)b~hLg bW"C nrH>9HB, QW=q|HK/1gQC *ۉ&EFEb 5xyif៿L+{PIl/]&_|>A HJx$R\M|:ࢌ;ҽH{wKbXl4S&n&:ąY4YA)ja$AĞLW_rc5?XqFL ;8FKA0a >l”hr0 &B?C2\ѣxjh#u&\tj:ETXoߍq4˽O\_]S=jFgIJq0F1QR䳲1$tqEqYD'' ct|TULk(W % u J95GSlx(237= k Oj"ޣ!Uǎ$@+Y81>Uw05(`r`S\D8 Zָ8Axַ G:Ȳ"YfyId\8٬S'e #CA*$<+bkZ!) : aCǟgvaC#03Ǿ5ZLaxL1`º)nَ Ip"Db<9}cK(3&6[ Sqv%Ta18Z@:r7gwhKEzNI5\ppFl8`X0%B+t{ռ*\R߽ dU-;ߧDIk5[Me-srmrkӮr#|%嶗%4یtZ #WsO,m\Ԛ\.-#Sfc_ͱξ#Stx_8ks __'/A=U#$ WpX2m~e%4He^@; Akk!s&~z\X ]>x HLW>' pxࡋ8!7Ly9^d{3B/rgx(0kG<, FiD&Hc qCs:[79Gi<HV߬a喽NQ$P.A8:*pZQ`ӇIw fm,5pTHOaR6igMÇ{jK/TKx4 @,>{pJtu*c'Hso)]܏燿Vn${ϾY8In]mK@;{:eQMV;ȢZ.q}%FNp`\?TO}m LX1x)"%~yMt\?>8x(HQvBag6Gg(ySo{QK7䐩l+s =Sz)0~}1i|r1\1'D1 J\!EfYJyAoC6ۿzMBo7&rԲ.ϕ^90&ˎ(ż{Dr(|}b98v g,3ؤnǃX$&arʗĴJ+;w7ggt)A [3 qușhm>^A=GyP(7YzB'EE>䰫ף;/<9zqT2UƟ2M//e oss;.!INXE3A &l:0Tk!cyrl*燘lwA<(ct Awjk.8HwyFYlJGIForǎ[Pxx Q1Cڣ ߿1NV6_p)V9 jyābRDT(sz 026,zO&Dp.tzL8 .JA\܎"wnЍ/!p\gg (\bd?SRټJB Ph׮(>3Zpʀ/d\q ,n>5'|͛g?@d N?Q !/ YU\z@q)R44 Ônq8"u pfwx0.TY=4\Ju4F|dUAշ0Hh0{8xKfk}s51<91=S y)exb .q$Qȹ.$RY"vQIr)q=q&E : p*)E昭Ғݘ~Y+ vtJcn1KqmҩgIe)0OƹXv9Ӿ(U1vj4`DC00 (ԅ\ޫ# ǮBg0 ;{hd+9l1Quv;KLúw=VOĵz;c,b\\%(c.wZ8$ń"J`Ehw'&F²#tݎT)\'J+yPݱCT\͜PLtyϭyɘ8I;2iK&~y-h-/`q&R3H<|q `:ǍIN&/rdJ5+ .>+1D;3 wA2NNB==X^/OW9S H=~81 a @e@rL`pty94bfե9*,ėiDz1k׼rrboOYLg.ι} M?F \#ZZ\_mZ5[֋JkUq>jWD3E/Q2h=\RB9AKK?TxA+?͒1Ǯ `J%&=CHܸ 7-d;2ȸwXp?Y!=0 FvRzS 4㚂7o\%Bgx ަ^<ɕke8k&y@4AO)Zԅテ4$:2$o ~Z+T@B^ƑvQ0D>9z@Kj= a1ʼnĢBvK;9$(jO&fs;s/#gg8f`bqH(f wf9ɉc<,󠢸:m-|JՔ`:yD@]q{<>P"8E#ÉPN)peb&BiK9>[0h !wr!Uq4+[UpI/6nm *7nzF5QKcVqlV Rt5+') o9rvE85ǂhBLz2Ǻ "e|Zh] eeCvr.=+B^#In=?6n~oH@0ag|ZVOa70KQw(vu1&8i㉌-S:{U`vx4 2?'E$<ޗl8AvϣStZ1PSw5lK seY|8,"$qLK2) &x|Kjvm~⬶H<Dpwe`֞#1OʘY5%qIu2c=3 7 {ҭv|8*.1J Jtּ񕞭>AjoQf<+!{;f#sN:rAc}pjZH PZZ2^r^$L?= ӯ)>m "C]%#xutl|o,>x.3_畒>WNx_VᱨNδ1H>J/. 4vn Q$!Ҡ 1N7ʽv~yXS;  c~r,瀶߮,6hAjɄ`g1`R\,yW2eniXUqΪVhnxsBG/O)LB 2ϾM``&jߍ=S^CnEҋ:P2K{ז>8Cq8]gOAx 1ID2ƸҊ{  hTT}' RJa2vmuńRNhA5 ,ť.SqT"KɆ!ٌxT@yc^'0opFcNƑo(X{Rd`4GVszCBEB,`1 GIuo\LiI#!i\ R;9aUX6v.q V9;"4ަwpvJ|:+`ӂt]qiH[J380Fv[!^h r{8+jHT(g^Y&:C@x,Vx]$[!$'g63#ߎ"R&/!du&.}ÉCghG/S%3v;"AT ^H{R h=0F5q68"\p&7^<(]pj!8<:Nu]L9e4Bo}4%@qa4E\? Ž1(>Ogb=Xg5Uxm@`q0ZܜA$Ir7>shd͕[]$Uc%JRt5׎Yf,Iz: >>9F] NoAY~20gd١ -'Y1# kB/Ē @ *3_ݼ_}M됣8c̣YBaPO |S&IG5y kӑT[<' 7z|#lc/mNMsd4c7V,&k|$Xɇ1,W!ZO HI:e`|$.j.돩!Q!XFv~2NNi$`{aduq|K8EDO9㥆P%ɽ88Xa/jPBKA˗hqDJ 1A!;|ceNJZxGI0hJ x a'*ٕ#O}cqcm0<H"qu〴](m=pmNq Rg0b$6q82{j:zy2`"mi͜3a<6 dާ ј5.OQRPX|$!_7R|nBHt# |YHՉg~8s:5yXCpɂaPI$/pҨeNF6aۚfG7V|;[ˊxR|B45pXLCWUf`lu3Y}i!"cD1@t qG U.38aLw<JRKS( \" L_9ɝ ;4!' 3GY94i=EmHS 2CMh=+=8 H_chvb[wԑR+0z !s PezpF`#q 8 ĆF" 1e+l(t  Y(ߌrQUFD1ָYfnS3g/dο\Kq^%R@g{B4ߓt R/B^@0b#!W5 }K . Jhy\hZ"J cC@wlӮd̔Rg|፲\vDzŢ"Lˋ<;aZVoQ Z9B@|c!!haϾO0 w nOG M`)G"-\gQ^K"Glَ zy 罇Lnf+ᚢ򓢮wM512%5+gK`Q]p)믲\y Ҭ7u8 ɍ L2>crlAYpC̃J1*zɖvTQZh\ZC7N8C.QI{?^ˊ.1+d%̘ŻDED 2 NK=/ㄆrKf}Nt7gg.ZhJ8΋8dp64g'{pY4]rَr&5opT\e R&p9kuӜr -~يj`QÉav`*œ, -`F?\ l2ָ2 Es:d7= h_,#^xH~It?*LwpT!n`jx.<_$4 G{?<0QH~8]V&LCd߯$VfzpUJHfL-ڷv]S$yjExA0Cv\ޓLa"~SAj#*q+jz~vypQl23;Si Tޙ^re?L4uUGuȠ>ے@X@g`͏by}!ePl&zFxVbP8N{@f,Mja$6=<?Z}sV=M xg. 8S.[E&C>yeL!ExI0==C/X<(G7tF!>w1ڊ\o18⌨:N|]&;x 2NV 󹏙GTN3㘢 lU~ӬXUu2YvEg5 U43*+Eإ^L>"YPbW]͟|Qpd*Ҏ΢P|pgww&V!?84 .8g^OQZk ٿEP 3n"Oćt0 煡 "e )A?H6% mץg Bi1@0^| dȯ;e޹L5x5Q{IvF:mTPMg3#E !p"LvK뉭B.\|mD|;fPE L!F˙0de)ZLRxKX9r_g.߾`*M&巀VJ: Bjssn%ROj jzaBLc8~>$XU+|0[~v_(QH&rgg^vKfF;0 nŒ2``"X1DR vs+uu#FQ@ K<MTh}#R Zx*͍cAXJz!#-[юHW!/~+ےȷsp`ʕ F"6FMctpoDH1{$ DN5*Z;ygVA)1XbFHl\+-[,9Hm̩!aՎaf}yd 1O5$$l?aHQ3u:‘P\w.miyX[hHO9*&!iD LwMqw,)H~q&sVR87);O']us?BxSYΞ? >cZK1ϧ.[i)rde __xxAPz? A9 8 ϟ#WzxYC7np!ҙ [-}$*zk &NmX\cfCz̵H2LgVz/ZN|ХRY3W&G!A3}/;@Z͑rq4/Pd4s '$,gs mXyOsOvAz\#Ѕ7$|=B]P|q@^;sSP x66u>Ƥ͊ymk$Qw|.:&+U3!Wy}^tc<)؇;&aX xs*.K¢<'-*+  θː1^n;pt AN<ӊ rF`c]N =x(M2Fynٱ#8ବ f+j:|p=LyOZ3FɈg& lxѭwcIÛ"PFy%NϜ}D0z9c@=On'0` ?/o \%̱7wŪK#[xCYu@M0Xn|>4t> |cq1#BIGRLcw%rQ8І$w)~X`:A"0?1 JAHNPKn;Z |V#gh螳q3HctQe33Ɍ3+ SXJ/dx?`6H ѰO0;^/݅BcP8^"98E2kuF) C?~9YGB y]W lu"et!xNc2:`L /|dE\9 )u_MŹ_Qǟ +Ӿa1Ǹ!@pLۣ2xPt8ts3G3nH><B쒝F"zFn6dņ0@jvfe䋅(Y\͏dCLcyT>R Jg|6S8'<~ɽ 9wm67oz18"gs1̬3i|d9c2)$o凉BEX.-o~BE~U(3 ǎH;܌QÁ $8iiE h.x⡠+6#Ho4FBi<!_fcYyJwâ3]mώvd!?x lu*GKƟ:ɘ8za"@q;-^RgYQчY|8)`@47$WY>iat˓WtI J-;"KƲM$~8 @#qǎ^By%d-.s ɜI~SWS* 0ԩt<>ASQM8V ;GOʹΈpr'*"fѢoCzyoٞvL9K2\q@'E&\DWe6HVษJ}'DΓfW _V~N\TZAΓ?`=b24ڙQ'[T+O6V.#(-Mk@U9ДM%$ wuFL `$yP '^C5u1Ʌ߮S]ާ"\x?h"{1dUnx笩na3~1&sUE&LqXIbXXSQ'XE &!dXs*  s u75f r}*ơc.<4cCT 2opFE*\Ub !Yw5Mn-g88QH]<6Z7E \ZTpZBr ޺ɾoB${, RqLG}=r8gU.U7 Vk3E.ph y|{1|fX }<#m=^Zcy%:xP@drڡ.ռg { <+)#f3Ib/_K BȐGi^4"OWj\$"22y$ST^5;Ŧ1c< .3);EF_<ʳ/3Ǔ^ ʘx pu.!Ц DڜZu<UٻF6EE GG#Ȕez{yb% \y_ώAtn&{j&<(l qAw ,ېwx=<`>8bsP/ρ+:3"b\cźPmbW01љ*"f%qq*ot;B@Ii綼PI{Tih^ ( #qDԡgc(QhU3qx +۰B '#9̶G=quQ9dYk0n4@go{BӋ&W '>PbS|V}l &(_g4k\% ȋTٍ:$ ־xs#J{p,LDצ.sFDO"2Sc88~ ]{tˎf[~ЬM"wu/)rf3cLi89:| Gv;=9eTj7 cہzcrFfzCh20=Eְ`yf3HcG>|y []MTo Yl#tNaK>H?qNcfHc|!0+U29_ SHQ@N%0ef`ћߗ뎉 㭉TfVL ofj:Zh+9/7P |9סQl_;$ >Ҩbjc=爙a㫾f2z I솵TPvۭI3"!g; MCd{8:T!4?XƜ`'5ǏzȪac8,L+" *W ,& 왎ffFM~^!b]Y;Bΐ6A&#~gꨘ 8:2hp8˔0ȍU7J:@55]H4o,aG0-|Yq)RhLx'j 5]|!*YRxx6SV}|p͐nÜ`ycH,yA롛·!v'P>Y"ݺzAq}8Da&.^4Q6%VJ |yN;2;ocC XTs3O8>H& W;KWpx1DɁ0I+P5 Ǖ#,q,,̟<Ai*5 |61PXj%ߞ8YT<[g(nH!bw8o( ᚐ֍1 RBqb*-;Gp I[/LLCO'bѷ>}\:D8.3+0 pAK +D_t)4WRA~9y|/IuC:j?J О;fAft/'=,ώKXUNw \1տq2#1mpr/Mfɹǀ (NqqP~2se2^ڽtqgUK)!z{,h{e,0#p׾'W0ᰲ֍-!\<.'TWq/$`@n1D9Ldt!T8׫TD "zBdϩ۟<@GK}|kj#έ۷yAl[mt[pP,g`C#:i@r&۴%e/ FDyu#? 1ӣZ1yZl;$Z}߾e+/irP+5;%5 Jb1"Q*p30=|0*E9YD_x43@ oSOBe}q`xwӨϲt :wdO#:O^-O RdV1qoSD&78îg :fJ*g})m0< ##1T*kxюE26H,@ _7RzPc)Tw@Twe["a5@'GThP A^t#흮x ,3",)OG6 O+$51 .W(,2̗gA 7x!x+P)]y>xiB@>\LV`y 1*e8`ZމӇ 26eziȴȣR4GT߯e[kYㅄ'gi1_hk?\[ D%d#/ Twk`Pzf E.j7Xg|{ShtVq%)9(R)~FWa kÄ!&W;3O˙]]y ?o5a/Xp3dXřxsK(R٢6$?X"˞V N;[\  baeqŅ@"#c3ZiE:qN '.K 釮B(U;8 LNV}-IvpISh|BKGuƱ%ŀledlL,ƀ"|Yuug )n.oA_i4cG U9j%La>AMF9!|mu~N5raJkϗ#YiuȖ@B֊Gh &oDPoeߐ,:& <+Agsʳ:W9 CRzXyl {&^3 AFu+K v߾b w@><s޻icz0Ԥp]q|uT!|'` `ywpCDPo`F[%(4!s 5p/dN=bWӐKOg|qQQɓȷX@S-}pE&r9Rދs,NcԪ#yណ-3*Mp}ݤ!7QH&d\YTT}1o85x Lɗd,8oQDjXiA0(^jVP޼7Քc!|&O[9^2QkC!g@=gvۈ4@c S Q` ȧSM$",|A;^sA(WwLdl?q bS9]̼af:)X 2Qx3Vp&`:'zaMI@жw[$]< fQ \}!Z-.܏fJpQs.91p|pp ~J0qī 'ǮXJexb+ \$Q BZI-f1( 0,`wGc (t/ǎ:G#v"5:OqV7?Y3֕ђ?0ɇyxFAbjIe]p k@,>r#)P?%E8 ~ n llw8GUae.9cETg^eEA@jA5S\( EpP3Ժd{m_i\8F@VNH`fr I*oz̢ji2q3xBwS0jVArO 4þ 7]Oh1#'L!`1)/@|KploF vy2҈ Xq0Y d R e?\Evd~Em> I. M D-Ƹ9 ׏E!&@hX̀8yu'Xi|ciUX}qll;ADgYxf s3IORD<nF[?&T E1Mp0|RbPk: *3@cXrҸ#(@@wىsE%bc^9]~>N#A!֌xQVKD._o16WO$XdfG=cӉЄPQ태L+B~Q`N]az=q xUsrÍx2 mq QPvǾNIy[pSY9lh01Ė;&ng!<`qr0`kG+g$xq3B!tX~5]3Mz A ~ء-!s* 73of8uwB`plۗ^(}k+/C/{kLL|MKI81_U3~ـpg]k\[ZyYC+.m/YjiB9G[Ȑ|O F*z??zVtJ3 a׃ Xٍ2pr"Ф7S'-pkŠSMŗHqxaei$ |jy60o\ ^=xkj-]u7Wۆ\UXeL9Dbh &e75qT0k/0qBR+^2痌9c^$uy,_ANͳl] FL T Ϝ> 0Yж͟8*ߜ̀^9yTJ{Et49>;˟[!^*И~:Ā-Շ`%7P?Yx"cJZħKkE<TXuwֳx3ăɧXC+wgdUF X˵3.@J2_SUe&θDy[*$!g< c C2Z3%tffWG(q:8lXb\yagRwnK&u_ry8:R“ Q7PKd7[А%bމ~|뉅A:#x\o9 įLۗx8#J z]LmH%$@gsxfLӼBcVwO-Z]KFR3R9x 73d,1C1r\B &lr4Xz.څ 8 ҂Aܐtοx 4,kxӭp AT!WQlD63/t1ubg.vt/lyZ1rwtBHh]D񆶙긔7fԮ1n,y .k5 E3vЁ:ۯ0~81i37AՌbo FH*ȥo.ۧ!"9?]"jkDg]ȳs#Rw>4{ 4%egNHoP 8)KdyE})ʘac*VlrIQb%0ǫ$DTqkco'-PR"#Ue(Q#p`@@.|=0H7.{0U %L\3?J {B`Z`KڨDN3H:|r$o!ɳ'kH~}LyE|`lD\OQU0?P l)7> zj(6{Y'LsOfK FHS ).uŕw9 vxsЯozYl<^o_fĝ9-Q>20ЀB쎾W?ȑ@ZW,J@3wrqjN'z xPǒp`J%ܛaƲNVgVE=?D|9sQVE{✐:u^D eAf 4h B5|4u^! |RpP(<^o$=&[`UFlָ$ȡжL{y-VL7Ӟ(J' }`P_sٯ6lf&F^e?EٶG??獪22` Ó57u]z5s /o]12ܘ.Q^"otя.#\|vcN dP F, Mr"EN23pN2)%A[QS22;$ѿx(`;5ܐ`e# 4gJ,&$g5Ð/"+뙻So HR6p}ލiM{c_ d aFF8  7z}cg)><^DM;k}H~+oY'~$V vgaN;l<}# 4wθD tm %fŸ=([h<.Cj`:z'~f[ȂnHSk߂y~MfYd 62S3ys i~ k[[`6fC]!TЉc62D  +WFot+SLs_JAYb#)OP;c54©'_,ZL6۬ .q 8)F/Y2v (:{4arHKeD@{؂ApI'SW56VcYℯop1,#㑪@^K=C]LPww/0/XLnP"CXm!Sp3H*OdC97 L:>u0҇Y:JB-8_9cg3LW"FOd:}>Ux`&|3:5PUHV>Lʓ]\BR 1Y Yxz⪂D]Kgľvv,dJw޻Yet/z$LboY$ey)ZW5w!(9ߚqˀAHŘxҐ(pyS2e¿&H*k㓢D;We k_OuoU ,eb2Gx4W\|)[cD֊r*T^1(pƦgzq6" ZN[ LP'\ 9y MW`fg8%lY;g]~n. ]yO2PK]Z J} ' ?oz=ˀOpNPW@BY.MN'35NTஅ\30dֿ.ܠS6`(\CCQS4 Uw9:~\ d(Tݞ3*"+޺R֠}olr%g=*GWbFw̒ +6犎)~N,qP݃N2cO\3HthyiR8s^Oes4u*сj&緕&C1x(j=}DR0q$ WJaG0ύX\,):1I9RVqfxL} <MfKS8qD#oCB `noHL:nI O; &/׷\UMBgRO!mЦina=z/ÂF\ӗxi̎ώ!z.M|]F+Xwqaqg7>'K2 =T TgY됹Gv=#!f`<l޹,'RΎ/2̽,a#[.SI A\rjRbjy8Vg D a8:eLB-E. w'$ pKsJh#yb'Ŋ;̈og3 {KcJZ>]^5 tu8̄ p%% @}]-V>)@k"w(Kq>8Y\Ic\xkD׆薿,hZ&~F/`r;C j>yiQ.lֱsSzg6lJEIŶ%z N 2鯑=֎զ]p6s6_,=u0Aj=\2A`tMA`p;wTr@8/ veד¡h+a8&l&? P4Yί)D`|0&n|_7Zzu&-eAmr8!%p5`~'6f]G2A;.]p C:$ù=ȝ2˓~xϊo`0]pX#X)~ʰrSSȥrq e寻&C`) ߧ/'G8lx@CI s2Ph,3 yU& =!s\!(iﳫBB.J ͑嵕BD6twx2RN`}FEn# ϧZoLMx,M&^*7%2_LFB:{ם#nLcsϹZF#dNLb'l눠!d 5fi{G@&;1<D5*2rԀQ@hfgwQP.)#i\g޸@$n;go'VQ7R#pd,(t5Y!BG0-H~7" |¯_'EENعpA c똶dUy P-xmt3N5Q]+k@u|@9f|2J>)q=,4 eKcTgy:6{ 3d&S0LqfC   ZϯJ!mp|;B+Q>xpiTLo5 4\5jV ɔ3u_ cKI:ÑGd:E BI6U4H8>ځ:`f(BjRۥ̷(S12 Rb!3|^ߢώ V&̭($5?6sl*q YTFܕr=tM|q=g85󚁜kpN-`.&;B&%(}oT=yb0{>ԹtMZ[d@A,͹u3yV_*qY"5ړ?{nP+/RapLρ,4".HI`xunD?`̈́eZӱp@ۢ9 dLnq۫ ?cn@n89Յ.Ps{hڨ86ubNLl} NB#Ӯ2g`? |2H:՜k06θPyq|ffHC2ˬS<=\>kC\ Ц!u~sĕp˓Þ`Τ0 $/z,MIbjx>9ئ Qb~(B97hγ͋M]o|h/VkW"ht19 YA-24c3`|JM@eUcAr@͵i1;<[<r0S H2eFL.EeNj l |O {2`:~Oz&)2'U g{@VQ[\P΃(zRѢoǯY7sPmyZ\Ug|Mj0pRmuV exgsS<9~8bM˷ITӬ{ðjEWNAI`?7xzT,uh99.3s&wW c} k7_<-bc#05Yᆗ&OY"jYb:)[5SG搄fN`ykƣg1fF\9H܋ؒ(\ mwcspha wyTS|pg"yXaiwup3I2G$PKuO<E y[?ZeV6ձu|8Xg);܀ٵNu(8;*'C>G %)s\NνE=\`ڤY"[DLDIͶWq錕bؑ?!do0r]ԁܱ 1ĤƱJ"x=,GTJ(O9_9O-j17㓩N.?J_ ^3z iawjB>K*c\|}x4Ĭ7~:.M7>8B KWþiVo )97Ix^wӑ{Nyۡ |2ĝzǟ|V*%PQ(ƆYӏoG1DϜ9r/ACY.Nk׾!Jo#sfbfry\/}\w 2T5q@_.= MX:NƐeg JvJMma@3j0>88"7gLy< U 1fz)8Qv  L;\޸N 3D,XCQ,\ fQVrGl2%0,ndv\=+~s8?NIM==֋"lٛQRE/&%FCe$-c>7E+x0Bog8S1A1UK427; -uytxm7\ƀE c}Y,vCJ]O>~2E+Ep{$,UTcΈrv_|.`Ddg c]A kʝiM3ʆ#͊ApQWC9p5Q0 yM])vpx-#1rrā.Z5炶4 Lw7뀔y C`A8 ˁQ42y3渲۠Ȧ#$qh/A] -S.w;<`ԘpÿL|S]fpM|?P1p6^%r.7N5d2P6ycxV9;}5s8a ><׍@hzʓUs&pV4w9 "`iDyB, ))q$û͟flW53x>vǛ;Ђ5#A"كd^] =ϾZ"3VvIL-L`aS/F@rDI})dCi.ptwFx`JRu0en*RHLהV!NjbMz!v@|YCMμ0`L! YV@gŃ 4d[_ɱjo' K&S^2̩:eX=c {Nq@3CJ9I\ь玷Xj'&30*izx݄\4w!YH@ђb1B"#13:u8 `'?3Lf>XFԗ;T3QqƇâeŜF m#Yt/q]NM`Ir;E :T=m㍑7 yɸ&'k+-\n:Mk@0- іs-[ %Ihŗ_]kX[.8-W>fR@L7u6ڎ2Sg'8Nt\A=1' EG1 %aɟ=pY΁X1:-Crг#~z Y@Ls %|n~3 \\PAeHయ؄PdqMqp23^oA+#ǍL<|>*2& g%.]O~9I0bIֹ-ߧ34w=p e[:p SĎlM:=&J>I&NjQp(m|*#qL5$"Dr%%i{ptƥElM\21 [vHΗMg7f݉,|eb z<5@!k0)j_,*˩ <2 ,,Ej gQ+FVk7К|^ `&!4/(#I`vܒ!Z)YH ,f+!}L8ߓ\Jľ1ùxz달r| =T=e5ʉDq{2c!!IFÁž9aI1kv$CzǮdfgB ur\W+H;soRF ;]&; H'~=ع-ʔ!<=U|+ c}B"ތ\C%gxHc!;Dsŧ'Nیٵz*Knbll`l18xL+UA ݾxjRuoB(Lc#@J-d?<L@'($Br,qM0 x6`|Kvny:g  u&7^dPf\}ox @u""PN <{Ǜ#s@K$=ad@]ޑVo'~ \qMθ[]՗[rD(nXp\"b`vg HfQ-W)|\\/c}4s1Ubmvg?LõVW"?$Pv55[bFq0qY#Y<EP z6 @, fIlq0q4Vr0mƃDfܺiyF* KTK YW09 $$5^O(iO+T +iz[Pj7~^3\Y ܑ&[;xT.5̪ ^XEG1iwCUI,O { 㶅,G}>&ŭFtY,Yx` rOmBxPe|c$& 0 c]wb<#O qPoODP腓}r]91@>;:"Ug _`4e PI3xP|^zG?ug*~[iNKC%VGc, SYqRzrvLc/;cRwcܓj&2K/}X%S:wP`oCŀQеS(g%n+7\eZky5"ce^'/@nw28!T7-"⫷ㆫMDӹ)D(L}б @sxA27_nō.0Ҟ[U (7^iw\IĤYwx >gN7SXB16`K8.*d֗'ftz=3~{ⲴLgvQ40,AJ°w Ҡ&!z09=N2Re;/T yӗ τϞ:@) Q1\P0\ aN?;H\A.A$ЪSq Jqq*6D`O&7N[ +]F`۟ek`/E0LōXayg}^DaPɟ/(S2iNIBTξrdJp ' Q,6`ĝODLNFY,JDc1Uts,x> ϼsЏ<1< Q%'ߋ}cM *Zu3%c7cIYw(]|e4늬g-~¬`^W"xv{5A|{A  5\igZHgAI-z\Z ^]P .[M13x(&PsqV|86 0_|@MZ pD@#P("8LAC޽ B qe4==C A)"m{|''3ys36Yx/C=-Es4!K/$ + :IL@E[

    HCk,3h(yw噖\qS!S8`1 ih *x^x+S߿m)CGpU.x> Frv71@K` \'z9vmX6*Y-K >I#s'(}W Rx拁RCrNW?aH ur-ŵ5IAyJn3X8e34ՈF_~yZ(иpp %= z,y8V J EiΡnC)$2f[E4G'0=Rl…K ='ٹ :y3L^8(Wp )2/ˇPr\/(t1ךAڠGPhwg" 9+ٖ߮J<ׂ'AIc1*gUه`YPV $JB?5WOˌ!]5Io2Ђx:+aV4n1rwCoqm=ykXUqgxHu8k:m0'z`U v],8x5 gę/cs^[;A@6;T1/56s-%/NḞ^퇃>x֚ {?g"uK=fkT>@*u?һΑ+2qFW47唎c1?ӂv.Fu`Y92' 0 p P{Iɰz:^5m ~U=~;Ub}ߞLCk\eSBSɀfgL.*0sBՒf?\ (>_@@1:˄!h5#!x' =EW`'!lϏ<@h9j}y\ nHc5d -ؔ}oTfk*6:*fƩO! wۥӈ,{"&Pt T\ =@4;/Š+xqƯ wkVLYrk)@x0"й?(RmM\t @/sx(E2~C6O99~ho@ ,o 1(LߞAn"zWޠ̵zF,2DccU3`ݿE< IcDʂ(__4vㅋ wY8_@cWWȕm霝<<WR*QJ%, 'L* N:8Y0h/np^NUoPd@] k A*g|TBVVWh,v!m1RH鉾#U2i3\K'|^+(#g+?c"c  ΰY%SY[%@fa[0jw|pi_s8.vG]3ses ?Q⭇9fj;Ʊb'<\珳+fh"1lEޫqP gqFST93cR:=ǜYm&3⟞$ g.s?\"6tn=|Y.g|фlF>FO>@NFgǪ~X.wx<)3&)^" c}p !G ux^7|@r%$;\ɋDq)Y`k@4`o3!53+uZ5&sH<\x|Hc^ymanuskript-0.10.0/resources/themes/000077500000000000000000000000001354442177200172755ustar00rootroot00000000000000manuskript-0.10.0/resources/themes/gentleblues.theme000066400000000000000000000007561354442177200226420ustar00rootroot00000000000000[General] LoadColor=#a8bacc Name="Gentle Blues" [Background] Color=#a8bacc ImageFile= Type=0 [Foreground] Color=#a8bacc Margin=65 Opacity=0 Padding=10 Position=1 Rounding=0 RoundingDisabled=10 Width=700 [ForegroundBlur] Enabled=false Radius=32 [ForegroundShadow] Color=#000000 Enabled=false Offset=2 Radius=8 [Spacings] IndentFirstLine=false LineSpacing=100 ParagraphAbove=0 ParagraphBelow=0 TabWidth=48 [Text] Color=#2d3f56 Font="Times New Roman,12,-1,5,50,0,0,0,0,0" Misspelled=#ff0000 manuskript-0.10.0/resources/themes/oldschool.theme000066400000000000000000000007261354442177200223140ustar00rootroot00000000000000[General] LoadColor=#000000 [Background] Color=#000000 ImageFile= Type=0 [Foreground] Color=#000000 Margin=65 Opacity=0 Padding=10 Position=1 Rounding=0 RoundingDisabled=10 Width=700 [ForegroundBlur] Enabled=false Radius=32 [ForegroundShadow] Color=#000000 Enabled=false Offset=2 Radius=8 [Spacings] IndentFirstLine=false LineSpacing=100 ParagraphAbove=0 ParagraphBelow=0 TabWidth=48 [Text] Color=#0cf155 Font="Courier New,12,-1,5,50,0,0,0,0,0" Misspelled=#0d5322 manuskript-0.10.0/resources/themes/preview.txt000066400000000000000000000031461354442177200215230ustar00rootroot00000000000000In the beginning was the Word, and the Word was with God, and the Word was God. He was with God in the beginning. Through him all things were made; without him nothing was made that has been made. In him was life, and that life was the light of all mankind. The light shines in the darkness, and the darkness has not overcome[a] it. There was a man sent from God whose name was John. He came as a witness to testify concerning that light, so that through him all might believe. He himself was not the light; he came only as a witness to the light. The true light that gives light to everyone was coming into the world. He was in the world, and though the world was made through him, the world did not recognize him. He came to that which was his own, but his own did not receive him. Yet to all who did receive him, to those who believed in his name, he gave the right to become children of God— children born not of natural descent, nor of human decision or a husband’s will, but born of God. The Word became flesh and made his dwelling among us. We have seen his glory, the glory of the one and only Son, who came from the Father, full of grace and truth. (John testified concerning him. He cried out, saying, “This is the one I spoke about when I said, ‘He who comes after me has surpassed me because he was before me.’”) Out of his fullness we have all received grace in place of grace already given. For the law was given through Moses; grace and truth came through Jesus Christ. No one has ever seen God, but the one and only Son, who is himself God and[b] is in closest relationship with the Father, has made him known.manuskript-0.10.0/resources/themes/spacedreams.theme000066400000000000000000000007511354442177200226130ustar00rootroot00000000000000[General] LoadColor=#5d3e3d [Background] Color=#000000 ImageFile=spacedreams.jpg Type=5 [Foreground] Color=#beaf9b Margin=65 Opacity=50 Padding=10 Position=1 Rounding=10 RoundingDisabled=0 Width=700 [ForegroundBlur] Enabled=true Radius=32 [ForegroundShadow] Color=#000000 Enabled=true Offset=2 Radius=16 [Spacings] IndentFirstLine=false LineSpacing=100 ParagraphAbove=0 ParagraphBelow=0 TabWidth=48 [Text] Color=#000000 Font="Times New Roman,12,-1,5,50,0,0,0,0,0" Misspelled=#ff0000 manuskript-0.10.0/resources/themes/writingdesk.theme000066400000000000000000000007521354442177200226570ustar00rootroot00000000000000[General] LoadColor=#985a20 [Background] Color=#985a20 ImageFile=writingdesk.jpg Type=5 [Foreground] Color=#fffdf6 Margin=65 Opacity=100 Padding=10 Position=1 Rounding=0 RoundingDisabled=10 Width=700 [ForegroundBlur] Enabled=false Radius=32 [ForegroundShadow] Color=#000000 Enabled=true Offset=1 Radius=4 [Spacings] IndentFirstLine=false LineSpacing=100 ParagraphAbove=0 ParagraphBelow=0 TabWidth=48 [Text] Color=#000000 Font="Times New Roman,12,-1,5,50,0,0,0,0,0" Misspelled=#ff0000 manuskript-0.10.0/sample-projects/000077500000000000000000000000001354442177200171065ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts.msk000066400000000000000000000000011354442177200220750ustar00rootroot000000000000001manuskript-0.10.0/sample-projects/book-of-acts/000077500000000000000000000000001354442177200213725ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/MANUSKRIPT000066400000000000000000000000011354442177200230010ustar00rootroot000000000000001manuskript-0.10.0/sample-projects/book-of-acts/characters/000077500000000000000000000000001354442177200235115ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/characters/0-Peter.txt000066400000000000000000000001461354442177200254670ustar00rootroot00000000000000Name: Peter ID: 0 Importance: 2 Color: #ff0000 manuskript-0.10.0/sample-projects/book-of-acts/characters/1-Paul.txt000066400000000000000000000001451354442177200253110ustar00rootroot00000000000000Name: Paul ID: 1 Importance: 2 Color: #005500 manuskript-0.10.0/sample-projects/book-of-acts/characters/2-Philip.txt000066400000000000000000000001471354442177200256400ustar00rootroot00000000000000Name: Philip ID: 2 Importance: 1 Color: #ffff00 manuskript-0.10.0/sample-projects/book-of-acts/characters/3-Stephen.txt000066400000000000000000000001501354442177200260140ustar00rootroot00000000000000Name: Stephen ID: 3 Importance: 1 Color: #ff5500 manuskript-0.10.0/sample-projects/book-of-acts/characters/4-Herod.txt000066400000000000000000000001461354442177200254550ustar00rootroot00000000000000Name: Herod ID: 4 Importance: 0 Color: #000000 manuskript-0.10.0/sample-projects/book-of-acts/characters/5-Barnabas.txt000066400000000000000000000001511354442177200261220ustar00rootroot00000000000000Name: Barnabas ID: 5 Importance: 1 Color: #a9b0b6 manuskript-0.10.0/sample-projects/book-of-acts/infos.txt000066400000000000000000000001621354442177200232500ustar00rootroot00000000000000Title: The Acts of the Apostles License: Public Domain (World English Bible) Author: Luke manuskript-0.10.0/sample-projects/book-of-acts/labels.txt000066400000000000000000000002211354442177200233700ustar00rootroot00000000000000Idea: #ffff00 Note: #00ff00 Chapter: #0000ff Scene: #ff0000 Research: #00ffff manuskript-0.10.0/sample-projects/book-of-acts/outline/000077500000000000000000000000001354442177200230515ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/000077500000000000000000000000001354442177200251355ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/0-Chapter_1/000077500000000000000000000000001354442177200271005ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/0-Chapter_1/0-Introduction.md000066400000000000000000000007321354442177200322420ustar00rootroot00000000000000title: Introduction ID: 1 type: md compile: 2 1 The first book I wrote, Theophilus, concerned all that Jesus began both to do and to teach, 2 until the day in which he was received up, after he had given commandment through the Holy Spirit to the apostles whom he had chosen. 3 To these he also showed himself alive after he suffered, by many proofs, appearing to them over a period of forty days, and speaking about God’s Kingdom. 1-Jesus_taken_up_into_heaven.md000066400000000000000000000023771354442177200350500ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/0-Chapter_1title: Jesus taken up into heaven ID: 2 type: md notes: {P:0:The good news spreads from Jerusalem to Rome} compile: 2 4 Being assembled together with them, he commanded them, “Don’t depart from Jerusalem, but wait for the promise of the Father, which you heard from me. 5 For John indeed baptized in water, but you will be baptized in the Holy Spirit not many days from now.” 6 Therefore when they had come together, they asked him, “Lord, are you now restoring the kingdom to Israel?” 7 He said to them, “It isn’t for you to know times or seasons which the Father has set within his own authority. 8 But you will receive power when the Holy Spirit has come upon you. You will be witnesses to me in Jerusalem, in all Judea and Samaria, and to the uttermost parts of the earth.” 9 When he had said these things, as they were looking, he was taken up, and a cloud received him out of their sight. 10 While they were looking steadfastly into the sky as he went, behold,* two men stood by them in white clothing, 11 who also said, “You men of Galilee, why do you stand looking into the sky? This Jesus, who was received up from you into the sky, will come back in the same way as you saw him going into the sky.”2-Matthias_chosen_to_replace_Judas.md000066400000000000000000000041721354442177200361420ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/0-Chapter_1title: Matthias chosen to replace Judas ID: 3 type: md notes: {C:2:Philip} compile: 2 12 Then they returned to Jerusalem from the mountain called Olivet, which is near Jerusalem, a Sabbath day’s journey away. 13 When they had come in, they went up into the upper room where they were staying; that is Peter, John, James, Andrew, Philip, Thomas, Bartholomew, Matthew, James the son of Alphaeus, Simon the Zealot, and Judas the son of James. 14 All these with one accord continued steadfastly in prayer and supplication, along with the women, and Mary the mother of Jesus, and with his brothers. 15 In these days, Peter stood up in the middle of the disciples (and the number of names was about one hundred twenty), and said, 16 “Brothers, it was necessary that this Scripture should be fulfilled, which the Holy Spirit spoke before by the mouth of David concerning Judas, who was guide to those who took Jesus. 17 For he was counted with us, and received his portion in this ministry. 18 Now this man obtained a field with the reward for his wickedness, and falling headlong, his body burst open, and all his intestines gushed out. 19 It became known to everyone who lived in Jerusalem that in their language that field was called ‘Akeldama,’ that is, ‘The field of blood.’ 20 For it is written in the book of Psalms, ‘Let his habitation be made desolate. Let no one dwell in it;’ and, ‘Let another take his office.’ 21 “Of the men therefore who have accompanied us all the time that the Lord Jesus went in and out among us, 22 beginning from the baptism of John, to the day that he was received up from us, of these one must become a witness with us of his resurrection.” 23 They put forward two, Joseph called Barsabbas, who was also called Justus, and Matthias. 24 They prayed and said, “You, Lord, who know the hearts of all men, show which one of these two you have chosen 25 to take part in this ministry and apostleship from which Judas fell away, that he might go to his own place.” 26 They drew lots for them, and the lot fell on Matthias, and he was counted with the eleven apostles. manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/0-Chapter_1/folder.txt000066400000000000000000000001541354442177200311140ustar00rootroot00000000000000title: Chapter 1 ID: 5 type: folder compile: 2 setGoal: 1000 manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/1-Chapter_2/000077500000000000000000000000001354442177200271025ustar00rootroot000000000000000-The_promised_Spirit.md000066400000000000000000000025361354442177200334640ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/1-Chapter_2title: The promised Spirit ID: 4 type: md compile: 2 1 Now when the day of Pentecost had come, they were all with one accord in one place. 2 Suddenly there came from the sky a sound like the rushing of a mighty wind, and it filled all the house where they were sitting. 3 Tongues like fire appeared and were distributed to them, and one sat on each of them. 4 They were all filled with the Holy Spirit, and began to speak with other languages, as the Spirit gave them the ability to speak. 5 Now there were dwelling in Jerusalem Jews, devout men, from every nation under the sky. 6 When this sound was heard, the multitude came together and were bewildered, because everyone heard them speaking in his own language. 7 They were all amazed and marveled, saying to one another, “Behold, aren’t all these who speak Galileans? 8 How do we hear, everyone in our own native language? 9 Parthians, Medes, Elamites, and people from Mesopotamia, Judea, Cappadocia, Pontus, Asia, 10 Phrygia, Pamphylia, Egypt, the parts of Libya around Cyrene, visitors from Rome, both Jews and proselytes, 11 Cretans and Arabians: we hear them speaking in our languages the mighty works of God!” 12 They were all amazed, and were perplexed, saying to one another, “What does this mean?” 13 Others, mocking, said, “They are filled with new wine.”1-Peter_adresses_the_crowd.md000066400000000000000000000072331354442177200345160ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/1-Chapter_2title: Peter adresses the crowd ID: 15 type: md POV: 0 notes: {P:0:The good news spreads from Jerusalem to Rome} compile: 2 14 But Peter, standing up with the eleven, lifted up his voice, and spoke out to them, “You men of Judea, and all you who dwell at Jerusalem, let this be known to you, and listen to my words. 15 For these aren’t drunken, as you suppose, seeing it is only the third hour of the day. 16 But this is what has been spoken through the prophet Joel: 17 ‘It will be in the last days, says God, that I will pour out my Spirit on all flesh. Your sons and your daughters will prophesy. Your young men will see visions. Your old men will dream dreams. 18 Yes, and on my servants and on my handmaidens in those days, I will pour out my Spirit, and they will prophesy. 19 I will show wonders in the sky above, and signs on the earth beneath; blood, and fire, and billows of smoke. 20 The sun will be turned into darkness, and the moon into blood, before the great and glorious day of the Lord comes. 21 It will be that whoever will call on the name of the Lord will be saved.’ 22 “Men of Israel, hear these words! Jesus of Nazareth, a man approved by God to you by mighty works and wonders and signs which God did by him among you, even as you yourselves know, 23 him, being delivered up by the determined counsel and foreknowledge of God, you have taken by the hand of lawless men, crucified and killed; 24 whom God raised up, having freed him from the agony of death, because it was not possible that he should be held by it. 25 For David says concerning him, ‘I saw the Lord always before my face, for he is on my right hand, that I should not be moved. 26 Therefore my heart was glad, and my tongue rejoiced. Moreover my flesh also will dwell in hope; 27 because you will not leave my soul in Hades,† neither will you allow your Holy One to see decay. 28 You made known to me the ways of life. You will make me full of gladness with your presence.’ 29 “Brothers, I may tell you freely of the patriarch David, that he both died and was buried, and his tomb is with us to this day. 30 Therefore, being a prophet, and knowing that God had sworn with an oath to him that of the fruit of his body, according to the flesh, he would raise up the Christ to sit on his throne, 31 he foreseeing this spoke about the resurrection of the Christ, that his soul wasn’t left in Hades,‡ and his flesh didn’t see decay. 32 This Jesus God raised up, to which we all are witnesses. 33 Being therefore exalted by the right hand of God, and having received from the Father the promise of the Holy Spirit, he has poured out this, which you now see and hear. 34 For David didn’t ascend into the heavens, but he says himself, ‘The Lord said to my Lord, “Sit by my right hand 35 until I make your enemies a footstool for your feet.” ’ 36 “Let all the house of Israel therefore know certainly that God has made him both Lord and Christ, this Jesus whom you crucified.” 37 Now when they heard this, they were cut to the heart, and said to Peter and the rest of the apostles, “Brothers, what shall we do?” 38 Peter said to them, “Repent, and be baptized, every one of you, in the name of Jesus Christ for the forgiveness of sins, and you will receive the gift of the Holy Spirit. 39 For the promise is to you, and to your children, and to all who are far off, even as many as the Lord our God will call to himself.” 40 With many other words he testified, and exhorted them, saying, “Save yourselves from this crooked generation!” 41 Then those who gladly received his word were baptized. There were added that day about three thousand souls. 2-The_life_of_the_first_believers.md000066400000000000000000000013611354442177200360170ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/1-Chapter_2title: The life of the first believers ID: 14 type: md compile: 2 42 They continued steadfastly in the apostles’ teaching and fellowship, in the breaking of bread, and prayer. 43 Fear came on every soul, and many wonders and signs were done through the apostles. 44 All who believed were together, and had all things in common. 45 They sold their possessions and goods, and distributed them to all, according as anyone had need. 46 Day by day, continuing steadfastly with one accord in the temple, and breaking bread at home, they took their food with gladness and singleness of heart, 47 praising God, and having favor with all the people. The Lord added to the assembly day by day those who were being saved. manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/1-Chapter_2/folder.txt000066400000000000000000000001541354442177200311160ustar00rootroot00000000000000title: Chapter 2 ID: 6 type: folder compile: 2 setGoal: 1000 manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/2-Chapter_3/000077500000000000000000000000001354442177200271045ustar00rootroot000000000000000-Peter_heals_a_beggar.md000066400000000000000000000023521354442177200335500ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/2-Chapter_3title: Peter heals a beggar ID: 13 type: md POV: 0 compile: 2 1 Peter and John were going up into the temple at the hour of prayer, the ninth hour.* 2 A certain man who was lame from his mother’s womb was being carried, whom they laid daily at the door of the temple which is called Beautiful, to ask gifts for the needy of those who entered into the temple. 3 Seeing Peter and John about to go into the temple, he asked to receive gifts for the needy. 4 Peter, fastening his eyes on him, with John, said, “Look at us.” 5 He listened to them, expecting to receive something from them. 6 But Peter said, “I have no silver or gold, but what I have, that I give you. In the name of Jesus Christ of Nazareth, get up and walk!” 7 He took him by the right hand and raised him up. Immediately his feet and his ankle bones received strength. 8 Leaping up, he stood and began to walk. He entered with them into the temple, walking, leaping, and praising God. 9 All the people saw him walking and praising God. 10 They recognized him, that it was he who used to sit begging for gifts for the needy at the Beautiful Gate of the temple. They were filled with wonder and amazement at what had happened to him. manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/2-Chapter_3/1-Peter_preaches.md000066400000000000000000000044671354442177200325300ustar00rootroot00000000000000title: Peter preaches ID: 12 type: md POV: 0 compile: 2 11 As the lame man who was healed held on to Peter and John, all the people ran together to them in the porch that is called Solomon’s, greatly wondering. 12 When Peter saw it, he responded to the people, “You men of Israel, why do you marvel at this man? Why do you fasten your eyes on us, as though by our own power or godliness we had made him walk? 13 The God of Abraham, Isaac, and Jacob, the God of our fathers, has glorified his Servant Jesus, whom you delivered up, and denied in the presence of Pilate, when he had determined to release him. 14 But you denied the Holy and Righteous One and asked for a murderer to be granted to you, 15 and killed the Prince of life, whom God raised from the dead, to which we are witnesses. 16 By faith in his name, his name has made this man strong, whom you see and know. Yes, the faith which is through him has given him this perfect soundness in the presence of you all. 17 “Now, brothers,† I know that you did this in ignorance, as did also your rulers. 18 But the things which God announced by the mouth of all his prophets, that Christ should suffer, he thus fulfilled. 19 “Repent therefore, and turn again, that your sins may be blotted out, so that there may come times of refreshing from the presence of the Lord, 20 and that he may send Christ Jesus, who was ordained for you before, 21 whom heaven must receive until the times of restoration of all things, which God spoke long ago by the mouth of his holy prophets. 22 For Moses indeed said to the fathers, ‘The Lord God will raise up a prophet for you from among your brothers, like me. You shall listen to him in all things whatever he says to you. 23 It will be that every soul that will not listen to that prophet will be utterly destroyed from among the people.’✡ 24 Yes, and all the prophets from Samuel and those who followed after, as many as have spoken, they also told of these days. 25 You are the children of the prophets, and of the covenant which God made with our fathers, saying to Abraham, ‘All the families of the earth will be blessed through your offspring.‡ .’✡ 26 God, having raised up his servant Jesus, sent him to you first to bless you, in turning away every one of you from your wickedness.” manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/2-Chapter_3/folder.txt000066400000000000000000000001541354442177200311200ustar00rootroot00000000000000title: Chapter 3 ID: 7 type: folder compile: 2 setGoal: 1000 manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/3-Chapter_4/000077500000000000000000000000001354442177200271065ustar00rootroot000000000000000-Peter_and_John_in_front_of_the_Sanhedrin.md000066400000000000000000000054041354442177200376050ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/3-Chapter_4title: Peter and John in front of the Sanhedrin ID: 16 type: md POV: 0 compile: 2 1 As they spoke to the people, the priests and the captain of the temple and the Sadducees came to them, 2 being upset because they taught the people and proclaimed in Jesus the resurrection from the dead. 3 They laid hands on them, and put them in custody until the next day, for it was now evening. 4 But many of those who heard the word believed, and the number of the men came to be about five thousand. 5 In the morning, their rulers, elders, and scribes were gathered together in Jerusalem. 6 Annas the high priest was there, with Caiaphas, John, Alexander, and as many as were relatives of the high priest. 7 When they had stood Peter and John in the middle of them, they inquired, “By what power, or in what name, have you done this?” 8 Then Peter, filled with the Holy Spirit, said to them, “You rulers of the people, and elders of Israel, 9 if we are examined today concerning a good deed done to a crippled man, by what means this man has been healed, 10 may it be known to you all, and to all the people of Israel, that in the name of Jesus Christ of Nazareth, whom you crucified, whom God raised from the dead, in him does this man stand here before you whole. 11 He is ‘the stone which was regarded as worthless by you, the builders, which has become the head of the corner.’✡ 12 There is salvation in no one else, for there is no other name under heaven that is given among men, by which we must be saved!” 13 Now when they saw the boldness of Peter and John, and had perceived that they were unlearned and ignorant men, they marveled. They recognized that they had been with Jesus. 14 Seeing the man who was healed standing with them, they could say nothing against it. 15 But when they had commanded them to go aside out of the council, they conferred among themselves, 16 saying, “What shall we do to these men? Because indeed a notable miracle has been done through them, as can be plainly seen by all who dwell in Jerusalem, and we can’t deny it. 17 But so that this spreads no further among the people, let’s threaten them, that from now on they don’t speak to anyone in this name.” 18 They called them, and commanded them not to speak at all nor teach in the name of Jesus. 19 But Peter and John answered them, “Whether it is right in the sight of God to listen to you rather than to God, judge for yourselves, 20 for we can’t help telling the things which we saw and heard.” 21 When they had further threatened them, they let them go, finding no way to punish them, because of the people; for everyone glorified God for that which was done. 22 For the man on whom this miracle of healing was performed was more than forty years old. 1-The_believers_pray.md000066400000000000000000000024471354442177200333310ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/3-Chapter_4title: The believers pray ID: 17 type: md notes: Mention: {C:4:Herod} compile: 2 23 Being let go, they came to their own company and reported all that the chief priests and the elders had said to them. 24 When they heard it, they lifted up their voice to God with one accord, and said, “O Lord, you are God, who made the heaven, the earth, the sea, and all that is in them; 25 who by the mouth of your servant, David, said, ‘Why do the nations rage, and the peoples plot a vain thing? 26 The kings of the earth take a stand, and the rulers take council together, against the Lord, and against his Christ.’*✡ 27 “For truly, in this city against your holy servant, Jesus, whom you anointed, both Herod and Pontius Pilate, with the Gentiles and the people of Israel, were gathered together 28 to do whatever your hand and your council foreordained to happen. 29 Now, Lord, look at their threats, and grant to your servants to speak your word with all boldness, 30 while you stretch out your hand to heal; and that signs and wonders may be done through the name of your holy Servant Jesus.” 31 When they had prayed, the place was shaken where they were gathered together. They were all filled with the Holy Spirit, and they spoke the word of God with boldness. 2-The_believers_share.md000066400000000000000000000016461354442177200334610ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/3-Chapter_4title: The believers share ID: 18 type: md notes: {C:5:Barnabas} compile: 2 32 The multitude of those who believed were of one heart and soul. Not one of them claimed that anything of the things which he possessed was his own, but they had all things in common. 33 With great power, the apostles gave their testimony of the resurrection of the Lord Jesus. Great grace was on them all. 34 For neither was there among them any who lacked, for as many as were owners of lands or houses sold them, and brought the proceeds of the things that were sold, 35 and laid them at the apostles’ feet, and distribution was made to each, according as anyone had need. 36 Joses, who by the apostles was also called Barnabas (which is, being interpreted, Son of Encouragement), a Levite, a man of Cyprus by race, 37 having a field, sold it and brought the money and laid it at the apostles’ feet. manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/3-Chapter_4/folder.txt000066400000000000000000000001541354442177200311220ustar00rootroot00000000000000title: Chapter 4 ID: 8 type: folder compile: 2 setGoal: 1000 manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/4-Chapter_5/000077500000000000000000000000001354442177200271105ustar00rootroot000000000000000-Ananias_and_Sapphira.md000066400000000000000000000026371354442177200335430ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/4-Chapter_5title: Ananias and Sapphira ID: 19 type: md compile: 2 1 But a certain man named Ananias, with Sapphira, his wife, sold a possession, 2 and kept back part of the price, his wife also being aware of it, then brought a certain part and laid it at the apostles’ feet. 3 But Peter said, “Ananias, why has Satan filled your heart to lie to the Holy Spirit and to keep back part of the price of the land? 4 While you kept it, didn’t it remain your own? After it was sold, wasn’t it in your power? How is it that you have conceived this thing in your heart? You haven’t lied to men, but to God.” 5 Ananias, hearing these words, fell down and died. Great fear came on all who heard these things. 6 The young men arose and wrapped him up, and they carried him out and buried him. 7 About three hours later, his wife, not knowing what had happened, came in. 8 Peter answered her, “Tell me whether you sold the land for so much.” She said, “Yes, for so much.” 9 But Peter asked her, “How is it that you have agreed together to tempt the Spirit of the Lord? Behold, the feet of those who have buried your husband are at the door, and they will carry you out.” 10 She fell down immediately at his feet and died. The young men came in and found her dead, and they carried her out and buried her by her husband. 11 Great fear came on the whole assembly, and on all who heard these things. 1-Many_healings_done_by_the_aposles.md000066400000000000000000000013321354442177200363530ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/4-Chapter_5title: Many healings done by the aposles ID: 20 type: md compile: 2 12 By the hands of the apostles many signs and wonders were done among the people. They were all with one accord in Solomon’s porch. 13 None of the rest dared to join them, however the people honored them. 14 More believers were added to the Lord, multitudes of both men and women. 15 They even carried out the sick into the streets, and laid them on cots and mattresses, so that as Peter came by, at the least his shadow might overshadow some of them. 16 The multitude also came together from the cities around Jerusalem, bringing sick people and those who were tormented by unclean spirits: and they were all healed. manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/4-Chapter_5/2-The_persecutions.md000066400000000000000000000066051354442177200331230ustar00rootroot00000000000000title: The persecutions ID: 21 type: md compile: 2 17 But the high priest rose up, and all those who were with him (which is the sect of the Sadducees), and they were filled with jealousy 18 and laid hands on the apostles, then put them in public custody. 19 But an angel of the Lord opened the prison doors by night, and brought them out and said, 20 “Go stand and speak in the temple to the people all the words of this life.” 21 When they heard this, they entered into the temple about daybreak and taught. But the high priest came, and those who were with him, and called the council together, and all the senate of the children of Israel, and sent to the prison to have them brought. 22 But the officers who came didn’t find them in the prison. They returned and reported, 23 “We found the prison shut and locked, and the guards standing before the doors, but when we opened them, we found no one inside!” 24 Now when the high priest, the captain of the temple, and the chief priests heard these words, they were very perplexed about them and what might become of this. 25 One came and told them, “Behold, the men whom you put in prison are in the temple, standing and teaching the people.” 26 Then the captain went with the officers, and brought them without violence, for they were afraid that the people might stone them. 27 When they had brought them, they set them before the council. The high priest questioned them, 28 saying, “Didn’t we strictly command you not to teach in this name? Behold, you have filled Jerusalem with your teaching, and intend to bring this man’s blood on us.” 29 But Peter and the apostles answered, “We must obey God rather than men. 30 The God of our fathers raised up Jesus, whom you killed, hanging him on a tree. 31 God exalted him with his right hand to be a Prince and a Savior, to give repentance to Israel, and remission of sins. 32 We are his witnesses of these things; and so also is the Holy Spirit, whom God has given to those who obey him.” 33 But they, when they heard this, were cut to the heart, and were determined to kill them. 34 But one stood up in the council, a Pharisee named Gamaliel, a teacher of the law, honored by all the people, and commanded to put the apostles out for a little while. 35 He said to them, “You men of Israel, be careful concerning these men, what you are about to do. 36 For before these days Theudas rose up, making himself out to be somebody; to whom a number of men, about four hundred, joined themselves. He was slain; and all, as many as obeyed him, were dispersed, and came to nothing. 37 After this man, Judas of Galilee rose up in the days of the enrollment, and drew away some people after him. He also perished, and all, as many as obeyed him, were scattered abroad. 38 Now I tell you, withdraw from these men, and leave them alone. For if this counsel or this work is of men, it will be overthrown. 39 But if it is of God, you will not be able to overthrow it, and you would be found even to be fighting against God!” 40 They agreed with him. Summoning the apostles, they beat them and commanded them not to speak in the name of Jesus, and let them go. 41 They therefore departed from the presence of the council, rejoicing that they were counted worthy to suffer dishonor for Jesus’ name. 42 Every day, in the temple and at home, they never stopped teaching and preaching Jesus, the Christ. manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/4-Chapter_5/folder.txt000066400000000000000000000001541354442177200311240ustar00rootroot00000000000000title: Chapter 5 ID: 9 type: folder compile: 2 setGoal: 1000 manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/5-Chapter_6/000077500000000000000000000000001354442177200271125ustar00rootroot000000000000000-The_choosing_of_seven.md000066400000000000000000000021421354442177200340060ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/5-Chapter_6title: The choosing of seven ID: 22 type: md notes: {C:2:Philip} compile: 2 1 Now in those days, when the number of the disciples was multiplying, a complaint arose from the Hellenists* against the Hebrews, because their widows were neglected in the daily service. 2 The twelve summoned the multitude of the disciples and said, “It is not appropriate for us to forsake the word of God and serve tables. 3 Therefore select from among you, brothers, seven men of good report, full of the Holy Spirit and of wisdom, whom we may appoint over this business. 4 But we will continue steadfastly in prayer and in the ministry of the word.” 5 These words pleased the whole multitude. They chose Stephen, a man full of faith and of the Holy Spirit, Philip, Prochorus, Nicanor, Timon, Parmenas, and Nicolaus, a proselyte of Antioch; 6 whom they set before the apostles. When they had prayed, they laid their hands on them. 7 The word of God increased and the number of the disciples multiplied in Jerusalem exceedingly. A great company of the priests were obedient to the faith. manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/5-Chapter_6/1-Stephen_is_taken.md000066400000000000000000000020731354442177200330570ustar00rootroot00000000000000title: Stephen is taken ID: 23 type: md POV: 3 compile: 2 8 Stephen, full of faith and power, performed great wonders and signs among the people. 9 But some of those who were of the synagogue called “The Libertines”, and of the Cyrenians, of the Alexandrians, and of those of Cilicia and Asia arose, disputing with Stephen. 10 They weren’t able to withstand the wisdom and the Spirit by which he spoke. 11 Then they secretly induced men to say, “We have heard him speak blasphemous words against Moses and God.” 12 They stirred up the people, the elders, and the scribes, and came against him and seized him, then brought him in to the council, 13 and set up false witnesses who said, “This man never stops speaking blasphemous words against this holy place and the law. 14 For we have heard him say that this Jesus of Nazareth will destroy this place, and will change the customs which Moses delivered to us.” 15 All who sat in the council, fastening their eyes on him, saw his face like it was the face of an angel. manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/5-Chapter_6/folder.txt000066400000000000000000000001551354442177200311270ustar00rootroot00000000000000title: Chapter 6 ID: 10 type: folder compile: 2 setGoal: 1000 manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/6-Chapter_7/000077500000000000000000000000001354442177200271145ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/6-Chapter_7/0-Stephen_preaches.md000066400000000000000000000152661354442177200330650ustar00rootroot00000000000000title: Stephen preaches ID: 24 type: md POV: 3 compile: 2 1 The high priest said, “Are these things so?” 2 He said, “Brothers and fathers, listen. The God of glory appeared to our father Abraham when he was in Mesopotamia, before he lived in Haran, 3 and said to him, ‘Get out of your land and away from your relatives, and come into a land which I will show you.’✡ 4 Then he came out of the land of the Chaldaeans and lived in Haran. From there, when his father was dead, God moved him into this land, where you are now living. 5 He gave him no inheritance in it, no, not so much as to set his foot on. He promised that he would give it to him for a possession, and to his offspring after him, when he still had no child. 6 God spoke in this way: that his offspring would live as aliens in a strange land, and that they would be enslaved and mistreated for four hundred years. 7 ‘I will judge the nation to which they will be in bondage,’ said God, ‘and after that they will come out, and serve me in this place.’✡ 8 He gave him the covenant of circumcision. So Abraham became the father of Isaac, and circumcised him the eighth day. Isaac became the father of Jacob, and Jacob became the father of the twelve patriarchs. 9 “The patriarchs, moved with jealousy against Joseph, sold him into Egypt. God was with him, 10 and delivered him out of all his afflictions, and gave him favor and wisdom before Pharaoh, king of Egypt. He made him governor over Egypt and all his house. 11 Now a famine came over all the land of Egypt and Canaan, and great affliction. Our fathers found no food. 12 But when Jacob heard that there was grain in Egypt, he sent out our fathers the first time. 13 On the second time Joseph was made known to his brothers, and Joseph’s race was revealed to Pharaoh. 14 Joseph sent and summoned Jacob, his father, and all his relatives, seventy-five souls. 15 Jacob went down into Egypt and he died, himself and our fathers, 16 and they were brought back to Shechem, and laid in the tomb that Abraham bought for a price in silver from the children of Hamor of Shechem. 17 “But as the time of the promise came close which God had sworn to Abraham, the people grew and multiplied in Egypt, 18 until there arose a different king, who didn’t know Joseph. 19 The same took advantage of our race, and mistreated our fathers, and forced them to throw out their babies, so that they wouldn’t stay alive. 20 At that time Moses was born, and was exceedingly handsome. He was nourished three months in his father’s house. 21 When he was thrown out, Pharaoh’s daughter took him up and reared him as her own son. 22 Moses was instructed in all the wisdom of the Egyptians. He was mighty in his words and works. 23 But when he was forty years old, it came into his heart to visit his brothers,* the children of Israel. 24 Seeing one of them suffer wrong, he defended him, and avenged him who was oppressed, striking the Egyptian. 25 He supposed that his brothers understood that God, by his hand, was giving them deliverance; but they didn’t understand. 26 “The day following, he appeared to them as they fought, and urged them to be at peace again, saying, ‘Sirs, you are brothers. Why do you wrong one another?’ 27 But he who did his neighbor wrong pushed him away, saying, ‘Who made you a ruler and a judge over us? 28 Do you want to kill me, as you killed the Egyptian yesterday?’✡ 29 Moses fled at this saying, and became a stranger in the land of Midian, where he became the father of two sons. 30 “When forty years were fulfilled, an angel of the Lord appeared to him in the wilderness of Mount Sinai, in a flame of fire in a bush. 31 When Moses saw it, he wondered at the sight. As he came close to see, a voice of the Lord came to him, 32 ‘I am the God of your fathers, the God of Abraham, the God of Isaac, and the God of Jacob.’✡ Moses trembled, and dared not look. 33 The Lord said to him, ‘Take off your sandals, for the place where you stand is holy ground. 34 I have surely seen the affliction of my people that is in Egypt, and have heard their groaning. I have come down to deliver them. Now come, I will send you into Egypt.’✡ 35 “This Moses, whom they refused, saying, ‘Who made you a ruler and a judge?’—God has sent him as both a ruler and a deliverer by the hand of the angel who appeared to him in the bush. 36 This man led them out, having worked wonders and signs in Egypt, in the Red Sea, and in the wilderness for forty years. 37 This is that Moses, who said to the children of Israel, ‘The Lord our God will raise up a prophet for you from among your brothers, like me.’†✡ 38 This is he who was in the assembly in the wilderness with the angel that spoke to him on Mount Sinai, and with our fathers, who received living revelations to give to us, 39 to whom our fathers wouldn’t be obedient, but rejected him, and turned back in their hearts to Egypt, 40 saying to Aaron, ‘Make us gods that will go before us, for as for this Moses, who led us out of the land of Egypt, we don’t know what has become of him.’✡ 41 They made a calf in those days, and brought a sacrifice to the idol, and rejoiced in the works of their hands. 42 But God turned, and gave them up to serve the army of the sky,‡ as it is written in the book of the prophets, ‘Did you offer to me slain animals and sacrifices forty years in the wilderness, O house of Israel? 43 You took up the tabernacle of Moloch, the star of your god Rephan, the figures which you made to worship. I will carry you away✡ beyond Babylon.’ 44 “Our fathers had the tabernacle of the testimony in the wilderness, even as he who spoke to Moses commanded him to make it according to the pattern that he had seen; 45 which also our fathers, in their turn, brought in with Joshua when they entered into the possession of the nations, whom God drove out before the face of our fathers, to the days of David, 46 who found favor in the sight of God, and asked to find a habitation for the God of Jacob. 47 But Solomon built him a house. 48 However, the Most High doesn’t dwell in temples made with hands, as the prophet says, 49 ‘heaven is my throne, and the earth a footstool for my feet. What kind of house will you build me?’ says the Lord. ‘Or what is the place of my rest? 50 Didn’t my hand make all these things?’✡ 51 “You stiff-necked and uncircumcised in heart and ears, you always resist the Holy Spirit! As your fathers did, so you do. 52 Which of the prophets didn’t your fathers persecute? They killed those who foretold the coming of the Righteous One, of whom you have now become betrayers and murderers. 53 You received the law as it was ordained by angels, and didn’t keep it!” 1-Stephen_is_killed.md000066400000000000000000000016271354442177200331500ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/6-Chapter_7title: Stephen is killed ID: 25 type: md POV: 3 compile: 2 54 Now when they heard these things, they were cut to the heart, and they gnashed at him with their teeth. 55 But he, being full of the Holy Spirit, looked up steadfastly into heaven and saw the glory of God, and Jesus standing on the right hand of God, 56 and said, “Behold, I see the heavens opened, and the Son of Man standing at the right hand of God!” 57 But they cried out with a loud voice and stopped their ears, then rushed at him with one accord. 58 They threw him out of the city and stoned him. The witnesses placed their garments at the feet of a young man named Saul. 59 They stoned Stephen as he called out, saying, “Lord Jesus, receive my spirit!” 60 He kneeled down, and cried with a loud voice, “Lord, don’t hold this sin against them!” When he had said this, he fell asleep. manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/6-Chapter_7/folder.txt000066400000000000000000000001551354442177200311310ustar00rootroot00000000000000title: Chapter 7 ID: 11 type: folder compile: 2 setGoal: 1000 manuskript-0.10.0/sample-projects/book-of-acts/outline/0-Jerusalem/folder.txt000066400000000000000000000001521354442177200271470ustar00rootroot00000000000000title: Jerusalem ID: 35 type: folder POV: 0 compile: 2 manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/000077500000000000000000000000001354442177200265165ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/0-Chapter_8/000077500000000000000000000000001354442177200304705ustar00rootroot000000000000000-The_church_scattered.md000066400000000000000000000011551354442177200352040ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/0-Chapter_8title: The church scattered ID: 26 type: md notes: {P:0:The good news spreads from Jerusalem to Rome} compile: 2 1 Saul was consenting to his death. A great persecution arose against the assembly which was in Jerusalem in that day. They were all scattered abroad throughout the regions of Judea and Samaria, except for the apostles. 2 Devout men buried Stephen and lamented greatly over him. 3 But Saul ravaged the assembly, entering into every house and dragged both men and women off to prison. 4 Therefore those who were scattered abroad went around preaching the word.1-Philip_in_Samaria.md000066400000000000000000000011001354442177200344310ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/0-Chapter_8title: Philip in Samaria ID: 32 type: md POV: 2 notes: {P:0:The good news spreads from Jerusalem to Rome} compile: 2 5 Philip went down to the city of Samaria, and proclaimed to them the Christ. 6 The multitudes listened with one accord to the things that were spoken by Philip when they heard and saw the signs which he did. 7 For unclean spirits came out of many of those who had them. They came out, crying with a loud voice. Many who had been paralyzed and lame were healed. 8 There was great joy in that city. 2-Simon_the_Sorcerer.md000066400000000000000000000040321354442177200346620ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/0-Chapter_8title: Simon the Sorcerer ID: 33 type: md POV: 2 compile: 2 9 But there was a certain man, Simon by name, who used to practice sorcery in the city and amazed the people of Samaria, making himself out to be some great one, 10 to whom they all listened, from the least to the greatest, saying, “This man is that great power of God.” 11 They listened to him, because for a long time he had amazed them with his sorceries. 12 But when they believed Philip preaching good news concerning God’s Kingdom and the name of Jesus Christ, they were baptized, both men and women. 13 Simon himself also believed. Being baptized, he continued with Philip. Seeing signs and great miracles occurring, he was amazed. 14 Now when the apostles who were at Jerusalem heard that Samaria had received the word of God, they sent Peter and John to them, 15 who, when they had come down, prayed for them, that they might receive the Holy Spirit; 16 for as yet he had fallen on none of them. They had only been baptized in the name of Christ Jesus. 17 Then they laid their hands on them, and they received the Holy Spirit. 18 Now when Simon saw that the Holy Spirit was given through the laying on of the apostles’ hands, he offered them money, 19 saying, “Give me also this power, that whomever I lay my hands on may receive the Holy Spirit.” 20 But Peter said to him, “May your silver perish with you, because you thought you could obtain the gift of God with money! 21 You have neither part nor lot in this matter, for your heart isn’t right before God. 22 Repent therefore of this, your wickedness, and ask God if perhaps the thought of your heart may be forgiven you. 23 For I see that you are in the poison of bitterness and in the bondage of iniquity.” 24 Simon answered, “Pray for me to the Lord, that none of the things which you have spoken happen to me.” 25 They therefore, when they had testified and spoken the word of the Lord, returned to Jerusalem, and preached the Good News to many villages of the Samaritans.3-Philip_and_the_Ethiopian.md000066400000000000000000000036271354442177200360120ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/0-Chapter_8title: Philip and the Ethiopian ID: 36 type: md POV: 2 compile: 2 6 But an angel of the Lord spoke to Philip, saying, “Arise, and go toward the south to the way that goes down from Jerusalem to Gaza. This is a desert.” 27 He arose and went; and behold, there was a man of Ethiopia, a eunuch of great authority under Candace, queen of the Ethiopians, who was over all her treasure, who had come to Jerusalem to worship. 28 He was returning and sitting in his chariot, and was reading the prophet Isaiah. 29 The Spirit said to Philip, “Go near, and join yourself to this chariot.” 30 Philip ran to him, and heard him reading Isaiah the prophet, and said, “Do you understand what you are reading?” 31 He said, “How can I, unless someone explains it to me?” He begged Philip to come up and sit with him. 32 Now the passage of the Scripture which he was reading was this, “He was led as a sheep to the slaughter. As a lamb before his shearer is silent, so he doesn’t open his mouth. 33 In his humiliation, his judgment was taken away. Who will declare His generation? For his life is taken from the earth.”✡ 34 The eunuch answered Philip, “Who is the prophet talking about? About himself, or about someone else?” 35 Philip opened his mouth, and beginning from this Scripture, preached to him about Jesus. 36 As they went on the way, they came to some water, and the eunuch said, “Behold, here is water. What is keeping me from being baptized?” 37 * 38 He commanded the chariot to stand still, and they both went down into the water, both Philip and the eunuch, and he baptized him. 39 When they came up out of the water, the Spirit of the Lord caught Philip away, and the eunuch didn’t see him any more, for he went on his way rejoicing. 40 But Philip was found at Azotus. Passing through, he preached the Good News to all the cities, until he came to Caesarea. manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/0-Chapter_8/folder.txt000066400000000000000000000001551354442177200325050ustar00rootroot00000000000000title: Chapter 8 ID: 27 type: folder compile: 2 setGoal: 1000 manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/1-Chapter_9/000077500000000000000000000000001354442177200304725ustar00rootroot000000000000000-Saul-s_conversion.md000066400000000000000000000044421354442177200345070ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/1-Chapter_9title: Saul's conversion ID: 37 type: md POV: 1 compile: 2 1 But Saul, still breathing threats and slaughter against the disciples of the Lord, went to the high priest 2 and asked for letters from him to the synagogues of Damascus, that if he found any who were of the Way, whether men or women, he might bring them bound to Jerusalem. 3 As he traveled, he got close to Damascus, and suddenly a light from the sky shone around him. 4 He fell on the earth, and heard a voice saying to him, “Saul, Saul, why do you persecute me?” 5 He said, “Who are you, Lord?” The Lord said, “I am Jesus, whom you are persecuting.* 6 But† rise up and enter into the city, then you will be told what you must do.” 7 The men who traveled with him stood speechless, hearing the sound, but seeing no one. 8 Saul arose from the ground, and when his eyes were opened, he saw no one. They led him by the hand, and brought him into Damascus. 9 He was without sight for three days, and neither ate nor drank. 10 Now there was a certain disciple at Damascus named Ananias. The Lord said to him in a vision, “Ananias!” He said, “Behold, it’s me, Lord.” 11 The Lord said to him, “Arise, and go to the street which is called Straight, and inquire in the house of Judah‡ for one named Saul, a man of Tarsus. For behold, he is praying, 12 and in a vision he has seen a man named Ananias coming in and laying his hands on him, that he might receive his sight.” 13 But Ananias answered, “Lord, I have heard from many about this man, how much evil he did to your saints at Jerusalem. 14 Here he has authority from the chief priests to bind all who call on your name.” 15 But the Lord said to him, “Go your way, for he is my chosen vessel to bear my name before the nations and kings, and the children of Israel. 16 For I will show him how many things he must suffer for my name’s sake.” 17 Ananias departed and entered into the house. Laying his hands on him, he said, “Brother Saul, the Lord, who appeared to you on the road by which you came, has sent me that you may receive your sight and be filled with the Holy Spirit.” 18 Immediately something like scales fell from his eyes, and he received his sight. He arose and was baptized. 19 He took food and was strengthened.1-Saul_in_Damascus_and_Jerusalem.md000066400000000000000000000033741354442177200371450ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/1-Chapter_9title: Saul in Damascus and Jerusalem ID: 38 type: md POV: 1 notes: {P:2:Paul and Barnabas fight} {C:5:Barnabas} compile: 2 Saul stayed several days with the disciples who were at Damascus. 20 Immediately in the synagogues he proclaimed the Christ, that he is the Son of God. 21 All who heard him were amazed, and said, “Isn’t this he who in Jerusalem made havoc of those who called on this name? And he had come here intending to bring them bound before the chief priests!” 22 But Saul increased more in strength, and confounded the Jews who lived at Damascus, proving that this is the Christ. 23 When many days were fulfilled, the Jews conspired together to kill him, 24 but their plot became known to Saul. They watched the gates both day and night that they might kill him, 25 but his disciples took him by night and let him down through the wall, lowering him in a basket. 26 When Saul had come to Jerusalem, he tried to join himself to the disciples; but they were all afraid of him, not believing that he was a disciple. 27 But Barnabas took him and brought him to the apostles, and declared to them how he had seen the Lord on the way, and that he had spoken to him, and how at Damascus he had preached boldly in the name of Jesus. 28 He was with them entering into§ Jerusalem, 29 preaching boldly in the name of the Lord Jesus.* He spoke and disputed against the Hellenists,† but they were seeking to kill him. 30 When the brothers‡ knew it, they brought him down to Caesarea, and sent him off to Tarsus. 31 So the assemblies throughout all Judea, Galilee, and Samaria had peace, and were built up. They were multiplied, walking in the fear of the Lord and in the comfort of the Holy Spirit. 2-Peter_visits_the_church_in_Judea.md000066400000000000000000000030031354442177200375420ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/1-Chapter_9title: Peter visits the church in Judea ID: 39 type: md POV: 0 compile: 2 32 As Peter went throughout all those parts, he came down also to the saints who lived at Lydda. 33 There he found a certain man named Aeneas, who had been bedridden for eight years, because he was paralyzed. 34 Peter said to him, “Aeneas, Jesus Christ heals you. Get up and make your bed!” Immediately he arose. 35 All who lived at Lydda and in Sharon saw him, and they turned to the Lord. 36 Now there was at Joppa a certain disciple named Tabitha, which when translated, means Dorcas.§ This woman was full of good works and acts of mercy which she did. 37 In those days, she became sick, and died. When they had washed her, they laid her in an upper room. 38 As Lydda was near Joppa, the disciples, hearing that Peter was there, sent two men* to him, imploring him not to delay in coming to them. 39 Peter got up and went with them. When he had come, they brought him into the upper room. All the widows stood by him weeping, and showing the coats and garments which Dorcas had made while she was with them. 40 Peter sent them all out, and knelt down and prayed. Turning to the body, he said, “Tabitha, get up!” She opened her eyes, and when she saw Peter, she sat up. 41 He gave her his hand, and raised her up. Calling the saints and widows, he presented her alive. 42 This became known throughout all Joppa, and many believed in the Lord. 43 He stayed many days in Joppa with a tanner named Simon. manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/1-Chapter_9/folder.txt000066400000000000000000000001551354442177200325070ustar00rootroot00000000000000title: Chapter 9 ID: 28 type: folder compile: 2 setGoal: 1000 manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/2-Chapter_10/000077500000000000000000000000001354442177200305435ustar00rootroot000000000000000-Cornelius_calls_for_Peter.md000066400000000000000000000020631354442177200362720ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/2-Chapter_10title: Cornelius calls for Peter ID: 40 type: md POV: 0 notes: {P:1} compile: 2 1 Now there was a certain man in Caesarea, Cornelius by name, a centurion of what was called the Italian Regiment, 2 a devout man, and one who feared God with all his house, who gave gifts for the needy generously to the people, and always prayed to God. 3 At about the ninth hour of the day,* he clearly saw in a vision an angel of God coming to him, and saying to him, “Cornelius!” 4 He, fastening his eyes on him, and being frightened, said, “What is it, Lord?” He said to him, “Your prayers and your gifts to the needy have gone up for a memorial before God. 5 Now send men to Joppa, and get Simon, who is also called Peter. 6 He is staying with a tanner named Simon, whose house is by the seaside. † 7 When the angel who spoke to him had departed, Cornelius called two of his household servants and a devout soldier of those who waited on him continually. 8 Having explained everything to them, he sent them to Joppa.1-Peter-s_vision.md000066400000000000000000000033341354442177200340550ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/2-Chapter_10title: Peter's vision ID: 41 type: md POV: 0 compile: 2 9 Now on the next day as they were on their journey, and got close to the city, Peter went up on the housetop to pray at about noon. 10 He became hungry and desired to eat, but while they were preparing, he fell into a trance. 11 He saw heaven opened and a certain container descending to him, like a great sheet let down by four corners on the earth, 12 in which were all kinds of four-footed animals of the earth, wild animals, reptiles, and birds of the sky. 13 A voice came to him, “Rise, Peter, kill and eat!” 14 But Peter said, “Not so, Lord; for I have never eaten anything that is common or unclean.” 15 A voice came to him again the second time, “What God has cleansed, you must not call unclean.” 16 This was done three times, and immediately the vessel was received up into heaven. 17 Now while Peter was very perplexed in himself what the vision which he had seen might mean, behold, the men who were sent by Cornelius, having made inquiry for Simon’s house, stood before the gate, 18 and called and asked whether Simon, who was also called Peter, was lodging there. 19 While Peter was pondering the vision, the Spirit said to him, “Behold, three ‡ men seek you. 20 But arise, get down, and go with them, doubting nothing; for I have sent them.” 21 Peter went down to the men, and said, “Behold, I am he whom you seek. Why have you come?” 22 They said, “Cornelius, a centurion, a righteous man and one who fears God, and well spoken of by all the nation of the Jews, was directed by a holy angel to invite you to his house, and to listen to what you say.” 23 So he called them in and provided a place to stay.2-The_conversion_of_Peter.md000066400000000000000000000064451354442177200357660ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/2-Chapter_10title: The conversion of Peter ID: 42 type: md POV: 0 compile: 2 On the next day Peter arose and went out with them, and some of the brothers from Joppa accompanied him. 24 On the next day they entered into Caesarea. Cornelius was waiting for them, having called together his relatives and his near friends. 25 When Peter entered, Cornelius met him, fell down at his feet, and worshiped him. 26 But Peter raised him up, saying, “Stand up! I myself am also a man.” 27 As he talked with him, he went in and found many gathered together. 28 He said to them, “You yourselves know how it is an unlawful thing for a man who is a Jew to join himself or come to one of another nation, but God has shown me that I shouldn’t call any man unholy or unclean. 29 Therefore I also came without complaint when I was sent for. I ask therefore, why did you send for me?” 30 Cornelius said, “Four days ago, I was fasting until this hour, and at the ninth hour,§ I prayed in my house, and behold, a man stood before me in bright clothing, 31 and said, ‘Cornelius, your prayer is heard, and your gifts to the needy are remembered in the sight of God. 32 Send therefore to Joppa, and summon Simon, who is also called Peter. He is staying in the house of a tanner named Simon, by the seaside. When he comes, he will speak to you.’ 33 Therefore I sent to you at once, and it was good of you to come. Now therefore we are all here present in the sight of God to hear all things that have been commanded you by God.” 34 Peter opened his mouth and said, “Truly I perceive that God doesn’t show favoritism; 35 but in every nation he who fears him and works righteousness is acceptable to him. 36 The word which he sent to the children of Israel, preaching good news of peace by Jesus Christ—he is Lord of all— 37 you yourselves know what happened, which was proclaimed throughout all Judea, beginning from Galilee, after the baptism which John preached; 38 even Jesus of Nazareth, how God anointed him with the Holy Spirit and with power, who went about doing good and healing all who were oppressed by the devil, for God was with him. 39 We are witnesses of everything he did both in the country of the Jews, and in Jerusalem; whom they also* killed, hanging him on a tree. 40 God raised him up the third day, and gave him to be revealed, 41 not to all the people, but to witnesses who were chosen before by God, to us, who ate and drank with him after he rose from the dead. 42 He commanded us to preach to the people and to testify that this is he who is appointed by God as the Judge of the living and the dead. 43 All the prophets testify about him, that through his name everyone who believes in him will receive remission of sins.” 44 While Peter was still speaking these words, the Holy Spirit fell on all those who heard the word. 45 They of the circumcision who believed were amazed, as many as came with Peter, because the gift of the Holy Spirit was also poured out on the Gentiles. 46 For they heard them speaking in other languages and magnifying God. Then Peter answered, 47 “Can anyone forbid these people from being baptized with water? They have received the Holy Spirit just like us.” 48 He commanded them to be baptized in the name of Jesus Christ. Then they asked him to stay some days. manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/2-Chapter_10/folder.txt000066400000000000000000000002731354442177200325610ustar00rootroot00000000000000title: Chapter 10 ID: 29 type: folder notes: {P:1:Peter needs to broaden his understanding of the Gospel} compile: 2 setGoal: 1000 manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/3-Chapter_11/000077500000000000000000000000001354442177200305455ustar00rootroot000000000000000-Peter_explains_his_actions.md000066400000000000000000000042251354442177200365150ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/3-Chapter_11title: Peter explains his actions ID: 43 type: md POV: 0 notes: {P:1:Peter needs to broaden his understanding of the Gospel} compile: 2 1 Now the apostles and the brothers* who were in Judea heard that the Gentiles had also received the word of God. 2 When Peter had come up to Jerusalem, those who were of the circumcision contended with him, 3 saying, “You went in to uncircumcised men, and ate with them!” 4 But Peter began, and explained to them in order, saying, 5 “I was in the city of Joppa praying, and in a trance I saw a vision: a certain container descending, like it was a great sheet let down from heaven by four corners. It came as far as me. 6 When I had looked intently at it, I considered, and saw the four-footed animals of the earth, wild animals, creeping things, and birds of the sky. 7 I also heard a voice saying to me, ‘Rise, Peter, kill and eat!’ 8 But I said, ‘Not so, Lord, for nothing unholy or unclean has ever entered into my mouth.’ 9 But a voice answered me the second time out of heaven, ‘What God has cleansed, don’t you call unclean.’ 10 This was done three times, and all were drawn up again into heaven. 11 Behold, immediately three men stood before the house where I was, having been sent from Caesarea to me. 12 The Spirit told me to go with them, without discriminating. These six brothers also accompanied me, and we entered into the man’s house. 13 He told us how he had seen the angel standing in his house, and saying to him, ‘Send to Joppa, and get Simon, who is called Peter, 14 who will speak to you words by which you will be saved, you and all your house.’ 15 As I began to speak, the Holy Spirit fell on them, even as on us at the beginning. 16 I remembered the word of the Lord, how he said, ‘John indeed baptized in water, but you will be baptized in the Holy Spirit.’ 17 If then God gave to them the same gift as us, when we believed in the Lord Jesus Christ, who was I, that I could withstand God?” 18 When they heard these things, they held their peace, and glorified God, saying, “Then God has also granted to the Gentiles repentance to life!” 1-The_Church_in_Antioch.md000066400000000000000000000032021354442177200353120ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/3-Chapter_11title: The Church in Antioch ID: 44 type: md notes: {P:2:Paul and Barnabas fight} {C:5:Barnabas} compile: 2 19 They therefore who were scattered abroad by the oppression that arose about Stephen traveled as far as Phoenicia, Cyprus, and Antioch, speaking the word to no one except to Jews only. 20 But there were some of them, men of Cyprus and Cyrene, who, when they had come to Antioch, spoke to the Hellenists,† preaching the Lord Jesus. 21 The hand of the Lord was with them, and a great number believed and turned to the Lord. 22 The report concerning them came to the ears of the assembly which was in Jerusalem. They sent out Barnabas to go as far as Antioch, 23 who, when he had come, and had seen the grace of God, was glad. He exhorted them all, that with purpose of heart they should remain near to the Lord. 24 For he was a good man, and full of the Holy Spirit and of faith, and many people were added to the Lord. 25 Barnabas went out to Tarsus to look for Saul. 26 When he had found him, he brought him to Antioch. For a whole year they were gathered together with the assembly, and taught many people. The disciples were first called Christians in Antioch. 27 Now in these days, prophets came down from Jerusalem to Antioch. 28 One of them named Agabus stood up, and indicated by the Spirit that there should be a great famine all over the world, which also happened in the days of Claudius. 29 As any of the disciples had plenty, each determined to send relief to the brothers who lived in Judea; 30 which they also did, sending it to the elders by the hands of Barnabas and Saul. manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/3-Chapter_11/folder.txt000066400000000000000000000001561354442177200325630ustar00rootroot00000000000000title: Chapter 11 ID: 30 type: folder compile: 2 setGoal: 1000 manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/4-Chapter_12/000077500000000000000000000000001354442177200305475ustar00rootroot000000000000000-Peter_escapes_from_prison.md000066400000000000000000000051461354442177200363540ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/4-Chapter_12title: Peter escapes from prison ID: 45 type: md POV: 0 notes: Mention: {C:4:Herod} compile: 2 1 Now about that time, King Herod stretched out his hands to oppress some of the assembly. 2 He killed James, the brother of John, with the sword. 3 When he saw that it pleased the Jews, he proceeded to seize Peter also. This was during the days of unleavened bread. 4 When he had arrested him, he put him in prison, and delivered him to four squads of four soldiers each to guard him, intending to bring him out to the people after the Passover. 5 Peter therefore was kept in the prison, but constant prayer was made by the assembly to God for him. 6 The same night when Herod was about to bring him out, Peter was sleeping between two soldiers, bound with two chains. Guards in front of the door kept the prison. 7 And behold, an angel of the Lord stood by him, and a light shone in the cell. He struck Peter on the side, and woke him up, saying, “Stand up quickly!” His chains fell off his hands. 8 The angel said to him, “Get dressed and put on your sandals.” He did so. He said to him, “Put on your cloak and follow me.” 9 And he went out and followed him. He didn’t know that what was being done by the angel was real, but thought he saw a vision. 10 When they were past the first and the second guard, they came to the iron gate that leads into the city, which opened to them by itself. They went out, and went down one street, and immediately the angel departed from him. 11 When Peter had come to himself, he said, “Now I truly know that the Lord has sent out his angel and delivered me out of the hand of Herod, and from everything the Jewish people were expecting.” 12 Thinking about that, he came to the house of Mary, the mother of John who was called Mark, where many were gathered together and were praying. 13 When Peter knocked at the door of the gate, a servant girl named Rhoda came to answer. 14 When she recognized Peter’s voice, she didn’t open the gate for joy, but ran in, and reported that Peter was standing in front of the gate. 15 They said to her, “You are crazy!” But she insisted that it was so. They said, “It is his angel.” 16 But Peter continued knocking. When they had opened, they saw him, and were amazed. 17 But he, beckoning to them with his hand to be silent, declared to them how the Lord had brought him out of the prison. He said, “Tell these things to James and to the brothers.” Then he departed and went to another place. 18 Now as soon as it was day, there was no small stir among the soldiers about what had become of Peter.1-Herod_dies.md000066400000000000000000000021211354442177200332110ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/4-Chapter_12title: Herod dies ID: 46 type: md POV: 4 notes: Present: - {C:1:Paul} - {C:5:Barnabas} compile: 2 19 When Herod had sought for him, and didn’t find him, he examined the guards, then commanded that they should be put to death. He went down from Judea to Caesarea, and stayed there. 20 Now Herod was very angry with the people of Tyre and Sidon. They came with one accord to him, and, having made Blastus, the king’s personal aide, their friend, they asked for peace, because their country depended on the king’s country for food. 21 On an appointed day, Herod dressed himself in royal clothing, sat on the throne, and gave a speech to them. 22 The people shouted, “The voice of a god, and not of a man!” 23 Immediately an angel of the Lord struck him, because he didn’t give God the glory. Then he was eaten by worms and died. 24 But the word of God grew and multiplied. 25 Barnabas and Saul returned to* Jerusalem when they had fulfilled their service, also taking with them John who was called Mark. manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/4-Chapter_12/folder.txt000066400000000000000000000001561354442177200325650ustar00rootroot00000000000000title: Chapter 12 ID: 31 type: folder compile: 2 setGoal: 1000 manuskript-0.10.0/sample-projects/book-of-acts/outline/1-Judea_and_Samaria/folder.txt000066400000000000000000000001621354442177200305310ustar00rootroot00000000000000title: Judea and Samaria ID: 34 type: folder POV: 0 compile: 2 manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/000077500000000000000000000000001354442177200316075ustar00rootroot000000000000000-Asia_Minor_and_Greece/000077500000000000000000000000001354442177200360025ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world0-Chapter_13/000077500000000000000000000000001354442177200400305ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greece0-Saul_and_Barnabas_are_sent.md000066400000000000000000000012271354442177200457100ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greece/0-Chapter_13title: Saul and Barnabas are sent ID: 51 type: md notes: {P:2:Paul and Barnabas fight} {C:5:Barnabas} Mention: {C:4:Herod} compile: 2 1 Now in the assembly that was at Antioch there were some prophets and teachers: Barnabas, Simeon who was called Niger, Lucius of Cyrene, Manaen the foster brother of Herod the tetrarch, and Saul. 2 As they served the Lord and fasted, the Holy Spirit said, “Separate Barnabas and Saul for me, for the work to which I have called them.” 3 Then, when they had fasted and prayed and laid their hands on them, they sent them away.1-Cyprus.md000066400000000000000000000025471354442177200420050ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greece/0-Chapter_13title: Cyprus ID: 52 type: md notes: {P:0:The good news spreads from Jerusalem to Rome} {C:5:Barnabas} compile: 2 4 So, being sent out by the Holy Spirit, they went down to Seleucia. From there they sailed to Cyprus. 5 When they were at Salamis, they proclaimed God’s word in the Jewish synagogues. They also had John as their attendant. 6 When they had gone through the island to Paphos, they found a certain sorcerer, a false prophet, a Jew, whose name was Bar Jesus, 7 who was with the proconsul, Sergius Paulus, a man of understanding. This man summoned Barnabas and Saul, and sought to hear the word of God. 8 But Elymas the sorcerer (for so is his name by interpretation) withstood them, seeking to turn the proconsul away from the faith. 9 But Saul, who is also called Paul, filled with the Holy Spirit, fastened his eyes on him, 10 and said, “You son of the devil, full of all deceit and all cunning, you enemy of all righteousness, will you not cease to pervert the right ways of the Lord? 11 Now, behold, the hand of the Lord is on you, and you will be blind, not seeing the sun for a season!” Immediately a mist and darkness fell on him. He went around seeking someone to lead him by the hand. 12 Then the proconsul, when he saw what was done, believed, being astonished at the teaching of the Lord. 2-Psidian_Antioch.md000066400000000000000000000117701354442177200435530ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greece/0-Chapter_13title: Psidian Antioch ID: 53 type: md notes: {C:5:Barnabas} compile: 2 13 Now Paul and his company set sail from Paphos, and came to Perga in Pamphylia. John departed from them and returned to Jerusalem. 14 But they, passing on from Perga, came to Antioch of Pisidia. They went into the synagogue on the Sabbath day, and sat down. 15 After the reading of the law and the prophets, the rulers of the synagogue sent to them, saying, “Brothers, if you have any word of exhortation for the people, speak.” 16 Paul stood up, and beckoning with his hand said, “Men of Israel, and you who fear God, listen. 17 The God of this people* chose our fathers, and exalted the people when they stayed as aliens in the land of Egypt, and with an uplifted arm, he led them out of it. 18 For a period of about forty years he put up with them in the wilderness. 19 When he had destroyed seven nations in the land of Canaan, he gave them their land for an inheritance for about four hundred fifty years. 20 After these things, he gave them judges until Samuel the prophet. 21 Afterward they asked for a king, and God gave to them Saul the son of Kish, a man of the tribe of Benjamin, for forty years. 22 When he had removed him, he raised up David to be their king, to whom he also testified, ‘I have found David the son of Jesse, a man after my heart, who will do all my will.’ 23 From this man’s offspring, God has brought salvation† to Israel according to his promise, 24 before his coming, when John had first preached the baptism of repentance to Israel.‡ 25 As John was fulfilling his course, he said, ‘What do you suppose that I am? I am not he. But behold, one comes after me, the sandals of whose feet I am not worthy to untie.’ 26 Brothers, children of the stock of Abraham, and those among you who fear God, the word of this salvation is sent out to you. 27 For those who dwell in Jerusalem, and their rulers, because they didn’t know him, nor the voices of the prophets which are read every Sabbath, fulfilled them by condemning him. 28 Though they found no cause for death, they still asked Pilate to have him killed. 29 When they had fulfilled all things that were written about him, they took him down from the tree, and laid him in a tomb. 30 But God raised him from the dead, 31 and he was seen for many days by those who came up with him from Galilee to Jerusalem, who are his witnesses to the people. 32 We bring you good news of the promise made to the fathers, 33 that God has fulfilled this to us, their children, in that he raised up Jesus. As it is also written in the second psalm, ‘You are my Son. Today I have become your father.’✡ 34 “Concerning that he raised him up from the dead, now no more to return to corruption, he has spoken thus: ‘I will give you the holy and sure blessings of David.’✡ 35 Therefore he says also in another psalm, ‘You will not allow your Holy One to see decay.’✡ 36 For David, after he had in his own generation served the counsel of God, fell asleep, was laid with his fathers, and saw decay. 37 But he whom God raised up saw no decay. 38 Be it known to you therefore, brothers,§ that through this man is proclaimed to you remission of sins, 39 and by him everyone who believes is justified from all things, from which you could not be justified by the law of Moses. 40 Beware therefore, lest that come on you which is spoken in the prophets: 41 ‘Behold, you scoffers, and wonder, and perish; for I work a work in your days, a work which you will in no way believe, if one declares it to you.’ ” ✡ 42 So when the Jews went out of the synagogue, the Gentiles begged that these words might be preached to them the next Sabbath. 43 Now when the synagogue broke up, many of the Jews and of the devout proselytes followed Paul and Barnabas; who, speaking to them, urged them to continue in the grace of God. 44 The next Sabbath, almost the whole city was gathered together to hear the word of God. 45 But when the Jews saw the multitudes, they were filled with jealousy, and contradicted the things which were spoken by Paul, and blasphemed. 46 Paul and Barnabas spoke out boldly, and said, “It was necessary that God’s word should be spoken to you first. Since indeed you thrust it from yourselves, and judge yourselves unworthy of eternal life, behold, we turn to the Gentiles. 47 For so has the Lord commanded us, saying, ‘I have set you as a light for the Gentiles, that you should bring salvation to the uttermost parts of the earth.’ ” ✡ 48 As the Gentiles heard this, they were glad, and glorified the word of God. As many as were appointed to eternal life believed. 49 The Lord’s word was spread abroad throughout all the region. 50 But the Jews stirred up the devout and prominent women and the chief men of the city, and stirred up a persecution against Paul and Barnabas, and threw them out of their borders. 51 But they shook off the dust of their feet against them, and came to Iconium. 52 The disciples were filled with joy and with the Holy Spirit. folder.txt000066400000000000000000000001561354442177200420460ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greece/0-Chapter_13title: Chapter 13 ID: 48 type: folder compile: 2 setGoal: 1000 1-Chapter_14/000077500000000000000000000000001354442177200400325ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greece0-Iconium.md000066400000000000000000000015221354442177200421140ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greece/1-Chapter_14title: Iconium ID: 54 type: md compile: 2 1 In Iconium, they entered together into the synagogue of the Jews, and so spoke that a great multitude both of Jews and of Greeks believed. 2 But the disbelieving* Jews stirred up and embittered the souls of the Gentiles against the brothers. 3 Therefore they stayed there a long time, speaking boldly in the Lord, who testified to the word of his grace, granting signs and wonders to be done by their hands. 4 But the multitude of the city was divided. Part sided with the Jews, and part with the apostles. 5 When some of both the Gentiles and the Jews, with their rulers, made a violent attempt to mistreat and stone them, 6 they became aware of it and fled to the cities of Lycaonia, Lystra, Derbe, and the surrounding region. 7 There they preached the Good News. 1-Lystra_and_Derbe.md000066400000000000000000000035351354442177200437210ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greece/1-Chapter_14title: Lystra and Derbe ID: 55 type: md notes: {C:5:Barnabas} compile: 2 8 At Lystra a certain man sat, impotent in his feet, a cripple from his mother’s womb, who never had walked. 9 He was listening to Paul speaking, who, fastening eyes on him, and seeing that he had faith to be made whole, 10 said with a loud voice, “Stand upright on your feet!” He leaped up and walked. 11 When the multitude saw what Paul had done, they lifted up their voice, saying in the language of Lycaonia, “The gods have come down to us in the likeness of men!” 12 They called Barnabas “Jupiter”, and Paul “Mercury”, because he was the chief speaker. 13 The priest of Jupiter, whose temple was in front of their city, brought oxen and garlands to the gates, and would have made a sacrifice along with the multitudes. 14 But when the apostles, Barnabas and Paul, heard of it, they tore their clothes, and sprang into the multitude, crying out, 15 “Men, why are you doing these things? We also are men of like passions with you, and bring you good news, that you should turn from these vain things to the living God, who made the sky, the earth, the sea, and all that is in them; 16 who in the generations gone by allowed all the nations to walk in their own ways. 17 Yet he didn’t leave himself without witness, in that he did good and gave you† rains from the sky and fruitful seasons, filling our hearts with food and gladness.” 18 Even saying these things, they hardly stopped the multitudes from making a sacrifice to them. 19 But some Jews from Antioch and Iconium came there, and having persuaded the multitudes, they stoned Paul, and dragged him out of the city, supposing that he was dead. 20 But as the disciples stood around him, he rose up, and entered into the city. On the next day he went out with Barnabas to Derbe.2-Back_to_Antioch.md000066400000000000000000000017741354442177200435330ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greece/1-Chapter_14title: Back to Antioch ID: 56 type: md compile: 2 21 When they had preached the Good News to that city, and had made many disciples, they returned to Lystra, Iconium, and Antioch, 22 strengthening the souls of the disciples, exhorting them to continue in the faith, and that through many afflictions we must enter into God’s Kingdom. 23 When they had appointed elders for them in every assembly, and had prayed with fasting, they commended them to the Lord, on whom they had believed. 24 They passed through Pisidia, and came to Pamphylia. 25 When they had spoken the word in Perga, they went down to Attalia. 26 From there they sailed to Antioch, from where they had been committed to the grace of God for the work which they had fulfilled. 27 When they had arrived, and had gathered the assembly together, they reported all the things that God had done with them, and that he had opened a door of faith to the nations. 28 They stayed there with the disciples for a long time. folder.txt000066400000000000000000000001561354442177200420500ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greece/1-Chapter_14title: Chapter 14 ID: 49 type: folder compile: 2 setGoal: 1000 2-Chapter_15/000077500000000000000000000000001354442177200400345ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greece0-The_Council_at_Jerusalem.md000066400000000000000000000055031354442177200454050ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greece/2-Chapter_15title: The Council at Jerusalem ID: 57 type: md notes: {P:1:Peter needs to broaden his understanding of the Gospel} {C:5:Barnabas} compile: 2 1 Some men came down from Judea and taught the brothers,* “Unless you are circumcised after the custom of Moses, you can’t be saved.” 2 Therefore when Paul and Barnabas had no small discord and discussion with them, they appointed Paul and Barnabas, and some others of them, to go up to Jerusalem to the apostles and elders about this question. 3 They, being sent on their way by the assembly, passed through both Phoenicia and Samaria, declaring the conversion of the Gentiles. They caused great joy to all the brothers. 4 When they had come to Jerusalem, they were received by the assembly and the apostles and the elders, and they reported everything that God had done with them. 5 But some of the sect of the Pharisees who believed rose up, saying, “It is necessary to circumcise them, and to command them to keep the law of Moses.” 6 The apostles and the elders were gathered together to see about this matter. 7 When there had been much discussion, Peter rose up and said to them, “Brothers, you know that a good while ago God made a choice among you that by my mouth the nations should hear the word of the Good News and believe. 8 God, who knows the heart, testified about them, giving them the Holy Spirit, just like he did to us. 9 He made no distinction between us and them, cleansing their hearts by faith. 10 Now therefore why do you tempt God, that you should put a yoke on the neck of the disciples which neither our fathers nor we were able to bear? 11 But we believe that we are saved through the grace of the Lord Jesus, † just as they are.” 12 All the multitude kept silence, and they listened to Barnabas and Paul reporting what signs and wonders God had done among the nations through them. 13 After they were silent, James answered, “Brothers, listen to me. 14 Simeon has reported how God first visited the nations to take out of them a people for his name. 15 This agrees with the words of the prophets. As it is written, 16 ‘After these things I will return. I will again build the tabernacle of David, which has fallen. I will again build its ruins. I will set it up 17 that the rest of men may seek after the Lord; all the Gentiles who are called by my name, says the Lord, who does all these things.’✡ 18 “All of God’s works are known to him from eternity. 19 Therefore my judgment is that we don’t trouble those from among the Gentiles who turn to God, 20 but that we write to them that they abstain from the pollution of idols, from sexual immorality, from what is strangled, and from blood. 21 For Moses from generations of old has in every city those who preach him, being read in the synagogues every Sabbath.” 1-The_Council_writes_to_gentile_believers.md000066400000000000000000000035471354442177200505670ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greece/2-Chapter_15title: The Council writes to gentile believers ID: 58 type: md notes: {C:5:Barnabas} compile: 2 22 Then it seemed good to the apostles and the elders, with the whole assembly, to choose men out of their company, and send them to Antioch with Paul and Barnabas: Judas called Barsabbas, and Silas, chief men among the brothers. ‡ 23 They wrote these things by their hand: “The apostles, the elders, and the brothers, to the brothers who are of the Gentiles in Antioch, Syria, and Cilicia: greetings. 24 Because we have heard that some who went out from us have troubled you with words, unsettling your souls, saying, ‘You must be circumcised and keep the law,’ to whom we gave no commandment; 25 it seemed good to us, having come to one accord, to choose out men and send them to you with our beloved Barnabas and Paul, 26 men who have risked their lives for the name of our Lord Jesus Christ. 27 We have sent therefore Judas and Silas, who themselves will also tell you the same things by word of mouth. 28 For it seemed good to the Holy Spirit, and to us, to lay no greater burden on you than these necessary things: 29 that you abstain from things sacrificed to idols, from blood, from things strangled, and from sexual immorality, from which if you keep yourselves, it will be well with you. Farewell.” 30 So, when they were sent off, they came to Antioch. Having gathered the multitude together, they delivered the letter. 31 When they had read it, they rejoiced over the encouragement. 32 Judas and Silas, also being prophets themselves, encouraged the brothers with many words and strengthened them. 33 After they had spent some time there, they were sent back with greetings from the brothers to the apostles. 34 § 35 But Paul and Barnabas stayed in Antioch, teaching and preaching the word of the Lord, with many others also. 2-Paul_and_Barnabas_fight_and_split.md000066400000000000000000000015611354442177200472520ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greece/2-Chapter_15title: Paul and Barnabas fight and split ID: 59 type: md notes: {P:2:Paul and Barnabas fight} {C:5:Barnabas} compile: 2 36 After some days Paul said to Barnabas, “Let’s return now and visit our brothers in every city in which we proclaimed the word of the Lord, to see how they are doing.” 37 Barnabas planned to take John, who was called Mark, with them also. 38 But Paul didn’t think that it was a good idea to take with them someone who had withdrawn from them in Pamphylia, and didn’t go with them to do the work. 39 Then the contention grew so sharp that they separated from each other. Barnabas took Mark with him and sailed away to Cyprus, 40 but Paul chose Silas and went out, being commended by the brothers to the grace of God. 41 He went through Syria and Cilicia, strengthening the assemblies. folder.txt000066400000000000000000000001561354442177200420520ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greece/2-Chapter_15title: Chapter 15 ID: 50 type: folder compile: 2 setGoal: 1000 3-Chapter_16/000077500000000000000000000000001354442177200400365ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greecefolder.txt000066400000000000000000000001561354442177200420540ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greece/3-Chapter_16title: Chapter 16 ID: 70 type: folder compile: 2 setGoal: 1000 4-Chapter_17/000077500000000000000000000000001354442177200400405ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greecefolder.txt000066400000000000000000000001561354442177200420560ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greece/4-Chapter_17title: Chapter 17 ID: 71 type: folder compile: 2 setGoal: 1000 5-Chapter_18/000077500000000000000000000000001354442177200400425ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greecefolder.txt000066400000000000000000000001561354442177200420600ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greece/5-Chapter_18title: Chapter 18 ID: 72 type: folder compile: 2 setGoal: 1000 6-Chapter_19/000077500000000000000000000000001354442177200400445ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greecefolder.txt000066400000000000000000000001561354442177200420620ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greece/6-Chapter_19title: Chapter 19 ID: 73 type: folder compile: 2 setGoal: 1000 7-Chapter_20/000077500000000000000000000000001354442177200400355ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greecefolder.txt000066400000000000000000000001561354442177200420530ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greece/7-Chapter_20title: Chapter 20 ID: 74 type: folder compile: 2 setGoal: 1000 folder.txt000066400000000000000000000001661354442177200400210ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/0-Asia_Minor_and_Greecetitle: Asia Minor and Greece ID: 47 type: folder POV: 1 compile: 2 manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/1-Rome/000077500000000000000000000000001354442177200326475ustar00rootroot000000000000000-Chapter_21/000077500000000000000000000000001354442177200346155ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/1-Romefolder.txt000066400000000000000000000001571354442177200366340ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/1-Rome/0-Chapter_21title: Chapter 21 ID: 62 type: folder compile: 2 setGoal: 10000 1-Chapter_22/000077500000000000000000000000001354442177200346175ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/1-Romefolder.txt000066400000000000000000000001571354442177200366360ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/1-Rome/1-Chapter_22title: Chapter 22 ID: 63 type: folder compile: 2 setGoal: 10000 2-Chapter_23/000077500000000000000000000000001354442177200346215ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/1-Romefolder.txt000066400000000000000000000001571354442177200366400ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/1-Rome/2-Chapter_23title: Chapter 23 ID: 64 type: folder compile: 2 setGoal: 10000 3-Chapter_24/000077500000000000000000000000001354442177200346235ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/1-Romefolder.txt000066400000000000000000000001571354442177200366420ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/1-Rome/3-Chapter_24title: Chapter 24 ID: 65 type: folder compile: 2 setGoal: 10000 4-Chapter_25/000077500000000000000000000000001354442177200346255ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/1-Romefolder.txt000066400000000000000000000001571354442177200366440ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/1-Rome/4-Chapter_25title: Chapter 25 ID: 66 type: folder compile: 2 setGoal: 10000 5-Chapter_26/000077500000000000000000000000001354442177200346275ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/1-Romefolder.txt000066400000000000000000000001571354442177200366460ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/1-Rome/5-Chapter_26title: Chapter 26 ID: 67 type: folder compile: 2 setGoal: 10000 6-Chapter_27/000077500000000000000000000000001354442177200346315ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/1-Romefolder.txt000066400000000000000000000001571354442177200366500ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/1-Rome/6-Chapter_27title: Chapter 27 ID: 68 type: folder compile: 2 setGoal: 10000 7-Chapter_28/000077500000000000000000000000001354442177200346335ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/1-Romefolder.txt000066400000000000000000000001571354442177200366520ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/1-Rome/7-Chapter_28title: Chapter 28 ID: 69 type: folder compile: 2 setGoal: 10000 folder.txt000066400000000000000000000001451354442177200346040ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/1-Rometitle: Rome ID: 61 type: folder POV: 1 compile: 2 manuskript-0.10.0/sample-projects/book-of-acts/outline/2-To_the_extremities_of_the_world/folder.txt000066400000000000000000000002001354442177200336130ustar00rootroot00000000000000title: To the extremities of the world ID: 60 type: folder POV: 1 compile: 2 manuskript-0.10.0/sample-projects/book-of-acts/plots.xml000066400000000000000000000005071354442177200232570ustar00rootroot00000000000000 manuskript-0.10.0/sample-projects/book-of-acts/revisions.xml000066400000000000000000003227771354442177200241570ustar00rootroot00000000000000 manuskript-0.10.0/sample-projects/book-of-acts/settings.txt000066400000000000000000000041241354442177200237740ustar00rootroot00000000000000{ "autoSave": false, "autoSaveDelay": 5, "autoSaveNoChanges": true, "autoSaveNoChangesDelay": 5, "corkBackground": { "color": "#926239", "image": "writingdesk.jpg" }, "corkSizeFactor": 84, "corkStyle": "new", "defaultTextType": "md", "dict": "en_US", "dontShowDeleteWarning": false, "folderView": "cork", "frequencyAnalyzer": { "phraseMax": 5, "phraseMin": 2, "wordExclude": "a, and, or", "wordMin": 1 }, "fullScreenTheme": "gentleblues", "lastTab": 6, "openIndexes": [ null ], "outlineViewColumns": [ 0, 8, 9, 11, 12, 13, 7 ], "revisions": { "keep": true, "rules": { "2592000": 86400, "3600": 600, "600": 60, "86400": 3600, "null": 604800 }, "smartremove": true }, "saveOnQuit": true, "saveToZip": false, "spellcheck": false, "textEditor": { "background": "#fff", "backgroundTransparent": false, "cursorNotBlinking": false, "cursorWidth": 1, "font": "DejaVu Sans,10,-1,5,50,0,0,0,0,0", "fontColor": "#000", "indent": true, "lineSpacing": 100, "marginsLR": 0, "marginsTB": 0, "maxWidth": 0, "misspelled": "#F00", "spacingAbove": 5, "spacingBelow": 5, "tabWidth": 20, "textAlignment": 0 }, "viewMode": "fiction", "viewSettings": { "Cork": { "Background": "Nothing", "Border": "Nothing", "Corner": "Label", "Icon": "Nothing", "Text": "Nothing" }, "Outline": { "Background": "Nothing", "Icon": "Nothing", "Text": "Compile" }, "Tree": { "Background": "Nothing", "Icon": "Nothing", "InfoFolder": "Summary", "InfoText": "Nothing", "Text": "Compile", "iconSize": 24 } } }manuskript-0.10.0/sample-projects/book-of-acts/status.txt000066400000000000000000000000441354442177200234540ustar00rootroot00000000000000TODO First draft Second draft Final manuskript-0.10.0/sample-projects/book-of-acts/summary.txt000066400000000000000000000000001354442177200236160ustar00rootroot00000000000000manuskript-0.10.0/sample-projects/book-of-acts/world.opml000066400000000000000000000011021354442177200234040ustar00rootroot00000000000000 manuskript-0.10.0/snap/000077500000000000000000000000001354442177200147375ustar00rootroot00000000000000manuskript-0.10.0/snap/gui/000077500000000000000000000000001354442177200155235ustar00rootroot00000000000000manuskript-0.10.0/snap/gui/manuskript.desktop000066400000000000000000000004141354442177200213120ustar00rootroot00000000000000[Desktop Entry] Name=Manuskript Comment=An open source tool for writers Keywords=manuskript;office;write;edit;novel;text;msk Exec=manuskript Terminal=false Type=Application Icon=/snap/manuskript/current/icons/Manuskript/manuskript.svg Categories=Office;WordProcessor; manuskript-0.10.0/snap/snapcraft.yaml000066400000000000000000000052011354442177200176020ustar00rootroot00000000000000name: manuskript version: overwritten version-script: grep -E "__version__.*\".*\"" "manuskript/version.py" | cut -d\" -f2 summary: Manuskript is an open-source tool for writers. description: | Manuskript provides a rich environment to help writers create their first draft and then further refine and edit their masterpiece. With Manuskript you can: Grow your premise from one sentence, to a paragraph, to a full summary Create characters Conceive plots Construct outlines (Outline mode and/or Index cards) Write with focus (Distraction free mode) Build worlds Track items Edit and re-organize chapters and scenes View Story line Compose with fiction or non-fiction templates and writing modes Export to HTML, ePub, OpenDocument, DocX, PDF, and more Additionally Manuskript can help in many more ways with a spell checker, markdown highlighter, frequency analyzer, and automatic save in open and plain text file format. grade: stable confinement: strict base: core18 icon: icons/Manuskript/manuskript.svg apps: manuskript: command: desktop-launch $SNAP/bin/manuskript environment: # Fallback to XWayland if running in a Wayland session. DISABLE_WAYLAND: 1 plugs: - desktop - desktop-legacy - unity7 - wayland - x11 - opengl - home parts: desktop-qt5: build-packages: - build-essential - qtbase5-dev - dpkg-dev make-parameters: - FLAVOR=qt5 plugin: make source: https://github.com/ubuntu/snapcraft-desktop-helpers.git source-subdir: qt stage-packages: - libxkbcommon0 - ttf-ubuntu-font-family - dmz-cursor-theme - light-themes - adwaita-icon-theme - gnome-themes-standard - shared-mime-info - libqt5gui5 - libgdk-pixbuf2.0-0 - libqt5svg5 - try: - appmenu-qt5 - locales-all - xdg-user-dirs - fcitx-frontend-qt5 manuskript: after: [desktop-qt5] plugin: dump source: https://github.com/olivierkes/manuskript.git source-type: git build-packages: - python3 - python3-pyqt5 - python3-pyqt5.qtwebkit - libqt5svg5 - python3-lxml - zlib1g - python3-enchant - python3-markdown - pandoc - texlive-latex-recommended - texlive-fonts-recommended - texlive-luatex stage-packages: - python3 - python3-pyqt5 - python3-pyqt5.qtwebkit - libqt5svg5 - python3-lxml - zlib1g - libc-bin - locales - python3-enchant - python3-markdown - pandoc - texlive-latex-recommended - texlive-fonts-recommended - texlive-luatex